diff --git a/.betterer.results b/.betterer.results index a3f84ce1d29..f3a96284f7f 100644 --- a/.betterer.results +++ b/.betterer.results @@ -455,24 +455,6 @@ exports[`better eslint`] = { [0, 0, 0, "Unexpected any. Specify a different type.", "4"], [0, 0, 0, "Unexpected any. Specify a different type.", "5"] ], - "packages/grafana-prometheus/src/gcopypaste/app/features/live/data/amendTimeSeries.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"], - [0, 0, 0, "Do not use any type assertions.", "1"], - [0, 0, 0, "Do not use any type assertions.", "2"], - [0, 0, 0, "Do not use any type assertions.", "3"], - [0, 0, 0, "Do not use any type assertions.", "4"] - ], - "packages/grafana-prometheus/src/gcopypaste/public/test/matchers/index.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], - "packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValuesWith.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"], - [0, 0, 0, "Unexpected any. Specify a different type.", "1"], - [0, 0, 0, "Unexpected any. Specify a different type.", "2"] - ], - "packages/grafana-prometheus/src/gcopypaste/public/test/matchers/utils.ts:5381": [ - [0, 0, 0, "Unexpected any. Specify a different type.", "0"] - ], "packages/grafana-prometheus/src/language_provider.ts:5381": [ [0, 0, 0, "Unexpected any. Specify a different type.", "0"], [0, 0, 0, "Unexpected any. Specify a different type.", "1"], @@ -1853,10 +1835,7 @@ exports[`better eslint`] = { [0, 0, 0, "No untranslated strings. Wrap text with ", "13"], [0, 0, 0, "No untranslated strings. Wrap text with ", "14"], [0, 0, 0, "No untranslated strings. Wrap text with ", "15"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "16"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "17"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "18"], - [0, 0, 0, "No untranslated strings. Wrap text with ", "19"] + [0, 0, 0, "No untranslated strings. Wrap text with ", "16"] ], "public/app/features/alerting/unified/components/notification-policies/PromDurationDocs.tsx:5381": [ [0, 0, 0, "No untranslated strings. Wrap text with ", "0"], diff --git a/.bra.toml b/.bra.toml index b57cf283edc..3e9d9992661 100644 --- a/.bra.toml +++ b/.bra.toml @@ -2,7 +2,7 @@ init_cmds = [ ["GO_BUILD_DEV=1", "make", "build-go"], ["make", "gen-jsonnet"], - ["./bin/grafana", "server", "-packaging=dev", "cfg:app_mode=development"] + ["./bin/grafana", "server", "-profile", "-profile-addr=127.0.0.1", "-profile-port=6000", "-packaging=dev", "cfg:app_mode=development"] ] watch_all = true follow_symlinks = true @@ -18,5 +18,5 @@ build_delay = 1500 cmds = [ ["GO_BUILD_DEV=1", "make", "build-go"], ["make", "gen-jsonnet"], - ["./bin/grafana", "server", "-packaging=dev", "cfg:app_mode=development"] + ["./bin/grafana", "server", "-profile", "-profile-addr=127.0.0.1", "-profile-port=6000", "-packaging=dev", "cfg:app_mode=development"] ] diff --git a/.github/workflows/pr-go-workspace-check.yml b/.github/workflows/pr-go-workspace-check.yml index 998ffca8241..699f211e1e9 100644 --- a/.github/workflows/pr-go-workspace-check.yml +++ b/.github/workflows/pr-go-workspace-check.yml @@ -4,11 +4,6 @@ on: workflow_dispatch: pull_request: branches: [main] - paths: - - '**/go.work' - - '**/go.work.sum' - - '**/go.mod' - - '**/go.sum' jobs: check: @@ -24,28 +19,15 @@ jobs: with: go-version-file: go.mod - - name: Workspace Sync - run: go work sync + - name: Update workspace + run: make update-workspace - name: Check for go mod & workspace changes run: | if ! git diff --exit-code --quiet; then echo "Changes detected:" git diff - echo "Please run 'go work sync' and commit the changes." + echo "Please run 'make update-workspace' and commit the changes." echo "If there is a change in enterprise dependencies, please update pkg/extensions/main.go." exit 1 - fi - - - name: Build - run: make build-go - - - name: Check for go workspace changes - run: | - if ! git diff --exit-code --quiet; then - echo "Changes detected:" - git diff - echo "Please run 'make build-go' and commit the changes." - echo "If there is a change in enterprise dependencies, please update pkg/extensions/main.go." - exit 1 - fi + fi \ No newline at end of file diff --git a/.golangci.toml b/.golangci.toml index 003243871c1..d39c3192c31 100644 --- a/.golangci.toml +++ b/.golangci.toml @@ -150,7 +150,6 @@ enable = [ "revive", "staticcheck", "stylecheck", - "typecheck", "unconvert", "unused", "whitespace", diff --git a/Makefile b/Makefile index 1d0113e6926..74adf508aa4 100644 --- a/Makefile +++ b/Makefile @@ -169,8 +169,13 @@ fix-cue: $(CUE) gen-jsonnet: go generate ./devenv/jsonnet +.PHONY: update-workspace +update-workspace: + @echo "updating workspace" + $(GO) mod download + .PHONY: build-go -build-go: gen-go ## Build all Go binaries. +build-go: update-workspace gen-go ## Build all Go binaries. @echo "build go files" $(GO) run build.go $(GO_BUILD_FLAGS) build @@ -211,13 +216,13 @@ build-plugin-go: ## Build decoupled plugins build: build-go build-js ## Build backend and frontend. .PHONY: run -run: $(BRA) ## Build and run web server on filesystem changes. +run: $(BRA) ## Build and run web server on filesystem changes. See /.bra.toml for configuration. $(BRA) run .PHONY: run-go run-go: ## Build and run web server immediately. $(GO) run -race $(if $(GO_BUILD_TAGS),-build-tags=$(GO_BUILD_TAGS)) \ - ./pkg/cmd/grafana -- server -packaging=dev cfg:app_mode=development + ./pkg/cmd/grafana -- server -profile -profile-addr=127.0.0.1 -profile-port=6000 -packaging=dev cfg:app_mode=development .PHONY: run-frontend run-frontend: deps-js ## Fetch js dependencies and watch frontend for rebuild @@ -376,11 +381,11 @@ devenv-mysql: .PHONY: protobuf protobuf: ## Compile protobuf definitions bash scripts/protobuf-check.sh - # go install google.golang.org/protobuf/cmd/protoc-gen-go - # go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest - # buf generate pkg/plugins/backendplugin/pluginextensionv2 --template pkg/plugins/backendplugin/pluginextensionv2/buf.gen.yaml - # buf generate pkg/plugins/backendplugin/secretsmanagerplugin --template pkg/plugins/backendplugin/secretsmanagerplugin/buf.gen.yaml - # buf generate pkg/services/store/entity --template pkg/services/store/entity/buf.gen.yaml + go install google.golang.org/protobuf/cmd/protoc-gen-go + go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest + buf generate pkg/plugins/backendplugin/pluginextensionv2 --template pkg/plugins/backendplugin/pluginextensionv2/buf.gen.yaml + buf generate pkg/plugins/backendplugin/secretsmanagerplugin --template pkg/plugins/backendplugin/secretsmanagerplugin/buf.gen.yaml + buf generate pkg/services/store/entity --template pkg/services/store/entity/buf.gen.yaml buf generate pkg/storage/unified/resource --template pkg/storage/unified/resource/buf.gen.yaml .PHONY: clean diff --git a/conf/defaults.ini b/conf/defaults.ini index 931b9268897..88ed4791098 100644 --- a/conf/defaults.ini +++ b/conf/defaults.ini @@ -1929,6 +1929,8 @@ enabled = true is_target = false # Token used to send requests to grafana com gcom_api_token = "" +# How long to wait for a request sent to gms to start a snapshot to complete +start_snapshot_timeout = 5s # How long to wait for a request to fetch an instance to complete fetch_instance_timeout = 5s # How long to wait for a request to create an access policy to complete @@ -1939,3 +1941,5 @@ fetch_access_policy_timeout = 5s delete_access_policy_timeout = 5s # The domain name used to access cms domain = grafana-dev.net +# Folder used to store snapshot files. Defaults to the home dir +snapshot_folder = "" \ No newline at end of file diff --git a/docs/sources/developers/http_api/preferences.md b/docs/sources/developers/http_api/preferences.md index a3f5b6b1afd..0d869d3c353 100644 --- a/docs/sources/developers/http_api/preferences.md +++ b/docs/sources/developers/http_api/preferences.md @@ -53,7 +53,7 @@ Content-Type: application/json "timezone": "utc", "weekStart": "", "navbar": { - "savedItems": null + "savedItemIds": null }, "queryHistory": { "homeTab": "" @@ -142,7 +142,7 @@ Content-Type: application/json "timezone": "", "weekStart": "", "navbar": { - "savedItems": null + "savedItemIds": null }, "queryHistory": { "homeTab": "" diff --git a/docs/sources/panels-visualizations/visualizations/table/index.md b/docs/sources/panels-visualizations/visualizations/table/index.md index 3bdacc05ec8..f304c302823 100644 --- a/docs/sources/panels-visualizations/visualizations/table/index.md +++ b/docs/sources/panels-visualizations/visualizations/table/index.md @@ -209,6 +209,10 @@ If you have a field value that is an image URL or a base64 encoded image you can {{< figure src="/static/img/docs/v73/table_hover.gif" max-width="900px" caption="Table hover" >}} +Use the **Alt text** option to set the alternative text of an image. The text will be available for screen readers and in cases when images can't be loaded. + +Use the **Title text** option to set the text that's displayed when the image is hovered over with a cursor. + #### Sparkline Shows values rendered as a sparkline. You can show sparklines using the [Time series to table transformation](ref:time-series-to-table-transformation) on data with multiple time series to process it into a format the table can show. diff --git a/go.mod b/go.mod index b1a4fc02f40..a1a32c1d0ac 100644 --- a/go.mod +++ b/go.mod @@ -89,6 +89,7 @@ require ( github.com/grafana/gomemcache v0.0.0-20231023152154-6947259a0586 // @grafana/grafana-operator-experience-squad github.com/grafana/grafana-aws-sdk v0.28.0 // @grafana/aws-datasources github.com/grafana/grafana-azure-sdk-go/v2 v2.0.4 // @grafana/partner-datasources + github.com/grafana/grafana-cloud-migration-snapshot v1.0.0 // @grafana/grafana-operator-experience-squad github.com/grafana/grafana-google-sdk-go v0.1.0 // @grafana/partner-datasources github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 // @grafana/grafana-backend-group github.com/grafana/grafana-plugin-sdk-go v0.235.0 // @grafana/plugins-platform-backend @@ -98,7 +99,6 @@ require ( // For local development grafana/grafana will always use the local files // Check go.work file for details github.com/grafana/grafana/pkg/promlib v0.0.6 // @grafana/observability-metrics - github.com/grafana/grafana/pkg/storage/unified/resource v0.0.0-20240624122844-a89deaeb7365 // @grafana/grafana-search-and-storage github.com/grafana/otel-profiling-go v0.5.1 // @grafana/grafana-backend-group github.com/grafana/pyroscope-go/godeltaprof v0.1.7 // @grafana/observability-traces-and-profiling github.com/grafana/pyroscope/api v0.3.0 // @grafana/observability-traces-and-profiling @@ -303,10 +303,11 @@ require ( github.com/google/gofuzz v1.2.0 // indirect github.com/google/s2a-go v0.1.7 // indirect github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect + github.com/grafana/grafana/pkg/storage/unified/resource v0.0.0-20240624122844-a89deaeb7365 // @grafana/grafana-search-and-storage github.com/grafana/regexp v0.0.0-20221123153739-15dc172cd2db // indirect github.com/grafana/sqlds/v3 v3.2.0 // indirect github.com/grpc-ecosystem/go-grpc-prometheus v1.2.1-0.20191002090509-6af20e3a5340 // indirect; @grafana/plugins-platform-backend - github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.20.0 // @grafana/identity-access-team github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect github.com/hashicorp/go-msgpack v0.5.5 // indirect @@ -380,11 +381,8 @@ require ( github.com/redis/rueidis v1.0.16 // indirect github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect github.com/rivo/uniseg v0.4.7 // indirect - github.com/rs/cors v1.10.1 - github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect + github.com/rs/cors v1.10.1 // @grafana/identity-access-team github.com/segmentio/asm v1.2.0 // indirect - github.com/segmentio/encoding v0.3.6 // indirect github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3 // indirect github.com/shopspring/decimal v1.3.1 // indirect github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect @@ -458,8 +456,11 @@ require ( github.com/ncruces/go-strftime v0.1.9 // indirect github.com/pelletier/go-toml/v2 v2.1.1 // indirect github.com/pressly/goose/v3 v3.20.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 // indirect + github.com/segmentio/encoding v0.3.6 // indirect github.com/sethvargo/go-retry v0.2.4 // indirect github.com/sourcegraph/conc v0.3.0 // indirect github.com/spf13/afero v1.11.0 // indirect diff --git a/go.sum b/go.sum index 7db2c385dae..74c8f8e568e 100644 --- a/go.sum +++ b/go.sum @@ -2321,6 +2321,8 @@ github.com/grafana/grafana-aws-sdk v0.28.0 h1:ShdA+msLPGJGWWS1SFUYnF+ch1G3gUOlAd github.com/grafana/grafana-aws-sdk v0.28.0/go.mod h1:ZSVPU7IIJSi5lEg+K3Js+EUpZLXxUaBdaQWH+As1ihI= github.com/grafana/grafana-azure-sdk-go/v2 v2.0.4 h1:z6amQ286IJSBctHf6c+ibJq/v0+TvmEjVkrdMNBd4uY= github.com/grafana/grafana-azure-sdk-go/v2 v2.0.4/go.mod h1:aKlFPE36IDa8qccRg3KbgZX3MQ5xymS3RelT4j6kkVU= +github.com/grafana/grafana-cloud-migration-snapshot v1.0.0 h1:vOepRtpYS5ssG/PXLTpc/7OcL4lJiGruiU3Cw0c0DE4= +github.com/grafana/grafana-cloud-migration-snapshot v1.0.0/go.mod h1:rWNhyxYkgiXgV7xZ4yOQzMV08yikO8L8S8M5KNoQNpA= github.com/grafana/grafana-google-sdk-go v0.1.0 h1:LKGY8z2DSxKjYfr2flZsWgTRTZ6HGQbTqewE3JvRaNA= github.com/grafana/grafana-google-sdk-go v0.1.0/go.mod h1:Vo2TKWfDVmNTELBUM+3lkrZvFtBws0qSZdXhQxRdJrE= github.com/grafana/grafana-openapi-client-go v0.0.0-20231213163343-bd475d63fb79 h1:r+mU5bGMzcXCRVAuOrTn54S80qbfVkvTdUJZfSfTNbs= diff --git a/go.work.sum b/go.work.sum index 28306ccf53f..bdd0fc906f5 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,381 +1,132 @@ -bazil.org/fuse v0.0.0-20160811212531-371fbbdaa898/go.mod h1:Xbm+BRKSBEpa4q4hTSxohYNQpsxXPbPry4JJWOB3LB8= -bazil.org/fuse v0.0.0-20200407214033-5883e5a4b512/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1 h1:tdpHgTbmbvEIARu+bixzmleMi14+3imnpoFXz+Qzjp4= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.31.0-20230802163732-1c33ebd9ecfa.1/go.mod h1:xafc+XIsTxTy76GJQ1TKgvJWsSugFBqMaN27WhUblew= buf.build/gen/go/grpc-ecosystem/grpc-gateway/bufbuild/connect-go v1.4.1-20221127060915-a1ecdc58eccd.1 h1:vp9EaPFSb75qe/793x58yE5fY1IJ/gdxb/kcDUzavtI= buf.build/gen/go/grpc-ecosystem/grpc-gateway/bufbuild/connect-go v1.4.1-20221127060915-a1ecdc58eccd.1/go.mod h1:YDq2B5X5BChU0lxAG5MxHpDb8mx1fv9OGtF2mwOe7hY= -buf.build/gen/go/grpc-ecosystem/grpc-gateway/protocolbuffers/go v1.28.1-20221127060915-a1ecdc58eccd.4 h1:z3Xc9n8yZ5k/Xr4ZTuff76TAYP20dWy7ZBV4cGIpbkM= -cloud.google.com/go v0.112.2/go.mod h1:iEqjp//KquGIJV/m+Pk3xecgKNhV+ry+vVTsy4TbDms= -cloud.google.com/go v0.113.0/go.mod h1:glEqlogERKYeePz6ZdkcLJ28Q2I6aERgDDErBg9GzO8= -cloud.google.com/go/accessapproval v1.7.4 h1:ZvLvJ952zK8pFHINjpMBY5k7LTAp/6pBf50RDMRgBUI= cloud.google.com/go/accessapproval v1.7.5 h1:uzmAMSgYcnlHa9X9YSQZ4Q1wlfl4NNkZyQgho1Z6p04= -cloud.google.com/go/accessapproval v1.7.7/go.mod h1:10ZDPYiTm8tgxuMPid8s2DL93BfCt6xBh/Vg0Xd8pU0= -cloud.google.com/go/accesscontextmanager v1.8.4 h1:Yo4g2XrBETBCqyWIibN3NHNPQKUfQqti0lI+70rubeE= cloud.google.com/go/accesscontextmanager v1.8.5 h1:2GLNaNu9KRJhJBFTIVRoPwk6xE5mUDgD47abBq4Zp/I= -cloud.google.com/go/accesscontextmanager v1.8.7/go.mod h1:jSvChL1NBQ+uLY9zUBdPy9VIlozPoHptdBnRYeWuQoM= -cloud.google.com/go/aiplatform v1.57.0 h1:WcZ6wDf/1qBWatmGM9Z+2BTiNjQQX54k2BekHUj93DQ= -cloud.google.com/go/aiplatform v1.58.0 h1:xyCAfpI4yUMOQ4VtHN/bdmxPQ8xoEkTwFM1nbVmuQhs= cloud.google.com/go/aiplatform v1.60.0 h1:0cSrii1ZeLr16MbBoocyy5KVnrSdiQ3KN/vtrTe7RqE= -cloud.google.com/go/aiplatform v1.67.0/go.mod h1:s/sJ6btBEr6bKnrNWdK9ZgHCvwbZNdP90b3DDtxxw+Y= -cloud.google.com/go/analytics v0.21.6 h1:fnV7B8lqyEYxCU0LKk+vUL7mTlqRAq4uFlIthIdr/iA= -cloud.google.com/go/analytics v0.22.0 h1:w8KIgW8NRUHFVKjpkwCpLaHsr685tJ+ckPStOaSCZz0= cloud.google.com/go/analytics v0.23.0 h1:Q+y94XH84jM8SK8O7qiY/PJRexb6n7dRbQ6PiUa4YGM= -cloud.google.com/go/analytics v0.23.2/go.mod h1:vtE3olAXZ6edJYk1UOndEs6EfaEc9T2B28Y4G5/a7Fo= -cloud.google.com/go/apigateway v1.6.4 h1:VVIxCtVerchHienSlaGzV6XJGtEM9828Erzyr3miUGs= cloud.google.com/go/apigateway v1.6.5 h1:sPXnpk+6TneKIrjCjcpX5YGsAKy3PTdpIchoj8/74OE= -cloud.google.com/go/apigateway v1.6.7/go.mod h1:7wAMb/33Rzln+PrGK16GbGOfA1zAO5Pq6wp19jtIt7c= -cloud.google.com/go/apigeeconnect v1.6.4 h1:jSoGITWKgAj/ssVogNE9SdsTqcXnryPzsulENSRlusI= cloud.google.com/go/apigeeconnect v1.6.5 h1:CrfIKv9Go3fh/QfQgisU3MeP90Ww7l/sVGmr3TpECo8= -cloud.google.com/go/apigeeconnect v1.6.7/go.mod h1:hZxCKvAvDdKX8+eT0g5eEAbRSS9Gkzi+MPWbgAMAy5U= -cloud.google.com/go/apigeeregistry v0.8.2 h1:DSaD1iiqvELag+lV4VnnqUUFd8GXELu01tKVdWZrviE= cloud.google.com/go/apigeeregistry v0.8.3 h1:C+QU2K+DzDjk4g074ouwHQGkoff1h5OMQp6sblCVreQ= -cloud.google.com/go/apigeeregistry v0.8.5/go.mod h1:ZMg60hq2K35tlqZ1VVywb9yjFzk9AJ7zqxrysOxLi3o= cloud.google.com/go/apikeys v0.6.0 h1:B9CdHFZTFjVti89tmyXXrO+7vSNo2jvZuHG8zD5trdQ= -cloud.google.com/go/appengine v1.8.4 h1:Qub3fqR7iA1daJWdzjp/Q0Jz0fUG0JbMc7Ui4E9IX/E= cloud.google.com/go/appengine v1.8.5 h1:l2SviT44zWQiOv8bPoMBzW0vOcMO22iO0s+nVtVhdts= -cloud.google.com/go/appengine v1.8.7/go.mod h1:1Fwg2+QTgkmN6Y+ALGwV8INLbdkI7+vIvhcKPZCML0g= -cloud.google.com/go/area120 v0.8.4 h1:YnSO8m02pOIo6AEOgiOoUDVbw4pf+bg2KLHi4rky320= cloud.google.com/go/area120 v0.8.5 h1:vTs08KPLN/iMzTbxpu5ciL06KcsrVPMjz4IwcQyZ4uY= -cloud.google.com/go/area120 v0.8.7/go.mod h1:L/xTq4NLP9mmxiGdcsVz7y1JLc9DI8pfaXRXbnjkR6w= -cloud.google.com/go/artifactregistry v1.14.6 h1:/hQaadYytMdA5zBh+RciIrXZQBWK4vN7EUsrQHG+/t8= cloud.google.com/go/artifactregistry v1.14.7 h1:W9sVlyb1VRcUf83w7aM3yMsnp4HS4PoyGqYQNG0O5lI= -cloud.google.com/go/artifactregistry v1.14.9/go.mod h1:n2OsUqbYoUI2KxpzQZumm6TtBgtRf++QulEohdnlsvI= -cloud.google.com/go/asset v1.15.3 h1:uI8Bdm81s0esVWbWrTHcjFDFKNOa9aB7rI1vud1hO84= -cloud.google.com/go/asset v1.17.0 h1:dLWfTnbwyrq/Kt8Tr2JiAbre1MEvS2Bl5cAMiYAy5Pg= cloud.google.com/go/asset v1.17.2 h1:xgFnBP3luSbUcC9RWJvb3Zkt+y/wW6PKwPHr3ssnIP8= -cloud.google.com/go/asset v1.19.1/go.mod h1:kGOS8DiCXv6wU/JWmHWCgaErtSZ6uN5noCy0YwVaGfs= -cloud.google.com/go/assuredworkloads v1.11.4 h1:FsLSkmYYeNuzDm8L4YPfLWV+lQaUrJmH5OuD37t1k20= cloud.google.com/go/assuredworkloads v1.11.5 h1:gCrN3IyvqY3cP0wh2h43d99CgH3G+WYs9CeuFVKChR8= -cloud.google.com/go/assuredworkloads v1.11.7/go.mod h1:CqXcRH9N0KCDtHhFisv7kk+cl//lyV+pYXGi1h8rCEU= -cloud.google.com/go/auth v0.2.1/go.mod h1:khQRBNrvNoHiHhV1iu2x8fSnlNbCaVHilznW5MAI5GY= -cloud.google.com/go/auth v0.3.0/go.mod h1:lBv6NKTWp8E3LPzmO1TbiiRKc4drLOfHsgmlH9ogv5w= -cloud.google.com/go/auth v0.4.1/go.mod h1:QVBuVEKpCn4Zp58hzRGvL0tjRGU0YqdRTdCHM1IHnro= -cloud.google.com/go/automl v1.13.4 h1:i9tOKXX+1gE7+rHpWKjiuPfGBVIYoWvLNIGpWgPtF58= cloud.google.com/go/automl v1.13.5 h1:ijiJy9sYWh75WrqImXsfWc1e3HR3iO+ef9fvW03Ig/4= -cloud.google.com/go/automl v1.13.7/go.mod h1:E+s0VOsYXUdXpq0y4gNZpi0A/s6y9+lAarmV5Eqlg40= -cloud.google.com/go/baremetalsolution v1.2.3 h1:oQiFYYCe0vwp7J8ZmF6siVKEumWtiPFJMJcGuyDVRUk= cloud.google.com/go/baremetalsolution v1.2.4 h1:LFydisRmS7hQk9P/YhekwuZGqb45TW4QavcrMToWo5A= -cloud.google.com/go/baremetalsolution v1.2.6/go.mod h1:KkS2BtYXC7YGbr42067nzFr+ABFMs6cxEcA1F+cedIw= -cloud.google.com/go/batch v1.7.0 h1:AxuSPoL2fWn/rUyvWeNCNd0V2WCr+iHRCU9QO1PUmpY= cloud.google.com/go/batch v1.8.0 h1:2HK4JerwVaIcCh/lJiHwh6+uswPthiMMWhiSWLELayk= -cloud.google.com/go/batch v1.8.6/go.mod h1:rQovrciYbtuY40Uprg/IWLlhmUR1GZYzX9xnymUdfBU= -cloud.google.com/go/beyondcorp v1.0.3 h1:VXf9SnrnSmj2BF2cHkoTHvOUp8gjsz1KJFOMW7czdsY= cloud.google.com/go/beyondcorp v1.0.4 h1:qs0J0O9Ol2h1yA0AU+r7l3hOCPzs2MjE1d6d/kaHIKo= -cloud.google.com/go/beyondcorp v1.0.6/go.mod h1:wRkenqrVRtnGFfnyvIg0zBFUdN2jIfeojFF9JJDwVIA= -cloud.google.com/go/bigquery v1.57.1 h1:FiULdbbzUxWD0Y4ZGPSVCDLvqRSyCIO6zKV7E2nf5uA= -cloud.google.com/go/bigquery v1.58.0 h1:drSd9RcPVLJP2iFMimvOB9SCSIrcl+9HD4II03Oy7A0= cloud.google.com/go/bigquery v1.59.1 h1:CpT+/njKuKT3CEmswm6IbhNu9u35zt5dO4yPDLW+nG4= -cloud.google.com/go/bigquery v1.61.0/go.mod h1:PjZUje0IocbuTOdq4DBOJLNYB0WF3pAKBHzAYyxCwFo= -cloud.google.com/go/billing v1.18.0 h1:GvKy4xLy1zF1XPbwP5NJb2HjRxhnhxjjXxvyZ1S/IAo= cloud.google.com/go/billing v1.18.2 h1:oWUEQvuC4JvtnqLZ35zgzdbuHt4Itbftvzbe6aEyFdE= -cloud.google.com/go/billing v1.18.5/go.mod h1:lHw7fxS6p7hLWEPzdIolMtOd0ahLwlokW06BzbleKP8= -cloud.google.com/go/binaryauthorization v1.8.0 h1:PHS89lcFayWIEe0/s2jTBiEOtqghCxzc7y7bRNlifBs= cloud.google.com/go/binaryauthorization v1.8.1 h1:1jcyh2uIUwSZkJ/JmL8kd5SUkL/Krbv8zmYLEbAz6kY= -cloud.google.com/go/binaryauthorization v1.8.3/go.mod h1:Cul4SsGlbzEsWPOz2sH8m+g2Xergb6ikspUyQ7iOThE= -cloud.google.com/go/certificatemanager v1.7.4 h1:5YMQ3Q+dqGpwUZ9X5sipsOQ1fLPsxod9HNq0+nrqc6I= cloud.google.com/go/certificatemanager v1.7.5 h1:UMBr/twXvH3jcT5J5/YjRxf2tvwTYIfrpemTebe0txc= -cloud.google.com/go/certificatemanager v1.8.1/go.mod h1:hDQzr50Vx2gDB+dOfmDSsQzJy/UPrYRdzBdJ5gAVFIc= -cloud.google.com/go/channel v1.17.3 h1:Rd4+fBrjiN6tZ4TR8R/38elkyEkz6oogGDr7jDyjmMY= -cloud.google.com/go/channel v1.17.4 h1:yYHOORIM+wkBy3EdwArg/WL7Lg+SoGzlKH9o3Bw2/jE= cloud.google.com/go/channel v1.17.5 h1:/omiBnyFjm4S1ETHoOmJbL7LH7Ljcei4rYG6Sj3hc80= -cloud.google.com/go/channel v1.17.7/go.mod h1:b+FkgBrhMKM3GOqKUvqHFY/vwgp+rwsAuaMd54wCdN4= -cloud.google.com/go/cloudbuild v1.15.0 h1:9IHfEMWdCklJ1cwouoiQrnxmP0q3pH7JUt8Hqx4Qbck= cloud.google.com/go/cloudbuild v1.15.1 h1:ZB6oOmJo+MTov9n629fiCrO9YZPOg25FZvQ7gIHu5ng= -cloud.google.com/go/cloudbuild v1.16.1/go.mod h1:c2KUANTtCBD8AsRavpPout6Vx8W+fsn5zTsWxCpWgq4= -cloud.google.com/go/clouddms v1.7.3 h1:xe/wJKz55VO1+L891a1EG9lVUgfHr9Ju/I3xh1nwF84= cloud.google.com/go/clouddms v1.7.4 h1:Sr0Zo5EAcPQiCBgHWICg3VGkcdS/LLP1d9SR7qQBM/s= -cloud.google.com/go/clouddms v1.7.6/go.mod h1:8HWZ2tznZ0mNAtTpfnRNT0QOThqn9MBUqTj0Lx8npIs= -cloud.google.com/go/cloudtasks v1.12.4 h1:5xXuFfAjg0Z5Wb81j2GAbB3e0bwroCeSF+5jBn/L650= cloud.google.com/go/cloudtasks v1.12.6 h1:EUt1hIZ9bLv8Iz9yWaCrqgMnIU+Tdh0yXM1MMVGhjfE= cloud.google.com/go/cloudtasks v1.12.8/go.mod h1:aX8qWCtmVf4H4SDYUbeZth9C0n9dBj4dwiTYi4Or/P4= cloud.google.com/go/compute v1.24.0 h1:phWcR2eWzRJaL/kOiJwfFsPs4BaKq1j6vnpZrc1YlVg= +cloud.google.com/go/compute v1.25.1 h1:ZRpHJedLtTpKgr3RV1Fx23NuaAEN1Zfx9hw1u4aJdjU= cloud.google.com/go/compute v1.25.1/go.mod h1:oopOIR53ly6viBYxaDhBfJwzUAxf1zE//uf3IB011ls= -cloud.google.com/go/compute v1.27.0/go.mod h1:LG5HwRmWFKM2C5XxHRiNzkLLXW48WwvyVC0mfWsYPOM= -cloud.google.com/go/contactcenterinsights v1.12.1 h1:EiGBeejtDDtr3JXt9W7xlhXyZ+REB5k2tBgVPVtmNb0= cloud.google.com/go/contactcenterinsights v1.13.0 h1:6Vs/YnDG5STGjlWMEjN/xtmft7MrOTOnOZYUZtGTx0w= -cloud.google.com/go/contactcenterinsights v1.13.2/go.mod h1:AfkSB8t7mt2sIY6WpfO61nD9J9fcidIchtxm9FqJVXk= -cloud.google.com/go/container v1.29.0 h1:jIltU529R2zBFvP8rhiG1mgeTcnT27KhU0H/1d6SQRg= cloud.google.com/go/container v1.31.0 h1:MAaNH7VRNPWEhvqOypq2j+7ONJKrKzon4v9nS3nLZe0= -cloud.google.com/go/container v1.35.1/go.mod h1:udm8fgLm3TtpnjFN4QLLjZezAIIp/VnMo316yIRVRQU= -cloud.google.com/go/containeranalysis v0.11.3 h1:5rhYLX+3a01drpREqBZVXR9YmWH45RnML++8NsCtuD8= cloud.google.com/go/containeranalysis v0.11.4 h1:doJ0M1ljS4hS0D2UbHywlHGwB7sQLNrt9vFk9Zyi7vY= -cloud.google.com/go/containeranalysis v0.11.6/go.mod h1:YRf7nxcTcN63/Kz9f86efzvrV33g/UV8JDdudRbYEUI= -cloud.google.com/go/datacatalog v1.19.0 h1:rbYNmHwvAOOwnW2FPXYkaK3Mf1MmGqRzK0mMiIEyLdo= -cloud.google.com/go/datacatalog v1.19.2 h1:BV5sB7fPc8ccv/obwtHwQtCdLMAgI4KyaQWfkh8/mWg= cloud.google.com/go/datacatalog v1.19.3 h1:A0vKYCQdxQuV4Pi0LL9p39Vwvg4jH5yYveMv50gU5Tw= -cloud.google.com/go/datacatalog v1.20.1/go.mod h1:Jzc2CoHudhuZhpv78UBAjMEg3w7I9jHA11SbRshWUjk= -cloud.google.com/go/dataflow v0.9.4 h1:7VmCNWcPJBS/srN2QnStTB6nu4Eb5TMcpkmtaPVhRt4= cloud.google.com/go/dataflow v0.9.5 h1:RYHtcPhmE664+F0Je46p+NvFbG8z//KCXp+uEqB4jZU= -cloud.google.com/go/dataflow v0.9.7/go.mod h1:3BjkOxANrm1G3+/EBnEsTEEgJu1f79mFqoOOZfz3v+E= -cloud.google.com/go/dataform v0.9.1 h1:jV+EsDamGX6cE127+QAcCR/lergVeeZdEQ6DdrxW3sQ= cloud.google.com/go/dataform v0.9.2 h1:5e4eqGrd0iDTCg4Q+VlAao5j2naKAA7xRurNtwmUknU= -cloud.google.com/go/dataform v0.9.4/go.mod h1:jjo4XY+56UrNE0wsEQsfAw4caUs4DLJVSyFBDelRDtQ= -cloud.google.com/go/datafusion v1.7.4 h1:Q90alBEYlMi66zL5gMSGQHfbZLB55mOAg03DhwTTfsk= cloud.google.com/go/datafusion v1.7.5 h1:HQ/BUOP8OIGJxuztpYvNvlb+/U+/Bfs9SO8tQbh61fk= -cloud.google.com/go/datafusion v1.7.7/go.mod h1:qGTtQcUs8l51lFA9ywuxmZJhS4ozxsBSus6ItqCUWMU= -cloud.google.com/go/datalabeling v0.8.4 h1:zrq4uMmunf2KFDl/7dS6iCDBBAxBnKVDyw6+ajz3yu0= cloud.google.com/go/datalabeling v0.8.5 h1:GpIFRdm0qIZNsxqURFJwHt0ZBJZ0nF/mUVEigR7PH/8= -cloud.google.com/go/datalabeling v0.8.7/go.mod h1:/PPncW5gxrU15UzJEGQoOT3IobeudHGvoExrtZ8ZBwo= -cloud.google.com/go/dataplex v1.13.0 h1:ACVOuxwe7gP0SqEso9SLyXbcZNk5l8hjcTX+XLntI5s= -cloud.google.com/go/dataplex v1.14.0 h1:/WhVTR4v/L6ACKjlz/9CqkxkrVh2z7C44CLMUf0f60A= cloud.google.com/go/dataplex v1.14.2 h1:fxIfdU8fxzR3clhOoNI7XFppvAmndxDu1AMH+qX9WKQ= -cloud.google.com/go/dataplex v1.16.0/go.mod h1:OlBoytuQ56+7aUCC03D34CtoF/4TJ5SiIrLsBdDu87Q= cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= -cloud.google.com/go/dataproc/v2 v2.3.0 h1:tTVP9tTxmc8fixxOd/8s6Q6Pz/+yzn7r7XdZHretQH0= cloud.google.com/go/dataproc/v2 v2.4.0 h1:/u81Fd+BvCLp+xjctI1DiWVJn6cn9/s3Akc8xPH02yk= -cloud.google.com/go/dataproc/v2 v2.4.2/go.mod h1:smGSj1LZP3wtnsM9eyRuDYftNAroAl6gvKp/Wk64XDE= -cloud.google.com/go/dataqna v0.8.4 h1:NJnu1kAPamZDs/if3bJ3+Wb6tjADHKL83NUWsaIp2zg= cloud.google.com/go/dataqna v0.8.5 h1:9ybXs3nr9BzxSGC04SsvtuXaHY0qmJSLIpIAbZo9GqQ= -cloud.google.com/go/dataqna v0.8.7/go.mod h1:hvxGaSvINAVH5EJJsONIwT1y+B7OQogjHPjizOFoWOo= cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= -cloud.google.com/go/datastore v1.17.0/go.mod h1:RiRZU0G6VVlIVlv1HRo3vSAPFHULV0ddBNsXO+Sony4= -cloud.google.com/go/datastream v1.10.3 h1:Z2sKPIB7bT2kMW5Uhxy44ZgdJzxzE5uKjavoW+EuHEE= cloud.google.com/go/datastream v1.10.4 h1:o1QDKMo/hk0FN7vhoUQURREuA0rgKmnYapB+1M+7Qz4= -cloud.google.com/go/datastream v1.10.6/go.mod h1:lPeXWNbQ1rfRPjBFBLUdi+5r7XrniabdIiEaCaAU55o= -cloud.google.com/go/deploy v1.16.0 h1:5OVjzm8MPC5kP+Ywbs0mdE0O7AXvAUXksSyHAyMFyMg= -cloud.google.com/go/deploy v1.17.0 h1:P3SgJ+4rAktC2XqaI10G0ip/vzWluNBrC5VG0abMbLw= cloud.google.com/go/deploy v1.17.1 h1:m27Ojwj03gvpJqCbodLYiVmE9x4/LrHGGMjzc0LBfM4= -cloud.google.com/go/deploy v1.19.0/go.mod h1:BW9vAujmxi4b/+S7ViEuYR65GiEsqL6Mhf5S/9TeDRU= -cloud.google.com/go/dialogflow v1.47.0 h1:tLCWad8HZhlyUNfDzDP5m+oH6h/1Uvw/ei7B9AnsWMk= -cloud.google.com/go/dialogflow v1.48.1 h1:1Uq2jDJzjJ3M4xYB608FCCFHfW3JmrTmHIxRSd7JGmY= cloud.google.com/go/dialogflow v1.49.0 h1:KqG0oxGE71qo0lRVyAoeBozefCvsMfcDzDjoLYSY0F4= -cloud.google.com/go/dialogflow v1.53.0/go.mod h1:LqAvxq7bXiiGC3/DWIz9XXCxth2z2qpSnBAAmlNOj6U= -cloud.google.com/go/dlp v1.11.1 h1:OFlXedmPP/5//X1hBEeq3D9kUVm9fb6ywYANlpv/EsQ= cloud.google.com/go/dlp v1.11.2 h1:lTipOuJaSjlYnnotPMbEhKURLC6GzCMDDzVbJAEbmYM= -cloud.google.com/go/dlp v1.14.0/go.mod h1:4fvEu3EbLsHrgH3QFdFlTNIiCP5mHwdYhS/8KChDIC4= -cloud.google.com/go/documentai v1.23.6 h1:0/S3AhS23+0qaFe3tkgMmS3STxgDgmE1jg4TvaDOZ9g= -cloud.google.com/go/documentai v1.23.7 h1:hlYieOXUwiJ7HpBR/vEPfr8nfSxveLVzbqbUkSK0c/4= cloud.google.com/go/documentai v1.25.0 h1:lI62GMEEPO6vXJI9hj+G9WjOvnR0hEjvjokrnex4cxA= -cloud.google.com/go/documentai v1.29.0/go.mod h1:3Qt8PMt3S8W6w3VeoYFraaMS2GJRrXFnvkyn+GpB1n0= -cloud.google.com/go/domains v0.9.4 h1:ua4GvsDztZ5F3xqjeLKVRDeOvJshf5QFgWGg1CKti3A= cloud.google.com/go/domains v0.9.5 h1:Mml/R6s3vQQvFPpi/9oX3O5dRirgjyJ8cksK8N19Y7g= -cloud.google.com/go/domains v0.9.7/go.mod h1:u/yVf3BgfPJW3QDZl51qTJcDXo9PLqnEIxfGmGgbHEc= -cloud.google.com/go/edgecontainer v1.1.4 h1:Szy3Q/N6bqgQGyxqjI+6xJZbmvPvnFHp3UZr95DKcQ0= cloud.google.com/go/edgecontainer v1.1.5 h1:tBY32km78ScpK2aOP84JoW/+wtpx5WluyPUSEE3270U= -cloud.google.com/go/edgecontainer v1.2.1/go.mod h1:OE2D0lbkmGDVYLCvpj8Y0M4a4K076QB7E2JupqOR/qU= cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= -cloud.google.com/go/essentialcontacts v1.6.5 h1:S2if6wkjR4JCEAfDtIiYtD+sTz/oXjh2NUG4cgT1y/Q= cloud.google.com/go/essentialcontacts v1.6.6 h1:13eHn5qBnsawxI7mIrv4jRIEmQ1xg0Ztqw5ZGqtUNfA= -cloud.google.com/go/essentialcontacts v1.6.8/go.mod h1:EHONVDSum2xxG2p+myyVda/FwwvGbY58ZYC4XqI/lDQ= -cloud.google.com/go/eventarc v1.13.3 h1:+pFmO4eu4dOVipSaFBLkmqrRYG94Xl/TQZFOeohkuqU= cloud.google.com/go/eventarc v1.13.4 h1:ORkd6/UV5FIdA8KZQDLNZYKS7BBOrj0p01DXPmT4tE4= -cloud.google.com/go/eventarc v1.13.6/go.mod h1:QReOaYnDNdjwAQQWNC7nfr63WnaKFUw7MSdQ9PXJYj0= -cloud.google.com/go/filestore v1.8.0 h1:/+wUEGwk3x3Kxomi2cP5dsR8+SIXxo7M0THDjreFSYo= cloud.google.com/go/filestore v1.8.1 h1:X5G4y/vrUo1B8Nsz93qSWTMAcM8LXbGUldq33OdcdCw= -cloud.google.com/go/filestore v1.8.3/go.mod h1:QTpkYpKBF6jlPRmJwhLqXfJQjVrQisplyb4e2CwfJWc= -cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= -cloud.google.com/go/firestore v1.15.0/go.mod h1:GWOxFXcv8GZUtYpWHw/w6IuYNux/BtmeVTMmjrm4yhk= -cloud.google.com/go/functions v1.15.4 h1:ZjdiV3MyumRM6++1Ixu6N0VV9LAGlCX4AhW6Yjr1t+U= cloud.google.com/go/functions v1.16.0 h1:IWVylmK5F6hJ3R5zaRW7jI5PrWhCvtBVU4axQLmXSo4= -cloud.google.com/go/functions v1.16.2/go.mod h1:+gMvV5E3nMb9EPqX6XwRb646jTyVz8q4yk3DD6xxHpg= cloud.google.com/go/gaming v1.10.1 h1:5qZmZEWzMf8GEFgm9NeC3bjFRpt7x4S6U7oLbxaf7N8= -cloud.google.com/go/gkebackup v1.3.4 h1:KhnOrr9A1tXYIYeXKqCKbCI8TL2ZNGiD3dm+d7BDUBg= cloud.google.com/go/gkebackup v1.3.5 h1:iuE8KNtTsPOc79qeWoNS8zOWoXPD9SAdOmwgxtlCmh8= -cloud.google.com/go/gkebackup v1.5.0/go.mod h1:eLaf/+n8jEmIvOvDriGjo99SN7wRvVadoqzbZu0WzEw= -cloud.google.com/go/gkeconnect v0.8.4 h1:1JLpZl31YhQDQeJ98tK6QiwTpgHFYRJwpntggpQQWis= cloud.google.com/go/gkeconnect v0.8.5 h1:17d+ZSSXKqG/RwZCq3oFMIWLPI8Zw3b8+a9/BEVlwH0= -cloud.google.com/go/gkeconnect v0.8.7/go.mod h1:iUH1jgQpTyNFMK5LgXEq2o0beIJ2p7KKUUFerkf/eGc= -cloud.google.com/go/gkehub v0.14.4 h1:J5tYUtb3r0cl2mM7+YHvV32eL+uZQ7lONyUZnPikCEo= cloud.google.com/go/gkehub v0.14.5 h1:RboLNFzf9wEMSo7DrKVBlf+YhK/A/jrLN454L5Tz99Q= -cloud.google.com/go/gkehub v0.14.7/go.mod h1:NLORJVTQeCdxyAjDgUwUp0A6BLEaNLq84mCiulsM4OE= -cloud.google.com/go/gkemulticloud v1.0.3 h1:NmJsNX9uQ2CT78957xnjXZb26TDIMvv+d5W2vVUt0Pg= -cloud.google.com/go/gkemulticloud v1.1.0 h1:C2Suwn3uPz+Yy0bxVjTlsMrUCaDovkgvfdyIa+EnUOU= cloud.google.com/go/gkemulticloud v1.1.1 h1:rsSZAGLhyjyE/bE2ToT5fqo1qSW7S+Ubsc9jFOcbhSI= -cloud.google.com/go/gkemulticloud v1.2.0/go.mod h1:iN5wBxTLPR6VTBWpkUsOP2zuPOLqZ/KbgG1bZir1Cng= -cloud.google.com/go/grafeas v0.3.0 h1:oyTL/KjiUeBs9eYLw/40cpSZglUC+0F7X4iu/8t7NWs= cloud.google.com/go/grafeas v0.3.4 h1:D4x32R/cHX3MTofKwirz015uEdVk4uAxvZkZCZkOrF4= -cloud.google.com/go/gsuiteaddons v1.6.4 h1:uuw2Xd37yHftViSI8J2hUcCS8S7SH3ZWH09sUDLW30Q= cloud.google.com/go/gsuiteaddons v1.6.5 h1:CZEbaBwmbYdhFw21Fwbo+C35HMe36fTE0FBSR4KSfWg= -cloud.google.com/go/gsuiteaddons v1.6.7/go.mod h1:u+sGBvr07OKNnOnQiB/Co1q4U2cjo50ERQwvnlcpNis= -cloud.google.com/go/iam v1.1.7/go.mod h1:J4PMPg8TtyurAUvSmPj8FF3EDgY1SPRZxcUGrn7WXGA= -cloud.google.com/go/iap v1.9.3 h1:M4vDbQ4TLXdaljXVZSwW7XtxpwXUUarY2lIs66m0aCM= cloud.google.com/go/iap v1.9.4 h1:94zirc2r4t6KzhAMW0R6Dme005eTP6yf7g6vN4IhRrA= -cloud.google.com/go/iap v1.9.6/go.mod h1:YiK+tbhDszhaVifvzt2zTEF2ch9duHtp6xzxj9a0sQk= -cloud.google.com/go/ids v1.4.4 h1:VuFqv2ctf/A7AyKlNxVvlHTzjrEvumWaZflUzBPz/M4= cloud.google.com/go/ids v1.4.5 h1:xd4U7pgl3GHV+MABnv1BF4/Vy/zBF7CYC8XngkOLzag= -cloud.google.com/go/ids v1.4.7/go.mod h1:yUkDC71u73lJoTaoONy0dsA0T7foekvg6ZRg9IJL0AA= -cloud.google.com/go/iot v1.7.4 h1:m1WljtkZnvLTIRYW1YTOv5A6H1yKgLHR6nU7O8yf27w= cloud.google.com/go/iot v1.7.5 h1:munTeBlbqI33iuTYgXy7S8lW2TCgi5l1hA4roSIY+EE= -cloud.google.com/go/iot v1.7.7/go.mod h1:tr0bCOSPXtsg64TwwZ/1x+ReTWKlQRVXbM+DnrE54yM= -cloud.google.com/go/kms v1.17.1/go.mod h1:DCMnCF/apA6fZk5Cj4XsD979OyHAqFasPuA5Sd0kGlQ= -cloud.google.com/go/language v1.12.2 h1:zg9uq2yS9PGIOdc0Kz/l+zMtOlxKWonZjjo5w5YPG2A= cloud.google.com/go/language v1.12.3 h1:iaJZg6K4j/2PvZZVcjeO/btcWWIllVRBhuTFjGO4LXs= -cloud.google.com/go/language v1.12.5/go.mod h1:w/6a7+Rhg6Bc2Uzw6thRdKKNjnOzfKTJuxzD0JZZ0nM= -cloud.google.com/go/lifesciences v0.9.4 h1:rZEI/UxcxVKEzyoRS/kdJ1VoolNItRWjNN0Uk9tfexg= cloud.google.com/go/lifesciences v0.9.5 h1:gXvN70m2p+4zgJFzaz6gMKaxTuF9WJ0USYoMLWAOm8g= -cloud.google.com/go/lifesciences v0.9.7/go.mod h1:FQ713PhjAOHqUVnuwsCe1KPi9oAdaTfh58h1xPiW13g= -cloud.google.com/go/logging v1.8.1 h1:26skQWPeYhvIasWKm48+Eq7oUqdcdbwsCVwz5Ys0FvU= cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= -cloud.google.com/go/logging v1.10.0/go.mod h1:EHOwcxlltJrYGqMGfghSet736KR3hX1MAj614mrMk9I= -cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= cloud.google.com/go/longrunning v0.5.5 h1:GOE6pZFdSrTb4KAiKnXsJBtlE6mEyaW44oKyMILWnOg= -cloud.google.com/go/longrunning v0.5.6/go.mod h1:vUaDrWYOMKRuhiv6JBnn49YxCPz2Ayn9GqyjaBT8/mA= -cloud.google.com/go/managedidentities v1.6.4 h1:SF/u1IJduMqQQdJA4MDyivlIQ4SrV5qAawkr/ZEREkY= cloud.google.com/go/managedidentities v1.6.5 h1:+bpih1piZVLxla/XBqeSUzJBp8gv9plGHIMAI7DLpDM= -cloud.google.com/go/managedidentities v1.6.7/go.mod h1:UzslJgHnc6luoyx2JV19cTCi2Fni/7UtlcLeSYRzTV8= -cloud.google.com/go/maps v1.6.2 h1:WxxLo//b60nNFESefLgaBQevu8QGUmRV3+noOjCfIHs= -cloud.google.com/go/maps v1.6.3 h1:Qqs6Dza+PRp5CZO5AfgPnLwU1k3pp0IMFRDtLpT+aCA= cloud.google.com/go/maps v1.6.4 h1:EVCZAiDvog9So46460BGbCasPhi613exoaQbpilMVlk= -cloud.google.com/go/maps v1.11.0/go.mod h1:XcSsd8lg4ZhLPCtJ2YHcu/xLVePBzZOlI7GmR2cRCws= -cloud.google.com/go/mediatranslation v0.8.4 h1:VRCQfZB4s6jN0CSy7+cO3m4ewNwgVnaePanVCQh/9Z4= cloud.google.com/go/mediatranslation v0.8.5 h1:c76KdIXljQHSCb/Cy47S8H4s05A4zbK3pAFGzwcczZo= -cloud.google.com/go/mediatranslation v0.8.7/go.mod h1:6eJbPj1QJwiCP8R4K413qMx6ZHZJUi9QFpApqY88xWU= -cloud.google.com/go/memcache v1.10.4 h1:cdex/ayDd294XBj2cGeMe6Y+H1JvhN8y78B9UW7pxuQ= cloud.google.com/go/memcache v1.10.5 h1:yeDv5qxRedFosvpMSEswrqUsJM5OdWvssPHFliNFTc4= -cloud.google.com/go/memcache v1.10.7/go.mod h1:SrU6+QBhvXJV0TA59+B3oCHtLkPx37eqdKmRUlmSE1k= -cloud.google.com/go/metastore v1.13.3 h1:94l/Yxg9oBZjin2bzI79oK05feYefieDq0o5fjLSkC8= cloud.google.com/go/metastore v1.13.4 h1:dR7vqWXlK6IYR8Wbu9mdFfwlVjodIBhd1JRrpZftTEg= -cloud.google.com/go/metastore v1.13.6/go.mod h1:OBCVMCP7X9vA4KKD+5J4Q3d+tiyKxalQZnksQMq5MKY= -cloud.google.com/go/monitoring v1.16.3 h1:mf2SN9qSoBtIgiMA4R/y4VADPWZA7VCNJA079qLaZQ8= -cloud.google.com/go/monitoring v1.17.0 h1:blrdvF0MkPPivSO041ihul7rFMhXdVp8Uq7F59DKXTU= cloud.google.com/go/monitoring v1.18.0 h1:NfkDLQDG2UR3WYZVQE8kwSbUIEyIqJUPl+aOQdFH1T4= -cloud.google.com/go/monitoring v1.19.0/go.mod h1:25IeMR5cQ5BoZ8j1eogHE5VPJLlReQ7zFp5OiLgiGZw= -cloud.google.com/go/networkconnectivity v1.14.3 h1:e9lUkCe2BexsqsUc2bjV8+gFBpQa54J+/F3qKVtW+wA= cloud.google.com/go/networkconnectivity v1.14.4 h1:GBfXFhLyPspnaBE3nI/BRjdhW8vcbpT9QjE/4kDCDdc= -cloud.google.com/go/networkconnectivity v1.14.6/go.mod h1:/azB7+oCSmyBs74Z26EogZ2N3UcXxdCHkCPcz8G32bU= -cloud.google.com/go/networkmanagement v1.9.3 h1:HsQk4FNKJUX04k3OI6gUsoveiHMGvDRqlaFM2xGyvqU= cloud.google.com/go/networkmanagement v1.9.4 h1:aLV5GcosBNmd6M8+a0ekB0XlLRexv4fvnJJrYnqeBcg= -cloud.google.com/go/networkmanagement v1.13.2/go.mod h1:24VrV/5HFIOXMEtVQEUoB4m/w8UWvUPAYjfnYZcBc4c= -cloud.google.com/go/networksecurity v0.9.4 h1:947tNIPnj1bMGTIEBo3fc4QrrFKS5hh0bFVsHmFm4Vo= cloud.google.com/go/networksecurity v0.9.5 h1:+caSxBTj0E8OYVh/5wElFdjEMO1S/rZtE1152Cepchc= -cloud.google.com/go/networksecurity v0.9.7/go.mod h1:aB6UiPnh/l32+TRvgTeOxVRVAHAFFqvK+ll3idU5BoY= -cloud.google.com/go/notebooks v1.11.2 h1:eTOTfNL1yM6L/PCtquJwjWg7ZZGR0URFaFgbs8kllbM= cloud.google.com/go/notebooks v1.11.3 h1:FH48boYmrWVQ6k0Mx/WrnNafXncT5iSYxA8CNyWTgy0= -cloud.google.com/go/notebooks v1.11.5/go.mod h1:pz6P8l2TvhWqAW3sysIsS0g2IUJKOzEklsjWJfi8sd4= -cloud.google.com/go/optimization v1.6.2 h1:iFsoexcp13cGT3k/Hv8PA5aK+FP7FnbhwDO9llnruas= cloud.google.com/go/optimization v1.6.3 h1:63NZaWyN+5rZEKHPX4ACpw3BjgyeuY8+rCehiCMaGPY= -cloud.google.com/go/optimization v1.6.5/go.mod h1:eiJjNge1NqqLYyY75AtIGeQWKO0cvzD1ct/moCFaP2Q= -cloud.google.com/go/orchestration v1.8.4 h1:kgwZ2f6qMMYIVBtUGGoU8yjYWwMTHDanLwM/CQCFaoQ= cloud.google.com/go/orchestration v1.8.5 h1:YHgWMlrPttIVGItgGfuvO2KM7x+y9ivN/Yk92pMm1a4= -cloud.google.com/go/orchestration v1.9.2/go.mod h1:8bGNigqCQb/O1kK7PeStSNlyi58rQvZqDiuXT9KAcbg= -cloud.google.com/go/orgpolicy v1.11.4 h1:RWuXQDr9GDYhjmrredQJC7aY7cbyqP9ZuLbq5GJGves= -cloud.google.com/go/orgpolicy v1.12.0 h1:sab7cDiyfdthpAL0JkSpyw1C3mNqkXToVOhalm79PJQ= cloud.google.com/go/orgpolicy v1.12.1 h1:2JbXigqBJVp8Dx5dONUttFqewu4fP0p3pgOdIZAhpYU= -cloud.google.com/go/orgpolicy v1.12.3/go.mod h1:6BOgIgFjWfJzTsVcib/4QNHOAeOjCdaBj69aJVs//MA= -cloud.google.com/go/osconfig v1.12.4 h1:OrRCIYEAbrbXdhm13/JINn9pQchvTTIzgmOCA7uJw8I= cloud.google.com/go/osconfig v1.12.5 h1:Mo5jGAxOMKH/PmDY7fgY19yFcVbvwREb5D5zMPQjFfo= -cloud.google.com/go/osconfig v1.12.7/go.mod h1:ID7Lbqr0fiihKMwAOoPomWRqsZYKWxfiuafNZ9j1Y1M= -cloud.google.com/go/oslogin v1.12.2 h1:NP/KgsD9+0r9hmHC5wKye0vJXVwdciv219DtYKYjgqE= -cloud.google.com/go/oslogin v1.13.0 h1:gbA/G4p+youIR4O/Rk6DU181QlBlpwPS16kvJwqEz8o= cloud.google.com/go/oslogin v1.13.1 h1:1K4nOT5VEZNt7XkhaTXupBYos5HjzvJMfhvyD2wWdFs= -cloud.google.com/go/oslogin v1.13.3/go.mod h1:WW7Rs1OJQ1iSUckZDilvNBSNPE8on740zF+4ZDR4o8U= -cloud.google.com/go/phishingprotection v0.8.4 h1:sPLUQkHq6b4AL0czSJZ0jd6vL55GSTHz2B3Md+TCZI0= cloud.google.com/go/phishingprotection v0.8.5 h1:DH3WFLzEoJdW/6xgsmoDqOwT1xddFi7gKu0QGZQhpGU= -cloud.google.com/go/phishingprotection v0.8.7/go.mod h1:FtYaOyGc/HQQU7wY4sfwYZBFDKAL+YtVBjUj8E3A3/I= -cloud.google.com/go/policytroubleshooter v1.10.2 h1:sq+ScLP83d7GJy9+wpwYJVnY+q6xNTXwOdRIuYjvHT4= cloud.google.com/go/policytroubleshooter v1.10.3 h1:c0WOzC6hz964QWNBkyKfna8A2jOIx1zzZa43Gx/P09o= -cloud.google.com/go/policytroubleshooter v1.10.5/go.mod h1:bpOf94YxjWUqsVKokzPBibMSAx937Jp2UNGVoMAtGYI= -cloud.google.com/go/privatecatalog v0.9.4 h1:Vo10IpWKbNvc/z/QZPVXgCiwfjpWoZ/wbgful4Uh/4E= cloud.google.com/go/privatecatalog v0.9.5 h1:UZ0assTnATXSggoxUIh61RjTQ4P9zCMk/kEMbn0nMYA= -cloud.google.com/go/privatecatalog v0.9.7/go.mod h1:NWLa8MCL6NkRSt8jhL8Goy2A/oHkvkeAxiA0gv0rIXI= -cloud.google.com/go/pubsub v1.33.0 h1:6SPCPvWav64tj0sVX/+npCBKhUi/UjJehy9op/V3p2g= -cloud.google.com/go/pubsub v1.34.0 h1:ZtPbfwfi5rLaPeSvDC29fFoE20/tQvGrUS6kVJZJvkU= cloud.google.com/go/pubsub v1.36.1 h1:dfEPuGCHGbWUhaMCTHUFjfroILEkx55iUmKBZTP5f+Y= -cloud.google.com/go/pubsub v1.38.0/go.mod h1:IPMJSWSus/cu57UyR01Jqa/bNOQA+XnPF6Z4dKW4fAA= cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/recaptchaenterprise v1.3.1 h1:u6EznTGzIdsyOsvm+Xkw0aSuKFXQlyjGE9a4exk6iNQ= -cloud.google.com/go/recaptchaenterprise/v2 v2.9.0 h1:Zrd4LvT9PaW91X/Z13H0i5RKEv9suCLuk8zp+bfOpN4= cloud.google.com/go/recaptchaenterprise/v2 v2.9.2 h1:U3Wfq12X9cVMuTpsWDSURnXF0Z9hSPTHj+xsnXDRLsw= -cloud.google.com/go/recaptchaenterprise/v2 v2.13.0/go.mod h1:jNYyn2ScR4DTg+VNhjhv/vJQdaU8qz+NpmpIzEE7HFQ= -cloud.google.com/go/recommendationengine v0.8.4 h1:JRiwe4hvu3auuh2hujiTc2qNgPPfVp+Q8KOpsXlEzKQ= cloud.google.com/go/recommendationengine v0.8.5 h1:ineqLswaCSBY0csYv5/wuXJMBlxATK6Xc5jJkpiTEdM= -cloud.google.com/go/recommendationengine v0.8.7/go.mod h1:YsUIbweUcpm46OzpVEsV5/z+kjuV6GzMxl7OAKIGgKE= -cloud.google.com/go/recommender v1.11.3 h1:VndmgyS/J3+izR8V8BHa7HV/uun8//ivQ3k5eVKKyyM= -cloud.google.com/go/recommender v1.12.0 h1:tC+ljmCCbuZ/ybt43odTFlay91n/HLIhflvaOeb0Dh4= cloud.google.com/go/recommender v1.12.1 h1:LVLYS3r3u0MSCxQSDUtLSkporEGi9OAE6hGvayrZNPs= -cloud.google.com/go/recommender v1.12.3/go.mod h1:OgN0MjV7/6FZUUPgF2QPQtYErtZdZc4u+5onvurcGEI= -cloud.google.com/go/redis v1.14.1 h1:J9cEHxG9YLmA9o4jTSvWt/RuVEn6MTrPlYSCRHujxDQ= cloud.google.com/go/redis v1.14.2 h1:QF0maEdVv0Fj/2roU8sX3NpiDBzP9ICYTO+5F32gQNo= -cloud.google.com/go/redis v1.15.0/go.mod h1:X9Fp3vG5kqr5ho+5YM6AgJxypn+I9Ea5ANCuFKXLdX0= -cloud.google.com/go/resourcemanager v1.9.4 h1:JwZ7Ggle54XQ/FVYSBrMLOQIKoIT/uer8mmNvNLK51k= cloud.google.com/go/resourcemanager v1.9.5 h1:AZWr1vWVDKGwfLsVhcN+vcwOz3xqqYxtmMa0aABCMms= -cloud.google.com/go/resourcemanager v1.9.7/go.mod h1:cQH6lJwESufxEu6KepsoNAsjrUtYYNXRwxm4QFE5g8A= -cloud.google.com/go/resourcesettings v1.6.4 h1:yTIL2CsZswmMfFyx2Ic77oLVzfBFoWBYgpkgiSPnC4Y= cloud.google.com/go/resourcesettings v1.6.5 h1:BTr5MVykJwClASci/7Og4Qfx70aQ4n3epsNLj94ZYgw= -cloud.google.com/go/resourcesettings v1.6.7/go.mod h1:zwRL5ZoNszs1W6+eJYMk6ILzgfnTj13qfU4Wvfupuqk= -cloud.google.com/go/retail v1.14.4 h1:geqdX1FNqqL2p0ADXjPpw8lq986iv5GrVcieTYafuJQ= cloud.google.com/go/retail v1.16.0 h1:Fn1GuAua1c6crCGqfJ1qMxG1Xh10Tg/x5EUODEHMqkw= -cloud.google.com/go/retail v1.16.2/go.mod h1:T7UcBh4/eoxRBpP3vwZCoa+PYA9/qWRTmOCsV8DRdZ0= -cloud.google.com/go/run v1.3.3 h1:qdfZteAm+vgzN1iXzILo3nJFQbzziudkJrvd9wCf3FQ= cloud.google.com/go/run v1.3.4 h1:m9WDA7DzTpczhZggwYlZcBWgCRb+kgSIisWn1sbw2rQ= -cloud.google.com/go/run v1.3.7/go.mod h1:iEUflDx4Js+wK0NzF5o7hE9Dj7QqJKnRj0/b6rhVq20= -cloud.google.com/go/scheduler v1.10.5 h1:eMEettHlFhG5pXsoHouIM5nRT+k+zU4+GUvRtnxhuVI= cloud.google.com/go/scheduler v1.10.6 h1:5U8iXLoQ03qOB+ZXlAecU7fiE33+u3QiM9nh4cd0eTE= -cloud.google.com/go/scheduler v1.10.8/go.mod h1:0YXHjROF1f5qTMvGTm4o7GH1PGAcmu/H/7J7cHOiHl0= -cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k= cloud.google.com/go/secretmanager v1.11.5 h1:82fpF5vBBvu9XW4qj0FU2C6qVMtj1RM/XHwKXUEAfYY= -cloud.google.com/go/secretmanager v1.13.1/go.mod h1:y9Ioh7EHp1aqEKGYXk3BOC+vkhlHm9ujL7bURT4oI/4= -cloud.google.com/go/security v1.15.4 h1:sdnh4Islb1ljaNhpIXlIPgb3eYj70QWgPVDKOUYvzJc= cloud.google.com/go/security v1.15.5 h1:wTKJQ10j8EYgvE8Y+KhovxDRVDk2iv/OsxZ6GrLP3kE= -cloud.google.com/go/security v1.17.0/go.mod h1:eSuFs0SlBv1gWg7gHIoF0hYOvcSwJCek/GFXtgO6aA0= -cloud.google.com/go/securitycenter v1.24.3 h1:crdn2Z2rFIy8WffmmhdlX3CwZJusqCiShtnrGFRwpeE= cloud.google.com/go/securitycenter v1.24.4 h1:/5jjkZ+uGe8hZ7pvd7pO30VW/a+pT2MrrdgOqjyucKQ= -cloud.google.com/go/securitycenter v1.30.0/go.mod h1:/tmosjS/dfTnzJxOzZhTXdX3MXWsCmPWfcYOgkJmaJk= cloud.google.com/go/servicecontrol v1.11.1 h1:d0uV7Qegtfaa7Z2ClDzr9HJmnbJW7jn0WhZ7wOX6hLE= -cloud.google.com/go/servicedirectory v1.11.3 h1:5niCMfkw+jifmFtbBrtRedbXkJm3fubSR/KHbxSJZVM= cloud.google.com/go/servicedirectory v1.11.4 h1:da7HFI1229kyzIyuVEzHXip0cw0d+E0s8mjQby0WN+k= -cloud.google.com/go/servicedirectory v1.11.7/go.mod h1:fiO/tM0jBpVhpCAe7Yp5HmEsmxSUcOoc4vPrO02v68I= cloud.google.com/go/servicemanagement v1.8.0 h1:fopAQI/IAzlxnVeiKn/8WiV6zKndjFkvi+gzu+NjywY= cloud.google.com/go/serviceusage v1.6.0 h1:rXyq+0+RSIm3HFypctp7WoXxIA563rn206CfMWdqXX4= -cloud.google.com/go/shell v1.7.4 h1:nurhlJcSVFZneoRZgkBEHumTYf/kFJptCK2eBUq/88M= cloud.google.com/go/shell v1.7.5 h1:3Fq2hzO0ZSyaqBboJrFkwwf/qMufDtqwwA6ep8EZxEI= -cloud.google.com/go/shell v1.7.7/go.mod h1:7OYaMm3TFMSZBh8+QYw6Qef+fdklp7CjjpxYAoJpZbQ= -cloud.google.com/go/spanner v1.53.1 h1:xNmE0SXMSxNBuk7lRZ5G/S+A49X91zkSTt7Jn5Ptlvw= -cloud.google.com/go/spanner v1.55.0 h1:YF/A/k73EMYCjp8wcJTpkE+TcrWutHRlsCtlRSfWS64= cloud.google.com/go/spanner v1.57.0 h1:fJq+ZfQUDHE+cy1li0bJA8+sy2oiSGhuGqN5nqVaZdU= -cloud.google.com/go/spanner v1.63.0/go.mod h1:iqDx7urZpgD7RekZ+CFvBRH6kVTW1ZSEb2HMDKOp5Cc= -cloud.google.com/go/speech v1.21.0 h1:qkxNao58oF8ghAHE1Eghen7XepawYEN5zuZXYWaUTA4= cloud.google.com/go/speech v1.21.1 h1:nuFc+Kj5B8de75nN4FdPyUbI2SiBoHZG6BLurXL56Q0= -cloud.google.com/go/speech v1.23.1/go.mod h1:UNgzNxhNBuo/OxpF1rMhA/U2rdai7ILL6PBXFs70wq0= -cloud.google.com/go/storage v1.40.0/go.mod h1:Rrj7/hKlG87BLqDJYtwR0fbPld8uJPbQ2ucUMY7Ir0g= -cloud.google.com/go/storagetransfer v1.10.3 h1:YM1dnj5gLjfL6aDldO2s4GeU8JoAvH1xyIwXre63KmI= cloud.google.com/go/storagetransfer v1.10.4 h1:dy4fL3wO0VABvzM05ycMUPFHxTPbJz9Em8ikAJVqSbI= -cloud.google.com/go/storagetransfer v1.10.6/go.mod h1:3sAgY1bx1TpIzfSzdvNGHrGYldeCTyGI/Rzk6Lc6A7w= -cloud.google.com/go/talent v1.6.5 h1:LnRJhhYkODDBoTwf6BeYkiJHFw9k+1mAFNyArwZUZAs= cloud.google.com/go/talent v1.6.6 h1:JssV0CE3FNujuSWn7SkosOzg7qrMxVnt6txOfGcMSa4= -cloud.google.com/go/talent v1.6.8/go.mod h1:kqPAJvhxmhoUTuqxjjk2KqA8zUEeTDmH+qKztVubGlQ= -cloud.google.com/go/texttospeech v1.7.4 h1:ahrzTgr7uAbvebuhkBAAVU6kRwVD0HWsmDsvMhtad5Q= cloud.google.com/go/texttospeech v1.7.5 h1:dxY2Q5mHCbrGa3oPR2O3PCicdnvKa1JmwGQK36EFLOw= -cloud.google.com/go/texttospeech v1.7.7/go.mod h1:XO4Wr2VzWHjzQpMe3gS58Oj68nmtXMyuuH+4t0wy9eA= -cloud.google.com/go/tpu v1.6.4 h1:XIEH5c0WeYGaVy9H+UueiTaf3NI6XNdB4/v6TFQJxtE= cloud.google.com/go/tpu v1.6.5 h1:C8YyYda8WtNdBoCgFwwBzZd+S6+EScHOxM/z1h0NNp8= -cloud.google.com/go/tpu v1.6.7/go.mod h1:o8qxg7/Jgt7TCgZc3jNkd4kTsDwuYD3c4JTMqXZ36hU= -cloud.google.com/go/trace v1.10.4 h1:2qOAuAzNezwW3QN+t41BtkDJOG42HywL73q8x/f6fnM= cloud.google.com/go/trace v1.10.5 h1:0pr4lIKJ5XZFYD9GtxXEWr0KkVeigc3wlGpZco0X1oA= -cloud.google.com/go/trace v1.10.7/go.mod h1:qk3eiKmZX0ar2dzIJN/3QhY2PIFh1eqcIdaN5uEjQPM= -cloud.google.com/go/translate v1.9.3 h1:t5WXTqlrk8VVJu/i3WrYQACjzYJiff5szARHiyqqPzI= -cloud.google.com/go/translate v1.10.0 h1:tncNaKmlZnayMMRX/mMM2d5AJftecznnxVBD4w070NI= cloud.google.com/go/translate v1.10.1 h1:upovZ0wRMdzZvXnu+RPam41B0mRJ+coRXFP2cYFJ7ew= -cloud.google.com/go/translate v1.10.3/go.mod h1:GW0vC1qvPtd3pgtypCv4k4U8B7EdgK9/QEF2aJEUovs= -cloud.google.com/go/video v1.20.3 h1:Xrpbm2S9UFQ1pZEeJt9Vqm5t2T/z9y/M3rNXhFoo8Is= cloud.google.com/go/video v1.20.4 h1:TXwotxkShP1OqgKsbd+b8N5hrIHavSyLGvYnLGCZ7xc= -cloud.google.com/go/video v1.21.0/go.mod h1:Kqh97xHXZ/bIClgDHf5zkKvU3cvYnLyRefmC8yCBqKI= -cloud.google.com/go/videointelligence v1.11.4 h1:YS4j7lY0zxYyneTFXjBJUj2r4CFe/UoIi/PJG0Zt/Rg= cloud.google.com/go/videointelligence v1.11.5 h1:mYaWH8uhUCXLJCN3gdXswKzRa2+lK0zN6/KsIubm6pE= -cloud.google.com/go/videointelligence v1.11.7/go.mod h1:iMCXbfjurmBVgKuyLedTzv90kcnppOJ6ttb0+rLDID0= cloud.google.com/go/vision v1.2.0 h1:/CsSTkbmO9HC8iQpxbK8ATms3OQaX3YQUeTMGCxlaK4= -cloud.google.com/go/vision/v2 v2.7.5 h1:T/ujUghvEaTb+YnFY/jiYwVAkMbIC8EieK0CJo6B4vg= cloud.google.com/go/vision/v2 v2.8.0 h1:W52z1b6LdGI66MVhE70g/NFty9zCYYcjdKuycqmlhtg= -cloud.google.com/go/vision/v2 v2.8.2/go.mod h1:BHZA1LC7dcHjSr9U9OVhxMtLKd5l2jKPzLRALEJvuaw= -cloud.google.com/go/vmmigration v1.7.4 h1:qPNdab4aGgtaRX+51jCOtJxlJp6P26qua4o1xxUDjpc= cloud.google.com/go/vmmigration v1.7.5 h1:5v9RT2vWyuw3pK2ox0HQpkoftO7Q7/8591dTxxQc79g= -cloud.google.com/go/vmmigration v1.7.7/go.mod h1:qYIK5caZY3IDMXQK+A09dy81QU8qBW0/JDTc39OaKRw= -cloud.google.com/go/vmwareengine v1.0.3 h1:WY526PqM6QNmFHSqe2sRfK6gRpzWjmL98UFkql2+JDM= cloud.google.com/go/vmwareengine v1.1.1 h1:EGdDi9QbqThfZq3ILcDK5g+m9jTevc34AY5tACx5v7k= -cloud.google.com/go/vmwareengine v1.1.3/go.mod h1:UoyF6LTdrIJRvDN8uUB8d0yimP5A5Ehkr1SRzL1APZw= -cloud.google.com/go/vpcaccess v1.7.4 h1:zbs3V+9ux45KYq8lxxn/wgXole6SlBHHKKyZhNJoS+8= cloud.google.com/go/vpcaccess v1.7.5 h1:XyL6hTLtEM/eE4F1GEge8xUN9ZCkiVWn44K/YA7z1rQ= -cloud.google.com/go/vpcaccess v1.7.7/go.mod h1:EzfSlgkoAnFWEMznZW0dVNvdjFjEW97vFlKk4VNBhwY= -cloud.google.com/go/webrisk v1.9.4 h1:iceR3k0BCRZgf2D/NiKviVMFfuNC9LmeNLtxUFRB/wI= cloud.google.com/go/webrisk v1.9.5 h1:251MvGuC8wisNN7+jqu9DDDZAi38KiMXxOpA/EWy4dE= -cloud.google.com/go/webrisk v1.9.7/go.mod h1:7FkQtqcKLeNwXCdhthdXHIQNcFWPF/OubrlyRcLHNuQ= -cloud.google.com/go/websecurityscanner v1.6.4 h1:5Gp7h5j7jywxLUp6NTpjNPkgZb3ngl0tUSw6ICWvtJQ= cloud.google.com/go/websecurityscanner v1.6.5 h1:YqWZrZYabG88TZt7364XWRJGhxmxhony2ZUyZEYMF2k= -cloud.google.com/go/websecurityscanner v1.6.7/go.mod h1:EpiW84G5KXxsjtFKK7fSMQNt8JcuLA8tQp7j0cyV458= -cloud.google.com/go/workflows v1.12.3 h1:qocsqETmLAl34mSa01hKZjcqAvt699gaoFbooGGMvaM= cloud.google.com/go/workflows v1.12.4 h1:uHNmUiatTbPQ4H1pabwfzpfEYD4BBnqDHqMm2IesOh4= -cloud.google.com/go/workflows v1.12.6/go.mod h1:oDbEHKa4otYg4abwdw2Z094jB0TLLiFGAPA78EDAKag= contrib.go.opencensus.io/exporter/aws v0.0.0-20200617204711-c478e41e60e9 h1:yxE46rQA0QaqPGqN2UnwXvgCrRqtjR1CsGSWVTRjvv4= contrib.go.opencensus.io/exporter/prometheus v0.4.2 h1:sqfsYl5GIY/L570iT+l93ehxaWJs2/OwXtiWwew3oAg= contrib.go.opencensus.io/exporter/prometheus v0.4.2/go.mod h1:dvEHbiKmgvbr5pjaF9fpw1KeYcjrnC1J8B+JKjsZyRQ= @@ -384,38 +135,28 @@ contrib.go.opencensus.io/integrations/ocsql v0.1.7 h1:G3k7C0/W44zcqkpRSFyjU9f6HZ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= docker.io/go-docker v1.0.0 h1:VdXS/aNYQxyA9wdLD5z8Q8Ro688/hG8HzKxYVEVbE6s= docker.io/go-docker v1.0.0/go.mod h1:7tiAn5a0LFmjbPDbyTPOaTTOuG1ZRNXdPA6RvKY+fpY= -filippo.io/edwards25519 v1.0.0 h1:0wAIcmJUqRdI8IJ/3eGi5/HwXZWPujYXXlkrQogz0Ek= -filippo.io/edwards25519 v1.0.0/go.mod h1:N1IkdkCkiLB6tki+MYJoSx2JTY9NUlxZE7eHn5EwJns= gioui.org v0.0.0-20210308172011-57750fc8a0a6 h1:K72hopUosKG3ntOPNG4OzzbuhxGuVf06fa2la1/H/Ho= git.sr.ht/~sbinet/gg v0.3.1 h1:LNhjNn8DerC8f9DHLz6lS0YYul/b602DUxDgGkd/Aik= github.com/99designs/basicauth-go v0.0.0-20160802081356-2a93ba0f464d h1:j6oB/WPCigdOkxtuPl1VSIiLpy7Mdsu6phQffbF19Ng= github.com/99designs/httpsignatures-go v0.0.0-20170731043157-88528bf4ca7e h1:rl2Aq4ZODqTDkeSqQBy+fzpZPamacO1Srp8zq7jf2Sc= -github.com/AdaLogics/go-fuzz-headers v0.0.0-20210715213245-6c3934b029d8/go.mod h1:CzsSbkDixRphAF5hS6wbMKq0eI6ccJRb7/A0M6JBnwg= -github.com/AndreasBriese/bbloom v0.0.0-20190306092124-e2d15f34fcf9 h1:HD8gA2tkByhMAwYaFAX9w2l7vxvBQ5NMoxDrkhqhtn4= github.com/Azure/azure-amqp-common-go/v3 v3.2.2 h1:CJpxNAGxP7UBhDusRUoaOn0uOorQyAYhQYLnNgkRhlY= -github.com/Azure/azure-sdk-for-go v16.2.1+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal v1.1.2 h1:mLY+pNLjCUeKhgnAJWAKhEUQM+RJQo2H1fuGSw1Ky1E= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/internal/v2 v2.0.0 h1:PTFGRSlMKCQelWwxUyYVEUqseBJVemLyqWJjvMyt0do= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/managementgroups/armmanagementgroups v1.0.0 h1:pPvTJ1dY0sA35JOeFq6TsY2xj6Z85Yo23Pj4wCCvu4o= -github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.0.0 h1:ECsQtyERDVz3NP3kvDOTLvbQhqWp/x9EsGKtb4ogUr8= github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/resources/armresources v1.1.1 h1:7CBQ+Ei8SP2c6ydQTGCCrS35bDxgTMfoP2miAwK++OU= github.com/Azure/azure-service-bus-go v0.11.5 h1:EVMicXGNrSX+rHRCBgm/TRQ4VUZ1m3yAYM/AB2R/SOs= github.com/Azure/go-amqp v0.16.4 h1:/1oIXrq5zwXLHaoYDliJyiFjJSpJZMWGgtMX9e0/Z30= -github.com/Azure/go-autorest v10.8.1+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= -github.com/Azure/go-autorest/autorest v0.11.1/go.mod h1:JFgpikqFJ/MleTTxwepExTKnFUKKszPS8UavbQYUMuw= -github.com/Azure/go-autorest/autorest/adal v0.9.0/go.mod h1:/c022QCutn2P7uY+/oQWWNcK9YU+MH96NgK+jErpbcg= github.com/Azure/go-autorest/autorest/azure/auth v0.5.11 h1:P6bYXFoao05z5uhOQzbC3Qd8JqF3jUoocoTeIxkp2cA= github.com/Azure/go-autorest/autorest/azure/auth v0.5.11/go.mod h1:84w/uV8E37feW2NCJ08uT9VBfjfUHpgLVnG2InYD6cg= github.com/Azure/go-autorest/autorest/azure/cli v0.4.5 h1:0W/yGmFdTIT77fvdlGZ0LMISoLHFJ7Tx4U0yeB+uFs4= github.com/Azure/go-autorest/autorest/azure/cli v0.4.5/go.mod h1:ADQAXrkgm7acgWVUNamOgh8YNrv4p27l3Wc55oVfpzg= -github.com/Azure/go-autorest/autorest/mocks v0.4.0/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= -github.com/Azure/go-autorest/logger v0.2.0/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +github.com/ClickHouse/ch-go v0.58.2 h1:jSm2szHbT9MCAB1rJ3WuCJqmGLi5UTjlNu+f530UTS0= github.com/ClickHouse/ch-go v0.58.2/go.mod h1:Ap/0bEmiLa14gYjCiRkYGbXvbe8vwdrfTYWhsuQ99aw= +github.com/ClickHouse/clickhouse-go/v2 v2.17.1 h1:ZCmAYWpu75IyEi7+Yrs/uaAjiCGY5wfW5kXo64exkX4= github.com/ClickHouse/clickhouse-go/v2 v2.17.1/go.mod h1:rkGTvFDTLqLIm0ma+13xmcCfr/08Gvs7KmFt1tgiWHQ= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53 h1:sR+/8Yb4slttB4vD+b9btVEnWgL3Q00OBTzVT8B9C0c= github.com/CloudyKit/fastprinter v0.0.0-20200109182630-33d98a066a53/go.mod h1:+3IMCy2vIlbG1XG/0ggNQv0SvxCAIpPM5b1nCz56Xno= -github.com/CloudyKit/jet/v3 v3.0.0 h1:1PwO5w5VCtlUUl+KTOBsTGZlhjWkcybsGaAau52tOy8= github.com/CloudyKit/jet/v6 v6.2.0 h1:EpcZ6SR9n28BUGtNJSvlBqf90IpjeFr36Tizxhn/oME= github.com/CloudyKit/jet/v6 v6.2.0/go.mod h1:d3ypHeIRNo2+XyqnGA8s+aphtcVpjP5hPwP/Lzo7Ro4= github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= @@ -426,50 +167,22 @@ github.com/KimMachineGun/automemlimit v0.6.0 h1:p/BXkH+K40Hax+PuWWPQ478hPjsp9h1C github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= -github.com/Microsoft/go-winio v0.4.14/go.mod h1:qXqCSQ3Xa7+6tgxaGTIe4Kpcdsi+P8jBhyzoq1bpyYA= -github.com/Microsoft/go-winio v0.4.15-0.20190919025122-fc70bd9a86b5/go.mod h1:tTuCMEN+UleMWgg9dVx4Hu52b1bJo+59jBh3ajtinzw= -github.com/Microsoft/go-winio v0.4.16-0.20201130162521-d1ffc52c7331/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.16/go.mod h1:XB6nPKklQyQ7GC9LdcBEcBl8PF76WugXOPRXwdLnMv0= -github.com/Microsoft/go-winio v0.4.17-0.20210211115548-6eac466e5fa3/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17-0.20210324224401-5516f17a5958/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.4.17/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/go-winio v0.5.1/go.mod h1:JPGBdM1cNvN/6ISo+n8V5iA4v8pBzdOpzfwIujj1a84= -github.com/Microsoft/hcsshim v0.8.6/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7-0.20190325164909-8abdbb8205e4/go.mod h1:Op3hHsoHPAvb6lceZHDtd9OkTew38wNoXnJs8iY7rUg= -github.com/Microsoft/hcsshim v0.8.7/go.mod h1:OHd7sQqRFrYd3RmSgbgji+ctCwkbq2wbEYNSzOYtcBQ= -github.com/Microsoft/hcsshim v0.8.9/go.mod h1:5692vkUqntj1idxauYlpoINNKeqCiG6Sg38RRsjT5y8= -github.com/Microsoft/hcsshim v0.8.14/go.mod h1:NtVKoYxQuTLx6gEq0L96c9Ju4JbRJ4nY2ow3VK6a9Lg= -github.com/Microsoft/hcsshim v0.8.15/go.mod h1:x38A4YbHbdxJtc0sF6oIz+RG0npwSCAvn69iY6URG00= -github.com/Microsoft/hcsshim v0.8.16/go.mod h1:o5/SZqmR7x9JNKsW3pu+nqHm0MF8vbA+VxGOoXdC600= -github.com/Microsoft/hcsshim v0.8.20/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.21/go.mod h1:+w2gRZ5ReXQhFOrvSQeNfhrYB/dg3oDwTOcER2fw4I4= -github.com/Microsoft/hcsshim v0.8.23/go.mod h1:4zegtUJth7lAvFyc6cH2gGQ5B3OFQim01nnU2M8jKDg= -github.com/Microsoft/hcsshim v0.9.2/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim v0.9.6/go.mod h1:7pLA8lDk46WKDWlVsENo92gC0XFa8rbKfyFRBqxEbCc= -github.com/Microsoft/hcsshim/test v0.0.0-20201218223536-d3e5debf77da/go.mod h1:5hlzMzRKMLyo42nCZ9oml8AdTlq/0cvIaBv6tK1RehU= -github.com/Microsoft/hcsshim/test v0.0.0-20210227013316-43a75bb4edd3/go.mod h1:mw7qgWloBUl75W/gVH3cQszUg1+gUITj7D6NY7ywVnY= github.com/Nvveen/Gotty v0.0.0-20120604004816-cd527374f1e5 h1:TngWCqHvy9oXAN6lEVMRuU21PR1EtLVZJmdB18Gu3Rw= github.com/OneOfOne/xxhash v1.2.6 h1:U68crOE3y3MPttCMQGywZOLrTeF5HHJ3/vDBCJn9/bA= github.com/OneOfOne/xxhash v1.2.6/go.mod h1:eZbhyaAYD41SGSSsnmcpxVoRiQ/MPUTjUdIIOT9Um7Q= +github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= -github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= -github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= -github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= -github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= github.com/RaveNoX/go-jsoncommentstrip v1.0.0 h1:t527LHHE3HmiHrq74QMpNPZpGCIJzTx+apLkMKt4HC0= github.com/RoaringBitmap/gocroaring v0.4.0 h1:5nufXUgWpBEUNEJXw7926YAA58ZAQRpWPrQV1xCoSjc= github.com/RoaringBitmap/real-roaring-datasets v0.0.0-20190726190000-eb7c87156f76 h1:ZYlhPbqQFU+AHfgtCdHGDTtRW1a8geZyiE8c6Q+Sl1s= -github.com/Shopify/goreferrer v0.0.0-20181106222321-ec9c9a553398 h1:WDC6ySpJzbxGWFh4aMxFFC28wwGp5pEuoTtvA4q/qQ4= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06 h1:KkH3I3sJuOLP3TjA/dfr4NAY8bghDwnXiU7cTKxQqo0= github.com/Shopify/goreferrer v0.0.0-20220729165902-8cddb4f5de06/go.mod h1:7erjKLwalezA0k99cWs5L11HWOAPNjdUZ6RxH1BXbbM= -github.com/Shopify/logrus-bugsnag v0.0.0-20171204204709-577dee27f20d/go.mod h1:HI8ITrYtUY+O+ZhtlqUnD8+KwNPOyugEhfP9fdUIaEQ= github.com/Shopify/sarama v1.38.1 h1:lqqPUPQZ7zPqYlWpTh+LQ9bhYNu2xJL6k1SJN4WVe2A= github.com/Shopify/sarama v1.38.1/go.mod h1:iwv9a67Ha8VNa+TifujYoWGxWnu2kNVAQdSdZ4X2o5g= github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/VividCortex/gohistogram v1.0.0 h1:6+hBz+qvs0JOrrNhhmR7lFxo5sINxBCGXrdtl/UvroE= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= +github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9 h1:7kQgkwGRoLzC9K0oyXdJo7nve/bynv/KwUsxbiTlzAM= github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19 h1:iXUgAaqDcIUGbRoy2TdeofRG/j1zpGRSEmNK05T+bi8= @@ -481,18 +194,17 @@ github.com/alecthomas/kong v0.2.11/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QL github.com/alecthomas/participle/v2 v2.1.0 h1:z7dElHRrOEEq45F2TG5cbQihMtNTv8vwldytDj7Wrz4= github.com/alecthomas/repr v0.2.0 h1:HAzS41CIzNW5syS8Mf9UwXhNH1J9aix/BvDRf1Ml2Yk= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= +github.com/alexflint/go-arg v1.4.2 h1:lDWZAXxpAnZUq4qwb86p/3rIJJ2Li81EoMbTMujhVa0= github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= -github.com/alexflint/go-filemutex v0.0.0-20171022225611-72bdc8eae2ae/go.mod h1:CgnQgUtFrFz9mxFNtED3jI5tLDjKlOM+oUF/sTk6ps0= -github.com/alexflint/go-filemutex v1.1.0/go.mod h1:7P4iRhttt/nUvUOrYIhcpMzv2G6CY9UnI16Z+UJqRyk= +github.com/alexflint/go-scalar v1.0.0 h1:NGupf1XV/Xb04wXskDFzS0KWOLH632W/EO4fAFi+A70= github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/alicebob/miniredis v2.5.0+incompatible h1:yBHoLpsyjupjz3NL3MhKMVkR41j82Yjf3KFv7ApYzUI= github.com/alicebob/miniredis v2.5.0+incompatible/go.mod h1:8HZjEj4yU0dwhYHky+DxYx+6BMjkBbe5ONFIF1MXffk= +github.com/andybalholm/cascadia v1.3.1 h1:nhxRkql1kdYCc8Snf7D5/D3spOX+dBgjA6u8x004T2c= github.com/andybalholm/cascadia v1.3.1/go.mod h1:R4bJ1UQfqADjvDa4P6HZHLh/3OxWWEqc0Sk8XGwHqvA= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= -github.com/antlr/antlr4/runtime/Go/antlr/v4 v4.0.0-20230305170008-8188dc5388df/go.mod h1:pSwJ0fSY5KhvocuWSx4fz3BA8OrA1bQn+K1Eli3BRwM= github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI= github.com/apache/arrow/go/v11 v11.0.0 h1:hqauxvFQxww+0mEU/2XHG6LT7eZternCZq+A5Yly2uM= -github.com/apache/arrow/go/v12 v12.0.0 h1:xtZE63VWl7qLdB0JObIXvvhGjoVNrQ9ciIHG2OK5cmc= github.com/apache/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg= github.com/apache/arrow/go/v13 v13.0.0 h1:kELrvDQuKZo8csdWYqBQfyi431x6Zs/YJTEgUuSVcWk= github.com/apache/arrow/go/v13 v13.0.0/go.mod h1:W69eByFNO0ZR30q1/7Sr9d83zcVZmF2MiP3fFYAWJOc= @@ -503,7 +215,6 @@ github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1 github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/aryann/difflib v0.0.0-20170710044230-e206f873d14a h1:pv34s756C4pEXnjgPfGYgdhg/ZdajGhyOvzx8k+23nw= github.com/aws/aws-lambda-go v1.13.3 h1:SuCy7H3NLyp+1Mrfp+m80jcbi9KYWAs9/BXwppwRDzY= -github.com/aws/aws-sdk-go v1.15.11/go.mod h1:mFuSZ37Z9YOHbQEwBWztmVzqXrEkub65tZoCYDt7FT0= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1 h1:w/fPGB0t5rWwA43mux4e9ozFSH5zF1moQemlA131PWc= github.com/aws/aws-sdk-go-v2/service/kms v1.16.3 h1:nUP29LA4GZZPihNSo5ZcF4Rl73u+bN5IBRnrQA0jFK4= github.com/aws/aws-sdk-go-v2/service/secretsmanager v1.15.4 h1:EmIEXOjAdXtxa2OGM1VAajZV/i06Q8qd4kBpJd9/p1k= @@ -512,55 +223,30 @@ github.com/aws/aws-sdk-go-v2/service/sqs v1.18.3 h1:uHjK81fESbGy2Y9lspub1+C6VN5W github.com/aws/aws-sdk-go-v2/service/ssm v1.24.1 h1:zc1YLcknvxdW/i1MuJKmEnFB2TNkOfguuQaGRvJXPng= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= -github.com/aymerick/raymond v2.0.3-0.20180322193309-b565731e1464+incompatible h1:Ppm0npCCsmuR9oQaBtRuZcmILVE74aXE+AmrJj8L2ns= -github.com/benbjohnson/clock v1.0.3/go.mod h1:bGMdMPoPVvcYyt1gHDf4J2KE153Yf9BuiUKYMaxlTDM= -github.com/beorn7/perks v0.0.0-20160804104726-4c0e84591b9a/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY= -github.com/bitly/go-simplejson v0.5.0/go.mod h1:cXHtHw4XUPsvGaxgjIAn8PhEWG9NfngEKAMDJEczWVA= -github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84= -github.com/blang/semver v3.1.0+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= -github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk= github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY= github.com/boombuler/barcode v1.0.1 h1:NDBbPmhS+EqABEs5Kg3n/5ZNjy73Pz7SIV+KCeqyXcs= +github.com/bradleyjkemp/cupaloy/v2 v2.6.0 h1:knToPYa2xtfg42U3I6punFEjaGFKWQRXJwj0JTv4mTs= github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= -github.com/bshuster-repo/logrus-logstash-hook v0.4.1/go.mod h1:zsTqEiSzDgAa/8GZR7E1qaXrhYNDKBYy5/dWPTIflbk= github.com/bufbuild/protovalidate-go v0.2.1 h1:pJr07sYhliyfj/STAM7hU4J3FKpVeLVKvOBmOTN8j+s= github.com/bufbuild/protovalidate-go v0.2.1/go.mod h1:e7XXDtlxj5vlEyAgsrxpzayp4cEMKCSSb8ZCkin+MVA= -github.com/buger/jsonparser v0.0.0-20180808090653-f4dd9f5a6b44/go.mod h1:bbYlZJ7hK1yFx9hf58LP0zeX7UjIGs20ufpu3evjr+s= -github.com/bugsnag/bugsnag-go v0.0.0-20141110184014-b1d153021fcd/go.mod h1:2oa8nejYd4cQ/b0hMIopN0lCRxU0bueqREvZLWFrtK8= -github.com/bugsnag/osext v0.0.0-20130617224835-0dd3f918b21b/go.mod h1:obH5gd0BsqsP2LwDJ9aOkm/6J86V6lyAXCoQWGw3K50= -github.com/bugsnag/panicwrap v0.0.0-20151223152923-e2c28503fcd0/go.mod h1:D/8v3kj0zr8ZAKg1AQ6crr+5VwKN5eIywRkfhyM/+dE= github.com/bwesterb/go-ristretto v1.2.3 h1:1w53tCkGhCQ5djbat3+MH0BAQ5Kfgbt56UZQ/JMzngw= github.com/bytedance/sonic v1.10.0-rc3 h1:uNSnscRapXTwUgTyOF0GVljYD08p9X/Lbr9MweSV3V0= github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= github.com/cenkalti/backoff v2.2.1+incompatible h1:tNowT99t7UNflLxfYYSlKYsBpXdEet03Pg2g16Swow4= -github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= -github.com/certifi/gocertifi v0.0.0-20191021191039-0944d244cd40/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= -github.com/certifi/gocertifi v0.0.0-20200922220541-2c3bb06c6054/go.mod h1:sGbDF6GwGcLpkNXPUTkMRoywsNa/ol15pxFe6ERfguA= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= -github.com/checkpoint-restore/go-criu/v4 v4.1.0/go.mod h1:xUQBLp4RLc5zJtWY++yjOoMoB5lihDt7fai+75m+rGw= -github.com/checkpoint-restore/go-criu/v5 v5.0.0/go.mod h1:cfwC0EG7HMUenopBsUf9d89JlCLQIfgVcNsNN0t6T2M= -github.com/checkpoint-restore/go-criu/v5 v5.3.0/go.mod h1:E/eQpaFtUKGOOSEBZgmKAcn+zUUwWxqcaKZlF54wK8E= -github.com/cheekybits/is v0.0.0-20150225183255-68e9c0620927/go.mod h1:h/aW8ynjgkuj+NQRlZcDbAbM1ORAbXjXX77sX7T289U= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= -github.com/chromedp/cdproto v0.0.0-20220208224320-6efb837e6bc2/go.mod h1:At5TxYYdxkbQL0TSefRjhLE3Q0lgvqKKMSFUglJ7i1U= github.com/chromedp/chromedp v0.9.2 h1:dKtNz4kApb06KuSXoTQIyUC2TrA0fhGDwNZf3bcgfKw= github.com/chromedp/sysutil v1.0.0 h1:+ZxhTpfpZlmchB58ih/LBHX52ky7w2VhQVKQMucy3Ic= github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= -github.com/cilium/ebpf v0.0.0-20200110133405-4032b1d8aae3/go.mod h1:MA5e5Lr8slmEg9bt0VpxxWqJlO4iwu3FBdHUzV7wQVg= -github.com/cilium/ebpf v0.0.0-20200702112145-1c8d4c9ef775/go.mod h1:7cR51M8ViRLIdUjrmSXlK9pkrsDlLHbO8jiB8X8JnOc= -github.com/cilium/ebpf v0.2.0/go.mod h1:To2CFviqOWL/M0gIMsvSMlqe7em/l1ALkX1PyjrX2Qs= -github.com/cilium/ebpf v0.4.0/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.6.2/go.mod h1:4tRaxcgiL706VnOzHOdBlY8IEAIdxINsQBcU4xJJXRs= -github.com/cilium/ebpf v0.7.0/go.mod h1:/oI2+1shJiTGAMgl6/RgJr36Eo1jzrRcAWbcXO2usCA= github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= @@ -571,147 +257,21 @@ github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nC github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I= github.com/cockroachdb/cockroach-go v0.0.0-20181001143604-e0a95dfd547c h1:2zRrJWIt/f9c9HhNHAgrRgq0San5gRRUJTBXLkchal0= github.com/cockroachdb/datadriven v0.0.0-20190809214429-80d97fb3cbaa h1:OaNxuTZr7kxeODyLWsRMC+OD03aFUH+mW6r2d+MWa5Y= -github.com/cockroachdb/datadriven v0.0.0-20200714090401-bf6692d28da5/go.mod h1:h6jFvWxBdQXxjopDMZyH2UVceIRfR84bdzbkoKrsWNo= -github.com/cockroachdb/datadriven v1.0.2 h1:H9MtNqVoVhvd9nCBwOyDjUEdZCREqbIdCJD93PBm/jA= -github.com/cockroachdb/errors v1.2.4/go.mod h1:rQD95gz6FARkaKkQXUksEje/d9a6wBJoCr5oaCLELYA= -github.com/cockroachdb/logtags v0.0.0-20190617123548-eb05cc24525f/go.mod h1:i/u985jwjWRlyHXQbwatDASoW0RMlZ/3i9yJHE2xLkI= github.com/codahale/hdrhistogram v0.0.0-20161010025455-3a0bb77429bd h1:qMd81Ts1T2OTKmB4acZcyKaMtRnY5Y44NuXGX2GFJ1w= -github.com/codegangsta/inject v0.0.0-20150114235600-33e0aa1cb7c0 h1:sDMmm+q/3+BukdIpxwO365v/Rbspp2Nt5XntgQRXq8Q= -github.com/containerd/aufs v0.0.0-20200908144142-dab0cbea06f4/go.mod h1:nukgQABAEopAHvB6j7cnP5zJ+/3aVcE7hCYqvIwAHyE= -github.com/containerd/aufs v0.0.0-20201003224125-76a6863f2989/go.mod h1:AkGGQs9NM2vtYHaUen+NljV0/baGCAPELGm2q9ZXpWU= -github.com/containerd/aufs v0.0.0-20210316121734-20793ff83c97/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/aufs v1.0.0/go.mod h1:kL5kd6KM5TzQjR79jljyi4olc1Vrx6XBlcyj3gNv2PU= -github.com/containerd/btrfs v0.0.0-20201111183144-404b9149801e/go.mod h1:jg2QkJcsabfHugurUvvPhS3E08Oxiuh5W/g1ybB4e0E= -github.com/containerd/btrfs v0.0.0-20210316141732-918d888fb676/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/btrfs v1.0.0/go.mod h1:zMcX3qkXTAi9GI50+0HOeuV8LU2ryCE/V2vG/ZBiTss= -github.com/containerd/cgroups v0.0.0-20190717030353-c4b9ac5c7601/go.mod h1:X9rLEHIqSf/wfK8NsPqxJmeZgW4pcfzdXITDrUSJ6uI= -github.com/containerd/cgroups v0.0.0-20190919134610-bf292b21730f/go.mod h1:OApqhQ4XNSNC13gXIwDjhOQxjWa/NxkwZXJ1EvqT0ko= -github.com/containerd/cgroups v0.0.0-20200531161412-0dbf7f05ba59/go.mod h1:pA0z1pT8KYB3TCXK/ocprsh7MAkoW8bZVzPdih9snmM= -github.com/containerd/cgroups v0.0.0-20200710171044-318312a37340/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20200824123100-0b889c03f102/go.mod h1:s5q4SojHctfxANBDvMeIaIovkq29IP48TKAxnhYRxvo= -github.com/containerd/cgroups v0.0.0-20210114181951-8a68de567b68/go.mod h1:ZJeTFisyysqgcCdecO57Dj79RfL0LNeGiFUqLYQRYLE= -github.com/containerd/cgroups v1.0.1/go.mod h1:0SJrPIenamHDcZhEcJMNBB85rHcUsw4f25ZfBiPYRkU= -github.com/containerd/cgroups v1.0.3/go.mod h1:/ofk34relqNjSGyqPrmEULrO4Sc8LJhvJmWbUCUKqj8= -github.com/containerd/cgroups v1.0.4/go.mod h1:nLNQtsF7Sl2HxNebu77i1R0oDlhiTG+kO4JTrUzo6IA= github.com/containerd/cgroups/v3 v3.0.3 h1:S5ByHZ/h9PMe5IOQoN7E+nMc2UcLEM/V48DGDJ9kip0= -github.com/containerd/console v0.0.0-20180822173158-c12b1e7919c1/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20181022165439-0650fd9eeb50/go.mod h1:Tj/on1eG8kiEhd0+fhSDzsPAFESxzBBvdyEgyryXffw= -github.com/containerd/console v0.0.0-20191206165004-02ecf6a7291e/go.mod h1:8Pf4gM6VEbTNRIT26AyyU7hxdQU3MvAvxVI0sc00XBE= -github.com/containerd/console v1.0.1/go.mod h1:XUsP6YE/mKtz6bxc+I8UiKKTP04qjQL4qcS3XoQ5xkw= -github.com/containerd/console v1.0.2/go.mod h1:ytZPjGgY2oeTkAONYafi2kSj0aYggsf8acV1PGKCbzQ= -github.com/containerd/console v1.0.3/go.mod h1:7LqA/THxQ86k76b8c/EMSiaJ3h1eZkMkXar0TQ1gf3U= -github.com/containerd/containerd v1.2.10/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0-beta.2.0.20190828155532-0293cbd26c69/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.0/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.1-0.20191213020239-082f7e3aed57/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.3.2/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.0-beta.2.0.20200729163537-40b22ef07410/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.1/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.3/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.4.9/go.mod h1:bC6axHOhabU15QhwfG7w5PipXdVtMXFTttgp+kVtyUA= -github.com/containerd/containerd v1.5.0-beta.1/go.mod h1:5HfvG1V2FsKesEGQ17k5/T7V960Tmcumvqn8Mc+pCYQ= -github.com/containerd/containerd v1.5.0-beta.3/go.mod h1:/wr9AVtEM7x9c+n0+stptlo/uBBoBORwEx6ardVcmKU= -github.com/containerd/containerd v1.5.0-beta.4/go.mod h1:GmdgZd2zA2GYIBZ0w09ZvgqEq8EfBp/m3lcVZIvPHhI= -github.com/containerd/containerd v1.5.0-rc.0/go.mod h1:V/IXoMqNGgBlabz3tHD2TWDoTJseu1FGOKuoA4nNb2s= -github.com/containerd/containerd v1.5.1/go.mod h1:0DOxVqwDy2iZvrZp2JUx/E+hS0UNTVn7dJnIOwtYR4g= -github.com/containerd/containerd v1.5.7/go.mod h1:gyvv6+ugqY25TiXxcZC3L5yOeYgEw0QMhscqVp1AR9c= -github.com/containerd/containerd v1.5.8/go.mod h1:YdFSv5bTFLpG2HIYmfqDpSYYTDX+mc5qtSuYx1YUb/s= -github.com/containerd/containerd v1.6.1/go.mod h1:1nJz5xCZPusx6jJU8Frfct988y0NpumIq9ODB0kLtoE= -github.com/containerd/containerd v1.6.8 h1:h4dOFDwzHmqFEP754PgfgTeVXFnLiRc6kiqC7tplDJs= -github.com/containerd/containerd v1.6.8/go.mod h1:By6p5KqPK0/7/CgO/A6t/Gz+CUYUu2zf1hUaaymVXB0= -github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= -github.com/containerd/continuity v0.0.0-20190426062206-aaeac12a7ffc/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20190815185530-f2a389ac0a02/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20191127005431-f65d91d395eb/go.mod h1:GL3xCUCBDV3CZiTSEKksMWbLE66hEyuu9qyDOOqM47Y= -github.com/containerd/continuity v0.0.0-20200710164510-efbc4488d8fe/go.mod h1:cECdGN1O8G9bgKTlLhuPJimka6Xb/Gg7vYzCTNVxhvo= -github.com/containerd/continuity v0.0.0-20201208142359-180525291bb7/go.mod h1:kR3BEg7bDFaEddKm54WSmrol1fKWDU1nKYkgrcgZT7Y= -github.com/containerd/continuity v0.0.0-20210208174643-50096c924a4e/go.mod h1:EXlVlkqNba9rJe3j7w3Xa924itAMLgZH4UD/Q4PExuQ= -github.com/containerd/continuity v0.1.0/go.mod h1:ICJu0PwR54nI0yPEnJ6jcS+J7CZAUXrLh8lPo2knzsM= -github.com/containerd/continuity v0.2.2/go.mod h1:pWygW9u7LtS1o4N/Tn0FoCFDIXZ7rxcMX7HX1Dmibvk= -github.com/containerd/continuity v0.3.0/go.mod h1:wJEAIwKOm/pBZuBd0JmeTvnLquTB1Ag8espWhkykbPM= -github.com/containerd/fifo v0.0.0-20180307165137-3d5202aec260/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20190226154929-a9fb20d87448/go.mod h1:ODA38xgv3Kuk8dQz2ZQXpnv/UZZUHUCL7pnLehbXgQI= -github.com/containerd/fifo v0.0.0-20200410184934-f15a3290365b/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20201026212402-0724c46b320c/go.mod h1:jPQ2IAeZRCYxpS/Cm1495vGFww6ecHmMk1YJH2Q5ln0= -github.com/containerd/fifo v0.0.0-20210316144830-115abcc95a1d/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/fifo v1.0.0/go.mod h1:ocF/ME1SX5b1AOlWi9r677YJmCPSwwWnQ9O123vzpE4= -github.com/containerd/go-cni v1.0.1/go.mod h1:+vUpYxKvAF72G9i1WoDOiPGRtQpqsNW/ZHtSlv++smU= -github.com/containerd/go-cni v1.0.2/go.mod h1:nrNABBHzu0ZwCug9Ije8hL2xBCYh/pjfMb1aZGrrohk= -github.com/containerd/go-cni v1.1.0/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.3/go.mod h1:Rflh2EJ/++BA2/vY5ao3K6WJRR/bZKsX123aPk+kUtA= -github.com/containerd/go-cni v1.1.6/go.mod h1:BWtoWl5ghVymxu6MBjg79W9NZrCRyHIdUtk4cauMe34= -github.com/containerd/go-runc v0.0.0-20180907222934-5a6d9f37cfa3/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20190911050354-e029b79d8cda/go.mod h1:IV7qH3hrUgRmyYrtgEeGWJfWbgcHL9CSRruz2Vqcph0= -github.com/containerd/go-runc v0.0.0-20200220073739-7016d3ce2328/go.mod h1:PpyHrqVs8FTi9vpyHwPwiNEGaACDxT/N/pLcvMSRA9g= -github.com/containerd/go-runc v0.0.0-20201020171139-16b287bc67d0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/go-runc v1.0.0/go.mod h1:cNU0ZbCgCQVZK4lgG3P+9tn9/PaJNmoDXPpoJhDR+Ok= -github.com/containerd/imgcrypt v1.0.1/go.mod h1:mdd8cEPW7TPgNG4FpuP3sGBiQ7Yi/zak9TYCG3juvb0= -github.com/containerd/imgcrypt v1.0.4-0.20210301171431-0ae5c75f59ba/go.mod h1:6TNsg0ctmizkrOgXRNQjAPFWpMYRWuiB6dSF4Pfa5SA= -github.com/containerd/imgcrypt v1.1.1-0.20210312161619-7ed62a527887/go.mod h1:5AZJNI6sLHJljKuI9IHnw1pWqo/F0nGDOuR9zgTs7ow= -github.com/containerd/imgcrypt v1.1.1/go.mod h1:xpLnwiQmEUJPvQoAapeb2SNCxz7Xr6PJrXQb0Dpc4ms= -github.com/containerd/imgcrypt v1.1.3/go.mod h1:/TPA1GIDXMzbj01yd8pIbQiLdQxed5ue1wb8bP7PQu4= -github.com/containerd/imgcrypt v1.1.4/go.mod h1:LorQnPtzL/T0IyCeftcsMEO7AqxUDbdO8j/tSUpgxvo= -github.com/containerd/nri v0.0.0-20201007170849-eb1350a75164/go.mod h1:+2wGSDGFYfE5+So4M5syatU0N0f0LbWpuqyMi4/BE8c= -github.com/containerd/nri v0.0.0-20210316161719-dbaa18c31c14/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/nri v0.1.0/go.mod h1:lmxnXF6oMkbqs39FiCt1s0R2HSMhcLel9vNL3m4AaeY= -github.com/containerd/stargz-snapshotter/estargz v0.4.1/go.mod h1:x7Q9dg9QYb4+ELgxmo4gBUeJB0tl5dqH1Sdz0nJU1QM= -github.com/containerd/ttrpc v0.0.0-20190828154514-0e0f228740de/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20190828172938-92c8520ef9f8/go.mod h1:PvCDdDGpgqzQIzDW1TphrGLssLDZp2GuS+X5DkEJB8o= -github.com/containerd/ttrpc v0.0.0-20191028202541-4f1b8fe65a5c/go.mod h1:LPm1u0xBw8r8NOKoOdNMeVHSawSsltak+Ihv+etqsE8= -github.com/containerd/ttrpc v1.0.1/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.0.2/go.mod h1:UAxOpgT9ziI0gJrmKvgcZivgxOp8iFPSk8httJEt98Y= -github.com/containerd/ttrpc v1.1.0/go.mod h1:XX4ZTnoOId4HklF4edwc4DcqskFZuvXB1Evzy5KFQpQ= -github.com/containerd/typeurl v0.0.0-20180627222232-a93fcdb778cd/go.mod h1:Cm3kwCdlkCfMSHURc+r6fwoGH6/F1hH3S4sg0rLFWPc= -github.com/containerd/typeurl v0.0.0-20190911142611-5eb25027c9fd/go.mod h1:GeKYzf2pQcqv7tJ0AoCuuhtnqhva5LNU3U+OyKxxJpk= -github.com/containerd/typeurl v1.0.1/go.mod h1:TB1hUtrpaiO88KEK56ijojHS1+NeF0izUACaJW2mdXg= -github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= -github.com/containerd/zfs v0.0.0-20200918131355-0a33824f23a2/go.mod h1:8IgZOBdv8fAgXddBT4dBXJPtxyRsejFIpXoklgxgEjw= -github.com/containerd/zfs v0.0.0-20210301145711-11e8f1707f62/go.mod h1:A9zfAbMlQwE+/is6hi0Xw8ktpL+6glmqZYtevJgaB8Y= -github.com/containerd/zfs v0.0.0-20210315114300-dde8f0fda960/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v0.0.0-20210324211415-d5c4544f0433/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containerd/zfs v1.0.0/go.mod h1:m+m51S1DvAP6r3FcmYCp54bQ34pyOwTieQDNRIRHsFY= -github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v0.8.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY= -github.com/containernetworking/cni v1.0.1/go.mod h1:AKuhXbN5EzmD4yTNtfSsX3tPcmtrBI6QcRV0NiNt15Y= -github.com/containernetworking/cni v1.1.1/go.mod h1:sDpYKmGVENF3s6uvMvGgldDWeG8dMxakj/u+i9ht9vw= -github.com/containernetworking/plugins v0.8.6/go.mod h1:qnw5mN19D8fIwkqW7oHHYDHVlzhJpcY6TQxn/fUyDDM= -github.com/containernetworking/plugins v0.9.1/go.mod h1:xP/idU2ldlzN6m4p5LmGiwRDjeJr6FLK6vuiUwoH7P8= -github.com/containernetworking/plugins v1.0.1/go.mod h1:QHCfGpaTwYTbbH+nZXKVTxNBDZcxSOplJT5ico8/FLE= -github.com/containernetworking/plugins v1.1.1/go.mod h1:Sr5TH/eBsGLXK/h71HeLfX19sZPp3ry5uHSkI4LPxV8= -github.com/containers/ocicrypt v1.0.1/go.mod h1:MeJDzk1RJHv89LjsH0Sp5KTY3ZYkjXO/C+bKAeWFIrc= -github.com/containers/ocicrypt v1.1.0/go.mod h1:b8AOe0YR67uU8OqfVNcznfFpAzu3rdgUV4GP9qXPfu4= -github.com/containers/ocicrypt v1.1.1/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.2/go.mod h1:Dm55fwWm1YZAjYRaJ94z2mfZikIyIN4B0oB3dj3jFxY= -github.com/containers/ocicrypt v1.1.3/go.mod h1:xpdkbVAuaH3WzbEabUd5yDsl9SwJA5pABH85425Es2g= -github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= -github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= -github.com/coreos/go-iptables v0.4.5/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.5.0/go.mod h1:/mVI274lEDI2ns62jHCDnCyBF9Iwsmekav8Dbxlm1MU= -github.com/coreos/go-iptables v0.6.0/go.mod h1:Qe8Bv2Xik5FyTXwgIbLAnv2sWSBmvWdFETJConOQ//Q= -github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= github.com/coreos/go-oidc v2.2.1+incompatible h1:mh48q/BqXqgjVHpy2ZY7WnWAbenxRjsz9N1i1YxjHAk= github.com/coreos/go-oidc v2.2.1+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc= -github.com/coreos/go-systemd v0.0.0-20161114122254-48702e0da86b/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f h1:JOrtw2xFKzlg+cbHpyrpLDmnN1HqhBfnX7WDiW7eG2c= -github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= -github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/pkg v0.0.0-20160727233714-3ac0863d7acf h1:CAKfRE2YtTUIjjh1bkBtyYFaUT/WmOqsJjgtihT0vMI= -github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= -github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw= github.com/creack/pty v1.1.18 h1:n56/Zwd5o6whRC5PMGretI4IdRLlmBXYNjScPaBgsbY= github.com/creack/pty v1.1.18/go.mod h1:MOBLtS5ELjhRRrroQr9kyvTxUAFNvYEK993ew/Vr4O4= github.com/crewjam/httperr v0.2.0 h1:b2BfXR8U3AlIHwNeFFvZ+BV1LFvKLlzMjzaTnZMybNo= github.com/crewjam/httperr v0.2.0/go.mod h1:Jlz+Sg/XqBQhyMjdDiC+GNNRzZTD7x39Gu3pglZ5oH4= github.com/cristalhq/hedgedhttp v0.9.1 h1:g68L9cf8uUyQKQJwciD0A1Vgbsz+QgCjuB1I8FAsCDs= github.com/cristalhq/hedgedhttp v0.9.1/go.mod h1:XkqWU6qVMutbhW68NnzjWrGtH8NUx1UfYqGYtHVKIsI= -github.com/cyphar/filepath-securejoin v0.2.2/go.mod h1:FpkQEhXnPnOthhzymB7CGsFk2G9VLXONKD9G7QGMM+4= -github.com/cyphar/filepath-securejoin v0.2.3/go.mod h1:aPGpWjXOXUn2NCNjFvBE6aRxGGx79pTxQpKOJNYHHl4= github.com/cznic/b v0.0.0-20180115125044-35e9bbe41f07 h1:UHFGPvSxX4C4YBApSPvmUfL8tTvWLj2ryqvT9K4Jcuk= github.com/cznic/fileutil v0.0.0-20180108211300-6a051e75936f h1:7uSNgsgcarNk4oiN/nNkO0J7KAjlsF5Yv5Gf/tFdHas= github.com/cznic/golex v0.0.0-20170803123110-4ab7c5e190e4 h1:CVAqftqbj+exlab+8KJQrE+kNIVlQfJt58j4GxCMF1s= @@ -722,10 +282,6 @@ github.com/cznic/ql v1.2.0 h1:lcKp95ZtdF0XkWhGnVIXGF8dVD2X+ClS08tglKtf+ak= github.com/cznic/sortutil v0.0.0-20150617083342-4c7342852e65 h1:hxuZop6tSoOi0sxFzoGGYdRqNrPubyaIf9KoBG9tPiE= github.com/cznic/strutil v0.0.0-20171016134553-529a34b1c186 h1:0rkFMAbn5KBKNpJyHQ6Prb95vIKanmAe62KxsrN+sqA= github.com/cznic/zappy v0.0.0-20160723133515-2533cb5b45cc h1:YKKpTb2BrXN2GYyGaygIdis1vXbE7SSAG9axGWIMClg= -github.com/d2g/dhcp4 v0.0.0-20170904100407-a1d1b6c41b1c/go.mod h1:Ct2BUK8SB0YC1SMSibvLzxjeJLnrYEVLULFNiHY9YfQ= -github.com/d2g/dhcp4client v1.0.0/go.mod h1:j0hNfjhrt2SxUOw55nL0ATM/z4Yt3t2Kd1mW34z5W5s= -github.com/d2g/dhcp4server v0.0.0-20181031114812-7d4a0a7f59a5/go.mod h1:Eo87+Kg/IX2hfWJfwxMzLyuSZyxSoAug2nGa1G2QAi8= -github.com/d2g/hardwareaddr v0.0.0-20190221164911-e7d9fbe030e4/go.mod h1:bMl4RjIciD2oAxI7DmWRx6gbeqrkoLqv3MV0vzNad+I= github.com/dave/astrid v0.0.0-20170323122508-8c2895878b14 h1:YI1gOOdmMk3xodBao7fehcvoZsEeOyy/cfhlpCSPgM4= github.com/dave/brenda v1.1.0 h1:Sl1LlwXnbw7xMhq3y2x11McFu43AjDcwkllxxgZ3EZw= github.com/dave/courtney v0.3.0 h1:8aR1os2ImdIQf3Zj4oro+lD/L4Srb5VwGefqZ/jzz7U= @@ -735,35 +291,11 @@ github.com/dave/patsy v0.0.0-20210517141501-957256f50cba h1:1o36L4EKbZzazMk8iGC4 github.com/dave/rebecca v0.9.1 h1:jxVfdOxRirbXL28vXMvUvJ1in3djwkVKXCq339qhBL0= github.com/dchest/uniuri v1.2.0 h1:koIcOUdrTIivZgSLhHQvKgqdWZq5d7KdMEWF1Ud6+5g= github.com/dchest/uniuri v1.2.0/go.mod h1:fSzm4SLHzNZvWLvWJew423PhAzkpNQYq+uNLq4kxhkY= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1 h1:YLtO71vCjJRCBcrPMtQ9nqBsqpA1m5sE92cU+pd5Mcc= -github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= -github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= -github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/denisenkom/go-mssqldb v0.12.0 h1:VtrkII767ttSPNRfFekePK3sctr+joXgO58stqQbtUA= -github.com/denverdino/aliyungo v0.0.0-20190125010748-a747050bb1ba/go.mod h1:dV8lFg6daOBZbT6/BDGIz6Y3WFGn8juu6G+CQ6LHtl0= github.com/devigned/tab v0.1.1 h1:3mD6Kb1mUOYeLpJvTVSDwSg5ZsfSxfvxGRTxRsJsITA= -github.com/dgraph-io/badger v1.6.0 h1:DshxFxZWXUcO0xX476VJC07Xsr6ZCBVRHKZ93Oh7Evo= -github.com/dgraph-io/badger/v2 v2.2007.4/go.mod h1:vSw/ax2qojzbN6eXHIx6KPKtCSHJN/Uz0X0VPruTIhk= -github.com/dgraph-io/ristretto v0.0.3-0.20200630154024-f66de99634de/go.mod h1:KPxhHT9ZxKefz+PCeOGsrHpl1qZ7i70dGTu2u+Ahh6E= -github.com/dgrijalva/jwt-go v0.0.0-20170104182250-a601269ab70c/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= -github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/dhui/dktest v0.3.0 h1:kwX5a7EkLcjo7VpsPQSYJcKGbXBXdjI9FGjuUj1jn6I= github.com/dimchansky/utfbom v1.1.1 h1:vV6w1AhK4VMnhBno/TPVCoK9U/LP0PkLCS9tbxHdi/U= -github.com/djherbis/atime v1.1.0/go.mod h1:28OF6Y8s3NQWwacXc5eZTsEsiMzp7LF8MbXE+XJPdBE= -github.com/dnaeon/go-vcr v1.0.1/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E= -github.com/docker/cli v0.0.0-20191017083524-a8ff7f821017/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= -github.com/docker/distribution v0.0.0-20190905152932-14b96e55d84c/go.mod h1:0+TTO4EOBfRPhZXAeF1Vu+W3hHZ8eLp8PgKVZlcvtFY= -github.com/docker/distribution v2.7.1-0.20190205005809-0d3efadf0154+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= -github.com/docker/docker-credential-helpers v0.6.3/go.mod h1:WRaJzqw3CTB9bk10avuGsjVBZsD05qeibJ1/TYlvc0Y= -github.com/docker/go-events v0.0.0-20170721190031-9461782956ad/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-events v0.0.0-20190806004212-e31b211e4f1c/go.mod h1:Uw6UezgYA44ePAFQYUehOuCzmy5zmg/+nl2ZfMWGkpA= -github.com/docker/go-metrics v0.0.0-20180209012529-399ea8c73916/go.mod h1:/u0gXw0Gay3ceNrsHubL3BtdOL2fHf93USgMTe0W5dI= -github.com/docker/go-metrics v0.0.1/go.mod h1:cG1hvH2utMXtqgqqYE9plW6lDxS3/5ayHzueweSI3Vw= -github.com/docker/libtrust v0.0.0-20150114040149-fa567046d9b1/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE= -github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815 h1:bWDMxwH3px2JBh6AyO7hdCn/PkvCZXii8TGj7sbtEbQ= github.com/drone/drone-runtime v1.1.0 h1:IsKbwiLY6+ViNBzX0F8PERJVZZcEJm9rgxEh3uZP5IE= github.com/drone/drone-runtime v1.1.0/go.mod h1:+osgwGADc/nyl40J0fdsf8Z09bgcBZXvXXnLOY48zYs= @@ -771,59 +303,34 @@ github.com/drone/drone-yaml v1.2.3 h1:SWzLmzr8ARhbtw1WsVDENa8WFY2Pi9l0FVMfafVUWz github.com/drone/drone-yaml v1.2.3/go.mod h1:QsqliFK8nG04AHFN9tTn9XJomRBQHD4wcejWW1uz/10= github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1 h1:E8hjIYiEyI+1S2XZSLpMkqT9V8+YMljFNBWrFpuVM3A= github.com/drone/funcmap v0.0.0-20211123105308-29742f68a7d1/go.mod h1:Hph0/pT6ZxbujnE1Z6/08p5I0XXuOsppqF6NQlGOK0E= -github.com/drone/funcmap v0.0.0-20220929084810-72602997d16f/go.mod h1:nDRkX7PHq+p39AD5/usv3KZMerxZTYU/9rfLS5IDspU= github.com/drone/signal v1.0.0 h1:NrnM2M/4yAuU/tXs6RP1a1ZfxnaHwYkd0kJurA1p6uI= github.com/eapache/go-resiliency v1.3.0 h1:RRL0nge+cWGlxXbUzJ7yMcq6w2XBEr19dCN6HECGaT0= github.com/eapache/go-resiliency v1.3.0/go.mod h1:5yPzW0MIvSe0JDsv0v+DvcjEv2FyD6iZYSs1ZI+iQho= github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6 h1:8yY/I9ndfrgrXUbOGObLHKBR4Fl3nZXwM2c7OYTT8hM= github.com/eapache/go-xerial-snappy v0.0.0-20230111030713-bf00bc1b83b6/go.mod h1:YvSRo5mw33fLEx1+DlK6L2VV43tJt5Eyel9n9XBcR+0= github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= -github.com/eknkc/amber v0.0.0-20171010120322-cdade1c07385 h1:clC1lXBpe2kTj2VHdaIu9ajZQe4kcEY9j0NsnDDBZ3o= +github.com/elastic/go-sysinfo v1.11.2 h1:mcm4OSYVMyws6+n2HIVMGkln5HOpo5Ie1ZmbbNn0jg4= github.com/elastic/go-sysinfo v1.11.2/go.mod h1:GKqR8bbMK/1ITnez9NIsIfXQr25aLhRJa7AfT8HpBFQ= +github.com/elastic/go-windows v1.0.1 h1:AlYZOldA+UJ0/2nBuqWdo90GFCgG9xuyw9SYzGUtJm0= github.com/elastic/go-windows v1.0.1/go.mod h1:FoVvqWSun28vaDQPbj2Elfc0JahhPB7WQEGa3c814Ss= -github.com/elazarl/goproxy v0.0.0-20180725130230-947c36da3153/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= -github.com/elazarl/goproxy v0.0.0-20230731152917-f99041a5c027/go.mod h1:Ro8st/ElPeALwNFlcTpWmkr6IoMFfkjXAvTHpevnDsM= -github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/emicklei/go-restful v2.9.5+incompatible/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= -github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= -github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= -github.com/evanphx/json-patch v4.9.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/evanphx/json-patch v4.11.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= -github.com/fasthttp-contrib/websocket v0.0.0-20160511215533-1f3b11f56072 h1:DddqAaWDpywytcG8w/qoQ5sAN8X12d3Z3koB0C3Rxsc= github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= -github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= -github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= -github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/flosch/pongo2/v4 v4.0.2 h1:gv+5Pe3vaSVmiJvh/BZa82b7/00YUGm0PIyVVLop0Hw= github.com/flosch/pongo2/v4 v4.0.2/go.mod h1:B5ObFANs/36VwxxlgKpdchIJHMvHB562PW+BWPhwZD8= github.com/fogleman/gg v1.3.0 h1:/7zJX8F6AaYQc57WQCyN9cAIz+4bCJGO9B+dyW29am8= github.com/form3tech-oss/jwt-go v3.2.2+incompatible h1:TcekIExNqud5crz4xD2pavyTgWiPvpYe4Xau31I0PRk= -github.com/form3tech-oss/jwt-go v3.2.3+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2 h1:cZqz+yOJ/R64LcKjNQOdARott/jP7BnUQ9Ah7KaZCvw= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= -github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= github.com/fsouza/fake-gcs-server v1.7.0 h1:Un0BXUXrRWYSmYyC1Rqm2e2WJfTPyDy/HGMz31emTi8= -github.com/fullsailor/pkcs7 v0.0.0-20190404230743-d7302db945fa/go.mod h1:KnogPXtdwXqoenmZCw6S+25EAm2MkxbG0deNDu4cbSA= github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= -github.com/garyburd/redigo v0.0.0-20150301180006-535138d7bcd7/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/gavv/httpexpect v2.0.0+incompatible h1:1X9kcRshkSKEjNJJxX9Y9mQ5BRfbxU5kORdjhlA1yX8= -github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ= -github.com/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= -github.com/gin-gonic/gin v1.8.1 h1:4+fr/el88TOO3ewCmQr8cx/CtZ/umlIRIs5M4NTNjf8= -github.com/gin-gonic/gin v1.8.1/go.mod h1:ji8BvRH1azfM+SYow9zQ6SZMvR8qOMZHmsCuWR9tTTk= github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= -github.com/go-check/check v0.0.0-20180628173108-788fd7840127 h1:0gkP6mzaMqkmpcJYCFOLkIBwI7xFExG03bbkOkCvUPI= -github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= -github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/chi/v5 v5.0.8 h1:lD+NLqFcAi1ovnVZpsnObHGW4xb4J8lNmoYVfECH1Y0= -github.com/go-chi/chi/v5 v5.0.8/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= -github.com/go-chi/chi/v5 v5.0.10/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-faster/city v1.0.1 h1:4WAxSZ3V2Ws4QRDrscLEDcibJY8uf41H6AhXDrNDcGw= github.com/go-faster/city v1.0.1/go.mod h1:jKcUJId49qdW3L1qKHH/3wPeUstCVpVSXTM6vO3VcTw= +github.com/go-faster/errors v0.6.1 h1:nNIPOBkprlKzkThvS/0YaX8Zs9KewLCOSFQS5BU06FI= github.com/go-faster/errors v0.6.1/go.mod h1:5MGV2/2T9yvlrbhe9pD9LO5Z/2zCSq2T8j+Jpi2LAyY= github.com/go-fonts/dejavu v0.1.0 h1:JSajPXURYqpr+Cu8U9bt8K+XcACIHWqWrvWCKyeFmVQ= github.com/go-fonts/latin-modern v0.2.0 h1:5/Tv1Ek/QCr20C6ZOz15vw3g7GELYL98KWr8Hgo+3vk= @@ -832,85 +339,28 @@ github.com/go-fonts/stix v0.1.0 h1:UlZlgrvvmT/58o573ot7NFw0vZasZ5I6bcIft/oMdgg= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-ini/ini v1.25.4 h1:Mujh4R/dH6YL8bxuISne3xX2+qcQ9p0IxKAP6ExWoUo= -github.com/go-jose/go-jose/v3 v3.0.1/go.mod h1:RNkWWRld676jZEYoV3+XK8L2ZnNSvIsxFMht0mSX+u8= github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= github.com/go-latex/latex v0.0.0-20210823091927-c0d11ff05a81 h1:6zl3BbBhdnMkpSj2YY30qV3gDcVBGtFgVsV3+/i+mKQ= -github.com/go-logr/logr v0.4.0/go.mod h1:z6/tIYblkpsD+a4lm/fGIIU9mZ+XfAiaFtq7xTgseGU= -github.com/go-logr/logr v1.2.1/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/stdr v1.2.0/go.mod h1:YkVgnZu1ZjjL7xTxrfm/LLZBfkhTqSR1ydtm6jTKKwI= -github.com/go-martini/martini v0.0.0-20170121215854-22fa46961aab h1:xveKWz2iaueeTaUgdetzel+U7exyigDYBryyVfV/rZk= -github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= -github.com/go-openapi/jsonpointer v0.19.2/go.mod h1:3akKfEdA7DF1sugOqz1dVQHBcuDBPKZGEoHC/NkiQRg= -github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= -github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= -github.com/go-openapi/jsonreference v0.19.2/go.mod h1:jMjeRr2HHw6nAVajTXJ4eiUwohSTlpa0o73RUL1owJc= -github.com/go-openapi/jsonreference v0.19.3/go.mod h1:rjx6GuL8TTa9VaixXglHmQmIL98+wF9xc8zWvFonSJ8= -github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg= -github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= -github.com/go-openapi/spec v0.19.3/go.mod h1:FpwSN1ksY1eteniUU7X0N/BgJ7a4WvBFVA8Lj9mJglo= -github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= -github.com/go-openapi/swag v0.19.2/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= -github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.22.8/go.mod h1:6QT22icPLEqAM/z/TChgb4WAveCHF92+2gF0CNjHpPI= github.com/go-pdf/fpdf v0.6.0 h1:MlgtGIfsdMEEQJr2le6b/HNr1ZlQwxyWr77r2aj2U/8= github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A= -github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU= -github.com/go-playground/locales v0.14.0/go.mod h1:sawfccIbzZTqEDETgFXqTho0QybSa7l++s0DH+LDiLs= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= -github.com/go-playground/universal-translator v0.18.0 h1:82dyy6p4OuJq4/CByFNOn/jYrnRPArHwAcmLoJZxyho= -github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl+lu/H90nyDXpg0fqeB/AQUGNTVA= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= -github.com/go-playground/validator/v10 v10.11.1 h1:prmOlTVv+YjZjmRmNSF3VmspqJIxJWXmqUsHwfTRRkQ= -github.com/go-playground/validator/v10 v10.11.1/go.mod h1:i+3WkQ1FvaUjjxh1kSvIA4dMGDBiPU55YFDl0WbKdWU= github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= -github.com/gobuffalo/attrs v0.0.0-20190224210810-a9411de4debd h1:hSkbZ9XSyjyBirMeqSqUrK+9HboWrweVlzRNqoBi2d4= -github.com/gobuffalo/depgen v0.1.0 h1:31atYa/UW9V5q8vMJ+W6wd64OaaTHUrCUXER358zLM4= -github.com/gobuffalo/envy v1.7.0 h1:GlXgaiBkmrYMHco6t4j7SacKO4XUjvh5pwXh0f4uxXU= -github.com/gobuffalo/flect v0.1.3 h1:3GQ53z7E3o00C/yy7Ko8VXqQXoJGLkrTQCLTF1EjoXU= -github.com/gobuffalo/genny v0.1.1 h1:iQ0D6SpNXIxu52WESsD+KoQ7af2e3nCfnSBoSF/hKe0= -github.com/gobuffalo/gitgen v0.0.0-20190315122116-cc086187d211 h1:mSVZ4vj4khv+oThUfS+SQU3UuFIZ5Zo6UNcvK8E8Mz8= -github.com/gobuffalo/gogen v0.1.1 h1:dLg+zb+uOyd/mKeQUYIbwbNmfRsr9hd/WtYWepmayhI= -github.com/gobuffalo/logger v0.0.0-20190315122211-86e12af44bc2 h1:8thhT+kUJMTMy3HlX4+y9Da+BNJck+p109tqqKp7WDs= -github.com/gobuffalo/mapi v1.0.2 h1:fq9WcL1BYrm36SzK6+aAnZ8hcp+SrmnDyAxhNx8dvJk= -github.com/gobuffalo/packd v0.1.0 h1:4sGKOD8yaYJ+dek1FDkwcxCHA40M4kfKgFHx8N2kwbU= -github.com/gobuffalo/packr/v2 v2.2.0 h1:Ir9W9XIm9j7bhhkKE9cokvtTl1vBm62A/fene/ZCj6A= -github.com/gobuffalo/syncx v0.0.0-20190224160051-33c29581e754 h1:tpom+2CJmpzAWj5/VEHync2rJGi+epHNIeRSWjzGA+4= github.com/gobwas/httphead v0.1.0 h1:exrUm0f4YX0L7EBwZHuCF4GDp8aJfVeBrlLQrs6NqWU= github.com/gobwas/pool v0.2.1 h1:xfeeEhW7pwmX8nuLVlqbzVc7udMDrwetjEv+TZIz1og= github.com/gobwas/ws v1.2.1 h1:F2aeBZrm2NDsc7vbovKrWSogd4wvfAxg0FQ89/iqOTk= -github.com/gobwas/ws v1.3.0/go.mod h1:hRKAFb8wOxFROYNsT1bqfWnhX+b5MFeJM9r2ZSwg/KY= github.com/goccy/go-yaml v1.11.0 h1:n7Z+zx8S9f9KgzG6KtQKf+kwqXZlLNR2F6018Dgau54= github.com/gocql/gocql v0.0.0-20190301043612-f6df8288f9b4 h1:vF83LI8tAakwEwvWZtrIEx7pOySacl2TOxx6eXk4ePo= -github.com/godbus/dbus v0.0.0-20151105175453-c7fdd8b5cd55/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20180201030542-885f9cc04c9c/go.mod h1:/YcGZj5zSblfDWMMoOzV4fas9FZnQYTkDnsGvmh2Grw= -github.com/godbus/dbus v0.0.0-20190422162347-ade71ed3457e/go.mod h1:bBOAhwG1umN6/6ZUMtDFBMQR8jRg9O75tm9K00oMsK4= -github.com/godbus/dbus/v5 v5.0.3/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= -github.com/godbus/dbus/v5 v5.0.6/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -github.com/gofiber/fiber/v2 v2.46.0 h1:wkkWotblsGVlLjXj2dpgKQAYHtXumsK/HyFugQM68Ns= -github.com/gofiber/fiber/v2 v2.46.0/go.mod h1:DNl0/c37WLe0g92U6lx1VMQuxGUQY5V7EIaVoEsUffc= -github.com/gofiber/fiber/v2 v2.49.1/go.mod h1:nPUeEBUeeYGgwbDm59Gp7vS8MDyScL6ezr/Np9A13WU= -github.com/gogo/googleapis v1.2.0/go.mod h1:Njal3psf3qN6dwBtQfUmBZh2ybovJ0tlu3o/AC7HYjU= -github.com/gogo/googleapis v1.4.0/go.mod h1:5YRNX2z1oM5gXdAkurHa942MDgEJyk02w4OecKY87+c= -github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/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/golang-jwt/jwt v3.2.1+incompatible h1:73Z+4BJcrTC+KczS6WvTPvRGOp1WmfEP4Q1lOd9Z/+c= -github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= -github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= -github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= -github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219 h1:utua3L2IbQJmauC5IXdEA547bcoU5dozgQAfc8Onsg4= github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386 h1:EcQR3gusLHN46TAD+G+EbaaqJArt5vHhNpXAa12PQf4= github.com/gomarkdown/markdown v0.0.0-20230922112808-5421fefb8386/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA= github.com/gomodule/redigo v1.8.9 h1:Sl3u+2BI/kk+VEatbj0scLdrFhjPmbxOc1myhDP41ws= github.com/gomodule/redigo v1.8.9/go.mod h1:7ArFNvsTjH8GMMzB4uy1snslv2BwmginuMs06a1uzZE= -github.com/google/go-containerregistry v0.5.1/go.mod h1:Ct15B4yir3PLOP5jsy0GNeYVaIZs/MK/Jz5any1wFW0= github.com/google/go-jsonnet v0.18.0 h1:/6pTy6g+Jh1a1I2UMoAODkqELFiVIdOxbNwv0DDzoOg= github.com/google/go-jsonnet v0.18.0/go.mod h1:C3fTzyVJDslXdiTqw/bTFk7vSGyCtH3MGRbDfvEwGd0= github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9 h1:OF1IPgv+F4NmqmJ98KTjdN97Vs1JxDPB3vbmYzV2dpk= @@ -919,27 +369,14 @@ github.com/google/go-replayers/httpreplay v1.1.1 h1:H91sIMlt1NZzN7R+/ASswyouLJfW github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= -github.com/google/subcommands v1.0.1 h1:/eqq+otEXm5vhfBrbREPCSVQbvofip6kIz+mX5TUH7k= -github.com/googleapis/gax-go/v2 v2.12.1/go.mod h1:61M8vcyyXR2kqKFxKrfA22jaA8JGF7Dc8App1U3H6jc= -github.com/googleapis/gnostic v0.4.1/go.mod h1:LRhVm6pbyptWbWbuZ38d1eyptfvIytN3ir6b65WBswg= -github.com/googleapis/gnostic v0.5.1/go.mod h1:6U4PtQXGIEt/Z3h5MAT7FNofLnw9vXk2cUuW7uA/OeU= -github.com/googleapis/gnostic v0.5.5/go.mod h1:7+EbHbldMins07ALC74bsA81Ovc97DwqyJO1AENw9kA= github.com/googleapis/go-type-adapters v1.0.0 h1:9XdMn+d/G57qq1s8dNc5IesGCXHf6V2HZ2JwRxfA2tA= -github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720 h1:zC34cGQu69FG7qzJ3WiKW244WfhDC3xxYMeNOX2gtUQ= github.com/googleapis/google-cloud-go-testing v0.0.0-20210719221736-1c9a4c676720/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g= github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/css v1.0.0 h1:BQqNyPTi50JCFMTw/b67hByjMVXZRwGha6wxVGkeihY= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= -github.com/gorilla/handlers v0.0.0-20150720190736-60c7bfde3e33/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= github.com/gorilla/handlers v1.5.1 h1:9lRY6j8DEeeBT10CvO9hGW0gmky0BprnvDI5vfhUHH4= github.com/gorilla/handlers v1.5.1/go.mod h1:t8XrUpc4KVXb7HGyJ4/cEnwQiaxrX/hz1Zv/4g96P1Q= -github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= -github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= -github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= -github.com/grafana/authlib v0.0.0-20240319083410-9d4a6e3861e5/go.mod h1:86rRD5P6u2JPWtNWTMOlqlU+YMv2fUvVz/DomA6L7w4= -github.com/grafana/dataplane/sdata v0.0.7 h1:CImITypIyS1jxijCR6xqKx71JnYAxcwpH9ChK0gH164= -github.com/grafana/dataplane/sdata v0.0.7/go.mod h1:Jvs5ddpGmn6vcxT7tCTWAZ1mgi4sbcdFt9utQx5uMAU= github.com/grafana/e2e v0.1.1-0.20221018202458-cffd2bb71c7b h1:Ha+kSIoTutf4ytlVw/SaEclDUloYx0+FXDKJWKhNbE4= github.com/grafana/e2e v0.1.1-0.20221018202458-cffd2bb71c7b/go.mod h1:3UsooRp7yW5/NJQBlXcTsAHOoykEhNUYXkQ3r6ehEEY= github.com/grafana/grafana-aws-sdk v0.28.0 h1:ShdA+msLPGJGWWS1SFUYnF+ch1G3gUOlAdGJi6h4sgU= @@ -960,10 +397,6 @@ github.com/grafana/grafana/pkg/promlib v0.0.3/go.mod h1:3El4NlsfALz8QQCbEGHGFvJU github.com/grafana/grafana/pkg/storage/unified/resource v0.0.0-20240620152449-c88de7f4d073/go.mod h1:zOInHv2y6bsgm9bIMsCVDaz1XylqIVX9r4amH4iuWPE= github.com/grafana/grafana/pkg/storage/unified/resource v0.0.0-20240620184539-d988f5c3b064/go.mod h1:zOInHv2y6bsgm9bIMsCVDaz1XylqIVX9r4amH4iuWPE= github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7 h1:pdN6V1QBWetyv/0+wjACpqVH+eVULgEjkurDLq3goeM= -github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= -github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.18.1/go.mod h1:YvJ2f6MplWDhfxiUC3KpyTy76kYUZA4W3pTv/wdKQ9Y= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645 h1:MJG/KsmcqMwFAkh8mTnAwhyKoB+sTAnY4CACC110tbU= github.com/grpc-ecosystem/grpc-opentracing v0.0.0-20180507213350-8e809c8a8645/go.mod h1:6iZfnjpejD4L/4DwD7NryNaJyCQdzwWwH2MWhCA90Kw= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= @@ -971,15 +404,7 @@ github.com/hamba/avro/v2 v2.17.2 h1:6PKpEWzJfNnvBgn7m2/8WYaDOUASxfDU+Jyb4ojDgFY= github.com/hamba/avro/v2 v2.17.2/go.mod h1:Q9YK+qxAhtVrNqOhwlZTATLgLA8qxG2vtvkhK8fJ7Jo= github.com/hanwen/go-fuse v1.0.0 h1:GxS9Zrn6c35/BnfiVsZVWmsG803xwE7eVRDvcf/BEVc= github.com/hanwen/go-fuse/v2 v2.1.0 h1:+32ffteETaLYClUj0a3aHjZ1hOPxxaNEHiZiujuDaek= -github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= -github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= -github.com/hashicorp/consul/sdk v0.15.0 h1:2qK9nDrr4tiJKRoxPGhm6B7xJjLVIQqkjiab2M4aKjU= github.com/hashicorp/consul/sdk v0.16.0 h1:SE9m0W6DEfgIVCJX7xU+iv/hUl4m/nxqMTnCdMxDpJ8= -github.com/hashicorp/errwrap v0.0.0-20141028054710-7554cd9344ce/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= -github.com/hashicorp/go-hclog v0.14.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-hclog v0.16.1 h1:IVQwpTGNRRIHafnTs2dQLIk4ENtneRIEEJWOVDqz99o= -github.com/hashicorp/go-hclog v0.16.1/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= -github.com/hashicorp/go-multierror v0.0.0-20161216184304-ed905158d874/go.mod h1:JMRHfdO9jKNzS/+BTlxCjKNQHg/jZAft8U7LloJvN7I= github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= @@ -987,30 +412,12 @@ github.com/hashicorp/mdns v1.0.4 h1:sY0CMhFmjIPDMlTB+HfymFHCaYLhgifZ0QhjaYKD/UQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hudl/fargo v1.4.0 h1:ZDDILMbB37UlAVLlWcJ2Iz1XuahZZTDZfdCKeclfq2s= -github.com/hydrogen18/memlistener v0.0.0-20200120041712-dcc25e7acd91 h1:KyZDvZ/GGn+r+Y3DKZ7UOQ/TP4xV6HNkrwiVMB1GnNY= -github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= -github.com/ianlancetaylor/demangle v0.0.0-20230524184225-eabc099b10ab h1:BA4a7pe6ZTd9F8kXETBoijjFJ/ntaa//1wiH9BZu4zU= github.com/ianlancetaylor/demangle v0.0.0-20240312041847-bd984b5ce465 h1:KwWnWVWCNtNq/ewIX7HIKnELmEx2nDP42yskD/pi7QE= -github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= -github.com/imdario/mergo v0.3.10/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= -github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= github.com/influxdata/influxdb v1.7.6 h1:8mQ7A/V+3noMGCt/P9pD09ISaiz9XvgCk303UYA3gcs= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= -github.com/intel/goresctrl v0.2.0/go.mod h1:+CZdzouYFn5EsxgqAQTEzMfwKwuc0fVdMrT9FCCAVRQ= -github.com/invopop/yaml v0.1.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= -github.com/invopop/yaml v0.2.0/go.mod h1:2XuRLgs/ouIrW3XNzuNj7J3Nvu/Dig5MXvbCEdiBN3Q= -github.com/iris-contrib/blackfriday v2.0.0+incompatible h1:o5sHQHHm0ToHUlAJSTjW9UWicjJSDDauOOQ2AHuIVp4= -github.com/iris-contrib/go.uuid v2.0.0+incompatible h1:XZubAYg61/JwnJNbZilGjf3b3pB80+OQg2qf6c8BfWE= -github.com/iris-contrib/go.uuid v2.0.0+incompatible/go.mod h1:iz2lgM/1UnEf1kP0L/+fafWORmlnuysV2EMP8MW+qe0= -github.com/iris-contrib/jade v1.1.3 h1:p7J/50I0cjo0wq/VWVCDFd8taPJbuFC+bq23SniRFX0= -github.com/iris-contrib/pongo2 v0.0.1 h1:zGP7pW51oi5eQZMIlGA3I+FHY9/HOQWDB+572yin0to= -github.com/iris-contrib/schema v0.0.1 h1:10g/WnoRR+U+XXHWKBHeNy/+tZmM2kcAVGLOsz+yaDA= github.com/iris-contrib/schema v0.0.6 h1:CPSBLyx2e91H2yJzPuhGuifVRnZBBJ3pCOMbOvPZaTw= github.com/iris-contrib/schema v0.0.6/go.mod h1:iYszG0IOsuIsfzjymw1kMzTL8YQcCWlm65f3wX8J5iA= -github.com/j-keck/arping v0.0.0-20160618110441-2cf9dc699c56/go.mod h1:ymszkNOg6tORTn+6F6j+Jc8TOr5osrynvN6ivFWZ2GA= -github.com/j-keck/arping v1.0.2/go.mod h1:aJbELhR92bSk7tp79AWM/ftfc90EfEi2bQJrbBFOsPw= github.com/jackc/chunkreader v1.0.0 h1:4s39bBR8ByfqH+DKm8rQA3E1LHZWB9XWcrz8fqaZbe0= github.com/jackc/chunkreader/v2 v2.0.1 h1:i+RDz65UE+mmpjTfyz0MoVTnzeYxroil2G82ki7MGG8= github.com/jackc/fake v0.0.0-20150926172116-812a484cc733 h1:vr3AYkKovP8uR8AvSGGUK1IDqRa5lAAvEkZG1LKaCRc= @@ -1019,7 +426,6 @@ github.com/jackc/pgio v1.0.0 h1:g12B9UwVnzGhueNavwioyEEpAmqMe1E/BN9ES+8ovkE= github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65 h1:DadwsjnMwFjfWc9y5Wi/+Zz7xoE5ALHsRQlOctkOiHc= github.com/jackc/pgproto3 v1.1.0 h1:FYYE4yRw+AgI8wXIinMlNjBbp/UitDJwfj5LqqewP1A= github.com/jackc/pgproto3/v2 v2.2.0 h1:r7JypeP2D3onoQTCxWdTpCtJ4D+qpKr0TxvoyMhZ5ns= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b h1:C8S2+VttkHFdOOCXJe+YGfa4vHYwlt4Zx+IVXQ97jYg= github.com/jackc/pgtype v1.10.0 h1:ILnBWrRMSXGczYvmkYD6PsYyVFUNLTnIUJHHDLmqk38= github.com/jackc/pgx v3.2.0+incompatible h1:0Vihzu20St42/UDsvZGdNE6jak7oi/UOeMzwMPHkgFY= github.com/jackc/pgx/v4 v4.15.0 h1:B7dTkXsdILD3MF987WGGCcg+tvLW6bZJdEcqVFeU//w= @@ -1028,19 +434,16 @@ github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1 h1:9Xm8CKtMZIX github.com/jackspirou/syscerts v0.0.0-20160531025014-b68f5469dff1/go.mod h1:zuHl3Hh+e9P6gmBPvcqR1HjkaWHC/csgyskg6IaFKFo= github.com/jaegertracing/jaeger v1.41.0 h1:vVNky8dP46M2RjGaZ7qRENqylW+tBFay3h57N16Ip7M= github.com/jaegertracing/jaeger v1.41.0/go.mod h1:SIkAT75iVmA9U+mESGYuMH6UQv6V9Qy4qxo0lwfCQAc= -github.com/jarcoal/httpmock v1.3.0 h1:2RJ8GP0IIaWwcC9Fp2BmVi8Kog3v2Hn7VXM3fTd+nuc= github.com/jarcoal/httpmock v1.3.1 h1:iUx3whfZWVf3jT01hQTO/Eo5sAYtB2/rqaUuOtpInww= github.com/jedib0t/go-pretty/v6 v6.2.4 h1:wdaj2KHD2W+mz8JgJ/Q6L/T5dB7kyqEFI16eLq7GEmk= github.com/jedib0t/go-pretty/v6 v6.2.4/go.mod h1:+nE9fyyHGil+PuISTCrp7avEdo6bqoMwqZnuiK2r2a0= github.com/jhump/gopoet v0.1.0 h1:gYjOPnzHd2nzB37xYQZxj4EIQNpBrBskRqQQ3q4ZgSg= github.com/jhump/goprotoc v0.5.0 h1:Y1UgUX+txUznfqcGdDef8ZOVlyQvnV0pKWZH08RmZuo= github.com/jmattheis/goverter v1.4.0 h1:SrboBYMpGkj1XSgFhWwqzdP024zIa1+58YzUm+0jcBE= -github.com/jmespath/go-jmespath v0.0.0-20160803190731-bd40a432e4c7/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k= -github.com/joefitzgerald/rainbow-reporter v0.1.0/go.mod h1:481CNgqmVHQZzdIbN52CupLJyoVwB10FQ/IQlF1pdL8= +github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901 h1:rp+c0RAYOWj8l6qbCUTSiRLG/iKnW3K3/QfPPuSsBt4= github.com/joeshaw/multierror v0.0.0-20140124173710-69b34d4ec901/go.mod h1:Z86h9688Y0wesXCyonoVr47MasHilkuLMqGhRZ4Hpak= github.com/joho/godotenv v1.4.0 h1:3l4+N6zfMWnkbPEXKng2o2/MR5mSwTrBih4ZEkkz1lg= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/jon-whit/go-grpc-prometheus v1.4.0 h1:/wmpGDJcLXuEjXryWhVYEGt9YBRhtLwFEN7T+Flr8sw= github.com/jon-whit/go-grpc-prometheus v1.4.0/go.mod h1:iTPm+Iuhh3IIqR0iGZ91JJEg5ax6YQEe1I0f6vtBuao= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= @@ -1050,36 +453,30 @@ github.com/juju/gnuflag v0.0.0-20171113085948-2ce1bb71843d h1:c93kUJDtVAXFEhsCh5 github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= -github.com/karrick/godirwalk v1.10.3 h1:lOpSw2vJP0y5eLBW906QwKsUK/fe/QDyoqM5rnnuPDY= github.com/kataras/blocks v0.0.7 h1:cF3RDY/vxnSRezc7vLFlQFTYXG/yAr1o7WImJuZbzC4= github.com/kataras/blocks v0.0.7/go.mod h1:UJIU97CluDo0f+zEjbnbkeMRlvYORtmc1304EeyXf4I= github.com/kataras/golog v0.1.9 h1:vLvSDpP7kihFGKFAvBSofYo7qZNULYSHOH2D7rPTKJk= github.com/kataras/golog v0.1.9/go.mod h1:jlpk/bOaYCyqDqH18pgDHdaJab72yBE6i0O3s30hpWY= github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9 h1:Vx8kDVhO2qepK8w44lBtp+RzN3ld743i+LYPzODJSpQ= github.com/kataras/iris/v12 v12.2.6-0.20230908161203-24ba4e8933b9/go.mod h1:ldkoR3iXABBeqlTibQ3MYaviA1oSlPvim6f55biwBh4= -github.com/kataras/jwt v0.1.10/go.mod h1:xkimAtDhU/aGlQqjwvgtg+VyuPwMiyZHaY8LJRh0mYo= -github.com/kataras/neffos v0.0.22/go.mod h1:IIJZcUDvwBxJGlDj942dqQgyznVKYDti91f8Ez+RRxE= github.com/kataras/pio v0.0.12 h1:o52SfVYauS3J5X08fNjlGS5arXHjW/ItLkyLcKjoH6w= github.com/kataras/pio v0.0.12/go.mod h1:ODK/8XBhhQ5WqrAhKy+9lTPS7sBf6O3KcLhc9klfRcY= github.com/kataras/sitemap v0.0.6 h1:w71CRMMKYMJh6LR2wTgnk5hSgjVNB9KL60n5e2KHvLY= github.com/kataras/sitemap v0.0.6/go.mod h1:dW4dOCNs896OR1HmG+dMLdT7JjDk7mYBzoIRwuj5jA4= github.com/kataras/tunnel v0.0.4 h1:sCAqWuJV7nPzGrlb0os3j49lk2JhILT0rID38NHNLpA= github.com/kataras/tunnel v0.0.4/go.mod h1:9FkU4LaeifdMWqZu7o20ojmW4B7hdhv2CMLwfnHGpYw= +github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs= github.com/kelseyhightower/envconfig v1.4.0 h1:Im6hONhd3pLkfDFsbRgu68RDNkGF1r3dvMUtDTo2cv8= +github.com/kevinmbeaulieu/eq-go v1.0.0 h1:AQgYHURDOmnVJ62jnEk0W/7yFKEn+Lv8RHN6t7mB0Zo= github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= -github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= github.com/kisielk/errcheck v1.5.0 h1:e8esj/e4R+SAOwFwN+n3zr0nYeCyeweozKfO23MvHzY= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kisielk/sqlstruct v0.0.0-20201105191214-5f3e10d3ab46 h1:veS9QfglfvqAw2e+eeNT/SbGySq8ajECXJ9e4fPoLhY= -github.com/klauspost/compress v1.11.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/compress v1.11.13/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs= -github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY= github.com/knadh/koanf v1.5.0 h1:q2TSd/3Pyc/5yP9ldIrSdIz26MCcyNQzW0pEAugLPNs= github.com/knadh/koanf v1.5.0/go.mod h1:Hgyjp4y8v44hpZtPzs7JZfRAW5AhN7KfZcwv1RYggDs= github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= -github.com/kr/pty v1.1.5/go.mod h1:9r2w37qlBe7rQ6e1fg1S/9xpWHSnaqNdHD3WcMdbPDA= github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI= github.com/kshvakov/clickhouse v1.3.5 h1:PDTYk9VYgbjPAWry3AoDREeMgOVUFij6bh6IjlloHL0= github.com/labstack/echo/v4 v4.11.4 h1:vDZmA+qNeh1pd/cCkEicDMrjtrnMGQ1QFI9gWN1zGq8= @@ -1089,53 +486,23 @@ github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1 github.com/ledongthuc/pdf v0.0.0-20220302134840-0c2507a12d80 h1:6Yzfa6GP0rIo/kULo2bwGEkFvCePZ3qHDDTC3/J9Swo= github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= -github.com/lestrrat-go/backoff/v2 v2.0.8 h1:oNb5E5isby2kiro9AgdHLv5N5tint1AnDVVf2E2un5A= -github.com/lestrrat-go/backoff/v2 v2.0.8/go.mod h1:rHP/q/r9aT27n24JQLa7JhSQZCKBBOiM/uP402WwN8Y= -github.com/lestrrat-go/blackmagic v1.0.0 h1:XzdxDbuQTz0RZZEmdU7cnQxUtFUzgCSPq8RCz4BxIi4= -github.com/lestrrat-go/blackmagic v1.0.0/go.mod h1:TNgH//0vYSs8VXDCfkZLgIrVTTXQELZffUV0tz3MtdQ= -github.com/lestrrat-go/httpcc v1.0.1 h1:ydWCStUeJLkpYyjLDHihupbn2tYmZ7m22BGkcvZZrIE= -github.com/lestrrat-go/httpcc v1.0.1/go.mod h1:qiltp3Mt56+55GPVCbTdM9MlqhvzyuL6W/NMDA8vA5E= -github.com/lestrrat-go/iter v1.0.1 h1:q8faalr2dY6o8bV45uwrxq12bRa1ezKrB6oM9FUgN4A= -github.com/lestrrat-go/iter v1.0.1/go.mod h1:zIdgO1mRKhn8l9vrZJZz9TUMMFbQbLeTsbqPDrJ/OJc= -github.com/lestrrat-go/jwx v1.2.25 h1:tAx93jN2SdPvFn08fHNAhqFJazn5mBBOB8Zli0g0otA= -github.com/lestrrat-go/jwx v1.2.25/go.mod h1:zoNuZymNl5lgdcu6P7K6ie2QRll5HVfF4xwxBBK1NxY= -github.com/lestrrat-go/option v1.0.0 h1:WqAWL8kh8VcSoD6xjSH34/1m8yxluXQbDeKNfvFeEO4= -github.com/lestrrat-go/option v1.0.0/go.mod h1:5ZHFbivi4xwXxhxY9XHDe2FHo6/Z7WWmtT7T5nBBp3I= +github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06 h1:JLvn7D+wXjH9g4Jsjo+VqmzTUpl/LX7vfr6VOfSWTdM= github.com/libsql/sqlite-antlr4-parser v0.0.0-20240327125255-dbf53b6cbf06/go.mod h1:FUkZ5OHjlGPjnM2UyGJz9TypXQFgYqw6AFNO1UiROTM= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743 h1:143Bb8f8DuGWck/xpNUOckBVYfFbBTnLevfRZ1aVVqo= github.com/lightstep/lightstep-tracer-go v0.18.1 h1:vi1F1IQ8N7hNWytK9DpJsUfQhGuNSc19z330K6vl4zk= -github.com/linuxkit/virtsock v0.0.0-20201010232012-f8cee7dfc7a3/go.mod h1:3r6x7q95whyfWQpmGZTu3gk3v2YkMi05HEzl7Tf7YEo= +github.com/logrusorgru/aurora/v3 v3.0.0 h1:R6zcoZZbvVcGMvDCKo45A9U/lzYyzl5NfYIvznmDfE4= github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxAlxggSjiwMnCUc= github.com/lyft/protoc-gen-star v0.6.1 h1:erE0rdztuaDq3bpGifD95wfoPrSZc95nGA6tbiNYh6M= github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o= github.com/lyft/protoc-gen-validate v0.0.13 h1:KNt/RhmQTOLr7Aj8PsJ7mTronaFyx80mRTT9qF261dA= -github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= -github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= github.com/mailgun/raymond/v2 v2.0.48 h1:5dmlB680ZkFG2RN/0lvTAghrSxIESeu9/2aeDqACtjw= github.com/mailgun/raymond/v2 v2.0.48/go.mod h1:lsgvL50kgt1ylcFJYZiULi5fjPBkkhNfj4KA0W54Z18= -github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= -github.com/mailru/easyjson v0.7.0/go.mod h1:KAzv3t3aY1NaHWoQz1+4F1ccyAH66Jk7yos7ldAVICs= -github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= -github.com/markbates/oncer v0.0.0-20181203154359-bf2de49a0be2 h1:JgVTCPf0uBVcUSWpyXmGpgOc62nK5HWUBKAGc3Qqa5k= -github.com/markbates/safe v1.0.1 h1:yjZkbvRM6IzKj9tlu/zMJLS0n/V351OZWRnF3QfaUxI= -github.com/marstr/guid v1.1.0/go.mod h1:74gB1z2wpxxInTG6yaqA7KrtM0NZ+RbrcqDvYHefzho= -github.com/matryer/moq v0.3.1 h1:kLDiBJoGcusWS2BixGyTkF224aSCD8nLY24tj/NcTCs= -github.com/matryer/moq v0.3.1/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s= +github.com/matryer/moq v0.3.3 h1:pScMH9VyrdT4S93yiLpVyU8rCDqGQr24uOyBxmktG5Q= github.com/matryer/moq v0.3.3/go.mod h1:RJ75ZZZD71hejp39j4crZLsEDszGk6iH4v4YsWFKH4s= -github.com/matryer/try v0.0.0-20161228173917-9ac251b645a2/go.mod h1:0KeJpeMD6o+O4hW7qJOT7vyQPKrWmj26uf5wMc/IiIs= -github.com/mattn/go-shellwords v1.0.3/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.6/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o= -github.com/mattn/go-shellwords v1.0.12/go.mod h1:EZzvwXDESEeg03EKmM+RmDnNOPKG4lLtQsUlTZDWQ8Y= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/maxatome/go-testdeep v1.12.0 h1:Ql7Go8Tg0C1D/uMMX59LAoYK7LffeJQ6X2T04nTH68g= -github.com/maxbrunsfeld/counterfeiter/v6 v6.2.2/go.mod h1:eD9eIE7cdwcMi9rYluz88Jz2VyhSmden33/aXg4oVIY= -github.com/mediocregopher/radix/v3 v3.8.1/go.mod h1:8FL3F6UQRXHXIBSPUs5h0RybMF8i4n7wVopoX3x7Bv8= github.com/microcosm-cc/bluemonday v1.0.25 h1:4NEwSfiJ+Wva0VxN5B8OwMicaJvD8r9tlJWm9rtloEg= github.com/microcosm-cc/bluemonday v1.0.25/go.mod h1:ZIOjCQp1OrzBBPIJmfX4qDYFuhU02nx4bn030ixfHLE= -github.com/miekg/pkcs11 v1.0.3/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= -github.com/miekg/pkcs11 v1.1.1/go.mod h1:XsNlhZGX73bx86s2hdc/FuaLm2CPZJemRLMA+WTFxgs= github.com/minio/highwayhash v1.0.2 h1:Aak5U0nElisjDCfPSG79Tgzkn2gl66NxOMspRrKnA/g= github.com/minio/md5-simd v1.1.2 h1:Gdi1DZK69+ZVMoNHRXJyNcxrMA4dSxoYHZSQbirFg34= github.com/minio/md5-simd v1.1.2/go.mod h1:MzdKDxYpY2BT9XQFocsiZf/NKVtR7nkE4RoEpN+20RM= @@ -1143,63 +510,28 @@ github.com/minio/minio-go/v7 v7.0.52 h1:8XhG36F6oKQUDDSuz6dY3rioMzovKjW40W6ANuN0 github.com/minio/minio-go/v7 v7.0.52/go.mod h1:IbbodHyjUAguneyucUaahv+VMNs/EOTV9du7A7/Z3HU= github.com/minio/sha256-simd v1.0.0 h1:v1ta+49hkWZyvaKwrQB8elexRqm6Y0aMLjCNsrYxo6g= github.com/minio/sha256-simd v1.0.0/go.mod h1:OuYzVNI5vcoYIAmbIvHPl3N3jUzVedXbKy5RFepssQM= -github.com/mistifyio/go-zfs v2.1.2-0.20190413222219-f784269be439+incompatible/go.mod h1:8AuVvqP/mXw1px98n46wfvcGfQ4ci2FwoAjKYxuo3Z4= github.com/mitchellh/cli v1.1.5 h1:OxRIeJXpAMztws/XHlN2vu6imG5Dpq+j61AzAX5fLng= github.com/mitchellh/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= -github.com/mitchellh/osext v0.0.0-20151018003038-5e2d6d41470f/go.mod h1:OkQIRizQZAeMln+1tSwduZz7+Af5oFlKirV/MSYes2A= -github.com/mithrandie/readline-csvq v1.2.1 h1:4cfeYeVSrqKEWi/1t7CjyhFD2yS6fm+l+oe+WyoSNlI= -github.com/mithrandie/readline-csvq v1.2.1/go.mod h1:ydD9Eyp3/wn8KPSNbKmMZe4RQQauCuxi26yEo4N40dk= github.com/mithrandie/readline-csvq v1.3.0 h1:VTJEOGouJ8j27jJCD4kBBbNTxM0OdBvE1aY1tMhlqE8= github.com/mithrandie/readline-csvq v1.3.0/go.mod h1:FKyYqDgf/G4SNov7SMFXRWO6LQLXIOeTog/NB97FZl0= -github.com/moby/locker v1.0.1/go.mod h1:S7SDdo5zpBK84bzzVlKr2V0hz+7x9hWbYC/kq7oQppc= -github.com/moby/sys/mountinfo v0.4.0/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.4.1/go.mod h1:rEr8tzG/lsIZHBtN/JjGG+LMYx9eXgW2JI+6q0qou+A= -github.com/moby/sys/mountinfo v0.5.0/go.mod h1:3bMD3Rg+zkqx8MRYPi7Pyb0Ie97QEBmdxbhnCLlSvSU= -github.com/moby/sys/signal v0.6.0/go.mod h1:GQ6ObYZfqacOwTtlXvcmh9A26dVRul/hbOZn88Kg8Tg= -github.com/moby/sys/symlink v0.1.0/go.mod h1:GGDODQmbFOjFsXvfLVn3+ZRxkch54RkSiGqsZeMYowQ= -github.com/moby/sys/symlink v0.2.0/go.mod h1:7uZVF2dqJjG/NsClqul95CqKOBRQyYSNnJ6BMgR/gFs= github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5 h1:8Q0qkMVC/MmWkpIdlvZgcv2o2jrlF6zqVOh7W5YHdMA= github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY/JU= github.com/mostynb/go-grpc-compression v1.1.17 h1:N9t6taOJN3mNTTi0wDf4e3lp/G/ON1TP67Pn0vTUA9I= github.com/mostynb/go-grpc-compression v1.1.17/go.mod h1:FUSBr0QjKqQgoDG/e0yiqlR6aqyXC39+g/hFLDfSsEY= -github.com/mrunalp/fileutils v0.5.0/go.mod h1:M1WthSahJixYnrXQl/DFQuteStB1weuxD2QJNHXfbSQ= github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8 h1:P48LjvUQpTReR3TQRbxSeSBsMXzfK0uol7eRcr7VBYQ= github.com/natessilva/dag v0.0.0-20180124060714-7194b8dcc5c4 h1:dnMxwus89s86tI8rcGVp2HwZzlz7c5o92VOy7dSckBQ= github.com/nats-io/jwt v1.2.2 h1:w3GMTO969dFg+UOKTmmyuu7IGdusK+7Ytlt//OYH/uU= github.com/nats-io/jwt/v2 v2.0.3 h1:i/O6cmIsjpcQyWDYNcq2JyZ3/VTF8SJ4JWluI5OhpvI= -github.com/nats-io/jwt/v2 v2.5.0/go.mod h1:24BeQtRwxRV8ruvC4CojXlx/WQ/VjuwlYiH+vu/+ibI= github.com/nats-io/nats-server/v2 v2.5.0 h1:wsnVaaXH9VRSg+A2MVg5Q727/CqxnmPLGFQ3YZYKTQg= -github.com/nats-io/nats.go v1.12.1 h1:+0ndxwUPz3CmQ2vjbXdkC1fo3FdiOQDim4gl3Mge8Qo= -github.com/nats-io/nats.go v1.28.0/go.mod h1:XpbWUlOElGwTYbMR7imivs7jJj9GtK7ypv321Wp6pjc= github.com/nats-io/nats.go v1.31.0 h1:/WFBHEc/dOKBF6qf1TZhrdEfTmOZ5JzdJ+Y3m6Y/p7E= github.com/nats-io/nats.go v1.31.0/go.mod h1:di3Bm5MLsoB4Bx61CBTsxuarI36WbhAwOm8QrW39+i8= -github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= -github.com/nats-io/nkeys v0.4.4/go.mod h1:XUkxdLPTufzlihbamfzQ7mw/VGx6ObUs+0bN5sNvt64= github.com/nats-io/nkeys v0.4.6 h1:IzVe95ru2CT6ta874rt9saQRkWfe2nFj1NtvYSLqMzY= github.com/nats-io/nkeys v0.4.6/go.mod h1:4DxZNzenSVd1cYQoAa8948QY3QDjrHfcfVADymtkpts= github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= -github.com/ncw/swift v1.0.47/go.mod h1:23YIA4yWVnGwv2dQlN4bB7egfYX6YLn0Yo/S6zZO/ZM= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/nsf/jsondiff v0.0.0-20230430225905-43f6cf3098c1 h1:dOYG7LS/WK00RWZc8XGgcUTlTxpp3mKhdR2Q9z9HbXM= -github.com/oapi-codegen/testutil v1.0.0/go.mod h1:ttCaYbHvJtHuiyeBF0tPIX+4uhEPTeizXKx28okijLw= github.com/oklog/oklog v0.3.2 h1:wVfs8F+in6nTBMkA7CbRw+zZMIB7nNM825cM1wuzoTk= -github.com/onsi/ginkgo v0.0.0-20151202141238-7f8ab55aaf3b/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.10.3/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= -github.com/onsi/ginkgo v1.12.0/go.mod h1:oUhWkIvk5aDxtKvDDuw8gItl8pKl42LzjC9KZE0HfGg= -github.com/onsi/ginkgo v1.13.0/go.mod h1:+REjRxOmWfHCjfv9TTWB1jD1Frx4XydAD3zm1lskyM0= -github.com/onsi/ginkgo v1.14.0/go.mod h1:iSB4RoI2tjJc9BBv4NKIKWKya62Rps+oPG/Lv9klQyY= -github.com/onsi/gomega v0.0.0-20151007035656-2152b45fa28a/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= -github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= -github.com/onsi/gomega v1.9.0/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA= -github.com/onsi/gomega v1.10.3/go.mod h1:V9xEwhxec5O8UDM77eCW8vLymOMltsqPVYWrpDsH8xc= -github.com/onsi/gomega v1.15.0/go.mod h1:cIuvLEne0aoVhAgh/O6ac0Op8WWw9H6eYCriF+tEHG0= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.74.0 h1:0dve/IbuHfQOnlIBQQwpCxIeMp7uig9DQVuvisWPDRs= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/jaegerexporter v0.74.0/go.mod h1:bIeSj+SaZdP3CE9Xae+zurdQC6DXX0tPP6NAEVmgtt4= @@ -1225,31 +557,7 @@ github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusrec github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.74.0/go.mod h1:uiW3V9EX8A5DOoxqDLuSh++ewHr+owtonCSiqMcpy3w= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.74.0 h1:2uysjsaqkf9STFeJN/M6i/sSYEN5pZJ94Qd2/Hg1pKE= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.74.0/go.mod h1:qoGuayD7cAtshnKosIQHd6dobcn6/sqgUn0v/Cg2UB8= -github.com/opencontainers/go-digest v0.0.0-20170106003457-a6d0ee40d420/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v0.0.0-20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/go-digest v1.0.0-rc1.0.20180430190053-c9281466c8b2/go.mod h1:cMLVZDEM3+U2I4VmLI6N8jQYUd2OVphdqWwCJHrFt2s= -github.com/opencontainers/image-spec v1.0.0/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/image-spec v1.0.2-0.20211117181255-693428a734f5/go.mod h1:BtxoFyWECRxE4U/7sNtV5W15zMzWCbyJoFRP3s7yZA0= -github.com/opencontainers/runc v0.0.0-20190115041553-12f6a991201f/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v0.1.1/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc8.0.20190926000215-3e425f80a8c9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc9/go.mod h1:qT5XzbpPznkRYVz/mWwUaVBUv2rmF59PVA73FjuZG0U= -github.com/opencontainers/runc v1.0.0-rc93/go.mod h1:3NOsor4w32B2tC0Zbl8Knk4Wg84SM2ImC1fxBuqJ/H0= -github.com/opencontainers/runc v1.0.2/go.mod h1:aTaHFFwQXuA71CiyxOdFFIorAoemI04suvGRQFzWTD0= -github.com/opencontainers/runc v1.1.0/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runc v1.1.2/go.mod h1:Tj1hFw6eFWp/o33uxGf5yF2BX5yz2Z6iptFpuvbbKqc= -github.com/opencontainers/runtime-spec v0.1.2-0.20190507144316-5b71a03e2700/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.1/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.2-0.20190207185410-29686dbc5559/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= github.com/opencontainers/runtime-spec v1.0.2 h1:UfAcuLBJB9Coz72x1hgl8O5RVzTdNiaglX6v2DM6FI0= -github.com/opencontainers/runtime-spec v1.0.3-0.20200929063507-e6143ca7d51d/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-spec v1.0.3-0.20210326190908-1c3f411f0417/go.mod h1:jwyrGlmzljRJv/Fgzds9SsS/C5hL+LL3ko9hs6T5lQ0= -github.com/opencontainers/runtime-tools v0.0.0-20181011054405-1d69bd0f9c39/go.mod h1:r3f7wjNzSs2extwzU3Y+6pKfobzPh+kKFJ3ofN+3nfs= -github.com/opencontainers/selinux v1.6.0/go.mod h1:VVGKuOLlE7v4PJyT6h7mNWvq1rzqiriPsEqVhc+svHE= -github.com/opencontainers/selinux v1.8.0/go.mod h1:RScLhm78qiWa2gbVCcGkC7tCGdgk3ogry1nUQF8Evvo= -github.com/opencontainers/selinux v1.8.2/go.mod h1:MUIHuUEvKB1wtJjQdOyYRgOnLD2xAPP8dBsCoU0KuF8= -github.com/opencontainers/selinux v1.10.0/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= -github.com/opencontainers/selinux v1.10.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI= github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e h1:4cPxUYdgaGzZIT5/j0IfqOrrXmq6bG8AwvwisMXpdrg= github.com/opentracing-contrib/go-grpc v0.0.0-20210225150812-73cb765af46e/go.mod h1:DYR5Eij8rJl8h7gblRrOZ8g0kW1umSpKqYIBTgeDtLo= github.com/opentracing-contrib/go-observer v0.0.0-20170622124052-a52f23424492 h1:lM6RxxfUMrYL/f8bWEUqdXrANWtrL7Nndbm9iFN0DlU= @@ -1259,57 +567,29 @@ github.com/openzipkin/zipkin-go v0.4.1 h1:kNd/ST2yLLWhaWrkgchya40TJabe8Hioj9udfP github.com/openzipkin/zipkin-go v0.4.1/go.mod h1:qY0VqDSN1pOBN94dBc6w2GJlWLiovAyg7Qt6/I9HecM= github.com/orisano/pixelmatch v0.0.0-20220722002657-fb0b55479cde h1:x0TT0RDC7UhAVbbWWBzr41ElhJx5tXPWkIHA2HWPRuw= github.com/pact-foundation/pact-go v1.0.4 h1:OYkFijGHoZAYbOIb1LWXrwKQbMMRUv1oQ89blD2Mh2Q= +github.com/paulmach/orb v0.10.0 h1:guVYVqzxHE/CQ1KpfGO077TR0ATHSNjp4s6XGLn3W9s= github.com/paulmach/orb v0.10.0/go.mod h1:5mULz1xQfs3bmQm63QEJA6lNGujuRafwA5S/EnuLaLU= github.com/pbnjay/memory v0.0.0-20210728143218-7b4eea64cf58 h1:onHthvaw9LFnH4t2DcNVpwGmV9E1BkGknEliJkfwQj0= github.com/pborman/getopt v0.0.0-20170112200414-7148bc3a4c30 h1:BHT1/DKsYDGkUgQ2jmMaozVcdk+sVfz0+1ZJq4zkWgw= github.com/pborman/uuid v1.2.0 h1:J7Q5mO4ysT1dv8hyrUGHb9+ooztCXu1D8MY8DZYsu3g= -github.com/pelletier/go-toml v1.8.1/go.mod h1:T2/BmBdy8dvIRq1a/8aqjN41wvWlN4lrapLU/GW4pbc= -github.com/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3ve8= -github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= -github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= -github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= github.com/performancecopilot/speed v3.0.0+incompatible h1:2WnRzIquHa5QxaJKShDkLM+sc0JPuwhXzK8OYOyt3Vg= github.com/performancecopilot/speed/v4 v4.0.0 h1:VxEDCmdkfbQYDlcr/GC9YoN9PQ6p8ulk9xVsepYy9ZY= -github.com/perimeterx/marshmallow v1.1.4/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= -github.com/philhofer/fwd v1.1.2 h1:bnDivRJ1EWPjUIRXV5KfORO897HTbpFAQddBdE8t7Gw= -github.com/philhofer/fwd v1.1.2/go.mod h1:qkPdfjR2SIEbspLqpe1tO4n5yICnr2DY7mqEx2tUTP0= github.com/phpdave11/gofpdf v1.4.2 h1:KPKiIbfwbvC/wOncwhrpRdXVj2CZTCFlw4wnoyjtHfQ= github.com/phpdave11/gofpdi v1.0.13 h1:o61duiW8M9sMlkVXWlvP92sZJtGKENvW3VExs6dZukQ= github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= -github.com/pkg/errors v0.8.1-0.20171018195549-f15c970de5b7/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/profile v1.2.1 h1:F++O52m40owAmADcojzM+9gyjmMOY/T4oYJkgFDH8RE= -github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= -github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= -github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= github.com/pkg/sftp v1.13.6 h1:JFZT4XbOU7l77xGSpOdW+pwIMqP044IyjXX6FGyEKFo= github.com/pkg/sftp v1.13.6/go.mod h1:tz1ryNURKu77RL+GuCzmoJYxQczL3wLNNpPWagdg4Qk= github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= -github.com/pquerna/cachecontrol v0.0.0-20171018203845-0dec1b30a021/go.mod h1:prYjPmNq4d1NPVmpShWobRqXY3q7Vp+80DqgxxUrUIA= github.com/pquerna/cachecontrol v0.1.0 h1:yJMy84ti9h/+OEWa752kBTKv4XC30OtVVHYv/8cTqKc= github.com/pquerna/cachecontrol v0.1.0/go.mod h1:NrUG3Z7Rdu85UNR3vm7SOsl1nFIeSiQnrHV5K9mBcUI= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= -github.com/prometheus/client_golang v0.0.0-20180209125602-c332b6f63c06/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.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQP1xR9D75/vuwEF3g= -github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc= -github.com/prometheus/client_model v0.0.0-20171117100541-99fa1f4be8e5/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= -github.com/prometheus/common v0.0.0-20180110214958-89604d197083/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro= -github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= -github.com/prometheus/common v0.6.0/go.mod h1:eBmuwkDJBwy6iBfxCBob6t6dR6ENT/y+J+Zk0j9GMYc= github.com/prometheus/common/assets v0.2.0 h1:0P5OrzoHrYBOSM1OigWL3mY8ZvV2N4zIE/5AahrSrfM= -github.com/prometheus/procfs v0.0.0-20180125133057-cb4147076ac7/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= -github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.0-20190522114515-bc1a522cf7b1/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= -github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.0.5/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ= -github.com/prometheus/procfs v0.10.1/go.mod h1:nwNm2aOCAYw8uTR/9bWRREkZFxAUcWzPHWJq+XBB/FM= github.com/prometheus/statsd_exporter v0.22.7 h1:7Pji/i2GuhK6Lu7DHrtTkFmNBCudCPT1pX2CziuyQR0= github.com/prometheus/statsd_exporter v0.22.7/go.mod h1:N/TevpjkIh9ccs6nuzY3jQn9dFqnUakOjnEuMPJJJnI= -github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= @@ -1317,28 +597,16 @@ github.com/rogpeppe/go-charset v0.0.0-20180617210344-2471d30d28b4 h1:BN/Nyn2nWMo github.com/rs/xid v1.5.0 h1:mKX4bl4iPYJtEIxp6CYiUuLQ/8DYMoz0PUdtGgMFRVc= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.15.0 h1:uPRuwkWF4J6fGsJ2R0Gn2jB1EQiav9k3S6CSdygQJXY= -github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday v1.6.0/go.mod h1:ti0ldHuxg49ri4ksnFxlkCfN+hvslNlmVHqNRXXJNAY= github.com/ruudk/golang-pdf417 v0.0.0-20201230142125-a7e3863a1245 h1:K1Xf3bKttbF+koVGaX5xngRIZ5bVjbmPnaxE/dR08uY= github.com/ryanuber/columnize v2.1.2+incompatible h1:C89EOx/XBWwIXl8wm8OPJBd7kPF25UfsK2X7Ph/zCAk= -github.com/safchain/ethtool v0.0.0-20190326074333-42ed695e3de8/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/safchain/ethtool v0.0.0-20210803160452-9aa261dae9b1/go.mod h1:Z0q5wiBQGYcxhMZ6gUqHn6pYNLypFAvaL3UvgZLR0U4= -github.com/sagikazarmark/crypt v0.6.0 h1:REOEXCs/NFY/1jOCEouMuT4zEniE5YoXbvpC5X/TLF8= github.com/sagikazarmark/crypt v0.17.0 h1:ZA/7pXyjkHoK4bW4mIdnCLvL8hd+Nrbiw7Dqk7D4qUk= github.com/sagikazarmark/crypt v0.17.0/go.mod h1:SMtHTvdmsZMuY/bpZoqokSoChIrcJ/epOxZN58PbZDg= github.com/samuel/go-zookeeper v0.0.0-20190923202752-2cc03de413da h1:p3Vo3i64TCLY7gIfzeQaUJ+kppEO5WQG3cL8iE8tGHU= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= -github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94 h1:rmMl4fXJhKMNWl+K+r/fq4FbbKI+Ia2m9hYBLm2h4G4= -github.com/savsgio/dictpool v0.0.0-20221023140959-7bf2e61cea94/go.mod h1:90zrgN3D/WJsDd1iXHT96alCoN2KJo6/4x1DZC3wZs8= -github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee h1:8Iv5m6xEo1NR1AvpV+7XmhI4r39LGNzwUL4YpMuL5vk= -github.com/savsgio/gotils v0.0.0-20230208104028-c358bd845dee/go.mod h1:qwtSXrKuJh/zsFQ12yEE89xfCrGKK63Rr7ctU/uCo4g= github.com/schollz/closestmatch v2.1.0+incompatible h1:Uel2GXEpJqOWBrlyI+oY9LTiyyjYS17cCYRqP13/SHk= github.com/schollz/closestmatch v2.1.0+incompatible/go.mod h1:RtP1ddjLong6gTkbtmuhtR2uUrrJOpYzYRvbcPAid+g= -github.com/sclevine/agouti v3.0.0+incompatible/go.mod h1:b4WX9W9L1sfQKXeJf1mUTLZKJ48R1S7H23Ji7oFO5Bw= -github.com/sclevine/spec v1.2.0/go.mod h1:W4J29eT/Kzv7/b9IWLB055Z+qvVC9vt0Arko24q7p+U= -github.com/seccomp/libseccomp-golang v0.9.1/go.mod h1:GbW5+tmTXfcxTToHLXlScSlAvWlF4P2Ca7zGrPiEpWo= -github.com/seccomp/libseccomp-golang v0.9.2-0.20210429002308-3879420cc921/go.mod h1:JA8cRccbGaA1s33RQf7Y1+q9gHmZX1yB/z9WDN1C6fg= github.com/segmentio/fasthash v0.0.0-20180216231524-a72b379d632e h1:uO75wNGioszjmIzcY/tvdDYKRLVvzggtAmmJkn9j4GQ= github.com/segmentio/fasthash v0.0.0-20180216231524-a72b379d632e/go.mod h1:tm/wZFQ8e24NYaBGIlnO2WGCAi67re4HHuOm0sftE/M= github.com/segmentio/parquet-go v0.0.0-20230427215636-d483faba23a5 h1:7CWCjaHrXSUCHrRhIARMGDVKdB82tnPAQMmANeflKOw= @@ -1347,53 +615,20 @@ github.com/sercand/kuberesolver/v4 v4.0.0 h1:frL7laPDG/lFm5n98ODmWnn+cvPpzlkf3Lh github.com/sercand/kuberesolver/v4 v4.0.0/go.mod h1:F4RGyuRmMAjeXHKL+w4P7AwUnPceEAPAhxUgXZjKgvM= github.com/sercand/kuberesolver/v5 v5.1.1 h1:CYH+d67G0sGBj7q5wLK61yzqJJ8gLLC8aeprPTHb6yY= github.com/sercand/kuberesolver/v5 v5.1.1/go.mod h1:Fs1KbKhVRnB2aDWN12NjKCB+RgYMWZJ294T3BtmVCpQ= -github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shirou/gopsutil/v3 v3.23.2 h1:PAWSuiAszn7IhPMBtXsbSCafej7PqUOvY6YywlQUExU= -github.com/shirou/gopsutil/v3 v3.23.2/go.mod h1:gv0aQw33GLo3pG8SiWKiQrbDzbRY1K80RyZJ7V4Th1M= -github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ= -github.com/shoenig/test v0.6.6 h1:Oe8TPH9wAbv++YPNDKJWUnI8Q4PPWCx3UbOfH+FxiMU= github.com/shoenig/test v1.7.1 h1:UJcjSAI3aUKx52kfcfhblgyhZceouhvvs3OYdWgn+PY= github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= -github.com/sirupsen/logrus v1.0.4-0.20170822132746-89742aefa4b2/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/sirupsen/logrus v1.0.6/go.mod h1:pMByvHTf9Beacp5x1UXfOR9xyW/9antXMhjMPG0dEzc= -github.com/smartystreets/goconvey v0.0.0-20190330032615-68dc04aab96a/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= github.com/spaolacci/murmur3 v1.1.0 h1:7c1g84S4BPRrfL5Xrdp6fOJ206sU9y293DDHaoy0bLI= github.com/spaolacci/murmur3 v1.1.0/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= -github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= -github.com/spf13/afero v1.10.0 h1:EaGW2JJh15aKOejeuJ+wpFSHnbd7GE6Wvp3TsNhb6LY= -github.com/spf13/cobra v0.0.2-0.20171109065643-2da4a54c5cee/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= -github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE= -github.com/spf13/cobra v1.1.3/go.mod h1:pGADOWyqRD/YMrPZigI/zbliZ2wVD/23d+is3pSWzOo= -github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= -github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/pflag v1.0.1-0.20171106142849-4c012f6dcd95/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= -github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= -github.com/spf13/viper v1.7.0/go.mod h1:8WkrPz2fc9jxqZNCJI/76HCieCp4Q8HaLFoCha5qpdg= -github.com/spf13/viper v1.14.0 h1:Rg7d3Lo706X9tHsJMUjdiwMpHB7W8WnSVOssIY+JElU= -github.com/spf13/viper v1.14.0/go.mod h1:WT//axPky3FdvXHzGw33dNdXXXfFQqmEalje+egj8As= github.com/spkg/bom v0.0.0-20160624110644-59b7046e48ad h1:fiWzISvDn0Csy5H0iwgAuJGQTUpVfEMJJd4nRFXogbc= -github.com/stefanberger/go-pkcs11uri v0.0.0-20201008174630-78d3cae3a980/go.mod h1:AO3tvPzVZ/ayst6UlUKUv6rcPQInYe3IknH3jYhAKu8= -github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= -github.com/stretchr/objx v0.0.0-20180129172003-8a3f7159479f/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.5.1/go.mod h1:/iHQpkQwBD6DLUmQ4pE+s1TXdob1mORJ4/UFdrifcy0= -github.com/stretchr/testify v0.0.0-20180303142811-b89eecf5ca5d/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= -github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= -github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/substrait-io/substrait-go v0.4.2 h1:buDnjsb3qAqTaNbOR7VKmNgXf4lYQxWEcnSGUWBtmN8= -github.com/syndtr/gocapability v0.0.0-20170704070218-db04d3cc01c8/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20180916011248-d98352740cb2/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/syndtr/gocapability v0.0.0-20200815063812-42c35b437635/go.mod h1:hkRG7XYTFWNJGYcbNJQlaLq0fg1yr4J4t/NcTQtrfww= -github.com/tchap/go-patricia v2.2.6+incompatible/go.mod h1:bmLyhP68RS6kStMGxByiQ23RP/odRBOTVjwp2cDyi6I= github.com/tdewolff/minify/v2 v2.12.9 h1:dvn5MtmuQ/DFMwqf5j8QhEVpPX6fi3WGImhv8RUB4zA= github.com/tdewolff/minify/v2 v2.12.9/go.mod h1:qOqdlDfL+7v0/fyymB+OP497nIxJYSvX4MQWA8OoiXU= github.com/tdewolff/parse/v2 v2.6.8 h1:mhNZXYCx//xG7Yq2e/kVLNZw4YfYmeHbhx+Zc0OvFMA= github.com/tdewolff/parse/v2 v2.6.8/go.mod h1:XHDhaU6IBgsryfdnpzUXBlT6leW/l25yrFBTEb4eIyM= -github.com/tidwall/gjson v1.14.2 h1:6BBkirS0rAHjumnjHF6qgy5d2YAJ1TLIaFE2lzfOLqo= -github.com/tidwall/gjson v1.14.2/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/gjson v1.17.1 h1:wlYEnwqAHgzmhNUFfw7Xalt2JzQvsMx2Se4PcoFCT/U= github.com/tidwall/gjson v1.17.1/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= @@ -1402,45 +637,20 @@ github.com/tidwall/pretty v1.2.0 h1:RWIZEg2iJ8/g6fDDYzMpobmaoGh5OLl4AXtGUGPcqCs= github.com/tidwall/pretty v1.2.0/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= -github.com/tinylib/msgp v1.1.8/go.mod h1:qkpG+2ldGg4xRFmx+jfTvZPxfGFhi64BcnL9vkCm/Tw= -github.com/tklauser/go-sysconf v0.3.11 h1:89WgdJhk5SNwJfu+GKyYveZ4IaJ7xAkecBo+KdJV0CM= -github.com/tklauser/go-sysconf v0.3.11/go.mod h1:GqXfhXY3kiPa0nAXPDIQIWzJbMCB7AmcWpGR8lSZfqI= -github.com/tklauser/numcpus v0.6.0 h1:kebhY2Qt+3U6RNK7UqpYNA+tJ23IBEGKkB7JQBfDYms= -github.com/tklauser/numcpus v0.6.0/go.mod h1:FEZLMke0lhOUG6w2JadTzp0a+Nl8PF/GFkQ5UVIcaL4= -github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= -github.com/tmc/grpc-websocket-proxy v0.0.0-20201229170055-e5319fda7802/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/tursodatabase/libsql-client-go v0.0.0-20240411070317-a1138d155304 h1:Y6cw8yjWCEJDy5Bll7HjTinkgTQU55AXiKSEe29SpgA= github.com/tursodatabase/libsql-client-go v0.0.0-20240411070317-a1138d155304/go.mod h1:2Fu26tjM011BLeR5+jwTfs6DX/fNMEWV/3CBZvggrA4= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= -github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= github.com/uber-go/atomic v1.4.0 h1:yOuPqEq4ovnhEjpHmfFwsqBXDYbQeT6Nb0bwD6XnD5o= github.com/uber-go/atomic v1.4.0/go.mod h1:/Ct5t2lcmbJ4OSe/waGBoaVvVqtO0bmtfVNex1PFV8g= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -github.com/urfave/cli v0.0.0-20171014202726-7bc6a0acffa5/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA= -github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= -github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= -github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= -github.com/valyala/fasthttp v1.6.0 h1:uWF8lgKmeaIewWVPwi4GRq2P6+R46IgYZdxWtM+GtEY= -github.com/valyala/fasthttp v1.47.0 h1:y7moDoxYzMooFpT5aHgNgVOQDrS3qlkfiP9mDtGGK9c= -github.com/valyala/fasthttp v1.47.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= -github.com/valyala/fasthttp v1.49.0/go.mod h1:k2zXd82h/7UZc3VOdJ2WaUqt1uZ/XpXAfE9i+HBC3lA= github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= -github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= -github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= github.com/vburenin/ifacemaker v1.2.1 h1:3Vq8B/bfBgjWTkv+jDg4dVL1KHt3k1K4lO7XRxYA2sk= +github.com/vertica/vertica-sql-go v1.3.3 h1:fL+FKEAEy5ONmsvya2WH5T8bhkvY27y/Ik3ReR2T+Qw= github.com/vertica/vertica-sql-go v1.3.3/go.mod h1:jnn2GFuv+O2Jcjktb7zyc4Utlbu9YVqpHH/lx63+1M4= github.com/vinzenz/yaml v0.0.0-20170920082545-91409cdd725d h1:3wDi6J5APMqaHBVPuVd7RmHD2gRTfqbdcVSpCNoUWtk= github.com/vinzenz/yaml v0.0.0-20170920082545-91409cdd725d/go.mod h1:mb5taDqMnJiZNRQ3+02W2IFG+oEz1+dTuCXkp4jpkfo= -github.com/vishvananda/netlink v0.0.0-20181108222139-023a6dafdcdf/go.mod h1:+SR5DhBJrl6ZM7CoCKvpw5BKroDKQ+PJqOg65H/2ktk= -github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYppBueQtXaqoE= -github.com/vishvananda/netlink v1.1.1-0.20201029203352-d40f9887b852/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netlink v1.1.1-0.20210330154013-f5de75959ad5/go.mod h1:twkDnbuQxJYemMlGd4JFIcuhgX83tXhKS2B/PRMpOho= -github.com/vishvananda/netns v0.0.0-20180720170159-13995c7128cc/go.mod h1:ZjcWmFBXmLKZu9Nxj3WKYEafiSqer2rnvPr0en9UNpI= -github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU= -github.com/vishvananda/netns v0.0.0-20200728191858-db3c7e526aae/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= -github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0= github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU= github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc= github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g= @@ -1449,7 +659,6 @@ github.com/weaveworks/common v0.0.0-20230511094633-334485600903 h1:ph7R2CS/0o1gB github.com/weaveworks/common v0.0.0-20230511094633-334485600903/go.mod h1:rgbeLfJUtEr+G74cwFPR1k/4N0kDeaeSv/qhUNE4hm8= github.com/weaveworks/promrus v1.2.0 h1:jOLf6pe6/vss4qGHjXmGz4oDJQA+AOCqEL3FvvZGz7M= github.com/weaveworks/promrus v1.2.0/go.mod h1:SaE82+OJ91yqjrE1rsvBWVzNZKcHYFtMUyS1+Ogs/KA= -github.com/willf/bitset v1.1.11-0.20200630133818-d5bec3311243/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/willf/bitset v1.1.11 h1:N7Z7E9UvjW+sGsEl7k/SJrvY2reP1A07MrGuCjIOjRE= github.com/willf/bitset v1.1.11/go.mod h1:83CECat5yLh5zVOf4P1ErAgKA5UDvKtgyUABdr3+MjI= github.com/willf/bloom v2.0.3+incompatible h1:QDacWdqcAUI1MPOwIQZRy9kOR7yxfyEmxX8Wdm2/JPA= @@ -1464,39 +673,27 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f h1:J9EGpcZtP github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2zxlSyiKSe5eX1tZViRH5QA0qijqEDrYZiPEAiq3wU= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 h1:EzJWgHovont7NscjpAxXsDA8S8BMYve8Y5+7cuRE7R0= github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= -github.com/xeipuuv/gojsonschema v0.0.0-20180618132009-1d523034197f/go.mod h1:5yf86TLmAcydyeJq5YvxkGPE2fm/u4myDekKRoLuqhs= github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17UxZ74= github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= github.com/xhit/go-str2duration v1.2.0 h1:BcV5u025cITWxEQKGWr1URRzrcXtu7uk8+luz3Yuhwc= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf h1:ckwNHVo4bv2tqNkgx3W3HANh3ta1j6TR5qw08J1A7Tw= github.com/ydb-platform/ydb-go-genproto v0.0.0-20240126124512-dbb0e1720dbf/go.mod h1:Er+FePu1dNUieD+XTMDduGpQuCPssK5Q4BjF+IIXJ3I= +github.com/ydb-platform/ydb-go-sdk/v3 v3.55.1 h1:Ebo6J5AMXgJ3A438ECYotA0aK7ETqjQx9WoZvVxzKBE= github.com/ydb-platform/ydb-go-sdk/v3 v3.55.1/go.mod h1:udNPW8eupyH/EZocecFmaSNJacKKYjzQa7cVgX5U2nc= github.com/yosssi/ace v0.0.5 h1:tUkIP/BLdKqrlrPwcmH0shwEEhTRHoGnc1wFIWmaBUA= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= -github.com/yusufpapurcu/wmi v1.2.2 h1:KBNDSne4vP5mbSWnJbO+51IMOXJB67QiYCSBrubbPRg= -github.com/yusufpapurcu/wmi v1.2.2/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs= -github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA= -github.com/yvasiyarov/newrelic_platform_go v0.0.0-20140908184405-b21fdbd4370f/go.mod h1:GlGEuHIJweS1mbCqG+7vt2nvWLzLLnRHbXz5JKd/Qbg= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b h1:FosyBZYxY34Wul7O/MSKey3txpPYyCqVO5ZyceuQJEI= github.com/zclconf/go-cty-debug v0.0.0-20191215020915-b22d67c1ba0b/go.mod h1:ZRKQfBXbGkpdV6QMzT3rU1kSTAnfu1dO8dPKjYprgj8= github.com/zenazn/goji v1.0.1 h1:4lbD8Mx2h7IvloP7r2C0D6ltZP6Ufip8Hn0wmSK5LR8= github.com/zenazn/goji v1.0.1/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +github.com/ziutek/mymysql v1.5.4 h1:GB0qdRGsTwQSBVYuVShFBKaXSnSnYYC2d9knnE1LHFs= github.com/ziutek/mymysql v1.5.4/go.mod h1:LMSpPZ6DbqWFxNCHW77HeMg9I646SAhApZ/wKdgO/C0= gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b h1:7gd+rd8P3bqcn/96gOZa3F5dpJr/vEiDQYlNb/y2uNs= go.einride.tech/aip v0.66.0 h1:XfV+NQX6L7EOYK11yoHHFtndeaWh3KbD9/cN/6iWEt8= -go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= -go.etcd.io/bbolt v1.3.5/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ= -go.etcd.io/bbolt v1.3.6/go.mod h1:qXsaaIqmgQH0T+OPdb99Bf+PKfBBQVAdyD6TY9G8XM4= -go.etcd.io/etcd v0.5.0-alpha.5.0.20200910180754-dd1b699fc489/go.mod h1:yVHk9ub3CSBatqGNg7GRmsnfLWtoW60w4eDYfh7vHDg= -go.etcd.io/etcd/pkg/v3 v3.5.0/go.mod h1:UzJGatBQ1lXChBkQF0AuAtkRQMYnHubxAEYIrC3MSsE= -go.etcd.io/etcd/raft/v3 v3.5.0/go.mod h1:UFOHSIvO/nKwd4lhkwabrTD3cqW5yVyYYf/KlD00Szc= -go.etcd.io/etcd/server/v3 v3.5.0/go.mod h1:3Ah5ruV+M+7RZr0+Y/5mNLwC+eQlni+mQmOVdCRJoS4= -go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= -go.mozilla.org/pkcs7 v0.0.0-20200128120323-432b2356ecb1/go.mod h1:SNgMg+EgDFwmvSmLRTNKC5fegJjB7v23qTQ0XLGUNHk= go.opentelemetry.io/collector v0.74.0 h1:0s2DKWczGj/pLTsXGb1P+Je7dyuGx9Is4/Dri1+cS7g= go.opentelemetry.io/collector v0.74.0/go.mod h1:7NjZAvkhQ6E+NLN4EAH2hw3Nssi+F14t7mV7lMNXCto= go.opentelemetry.io/collector/component v0.74.0 h1:W32ILPgbA5LO+m9Se61hbbtiLM6FYusNM36K5/CCOi0= @@ -1509,268 +706,70 @@ go.opentelemetry.io/collector/exporter v0.74.0 h1:VZxDuVz9kJM/Yten3xA/abJwLJNkxL go.opentelemetry.io/collector/exporter v0.74.0/go.mod h1:kw5YoorpKqEpZZ/a5ODSoYFK1mszzcKBNORd32S8Z7c= go.opentelemetry.io/collector/exporter/otlpexporter v0.74.0 h1:YKvTeYcBrJwbcXNy65fJ/xytUSMurpYn/KkJD0x+DAY= go.opentelemetry.io/collector/exporter/otlpexporter v0.74.0/go.mod h1:cRbvsnpSxzySoTSnXbOGPQZu9KHlEyKkTeE21f9Q1p4= -go.opentelemetry.io/collector/featuregate v1.0.0 h1:5MGqe2v5zxaoo73BUOvUTunftX5J8RGrbFsC2Ha7N3g= go.opentelemetry.io/collector/featuregate v1.5.0 h1:uK8qnYQKz1TMkK+FDTFsywg/EybW/gbnOUaPNUkRznM= go.opentelemetry.io/collector/receiver v0.74.0 h1:jlgBFa0iByvn8VuX27UxtqiPiZE8ejmU5lb1nSptWD8= go.opentelemetry.io/collector/receiver v0.74.0/go.mod h1:SQkyATvoZCJefNkI2jnrR63SOdrmDLYCnQqXJ7ACqn0= go.opentelemetry.io/collector/receiver/otlpreceiver v0.74.0 h1:e/X/W0z2Jtpy3Yd3CXkmEm9vSpKq/P3pKUrEVMUFBRw= go.opentelemetry.io/collector/receiver/otlpreceiver v0.74.0/go.mod h1:9X9/RYFxJIaK0JLlRZ0PpmQSSlYpY+r4KsTOj2jWj14= -go.opentelemetry.io/collector/semconv v0.90.1 h1:2fkQZbefQBbIcNb9Rk1mRcWlFZgQOk7CpST1e1BK8eg= go.opentelemetry.io/collector/semconv v0.98.0 h1:zO4L4TmlxXoYu8UgPeYElGY19BW7wPjM+quL5CzoOoY= -go.opentelemetry.io/contrib v0.18.0 h1:uqBh0brileIvG6luvBjdxzoFL8lxDGuhxJWsvK3BveI= -go.opentelemetry.io/contrib v0.20.0/go.mod h1:G/EtFaa6qaN7+LxqfIAT3GiZa7Wv5DTBUzl5H4LY0Kc= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.20.0/go.mod h1:oVGt1LRbBOBq1A5BQLlUg9UaU/54aiHw8cgjV3aWZ/E= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.28.0/go.mod h1:vEhqr0m4eTc+DWxfsXoXue2GBgV2uUwVznkGIHW/e5w= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.42.0/go.mod h1:5z+/ZWJQKXa9YT34fQNx5K8Hd1EoIhvtUygUQPqEOgQ= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0/go.mod h1:tIKj3DbO8N9Y2xo52og3irLsPI4GW02DSMtrVgNMgxg= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.46.1/go.mod h1:GnOaBaFQ2we3b9AGWJpsBa7v1S5RlQzlC3O7dRMxZhM= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.20.0/go.mod h1:2AboqHi0CiIZU0qwhtUfCYD1GeUzvvIXWNkhDt7ZMG4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.44.0/go.mod h1:SeQhzAEccGVZVEy7aH87Nh0km+utSpo1pTv6eMMop48= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.48.0/go.mod h1:rdENBZMT2OE6Ne/KLwpiXudnAsbdrdBaqBvTN8M8BgA= go.opentelemetry.io/contrib/propagators/b3 v1.15.0 h1:bMaonPyFcAvZ4EVzkUNkfnUHP5Zi63CIDlA3dRsEg8Q= go.opentelemetry.io/contrib/propagators/b3 v1.15.0/go.mod h1:VjU0g2v6HSQ+NwfifambSLAeBgevjIcqmceaKWEzl0c= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.16.0/go.mod h1:StxwPndBVNZD2sZez0RQ0SP/129XGCd4aEmVGaw1/QM= -go.opentelemetry.io/otel v0.20.0/go.mod h1:Y3ugLH2oa81t5QO+Lty+zXf8zC9L26ax4Nzoxm/dooo= -go.opentelemetry.io/otel v1.3.0/go.mod h1:PWIKzi6JCp7sM0k9yZ43VX+T345uNbAkDKwHVjb2PTs= -go.opentelemetry.io/otel v1.18.0/go.mod h1:9lWqYO0Db579XzVuCKFNPDl4s73Voa+zEck3wHaAYQI= go.opentelemetry.io/otel/bridge/opencensus v0.37.0 h1:ieH3gw7b1eg90ARsFAlAsX5LKVZgnCYfaDwRrK6xLHU= go.opentelemetry.io/otel/bridge/opencensus v0.37.0/go.mod h1:ddiK+1PE68l/Xk04BGTh9Y6WIcxcLrmcVxVlS0w5WZ0= go.opentelemetry.io/otel/bridge/opentracing v1.10.0 h1:WzAVGovpC1s7KD5g4taU6BWYZP3QGSDVTlbRu9fIHw8= go.opentelemetry.io/otel/bridge/opentracing v1.10.0/go.mod h1:J7GLR/uxxqMAzZptsH0pjte3Ep4GacTCrbGBoDuHBqk= -go.opentelemetry.io/otel/exporters/otlp v0.20.0/go.mod h1:YIieizyaN77rtLJra0buKiNBOm9XQfkPEKBeuhoMwAM= -go.opentelemetry.io/otel/exporters/otlp/internal/retry v1.3.0/go.mod h1:VpP4/RMn8bv8gNo9uK7/IMY4mtWLELsS+JIP0inH0h4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.3.0/go.mod h1:hO1KLR7jcKaDDKDkvI9dP/FIhpmna5lkqPUQdEjFAM8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.3.0/go.mod h1:keUU7UfnwWTWpJ+FWnyqmogPa82nuU5VUANFq49hlMY= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.19.0/go.mod h1:0+KuTDyKL4gjKCF75pHOX4wuzYDUZYfAQdSu43o+Z2I= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.3.0/go.mod h1:QNX1aly8ehqqX1LEa6YniTU7VY9I6R3X/oPxhGdTceE= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.21.0 h1:digkEZCJWobwBqMwC0cwCq8/wkkRy/OowZg5OArWZrM= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.25.0 h1:Mbi5PKN7u322woPa85d7ebZ+SOvEoPvoiBu+ryHWgfA= go.opentelemetry.io/otel/exporters/prometheus v0.37.0 h1:NQc0epfL0xItsmGgSXgfbH2C1fq2VLXkZoDFsfRNHpc= go.opentelemetry.io/otel/exporters/prometheus v0.37.0/go.mod h1:hB8qWjsStK36t50/R0V2ULFb4u95X/Q6zupXLgvjTh8= -go.opentelemetry.io/otel/metric v0.20.0/go.mod h1:598I5tYlH1vzBjn+BTuhzTCSb/9debfNp6R3s7Pr1eU= -go.opentelemetry.io/otel/metric v1.18.0/go.mod h1:nNSpsVDjWGfb7chbRLUNW+PBNdcSTHD4Uu5pfFMOI0k= -go.opentelemetry.io/otel/oteltest v0.20.0/go.mod h1:L7bgKf9ZB7qCwT9Up7i9/pn0PWIa9FqQ2IQ8LoxiGnw= -go.opentelemetry.io/otel/sdk v0.20.0/go.mod h1:g/IcepuwNsoiX5Byy2nNV0ySUF1em498m7hBWC279Yc= -go.opentelemetry.io/otel/sdk v1.3.0/go.mod h1:rIo4suHNhQwBIPg9axF8V9CA72Wz2mKF1teNrup8yzs= -go.opentelemetry.io/otel/sdk v1.22.0/go.mod h1:iu7luyVGYovrRpe2fmj3CVKouQNdTOkxtLzPvPz1DOc= -go.opentelemetry.io/otel/sdk/export/metric v0.20.0/go.mod h1:h7RBNMsDJ5pmI1zExLi+bJK+Dr8NQCh0qGhm1KDnNlE= -go.opentelemetry.io/otel/sdk/metric v0.20.0/go.mod h1:knxiS8Xd4E/N+ZqKmUPf3gTTZ4/0TjTXukfxjzSTpHE= go.opentelemetry.io/otel/sdk/metric v0.39.0 h1:Kun8i1eYf48kHH83RucG93ffz0zGV1sh46FAScOTuDI= go.opentelemetry.io/otel/sdk/metric v0.39.0/go.mod h1:piDIRgjcK7u0HCL5pCA4e74qpK/jk3NiUoAHATVAmiI= -go.opentelemetry.io/otel/trace v0.20.0/go.mod h1:6GjCW8zgDjwGHGa6GkyeB8+/5vjT16gUEi0Nf1iBdgw= -go.opentelemetry.io/otel/trace v1.3.0/go.mod h1:c/VDhno8888bvQYmbYLqe41/Ldmr/KKunbvWM4/fEjk= -go.opentelemetry.io/otel/trace v1.18.0/go.mod h1:T2+SGJGuYZY3bjj5rgh/hN7KIrlpWC5nS8Mjvzckz+0= -go.opentelemetry.io/proto/otlp v0.11.0/go.mod h1:QpEjXPrNQzrFDZgoTo49dgHR9RYRSrg3NAKnUGl9YpQ= -go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8= -go.uber.org/goleak v1.2.0/go.mod h1:XJYK+MuIchqpmGmUSAzotztawfKvYLUIgg7guXrwVUo= -go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/mock v0.2.0 h1:TaP3xedm7JaAgScZO7tlvlKrqT0p7I6OsdGB5YNSMDU= -go.uber.org/mock v0.2.0/go.mod h1:J0y0rp9L3xiff1+ZBfKxlC1fz2+aO16tw0tsDOixfuM= -go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee h1:0mgffUl7nfd+FpvXMVz4IDEaUSmT1ysygQC7qYo7sG4= -go.uber.org/zap v1.19.0/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= -golang.org/x/crypto v0.0.0-20171113213409-9f005a07e0d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20181009213950-7c1a557ab941/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= -golang.org/x/crypto v0.0.0-20190611184440-5c40567a22f8/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190911031432-227b76d455e7/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20200728195943-123391ffb6de/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-20210322153248-0c34fe9e7dc2/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= -golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220315160706-3147a52a75dd/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= -golang.org/x/exp v0.0.0-20220722155223-a9213eeb770e/go.mod h1:Kr81I6Kryrl9sr8s2FK3vxD90NdsKWRuOIl2O4CvYbA= golang.org/x/image v0.0.0-20220302094943-723b81ca9867 h1:TcHcE0vrmgzNH1v3ppjcMGbhG5+9fMuvOmUYwNEF4q4= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= -golang.org/x/net v0.0.0-20181011144130-49bb7cea24b1/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= -golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= -golang.org/x/net v0.0.0-20190619014844-b5b0513f8c1b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20201006153459-a7d1128ccaa0/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= -golang.org/x/net v0.0.0-20210520170846-37e1c6afe023/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210825183410-e898025ed96a/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211209124913-491a49abca63/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211216030914-fe4d6282115f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= -golang.org/x/sys v0.0.0-20190514135907-3a4b5fb9f71f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190522044717-8097e1b27ff5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190602015325-4c4f7f33c9ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190606203320-7fc4e5ec1444/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190616124812-15dcb6c0061f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190812073006-9eafafc0a87e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191022100944-742c48ecaeb7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200120151820-655fe14d7479/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200519105757-fe76b779f299/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200622214017-ed371f2e16b4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200817155316-9781c653f443/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200916030750-2334cc1a136f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200922070232-aee5d888a860/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200923182605-d9f96fdee20d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201112073958-5cba982894dd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201117170446-d9b008d0a637/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20201202213521-69691e467435/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210324051608-47abb6519492/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210426230700-d19ff857e887/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210831042530-f4d43177bf5e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/telemetry v0.0.0-20240208230135-b75ee8823808 h1:+Kc94D8UVEVxJnLXp/+FMfqQARZtWHfVrcRtcG8aT3g= -golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457 h1:zf5N6UOrA487eEFacMePxjXAJctxKmyjKUsjA11Uzuk= golang.org/x/telemetry v0.0.0-20240521205824-bda55230c457/go.mod h1:pRgIJT+bRLFKnoM1ldnzKoxTIn14Yxz928LQRYYgIN0= -golang.org/x/term v0.0.0-20210220032956-6a3ed077a48d/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= -golang.org/x/term v0.0.0-20210615171337-6886f2dfbf5b/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/time v0.0.0-20200630173020-3af7569d3a1e/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/time v0.0.0-20210220033141-f8bda1e9f3ba/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= -golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= -golang.org/x/tools v0.0.0-20190614205625-5aca471b1d59/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190706070813-72ffa07ba3db/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI= -golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200616133436-c1934b75d054/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200916195026-c9a70fc28ce3/go.mod h1:z6u4i615ZeAfBE4XtMziQW1fSVJXACjjbWkB/mvPzlU= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/plot v0.10.1 h1:dnifSs43YJuNMDzB7v8wV64O4ABBHReuAVAoBxqBqS4= -google.golang.org/api v0.0.0-20160322025152-9bf6e6e569ff/go.mod h1:4mhQ8q/RsB7i+udVvVy5NUi08OU8ZlA0gRVgrF7VFY0= -google.golang.org/api v0.166.0/go.mod h1:4FcBc686KFi7QI/U51/2GKKevfZMpM17sCdibqe/bSA= -google.golang.org/api v0.176.1/go.mod h1:j2MaSDYcvYV1lkZ1+SMW4IeF90SrEyFA+tluDYWRrFg= -google.golang.org/api v0.177.0/go.mod h1:srbhue4MLjkjbkux5p3dw/ocYOSZTaIEvf7bCOnFQDw= -google.golang.org/api v0.180.0/go.mod h1:51AiyoEg1MJPSZ9zvklA8VnRILPXxn1iVen9v25XHAE= -google.golang.org/api v0.183.0/go.mod h1:q43adC5/pHoSZTx5h2mSmdF7NcyfW9JuDyIOJAgS9ZQ= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= -google.golang.org/cloud v0.0.0-20151119220103-975617b05ea8/go.mod h1:0H1ncTHf11KCFhTc/+EFRbzSCOZx+VUbRMk55Yv5MYk= -google.golang.org/genproto v0.0.0-20190522204451-c2c4e71fbf69/go.mod h1:z3L6/3dTEVtUr6QSP8miRzeRqwQOioJ9I66odjN4I7s= -google.golang.org/genproto v0.0.0-20200117163144-32f20d992d24/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= -google.golang.org/genproto v0.0.0-20200527145253-8367513e4ece/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA= -google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20201110150050-8816d57aaa9a/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20240401170217-c3f982113cda/go.mod h1:g2LLCvCeCSir/JJSWosk19BR4NVxGqHUC6rxIRsd7Aw= -google.golang.org/genproto v0.0.0-20240528184218-531527333157/go.mod h1:ubQlAQnzejB8uZzszhrTCU2Fyp6Vi7ZE5nn0c3W8+qQ= -google.golang.org/genproto/googleapis/api v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:5iCWqnniDlqZHrd3neWVTOwvh/v6s3232omMecelax8= -google.golang.org/genproto/googleapis/api v0.0.0-20240318140521-94a12d6c2237/go.mod h1:Z5Iiy3jtmioajWHDGFk7CeugTyHtPvMHA4UTmUkyalE= -google.golang.org/genproto/googleapis/api v0.0.0-20240429193739-8cf5692501f6/go.mod h1:10yRODfgim2/T8csjQsMPgZOMvtytXKTDRzH6HRGzRw= -google.golang.org/genproto/googleapis/api v0.0.0-20240513163218-0867130af1f8/go.mod h1:vPrPUTsDCYxXWjP7clS81mZ6/803D8K4iM9Ma27VKas= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231120223509-83a465c0220f h1:hL+1ptbhFoeL1HcROQ8OGXaqH0jYRRibgWQWco0/Ugc= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0 h1:Y6QQt9D/syZt/Qgnz5a1y2O3WunQeeVDfS9+Xr82iFA= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240125205218-1f4bbc51befe h1:weYsP+dNijSQVoLAb5bpUos3ciBpNU/NEVlHFKrk8pg= google.golang.org/genproto/googleapis/bytestream v0.0.0-20240325203815-454cdb8f5daa h1:wBkzraZsSqhj1M4L/nMrljUU6XasJkgHvUsq8oRGwF0= -google.golang.org/genproto/googleapis/bytestream v0.0.0-20240604185151-ef581f913117/go.mod h1:0J6mmn3XAEjfNbPvpH63c0RXCjGNFcCzlEfWSN4In+k= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240221002015-b0ce06bbee7c/go.mod h1:H4O17MA/PE9BsGx3w+a+W2VOLLD1Qf7oJneAoU6WktY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240318140521-94a12d6c2237/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240429193739-8cf5692501f6/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240509183442-62759503f434/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240513163218-0867130af1f8/go.mod h1:I7Y+G38R2bu5j1aLzfFmQfTcU/WnFuqDwLZAbvKTKpM= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240528184218-531527333157/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= -google.golang.org/grpc v0.0.0-20160317175043-d3ddb4469d5a/go.mod h1:yo6s7OP7yaDglbqo1J04qKzAhqBH6lvTonzMVmEdcZw= -google.golang.org/grpc v1.24.0/go.mod h1:XDChyiUovWa60DnaeDeZmSW86xtLtjtZbwvSiRnRtcA= -google.golang.org/grpc v1.43.0/go.mod h1:k+4IHHFw41K8+bbowsex27ge2rCb65oeWqe4jJ590SU= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= -google.golang.org/protobuf v1.34.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -gopkg.in/airbrake/gobrake.v2 v2.0.9/go.mod h1:/h5ZAUhDkGaJfjzjKLSjv6zCL6O0LLBxU4K+aSYdM/U= gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= -gopkg.in/check.v1 v1.0.0-20141024133853-64131543e789/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/cheggaaa/pb.v1 v1.0.25 h1:Ev7yu1/f6+d+b3pi5vPdRPc6nNtP1umSfcWiEfRqv6I= gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= -gopkg.in/gemnasium/logrus-airbrake-hook.v2 v2.1.2/go.mod h1:Xk6kEKp8OKb+X14hQBKWaSkCsqBpgog8nAV2xsGOxlo= gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec h1:RlWgLqCMMIYYEVcAR5MDsuHlVkaIPDAF+5Dehzg8L5A= -gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k= gopkg.in/resty.v1 v1.12.0 h1:CuXP0Pjfw9rOuY6EP+UvtNvt5DSqHpIxILZKT/quCZI= -gopkg.in/square/go-jose.v2 v2.2.2/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.3.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= -gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/square/go-jose.v2 v2.6.0 h1:NGk74WTnPKBNUhNzQX7PYcTLUjoq7mzKk2OKbvwk2iI= gopkg.in/square/go-jose.v2 v2.6.0/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-billy.v4 v4.3.2 h1:0SQA1pRztfTFx2miS8sA97XvooFeNOmvUenF4o0EcVg= gopkg.in/src-d/go-billy.v4 v4.3.2/go.mod h1:nDjArDMp+XMs1aFAESLRjfGSgfvoYN0hDfzEk0GjC98= gopkg.in/telebot.v3 v3.2.1 h1:3I4LohaAyJBiivGmkfB+CiVu7QFOWkuZ4+KHgO/G3rs= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= -gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.1.3 h1:qTakTkI6ni6LFD5sBwwsdSO+AQqbSIxOauHTTQKZ/7o= +howett.net/plist v1.0.0 h1:7CrbWYbPPO/PyNy38b2EB/+gYbjCe2DXBxgtOOZbSQM= howett.net/plist v1.0.0/go.mod h1:lqaXoTrLY4hg8tnEzNru53gicrbv7rrk+2xJA/7hw9g= -k8s.io/api v0.20.1/go.mod h1:KqwcCVogGxQY3nBlRpwt+wpAMF/KjaCc7RpywacvqUo= -k8s.io/api v0.20.4/go.mod h1:++lNL1AJMkDymriNniQsWRkMDzRaX2Y/POTUi8yvqYQ= -k8s.io/api v0.20.6/go.mod h1:X9e8Qag6JV/bL5G6bU8sdVRltWKmdHsFUGS3eVndqE8= -k8s.io/api v0.22.5/go.mod h1:mEhXyLaSD1qTOf40rRiKXkc+2iCem09rWLlFwhCEiAs= -k8s.io/api v0.29.2/go.mod h1:sdIaaKuU7P44aoyyLlikSLayT6Vb7bvJNCX105xZXY0= -k8s.io/apimachinery v0.20.1/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.4/go.mod h1:WlLqWAHZGg07AeltaI0MV5uk1Omp8xaN0JGLY6gkRpU= -k8s.io/apimachinery v0.20.6/go.mod h1:ejZXtW1Ra6V1O5H8xPBGz+T3+4gfkTCeExAHKU57MAc= -k8s.io/apimachinery v0.22.1/go.mod h1:O3oNtNadZdeOMxHFVxOreoznohCpy0z6mocxbZr7oJ0= -k8s.io/apimachinery v0.22.5/go.mod h1:xziclGKwuuJ2RM5/rSFQSYAj0zdbci3DH8kj+WvyN0U= -k8s.io/apimachinery v0.29.2/go.mod h1:6HVkd1FwxIagpYrHSwJlQqZI3G9LfYWRPAkUvLnXTKU= -k8s.io/apiserver v0.20.1/go.mod h1:ro5QHeQkgMS7ZGpvf4tSMx6bBOgPfE+f52KwvXfScaU= -k8s.io/apiserver v0.20.4/go.mod h1:Mc80thBKOyy7tbvFtB4kJv1kbdD0eIH8k8vianJcbFM= -k8s.io/apiserver v0.20.6/go.mod h1:QIJXNt6i6JB+0YQRNcS0hdRHJlMhflFmsBDeSgT1r8Q= -k8s.io/apiserver v0.22.5/go.mod h1:s2WbtgZAkTKt679sYtSudEQrTGWUSQAPe6MupLnlmaQ= -k8s.io/client-go v0.20.1/go.mod h1:/zcHdt1TeWSd5HoUe6elJmHSQ6uLLgp4bIJHVEuy+/Y= -k8s.io/client-go v0.20.4/go.mod h1:LiMv25ND1gLUdBeYxBIwKpkSC5IsozMMmOOeSJboP+k= -k8s.io/client-go v0.20.6/go.mod h1:nNQMnOvEUEsOzRRFIIkdmYOjAZrC8bgq0ExboWSU1I0= -k8s.io/client-go v0.22.5/go.mod h1:cs6yf/61q2T1SdQL5Rdcjg9J1ElXSwbjSrW2vFImM4Y= -k8s.io/client-go v0.29.2/go.mod h1:knlvFZE58VpqbQpJNbCbctTVXcd35mMyAAwBdpt4jrA= -k8s.io/code-generator v0.19.7/go.mod h1:lwEq3YnLYb/7uVXLorOJfxg+cUu2oihFhHZ0n9NIla0= k8s.io/component-base v0.0.0-20240417101527-62c04b35eff6 h1:WN8Lymy+dCTDHgn4vhUSNIB6U+0sDiv/c9Zdr0UeAnI= k8s.io/component-base v0.0.0-20240417101527-62c04b35eff6/go.mod h1:l0ukbPS0lwFxOzSq5ZqjutzF+5IL2TLp495PswRPSZk= -k8s.io/cri-api v0.17.3/go.mod h1:X1sbHmuXhwaHs9xxYffLqJogVsnI+f6cPRcgPel7ywM= -k8s.io/cri-api v0.20.1/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.4/go.mod h1:2JRbKt+BFLTjtrILYVqQK5jqhI+XNdF6UiGMgczeBCI= -k8s.io/cri-api v0.20.6/go.mod h1:ew44AjNXwyn1s0U4xCKGodU7J1HzBeZ1MpGrpa5r8Yc= -k8s.io/cri-api v0.23.1/go.mod h1:REJE3PSU0h/LOV1APBrupxrEJqnoxZC8KWzkBUHwrK4= -k8s.io/cri-api v0.25.0/go.mod h1:J1rAyQkSJ2Q6I+aBMOVgg2/cbbebso6FNa0UagiR0kc= -k8s.io/gengo v0.0.0-20200413195148-3a45101e95ac/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20200428234225-8167cfdcfc14/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= -k8s.io/gengo v0.0.0-20201113003025-83324d819ded/go.mod h1:FiNAH4ZV3gBg2Kwh89tzAEV2be7d5xI0vBa/VySYy3E= k8s.io/gengo v0.0.0-20230829151522-9cce18d56c01 h1:pWEwq4Asjm4vjW7vcsmijwBhOr1/shsbSYiWXmNGlks= k8s.io/gengo/v2 v2.0.0-20240228010128-51d4e06bde70 h1:NGrVE502P0s0/1hudf8zjgwki1X/TByhmAoILTarmzo= k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= -k8s.io/klog/v2 v2.4.0/go.mod h1:Od+F08eJP+W3HUb4pSrPpgp9DGU4GzlpG/TmITuYh/Y= -k8s.io/klog/v2 v2.9.0/go.mod h1:hy9LJ/NvuK+iVyP4Ehqva4HxZG/oXyIS3n3Jmire4Ec= -k8s.io/klog/v2 v2.30.0/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= -k8s.io/kms v0.29.0/go.mod h1:mB0f9HLxRXeXUfHfn1A7rpwOlzXI1gIWu86z6buNoYA= -k8s.io/kube-openapi v0.0.0-20200805222855-6aeccd4b50c6/go.mod h1:UuqjUnNftUyPE5H64/qeyjQoUZhGpeFDVdxjTeEVN2o= -k8s.io/kube-openapi v0.0.0-20201113171705-d219536bb9fd/go.mod h1:WOJ3KddDSol4tAGcJo0Tvi+dK12EcqSLqcWsryKMpfM= -k8s.io/kube-openapi v0.0.0-20210421082810-95288971da7e/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20211109043538-20434351676c/go.mod h1:vHXdDvt9+2spS2Rx9ql3I8tycm3H9FDfdUoIuKCefvw= -k8s.io/kube-openapi v0.0.0-20231214164306-ab13479f8bf8/go.mod h1:AsvuZPBlUDVuCdzJ87iajxtXuR9oktsTctW/R9wwouA= -k8s.io/kube-openapi v0.0.0-20240220201932-37d671a357a5/go.mod h1:Pa1PvrP7ACSkuX6I7KYomY6cmMA0Tx86waBhDUgoKPw= -k8s.io/kubernetes v1.13.0/go.mod h1:ocZa8+6APFNC2tX1DZASIbocyYT5jHzqFVsY5aoB7Jk= -k8s.io/utils v0.0.0-20201110183641-67b214c5f920/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210819203725-bdf08cb9a70a/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= -k8s.io/utils v0.0.0-20210930125809-cb0fa318a74b/go.mod h1:jPW/WVKK9YHAvNhRxK0md/EJ228hCsBRufyofKtW8HA= +lukechampine.com/uint128 v1.3.0 h1:cDdUVfRwDUDovz610ABgFD17nXD4/uDgVHl2sC3+sbo= +modernc.org/cc/v3 v3.41.0 h1:QoR1Sn3YWlmA1T4vLaKZfawdVtSiGx8H+cEojbC7v1Q= modernc.org/cc/v3 v3.41.0/go.mod h1:Ni4zjJYJ04CDOhG7dn640WGfwBzfE0ecX8TyMB0Fv0Y= +modernc.org/ccgo/v3 v3.16.15 h1:KbDR3ZAVU+wiLyMESPtbtE/Add4elztFyfsWoNTgxS0= modernc.org/ccgo/v3 v3.16.15/go.mod h1:yT7B+/E2m43tmMOT51GMoM98/MtHIcQQSleGnddkUNI= -nhooyr.io/websocket v1.8.7 h1:usjR2uOr/zjjkVMy0lW+PPohFok7PCow5sDjLgX4P4g= +modernc.org/ccorpus v1.11.6 h1:J16RXiiqiCgua6+ZvQot4yUuUy8zxgqbqEEUuGPlISk= +modernc.org/httpfs v1.0.6 h1:AAgIpFZRXuYnkjftxTAZwMIiwEqAfk8aVB2/oA6nAeM= +modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4= +modernc.org/tcl v1.15.1 h1:mOQwiEK4p7HruMZcwKTZPw/aqtGM4aY00uzWhlKKYws= +modernc.org/z v1.7.0 h1:xkDw/KepgEjeizO2sNco+hqYkU12taxQFqPEmgm1GWE= +nhooyr.io/websocket v1.8.10 h1:mv4p+MnGrLDcPlBoWsvPP7XCzTYMXP9F9eIGoKbgx7Q= nhooyr.io/websocket v1.8.10/go.mod h1:rN9OFWIUwuxg4fR5tELlYC04bXYowCP9GX47ivo2l+c= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.14/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.15/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.22/go.mod h1:LEScyzhFmoF5pso/YSeBstl57mOzx9xlU9n85RGrDQg= -sigs.k8s.io/structured-merge-diff/v4 v4.0.1/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.2/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.0.3/go.mod h1:bJZC9H9iH24zzfZ/41RGcq60oK1F7G282QMXDPYydCw= -sigs.k8s.io/structured-merge-diff/v4 v4.1.2/go.mod h1:j/nl6xW8vLS49O8YvXW1ocPhZawJtm+Yrr7PPRQ0Vg4= sourcegraph.com/sourcegraph/appdash v0.0.0-20190731080439-ebfcffb1b5c0 h1:ucqkfpjg9WzSUubAO62csmucvxl4/JeW3F4I4909XkM= diff --git a/kinds/dashboard/dashboard_kind.cue b/kinds/dashboard/dashboard_kind.cue index 04e9d4f1322..58ae9457718 100644 --- a/kinds/dashboard/dashboard_kind.cue +++ b/kinds/dashboard/dashboard_kind.cue @@ -99,6 +99,9 @@ lineage: schemas: [{ // Snapshot options. They are present only if the dashboard is a snapshot. snapshot?: #Snapshot @grafanamaturity(NeedsExpertReview) + + // When set to true, the dashboard will load all panels in the dashboard when it's loaded. + preload?: bool } @cuetsy(kind="interface") @grafana(TSVeneer="type") /////////////////////////////////////// diff --git a/kinds/preferences/preferences_kind.cue b/kinds/preferences/preferences_kind.cue index 0eddc16cbef..dd97beb4b0c 100644 --- a/kinds/preferences/preferences_kind.cue +++ b/kinds/preferences/preferences_kind.cue @@ -32,6 +32,9 @@ lineage: schemas: [{ // Cookie preferences cookiePreferences?: #CookiePreferences + + // Navigation preferences + navbar?: #NavbarPreference } @cuetsy(kind="interface") #QueryHistoryPreference: { @@ -44,5 +47,9 @@ lineage: schemas: [{ performance?: {} functional?: {} } @cuetsy(kind="interface") + + #NavbarPreference: { + savedItemIds: [...string] + } @cuetsy(kind="interface") } }] diff --git a/package.json b/package.json index 095cb2274da..fd8e8ce52fc 100644 --- a/package.json +++ b/package.json @@ -261,7 +261,7 @@ "@grafana/prometheus": "workspace:*", "@grafana/runtime": "workspace:*", "@grafana/saga-icons": "workspace:*", - "@grafana/scenes": "5.3.2", + "@grafana/scenes": "5.3.5", "@grafana/schema": "workspace:*", "@grafana/sql": "workspace:*", "@grafana/ui": "workspace:*", diff --git a/packages/grafana-data/src/context/plugins/DataSourcePluginContextProvider.tsx b/packages/grafana-data/src/context/plugins/DataSourcePluginContextProvider.tsx index 8747615a7cf..1464f1a6f6c 100644 --- a/packages/grafana-data/src/context/plugins/DataSourcePluginContextProvider.tsx +++ b/packages/grafana-data/src/context/plugins/DataSourcePluginContextProvider.tsx @@ -1,6 +1,6 @@ import { PropsWithChildren, ReactElement, useMemo } from 'react'; -import { DataSourceInstanceSettings } from '../../types'; +import { DataSourceInstanceSettings } from '../../types/datasource'; import { Context, DataSourcePluginContextType } from './PluginContext'; diff --git a/packages/grafana-data/src/dataframe/ArrayDataFrame.test.ts b/packages/grafana-data/src/dataframe/ArrayDataFrame.test.ts index 624829ba778..c2878481565 100644 --- a/packages/grafana-data/src/dataframe/ArrayDataFrame.test.ts +++ b/packages/grafana-data/src/dataframe/ArrayDataFrame.test.ts @@ -1,4 +1,4 @@ -import { DataFrame } from '../types'; +import { DataFrame } from '../types/dataFrame'; import { ArrayDataFrame, arrayToDataFrame } from './ArrayDataFrame'; import { toDataFrameDTO } from './processDataFrame'; diff --git a/packages/grafana-data/src/dataframe/ArrayDataFrame.ts b/packages/grafana-data/src/dataframe/ArrayDataFrame.ts index 06092b59da9..8817812b5bd 100644 --- a/packages/grafana-data/src/dataframe/ArrayDataFrame.ts +++ b/packages/grafana-data/src/dataframe/ArrayDataFrame.ts @@ -1,4 +1,4 @@ -import { QueryResultMeta } from '../types'; +import { QueryResultMeta } from '../types/data'; import { Field, FieldType, DataFrame, TIME_SERIES_VALUE_FIELD_NAME } from '../types/dataFrame'; import { guessFieldTypeForField } from './processDataFrame'; diff --git a/packages/grafana-data/src/dataframe/DataFrameJSON.ts b/packages/grafana-data/src/dataframe/DataFrameJSON.ts index fdfcb4dc586..6d620e97d6f 100644 --- a/packages/grafana-data/src/dataframe/DataFrameJSON.ts +++ b/packages/grafana-data/src/dataframe/DataFrameJSON.ts @@ -1,4 +1,5 @@ -import { DataFrame, FieldType, FieldConfig, Labels, QueryResultMeta, Field } from '../types'; +import { Labels, QueryResultMeta } from '../types/data'; +import { FieldType, DataFrame, Field, FieldConfig } from '../types/dataFrame'; import { guessFieldTypeFromNameAndValue } from './processDataFrame'; diff --git a/packages/grafana-data/src/dataframe/DataFrameView.ts b/packages/grafana-data/src/dataframe/DataFrameView.ts index 6d8b523140d..d4d3c157d62 100644 --- a/packages/grafana-data/src/dataframe/DataFrameView.ts +++ b/packages/grafana-data/src/dataframe/DataFrameView.ts @@ -1,5 +1,5 @@ -import { DisplayProcessor } from '../types'; import { DataFrame, Field } from '../types/dataFrame'; +import { DisplayProcessor } from '../types/displayValue'; import { FunctionalVector } from '../vector/FunctionalVector'; /** diff --git a/packages/grafana-data/src/dataframe/StreamingDataFrame.test.ts b/packages/grafana-data/src/dataframe/StreamingDataFrame.test.ts index cf8ad95d08e..4b9af8b8906 100644 --- a/packages/grafana-data/src/dataframe/StreamingDataFrame.test.ts +++ b/packages/grafana-data/src/dataframe/StreamingDataFrame.test.ts @@ -1,6 +1,6 @@ import { getFieldDisplayName } from '../field/fieldState'; import { reduceField, ReducerID } from '../transformations/fieldReducer'; -import { FieldType, DataFrame } from '../types'; +import { FieldType, DataFrame } from '../types/dataFrame'; import { DataFrameJSON } from './DataFrameJSON'; import { diff --git a/packages/grafana-data/src/dataframe/StreamingDataFrame.ts b/packages/grafana-data/src/dataframe/StreamingDataFrame.ts index f029bc54f4a..2837f3553c6 100644 --- a/packages/grafana-data/src/dataframe/StreamingDataFrame.ts +++ b/packages/grafana-data/src/dataframe/StreamingDataFrame.ts @@ -1,7 +1,8 @@ import { AlignedData } from 'uplot'; import { join } from '../transformations/transformers/joinDataFrames'; -import { FieldDTO, QueryResultMeta, DataFrame, Field, FieldType, Labels } from '../types'; +import { Labels, QueryResultMeta } from '../types/data'; +import { FieldDTO, DataFrame, Field, FieldType } from '../types/dataFrame'; import { parseLabels } from '../utils/labels'; import { renderLegendFormat } from '../utils/legend'; diff --git a/packages/grafana-data/src/dataframe/processDataFrame.test.ts b/packages/grafana-data/src/dataframe/processDataFrame.test.ts index 2c0cd824dfd..7fab4d0bfb2 100644 --- a/packages/grafana-data/src/dataframe/processDataFrame.test.ts +++ b/packages/grafana-data/src/dataframe/processDataFrame.test.ts @@ -1,5 +1,6 @@ import { dateTime } from '../datetime/moment_wrapper'; -import { DataFrameDTO, Field, FieldType, TableData, TimeSeries } from '../types/index'; +import { TimeSeries, TableData } from '../types/data'; +import { FieldType, DataFrameDTO, Field } from '../types/dataFrame'; import { ArrayDataFrame } from './ArrayDataFrame'; import { diff --git a/packages/grafana-data/src/dataframe/processDataFrame.ts b/packages/grafana-data/src/dataframe/processDataFrame.ts index b5a28b83a07..4a028b6b4fd 100644 --- a/packages/grafana-data/src/dataframe/processDataFrame.ts +++ b/packages/grafana-data/src/dataframe/processDataFrame.ts @@ -1,30 +1,24 @@ // Libraries import { isArray, isBoolean, isNumber, isString } from 'lodash'; -// Types import { isDateTime } from '../datetime/moment_wrapper'; import { fieldIndexComparer } from '../field/fieldComparers'; import { getFieldDisplayName } from '../field/fieldState'; +import { Column, LoadingState, TableData, TimeSeries, TimeSeriesValue } from '../types/data'; import { DataFrame, - Field, - FieldConfig, - TimeSeries, FieldType, - TableData, - Column, - GraphSeriesXY, - TimeSeriesValue, - FieldDTO, - DataFrameDTO, - TIME_SERIES_VALUE_FIELD_NAME, TIME_SERIES_TIME_FIELD_NAME, - DataQueryResponseData, - PanelData, - LoadingState, - GraphSeriesValue, + TIME_SERIES_VALUE_FIELD_NAME, + Field, DataFrameWithValue, -} from '../types/index'; + DataFrameDTO, + FieldDTO, + FieldConfig, +} from '../types/dataFrame'; +import { DataQueryResponseData } from '../types/datasource'; +import { GraphSeriesXY, GraphSeriesValue } from '../types/graph'; +import { PanelData } from '../types/panel'; import { arrayToDataFrame } from './ArrayDataFrame'; import { dataFrameFromJSON } from './DataFrameJSON'; diff --git a/packages/grafana-data/src/dataframe/utils.test.ts b/packages/grafana-data/src/dataframe/utils.test.ts index fcac25607df..5f7887a1c8c 100644 --- a/packages/grafana-data/src/dataframe/utils.test.ts +++ b/packages/grafana-data/src/dataframe/utils.test.ts @@ -1,4 +1,4 @@ -import { FieldType } from '../types'; +import { FieldType } from '../types/dataFrame'; import { createDataFrame, toDataFrame } from './processDataFrame'; import { anySeriesWithTimeField, addRow } from './utils'; diff --git a/packages/grafana-data/src/datetime/datemath.ts b/packages/grafana-data/src/datetime/datemath.ts index ebfc079f755..0aedd4934b5 100644 --- a/packages/grafana-data/src/datetime/datemath.ts +++ b/packages/grafana-data/src/datetime/datemath.ts @@ -1,6 +1,6 @@ import { includes, isDate } from 'lodash'; -import { TimeZone } from '../types/index'; +import { TimeZone } from '../types/time'; import { DateTime, dateTime, dateTimeForTimeZone, DurationUnit, isDateTime, ISO_8601 } from './moment_wrapper'; diff --git a/packages/grafana-data/src/datetime/formatter.ts b/packages/grafana-data/src/datetime/formatter.ts index 165422855a4..c78a08d562b 100644 --- a/packages/grafana-data/src/datetime/formatter.ts +++ b/packages/grafana-data/src/datetime/formatter.ts @@ -1,7 +1,7 @@ /* eslint-disable id-blacklist, no-restricted-imports, @typescript-eslint/ban-types */ import moment, { Moment } from 'moment-timezone'; -import { TimeZone } from '../types'; +import { TimeZone } from '../types/time'; import { DateTimeOptions, getTimeZone } from './common'; import { systemDateFormats } from './formats'; diff --git a/packages/grafana-data/src/datetime/index.ts b/packages/grafana-data/src/datetime/index.ts deleted file mode 100644 index 9dbdcf96bc3..00000000000 --- a/packages/grafana-data/src/datetime/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Names are too general to export globally -import * as dateMath from './datemath'; -import * as rangeUtil from './rangeutil'; -export * from './moment_wrapper'; -export * from './timezones'; -export * from './formats'; -export * from './formatter'; -export * from './parser'; -export * from './durationutil'; -export { dateMath, rangeUtil }; -export { type DateTimeOptions, setTimeZoneResolver, type TimeZoneResolver, getTimeZone } from './common'; diff --git a/packages/grafana-data/src/datetime/rangeutil.test.ts b/packages/grafana-data/src/datetime/rangeutil.test.ts index 8fa40c02444..03d3594afb4 100644 --- a/packages/grafana-data/src/datetime/rangeutil.test.ts +++ b/packages/grafana-data/src/datetime/rangeutil.test.ts @@ -1,8 +1,14 @@ import { RawTimeRange, TimeRange } from '../types/time'; -import { timeRangeToRelative } from './rangeutil'; - -import { dateTime, rangeUtil } from './index'; +import { dateTime } from './moment_wrapper'; +import { + convertRawToRange, + describeInterval, + isRelativeTimeRange, + relativeToTimeRange, + roundInterval, + timeRangeToRelative, +} from './rangeutil'; describe('Range Utils', () => { // These tests probably wrap the dateTimeParser tests to some extent @@ -15,7 +21,7 @@ describe('Range Utils', () => { }; it('should serialize the default format by default', () => { - const deserialized = rangeUtil.convertRawToRange(defaultRawTimeRange); + const deserialized = convertRawToRange(defaultRawTimeRange); expect(deserialized.from.format()).toBe(DEFAULT_DATE_VALUE_FORMATTED); }); @@ -26,17 +32,12 @@ describe('Range Utils', () => { to: '30-07-1996 16:20:00', }; - const deserializedTimeRange = rangeUtil.convertRawToRange( - nonDefaultRawTimeRange, - undefined, - undefined, - NON_DEFAULT_FORMAT - ); + const deserializedTimeRange = convertRawToRange(nonDefaultRawTimeRange, undefined, undefined, NON_DEFAULT_FORMAT); expect(deserializedTimeRange.from.format()).toBe(DEFAULT_DATE_VALUE_FORMATTED); }); it('should take timezone into account', () => { - const deserializedTimeRange = rangeUtil.convertRawToRange(defaultRawTimeRange, 'UTC'); + const deserializedTimeRange = convertRawToRange(defaultRawTimeRange, 'UTC'); expect(deserializedTimeRange.from.format()).toBe('1996-07-30T16:00:00Z'); }); @@ -46,7 +47,7 @@ describe('Range Utils', () => { to: 'now', }; - const deserialized = rangeUtil.convertRawToRange(timeRange); + const deserialized = convertRawToRange(timeRange); expect(deserialized.raw).toStrictEqual(timeRange); expect(deserialized.to.toString()).not.toBe(deserialized.raw.to); }); @@ -55,13 +56,13 @@ describe('Range Utils', () => { describe('relative time', () => { it('should identify absolute vs relative', () => { expect( - rangeUtil.isRelativeTimeRange({ + isRelativeTimeRange({ from: '1234', to: '4567', }) ).toBe(false); expect( - rangeUtil.isRelativeTimeRange({ + isRelativeTimeRange({ from: 'now-5', to: 'now', }) @@ -71,7 +72,7 @@ describe('Range Utils', () => { describe('describe_interval', () => { it('falls back to seconds if input is a number', () => { - expect(rangeUtil.describeInterval('123')).toEqual({ + expect(describeInterval('123')).toEqual({ sec: 1, type: 's', count: 123, @@ -79,7 +80,7 @@ describe('Range Utils', () => { }); it('parses a valid time unt string correctly', () => { - expect(rangeUtil.describeInterval('123h')).toEqual({ + expect(describeInterval('123h')).toEqual({ sec: 3600, type: 'h', count: 123, @@ -87,12 +88,12 @@ describe('Range Utils', () => { }); it('fails if input is invalid', () => { - expect(() => rangeUtil.describeInterval('123xyz')).toThrow(); - expect(() => rangeUtil.describeInterval('xyz')).toThrow(); + expect(() => describeInterval('123xyz')).toThrow(); + expect(() => describeInterval('xyz')).toThrow(); }); it('should be able to parse negative values as well', () => { - expect(rangeUtil.describeInterval('-50ms')).toEqual({ + expect(describeInterval('-50ms')).toEqual({ sec: 0.001, type: 'ms', count: -50, @@ -102,130 +103,130 @@ describe('Range Utils', () => { describe('roundInterval', () => { it('rounds 9ms to 1ms', () => { - expect(rangeUtil.roundInterval(9)).toEqual(1); + expect(roundInterval(9)).toEqual(1); }); it('rounds 14ms to 10ms', () => { - expect(rangeUtil.roundInterval(9)).toEqual(1); + expect(roundInterval(9)).toEqual(1); }); it('rounds 34ms to 20ms', () => { - expect(rangeUtil.roundInterval(34)).toEqual(20); + expect(roundInterval(34)).toEqual(20); }); it('rounds 74ms to 50ms', () => { - expect(rangeUtil.roundInterval(74)).toEqual(50); + expect(roundInterval(74)).toEqual(50); }); it('rounds 149ms to 100ms', () => { - expect(rangeUtil.roundInterval(149)).toEqual(100); + expect(roundInterval(149)).toEqual(100); }); it('rounds 349ms to 200ms', () => { - expect(rangeUtil.roundInterval(349)).toEqual(200); + expect(roundInterval(349)).toEqual(200); }); it('rounds 749ms to 500ms', () => { - expect(rangeUtil.roundInterval(749)).toEqual(500); + expect(roundInterval(749)).toEqual(500); }); it('rounds 1.5s to 1s', () => { - expect(rangeUtil.roundInterval(1499)).toEqual(1000); + expect(roundInterval(1499)).toEqual(1000); }); it('rounds 3.5s to 2s', () => { - expect(rangeUtil.roundInterval(3499)).toEqual(2000); + expect(roundInterval(3499)).toEqual(2000); }); it('rounds 7.5s to 5s', () => { - expect(rangeUtil.roundInterval(7499)).toEqual(5000); + expect(roundInterval(7499)).toEqual(5000); }); it('rounds 12.5s to 10s', () => { - expect(rangeUtil.roundInterval(12499)).toEqual(10000); + expect(roundInterval(12499)).toEqual(10000); }); it('rounds 17.5s to 15s', () => { - expect(rangeUtil.roundInterval(17499)).toEqual(15000); + expect(roundInterval(17499)).toEqual(15000); }); it('rounds 25s to 20s', () => { - expect(rangeUtil.roundInterval(24999)).toEqual(20000); + expect(roundInterval(24999)).toEqual(20000); }); it('rounds 45s to 30s', () => { - expect(rangeUtil.roundInterval(44999)).toEqual(30000); + expect(roundInterval(44999)).toEqual(30000); }); it('rounds 1m30s to 1m', () => { - expect(rangeUtil.roundInterval(89999)).toEqual(60000); + expect(roundInterval(89999)).toEqual(60000); }); it('rounds 3m30s to 2m', () => { - expect(rangeUtil.roundInterval(209999)).toEqual(120000); + expect(roundInterval(209999)).toEqual(120000); }); it('rounds 7m30s to 5m', () => { - expect(rangeUtil.roundInterval(449999)).toEqual(300000); + expect(roundInterval(449999)).toEqual(300000); }); it('rounds 12m30s to 10m', () => { - expect(rangeUtil.roundInterval(749999)).toEqual(600000); + expect(roundInterval(749999)).toEqual(600000); }); it('rounds 17m30s to 15m', () => { - expect(rangeUtil.roundInterval(1049999)).toEqual(900000); + expect(roundInterval(1049999)).toEqual(900000); }); it('rounds 25m to 20m', () => { - expect(rangeUtil.roundInterval(1499999)).toEqual(1200000); + expect(roundInterval(1499999)).toEqual(1200000); }); it('rounds 45m to 30m', () => { - expect(rangeUtil.roundInterval(2699999)).toEqual(1800000); + expect(roundInterval(2699999)).toEqual(1800000); }); it('rounds 1h30m to 1h', () => { - expect(rangeUtil.roundInterval(5399999)).toEqual(3600000); + expect(roundInterval(5399999)).toEqual(3600000); }); it('rounds 2h30m to 2h', () => { - expect(rangeUtil.roundInterval(8999999)).toEqual(7200000); + expect(roundInterval(8999999)).toEqual(7200000); }); it('rounds 4h30m to 3h', () => { - expect(rangeUtil.roundInterval(16199999)).toEqual(10800000); + expect(roundInterval(16199999)).toEqual(10800000); }); it('rounds 9h to 6h', () => { - expect(rangeUtil.roundInterval(32399999)).toEqual(21600000); + expect(roundInterval(32399999)).toEqual(21600000); }); it('rounds 1d to 12h', () => { - expect(rangeUtil.roundInterval(86399999)).toEqual(43200000); + expect(roundInterval(86399999)).toEqual(43200000); }); it('rounds 1w to 1d', () => { - expect(rangeUtil.roundInterval(604799999)).toEqual(86400000); + expect(roundInterval(604799999)).toEqual(86400000); }); it('rounds 3w to 1w', () => { - expect(rangeUtil.roundInterval(1814399999)).toEqual(604800000); + expect(roundInterval(1814399999)).toEqual(604800000); }); it('rounds 6w to 30d', () => { - expect(rangeUtil.roundInterval(3628799999)).toEqual(2592000000); + expect(roundInterval(3628799999)).toEqual(2592000000); }); it('rounds >6w to 1y', () => { - expect(rangeUtil.roundInterval(3628800000)).toEqual(31536000000); + expect(roundInterval(3628800000)).toEqual(31536000000); }); }); describe('relativeToTimeRange', () => { it('should convert seconds to timeRange', () => { const relativeTimeRange = { from: 600, to: 300 }; - const timeRange = rangeUtil.relativeToTimeRange(relativeTimeRange, dateTime('2021-04-20T15:55:00Z')); + const timeRange = relativeToTimeRange(relativeTimeRange, dateTime('2021-04-20T15:55:00Z')); expect(timeRange.from.valueOf()).toEqual(dateTime('2021-04-20T15:45:00Z').valueOf()); expect(timeRange.to.valueOf()).toEqual(dateTime('2021-04-20T15:50:00Z').valueOf()); @@ -233,7 +234,7 @@ describe('Range Utils', () => { it('should convert from now', () => { const relativeTimeRange = { from: 600, to: 0 }; - const timeRange = rangeUtil.relativeToTimeRange(relativeTimeRange, dateTime('2021-04-20T15:55:00Z')); + const timeRange = relativeToTimeRange(relativeTimeRange, dateTime('2021-04-20T15:55:00Z')); expect(timeRange.from.valueOf()).toEqual(dateTime('2021-04-20T15:45:00Z').valueOf()); expect(timeRange.to.valueOf()).toEqual(dateTime('2021-04-20T15:55:00Z').valueOf()); diff --git a/packages/grafana-data/src/datetime/timezones.ts b/packages/grafana-data/src/datetime/timezones.ts index 6045ef51d7c..efc0842d28e 100644 --- a/packages/grafana-data/src/datetime/timezones.ts +++ b/packages/grafana-data/src/datetime/timezones.ts @@ -1,7 +1,7 @@ import { memoize } from 'lodash'; import moment from 'moment-timezone'; -import { TimeZone } from '../types'; +import { TimeZone } from '../types/time'; import { getTimeZone } from './common'; diff --git a/packages/grafana-data/src/events/common.ts b/packages/grafana-data/src/events/common.ts index aa94afd843a..415b68508a0 100644 --- a/packages/grafana-data/src/events/common.ts +++ b/packages/grafana-data/src/events/common.ts @@ -1,4 +1,5 @@ -import { AnnotationEvent, DataFrame } from '../types'; +import { AnnotationEvent } from '../types/annotations'; +import { DataFrame } from '../types/dataFrame'; import { BusEventBase, BusEventWithPayload } from './types'; diff --git a/packages/grafana-data/src/field/displayProcessor.test.ts b/packages/grafana-data/src/field/displayProcessor.test.ts index 0a5762430b5..94543fa2554 100644 --- a/packages/grafana-data/src/field/displayProcessor.test.ts +++ b/packages/grafana-data/src/field/displayProcessor.test.ts @@ -1,7 +1,8 @@ -import { systemDateFormats } from '../datetime'; +import { systemDateFormats } from '../datetime/formats'; import { createTheme } from '../themes'; -import { FieldConfig, FieldType, ThresholdsMode } from '../types'; +import { FieldConfig, FieldType } from '../types/dataFrame'; import { DisplayProcessor, DisplayValue } from '../types/displayValue'; +import { ThresholdsMode } from '../types/thresholds'; import { MappingType, ValueMapping } from '../types/valueMapping'; import { getDisplayProcessor, getRawDisplayProcessor } from './displayProcessor'; diff --git a/packages/grafana-data/src/field/displayProcessor.ts b/packages/grafana-data/src/field/displayProcessor.ts index 9cdef2760a6..a9f0a7c2927 100644 --- a/packages/grafana-data/src/field/displayProcessor.ts +++ b/packages/grafana-data/src/field/displayProcessor.ts @@ -3,11 +3,13 @@ import { toString, toNumber as _toNumber, isEmpty, isBoolean, isArray, join } fr // Types import { getFieldTypeFromValue } from '../dataframe/processDataFrame'; -import { toUtc, dateTimeParse } from '../datetime'; +import { toUtc } from '../datetime/moment_wrapper'; +import { dateTimeParse } from '../datetime/parser'; import { GrafanaTheme2 } from '../themes/types'; -import { KeyValue, TimeZone } from '../types'; +import { KeyValue } from '../types/data'; import { Field, FieldType } from '../types/dataFrame'; import { DecimalCount, DisplayProcessor, DisplayValue } from '../types/displayValue'; +import { TimeZone } from '../types/time'; import { anyToNumber } from '../utils/anyToNumber'; import { getValueMappingResult } from '../utils/valueMappings'; import { FormattedValue, getValueFormat, isBooleanUnit } from '../valueFormats/valueFormats'; diff --git a/packages/grafana-data/src/field/fieldColor.test.ts b/packages/grafana-data/src/field/fieldColor.test.ts index 43813f1f10a..bcf95f1fd79 100644 --- a/packages/grafana-data/src/field/fieldColor.test.ts +++ b/packages/grafana-data/src/field/fieldColor.test.ts @@ -1,5 +1,6 @@ import { createTheme } from '../themes'; -import { Field, FieldColorModeId, FieldType } from '../types'; +import { Field, FieldType } from '../types/dataFrame'; +import { FieldColorModeId } from '../types/fieldColor'; import { fieldColorModeRegistry, FieldValueColorCalculator, getFieldSeriesColor } from './fieldColor'; diff --git a/packages/grafana-data/src/field/fieldColor.ts b/packages/grafana-data/src/field/fieldColor.ts index 2336dbb868f..c341b84d30e 100644 --- a/packages/grafana-data/src/field/fieldColor.ts +++ b/packages/grafana-data/src/field/fieldColor.ts @@ -5,7 +5,9 @@ import tinycolor from 'tinycolor2'; import { colorManipulator } from '../themes'; import { GrafanaTheme2 } from '../themes/types'; import { reduceField } from '../transformations/fieldReducer'; -import { FALLBACK_COLOR, Field, FieldColorModeId, Threshold } from '../types'; +import { Field } from '../types/dataFrame'; +import { FALLBACK_COLOR, FieldColorModeId } from '../types/fieldColor'; +import { Threshold } from '../types/thresholds'; import { Registry, RegistryItem } from '../utils/Registry'; import { getScaleCalculator, ColorScaleValue } from './scale'; diff --git a/packages/grafana-data/src/field/fieldComparers.ts b/packages/grafana-data/src/field/fieldComparers.ts index 3f525b06405..bdcf8eb32a5 100644 --- a/packages/grafana-data/src/field/fieldComparers.ts +++ b/packages/grafana-data/src/field/fieldComparers.ts @@ -1,6 +1,6 @@ import { isNumber } from 'lodash'; -import { dateTime, isDateTimeInput } from '../datetime'; +import { isDateTimeInput, dateTime } from '../datetime/moment_wrapper'; import { Field, FieldType } from '../types/dataFrame'; type IndexComparer = (a: number, b: number) => number; diff --git a/packages/grafana-data/src/field/fieldDisplay.test.ts b/packages/grafana-data/src/field/fieldDisplay.test.ts index 4cf946c7493..35bf73b9299 100644 --- a/packages/grafana-data/src/field/fieldDisplay.test.ts +++ b/packages/grafana-data/src/field/fieldDisplay.test.ts @@ -3,7 +3,8 @@ import { merge } from 'lodash'; import { toDataFrame } from '../dataframe/processDataFrame'; import { createTheme } from '../themes'; import { ReducerID } from '../transformations/fieldReducer'; -import { FieldConfigPropertyItem, MappingType, SpecialValueMatch, ValueMapping } from '../types'; +import { FieldConfigPropertyItem } from '../types/fieldOverrides'; +import { MappingType, SpecialValueMatch, ValueMapping } from '../types/valueMapping'; import { getDisplayProcessor } from './displayProcessor'; import { fixCellTemplateExpressions, getFieldDisplayValues, GetFieldDisplayValuesOptions } from './fieldDisplay'; diff --git a/packages/grafana-data/src/field/fieldDisplay.ts b/packages/grafana-data/src/field/fieldDisplay.ts index 11bc62e0116..29a3ebc095f 100644 --- a/packages/grafana-data/src/field/fieldDisplay.ts +++ b/packages/grafana-data/src/field/fieldDisplay.ts @@ -6,20 +6,13 @@ import { GrafanaTheme2 } from '../themes'; import { reduceField, ReducerID } from '../transformations/fieldReducer'; import { getFieldMatcher } from '../transformations/matchers'; import { FieldMatcherID } from '../transformations/matchers/ids'; -import { - DataFrame, - DisplayValue, - DisplayValueAlignmentFactors, - Field, - FieldConfig, - FieldConfigSource, - FieldType, - InterpolateFunction, - LinkModel, - TimeRange, - TimeZone, -} from '../types'; import { ScopedVars } from '../types/ScopedVars'; +import { DataFrame, Field, FieldConfig, FieldType } from '../types/dataFrame'; +import { LinkModel } from '../types/dataLink'; +import { DisplayValue, DisplayValueAlignmentFactors } from '../types/displayValue'; +import { FieldConfigSource } from '../types/fieldOverrides'; +import { InterpolateFunction } from '../types/panel'; +import { TimeRange, TimeZone } from '../types/time'; import { getDisplayProcessor } from './displayProcessor'; import { getFieldDisplayName } from './fieldState'; diff --git a/packages/grafana-data/src/field/fieldOverrides.test.ts b/packages/grafana-data/src/field/fieldOverrides.test.ts index 6268bfc591d..c6bba4debf3 100644 --- a/packages/grafana-data/src/field/fieldOverrides.test.ts +++ b/packages/grafana-data/src/field/fieldOverrides.test.ts @@ -1,21 +1,15 @@ import { ArrayDataFrame } from '../dataframe/ArrayDataFrame'; import { createDataFrame, toDataFrame } from '../dataframe/processDataFrame'; -import { rangeUtil } from '../datetime'; +import { relativeToTimeRange } from '../datetime/rangeutil'; import { createTheme } from '../themes'; import { FieldMatcherID } from '../transformations/matchers/ids'; -import { - DataFrame, - Field, - FieldColorModeId, - FieldConfig, - FieldConfigPropertyItem, - FieldConfigSource, - FieldType, - GrafanaConfig, - InterpolateFunction, - ScopedVars, - ThresholdsMode, -} from '../types'; +import { ScopedVars } from '../types/ScopedVars'; +import { GrafanaConfig } from '../types/config'; +import { FieldType, DataFrame, Field, FieldConfig } from '../types/dataFrame'; +import { FieldColorModeId } from '../types/fieldColor'; +import { FieldConfigPropertyItem, FieldConfigSource } from '../types/fieldOverrides'; +import { InterpolateFunction } from '../types/panel'; +import { ThresholdsMode } from '../types/thresholds'; import { Registry } from '../utils/Registry'; import { locationUtil } from '../utils/location'; import { mockStandardProperties } from '../utils/tests/mockStandardProperties'; @@ -912,7 +906,7 @@ describe('getLinksSupplier', () => { }); const datasourceUid = '1234'; - const range = rangeUtil.relativeToTimeRange({ from: 600, to: 0 }); + const range = relativeToTimeRange({ from: 600, to: 0 }); const f0 = createDataFrame({ name: 'A', fields: [ diff --git a/packages/grafana-data/src/field/fieldOverrides.ts b/packages/grafana-data/src/field/fieldOverrides.ts index 8b170606507..47f5552a0ce 100644 --- a/packages/grafana-data/src/field/fieldOverrides.ts +++ b/packages/grafana-data/src/field/fieldOverrides.ts @@ -11,31 +11,21 @@ import { GrafanaTheme2 } from '../themes'; import { asHexString } from '../themes/colorManipulator'; import { ReducerID, reduceField } from '../transformations/fieldReducer'; import { fieldMatchers } from '../transformations/matchers'; +import { ScopedVars, DataContextScopedVar } from '../types/ScopedVars'; +import { DataFrame, NumericRange, FieldType, Field, ValueLinkConfig, FieldConfig } from '../types/dataFrame'; +import { LinkModel, DataLink } from '../types/dataLink'; +import { DisplayProcessor, DisplayValue, DecimalCount } from '../types/displayValue'; +import { FieldColorModeId } from '../types/fieldColor'; import { - ApplyFieldOverrideOptions, - DataContextScopedVar, - DataFrame, - DataLink, - DecimalCount, - DisplayProcessor, - DisplayValue, DynamicConfigValue, - Field, - FieldColorModeId, - FieldConfig, - FieldConfigPropertyItem, - FieldConfigSource, + ApplyFieldOverrideOptions, FieldOverrideContext, - FieldType, + FieldConfigPropertyItem, DataLinkPostProcessor, - InterpolateFunction, - LinkModel, - NumericRange, - PanelData, - ScopedVars, - TimeZone, - ValueLinkConfig, -} from '../types'; + FieldConfigSource, +} from '../types/fieldOverrides'; +import { InterpolateFunction, PanelData } from '../types/panel'; +import { TimeZone } from '../types/time'; import { FieldMatcher } from '../types/transformations'; import { mapInternalLinkToExplore } from '../utils/dataLinks'; import { locationUtil } from '../utils/location'; diff --git a/packages/grafana-data/src/field/fieldState.test.ts b/packages/grafana-data/src/field/fieldState.test.ts index 3e1ef1ac9db..91a5fca2d52 100644 --- a/packages/grafana-data/src/field/fieldState.test.ts +++ b/packages/grafana-data/src/field/fieldState.test.ts @@ -1,5 +1,5 @@ import { toDataFrame } from '../dataframe/processDataFrame'; -import { DataFrame, TIME_SERIES_VALUE_FIELD_NAME, FieldType, TIME_SERIES_TIME_FIELD_NAME } from '../types'; +import { DataFrame, TIME_SERIES_TIME_FIELD_NAME, FieldType, TIME_SERIES_VALUE_FIELD_NAME } from '../types/dataFrame'; import { getFieldDisplayName, getFrameDisplayName } from './fieldState'; diff --git a/packages/grafana-data/src/field/fieldState.ts b/packages/grafana-data/src/field/fieldState.ts index be225d2f0b0..2ec8942fcfe 100644 --- a/packages/grafana-data/src/field/fieldState.ts +++ b/packages/grafana-data/src/field/fieldState.ts @@ -1,12 +1,12 @@ import { getFieldMatcher } from '../transformations/matchers'; import { DataFrame, - Field, - TIME_SERIES_VALUE_FIELD_NAME, FieldType, + Field, TIME_SERIES_TIME_FIELD_NAME, - FieldConfigSource, -} from '../types'; + TIME_SERIES_VALUE_FIELD_NAME, +} from '../types/dataFrame'; +import { FieldConfigSource } from '../types/fieldOverrides'; import { formatLabels } from '../utils/labels'; /** diff --git a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts index 49c56d59891..6b81610d4f2 100644 --- a/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts +++ b/packages/grafana-data/src/field/getFieldDisplayValuesProxy.ts @@ -1,6 +1,8 @@ import { toNumber } from 'lodash'; -import { DataFrame, DisplayValue, TimeZone } from '../types'; +import { DataFrame } from '../types/dataFrame'; +import { DisplayValue } from '../types/displayValue'; +import { TimeZone } from '../types/time'; import { formattedValueToString } from '../valueFormats/valueFormats'; import { getDisplayProcessor } from './displayProcessor'; diff --git a/packages/grafana-data/src/field/overrides/processors.ts b/packages/grafana-data/src/field/overrides/processors.ts index fbd40d9d890..ee396ebba01 100644 --- a/packages/grafana-data/src/field/overrides/processors.ts +++ b/packages/grafana-data/src/field/overrides/processors.ts @@ -1,12 +1,10 @@ -import { - DataLink, - Field, - FieldOverrideContext, - SelectableValue, - SliderMarks, - ThresholdsConfig, - ValueMapping, -} from '../../types'; +import { Field } from '../../types/dataFrame'; +import { DataLink } from '../../types/dataLink'; +import { FieldOverrideContext } from '../../types/fieldOverrides'; +import { SelectableValue } from '../../types/select'; +import { SliderMarks } from '../../types/slider'; +import { ThresholdsConfig } from '../../types/thresholds'; +import { ValueMapping } from '../../types/valueMapping'; export const identityOverrideProcessor = (value: T) => { return value; diff --git a/packages/grafana-data/src/field/scale.test.ts b/packages/grafana-data/src/field/scale.test.ts index 9ba0cb6227b..ba941992765 100644 --- a/packages/grafana-data/src/field/scale.test.ts +++ b/packages/grafana-data/src/field/scale.test.ts @@ -1,5 +1,7 @@ import { createTheme } from '../themes'; -import { ThresholdsMode, Field, FieldType, FieldColorModeId } from '../types'; +import { Field, FieldType } from '../types/dataFrame'; +import { FieldColorModeId } from '../types/fieldColor'; +import { ThresholdsMode } from '../types/thresholds'; import { getScaleCalculator } from './scale'; import { sortThresholds } from './thresholds'; diff --git a/packages/grafana-data/src/field/scale.ts b/packages/grafana-data/src/field/scale.ts index c8624e6086f..f578942924f 100644 --- a/packages/grafana-data/src/field/scale.ts +++ b/packages/grafana-data/src/field/scale.ts @@ -2,7 +2,8 @@ import { isNumber } from 'lodash'; import { GrafanaTheme2 } from '../themes/types'; import { reduceField, ReducerID } from '../transformations/fieldReducer'; -import { Field, FieldConfig, FieldType, NumericRange, Threshold } from '../types'; +import { Field, FieldConfig, FieldType, NumericRange } from '../types/dataFrame'; +import { Threshold } from '../types/thresholds'; import { getFieldColorModeForField } from './fieldColor'; import { getActiveThresholdForValue } from './thresholds'; diff --git a/packages/grafana-data/src/field/standardFieldConfigEditorRegistry.ts b/packages/grafana-data/src/field/standardFieldConfigEditorRegistry.ts index 6f8beee78ae..2bc3ac995be 100644 --- a/packages/grafana-data/src/field/standardFieldConfigEditorRegistry.ts +++ b/packages/grafana-data/src/field/standardFieldConfigEditorRegistry.ts @@ -1,7 +1,9 @@ import { ComponentType } from 'react'; import { EventBus } from '../events'; -import { DataFrame, InterpolateFunction, VariableSuggestionsScope, VariableSuggestion } from '../types'; +import { DataFrame } from '../types/dataFrame'; +import { VariableSuggestionsScope, VariableSuggestion } from '../types/dataLink'; +import { InterpolateFunction } from '../types/panel'; import { Registry, RegistryItem } from '../utils/Registry'; import { FieldConfigOptionsRegistry } from './FieldConfigOptionsRegistry'; diff --git a/packages/grafana-data/src/field/thresholds.test.ts b/packages/grafana-data/src/field/thresholds.test.ts index 77df5edf76e..0a01d7a9270 100644 --- a/packages/grafana-data/src/field/thresholds.test.ts +++ b/packages/grafana-data/src/field/thresholds.test.ts @@ -1,4 +1,5 @@ -import { ThresholdsConfig, ThresholdsMode, FieldConfig, Threshold, Field, FieldType } from '../types'; +import { Field, FieldConfig, FieldType } from '../types/dataFrame'; +import { Threshold, ThresholdsConfig, ThresholdsMode } from '../types/thresholds'; import { validateFieldConfig } from './fieldOverrides'; import { sortThresholds, getActiveThreshold, getActiveThresholdForValue } from './thresholds'; diff --git a/packages/grafana-data/src/field/thresholds.ts b/packages/grafana-data/src/field/thresholds.ts index a756af17114..71c59156822 100644 --- a/packages/grafana-data/src/field/thresholds.ts +++ b/packages/grafana-data/src/field/thresholds.ts @@ -1,4 +1,6 @@ -import { Threshold, FALLBACK_COLOR, Field, ThresholdsMode } from '../types'; +import { Field } from '../types/dataFrame'; +import { FALLBACK_COLOR } from '../types/fieldColor'; +import { Threshold, ThresholdsMode } from '../types/thresholds'; export const fallBackThreshold: Threshold = { value: 0, color: FALLBACK_COLOR }; diff --git a/packages/grafana-data/src/geo/layer.ts b/packages/grafana-data/src/geo/layer.ts index e034fdb1cf5..7b21393ae19 100644 --- a/packages/grafana-data/src/geo/layer.ts +++ b/packages/grafana-data/src/geo/layer.ts @@ -7,7 +7,7 @@ import { MapLayerOptions, FrameGeometrySourceMode } from '@grafana/schema'; import { EventBus } from '../events'; import { StandardEditorContext } from '../field/standardFieldConfigEditorRegistry'; import { GrafanaTheme2 } from '../themes'; -import { PanelData } from '../types'; +import { PanelData } from '../types/panel'; import { PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders'; import { RegistryItemWithOptions } from '../utils/Registry'; diff --git a/packages/grafana-data/src/index.ts b/packages/grafana-data/src/index.ts index 1ed254b828c..97860df3a19 100644 --- a/packages/grafana-data/src/index.ts +++ b/packages/grafana-data/src/index.ts @@ -4,8 +4,6 @@ * @packageDocumentation */ -export * from './types'; -export * from './datetime'; export * from './text'; export * from './events'; export * from './themes'; @@ -85,7 +83,6 @@ export { export { compareDataFrameStructures, compareArrayValues, shallowCompare } from './dataframe/frameComparisons'; // Field - export { getFieldColorModeForField, getFieldColorMode, @@ -163,7 +160,6 @@ export { } from './field/overrides/processors'; // Utils - export { PanelOptionsEditorBuilder, FieldConfigEditorBuilder } from './utils/OptionsUIBuilders'; export { getFlotPairs, getFlotPairsConstant } from './utils/flotPairs'; export { locationUtil } from './utils/location'; @@ -222,7 +218,6 @@ export { store } from './utils/store'; export { LocalStorageValueProvider } from './utils/LocalStorageValueProvider'; // Tranformations - export { standardTransformers } from './transformations/transformers'; export { fieldMatchers, @@ -273,7 +268,6 @@ export { applyNullInsertThreshold } from './transformations/transformers/nulls/n export { nullToValue } from './transformations/transformers/nulls/nullToValue'; // ValueFormats - export { type FormattedValue, type ValueFormatter, @@ -295,6 +289,71 @@ export { getValueFormats, } from './valueFormats/valueFormats'; +// datetime +export * as dateMath from './datetime/datemath'; +export * as rangeUtil from './datetime/rangeutil'; +export { type DateTimeOptions, setTimeZoneResolver, type TimeZoneResolver, getTimeZone } from './datetime/common'; +export { + ISO_8601, + type DateTimeBuiltinFormat, + type DateTimeInput, + type FormatInput, + type DurationInput, + type DurationUnit, + type DateTimeLocale, + type DateTimeDuration, + type DateTime, + setLocale, + getLocale, + getLocaleData, + isDateTimeInput, + isDateTime, + toUtc, + toDuration, + dateTime, + dateTimeAsMoment, + dateTimeForTimeZone, + getWeekdayIndex, + getWeekdayIndexByEnglishName, + setWeekStart, +} from './datetime/moment_wrapper'; +export { + InternalTimeZones, + timeZoneFormatUserFriendly, + getZone, + type TimeZoneCountry, + type TimeZoneInfo, + type GroupedTimeZones, + getTimeZoneInfo, + getTimeZones, + getTimeZoneGroups, +} from './datetime/timezones'; +export { + type SystemDateFormatSettings, + SystemDateFormatsState, + localTimeFormat, + systemDateFormats, +} from './datetime/formats'; +export { + type DateTimeOptionsWithFormat, + dateTimeFormat, + dateTimeFormatISO, + dateTimeFormatTimeAgo, + dateTimeFormatWithAbbrevation, + timeZoneAbbrevation, +} from './datetime/formatter'; +export { type DateTimeOptionsWhenParsing, dateTimeParse } from './datetime/parser'; +export { + intervalToAbbreviatedDurationString, + parseDuration, + addDurationToDate, + durationToMilliseconds, + isValidDate, + isValidDuration, + isValidGoDuration, + isValidGrafanaDuration, +} from './datetime/durationutil'; + export { type ValueMatcherOptions, type BasicValueMatcherOptions, @@ -323,6 +382,404 @@ export { usePluginContext } from './context/plugins/usePluginContext'; export { isDataSourcePluginContext } from './context/plugins/guards'; export { getLinksSupplier } from './field/fieldOverrides'; +// Types +export { isUnsignedPluginSignature } from './types/pluginSignature'; +export type { + CurrentUserDTO, + AnalyticsSettings, + BootData, + OAuth, + OAuthSettings, + AuthSettings, + GrafanaConfig, + BuildInfo, + LicenseInfo, +} from './types/config'; +export { availableIconsIndex, type IconName, isIconName, toIconName } from './types/icon'; +export type { WithAccessControlMetadata } from './types/accesscontrol'; +export { AlertState, type AlertStateInfo } from './types/alerts'; +export type { CartesianCoords2D, Dimensions2D } from './types/geometry'; +export { + VariableSupportType, + VariableSupportBase, + StandardVariableSupport, + CustomVariableSupport, + DataSourceVariableSupport, + type StandardVariableQuery, +} from './types/variables'; +export { + type AlertPayload, + type AlertErrorPayload, + AppEvents, + PanelEvents, + type LegacyGraphHoverEventPayload, + LegacyGraphHoverEvent, + LegacyGraphHoverClearEvent, +} from './types/legacyEvents'; +export type { + URLRangeValue, + URLRange, + ExploreUrlState, + ExplorePanelsState, + ExploreCorrelationHelperData, + ExploreTracePanelState, + ExploreLogsPanelState, + SplitOpenOptions, + SplitOpen, +} from './types/explore'; +export type { TraceKeyValuePair, TraceLog, TraceSpanReference, TraceSpanRow } from './types/trace'; +export type { FlotDataPoint } from './types/flot'; +export { type UserOrgDTO, OrgRole } from './types/orgs'; +export { GrafanaThemeType, type GrafanaThemeCommons, type GrafanaTheme } from './types/theme'; +export { FieldColorModeId, type FieldColor, type FieldColorSeriesByMode, FALLBACK_COLOR } from './types/fieldColor'; +export { + VariableRefresh, + VariableSort, + VariableHide, + type VariableType, + type VariableModel, + type TypedVariableModel, + type AdHocVariableFilter, + type AdHocVariableModel, + type GroupByVariableModel, + type VariableOption, + type IntervalVariableModel, + type CustomVariableModel, + type DataSourceVariableModel, + type QueryVariableModel, + type TextBoxVariableModel, + type ConstantVariableModel, + type VariableWithMultiSupport, + type VariableWithOptions, + type DashboardProps, + type DashboardVariableModel, + type OrgProps, + type OrgVariableModel, + type UserProps, + type UserVariableModel, + type SystemVariable, + type BaseVariableModel, +} from './types/templateVars'; +export { type Threshold, ThresholdsMode, type ThresholdsConfig } from './types/thresholds'; +export { + LiveChannelScope, + LiveChannelType, + LiveChannelConnectionState, + LiveChannelEventType, + type LiveChannelStatusEvent, + type LiveChannelJoinEvent, + type LiveChannelLeaveEvent, + type LiveChannelMessageEvent, + type LiveChannelEvent, + type LiveChannelPresenceStatus, + type LiveChannelId, + type LiveChannelAddress, + isLiveChannelStatusEvent, + isLiveChannelJoinEvent, + isLiveChannelLeaveEvent, + isLiveChannelMessageEvent, + parseLiveChannelAddress, + isValidLiveChannelAddress, + toLiveChannelId, +} from './types/live'; +export type { SliderMarks } from './types/slider'; +export type { FeatureToggles } from './types/featureToggles.gen'; +export { + PluginExtensionTypes, + PluginExtensionPoints, + type PluginExtension, + type PluginExtensionLink, + type PluginExtensionComponent, + type PluginExtensionConfig, + type PluginExtensionLinkConfig, + type PluginExtensionComponentConfig, + type PluginExtensionEventHelpers, + type PluginExtensionPanelContext, + type PluginExtensionDataSourceConfigContext, + type PluginExtensionCommandPaletteContext, + type PluginExtensionOpenModalOptions, +} from './types/pluginExtensions'; +export { + type ScopeDashboardBindingSpec, + type ScopeDashboardBinding, + type ScopeFilterOperator, + type ScopeSpecFilter, + type ScopeSpec, + type Scope, + type ScopeNodeNodeType, + type ScopeNodeLinkType, + type ScopeNodeSpec, + type ScopeNode, + scopeFilterOperatorMap, +} from './types/scopes'; +export { + PluginState, + PluginType, + PluginSignatureStatus, + PluginSignatureType, + PluginErrorCode, + PluginIncludeType, + GrafanaPlugin, + type PluginError, + type AngularMeta, + type PluginMeta, + type PluginDependencies, + type PluginInclude, + type PluginBuildInfo, + type ScreenshotInfo, + type PluginMetaInfo, + type PluginConfigPageProps, + type PluginConfigPage, +} from './types/plugin'; +export { + type InterpolateFunction, + type PanelPluginMeta, + type PanelData, + type PanelProps, + type PanelEditorProps, + type PanelMigrationHandler, + type PanelTypeChangedHandler, + type PanelOptionEditorsRegistry, + type PanelOptionsEditorProps, + type PanelOptionsEditorItem, + type PanelOptionsEditorConfig, + type PanelMenuItem, + type AngularPanelMenuItem, + type PanelPluginDataSupport, + type VisualizationSuggestion, + type PanelDataSummary, + type VisualizationSuggestionsSupplier, + VizOrientation, + VisualizationSuggestionScore, + VisualizationSuggestionsBuilder, + VisualizationSuggestionsListAppender, +} from './types/panel'; +export { + type DataSourcePluginOptionsEditorProps, + type DataSourceQueryType, + type DataSourceOptionsType, + type DataSourcePluginMeta, + type DataSourcePluginComponents, + type DataSourceConstructor, + type DataSourceGetTagKeysOptions, + type DataSourceGetTagValuesOptions, + type MetadataInspectorProps, + type LegacyMetricFindQueryOptions, + type QueryEditorProps, + type QueryEditorHelpProps, + type LegacyResponseData, + type DataQueryResponseData, + type DataQueryResponse, + type TestDataSourceResponse, + type DataQueryError, + type DataQueryRequest, + type DataQueryTimings, + type QueryFix, + type QueryFixType, + type QueryFixAction, + type QueryHint, + type MetricFindValue, + type DataSourceJsonData, + type DataSourceSettings, + type DataSourceInstanceSettings, + type DataSourceSelectItem, + type AnnotationQueryRequest, + type HistoryItem, + type GetTagResponse, + DataSourcePlugin, + DataQueryErrorType, + ExploreMode, + LanguageProvider, + DataSourceApi, +} from './types/datasource'; +export { CoreApp, type AppRootProps, type AppPluginMeta, AppPlugin, FeatureState } from './types/app'; +export { patchArrayVectorProrotypeMethods } from './types/vector'; +export { + type DynamicConfigValue, + type ConfigOverrideRule, + type SystemConfigOverrideRule, + isSystemOverrideWithRef, + isSystemOverride, + type FieldConfigSource, + type FieldOverrideContext, + type FieldConfigEditorProps, + type FieldOverrideEditorProps, + type FieldConfigEditorConfig, + type FieldConfigPropertyItem, + type DataLinkPostProcessorOptions, + type DataLinkPostProcessor, + type ApplyFieldOverrideOptions, + FieldConfigProperty, +} from './types/fieldOverrides'; +export { + type MatcherConfig, + type DataTransformContext, + type TransformationApplicabilityScore, + TransformationApplicabilityLevels, + type DataTransformerInfo, + type CustomTransformOperator, + type SynchronousDataTransformerInfo, + type DataTransformerConfig, + type FrameMatcher, + type FieldMatcher, + type ValueMatcher, + type FieldMatcherInfo, + type FrameMatcherInfo, + type ValueMatcherInfo, + SpecialValue, +} from './types/transformations'; +export type { ScopedVar, ScopedVars, DataContextScopedVar } from './types/ScopedVars'; +export type { YAxis, GraphSeriesValue, GraphSeriesXY, CreatePlotOverlay } from './types/graph'; +export type { + DisplayProcessor, + DisplayValue, + DisplayValueAlignmentFactors, + DecimalCount, + DecimalInfo, +} from './types/displayValue'; +export { + MappingType, + type ValueMappingResult, + type ValueMap, + type RangeMapOptions, + type RangeMap, + type RegexMapOptions, + type RegexMap, + type SpecialValueOptions, + SpecialValueMatch, + type SpecialValueMap, + type ValueMapping, +} from './types/valueMapping'; +export { + type RawTimeRange, + type TimeRange, + type RelativeTimeRange, + type AbsoluteTimeRange, + type IntervalValues, + type TimeOption, + type TimeZone, + type TimeZoneBrowser, + type TimeZoneUtc, + DefaultTimeZone, + type TimeOptions, + type TimeFragment, + TIME_FORMAT, + getDefaultTimeRange, + getDefaultRelativeTimeRange, + makeTimeRange, +} from './types/time'; +export type { SelectableValue } from './types/select'; +export { type NavLinkDTO, type NavModelItem, type NavModel, type NavIndex, PageLayoutType } from './types/navModel'; +export { LogsDedupStrategy, LogsSortOrder } from '@grafana/schema'; + +export { + LogLevel, + NumericLogLevel, + LogsMetaKind, + type LogsMetaItem, + type LogRowModel, + type LogsModel, + type LogSearchMatch, + type LogLabelStatsModel, + LogsDedupDescription, + type LogRowContextOptions, + LogRowContextQueryDirection, + type DataSourceWithLogsContextSupport, + hasLogsContextSupport, + SupplementaryQueryType, + type SupplementaryQueryOptions, + type LogsVolumeOption, + type LogsSampleOptions, + LogsVolumeType, + type LogsVolumeCustomMetaData, + type DataSourceWithSupplementaryQueriesSupport, + hasSupplementaryQuerySupport, + hasLogsContextUiSupport, + type QueryFilterOptions, + type ToggleFilterAction, + type DataSourceWithToggleableQueryFiltersSupport, + type DataSourceWithQueryModificationSupport, + hasToggleableQueryFiltersSupport, + hasQueryModificationSupport, +} from './types/logs'; +export { + type AnnotationQuery, + type AnnotationEvent, + type AnnotationEventUIModel, + type AnnotationEventFieldMapping, + type AnnotationEventMappings, + type AnnotationSupport, + AnnotationEventFieldSource, +} from './types/annotations'; +export { + DataTopic, + type DataQuery, + type DataSourceRef, + type AbstractQuery, + AbstractLabelOperator, + type AbstractLabelMatcher, + type DataSourceWithQueryImportSupport, + type DataSourceWithQueryExportSupport, + hasQueryImportSupport, + hasQueryExportSupport, +} from './types/query'; +export { DashboardCursorSync, type PanelModel } from './types/dashboard'; +export { + type DataLink, + type DataLinkClickEvent, + type DataLinkTransformationConfig, + DataLinkConfigOrigin, + SupportedTransformationType, + type InternalDataLink, + type LinkTarget, + type LinkModel, + type LinkModelSupplier, + VariableOrigin, + type VariableSuggestion, + VariableSuggestionsScope, +} from './types/dataLink'; +export { DataFrameType } from './types/dataFrameTypes'; +export { + FieldType, + type FieldConfig, + type FieldTypeConfig, + type EnumFieldConfig, + type ValueLinkConfig, + type Field, + type FieldState, + type NumericRange, + type DataFrame, + type DataFrameWithValue, + type FieldDTO, + type DataFrameDTO, + type FieldCalcs, + TIME_SERIES_VALUE_FIELD_NAME, + TIME_SERIES_TIME_FIELD_NAME, + TIME_SERIES_METRIC_FIELD_NAME, + type DataFrameFieldIndex, +} from './types/dataFrame'; +export { + type KeyValue, + LoadingState, + preferredVisualizationTypes, + type PreferredVisualisationType, + type QueryResultMeta, + type QueryResultMetaStat, + type QueryResultMetaNotice, + type QueryResultBase, + type Labels, + type Column, + type TableData, + type TimeSeriesValue, + type TimeSeriesPoints, + type TimeSeries, + NullValueMode, + type DataConfigSource, + isTruthy, + isObject, +} from './types/data'; +export { GAUGE_DEFAULT_MINIMUM, GAUGE_DEFAULT_MAXIMUM, DEFAULT_SAML_NAME } from './types/constants'; + // deprecated export { CircularVector } from './vector/CircularVector'; export { vectorator } from './vector/FunctionalVector'; diff --git a/packages/grafana-data/src/panel/PanelPlugin.test.tsx b/packages/grafana-data/src/panel/PanelPlugin.test.tsx index eab21a06f42..50801dd8a84 100644 --- a/packages/grafana-data/src/panel/PanelPlugin.test.tsx +++ b/packages/grafana-data/src/panel/PanelPlugin.test.tsx @@ -4,7 +4,7 @@ import { standardEditorsRegistry, standardFieldConfigEditorRegistry, } from '../field/standardFieldConfigEditorRegistry'; -import { FieldConfigProperty, FieldConfigPropertyItem } from '../types'; +import { FieldConfigProperty, FieldConfigPropertyItem } from '../types/fieldOverrides'; import { PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders'; import { PanelPlugin } from './PanelPlugin'; diff --git a/packages/grafana-data/src/panel/PanelPlugin.ts b/packages/grafana-data/src/panel/PanelPlugin.ts index 8d21b9b77b5..c4b2e0ed037 100644 --- a/packages/grafana-data/src/panel/PanelPlugin.ts +++ b/packages/grafana-data/src/panel/PanelPlugin.ts @@ -3,18 +3,17 @@ import { ComponentClass, ComponentType } from 'react'; import { FieldConfigOptionsRegistry } from '../field/FieldConfigOptionsRegistry'; import { StandardEditorContext } from '../field/standardFieldConfigEditorRegistry'; +import { FieldConfigProperty, FieldConfigSource } from '../types/fieldOverrides'; import { - FieldConfigProperty, - FieldConfigSource, - GrafanaPlugin, + PanelPluginMeta, + VisualizationSuggestionsSupplier, + PanelProps, PanelEditorProps, PanelMigrationHandler, - PanelPluginDataSupport, - PanelPluginMeta, - PanelProps, PanelTypeChangedHandler, - VisualizationSuggestionsSupplier, -} from '../types'; + PanelPluginDataSupport, +} from '../types/panel'; +import { GrafanaPlugin } from '../types/plugin'; import { FieldConfigEditorBuilder, PanelOptionsEditorBuilder } from '../utils/OptionsUIBuilders'; import { deprecationWarning } from '../utils/deprecationWarning'; diff --git a/packages/grafana-data/src/rbac/rbac.ts b/packages/grafana-data/src/rbac/rbac.ts index 90e87522caa..02fea0b13d1 100644 --- a/packages/grafana-data/src/rbac/rbac.ts +++ b/packages/grafana-data/src/rbac/rbac.ts @@ -1,4 +1,5 @@ -import { CurrentUserDTO, WithAccessControlMetadata } from '../types'; +import { WithAccessControlMetadata } from '../types/accesscontrol'; +import { CurrentUserDTO } from '../types/config'; export interface CurrentUser extends Omit {} diff --git a/packages/grafana-data/src/themes/createV1Theme.ts b/packages/grafana-data/src/themes/createV1Theme.ts index a4754db37e6..61f1f85fbd1 100644 --- a/packages/grafana-data/src/themes/createV1Theme.ts +++ b/packages/grafana-data/src/themes/createV1Theme.ts @@ -1,4 +1,4 @@ -import { GrafanaTheme, GrafanaThemeCommons, GrafanaThemeType } from '../types'; +import { GrafanaTheme, GrafanaThemeCommons, GrafanaThemeType } from '../types/theme'; import { GrafanaTheme2 } from './types'; diff --git a/packages/grafana-data/src/themes/createVisualizationColors.ts b/packages/grafana-data/src/themes/createVisualizationColors.ts index 89ccd9bbd20..36b908add01 100644 --- a/packages/grafana-data/src/themes/createVisualizationColors.ts +++ b/packages/grafana-data/src/themes/createVisualizationColors.ts @@ -1,4 +1,4 @@ -import { FALLBACK_COLOR } from '../types'; +import { FALLBACK_COLOR } from '../types/fieldColor'; import { ThemeColors } from './createColors'; diff --git a/packages/grafana-data/src/transformations/fieldReducer.test.ts b/packages/grafana-data/src/transformations/fieldReducer.test.ts index f155a62e511..baa5d704911 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.test.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.test.ts @@ -1,7 +1,8 @@ import { difference } from 'lodash'; import { createDataFrame, guessFieldTypeFromValue } from '../dataframe/processDataFrame'; -import { Field, FieldType, NullValueMode } from '../types/index'; +import { NullValueMode } from '../types/data'; +import { Field, FieldType } from '../types/dataFrame'; import { fieldReducers, ReducerID, reduceField, defaultCalcs } from './fieldReducer'; diff --git a/packages/grafana-data/src/transformations/fieldReducer.ts b/packages/grafana-data/src/transformations/fieldReducer.ts index b3d547184cb..d0bd2e9a178 100644 --- a/packages/grafana-data/src/transformations/fieldReducer.ts +++ b/packages/grafana-data/src/transformations/fieldReducer.ts @@ -1,7 +1,8 @@ // Libraries import { isNumber } from 'lodash'; -import { NullValueMode, Field, FieldCalcs, FieldType } from '../types/index'; +import { NullValueMode } from '../types/data'; +import { Field, FieldCalcs, FieldType } from '../types/dataFrame'; import { Registry, RegistryItem } from '../utils/Registry'; export enum ReducerID { diff --git a/packages/grafana-data/src/transformations/matchers/fieldValueMatcher.test.ts b/packages/grafana-data/src/transformations/matchers/fieldValueMatcher.test.ts index 90dac69896f..3e4773f9fec 100644 --- a/packages/grafana-data/src/transformations/matchers/fieldValueMatcher.test.ts +++ b/packages/grafana-data/src/transformations/matchers/fieldValueMatcher.test.ts @@ -1,8 +1,8 @@ import { ComparisonOperation } from '@grafana/schema'; import { toDataFrame } from '../../dataframe/processDataFrame'; -import { FieldMatcher } from '../../types'; import { DataFrame, FieldType } from '../../types/dataFrame'; +import { FieldMatcher } from '../../types/transformations'; import { ReducerID } from '../fieldReducer'; import { fieldValueMatcherInfo } from './fieldValueMatcher'; diff --git a/packages/grafana-data/src/transformations/matchers/nameMatcher.test.ts b/packages/grafana-data/src/transformations/matchers/nameMatcher.test.ts index ec1ce239664..f55bc1fce61 100644 --- a/packages/grafana-data/src/transformations/matchers/nameMatcher.test.ts +++ b/packages/grafana-data/src/transformations/matchers/nameMatcher.test.ts @@ -1,5 +1,5 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { FieldType, DataFrame } from '../../types'; +import { DataFrame, FieldType } from '../../types/dataFrame'; import { getFieldMatcher } from '../matchers'; import { FieldMatcherID } from './ids'; diff --git a/packages/grafana-data/src/transformations/standardTransformersRegistry.ts b/packages/grafana-data/src/transformations/standardTransformersRegistry.ts index e04950873be..87970a33994 100644 --- a/packages/grafana-data/src/transformations/standardTransformersRegistry.ts +++ b/packages/grafana-data/src/transformations/standardTransformersRegistry.ts @@ -1,6 +1,7 @@ import * as React from 'react'; -import { DataFrame, DataTransformerInfo } from '../types'; +import { DataFrame } from '../types/dataFrame'; +import { DataTransformerInfo } from '../types/transformations'; import { Registry, RegistryItem } from '../utils/Registry'; export interface TransformerUIProps { diff --git a/packages/grafana-data/src/transformations/transformDataFrame.test.ts b/packages/grafana-data/src/transformations/transformDataFrame.test.ts index 83643922401..1a61a26b432 100644 --- a/packages/grafana-data/src/transformations/transformDataFrame.test.ts +++ b/packages/grafana-data/src/transformations/transformDataFrame.test.ts @@ -1,7 +1,8 @@ import { map } from 'rxjs'; import { toDataFrame } from '../dataframe/processDataFrame'; -import { CustomTransformOperator, FieldType } from '../types'; +import { FieldType } from '../types/dataFrame'; +import { CustomTransformOperator } from '../types/transformations'; import { mockTransformationsRegistry } from '../utils/tests/mockTransformationsRegistry'; import { ReducerID } from './fieldReducer'; diff --git a/packages/grafana-data/src/transformations/transformDataFrame.ts b/packages/grafana-data/src/transformations/transformDataFrame.ts index 6717b6565a5..810177aa1c2 100644 --- a/packages/grafana-data/src/transformations/transformDataFrame.ts +++ b/packages/grafana-data/src/transformations/transformDataFrame.ts @@ -1,13 +1,13 @@ import { MonoTypeOperatorFunction, Observable, of } from 'rxjs'; import { map, mergeMap } from 'rxjs/operators'; +import { DataFrame } from '../types/dataFrame'; import { - DataFrame, + CustomTransformOperator, DataTransformContext, DataTransformerConfig, FrameMatcher, - CustomTransformOperator, -} from '../types'; +} from '../types/transformations'; import { getFrameMatchers } from './matchers'; import { standardTransformersRegistry, TransformerRegistryItem } from './standardTransformersRegistry'; diff --git a/packages/grafana-data/src/transformations/transformers/calculateField.test.ts b/packages/grafana-data/src/transformations/transformers/calculateField.test.ts index 7e2db7468d9..154083e3169 100644 --- a/packages/grafana-data/src/transformations/transformers/calculateField.test.ts +++ b/packages/grafana-data/src/transformations/transformers/calculateField.test.ts @@ -1,7 +1,8 @@ import { DataFrameView } from '../../dataframe/DataFrameView'; import { toDataFrame } from '../../dataframe/processDataFrame'; -import { DataTransformContext, ScopedVars } from '../../types'; +import { ScopedVars } from '../../types/ScopedVars'; import { FieldType } from '../../types/dataFrame'; +import { DataTransformContext } from '../../types/transformations'; import { BinaryOperationID } from '../../utils/binaryOperators'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { UnaryOperationID } from '../../utils/unaryOperators'; diff --git a/packages/grafana-data/src/transformations/transformers/calculateField.ts b/packages/grafana-data/src/transformations/transformers/calculateField.ts index 72c4f62c519..820ecdec7cf 100644 --- a/packages/grafana-data/src/transformations/transformers/calculateField.ts +++ b/packages/grafana-data/src/transformations/transformers/calculateField.ts @@ -3,7 +3,9 @@ import { map } from 'rxjs/operators'; import { getTimeField } from '../../dataframe/processDataFrame'; import { getFieldDisplayName } from '../../field/fieldState'; -import { DataFrame, DataTransformerInfo, Field, FieldType, NullValueMode } from '../../types'; +import { NullValueMode } from '../../types/data'; +import { DataFrame, FieldType, Field } from '../../types/dataFrame'; +import { DataTransformerInfo } from '../../types/transformations'; import { BinaryOperationID, binaryOperators } from '../../utils/binaryOperators'; import { UnaryOperationID, unaryOperators } from '../../utils/unaryOperators'; import { doStandardCalcs, fieldReducers, ReducerID } from '../fieldReducer'; diff --git a/packages/grafana-data/src/transformations/transformers/convertFieldType.ts b/packages/grafana-data/src/transformations/transformers/convertFieldType.ts index 669a9480bd1..7eda28e04f5 100644 --- a/packages/grafana-data/src/transformations/transformers/convertFieldType.ts +++ b/packages/grafana-data/src/transformations/transformers/convertFieldType.ts @@ -2,9 +2,9 @@ import { map } from 'rxjs/operators'; import { TimeZone } from '@grafana/schema'; -import { DateTimeOptionsWhenParsing, dateTimeParse } from '../../datetime'; -import { SynchronousDataTransformerInfo } from '../../types'; +import { dateTimeParse, DateTimeOptionsWhenParsing } from '../../datetime/parser'; import { DataFrame, EnumFieldConfig, Field, FieldType } from '../../types/dataFrame'; +import { SynchronousDataTransformerInfo } from '../../types/transformations'; import { fieldMatchers } from '../matchers'; import { FieldMatcherID } from '../matchers/ids'; diff --git a/packages/grafana-data/src/transformations/transformers/filterByName.test.ts b/packages/grafana-data/src/transformations/transformers/filterByName.test.ts index e357b2c6b40..82fe567ee3d 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByName.test.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByName.test.ts @@ -1,5 +1,5 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { ScopedVars } from '../../types'; +import { ScopedVars } from '../../types/ScopedVars'; import { FieldType } from '../../types/dataFrame'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts b/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts index 5d2ba4b10f9..a254707bb44 100644 --- a/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts +++ b/packages/grafana-data/src/transformations/transformers/filterByValue.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { DataTransformerConfig, FieldType, MatcherConfig } from '../../types'; +import { FieldType } from '../../types/dataFrame'; +import { DataTransformerConfig, MatcherConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { ValueMatcherID } from '../matchers/ids'; import { BasicValueMatcherOptions } from '../matchers/valueMatchers/types'; diff --git a/packages/grafana-data/src/transformations/transformers/formatString.ts b/packages/grafana-data/src/transformations/transformers/formatString.ts index 2e46e4d5a72..15041c0e947 100644 --- a/packages/grafana-data/src/transformations/transformers/formatString.ts +++ b/packages/grafana-data/src/transformations/transformers/formatString.ts @@ -1,6 +1,6 @@ import { map } from 'rxjs/operators'; -import { DataFrame, Field, FieldType } from '../../types'; +import { DataFrame, Field, FieldType } from '../../types/dataFrame'; import { DataTransformerInfo, FieldMatcher, TransformationApplicabilityLevels } from '../../types/transformations'; import { fieldMatchers } from '../matchers'; import { FieldMatcherID } from '../matchers/ids'; diff --git a/packages/grafana-data/src/transformations/transformers/formatTime.ts b/packages/grafana-data/src/transformations/transformers/formatTime.ts index f11c434a5fa..71310c4524b 100644 --- a/packages/grafana-data/src/transformations/transformers/formatTime.ts +++ b/packages/grafana-data/src/transformations/transformers/formatTime.ts @@ -3,8 +3,12 @@ import { map } from 'rxjs/operators'; import { TimeZone } from '@grafana/schema'; import { cacheFieldDisplayNames } from '../../field/fieldState'; -import { DataFrame, TransformationApplicabilityLevels } from '../../types'; -import { DataTransformContext, DataTransformerInfo } from '../../types/transformations'; +import { DataFrame } from '../../types/dataFrame'; +import { + DataTransformContext, + DataTransformerInfo, + TransformationApplicabilityLevels, +} from '../../types/transformations'; import { fieldToStringField } from './convertFieldType'; import { DataTransformerID } from './ids'; diff --git a/packages/grafana-data/src/transformations/transformers/groupBy.test.ts b/packages/grafana-data/src/transformations/transformers/groupBy.test.ts index 3485d6615b7..cbdcc0c402f 100644 --- a/packages/grafana-data/src/transformations/transformers/groupBy.test.ts +++ b/packages/grafana-data/src/transformations/transformers/groupBy.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { DataTransformerConfig, Field, FieldType } from '../../types'; +import { FieldType, Field } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { ReducerID } from '../fieldReducer'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/groupBy.ts b/packages/grafana-data/src/transformations/transformers/groupBy.ts index a8faf733e44..7bcb2ebc3e2 100644 --- a/packages/grafana-data/src/transformations/transformers/groupBy.ts +++ b/packages/grafana-data/src/transformations/transformers/groupBy.ts @@ -2,8 +2,8 @@ import { map } from 'rxjs/operators'; import { guessFieldTypeForField } from '../../dataframe/processDataFrame'; import { getFieldDisplayName } from '../../field/fieldState'; -import { DataFrame, Field, FieldType, TransformationApplicabilityLevels } from '../../types'; -import { DataTransformerInfo } from '../../types/transformations'; +import { DataFrame, Field, FieldType } from '../../types/dataFrame'; +import { DataTransformerInfo, TransformationApplicabilityLevels } from '../../types/transformations'; import { reduceField, ReducerID } from '../fieldReducer'; import { DataTransformerID } from './ids'; diff --git a/packages/grafana-data/src/transformations/transformers/groupToNestedTable.test.ts b/packages/grafana-data/src/transformations/transformers/groupToNestedTable.test.ts index d36a0ce1adf..2737732a383 100644 --- a/packages/grafana-data/src/transformations/transformers/groupToNestedTable.test.ts +++ b/packages/grafana-data/src/transformations/transformers/groupToNestedTable.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { DataTransformerConfig, Field, FieldType } from '../../types'; +import { FieldType, Field } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { ReducerID } from '../fieldReducer'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.test.ts b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.test.ts index 97270e24e89..057c41c2fec 100644 --- a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.test.ts +++ b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { DataTransformerConfig, FieldType, Field, SpecialValue } from '../../types'; +import { FieldType, Field } from '../../types/dataFrame'; +import { DataTransformerConfig, SpecialValue } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts index bb1dcd445d4..a71fb929c55 100644 --- a/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts +++ b/packages/grafana-data/src/transformations/transformers/groupingToMatrix.ts @@ -1,14 +1,8 @@ import { map } from 'rxjs/operators'; import { getFieldDisplayName } from '../../field/fieldState'; -import { - DataFrame, - DataTransformerInfo, - Field, - FieldType, - SpecialValue, - TransformationApplicabilityLevels, -} from '../../types'; +import { DataFrame, Field, FieldType } from '../../types/dataFrame'; +import { SpecialValue, DataTransformerInfo, TransformationApplicabilityLevels } from '../../types/transformations'; import { fieldMatchers } from '../matchers'; import { FieldMatcherID } from '../matchers/ids'; diff --git a/packages/grafana-data/src/transformations/transformers/histogram.ts b/packages/grafana-data/src/transformations/transformers/histogram.ts index 217caec18cb..a94cd182138 100644 --- a/packages/grafana-data/src/transformations/transformers/histogram.ts +++ b/packages/grafana-data/src/transformations/transformers/histogram.ts @@ -2,8 +2,9 @@ import { map } from 'rxjs/operators'; import { getDisplayProcessor } from '../../field/displayProcessor'; import { createTheme, GrafanaTheme2 } from '../../themes'; -import { DataFrameType, DataTransformContext, SynchronousDataTransformerInfo } from '../../types'; import { DataFrame, Field, FieldConfig, FieldType } from '../../types/dataFrame'; +import { DataFrameType } from '../../types/dataFrameTypes'; +import { DataTransformContext, SynchronousDataTransformerInfo } from '../../types/transformations'; import { roundDecimals } from '../../utils/numbers'; import { DataTransformerID } from './ids'; diff --git a/packages/grafana-data/src/transformations/transformers/joinByField.test.ts b/packages/grafana-data/src/transformations/transformers/joinByField.test.ts index 3673b82e050..897a03b7fe9 100644 --- a/packages/grafana-data/src/transformations/transformers/joinByField.test.ts +++ b/packages/grafana-data/src/transformations/transformers/joinByField.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { FieldType, DataTransformerConfig } from '../../types'; +import { FieldType } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/joinByField.ts b/packages/grafana-data/src/transformations/transformers/joinByField.ts index 7af73403164..127cb3a3bd2 100644 --- a/packages/grafana-data/src/transformations/transformers/joinByField.ts +++ b/packages/grafana-data/src/transformations/transformers/joinByField.ts @@ -1,6 +1,7 @@ import { map } from 'rxjs/operators'; -import { DataFrame, SynchronousDataTransformerInfo, FieldMatcher, DataTransformContext } from '../../types'; +import { DataFrame } from '../../types/dataFrame'; +import { DataTransformContext, FieldMatcher, SynchronousDataTransformerInfo } from '../../types/transformations'; import { fieldMatchers } from '../matchers'; import { FieldMatcherID } from '../matchers/ids'; diff --git a/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts b/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts index 21a780aae77..a2e5f0ad080 100644 --- a/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts +++ b/packages/grafana-data/src/transformations/transformers/joinDataFrames.ts @@ -1,5 +1,6 @@ import { getTimeField, sortDataFrame } from '../../dataframe/processDataFrame'; -import { DataFrame, Field, FieldMatcher, FieldType, TIME_SERIES_VALUE_FIELD_NAME } from '../../types'; +import { DataFrame, Field, FieldType, TIME_SERIES_VALUE_FIELD_NAME } from '../../types/dataFrame'; +import { FieldMatcher } from '../../types/transformations'; import { fieldMatchers } from '../matchers'; import { FieldMatcherID } from '../matchers/ids'; diff --git a/packages/grafana-data/src/transformations/transformers/labelsToFields.test.ts b/packages/grafana-data/src/transformations/transformers/labelsToFields.test.ts index e9061bdc248..ec578d99c5f 100644 --- a/packages/grafana-data/src/transformations/transformers/labelsToFields.test.ts +++ b/packages/grafana-data/src/transformations/transformers/labelsToFields.test.ts @@ -1,7 +1,8 @@ import { Subscription } from 'rxjs'; import { toDataFrame, toDataFrameDTO } from '../../dataframe/processDataFrame'; -import { DataFrame, DataTransformerConfig, FieldDTO, FieldType } from '../../types'; +import { DataFrame, FieldDTO, FieldType } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/labelsToFields.ts b/packages/grafana-data/src/transformations/transformers/labelsToFields.ts index c21a0ec2abd..b63af3d16cb 100644 --- a/packages/grafana-data/src/transformations/transformers/labelsToFields.ts +++ b/packages/grafana-data/src/transformations/transformers/labelsToFields.ts @@ -1,7 +1,8 @@ import { map } from 'rxjs/operators'; import { getFieldDisplayName } from '../../field/fieldState'; -import { DataFrame, Field, FieldType, SynchronousDataTransformerInfo } from '../../types'; +import { DataFrame, Field, FieldType } from '../../types/dataFrame'; +import { SynchronousDataTransformerInfo } from '../../types/transformations'; import { DataTransformerID } from './ids'; diff --git a/packages/grafana-data/src/transformations/transformers/limit.test.ts b/packages/grafana-data/src/transformations/transformers/limit.test.ts index 6608646b986..ea476b36446 100644 --- a/packages/grafana-data/src/transformations/transformers/limit.test.ts +++ b/packages/grafana-data/src/transformations/transformers/limit.test.ts @@ -1,7 +1,6 @@ -import { DataTransformerConfig } from '@grafana/data'; - import { toDataFrame } from '../../dataframe/processDataFrame'; -import { Field, FieldType } from '../../types'; +import { FieldType, Field } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/limit.ts b/packages/grafana-data/src/transformations/transformers/limit.ts index 2aa4d4c0fa2..a37bc7b2143 100644 --- a/packages/grafana-data/src/transformations/transformers/limit.ts +++ b/packages/grafana-data/src/transformations/transformers/limit.ts @@ -1,6 +1,6 @@ import { map } from 'rxjs/operators'; -import { DataTransformerInfo } from '../../types'; +import { DataTransformerInfo } from '../../types/transformations'; import { DataTransformerID } from './ids'; import { transformationsVariableSupport } from './utils'; diff --git a/packages/grafana-data/src/transformations/transformers/merge.test.ts b/packages/grafana-data/src/transformations/transformers/merge.test.ts index 35306cfebfd..81bcf535c7d 100644 --- a/packages/grafana-data/src/transformations/transformers/merge.test.ts +++ b/packages/grafana-data/src/transformations/transformers/merge.test.ts @@ -1,5 +1,7 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { DataTransformerConfig, DisplayProcessor, Field, FieldType } from '../../types'; +import { Field, FieldType } from '../../types/dataFrame'; +import { DisplayProcessor } from '../../types/displayValue'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/noop.ts b/packages/grafana-data/src/transformations/transformers/noop.ts index bf2d5f93c9b..c9ef44b2802 100644 --- a/packages/grafana-data/src/transformations/transformers/noop.ts +++ b/packages/grafana-data/src/transformations/transformers/noop.ts @@ -1,4 +1,4 @@ -import { DataFrame } from '../../types'; +import { DataFrame } from '../../types/dataFrame'; import { SynchronousDataTransformerInfo } from '../../types/transformations'; import { DataTransformerID } from './ids'; diff --git a/packages/grafana-data/src/transformations/transformers/nulls/nullInsertThreshold.test.ts b/packages/grafana-data/src/transformations/transformers/nulls/nullInsertThreshold.test.ts index b6b7e20f3f2..ac1c98f318b 100644 --- a/packages/grafana-data/src/transformations/transformers/nulls/nullInsertThreshold.test.ts +++ b/packages/grafana-data/src/transformations/transformers/nulls/nullInsertThreshold.test.ts @@ -1,5 +1,5 @@ import { createDataFrame } from '../../../dataframe/processDataFrame'; -import { FieldType } from '../../../types'; +import { FieldType } from '../../../types/dataFrame'; import { applyNullInsertThreshold } from './nullInsertThreshold'; diff --git a/packages/grafana-data/src/transformations/transformers/nulls/nullInsertThreshold.ts b/packages/grafana-data/src/transformations/transformers/nulls/nullInsertThreshold.ts index 6da2748415e..47411b7f3e7 100644 --- a/packages/grafana-data/src/transformations/transformers/nulls/nullInsertThreshold.ts +++ b/packages/grafana-data/src/transformations/transformers/nulls/nullInsertThreshold.ts @@ -1,4 +1,4 @@ -import { DataFrame, FieldType } from '../../../types'; +import { DataFrame, FieldType } from '../../../types/dataFrame'; type InsertMode = (prev: number, next: number, threshold: number) => number; diff --git a/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.test.ts b/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.test.ts index ac24f194954..03b21865798 100644 --- a/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.test.ts +++ b/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.test.ts @@ -1,5 +1,5 @@ import { createDataFrame } from '../../../dataframe/processDataFrame'; -import { FieldType } from '../../../types'; +import { FieldType } from '../../../types/dataFrame'; import { applyNullInsertThreshold } from './nullInsertThreshold'; import { nullToValue } from './nullToValue'; diff --git a/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.ts b/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.ts index a2d2eeb88c7..3e767b38d4d 100644 --- a/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.ts +++ b/packages/grafana-data/src/transformations/transformers/nulls/nullToValue.ts @@ -1,4 +1,4 @@ -import { DataFrame, Field } from '../../../types'; +import { DataFrame, Field } from '../../../types/dataFrame'; export function nullToValue(frame: DataFrame) { return { diff --git a/packages/grafana-data/src/transformations/transformers/order.test.ts b/packages/grafana-data/src/transformations/transformers/order.test.ts index 447823c8b07..50ebdba74bc 100644 --- a/packages/grafana-data/src/transformations/transformers/order.test.ts +++ b/packages/grafana-data/src/transformations/transformers/order.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { FieldType, DataTransformerConfig } from '../../types'; +import { FieldType } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/order.ts b/packages/grafana-data/src/transformations/transformers/order.ts index bd6a595e75b..897c3f9016a 100644 --- a/packages/grafana-data/src/transformations/transformers/order.ts +++ b/packages/grafana-data/src/transformations/transformers/order.ts @@ -2,7 +2,7 @@ import { clone } from 'lodash'; import { map } from 'rxjs/operators'; import { getFieldDisplayName } from '../../field/fieldState'; -import { DataFrame, Field } from '../../types'; +import { DataFrame, Field } from '../../types/dataFrame'; import { DataTransformerInfo } from '../../types/transformations'; import { DataTransformerID } from './ids'; diff --git a/packages/grafana-data/src/transformations/transformers/organize.test.ts b/packages/grafana-data/src/transformations/transformers/organize.test.ts index ce5eb838a56..ff98427c804 100644 --- a/packages/grafana-data/src/transformations/transformers/organize.test.ts +++ b/packages/grafana-data/src/transformations/transformers/organize.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { FieldType, DataTransformerConfig } from '../../types'; +import { FieldType } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/organize.ts b/packages/grafana-data/src/transformations/transformers/organize.ts index dfda3a779b4..b9d3355c36b 100644 --- a/packages/grafana-data/src/transformations/transformers/organize.ts +++ b/packages/grafana-data/src/transformations/transformers/organize.ts @@ -1,4 +1,5 @@ -import { DataFrame, DataTransformerInfo, TransformationApplicabilityLevels } from '../../types'; +import { DataFrame } from '../../types/dataFrame'; +import { DataTransformerInfo, TransformationApplicabilityLevels } from '../../types/transformations'; import { filterFieldsByNameTransformer } from './filterByName'; import { DataTransformerID } from './ids'; diff --git a/packages/grafana-data/src/transformations/transformers/reduce.test.ts b/packages/grafana-data/src/transformations/transformers/reduce.test.ts index 45c1648223e..5d66b7ec67f 100644 --- a/packages/grafana-data/src/transformations/transformers/reduce.test.ts +++ b/packages/grafana-data/src/transformations/transformers/reduce.test.ts @@ -1,6 +1,7 @@ import { DataFrameView } from '../../dataframe/DataFrameView'; import { toDataFrame } from '../../dataframe/processDataFrame'; -import { DataTransformerConfig, Field, FieldType } from '../../types'; +import { Field, FieldType } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { ReducerID } from '../fieldReducer'; import { notTimeFieldMatcher } from '../matchers/predicates'; diff --git a/packages/grafana-data/src/transformations/transformers/rename.test.ts b/packages/grafana-data/src/transformations/transformers/rename.test.ts index 75e1ad9bc52..05378e1c97f 100644 --- a/packages/grafana-data/src/transformations/transformers/rename.test.ts +++ b/packages/grafana-data/src/transformations/transformers/rename.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { FieldType, DataTransformerConfig } from '../../types'; +import { FieldType } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/renameByRegex.test.ts b/packages/grafana-data/src/transformations/transformers/renameByRegex.test.ts index 36629c57081..9390ba44e6c 100644 --- a/packages/grafana-data/src/transformations/transformers/renameByRegex.test.ts +++ b/packages/grafana-data/src/transformations/transformers/renameByRegex.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { FieldType, DataTransformerConfig } from '../../types'; +import { FieldType } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts b/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts index 617af200c82..0db6812a0d8 100644 --- a/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts +++ b/packages/grafana-data/src/transformations/transformers/seriesToRows.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { DataTransformerConfig, Field, FieldType } from '../../types'; +import { FieldType, Field } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/sortBy.test.ts b/packages/grafana-data/src/transformations/transformers/sortBy.test.ts index 039ac0167eb..c7de0e93414 100644 --- a/packages/grafana-data/src/transformations/transformers/sortBy.test.ts +++ b/packages/grafana-data/src/transformations/transformers/sortBy.test.ts @@ -1,5 +1,6 @@ import { toDataFrame } from '../../dataframe/processDataFrame'; -import { DataTransformerConfig, Field, FieldType } from '../../types'; +import { Field, FieldType } from '../../types/dataFrame'; +import { DataTransformerConfig } from '../../types/transformations'; import { mockTransformationsRegistry } from '../../utils/tests/mockTransformationsRegistry'; import { transformDataFrame } from '../transformDataFrame'; diff --git a/packages/grafana-data/src/transformations/transformers/sortBy.ts b/packages/grafana-data/src/transformations/transformers/sortBy.ts index ce323c1e095..8df10fd7aaa 100644 --- a/packages/grafana-data/src/transformations/transformers/sortBy.ts +++ b/packages/grafana-data/src/transformations/transformers/sortBy.ts @@ -2,7 +2,7 @@ import { map } from 'rxjs/operators'; import { sortDataFrame } from '../../dataframe/processDataFrame'; import { getFieldDisplayName } from '../../field/fieldState'; -import { DataFrame } from '../../types'; +import { DataFrame } from '../../types/dataFrame'; import { DataTransformContext, DataTransformerInfo } from '../../types/transformations'; import { DataTransformerID } from './ids'; diff --git a/packages/grafana-data/src/transformations/transformers/utils.ts b/packages/grafana-data/src/transformations/transformers/utils.ts index 7b3c0efaf50..699cb3517ca 100644 --- a/packages/grafana-data/src/transformations/transformers/utils.ts +++ b/packages/grafana-data/src/transformations/transformers/utils.ts @@ -1,4 +1,5 @@ -import { BootData, DataFrame } from '../../types'; +import { BootData } from '../../types/config'; +import { DataFrame } from '../../types/dataFrame'; declare global { interface Window { diff --git a/packages/grafana-data/src/types/config.ts b/packages/grafana-data/src/types/config.ts index 72f89ea9286..b8703f55aaf 100644 --- a/packages/grafana-data/src/types/config.ts +++ b/packages/grafana-data/src/types/config.ts @@ -1,12 +1,14 @@ -import { SystemDateFormatSettings } from '../datetime'; +import { SystemDateFormatSettings } from '../datetime/formats'; import { MapLayerOptions } from '../geo/layer'; import { GrafanaTheme2 } from '../themes'; import { DataSourceInstanceSettings } from './datasource'; import { FeatureToggles } from './featureToggles.gen'; +import { IconName } from './icon'; +import { NavLinkDTO } from './navModel'; +import { OrgRole } from './orgs'; import { PanelPluginMeta } from './panel'; - -import { GrafanaTheme, IconName, NavLinkDTO, OrgRole } from '.'; +import { GrafanaTheme } from './theme'; /** * Describes the build information that will be available via the Grafana configuration. diff --git a/packages/grafana-data/src/types/data.ts b/packages/grafana-data/src/types/data.ts index 13a0eb789dc..3640e25c655 100644 --- a/packages/grafana-data/src/types/data.ts +++ b/packages/grafana-data/src/types/data.ts @@ -1,11 +1,10 @@ import { DataFrameDTO, FieldConfig } from './dataFrame'; import { DataFrameType } from './dataFrameTypes'; import { ApplyFieldOverrideOptions } from './fieldOverrides'; +import { PanelPluginDataSupport } from './panel'; import { DataTopic } from './query'; import { DataTransformerConfig } from './transformations'; -import { PanelPluginDataSupport } from '.'; - export type KeyValue = Record; /** diff --git a/packages/grafana-data/src/types/datasource.ts b/packages/grafana-data/src/types/datasource.ts index 2990facb107..d4970c3d750 100644 --- a/packages/grafana-data/src/types/datasource.ts +++ b/packages/grafana-data/src/types/datasource.ts @@ -4,18 +4,19 @@ import { Observable } from 'rxjs'; import { makeClassES5Compatible } from '../utils/makeClassES5Compatible'; import { ScopedVars } from './ScopedVars'; +import { WithAccessControlMetadata } from './accesscontrol'; import { AnnotationEvent, AnnotationQuery, AnnotationSupport } from './annotations'; import { CoreApp } from './app'; import { KeyValue, LoadingState, TableData, TimeSeries } from './data'; import { DataFrame, DataFrameDTO } from './dataFrame'; import { PanelData } from './panel'; import { GrafanaPlugin, PluginMeta } from './plugin'; -import { DataQuery } from './query'; +import { DataQuery, DataSourceRef } from './query'; +import { Scope } from './scopes'; +import { AdHocVariableFilter } from './templateVars'; import { RawTimeRange, TimeRange } from './time'; import { CustomVariableSupport, DataSourceVariableSupport, StandardVariableSupport } from './variables'; -import { AdHocVariableFilter, DataSourceRef, Scope, WithAccessControlMetadata } from '.'; - export interface DataSourcePluginOptionsEditorProps< JSONData extends DataSourceJsonData = DataSourceJsonData, SecureJSONData = {}, diff --git a/packages/grafana-data/src/types/fieldOverrides.ts b/packages/grafana-data/src/types/fieldOverrides.ts index 975c2dd729a..a6159030bbf 100644 --- a/packages/grafana-data/src/types/fieldOverrides.ts +++ b/packages/grafana-data/src/types/fieldOverrides.ts @@ -3,21 +3,15 @@ import { ComponentType } from 'react'; import { FieldConfigOptionsRegistry } from '../field/FieldConfigOptionsRegistry'; import { StandardEditorContext, StandardEditorProps } from '../field/standardFieldConfigEditorRegistry'; import { GrafanaTheme2 } from '../themes'; -import { - MatcherConfig, - FieldConfig, - Field, - DataFrame, - TimeZone, - ScopedVars, - ValueLinkConfig, - LinkModel, - DataLink, -} from '../types'; import { OptionsEditorItem } from './OptionsUIRegistryBuilder'; +import { ScopedVars } from './ScopedVars'; +import { DataFrame, Field, FieldConfig, ValueLinkConfig } from './dataFrame'; +import { DataLink, LinkModel } from './dataLink'; import { OptionEditorConfig } from './options'; import { InterpolateFunction } from './panel'; +import { TimeZone } from './time'; +import { MatcherConfig } from './transformations'; export interface DynamicConfigValue { id: string; diff --git a/packages/grafana-data/src/types/index.ts b/packages/grafana-data/src/types/index.ts deleted file mode 100644 index e467d5d8ee4..00000000000 --- a/packages/grafana-data/src/types/index.ts +++ /dev/null @@ -1,69 +0,0 @@ -export * from './constants'; -export * from './data'; -export * from './dataFrame'; -export * from './dataFrameTypes'; -export * from './dataLink'; -export * from './dashboard'; -export * from './query'; -export * from './annotations'; -export * from './logs'; -export * from './navModel'; -export * from './select'; -export * from './time'; -export * from './thresholds'; -export * from './valueMapping'; -export * from './displayValue'; -export * from './graph'; -export * from './ScopedVars'; -export * from './transformations'; -export * from './fieldOverrides'; -export * from './vector'; -export * from './app'; -export * from './datasource'; -export * from './panel'; -export * from './plugin'; -export * from './thresholds'; -export * from './templateVars'; -export * from './fieldColor'; -export * from './theme'; -export * from './orgs'; -export * from './flot'; -export * from './trace'; -export * from './explore'; -export * from './legacyEvents'; -export * from './live'; -export * from './variables'; -export * from './geometry'; -export { isUnsignedPluginSignature } from './pluginSignature'; -export type { - CurrentUserDTO, - AnalyticsSettings, - BootData, - OAuth, - OAuthSettings, - AuthSettings, - GrafanaConfig, - BuildInfo, - LicenseInfo, -} from './config'; -export type { FeatureToggles } from './featureToggles.gen'; -export * from './alerts'; -export * from './slider'; -export * from './accesscontrol'; -export * from './icon'; -export { - PluginExtensionTypes, - PluginExtensionPoints, - type PluginExtension, - type PluginExtensionLink, - type PluginExtensionComponent, - type PluginExtensionConfig, - type PluginExtensionLinkConfig, - type PluginExtensionComponentConfig, - type PluginExtensionEventHelpers, - type PluginExtensionPanelContext, - type PluginExtensionDataSourceConfigContext, - type PluginExtensionCommandPaletteContext, - type PluginExtensionOpenModalOptions, -} from './pluginExtensions'; -export * from './scopes'; diff --git a/packages/grafana-data/src/utils/OptionsUIBuilders.ts b/packages/grafana-data/src/utils/OptionsUIBuilders.ts index 0d5a8bb1751..c7d9bf83257 100644 --- a/packages/grafana-data/src/utils/OptionsUIBuilders.ts +++ b/packages/grafana-data/src/utils/OptionsUIBuilders.ts @@ -20,8 +20,8 @@ import { standardEditorsRegistry, } from '../field/standardFieldConfigEditorRegistry'; import { PanelOptionsSupplier } from '../panel/PanelPlugin'; -import { isObject } from '../types'; import { OptionsEditorItem, OptionsUIRegistryBuilder } from '../types/OptionsUIRegistryBuilder'; +import { isObject } from '../types/data'; import { FieldConfigPropertyItem, FieldConfigEditorConfig } from '../types/fieldOverrides'; import { PanelOptionsEditorConfig, PanelOptionsEditorItem } from '../types/panel'; diff --git a/packages/grafana-data/src/utils/Registry.ts b/packages/grafana-data/src/utils/Registry.ts index ba26da74fdc..963cb5ec6ae 100644 --- a/packages/grafana-data/src/utils/Registry.ts +++ b/packages/grafana-data/src/utils/Registry.ts @@ -1,4 +1,4 @@ -import { PluginState } from '../types'; +import { PluginState } from '../types/plugin'; import { SelectableValue } from '../types/select'; export interface RegistryItem { diff --git a/packages/grafana-data/src/utils/csv.ts b/packages/grafana-data/src/utils/csv.ts index d8d4e33d242..766c3680ee8 100644 --- a/packages/grafana-data/src/utils/csv.ts +++ b/packages/grafana-data/src/utils/csv.ts @@ -6,7 +6,7 @@ import Papa, { ParseConfig, Parser, ParseResult } from 'papaparse'; import { MutableDataFrame } from '../dataframe/MutableDataFrame'; import { guessFieldTypeFromValue } from '../dataframe/processDataFrame'; import { getFieldDisplayName } from '../field/fieldState'; -import { DataFrame, Field, FieldConfig, FieldType } from '../types'; +import { DataFrame, Field, FieldConfig, FieldType } from '../types/dataFrame'; import { formattedValueToString } from '../valueFormats/valueFormats'; export enum CSVHeaderStyle { diff --git a/packages/grafana-data/src/utils/dataLinks.test.ts b/packages/grafana-data/src/utils/dataLinks.test.ts index 31f6e4162b8..945e88aa1e0 100644 --- a/packages/grafana-data/src/utils/dataLinks.test.ts +++ b/packages/grafana-data/src/utils/dataLinks.test.ts @@ -1,5 +1,7 @@ -import { DateTime, toUtc } from '../datetime'; -import { DataLink, FieldType, TimeRange } from '../types'; +import { DateTime, toUtc } from '../datetime/moment_wrapper'; +import { FieldType } from '../types/dataFrame'; +import { DataLink } from '../types/dataLink'; +import { TimeRange } from '../types/time'; import { mapInternalLinkToExplore } from './dataLinks'; diff --git a/packages/grafana-data/src/utils/dataLinks.ts b/packages/grafana-data/src/utils/dataLinks.ts index d47d03d71bb..8c8084cee34 100644 --- a/packages/grafana-data/src/utils/dataLinks.ts +++ b/packages/grafana-data/src/utils/dataLinks.ts @@ -1,15 +1,10 @@ -import { - DataLink, - DataQuery, - ExplorePanelsState, - Field, - InternalDataLink, - InterpolateFunction, - LinkModel, - ScopedVars, - SplitOpen, - TimeRange, -} from '../types'; +import { ScopedVars } from '../types/ScopedVars'; +import { Field } from '../types/dataFrame'; +import { DataLink, InternalDataLink, LinkModel } from '../types/dataLink'; +import { SplitOpen, ExplorePanelsState } from '../types/explore'; +import { InterpolateFunction } from '../types/panel'; +import { DataQuery } from '../types/query'; +import { TimeRange } from '../types/time'; import { locationUtil } from './location'; import { serializeStateToUrlParam, toURLRange } from './url'; diff --git a/packages/grafana-data/src/utils/datasource.ts b/packages/grafana-data/src/utils/datasource.ts index 19d7971986a..7b9ba8d0de5 100644 --- a/packages/grafana-data/src/utils/datasource.ts +++ b/packages/grafana-data/src/utils/datasource.ts @@ -1,14 +1,14 @@ import { isString } from 'lodash'; +import { KeyValue } from '../types/data'; import { - DataSourcePluginOptionsEditorProps, - SelectableValue, - KeyValue, - DataSourceSettings, DataSourceInstanceSettings, - DataSourceRef, DataSourceJsonData, -} from '../types'; + DataSourcePluginOptionsEditorProps, + DataSourceSettings, +} from '../types/datasource'; +import { DataSourceRef } from '../types/query'; +import { SelectableValue } from '../types/select'; /** * Convert instance settings to a reference diff --git a/packages/grafana-data/src/utils/deprecationWarning.ts b/packages/grafana-data/src/utils/deprecationWarning.ts index b959ccd1e18..9bc37f9e3f3 100644 --- a/packages/grafana-data/src/utils/deprecationWarning.ts +++ b/packages/grafana-data/src/utils/deprecationWarning.ts @@ -1,4 +1,4 @@ -import { KeyValue } from '../types'; +import { KeyValue } from '../types/data'; // Avoid writing the warning message more than once every 10s const history: KeyValue = {}; diff --git a/packages/grafana-data/src/utils/legend.ts b/packages/grafana-data/src/utils/legend.ts index 407e4fb874a..34073eda52f 100644 --- a/packages/grafana-data/src/utils/legend.ts +++ b/packages/grafana-data/src/utils/legend.ts @@ -1,4 +1,4 @@ -import { Labels } from '../types'; +import { Labels } from '../types/data'; /** replace labels in a string. Used for loki+prometheus legend formats */ export function renderLegendFormat(aliasPattern: string, aliasData: Labels): string { diff --git a/packages/grafana-data/src/utils/location.test.ts b/packages/grafana-data/src/utils/location.test.ts index 897b4678cbb..b0fd82bbd98 100644 --- a/packages/grafana-data/src/utils/location.test.ts +++ b/packages/grafana-data/src/utils/location.test.ts @@ -1,6 +1,6 @@ import { Location } from 'history'; -import { GrafanaConfig } from '../types'; +import { GrafanaConfig } from '../types/config'; import { locationUtil } from './location'; diff --git a/packages/grafana-data/src/utils/location.ts b/packages/grafana-data/src/utils/location.ts index 0e33f3da102..cbff51a7f30 100644 --- a/packages/grafana-data/src/utils/location.ts +++ b/packages/grafana-data/src/utils/location.ts @@ -1,7 +1,9 @@ import { Location } from 'history'; import { textUtil } from '../text'; -import { GrafanaConfig, RawTimeRange, ScopedVars } from '../types'; +import { ScopedVars } from '../types/ScopedVars'; +import { GrafanaConfig } from '../types/config'; +import { RawTimeRange } from '../types/time'; import { UrlQueryMap, urlUtil } from './url'; diff --git a/packages/grafana-data/src/utils/matchPluginId.ts b/packages/grafana-data/src/utils/matchPluginId.ts index d21a0654215..6804597de8f 100644 --- a/packages/grafana-data/src/utils/matchPluginId.ts +++ b/packages/grafana-data/src/utils/matchPluginId.ts @@ -1,4 +1,4 @@ -import { PluginMeta } from '../types'; +import { PluginMeta } from '../types/plugin'; export function matchPluginId(idToMatch: string, pluginMeta: PluginMeta) { if (pluginMeta.id === idToMatch) { diff --git a/packages/grafana-data/src/utils/selectUtils.ts b/packages/grafana-data/src/utils/selectUtils.ts index 8c682fba762..4a46f5bad4d 100644 --- a/packages/grafana-data/src/utils/selectUtils.ts +++ b/packages/grafana-data/src/utils/selectUtils.ts @@ -1,3 +1,3 @@ -import { SelectableValue } from '../types'; +import { SelectableValue } from '../types/select'; export const toOption = (value: string): SelectableValue => ({ label: value, value }); diff --git a/packages/grafana-data/src/utils/series.test.ts b/packages/grafana-data/src/utils/series.test.ts index 8ac46275c31..bbf484232a2 100644 --- a/packages/grafana-data/src/utils/series.test.ts +++ b/packages/grafana-data/src/utils/series.test.ts @@ -1,4 +1,4 @@ -import { Field, FieldType } from '../types'; +import { Field, FieldType } from '../types/dataFrame'; import { getSeriesTimeStep, hasMsResolution } from './series'; diff --git a/packages/grafana-data/src/utils/tests/mockDataSource.ts b/packages/grafana-data/src/utils/tests/mockDataSource.ts index cfc0d99d6be..b19adba178e 100644 --- a/packages/grafana-data/src/utils/tests/mockDataSource.ts +++ b/packages/grafana-data/src/utils/tests/mockDataSource.ts @@ -1,17 +1,16 @@ import { Observable } from 'rxjs'; import { - DataQuery, DataQueryRequest, DataQueryResponse, DataSourceApi, DataSourceInstanceSettings, DataSourceJsonData, DataSourcePluginMeta, - PluginMetaInfo, - PluginType, TestDataSourceResponse, -} from '../../types'; +} from '../../types/datasource'; +import { PluginMetaInfo, PluginType } from '../../types/plugin'; +import { DataQuery } from '../../types/query'; export interface TestQuery extends DataQuery { query: string; diff --git a/packages/grafana-data/src/utils/tests/mockStandardProperties.ts b/packages/grafana-data/src/utils/tests/mockStandardProperties.ts index ef52b7f255e..729a55e55e8 100644 --- a/packages/grafana-data/src/utils/tests/mockStandardProperties.ts +++ b/packages/grafana-data/src/utils/tests/mockStandardProperties.ts @@ -1,5 +1,5 @@ import { displayNameOverrideProcessor, identityOverrideProcessor } from '../../field/overrides/processors'; -import { ThresholdsMode } from '../../types'; +import { ThresholdsMode } from '../../types/thresholds'; export const mockStandardProperties = () => { const title = { diff --git a/packages/grafana-data/src/utils/tests/mockTransformationsRegistry.ts b/packages/grafana-data/src/utils/tests/mockTransformationsRegistry.ts index 0d502a641f8..ef1b6f78fce 100644 --- a/packages/grafana-data/src/utils/tests/mockTransformationsRegistry.ts +++ b/packages/grafana-data/src/utils/tests/mockTransformationsRegistry.ts @@ -1,5 +1,5 @@ import { standardTransformersRegistry } from '../../transformations/standardTransformersRegistry'; -import { DataTransformerInfo } from '../../types'; +import { DataTransformerInfo } from '../../types/transformations'; export const mockTransformationsRegistry = (transformers: DataTransformerInfo[]) => { standardTransformersRegistry.setInit(() => { diff --git a/packages/grafana-data/src/utils/url.ts b/packages/grafana-data/src/utils/url.ts index 2ee35d9f449..b98ee5f5b64 100644 --- a/packages/grafana-data/src/utils/url.ts +++ b/packages/grafana-data/src/utils/url.ts @@ -2,9 +2,9 @@ * @preserve jquery-param (c) 2015 KNOWLEDGECODE | MIT */ -import { isDateTime } from '../datetime'; -import { URLRange, RawTimeRange } from '../types'; -import { ExploreUrlState } from '../types/explore'; +import { isDateTime } from '../datetime/moment_wrapper'; +import { ExploreUrlState, URLRange } from '../types/explore'; +import { RawTimeRange } from '../types/time'; /** * Type to represent the value of a single query variable. diff --git a/packages/grafana-data/src/utils/valueMappings.test.ts b/packages/grafana-data/src/utils/valueMappings.test.ts index 85b197735fe..2b60616d850 100644 --- a/packages/grafana-data/src/utils/valueMappings.test.ts +++ b/packages/grafana-data/src/utils/valueMappings.test.ts @@ -1,4 +1,4 @@ -import { ValueMapping, MappingType, SpecialValueMatch } from '../types'; +import { MappingType, SpecialValueMatch, ValueMapping } from '../types/valueMapping'; import { getValueMappingResult, isNumeric } from './valueMappings'; diff --git a/packages/grafana-data/src/utils/valueMappings.ts b/packages/grafana-data/src/utils/valueMappings.ts index 352699259ee..d7ab2cf6a24 100644 --- a/packages/grafana-data/src/utils/valueMappings.ts +++ b/packages/grafana-data/src/utils/valueMappings.ts @@ -1,14 +1,14 @@ import { getActiveThreshold } from '../field/thresholds'; import { stringToJsRegex } from '../text/string'; +import { ThresholdsConfig } from '../types/thresholds'; import { MappingType, SpecialValueMatch, - ThresholdsConfig, + SpecialValueOptions, ValueMap, ValueMapping, ValueMappingResult, - SpecialValueOptions, -} from '../types'; +} from '../types/valueMapping'; export function getValueMappingResult(valueMappings: ValueMapping[], value: any): ValueMappingResult | null { for (const vm of valueMappings) { diff --git a/packages/grafana-data/src/utils/variables.ts b/packages/grafana-data/src/utils/variables.ts index 2002472d174..d99db7ebb32 100644 --- a/packages/grafana-data/src/utils/variables.ts +++ b/packages/grafana-data/src/utils/variables.ts @@ -1,4 +1,4 @@ -import { ScopedVars } from '../types'; +import { ScopedVars } from '../types/ScopedVars'; const SEARCH_FILTER_VARIABLE = '__searchFilter'; diff --git a/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts b/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts index 4eb18bf8c50..62980e7dc2f 100644 --- a/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts +++ b/packages/grafana-data/src/valueFormats/dateTimeFormatters.ts @@ -1,7 +1,8 @@ -import { dateTimeFormat, dateTimeFormatTimeAgo, localTimeFormat, systemDateFormats } from '../datetime'; +import { localTimeFormat, systemDateFormats } from '../datetime/formats'; +import { dateTimeFormat, dateTimeFormatTimeAgo } from '../datetime/formatter'; import { toDuration as duration, toUtc, dateTime } from '../datetime/moment_wrapper'; -import { TimeZone } from '../types'; import { DecimalCount } from '../types/displayValue'; +import { TimeZone } from '../types/time'; import { toFixed, toFixedScaled, FormattedValue, ValueFormatter } from './valueFormats'; diff --git a/packages/grafana-data/src/valueFormats/valueFormats.test.ts b/packages/grafana-data/src/valueFormats/valueFormats.test.ts index b0776ae4b41..a0df43a7e8a 100644 --- a/packages/grafana-data/src/valueFormats/valueFormats.test.ts +++ b/packages/grafana-data/src/valueFormats/valueFormats.test.ts @@ -1,6 +1,6 @@ -import { dateTime } from '../datetime'; -import { TimeZone } from '../types'; +import { dateTime } from '../datetime/moment_wrapper'; import { DecimalCount } from '../types/displayValue'; +import { TimeZone } from '../types/time'; import { toFixed, getValueFormat, scaledUnits, formattedValueToString } from './valueFormats'; diff --git a/packages/grafana-data/src/valueFormats/valueFormats.ts b/packages/grafana-data/src/valueFormats/valueFormats.ts index e4d99adcc91..0a4b943357f 100644 --- a/packages/grafana-data/src/valueFormats/valueFormats.ts +++ b/packages/grafana-data/src/valueFormats/valueFormats.ts @@ -1,7 +1,7 @@ import { clamp } from 'lodash'; -import { TimeZone } from '../types'; import { DecimalCount } from '../types/displayValue'; +import { TimeZone } from '../types/time'; import { getCategories } from './categories'; import { toDateTimeValueFormatter } from './dateTimeFormatters'; diff --git a/packages/grafana-data/src/vector/ArrayVector.test.ts b/packages/grafana-data/src/vector/ArrayVector.test.ts index eb0c53dfa0c..daa8c6375f5 100644 --- a/packages/grafana-data/src/vector/ArrayVector.test.ts +++ b/packages/grafana-data/src/vector/ArrayVector.test.ts @@ -1,4 +1,4 @@ -import { Field, FieldType } from '../types'; +import { Field, FieldType } from '../types/dataFrame'; import { ArrayVector } from './ArrayVector'; diff --git a/packages/grafana-prometheus/src/components/PromQueryField.tsx b/packages/grafana-prometheus/src/components/PromQueryField.tsx index 35ff6174ad3..4c619f88b7a 100644 --- a/packages/grafana-prometheus/src/components/PromQueryField.tsx +++ b/packages/grafana-prometheus/src/components/PromQueryField.tsx @@ -2,13 +2,19 @@ import { css, cx } from '@emotion/css'; import { PureComponent, ReactNode } from 'react'; -import { isDataFrame, QueryEditorProps, QueryHint, TimeRange, toLegacyResponseData } from '@grafana/data'; +import { + isDataFrame, + LocalStorageValueProvider, + QueryEditorProps, + QueryHint, + TimeRange, + toLegacyResponseData, +} from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { reportInteraction } from '@grafana/runtime'; import { clearButtonStyles, Icon, Themeable2, withTheme2 } from '@grafana/ui'; import { PrometheusDatasource } from '../datasource'; -import { LocalStorageValueProvider } from '../gcopypaste/app/core/components/LocalStorageValueProvider'; import { roundMsToMin } from '../language_utils'; import { PromOptions, PromQuery } from '../types'; diff --git a/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx b/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx index 749416c5e14..dd9b17beb3c 100644 --- a/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx +++ b/packages/grafana-prometheus/src/components/VariableQueryEditor.test.tsx @@ -5,9 +5,9 @@ import userEvent from '@testing-library/user-event'; import { dateTime, TimeRange } from '@grafana/data'; import { PrometheusDatasource } from '../datasource'; -import { selectOptionInTest } from '../gcopypaste/test/helpers/selectOptionInTest'; import PrometheusLanguageProvider from '../language_provider'; import { migrateVariableEditorBackToVariableSupport } from '../migrations/variableMigration'; +import { selectOptionInTest } from '../test/helpers/selectOptionInTest'; import { PromVariableQuery, PromVariableQueryType, StandardPromVariableQuery } from '../types'; import { PromVariableQueryEditor, Props, variableMigration } from './VariableQueryEditor'; diff --git a/packages/grafana-prometheus/src/configuration/PromSettings.test.tsx b/packages/grafana-prometheus/src/configuration/PromSettings.test.tsx index 8d90f39084f..15af11210cc 100644 --- a/packages/grafana-prometheus/src/configuration/PromSettings.test.tsx +++ b/packages/grafana-prometheus/src/configuration/PromSettings.test.tsx @@ -6,8 +6,9 @@ import { SelectableValue } from '@grafana/data'; import { selectors } from '@grafana/e2e-selectors'; import { config } from '@grafana/runtime'; +import { createDefaultConfigOptions } from '../test/__mocks__/datasource'; + import { countError, getValueFromEventItem, PromSettings } from './PromSettings'; -import { createDefaultConfigOptions } from './mocks'; beforeEach(() => { jest.replaceProperty(config, 'featureToggles', { diff --git a/packages/grafana-prometheus/src/configuration/mocks.ts b/packages/grafana-prometheus/src/configuration/mocks.ts deleted file mode 100644 index 3c1d7e29762..00000000000 --- a/packages/grafana-prometheus/src/configuration/mocks.ts +++ /dev/null @@ -1,15 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/configuration/mocks.ts -import { DataSourceSettings } from '@grafana/data'; - -import { getMockDataSource } from '../gcopypaste/app/features/datasources/__mocks__/dataSourcesMocks'; -import { PromOptions } from '../types'; - -export function createDefaultConfigOptions(): DataSourceSettings { - return getMockDataSource({ - jsonData: { - timeInterval: '1m', - queryTimeout: '1m', - httpMethod: 'GET', - }, - }); -} diff --git a/packages/grafana-prometheus/src/datasource.test.ts b/packages/grafana-prometheus/src/datasource.test.ts index 08104df79b3..8132d670aae 100644 --- a/packages/grafana-prometheus/src/datasource.test.ts +++ b/packages/grafana-prometheus/src/datasource.test.ts @@ -18,14 +18,6 @@ import { } from '@grafana/data'; import { config, getBackendSrv, setBackendSrv, TemplateSrv } from '@grafana/runtime'; -import { - createAnnotationResponse, - createDataRequest, - createDefaultPromResponse, - createEmptyAnnotationResponse, - fetchMockCalledWith, - getMockTimeRange, -} from './__mocks__/datasource'; import { alignRange, extractRuleMappingFromGroups, @@ -34,6 +26,14 @@ import { prometheusSpecialRegexEscape, } from './datasource'; import PromQlLanguageProvider from './language_provider'; +import { + createAnnotationResponse, + createDataRequest, + createDefaultPromResponse, + createEmptyAnnotationResponse, + fetchMockCalledWith, + getMockTimeRange, +} from './test/__mocks__/datasource'; import { PromApplication, PrometheusCacheLevel, PromOptions, PromQuery, PromQueryRequest } from './types'; const fetchMock = jest.fn().mockReturnValue(of(createDefaultPromResponse())); diff --git a/packages/grafana-prometheus/src/gcopypaste/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx b/packages/grafana-prometheus/src/gcopypaste/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx deleted file mode 100644 index 903a6b94b53..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx +++ /dev/null @@ -1,51 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/core/components/LocalStorageValueProvider/LocalStorageValueProvider.tsx -import { useEffect, useState } from 'react'; -import * as React from 'react'; - -import store from '../../store'; - -export interface Props { - storageKey: string; - defaultValue: T; - children: (value: T, onSaveToStore: (value: T) => void, onDeleteFromStore: () => void) => React.ReactNode; -} - -export const LocalStorageValueProvider = (props: Props) => { - const { children, storageKey, defaultValue } = props; - - const [state, setState] = useState({ value: store.getObject(props.storageKey, props.defaultValue) }); - - useEffect(() => { - const onStorageUpdate = (v: StorageEvent) => { - if (v.key === storageKey) { - setState({ value: store.getObject(props.storageKey, props.defaultValue) }); - } - }; - - window.addEventListener('storage', onStorageUpdate); - - return () => { - window.removeEventListener('storage', onStorageUpdate); - }; - }); - - const onSaveToStore = (value: T) => { - try { - store.setObject(storageKey, value); - } catch (error) { - console.error(error); - } - setState({ value }); - }; - - const onDeleteFromStore = () => { - try { - store.delete(storageKey); - } catch (error) { - console.log(error); - } - setState({ value: defaultValue }); - }; - - return <>{children(state.value, onSaveToStore, onDeleteFromStore)}; -}; diff --git a/packages/grafana-prometheus/src/gcopypaste/app/core/components/LocalStorageValueProvider/index.tsx b/packages/grafana-prometheus/src/gcopypaste/app/core/components/LocalStorageValueProvider/index.tsx deleted file mode 100644 index e3df7a01194..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/app/core/components/LocalStorageValueProvider/index.tsx +++ /dev/null @@ -1,2 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/core/components/LocalStorageValueProvider/index.tsx -export { LocalStorageValueProvider } from './LocalStorageValueProvider'; diff --git a/packages/grafana-prometheus/src/gcopypaste/app/core/store.ts b/packages/grafana-prometheus/src/gcopypaste/app/core/store.ts deleted file mode 100644 index a23d14c93cc..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/app/core/store.ts +++ /dev/null @@ -1,66 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/core/store.ts -type StoreValue = string | number | boolean | null; - -export class Store { - get(key: string) { - return window.localStorage[key]; - } - - set(key: string, value: StoreValue) { - window.localStorage[key] = value; - } - - getBool(key: string, def: boolean): boolean { - if (def !== void 0 && !this.exists(key)) { - return def; - } - return window.localStorage[key] === 'true'; - } - - getObject(key: string): T | undefined; - getObject(key: string, def: T): T; - getObject(key: string, def?: T) { - let ret = def; - if (this.exists(key)) { - const json = window.localStorage[key]; - try { - ret = JSON.parse(json); - } catch (error) { - console.error(`Error parsing store object: ${key}. Returning default: ${def}. [${error}]`); - } - } - return ret; - } - - /* Returns true when successfully stored, throws error if not successfully stored */ - setObject(key: string, value: unknown) { - let json; - try { - json = JSON.stringify(value); - } catch (error) { - throw new Error(`Could not stringify object: ${key}. [${error}]`); - } - try { - this.set(key, json); - } catch (error) { - // Likely hitting storage quota - const errorToThrow = new Error(`Could not save item in localStorage: ${key}. [${error}]`); - if (error instanceof Error) { - errorToThrow.name = error.name; - } - throw errorToThrow; - } - return true; - } - - exists(key: string) { - return window.localStorage[key] !== void 0; - } - - delete(key: string) { - window.localStorage.removeItem(key); - } -} - -const store = new Store(); -export default store; diff --git a/packages/grafana-prometheus/src/gcopypaste/app/core/utils/query.ts b/packages/grafana-prometheus/src/gcopypaste/app/core/utils/query.ts deleted file mode 100644 index 28b4af48c0b..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/app/core/utils/query.ts +++ /dev/null @@ -1,21 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/core/utils/query.ts -import { DataQuery } from '@grafana/data'; - -export const getNextRefIdChar = (queries: DataQuery[]): string => { - for (let num = 0; ; num++) { - const refId = getRefId(num); - if (!queries.some((query) => query.refId === refId)) { - return refId; - } - } -}; - -function getRefId(num: number): string { - const letters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; - - if (num < letters.length) { - return letters[num]; - } else { - return getRefId(Math.floor(num / letters.length) - 1) + letters[num % letters.length]; - } -} diff --git a/packages/grafana-prometheus/src/gcopypaste/app/features/datasources/__mocks__/dataSourcesMocks.ts b/packages/grafana-prometheus/src/gcopypaste/app/features/datasources/__mocks__/dataSourcesMocks.ts deleted file mode 100644 index 15ebe4229a9..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/app/features/datasources/__mocks__/dataSourcesMocks.ts +++ /dev/null @@ -1,31 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/features/datasources/__mocks__/dataSourcesMocks.ts -import { merge } from 'lodash'; - -import { DataSourceJsonData, DataSourceSettings } from '@grafana/data'; - -export const getMockDataSource = ( - overrides?: Partial> -): DataSourceSettings => - merge( - { - access: '', - basicAuth: false, - basicAuthUser: '', - withCredentials: false, - database: '', - id: 13, - uid: 'x', - isDefault: false, - jsonData: { authType: 'credentials', defaultRegion: 'eu-west-2' }, - name: 'gdev-prometheus', - typeName: 'Prometheus', - orgId: 1, - readOnly: false, - type: 'prometheus', - typeLogoUrl: 'packages/grafana-prometheus/src/img/prometheus_logo.svg', - url: '', - user: '', - secureJsonFields: {}, - }, - overrides - ); diff --git a/packages/grafana-prometheus/src/gcopypaste/app/features/live/data/amendTimeSeries.ts b/packages/grafana-prometheus/src/gcopypaste/app/features/live/data/amendTimeSeries.ts deleted file mode 100644 index a2d00ad34f4..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/app/features/live/data/amendTimeSeries.ts +++ /dev/null @@ -1,94 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/features/live/data/amendTimeSeries.ts -import { closestIdx } from '@grafana/data'; - -export type Table = [times: number[], ...values: any[][]]; - -// prevTable and nextTable are assumed sorted ASC on reference [0] arrays -// nextTable is assumed to be contiguous, only edges are checked for overlap -// ...so prev: [1,2,5] + next: [3,4,6] -> [1,2,3,4,6] -export function amendTable(prevTable: Table, nextTable: Table): Table { - let [prevTimes] = prevTable; - let [nextTimes] = nextTable; - - let pLen = prevTimes.length; - let pStart = prevTimes[0]; - let pEnd = prevTimes[pLen - 1]; - - let nLen = nextTimes.length; - let nStart = nextTimes[0]; - let nEnd = nextTimes[nLen - 1]; - - let outTable: Table; - - if (pLen) { - if (nLen) { - // append, no overlap - if (nStart > pEnd) { - outTable = prevTable.map((_, i) => prevTable[i].concat(nextTable[i])) as Table; - } - // prepend, no overlap - else if (nEnd < pStart) { - outTable = nextTable.map((_, i) => nextTable[i].concat(prevTable[i])) as Table; - } - // full replace - else if (nStart <= pStart && nEnd >= pEnd) { - outTable = nextTable; - } - // partial replace - else if (nStart > pStart && nEnd < pEnd) { - } - // append, with overlap - else if (nStart >= pStart) { - let idx = closestIdx(nStart, prevTimes); - idx = prevTimes[idx] < nStart ? idx - 1 : idx; - outTable = prevTable.map((_, i) => prevTable[i].slice(0, idx).concat(nextTable[i])) as Table; - } - // prepend, with overlap - else if (nEnd >= pStart) { - let idx = closestIdx(nEnd, prevTimes); - idx = prevTimes[idx] < nEnd ? idx : idx + 1; - outTable = nextTable.map((_, i) => nextTable[i].concat(prevTable[i].slice(idx))) as Table; - } - } else { - outTable = prevTable; - } - } else { - if (nLen) { - outTable = nextTable; - } else { - outTable = [[]]; - } - } - - return outTable!; -} - -export function trimTable(table: Table, fromTime: number, toTime: number): Table { - let [times, ...vals] = table; - let fromIdx: number | undefined; - let toIdx: number | undefined; - - // trim to bounds - if (times[0] < fromTime) { - fromIdx = closestIdx(fromTime, times); - - if (times[fromIdx] < fromTime) { - fromIdx++; - } - } - - if (times[times.length - 1] > toTime) { - toIdx = closestIdx(toTime, times); - - if (times[toIdx] > toTime) { - toIdx--; - } - } - - if (fromIdx != null || toIdx != null) { - times = times.slice(fromIdx ?? 0, toIdx); - vals = vals.map(vals2 => vals2.slice(fromIdx ?? 0, toIdx)); - } - - return [times, ...vals]; -} diff --git a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/index.ts b/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/index.ts deleted file mode 100644 index ea1578a7482..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/test/matchers/index.ts -import { Observable } from 'rxjs'; - -import { toEmitValues } from './toEmitValues'; -import { toEmitValuesWith } from './toEmitValuesWith'; -import { ObservableMatchers } from './types'; - -export const matchers: ObservableMatchers> = { - toEmitValues, - toEmitValuesWith, -}; diff --git a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValues.test.ts b/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValues.test.ts deleted file mode 100644 index bb0d9aa3c63..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValues.test.ts +++ /dev/null @@ -1,141 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/test/matchers/toEmitValues.test.ts -import { interval, Observable, of, throwError } from 'rxjs'; -import { map, mergeMap, take } from 'rxjs/operators'; - -import { OBSERVABLE_TEST_TIMEOUT_IN_MS } from './types'; - -describe('toEmitValues matcher', () => { - describe('failing tests', () => { - describe('passing null in expect', () => { - it('should fail', async () => { - const observable = null as unknown as Observable; - - const rejects = expect(() => expect(observable).toEmitValues([1, 2, 3])).rejects; - await rejects.toThrow(); - }); - }); - - describe('passing undefined in expect', () => { - it('should fail', async () => { - const observable = undefined as unknown as Observable; - - const rejects = expect(() => expect(observable).toEmitValues([1, 2, 3])).rejects; - await rejects.toThrow(); - }); - }); - - describe('passing number instead of Observable in expect', () => { - it('should fail', async () => { - const observable = 1 as unknown as Observable; - - const rejects = expect(() => expect(observable).toEmitValues([1, 2, 3])).rejects; - await rejects.toThrow(); - }); - }); - - describe('wrong number of emitted values', () => { - it('should fail', async () => { - const observable = interval(10).pipe(take(3)); - - const rejects = expect(() => expect(observable).toEmitValues([0, 1])).rejects; - await rejects.toThrow(); - }); - }); - - describe('wrong emitted values', () => { - it('should fail', async () => { - const observable = interval(10).pipe(take(3)); - - const rejects = expect(() => expect(observable).toEmitValues([1, 2, 3])).rejects; - await rejects.toThrow(); - }); - }); - - describe('wrong emitted value types', () => { - it('should fail', async () => { - const observable = interval(10).pipe(take(3)) as unknown as Observable; - - const rejects = expect(() => expect(observable).toEmitValues(['0', '1', '2'])).rejects; - await rejects.toThrow(); - }); - }); - - describe(`observable that does not complete within ${OBSERVABLE_TEST_TIMEOUT_IN_MS}ms`, () => { - it('should fail', async () => { - const observable = interval(600); - - const rejects = expect(() => expect(observable).toEmitValues([0])).rejects; - await rejects.toThrow(); - }); - }); - }); - - describe('passing tests', () => { - describe('correct emitted values', () => { - it('should pass with correct message', async () => { - const observable = interval(10).pipe(take(3)); - await expect(observable).toEmitValues([0, 1, 2]); - }); - }); - - describe('using nested arrays', () => { - it('should pass with correct message', async () => { - const observable = interval(10).pipe( - map((interval) => [{ text: interval.toString(), value: interval }]), - take(3) - ); - await expect(observable).toEmitValues([ - [{ text: '0', value: 0 }], - [{ text: '1', value: 1 }], - [{ text: '2', value: 2 }], - ]); - }); - }); - - describe('using nested objects', () => { - it('should pass with correct message', async () => { - const observable = interval(10).pipe( - map((interval) => ({ inner: { text: interval.toString(), value: interval } })), - take(3) - ); - await expect(observable).toEmitValues([ - { inner: { text: '0', value: 0 } }, - { inner: { text: '1', value: 1 } }, - { inner: { text: '2', value: 2 } }, - ]); - }); - }); - - describe('correct emitted values with throw', () => { - it('should pass with correct message', async () => { - const observable = interval(10).pipe( - map((interval) => { - if (interval > 1) { - throw 'an error'; - } - - return interval; - }) - ) as unknown as Observable; - - await expect(observable).toEmitValues([0, 1, 'an error']); - }); - }); - - describe('correct emitted values with throwError', () => { - it('should pass with correct message', async () => { - const observable = interval(10).pipe( - mergeMap((interval) => { - if (interval === 1) { - return throwError('an error'); - } - - return of(interval); - }) - ) as unknown as Observable; - - await expect(observable).toEmitValues([0, 'an error']); - }); - }); - }); -}); diff --git a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValues.ts b/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValues.ts deleted file mode 100644 index 5d87c1f342d..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValues.ts +++ /dev/null @@ -1,91 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/test/matchers/toEmitValues.ts -import { matcherHint, printExpected, printReceived } from 'jest-matcher-utils'; -import { isEqual } from 'lodash'; -import { Observable, Subscription } from 'rxjs'; - -import { expectObservable, forceObservableCompletion } from './utils'; - -function passMessage(received: unknown[], expected: unknown[]) { - return `${matcherHint('.not.toEmitValues')} - - Expected observable to emit values: - ${printExpected(expected)} - Received: - ${printReceived(received)} - `; -} - -function failMessage(received: unknown[], expected: unknown[]) { - return `${matcherHint('.toEmitValues')} - - Expected observable to emit values: - ${printExpected(expected)} - Received: - ${printReceived(received)} - `; -} - -function tryExpectations(received: unknown[], expected: unknown[]): jest.CustomMatcherResult { - try { - if (received.length !== expected.length) { - return { - pass: false, - message: () => failMessage(received, expected), - }; - } - - for (let index = 0; index < received.length; index++) { - const left = received[index]; - const right = expected[index]; - - if (!isEqual(left, right)) { - return { - pass: false, - message: () => failMessage(received, expected), - }; - } - } - - return { - pass: true, - message: () => passMessage(received, expected), - }; - } catch (err) { - const message = err instanceof Error ? err.message : 'An unknown error occurred'; - return { - pass: false, - message: () => message, - }; - } -} - -export function toEmitValues(received: Observable, expected: unknown[]): Promise { - const failsChecks = expectObservable(received); - if (failsChecks) { - return Promise.resolve(failsChecks); - } - - return new Promise((resolve) => { - const receivedValues: unknown[] = []; - const subscription = new Subscription(); - - subscription.add( - received.subscribe({ - next: (value) => { - receivedValues.push(value); - }, - error: (err) => { - receivedValues.push(err); - subscription.unsubscribe(); - resolve(tryExpectations(receivedValues, expected)); - }, - complete: () => { - subscription.unsubscribe(); - resolve(tryExpectations(receivedValues, expected)); - }, - }) - ); - - forceObservableCompletion(subscription, resolve); - }); -} diff --git a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValuesWith.test.ts b/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValuesWith.test.ts deleted file mode 100644 index 352c8237665..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValuesWith.test.ts +++ /dev/null @@ -1,154 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/test/matchers/toEmitValuesWith.test.ts -import { interval, Observable, of, throwError } from 'rxjs'; -import { map, mergeMap, take } from 'rxjs/operators'; - -import { OBSERVABLE_TEST_TIMEOUT_IN_MS } from './types'; - -describe('toEmitValuesWith matcher', () => { - describe('failing tests', () => { - describe('passing null in expect', () => { - it('should fail with correct message', async () => { - const observable = null as unknown as Observable; - - const rejects = expect(() => - expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual([1, 2, 3]); - }) - ).rejects; - - await rejects.toThrow(); - }); - }); - - describe('passing undefined in expect', () => { - it('should fail with correct message', async () => { - const observable = undefined as unknown as Observable; - - const rejects = expect(() => - expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual([1, 2, 3]); - }) - ).rejects; - - await rejects.toThrow(); - }); - }); - - describe('passing number instead of Observable in expect', () => { - it('should fail with correct message', async () => { - const observable = 1 as unknown as Observable; - - const rejects = expect(() => - expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual([1, 2, 3]); - }) - ).rejects; - - await rejects.toThrow(); - }); - }); - - describe('wrong number of emitted values', () => { - it('should fail with correct message', async () => { - const observable = interval(10).pipe(take(3)); - - const rejects = expect(() => - expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual([0, 1]); - }) - ).rejects; - - await rejects.toThrow(); - }); - }); - - describe('wrong emitted values', () => { - it('should fail with correct message', async () => { - const observable = interval(10).pipe(take(3)); - - const rejects = expect(() => - expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual([1, 2, 3]); - }) - ).rejects; - - await rejects.toThrow(); - }); - }); - - describe('wrong emitted value types', () => { - it('should fail with correct message', async () => { - const observable = interval(10).pipe(take(3)) as unknown as Observable; - - const rejects = expect(() => - expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual(['0', '1', '2']); - }) - ).rejects; - - await rejects.toThrow(); - }); - }); - - describe(`observable that does not complete within ${OBSERVABLE_TEST_TIMEOUT_IN_MS}ms`, () => { - it('should fail with correct message', async () => { - const observable = interval(600); - - const rejects = expect(() => - expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual([0]); - }) - ).rejects; - - await rejects.toThrow(); - }); - }); - }); - - describe('passing tests', () => { - describe('correct emitted values', () => { - it('should pass with correct message', async () => { - const observable = interval(10).pipe(take(3)); - await expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual([0, 1, 2]); - }); - }); - }); - - describe('correct emitted values with throw', () => { - it('should pass with correct message', async () => { - const observable = interval(10).pipe( - map((interval) => { - if (interval > 1) { - throw 'an error'; - } - - return interval; - }) - ); - - await expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual([0, 1, 'an error']); - }); - }); - }); - - describe('correct emitted values with throwError', () => { - it('should pass with correct message', async () => { - const observable = interval(10).pipe( - mergeMap((interval) => { - if (interval === 1) { - return throwError('an error'); - } - - return of(interval); - }) - ); - - await expect(observable).toEmitValuesWith((received) => { - expect(received).toEqual([0, 'an error']); - }); - }); - }); - }); -}); diff --git a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValuesWith.ts b/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValuesWith.ts deleted file mode 100644 index 2c647baea5b..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/toEmitValuesWith.ts +++ /dev/null @@ -1,63 +0,0 @@ -// Core Grafana history -import { matcherHint, printReceived } from 'jest-matcher-utils'; -import { Observable, Subscription } from 'rxjs'; - -import { expectObservable, forceObservableCompletion } from './utils'; - -function tryExpectations(received: unknown[], expectations: (received: unknown[]) => void): jest.CustomMatcherResult { - try { - expectations(received); - return { - pass: true, - message: () => `${matcherHint('.not.toEmitValues')} - - Expected observable to complete with - ${printReceived(received)} - `, - }; - } catch (err) { - return { - pass: false, - message: () => 'failed ' + err, - }; - } -} - -/** - * Collect all the values emitted by the observables (also errors) and pass them to the expectations functions after - * the observable ended (or emitted error). If Observable does not complete within OBSERVABLE_TEST_TIMEOUT_IN_MS the - * test fails. - */ -export function toEmitValuesWith( - received: Observable, - expectations: (actual: any[]) => void -): Promise { - const failsChecks = expectObservable(received); - if (failsChecks) { - return Promise.resolve(failsChecks); - } - - return new Promise((resolve) => { - const receivedValues: any[] = []; - const subscription = new Subscription(); - - subscription.add( - received.subscribe({ - next: (value) => { - receivedValues.push(value); - }, - error: (err) => { - receivedValues.push(err); - subscription.unsubscribe(); - resolve(tryExpectations(receivedValues, expectations)); - }, - complete: () => { - subscription.unsubscribe(); - resolve(tryExpectations(receivedValues, expectations)); - }, - }) - ); - - forceObservableCompletion(subscription, resolve); - }); -} diff --git a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/types.ts b/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/types.ts deleted file mode 100644 index 953b5ff86da..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/types.ts +++ /dev/null @@ -1,14 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/test/matchers/toEmitValuesWith.ts -import { Observable } from 'rxjs'; - -export const OBSERVABLE_TEST_TIMEOUT_IN_MS = 1000; - -export type ObservableType = T extends Observable ? V : never; - -export interface ObservableMatchers extends jest.ExpectExtendMap { - toEmitValues>(received: T, expected: E[]): Promise; - toEmitValuesWith>( - received: T, - expectations: (received: E[]) => void - ): Promise; -} diff --git a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/utils.ts b/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/utils.ts deleted file mode 100644 index 3915cc13a4f..00000000000 --- a/packages/grafana-prometheus/src/gcopypaste/public/test/matchers/utils.ts +++ /dev/null @@ -1,64 +0,0 @@ -// Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/test/matchers/utils.ts -import { matcherHint, printExpected, printReceived } from 'jest-matcher-utils'; -import { asapScheduler, Subscription, timer, isObservable } from 'rxjs'; - -import { OBSERVABLE_TEST_TIMEOUT_IN_MS } from './types'; - -export function forceObservableCompletion(subscription: Subscription, resolve: (args: any) => void) { - const timeoutObservable = timer(OBSERVABLE_TEST_TIMEOUT_IN_MS, asapScheduler); - - subscription.add( - timeoutObservable.subscribe(() => { - subscription.unsubscribe(); - resolve({ - pass: false, - message: () => - `${matcherHint('.toEmitValues')} - - Expected ${printReceived('Observable')} to be ${printExpected( - `completed within ${OBSERVABLE_TEST_TIMEOUT_IN_MS}ms` - )} but it did not.`, - }); - }) - ); -} - -export function expectObservableToBeDefined(received: unknown): jest.CustomMatcherResult | null { - if (received) { - return null; - } - - return { - pass: false, - message: () => `${matcherHint('.toEmitValues')} - -Expected ${printReceived(received)} to be ${printExpected('defined')}.`, - }; -} - -export function expectObservableToBeObservable(received: unknown): jest.CustomMatcherResult | null { - if (isObservable(received)) { - return null; - } - - return { - pass: false, - message: () => `${matcherHint('.toEmitValues')} - -Expected ${printReceived(received)} to be ${printExpected('an Observable')}.`, - }; -} - -export function expectObservable(received: unknown): jest.CustomMatcherResult | null { - const toBeDefined = expectObservableToBeDefined(received); - if (toBeDefined) { - return toBeDefined; - } - - const toBeObservable = expectObservableToBeObservable(received); - if (toBeObservable) { - return toBeObservable; - } - - return null; -} diff --git a/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.tsx b/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.tsx index 1fb721fdfad..a98cc3a44c1 100644 --- a/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.tsx +++ b/packages/grafana-prometheus/src/querybuilder/QueryPatternsModal.tsx @@ -3,11 +3,10 @@ import { css } from '@emotion/css'; import { capitalize } from 'lodash'; import { useMemo, useState } from 'react'; -import { CoreApp, DataQuery, GrafanaTheme2 } from '@grafana/data'; +import { CoreApp, DataQuery, getNextRefId, GrafanaTheme2 } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import { Button, Collapse, Modal, useStyles2 } from '@grafana/ui'; -import { getNextRefIdChar } from '../gcopypaste/app/core/utils/query'; import { PromQuery } from '../types'; import { promQueryModeller } from './PromQueryModeller'; @@ -59,7 +58,7 @@ export const QueryPatternsModal = (props: Props) => { if (hasNewQueryOption && selectAsNewQuery) { onAddQuery({ ...query, - refId: getNextRefIdChar(queries ?? [query]), + refId: getNextRefId(queries ?? [query]), expr: promQueryModeller.renderQuery(visualQuery.query), }); } else { diff --git a/packages/grafana-prometheus/src/querybuilder/components/LabelFilters.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/LabelFilters.test.tsx index 55151ae2800..8647feee695 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/LabelFilters.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/LabelFilters.test.tsx @@ -3,7 +3,7 @@ import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import { ComponentProps } from 'react'; -import { selectOptionInTest } from '../../gcopypaste/test/helpers/selectOptionInTest'; +import { selectOptionInTest } from '../../test/helpers/selectOptionInTest'; import { getLabelSelects } from '../testUtils'; import { LabelFilters, MISSING_LABEL_FILTER_ERROR_MESSAGE, LabelFiltersProps } from './LabelFilters'; diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderOptions.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderOptions.test.tsx index b6654dadafb..61d6c4dfda2 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderOptions.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryBuilderOptions.test.tsx @@ -4,7 +4,7 @@ import userEvent from '@testing-library/user-event'; import { CoreApp } from '@grafana/data'; -import { selectOptionInTest } from '../../gcopypaste/test/helpers/selectOptionInTest'; +import { selectOptionInTest } from '../../test/helpers/selectOptionInTest'; import { PromQuery } from '../../types'; import { getQueryWithDefaults } from '../state'; diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditorAutocompleteInfo.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditorAutocompleteInfo.test.tsx index 42ae5cb2284..3a2d762db70 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditorAutocompleteInfo.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryCodeEditorAutocompleteInfo.test.tsx @@ -30,18 +30,6 @@ jest.mock('../../components/monaco-query-field/MonacoQueryFieldWrapper', () => { }; }); -jest.mock('../../gcopypaste/app/core/store', () => { - return { - get() { - return undefined; - }, - set() {}, - getObject(key: string, defaultValue: unknown) { - return defaultValue; - }, - }; -}); - jest.mock('@grafana/runtime', () => { return { ...jest.requireActual('@grafana/runtime'), diff --git a/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.test.tsx b/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.test.tsx index dcba07eb367..6cfbf555999 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.test.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/PromQueryEditorSelector.test.tsx @@ -24,18 +24,6 @@ jest.mock('../../components/monaco-query-field/MonacoQueryFieldWrapper', () => { }; }); -jest.mock('app/core/store', () => { - return { - get() { - return undefined; - }, - set() {}, - getObject(key: string, defaultValue: unknown) { - return defaultValue; - }, - }; -}); - jest.mock('@grafana/runtime', () => { return { ...jest.requireActual('@grafana/runtime'), diff --git a/packages/grafana-prometheus/src/querybuilder/components/promQail/PromQail.tsx b/packages/grafana-prometheus/src/querybuilder/components/promQail/PromQail.tsx index 7c9304f8fc7..4993cb51127 100644 --- a/packages/grafana-prometheus/src/querybuilder/components/promQail/PromQail.tsx +++ b/packages/grafana-prometheus/src/querybuilder/components/promQail/PromQail.tsx @@ -3,12 +3,11 @@ import { css, cx } from '@emotion/css'; import { PayloadAction, createSlice } from '@reduxjs/toolkit'; import { useEffect, useReducer, useRef, useState } from 'react'; -import { GrafanaTheme2 } from '@grafana/data'; +import { GrafanaTheme2, store } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import { Alert, Button, Checkbox, Input, Spinner, useTheme2 } from '@grafana/ui'; import { PrometheusDatasource } from '../../../datasource'; -import store from '../../../gcopypaste/app/core/store'; import { PromVisualQuery } from '../../types'; import { QuerySuggestionContainer } from './QuerySuggestionContainer'; diff --git a/packages/grafana-prometheus/src/querybuilder/hooks/useFlag.ts b/packages/grafana-prometheus/src/querybuilder/hooks/useFlag.ts index 7dfc732b025..f0df6046d58 100644 --- a/packages/grafana-prometheus/src/querybuilder/hooks/useFlag.ts +++ b/packages/grafana-prometheus/src/querybuilder/hooks/useFlag.ts @@ -1,7 +1,7 @@ // Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/hooks/useFlag.ts import { useCallback, useState } from 'react'; -import store from '../../gcopypaste/app/core/store'; +import { store } from '@grafana/data'; export const promQueryEditorExplainKey = 'PrometheusQueryEditorExplainDefault'; diff --git a/packages/grafana-prometheus/src/querybuilder/state.ts b/packages/grafana-prometheus/src/querybuilder/state.ts index fddda52c406..915acb4aa60 100644 --- a/packages/grafana-prometheus/src/querybuilder/state.ts +++ b/packages/grafana-prometheus/src/querybuilder/state.ts @@ -1,7 +1,6 @@ // Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querybuilder/state.ts -import { CoreApp } from '@grafana/data'; +import { CoreApp, store } from '@grafana/data'; -import store from '../gcopypaste/app/core/store'; import { LegendFormatMode, PromQuery } from '../types'; import { QueryEditorMode } from './shared/types'; diff --git a/packages/grafana-prometheus/src/querycache/QueryCache.ts b/packages/grafana-prometheus/src/querycache/QueryCache.ts index f4b955b82a6..4758e4cff58 100644 --- a/packages/grafana-prometheus/src/querycache/QueryCache.ts +++ b/packages/grafana-prometheus/src/querycache/QueryCache.ts @@ -1,5 +1,6 @@ // Core Grafana history https://github.com/grafana/grafana/blob/v11.0.0-preview/public/app/plugins/datasource/prometheus/querycache/QueryCache.ts import { + amendTable, DataFrame, DataQueryRequest, dateTime, @@ -8,9 +9,10 @@ import { incrRoundDn, isValidDuration, parseDuration, + Table, + trimTable, } from '@grafana/data'; -import { amendTable, Table, trimTable } from '../gcopypaste/app/features/live/data/amendTimeSeries'; import { PromQuery } from '../types'; // dashboardUID + panelId + refId diff --git a/packages/grafana-prometheus/src/__mocks__/datasource.ts b/packages/grafana-prometheus/src/test/__mocks__/datasource.ts similarity index 71% rename from packages/grafana-prometheus/src/__mocks__/datasource.ts rename to packages/grafana-prometheus/src/test/__mocks__/datasource.ts index 9237f1b65f0..e4e4fb21e3c 100644 --- a/packages/grafana-prometheus/src/__mocks__/datasource.ts +++ b/packages/grafana-prometheus/src/test/__mocks__/datasource.ts @@ -1,6 +1,53 @@ -import { CoreApp, DataQueryRequest, dateTime, rangeUtil, TimeRange } from '@grafana/data'; +import { merge } from 'lodash'; -import { PromQuery } from '../types'; +import { + CoreApp, + DataQueryRequest, + DataSourceJsonData, + DataSourceSettings, + dateTime, + rangeUtil, + TimeRange, +} from '@grafana/data'; + +import { PromOptions, PromQuery } from '../../types'; + +export const getMockDataSource = ( + overrides?: Partial> +): DataSourceSettings => + merge( + { + access: '', + basicAuth: false, + basicAuthUser: '', + withCredentials: false, + database: '', + id: 13, + uid: 'x', + isDefault: false, + jsonData: { authType: 'credentials', defaultRegion: 'eu-west-2' }, + name: 'gdev-prometheus', + typeName: 'Prometheus', + orgId: 1, + readOnly: false, + type: 'prometheus', + typeLogoUrl: 'packages/grafana-prometheus/src/img/prometheus_logo.svg', + url: '', + user: '', + secureJsonFields: {}, + }, + overrides + ); + +export function createDefaultConfigOptions(): DataSourceSettings { + return getMockDataSource({ + jsonData: { + timeInterval: '1m', + queryTimeout: '1m', + httpMethod: 'GET', + }, + }); +} export function createDataRequest( targets: PromQuery[], diff --git a/packages/grafana-prometheus/src/gcopypaste/test/helpers/selectOptionInTest.ts b/packages/grafana-prometheus/src/test/helpers/selectOptionInTest.ts similarity index 100% rename from packages/grafana-prometheus/src/gcopypaste/test/helpers/selectOptionInTest.ts rename to packages/grafana-prometheus/src/test/helpers/selectOptionInTest.ts diff --git a/packages/grafana-schema/src/common/common.gen.ts b/packages/grafana-schema/src/common/common.gen.ts index 960abb68275..ff3fce0def6 100644 --- a/packages/grafana-schema/src/common/common.gen.ts +++ b/packages/grafana-schema/src/common/common.gen.ts @@ -771,6 +771,8 @@ export interface TableJsonViewCellOptions { * Json view cell options */ export interface TableImageCellOptions { + alt?: string; + title?: string; type: TableCellDisplayMode.Image; } diff --git a/packages/grafana-schema/src/common/table.cue b/packages/grafana-schema/src/common/table.cue index 417d9768ea6..9dc54fe5ec4 100644 --- a/packages/grafana-schema/src/common/table.cue +++ b/packages/grafana-schema/src/common/table.cue @@ -48,6 +48,8 @@ TableJsonViewCellOptions: { // Json view cell options TableImageCellOptions: { type: TableCellDisplayMode & "image" + alt?: string + title?: string } @cuetsy(kind="interface") // Show data links in the cell diff --git a/packages/grafana-schema/src/index.gen.ts b/packages/grafana-schema/src/index.gen.ts index 88e4a174071..215c19e1098 100644 --- a/packages/grafana-schema/src/index.gen.ts +++ b/packages/grafana-schema/src/index.gen.ts @@ -125,9 +125,13 @@ export type { LibraryPanel } from './veneer/librarypanel.types'; export type { Preferences, QueryHistoryPreference, - CookiePreferences + CookiePreferences, + NavbarPreference } from './raw/preferences/x/preferences_types.gen'; +// Raw generated enums and default consts from preferences kind. +export { defaultNavbarPreference } from './raw/preferences/x/preferences_types.gen'; + // Raw generated types from PublicDashboard kind. export type { PublicDashboard } from './raw/publicdashboard/x/publicdashboard_types.gen'; diff --git a/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts b/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts index 46e58446be2..784b96494f4 100644 --- a/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts +++ b/packages/grafana-schema/src/raw/dashboard/x/dashboard_types.gen.ts @@ -1062,6 +1062,10 @@ export interface Dashboard { * List of dashboard panels */ panels?: Array<(Panel | RowPanel)>; + /** + * When set to true, the dashboard will load all panels in the dashboard when it's loaded. + */ + preload?: boolean; /** * Refresh rate of dashboard. Represented via interval string, e.g. "5s", "1m", "1h", "1d". */ diff --git a/packages/grafana-schema/src/raw/preferences/x/preferences_types.gen.ts b/packages/grafana-schema/src/raw/preferences/x/preferences_types.gen.ts index b685f299f2e..9d9953e10d9 100644 --- a/packages/grafana-schema/src/raw/preferences/x/preferences_types.gen.ts +++ b/packages/grafana-schema/src/raw/preferences/x/preferences_types.gen.ts @@ -21,6 +21,14 @@ export interface CookiePreferences { performance?: Record; } +export interface NavbarPreference { + savedItemIds: Array; +} + +export const defaultNavbarPreference: Partial = { + savedItemIds: [], +}; + /** * Spec defines user, team or org Grafana preferences * swagger:model Preferences @@ -38,6 +46,10 @@ export interface Preferences { * Selected language (beta) */ language?: string; + /** + * Navigation preferences + */ + navbar?: NavbarPreference; /** * Explore query history preferences */ diff --git a/packages/grafana-ui/src/components/Table/ImageCell.tsx b/packages/grafana-ui/src/components/Table/ImageCell.tsx index 83b8b888911..4e9543659ec 100644 --- a/packages/grafana-ui/src/components/Table/ImageCell.tsx +++ b/packages/grafana-ui/src/components/Table/ImageCell.tsx @@ -3,41 +3,41 @@ import * as React from 'react'; import { getCellLinks } from '../../utils'; import { DataLinksContextMenu } from '../DataLinks/DataLinksContextMenu'; -import { TableCellProps } from './types'; +import { TableCellDisplayMode, TableCellProps } from './types'; +import { getCellOptions } from './utils'; const DATALINKS_HEIGHT_OFFSET = 10; export const ImageCell = (props: TableCellProps) => { const { field, cell, tableStyles, row, cellProps } = props; - + const cellOptions = getCellOptions(field); + const { title, alt } = + cellOptions.type === TableCellDisplayMode.Image ? cellOptions : { title: undefined, alt: undefined }; const displayValue = field.display!(cell.value); - const hasLinks = Boolean(getCellLinks(field, row)?.length); + // The image element + const img = ( + {alt} + ); + return (
- {!hasLinks && ( - - )} + {/* If there are no links we simply render the image */} + {!hasLinks && img} + {/* Otherwise render data links with image */} {hasLinks && ( getCellLinks(field, row) || []} > {(api) => { - const img = ( - - ); if (api.openMenu) { return (
/[/namespaces/][/] - parts := strings.Split(key, "/") - if len(parts) < 3 { - return nil, fmt.Errorf("invalid key (expecting at least 2 parts): %s", key) +// ParseKey parses a key string into a Key. +// Format: [/group/]/resource/[/namespace/][/name/] +func ParseKey(raw string) (*Key, error) { + parts := strings.Split(raw, "/") + key := &Key{} + + // Skip the first empty string + if parts[0] == "" { + parts = parts[1:] } - if parts[0] != "" { - return nil, fmt.Errorf("invalid key (expecting leading slash): %s", key) + for i := 0; i < len(parts); i += 2 { + k := parts[i] + if i+1 >= len(parts) { + return nil, fmt.Errorf("invalid key: %s", raw) + } + v := parts[i+1] + switch k { + case "group": + key.Group = v + case "resource": + key.Resource = v + case "namespace": + key.Namespace = v + case "name": + key.Name = v + default: + return nil, fmt.Errorf("invalid key name: %s", key) + } } - k := &Key{ - Group: parts[1], - Resource: parts[2], + if len(key.Resource) == 0 { + return nil, fmt.Errorf("missing resource: %s", raw) } - if len(parts) == 3 { - return k, nil - } - - if parts[3] != "namespaces" { - k.Name = parts[3] - return k, nil - } - - if len(parts) < 5 { - return nil, fmt.Errorf("invalid key (expecting namespace after 'namespaces'): %s", key) - } - - k.Namespace = parts[4] - - if len(parts) == 5 { - return k, nil - } - - k.Name = parts[5] - - return k, nil + return key, nil } +// String returns the string representation of the Key. func (k *Key) String() string { - s := "/" + k.Group + "/" + k.Resource + var builder strings.Builder + + if len(k.Group) > 0 { + builder.WriteString("/group/") + builder.WriteString(k.Group) + } + if len(k.Resource) > 0 { + builder.WriteString("/resource/") + builder.WriteString(k.Resource) + } if len(k.Namespace) > 0 { - s += "/namespaces/" + k.Namespace + builder.WriteString("/namespace/") + builder.WriteString(k.Namespace) } if len(k.Name) > 0 { - s += "/" + k.Name + builder.WriteString("/name/") + builder.WriteString(k.Name) } - return s + + return builder.String() } +// IsEqual returns true if the keys are equal. func (k *Key) IsEqual(other *Key) bool { return k.Group == other.Group && k.Resource == other.Resource && diff --git a/pkg/apiserver/registry/generic/key_test.go b/pkg/apiserver/registry/generic/key_test.go new file mode 100644 index 00000000000..c000bd58784 --- /dev/null +++ b/pkg/apiserver/registry/generic/key_test.go @@ -0,0 +1,120 @@ +package generic + +import ( + "reflect" + "testing" +) + +func TestParseKey(t *testing.T) { + tests := []struct { + name string + raw string + expected *Key + wantErr bool + }{ + { + name: "All keys", + raw: "/group/test-group/resource/test-resource/namespace/test-namespace/name/test-name", + expected: &Key{Group: "test-group", Resource: "test-resource", Namespace: "test-namespace", Name: "test-name"}, + wantErr: false, + }, + { + name: "Missing group", + raw: "/resource/test-resource/namespace/test-namespace/name/test-name", + expected: &Key{Group: "", Resource: "test-resource", Namespace: "test-namespace", Name: "test-name"}, + wantErr: false, + }, + { + name: "Missing namespace", + raw: "/group/test-group/resource/test-resource/name/test-name", + expected: &Key{Group: "test-group", Resource: "test-resource", Namespace: "", Name: "test-name"}, + wantErr: false, + }, + { + name: "Missing name", + raw: "/group/test-group/resource/test-resource/namespace/test-namespace", + expected: &Key{Group: "test-group", Resource: "test-resource", Namespace: "test-namespace", Name: ""}, + wantErr: false, + }, + { + name: "Missing resource", + raw: "/group/test-group/namespace/test-namespace/name/test-name", + expected: nil, + wantErr: true, + }, + { + name: "Empty string", + raw: "", + expected: nil, + wantErr: true, + }, + { + name: "Invalid key", + raw: "/", + expected: nil, + wantErr: true, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := ParseKey(tt.raw) + if (err != nil) != tt.wantErr { + t.Errorf("ParseKey() error = %v, wantErr %v", err, tt.wantErr) + return + } + if !reflect.DeepEqual(got, tt.expected) { + t.Errorf("ParseKey() = %v, expected %v", got, tt.expected) + } + }) + } +} + +func BenchmarkKey_String(b *testing.B) { + key := &Key{Group: "test-group", Resource: "test-resource", Namespace: "test-namespace", Name: "test-name"} + for i := 0; i < b.N; i++ { + _ = key.String() + } +} +func TestKey_String(t *testing.T) { + tests := []struct { + name string + key *Key + expected string + }{ + { + name: "All fields", + key: &Key{Group: "test-group", Resource: "test-resource", Namespace: "test-namespace", Name: "test-name"}, + expected: "/group/test-group/resource/test-resource/namespace/test-namespace/name/test-name", + }, + { + name: "Missing group", + key: &Key{Resource: "test-resource", Namespace: "test-namespace", Name: "test-name"}, + expected: "/resource/test-resource/namespace/test-namespace/name/test-name", + }, + { + name: "Missing namespace", + key: &Key{Group: "test-group", Resource: "test-resource", Name: "test-name"}, + expected: "/group/test-group/resource/test-resource/name/test-name", + }, + { + name: "Missing name", + key: &Key{Group: "test-group", Resource: "test-resource", Namespace: "test-namespace"}, + expected: "/group/test-group/resource/test-resource/namespace/test-namespace", + }, + { + name: "Missing resource", + key: &Key{Group: "test-group", Namespace: "test-namespace", Name: "test-name"}, + expected: "/group/test-group/namespace/test-namespace/name/test-name", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got := tt.key.String() + if got != tt.expected { + t.Errorf("Key.String() = %s, expected %s", got, tt.expected) + } + }) + } +} diff --git a/pkg/kinds/dashboard/dashboard_spec_gen.go b/pkg/kinds/dashboard/dashboard_spec_gen.go index ab33a177135..889dd767c9b 100644 --- a/pkg/kinds/dashboard/dashboard_spec_gen.go +++ b/pkg/kinds/dashboard/dashboard_spec_gen.go @@ -753,6 +753,9 @@ type Spec struct { // List of dashboard panels Panels []any `json:"panels,omitempty"` + // When set to true, the dashboard will load all panels in the dashboard when it's loaded. + Preload *bool `json:"preload,omitempty"` + // Refresh rate of dashboard. Represented via interval string, e.g. "5s", "1m", "1h", "1d". Refresh *string `json:"refresh,omitempty"` diff --git a/pkg/kinds/preferences/preferences_spec_gen.go b/pkg/kinds/preferences/preferences_spec_gen.go index 1c28568cfbc..7d0dd39cfc1 100644 --- a/pkg/kinds/preferences/preferences_spec_gen.go +++ b/pkg/kinds/preferences/preferences_spec_gen.go @@ -16,6 +16,11 @@ type CookiePreferences struct { Performance map[string]any `json:"performance,omitempty"` } +// NavbarPreference defines model for NavbarPreference. +type NavbarPreference struct { + SavedItemIds []string `json:"savedItemIds"` +} + // QueryHistoryPreference defines model for QueryHistoryPreference. type QueryHistoryPreference struct { // HomeTab one of: '' | 'query' | 'starred'; @@ -32,6 +37,7 @@ type Spec struct { // Selected language (beta) Language *string `json:"language,omitempty"` + Navbar *NavbarPreference `json:"navbar,omitempty"` QueryHistory *QueryHistoryPreference `json:"queryHistory,omitempty"` // Theme light, dark, empty is default diff --git a/pkg/middleware/request_tracing.go b/pkg/middleware/request_tracing.go index 3a7f8d59213..d97db94c908 100644 --- a/pkg/middleware/request_tracing.go +++ b/pkg/middleware/request_tracing.go @@ -74,32 +74,40 @@ func RouteOperationName(req *http.Request) (string, bool) { func RequestTracing(tracer tracing.Tracer) web.Middleware { return func(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { - if strings.HasPrefix(req.URL.Path, "/public/") || req.URL.Path == "/robots.txt" || req.URL.Path == "/favicon.ico" { + // skip tracing for a few endpoints + if strings.HasPrefix(req.URL.Path, "/public/") || + req.URL.Path == "/robots.txt" || + req.URL.Path == "/favicon.ico" { next.ServeHTTP(w, req) return } - rw := web.Rw(w, req) + // Extract the parent span context from the incoming request. + ctx := otel.GetTextMapPropagator().Extract(req.Context(), propagation.HeaderCarrier(req.Header)) - wireContext := otel.GetTextMapPropagator().Extract(req.Context(), propagation.HeaderCarrier(req.Header)) - ctx, span := tracer.Start(wireContext, fmt.Sprintf("HTTP %s %s", req.Method, req.URL.Path), trace.WithLinks(trace.LinkFromContext(wireContext))) - - req = req.WithContext(ctx) - next.ServeHTTP(w, req) - - // Only call span.Finish when a route operation name have been set, - // meaning that not set the span would not be reported. + // generic span name for requests where there's no route operation name + spanName := fmt.Sprintf("HTTP %s ", req.Method) // TODO: do not depend on web.Context from the future if routeOperation, exists := RouteOperationName(web.FromContext(req.Context()).Req); exists { - defer span.End() - span.SetName(fmt.Sprintf("HTTP %s %s", req.Method, routeOperation)) + spanName = fmt.Sprintf("HTTP %s %s", req.Method, routeOperation) } + ctx, span := tracer.Start(ctx, spanName, trace.WithAttributes( + semconv.HTTPURLKey.String(req.RequestURI), + semconv.HTTPMethodKey.String(req.Method), + ), trace.WithSpanKind(trace.SpanKindServer)) + defer span.End() + + req = req.WithContext(ctx) + + // Ensure the response writer's status can be captured. + rw := web.Rw(w, req) + + next.ServeHTTP(rw, req) + status := rw.Status() span.SetAttributes(semconv.HTTPStatusCode(status)) - span.SetAttributes(semconv.HTTPURL(req.RequestURI)) - span.SetAttributes(semconv.HTTPMethod(req.Method)) if status >= 400 { span.SetStatus(codes.Error, fmt.Sprintf("error with HTTP status code %s", strconv.Itoa(status))) } diff --git a/pkg/promlib/admission_handler.go b/pkg/promlib/admission_handler.go new file mode 100644 index 00000000000..4cfa68b1d53 --- /dev/null +++ b/pkg/promlib/admission_handler.go @@ -0,0 +1,77 @@ +package promlib + +import ( + "context" + "fmt" + "net/http" + + "github.com/grafana/grafana-plugin-sdk-go/backend" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var ( + _ backend.AdmissionHandler = (*Service)(nil) +) + +// ValidateAdmission implements backend.AdmissionHandler. +func (s *Service) ValidateAdmission(ctx context.Context, req *backend.AdmissionRequest) (*backend.ValidationResponse, error) { + rsp, err := s.MutateAdmission(ctx, req) + if rsp != nil { + return &backend.ValidationResponse{ + Allowed: rsp.Allowed, + Result: rsp.Result, + Warnings: rsp.Warnings, + }, err + } + return nil, err +} + +// MutateAdmission implements backend.AdmissionHandler. +func (s *Service) MutateAdmission(ctx context.Context, req *backend.AdmissionRequest) (*backend.MutationResponse, error) { + expected := (&backend.DataSourceInstanceSettings{}).GVK() + if req.Kind.Kind != expected.Kind && req.Kind.Group != expected.Group { + return getBadRequest("expected DataSourceInstanceSettings protobuf payload"), nil + } + + // Convert the payload from protobuf to an SDK struct + settings, err := backend.DataSourceInstanceSettingsFromProto(req.ObjectBytes, "") + if err != nil { + return nil, err + } + if settings == nil { + return getBadRequest("missing datasource settings"), nil + } + + switch settings.APIVersion { + case "", "v0alpha1": + // OK! + default: + return getBadRequest(fmt.Sprintf("expected apiVersion: v0alpha1, found: %s", settings.APIVersion)), nil + } + if settings.URL != "" { + return getBadRequest("unsupported URL value"), nil + } + + pb, err := backend.DataSourceInstanceSettingsToProtoBytes(settings) + return &backend.MutationResponse{ + Allowed: true, + ObjectBytes: pb, + }, err +} + +// ConvertObject implements backend.AdmissionHandler. +func (s *Service) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) { + return nil, fmt.Errorf("not implemented") +} + +func getBadRequest(msg string) *backend.MutationResponse { + return &backend.MutationResponse{ + Allowed: false, + Result: &backend.StatusResult{ + Status: "Failure", + Message: msg, + Reason: string(metav1.StatusReasonBadRequest), + Code: http.StatusBadRequest, + }, + } +} diff --git a/pkg/promlib/go.mod b/pkg/promlib/go.mod index 736579dc90a..201f24f3496 100644 --- a/pkg/promlib/go.mod +++ b/pkg/promlib/go.mod @@ -13,6 +13,7 @@ require ( go.opentelemetry.io/otel v1.26.0 go.opentelemetry.io/otel/trace v1.26.0 golang.org/x/exp v0.0.0-20240416160154-fe59bbe5cc7f + k8s.io/apimachinery v0.29.3 ) require ( @@ -118,7 +119,13 @@ require ( google.golang.org/grpc v1.64.0 // indirect google.golang.org/protobuf v1.34.1 // indirect gopkg.in/fsnotify/fsnotify.v1 v1.4.7 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/klog/v2 v2.120.1 // indirect k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 // indirect k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.4.1 // indirect + sigs.k8s.io/yaml v1.4.0 // indirect ) diff --git a/pkg/promlib/go.sum b/pkg/promlib/go.sum index e3e1bb59f3e..a4775ee92f8 100644 --- a/pkg/promlib/go.sum +++ b/pkg/promlib/go.sum @@ -187,6 +187,7 @@ github.com/smartystreets/assertions v0.0.0-20190116191733-b6c0e53d7304/go.mod h1 github.com/smartystreets/goconvey v0.0.0-20181108003508-044398e4856c/go.mod h1:XDJAKZRPZ1CvBcN2aX5YOUTYGHki24fSF0Iv48Ibg0s= github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= @@ -289,14 +290,19 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= gopkg.in/fsnotify/fsnotify.v1 v1.4.7 h1:XNNYLJHt73EyYiCZi6+xjupS9CpvmiDgjPTAjrBlQbo= gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1qJ27s+7ltE= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +k8s.io/apimachinery v0.29.3 h1:2tbx+5L7RNvqJjn7RIuIKu9XTsIZ9Z5wX2G22XAa5EU= +k8s.io/klog/v2 v2.120.1 h1:QXU6cPEOIslTGvZaXvFWiP9VKyeet3sawzTOvdXb4Vw= k8s.io/kube-openapi v0.0.0-20240228011516-70dd3763d340 h1:BZqlfIlq5YbRMFko6/PM7FjZpUb45WallggurYhKGag= k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4= +sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E= diff --git a/pkg/registry/apis/datasource/register.go b/pkg/registry/apis/datasource/register.go index 9ee6741720c..a938631a2ee 100644 --- a/pkg/registry/apis/datasource/register.go +++ b/pkg/registry/apis/datasource/register.go @@ -67,6 +67,8 @@ func RegisterAPIService( var err error var builder *DataSourceAPIBuilder all := pluginStore.Plugins(context.Background(), plugins.TypeDataSource) + // ATTENTION: Adding a datasource here requires the plugin to implement + // an AdmissionHandler to validate the datasource settings. ids := []string{ "grafana-testdata-datasource", "prometheus", diff --git a/pkg/services/accesscontrol/accesscontrol.go b/pkg/services/accesscontrol/accesscontrol.go index 66593e0335b..0c2b31efe42 100644 --- a/pkg/services/accesscontrol/accesscontrol.go +++ b/pkg/services/accesscontrol/accesscontrol.go @@ -12,8 +12,13 @@ import ( contextmodel "github.com/grafana/grafana/pkg/services/contexthandler/model" "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/user" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/trace" ) +var tracer = otel.Tracer("github.com/grafana/grafana/pkg/services/accesscontrol") + type AccessControl interface { // Evaluate evaluates access to the given resources. Evaluate(ctx context.Context, user identity.Requester, evaluator Evaluator) (bool, error) @@ -232,30 +237,24 @@ func BuildPermissionsMap(permissions []Permission) map[string]bool { } // GroupScopesByAction will group scopes on action +// +// Deprecated: use GroupScopesByActionContext instead func GroupScopesByAction(permissions []Permission) map[string][]string { - // Use a map to deduplicate scopes. - // User can have the same permission from multiple sources (e.g. team, basic role, directly assigned etc). - // User will also have duplicate permissions if action sets are used, as we will be double writing permissions for a while. - m := make(map[string]map[string]struct{}) + return GroupScopesByActionContext(context.Background(), permissions) +} + +// GroupScopesByAction will group scopes on action +func GroupScopesByActionContext(ctx context.Context, permissions []Permission) map[string][]string { + _, span := tracer.Start(ctx, "accesscontrol.GroupScopesByActionContext", trace.WithAttributes( + attribute.Int("permissions_count", len(permissions)), + )) + defer span.End() + + m := make(map[string][]string) for i := range permissions { - if _, ok := m[permissions[i].Action]; !ok { - m[permissions[i].Action] = make(map[string]struct{}) - } - m[permissions[i].Action][permissions[i].Scope] = struct{}{} + m[permissions[i].Action] = append(m[permissions[i].Action], permissions[i].Scope) } - - res := make(map[string][]string, len(m)) - for action, scopes := range m { - scopeList := make([]string, len(scopes)) - i := 0 - for scope := range scopes { - scopeList[i] = scope - i++ - } - res[action] = scopeList - } - - return res + return m } // Reduce will reduce a list of permissions to its minimal form, grouping scopes by action diff --git a/pkg/services/accesscontrol/accesscontrol_test.go b/pkg/services/accesscontrol/accesscontrol_test.go index b39ca3b8a80..f56dff456a0 100644 --- a/pkg/services/accesscontrol/accesscontrol_test.go +++ b/pkg/services/accesscontrol/accesscontrol_test.go @@ -1,8 +1,11 @@ package accesscontrol import ( + "context" + "fmt" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" // this import is needed for github.com/grafana/grafana/pkg/web hack_wrap to work @@ -125,3 +128,54 @@ func TestReduce(t *testing.T) { }) } } + +func TestGroupScopesByActionContext(t *testing.T) { + // test data = 3 actions with 2+i scopes each, including a duplicate + permissions := []Permission{} + for i := 0; i < 3; i++ { + for j := 0; j < 2+i; j++ { + permissions = append(permissions, Permission{ + Action: fmt.Sprintf("action:%d", i), + Scope: fmt.Sprintf("scope:%d_%d", i, j), + }) + } + } + + expected := map[string][]string{} + for i := 0; i < 3; i++ { + action := fmt.Sprintf("action:%d", i) + scopes := []string{} + for j := 0; j < 2+i; j++ { + scopes = append(scopes, fmt.Sprintf("scope:%d_%d", i, j)) + } + expected[action] = scopes + } + + assert.EqualValues(t, expected, GroupScopesByActionContext(context.Background(), permissions)) +} + +func BenchmarkGroupScopesByAction(b *testing.B) { + // create a big list of permissions with a bunch of duplicates + permissions := []Permission{} + for i := 0; i < 100; i++ { + for j := 0; j < 500+i; j++ { + permissions = append(permissions, Permission{ + Action: fmt.Sprintf("action:%d", i), + Scope: fmt.Sprintf("scope:%d_%d", i, j), + }) + } + // add duplicate scopes + for j := 0; j < 10; j++ { + permissions = append(permissions, Permission{ + Action: fmt.Sprintf("action:%d", i), + Scope: fmt.Sprintf("scope:%d_%d", i, 0), + }) + } + } + + b.ResetTimer() + + for i := 0; i < b.N; i++ { + GroupScopesByActionContext(context.Background(), permissions) + } +} diff --git a/pkg/services/accesscontrol/acimpl/service.go b/pkg/services/accesscontrol/acimpl/service.go index 610d8528858..69f392bb40f 100644 --- a/pkg/services/accesscontrol/acimpl/service.go +++ b/pkg/services/accesscontrol/acimpl/service.go @@ -114,6 +114,7 @@ func (s *Service) GetUsageStats(_ context.Context) map[string]any { func (s *Service) GetUserPermissions(ctx context.Context, user identity.Requester, options accesscontrol.Options) ([]accesscontrol.Permission, error) { ctx, span := s.tracer.Start(ctx, "authz.GetUserPermissionsOSS") defer span.End() + timer := prometheus.NewTimer(metrics.MAccessPermissionsSummary) defer timer.ObserveDuration() @@ -125,6 +126,9 @@ func (s *Service) GetUserPermissions(ctx context.Context, user identity.Requeste } func (s *Service) getUserPermissions(ctx context.Context, user identity.Requester, options accesscontrol.Options) ([]accesscontrol.Permission, error) { + ctx, span := s.tracer.Start(ctx, "authz.getUserPermissions") + defer span.End() + permissions := make([]accesscontrol.Permission, 0) for _, builtin := range accesscontrol.GetOrgRoles(user) { if basicRole, ok := s.roles[builtin]; ok { @@ -265,8 +269,10 @@ func (s *Service) getCachedBasicRolesPermissions(ctx context.Context, user ident defer span.End() basicRoles := accesscontrol.GetOrgRoles(user) + span.SetAttributes(attribute.Int("roles", len(basicRoles))) for _, role := range basicRoles { perms, err := s.getCachedBasicRolePermissions(ctx, role, user.GetOrgID(), options) + span.SetAttributes(attribute.Int(fmt.Sprintf("role_%s_permissions", role), len(perms))) if err != nil { return nil, err } @@ -301,12 +307,13 @@ type getPermissionsFunc = func(ctx context.Context) ([]accesscontrol.Permission, // Generic method for getting various permissions from cache func (s *Service) getCachedPermissions(ctx context.Context, key string, getPermissionsFn getPermissionsFunc, options accesscontrol.Options) ([]accesscontrol.Permission, error) { - _, span := s.tracer.Start(ctx, "authz.getCachedPermissions") + ctx, span := s.tracer.Start(ctx, "authz.getCachedPermissions") defer span.End() if !options.ReloadCache { permissions, ok := s.cache.Get(key) if ok { + span.SetAttributes(attribute.Int("num_permissions_cached", len(permissions.([]accesscontrol.Permission)))) metrics.MAccessPermissionsCacheUsage.WithLabelValues(accesscontrol.CacheHit).Inc() return permissions.([]accesscontrol.Permission), nil } @@ -315,6 +322,7 @@ func (s *Service) getCachedPermissions(ctx context.Context, key string, getPermi span.AddEvent("cache miss") metrics.MAccessPermissionsCacheUsage.WithLabelValues(accesscontrol.CacheMiss).Inc() permissions, err := getPermissionsFn(ctx) + span.SetAttributes(attribute.Int("num_permissions_fetched", len(permissions))) if err != nil { return nil, err } @@ -338,6 +346,7 @@ func (s *Service) getCachedTeamsPermissions(ctx context.Context, user identity.R teamPermissions, ok := s.cache.Get(key) if ok { metrics.MAccessPermissionsCacheUsage.WithLabelValues(accesscontrol.CacheHit).Inc() + span.SetAttributes(attribute.Int("num_permissions_cached", len(teamPermissions.([]accesscontrol.Permission)))) permissions = append(permissions, teamPermissions.([]accesscontrol.Permission)...) } else { miss = append(miss, teamID) @@ -349,6 +358,7 @@ func (s *Service) getCachedTeamsPermissions(ctx context.Context, user identity.R span.AddEvent("cache miss") metrics.MAccessPermissionsCacheUsage.WithLabelValues(accesscontrol.CacheMiss).Inc() teamsPermissions, err := s.getTeamsPermissions(ctx, miss, orgID) + span.SetAttributes(attribute.Int("num_permissions_fetched", len(teamsPermissions))) if err != nil { return nil, err } @@ -369,10 +379,16 @@ func (s *Service) ClearUserPermissionCache(user identity.Requester) { } func (s *Service) DeleteUserPermissions(ctx context.Context, orgID int64, userID int64) error { + ctx, span := s.tracer.Start(ctx, "authz.DeleteUserPermissions") + defer span.End() + return s.store.DeleteUserPermissions(ctx, orgID, userID) } func (s *Service) DeleteTeamPermissions(ctx context.Context, orgID int64, teamID int64) error { + ctx, span := s.tracer.Start(ctx, "authz.DeleteTeamPermissions") + defer span.End() + return s.store.DeleteTeamPermissions(ctx, orgID, teamID) } @@ -398,6 +414,9 @@ func (s *Service) DeclareFixedRoles(registrations ...accesscontrol.RoleRegistrat // RegisterFixedRoles registers all declared roles in RAM func (s *Service) RegisterFixedRoles(ctx context.Context) error { + _, span := s.tracer.Start(ctx, "authz.RegisterFixedRoles") + defer span.End() + s.registrations.Range(func(registration accesscontrol.RoleRegistration) bool { for br := range accesscontrol.BuiltInRolesWithParents(registration.Grants) { if basicRole, ok := s.roles[br]; ok { @@ -421,6 +440,9 @@ func (s *Service) RegisterFixedRoles(ctx context.Context) error { // DeclarePluginRoles allow the caller to declare, to the service, plugin roles and their assignments // to organization roles ("Viewer", "Editor", "Admin") or "Grafana Admin" func (s *Service) DeclarePluginRoles(ctx context.Context, ID, name string, regs []plugins.RoleRegistration) error { + ctx, span := s.tracer.Start(ctx, "authz.DeclarePluginRoles") + defer span.End() + // Protect behind feature toggle if !s.features.IsEnabled(ctx, featuremgmt.FlagAccessControlOnCall) { return nil @@ -455,6 +477,9 @@ func GetActionFilter(options accesscontrol.SearchOptions) func(action string) bo // SearchUsersPermissions returns all users' permissions filtered by action prefixes func (s *Service) SearchUsersPermissions(ctx context.Context, usr identity.Requester, options accesscontrol.SearchOptions) (map[int64][]accesscontrol.Permission, error) { + ctx, span := s.tracer.Start(ctx, "authz.SearchUsersPermissions") + defer span.End() + // Limit roles to available in OSS options.RolePrefixes = OSSRolesPrefixes if options.NamespacedID != "" { @@ -566,6 +591,9 @@ func (s *Service) SearchUsersPermissions(ctx context.Context, usr identity.Reque } func (s *Service) SearchUserPermissions(ctx context.Context, orgID int64, searchOptions accesscontrol.SearchOptions) ([]accesscontrol.Permission, error) { + ctx, span := s.tracer.Start(ctx, "authz.SearchUserPermissions") + defer span.End() + timer := prometheus.NewTimer(metrics.MAccessPermissionsSummary) defer timer.ObserveDuration() @@ -573,13 +601,16 @@ func (s *Service) SearchUserPermissions(ctx context.Context, orgID int64, search return nil, fmt.Errorf("expected namespaced ID to be specified") } - if permissions, success := s.searchUserPermissionsFromCache(orgID, searchOptions); success { + if permissions, success := s.searchUserPermissionsFromCache(ctx, orgID, searchOptions); success { return permissions, nil } return s.searchUserPermissions(ctx, orgID, searchOptions) } func (s *Service) searchUserPermissions(ctx context.Context, orgID int64, searchOptions accesscontrol.SearchOptions) ([]accesscontrol.Permission, error) { + ctx, span := s.tracer.Start(ctx, "authz.searchUserPermissions") + defer span.End() + userID, err := searchOptions.ComputeUserID() if err != nil { return nil, err @@ -629,7 +660,10 @@ func (s *Service) searchUserPermissions(ctx context.Context, orgID int64, search return permissions, nil } -func (s *Service) searchUserPermissionsFromCache(orgID int64, searchOptions accesscontrol.SearchOptions) ([]accesscontrol.Permission, bool) { +func (s *Service) searchUserPermissionsFromCache(ctx context.Context, orgID int64, searchOptions accesscontrol.SearchOptions) ([]accesscontrol.Permission, bool) { + _, span := s.tracer.Start(ctx, "authz.searchUserPermissionsFromCache") + defer span.End() + userID, err := searchOptions.ComputeUserID() if err != nil { return nil, false @@ -669,6 +703,9 @@ func PermissionMatchesSearchOptions(permission accesscontrol.Permission, searchO } func (s *Service) SaveExternalServiceRole(ctx context.Context, cmd accesscontrol.SaveExternalServiceRoleCommand) error { + ctx, span := s.tracer.Start(ctx, "authz.SaveExternalServiceRole") + defer span.End() + if !s.features.IsEnabled(ctx, featuremgmt.FlagExternalServiceAccounts) { s.log.Debug("Registering an external service role is behind a feature flag, enable it to use this feature.") return nil @@ -682,6 +719,9 @@ func (s *Service) SaveExternalServiceRole(ctx context.Context, cmd accesscontrol } func (s *Service) DeleteExternalServiceRole(ctx context.Context, externalServiceID string) error { + ctx, span := s.tracer.Start(ctx, "authz.DeleteExternalServiceRole") + defer span.End() + if !s.features.IsEnabled(ctx, featuremgmt.FlagExternalServiceAccounts) { s.log.Debug("Deleting an external service role is behind a feature flag, enable it to use this feature.") return nil @@ -697,6 +737,9 @@ func (*Service) SyncUserRoles(ctx context.Context, orgID int64, cmd accesscontro } func (s *Service) GetRoleByName(ctx context.Context, orgID int64, roleName string) (*accesscontrol.RoleDTO, error) { + _, span := s.tracer.Start(ctx, "authz.GetRoleByName") + defer span.End() + err := accesscontrol.ErrRoleNotFound if _, ok := s.roles[roleName]; ok { return nil, err diff --git a/pkg/services/accesscontrol/acimpl/service_test.go b/pkg/services/accesscontrol/acimpl/service_test.go index 96a87accd30..7e7a6cdd43c 100644 --- a/pkg/services/accesscontrol/acimpl/service_test.go +++ b/pkg/services/accesscontrol/acimpl/service_test.go @@ -42,6 +42,7 @@ func setupTestEnv(t testing.TB) *Service { registrations: accesscontrol.RegistrationList{}, roles: accesscontrol.BuildBasicRoleDefinitions(), store: database.ProvideService(db.InitTestDB(t)), + tracer: tracing.InitializeTracerForTest(), } require.NoError(t, ac.RegisterFixedRoles(context.Background())) return ac diff --git a/pkg/services/accesscontrol/api/api.go b/pkg/services/accesscontrol/api/api.go index 67e7951267b..bd7caa6e35c 100644 --- a/pkg/services/accesscontrol/api/api.go +++ b/pkg/services/accesscontrol/api/api.go @@ -62,7 +62,7 @@ func (api *AccessControlAPI) getUserPermissions(c *contextmodel.ReqContext) resp return response.JSON(http.StatusInternalServerError, err) } - return response.JSON(http.StatusOK, ac.GroupScopesByAction(permissions)) + return response.JSON(http.StatusOK, ac.GroupScopesByActionContext(c.Req.Context(), permissions)) } // GET /api/access-control/users/permissions/search diff --git a/pkg/services/accesscontrol/migrator/zanzana.go b/pkg/services/accesscontrol/migrator/zanzana.go index 2467b0039a0..426485bde23 100644 --- a/pkg/services/accesscontrol/migrator/zanzana.go +++ b/pkg/services/accesscontrol/migrator/zanzana.go @@ -3,7 +3,6 @@ package migrator import ( "context" "fmt" - "strconv" "strings" openfgav1 "github.com/openfga/api/proto/openfga/v1" @@ -30,9 +29,14 @@ type ZanzanaSynchroniser struct { func NewZanzanaSynchroniser(client zanzana.Client, store db.DB, collectors ...TupleCollector) *ZanzanaSynchroniser { // Append shared collectors that is used by both enterprise and oss - collectors = append(collectors, managedPermissionsCollector(store)) + collectors = append( + collectors, + teamMembershipCollector(store), + managedPermissionsCollector(store), + ) return &ZanzanaSynchroniser{ + client: client, log: log.New("zanzana.sync"), collectors: collectors, } @@ -75,21 +79,24 @@ func managedPermissionsCollector(store db.DB) TupleCollector { return func(ctx context.Context, tuples map[string][]*openfgav1.TupleKey) error { const collectorID = "managed" const query = ` - SELECT ur.user_id, p.action, p.kind, p.identifier, r.org_id FROM permission p - INNER JOIN role r on p.role_id = r.id - LEFT JOIN user_role ur on r.id = ur.role_id - LEFT JOIN team_role tr on r.id = tr.role_id - LEFT JOIN builtin_role br on r.id = br.role_id - WHERE r.name LIKE 'managed:%' - ` + SELECT u.uid as user_uid, t.uid as team_uid, p.action, p.kind, p.identifier, r.org_id + FROM permission p + INNER JOIN role r ON p.role_id = r.id + LEFT JOIN user_role ur ON r.id = ur.role_id + LEFT JOIN user u ON u.id = ur.user_id + LEFT JOIN team_role tr ON r.id = tr.role_id + LEFT JOIN team t ON tr.team_id = t.id + LEFT JOIN builtin_role br ON r.id = br.role_id + WHERE r.name LIKE 'managed:%' + ` type Permission struct { RoleName string `xorm:"role_name"` OrgID int64 `xorm:"org_id"` Action string `xorm:"action"` Kind string Identifier string - UserID int64 `xorm:"user_id"` - TeamID int64 `xorm:"user_id"` + UserUID string `xorm:"user_uid"` + TeamUID string `xorm:"team_uid"` } var permissions []Permission @@ -103,10 +110,10 @@ func managedPermissionsCollector(store db.DB) TupleCollector { for _, p := range permissions { var subject string - if p.UserID > 0 { - subject = zanzana.NewObject(zanzana.TypeUser, strconv.FormatInt(p.UserID, 10)) - } else if p.TeamID > 0 { - subject = zanzana.NewObject(zanzana.TypeTeam, strconv.FormatInt(p.TeamID, 10)) + if len(p.UserUID) > 0 { + subject = zanzana.NewObject(zanzana.TypeUser, p.UserUID) + } else if len(p.TeamUID) > 0 { + subject = zanzana.NewObject(zanzana.TypeTeam, p.TeamUID) } else { // FIXME(kalleep): Unsuported role binding (org role). We need to have basic roles in place continue @@ -126,3 +133,48 @@ func managedPermissionsCollector(store db.DB) TupleCollector { return nil } } + +func teamMembershipCollector(store db.DB) TupleCollector { + return func(ctx context.Context, tuples map[string][]*openfgav1.TupleKey) error { + const collectorID = "team_membership" + const query = ` + SELECT t.uid as team_uid, u.uid as user_uid, tm.permission + FROM team_member tm + INNER JOIN team t ON tm.team_id = t.id + INNER JOIN user u ON tm.user_id = u.id + ` + + type membership struct { + TeamUID string `xorm:"team_uid"` + UserUID string `xorm:"user_uid"` + Permission int + } + + var memberships []membership + err := store.WithDbSession(ctx, func(sess *db.Session) error { + return sess.SQL(query).Find(&memberships) + }) + + if err != nil { + return err + } + + for _, m := range memberships { + tuple := &openfgav1.TupleKey{ + User: zanzana.NewObject(zanzana.TypeUser, m.UserUID), + Object: zanzana.NewObject(zanzana.TypeTeam, m.TeamUID), + } + + // Admin permission is 4 and member 0 + if m.Permission == 4 { + tuple.Relation = zanzana.RelationTeamAdmin + } else { + tuple.Relation = zanzana.RelationTeamMember + } + + tuples[collectorID] = append(tuples[collectorID], tuple) + } + + return nil + } +} diff --git a/pkg/services/accesscontrol/mock/mock.go b/pkg/services/accesscontrol/mock/mock.go index 6ceda3a6700..4bd9f1279b2 100644 --- a/pkg/services/accesscontrol/mock/mock.go +++ b/pkg/services/accesscontrol/mock/mock.go @@ -120,7 +120,7 @@ func (m *Mock) Evaluate(ctx context.Context, usr identity.Requester, evaluator a if err != nil { return false, err } - permissions = accesscontrol.GroupScopesByAction(userPermissions) + permissions = accesscontrol.GroupScopesByActionContext(ctx, userPermissions) } if evaluator.Evaluate(permissions) { diff --git a/pkg/services/accesscontrol/resourcepermissions/api_test.go b/pkg/services/accesscontrol/resourcepermissions/api_test.go index 42732a3388a..8719451294b 100644 --- a/pkg/services/accesscontrol/resourcepermissions/api_test.go +++ b/pkg/services/accesscontrol/resourcepermissions/api_test.go @@ -111,7 +111,7 @@ func TestApi_getDescription(t *testing.T) { for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { service, _, _ := setupTestEnvironment(t, tt.options) - server := setupTestServer(t, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}, service) + server := setupTestServer(t, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}, service) req, err := http.NewRequest(http.MethodGet, fmt.Sprintf("/api/access-control/%s/description", tt.options.Resource), nil) require.NoError(t, err) @@ -158,7 +158,7 @@ func TestApi_getPermissions(t *testing.T) { for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { service, usrSvc, teamSvc := setupTestEnvironment(t, testOptions) - server := setupTestServer(t, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}, service) + server := setupTestServer(t, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}, service) seedPermissions(t, tt.resourceID, usrSvc, teamSvc, service) @@ -235,7 +235,7 @@ func TestApi_setBuiltinRolePermission(t *testing.T) { for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { service, _, _ := setupTestEnvironment(t, testOptions) - server := setupTestServer(t, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}, service) + server := setupTestServer(t, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}, service) recorder := setPermission(t, server, testOptions.Resource, tt.resourceID, tt.permission, "builtInRoles", tt.builtInRole) assert.Equal(t, tt.expectedStatus, recorder.Code) @@ -313,7 +313,7 @@ func TestApi_setTeamPermission(t *testing.T) { for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { service, _, teamSvc := setupTestEnvironment(t, testOptions) - server := setupTestServer(t, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}, service) + server := setupTestServer(t, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}, service) // seed team _, err := teamSvc.CreateTeam(context.Background(), "test", "test@test.com", 1) @@ -398,7 +398,7 @@ func TestApi_setUserPermission(t *testing.T) { service, usrSvc, _ := setupTestEnvironment(t, testOptions) server := setupTestServer(t, &user.SignedInUser{ OrgID: 1, - Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}, + Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}, }, service) _, err := usrSvc.Create(context.Background(), &user.CreateUserCommand{Login: "test", OrgID: 1}) diff --git a/pkg/services/annotations/annotationsimpl/annotations_test.go b/pkg/services/annotations/annotationsimpl/annotations_test.go index 5cbc5ccb30a..eb603a14664 100644 --- a/pkg/services/annotations/annotationsimpl/annotations_test.go +++ b/pkg/services/annotations/annotationsimpl/annotations_test.go @@ -195,7 +195,7 @@ func TestIntegrationAnnotationListingWithInheritedRBAC(t *testing.T) { usr := &user.SignedInUser{ UserID: 1, OrgID: orgID, - Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction(permissions)}, + Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByActionContext(context.Background(), permissions)}, } var role *accesscontrol.Role diff --git a/pkg/services/apiserver/storage/entity/utils_test.go b/pkg/services/apiserver/storage/entity/utils_test.go index 950beec6012..5136b6a44d6 100644 --- a/pkg/services/apiserver/storage/entity/utils_test.go +++ b/pkg/services/apiserver/storage/entity/utils_test.go @@ -86,7 +86,7 @@ func TestResourceToEntity(t *testing.T) { }, }, }, - expectedKey: "/playlist.grafana.app/playlists/namespaces/default/test-name", + expectedKey: "/group/playlist.grafana.app/resource/playlists/namespace/default/name/test-name", expectedGroupVersion: "v0alpha1", expectedName: "test-name", expectedNamespace: "default", @@ -157,7 +157,7 @@ func TestEntityToResource(t *testing.T) { }{ { entity: &entityStore.Entity{ - Key: "/playlist.grafana.app/playlists/namespaces/default/test-uid", + Key: "/group/playlist.grafana.app/resource/playlists/namespaces/default/name/test-uid", GroupVersion: "v0alpha1", Name: "test-uid", Title: "A playlist", diff --git a/pkg/services/authn/authnimpl/registration.go b/pkg/services/authn/authnimpl/registration.go index c9b168de657..878fa59518e 100644 --- a/pkg/services/authn/authnimpl/registration.go +++ b/pkg/services/authn/authnimpl/registration.go @@ -3,6 +3,7 @@ package authnimpl import ( "github.com/grafana/grafana/pkg/infra/log" "github.com/grafana/grafana/pkg/infra/remotecache" + "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/login/social" "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/apikey" @@ -36,6 +37,7 @@ func ProvideRegistration( features *featuremgmt.FeatureManager, oauthTokenService oauthtoken.OAuthTokenService, socialService social.Service, cache *remotecache.RemoteCache, ldapService service.LDAP, settingsProviderService setting.Provider, + tracer tracing.Tracer, ) Registration { logger := log.New("authn.registration") @@ -95,16 +97,16 @@ func ProvideRegistration( } // FIXME (jguer): move to User package - userSync := sync.ProvideUserSync(userService, userProtectionService, authInfoService, quotaService) - orgSync := sync.ProvideOrgSync(userService, orgService, accessControlService, cfg) + userSync := sync.ProvideUserSync(userService, userProtectionService, authInfoService, quotaService, tracer) + orgSync := sync.ProvideOrgSync(userService, orgService, accessControlService, cfg, tracer) authnSvc.RegisterPostAuthHook(userSync.SyncUserHook, 10) authnSvc.RegisterPostAuthHook(userSync.EnableUserHook, 20) authnSvc.RegisterPostAuthHook(orgSync.SyncOrgRolesHook, 30) authnSvc.RegisterPostAuthHook(userSync.SyncLastSeenHook, 130) - authnSvc.RegisterPostAuthHook(sync.ProvideOAuthTokenSync(oauthTokenService, sessionService, socialService).SyncOauthTokenHook, 60) + authnSvc.RegisterPostAuthHook(sync.ProvideOAuthTokenSync(oauthTokenService, sessionService, socialService, tracer).SyncOauthTokenHook, 60) authnSvc.RegisterPostAuthHook(userSync.FetchSyncedUserHook, 100) - rbacSync := sync.ProvideRBACSync(accessControlService) + rbacSync := sync.ProvideRBACSync(accessControlService, tracer) if features.IsEnabledGlobally(featuremgmt.FlagCloudRBACRoles) { authnSvc.RegisterPostAuthHook(rbacSync.SyncCloudRoles, 110) authnSvc.RegisterPreLogoutHook(gcomsso.ProvideGComSSOService(cfg).LogoutHook, 50) diff --git a/pkg/services/authn/authnimpl/service.go b/pkg/services/authn/authnimpl/service.go index 27aab40a4f0..847d61fcf9a 100644 --- a/pkg/services/authn/authnimpl/service.go +++ b/pkg/services/authn/authnimpl/service.go @@ -323,6 +323,9 @@ Default: } func (s *Service) ResolveIdentity(ctx context.Context, orgID int64, namespaceID authn.NamespaceID) (*authn.Identity, error) { + ctx, span := s.tracer.Start(ctx, "authn.ResolveIdentity") + defer span.End() + r := &authn.Request{} r.OrgID = orgID // hack to not update last seen @@ -358,6 +361,9 @@ func (s *Service) IsClientEnabled(name string) bool { } func (s *Service) SyncIdentity(ctx context.Context, identity *authn.Identity) error { + ctx, span := s.tracer.Start(ctx, "authn.SyncIdentity") + defer span.End() + r := &authn.Request{OrgID: identity.OrgID} // hack to not update last seen on external syncs r.SetMeta(authn.MetaKeyIsLogin, "true") @@ -365,6 +371,9 @@ func (s *Service) SyncIdentity(ctx context.Context, identity *authn.Identity) er } func (s *Service) resolveIdenity(ctx context.Context, orgID int64, namespaceID authn.NamespaceID) (*authn.Identity, error) { + ctx, span := s.tracer.Start(ctx, "authn.resolveIdentity") + defer span.End() + if namespaceID.IsNamespace(authn.NamespaceUser) { return &authn.Identity{ OrgID: orgID, diff --git a/pkg/services/authn/authnimpl/sync/oauth_token_sync.go b/pkg/services/authn/authnimpl/sync/oauth_token_sync.go index 165613d45df..2b4220fdfd0 100644 --- a/pkg/services/authn/authnimpl/sync/oauth_token_sync.go +++ b/pkg/services/authn/authnimpl/sync/oauth_token_sync.go @@ -9,19 +9,21 @@ import ( "golang.org/x/sync/singleflight" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/login/social" "github.com/grafana/grafana/pkg/services/auth" "github.com/grafana/grafana/pkg/services/authn" "github.com/grafana/grafana/pkg/services/oauthtoken" ) -func ProvideOAuthTokenSync(service oauthtoken.OAuthTokenService, sessionService auth.UserTokenService, socialService social.Service) *OAuthTokenSync { +func ProvideOAuthTokenSync(service oauthtoken.OAuthTokenService, sessionService auth.UserTokenService, socialService social.Service, tracer tracing.Tracer) *OAuthTokenSync { return &OAuthTokenSync{ log.New("oauth_token.sync"), service, sessionService, socialService, new(singleflight.Group), + tracer, } } @@ -31,9 +33,13 @@ type OAuthTokenSync struct { sessionService auth.UserTokenService socialService social.Service singleflightGroup *singleflight.Group + tracer tracing.Tracer } func (s *OAuthTokenSync) SyncOauthTokenHook(ctx context.Context, identity *authn.Identity, _ *authn.Request) error { + ctx, span := s.tracer.Start(ctx, "oauth.sync.SyncOauthTokenHook") + defer span.End() + // only perform oauth token check if identity is a user if !identity.ID.IsNamespace(authn.NamespaceUser) { return nil diff --git a/pkg/services/authn/authnimpl/sync/oauth_token_sync_test.go b/pkg/services/authn/authnimpl/sync/oauth_token_sync_test.go index 56145f55804..41722d4344e 100644 --- a/pkg/services/authn/authnimpl/sync/oauth_token_sync_test.go +++ b/pkg/services/authn/authnimpl/sync/oauth_token_sync_test.go @@ -10,6 +10,7 @@ import ( "golang.org/x/sync/singleflight" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/login/social" "github.com/grafana/grafana/pkg/login/social/socialtest" "github.com/grafana/grafana/pkg/services/auth" @@ -128,6 +129,7 @@ func TestOAuthTokenSync_SyncOAuthTokenHook(t *testing.T) { sessionService: sessionService, socialService: socialService, singleflightGroup: new(singleflight.Group), + tracer: tracing.InitializeTracerForTest(), } err := sync.SyncOauthTokenHook(context.Background(), tt.identity, nil) diff --git a/pkg/services/authn/authnimpl/sync/org_sync.go b/pkg/services/authn/authnimpl/sync/org_sync.go index 38429a07704..c3ef49343a6 100644 --- a/pkg/services/authn/authnimpl/sync/org_sync.go +++ b/pkg/services/authn/authnimpl/sync/org_sync.go @@ -7,6 +7,7 @@ import ( "sort" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/authn" "github.com/grafana/grafana/pkg/services/org" @@ -14,8 +15,8 @@ import ( "github.com/grafana/grafana/pkg/setting" ) -func ProvideOrgSync(userService user.Service, orgService org.Service, accessControl accesscontrol.Service, cfg *setting.Cfg) *OrgSync { - return &OrgSync{userService, orgService, accessControl, cfg, log.New("org.sync")} +func ProvideOrgSync(userService user.Service, orgService org.Service, accessControl accesscontrol.Service, cfg *setting.Cfg, tracer tracing.Tracer) *OrgSync { + return &OrgSync{userService, orgService, accessControl, cfg, log.New("org.sync"), tracer} } type OrgSync struct { @@ -23,11 +24,14 @@ type OrgSync struct { orgService org.Service accessControl accesscontrol.Service cfg *setting.Cfg - - log log.Logger + log log.Logger + tracer tracing.Tracer } func (s *OrgSync) SyncOrgRolesHook(ctx context.Context, id *authn.Identity, _ *authn.Request) error { + ctx, span := s.tracer.Start(ctx, "org.sync.SyncOrgRolesHook") + defer span.End() + if !id.ClientParams.SyncOrgRoles { return nil } @@ -131,6 +135,9 @@ func (s *OrgSync) SyncOrgRolesHook(ctx context.Context, id *authn.Identity, _ *a } func (s *OrgSync) SetDefaultOrgHook(ctx context.Context, currentIdentity *authn.Identity, r *authn.Request, err error) { + ctx, span := s.tracer.Start(ctx, "org.sync.SetDefaultOrgHook") + defer span.End() + if s.cfg.LoginDefaultOrgId < 1 || currentIdentity == nil || err != nil { return } @@ -166,6 +173,9 @@ func (s *OrgSync) SetDefaultOrgHook(ctx context.Context, currentIdentity *authn. } func (s *OrgSync) validateUsingOrg(ctx context.Context, userID int64, orgID int64) (bool, error) { + ctx, span := s.tracer.Start(ctx, "org.sync.validateUsingOrg") + defer span.End() + query := org.GetUserOrgListQuery{UserID: userID} result, err := s.orgService.GetUserOrgList(ctx, &query) diff --git a/pkg/services/authn/authnimpl/sync/org_sync_test.go b/pkg/services/authn/authnimpl/sync/org_sync_test.go index d6b6799e881..e03d4b8b0e2 100644 --- a/pkg/services/authn/authnimpl/sync/org_sync_test.go +++ b/pkg/services/authn/authnimpl/sync/org_sync_test.go @@ -10,6 +10,7 @@ import ( "github.com/grafana/grafana/pkg/apimachinery/identity" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/accesscontrol/actest" "github.com/grafana/grafana/pkg/services/authn" @@ -116,6 +117,7 @@ func TestOrgSync_SyncOrgRolesHook(t *testing.T) { orgService: tt.fields.orgService, accessControl: tt.fields.accessControl, log: tt.fields.log, + tracer: tracing.InitializeTracerForTest(), } if err := s.SyncOrgRolesHook(tt.args.ctx, tt.args.id, nil); (err != nil) != tt.wantErr { t.Errorf("OrgSync.SyncOrgRolesHook() error = %v, wantErr %v", err, tt.wantErr) @@ -214,6 +216,7 @@ func TestOrgSync_SetDefaultOrgHook(t *testing.T) { accessControl: actest.FakeService{}, log: log.NewNopLogger(), cfg: cfg, + tracer: tracing.InitializeTracerForTest(), } s.SetDefaultOrgHook(context.Background(), tt.identity, nil, tt.inputErr) diff --git a/pkg/services/authn/authnimpl/sync/rbac_sync.go b/pkg/services/authn/authnimpl/sync/rbac_sync.go index 537238b838f..9fc84962282 100644 --- a/pkg/services/authn/authnimpl/sync/rbac_sync.go +++ b/pkg/services/authn/authnimpl/sync/rbac_sync.go @@ -6,6 +6,7 @@ import ( "github.com/grafana/grafana/pkg/apimachinery/errutil" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/authn" "github.com/grafana/grafana/pkg/services/login" @@ -17,19 +18,24 @@ var ( errSyncPermissionsForbidden = errutil.Forbidden("permissions.sync.forbidden") ) -func ProvideRBACSync(acService accesscontrol.Service) *RBACSync { +func ProvideRBACSync(acService accesscontrol.Service, tracer tracing.Tracer) *RBACSync { return &RBACSync{ - ac: acService, - log: log.New("permissions.sync"), + ac: acService, + log: log.New("permissions.sync"), + tracer: tracer, } } type RBACSync struct { - ac accesscontrol.Service - log log.Logger + ac accesscontrol.Service + log log.Logger + tracer tracing.Tracer } func (s *RBACSync) SyncPermissionsHook(ctx context.Context, ident *authn.Identity, _ *authn.Request) error { + ctx, span := s.tracer.Start(ctx, "rbac.sync.SyncPermissionsHook") + defer span.End() + if !ident.ClientParams.SyncPermissions { return nil } @@ -43,7 +49,8 @@ func (s *RBACSync) SyncPermissionsHook(ctx context.Context, ident *authn.Identit if ident.Permissions == nil { ident.Permissions = make(map[int64]map[string][]string, 1) } - grouped := accesscontrol.GroupScopesByAction(permissions) + + grouped := accesscontrol.GroupScopesByActionContext(ctx, permissions) // Restrict access to the list of actions actionsLookup := ident.ClientParams.FetchPermissionsParams.ActionsLookup @@ -56,12 +63,15 @@ func (s *RBACSync) SyncPermissionsHook(ctx context.Context, ident *authn.Identit } grouped = filtered } - ident.Permissions[ident.OrgID] = grouped + return nil } func (s *RBACSync) fetchPermissions(ctx context.Context, ident *authn.Identity) ([]accesscontrol.Permission, error) { + ctx, span := s.tracer.Start(ctx, "rbac.sync.fetchPermissions") + defer span.End() + permissions := make([]accesscontrol.Permission, 0, 8) roles := ident.ClientParams.FetchPermissionsParams.Roles if len(roles) > 0 { @@ -94,6 +104,9 @@ var fixedCloudRoles = map[org.RoleType]string{ } func (s *RBACSync) SyncCloudRoles(ctx context.Context, ident *authn.Identity, r *authn.Request) error { + ctx, span := s.tracer.Start(ctx, "rbac.sync.SyncCloudRoles") + defer span.End() + // we only want to run this hook during login and if the module used is grafana com if r.GetMeta(authn.MetaKeyAuthModule) != login.GrafanaComAuthModule { return nil diff --git a/pkg/services/authn/authnimpl/sync/rbac_sync_test.go b/pkg/services/authn/authnimpl/sync/rbac_sync_test.go index aab1b95097b..ef860bf4993 100644 --- a/pkg/services/authn/authnimpl/sync/rbac_sync_test.go +++ b/pkg/services/authn/authnimpl/sync/rbac_sync_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/accesscontrol" acmock "github.com/grafana/grafana/pkg/services/accesscontrol/mock" "github.com/grafana/grafana/pkg/services/authn" @@ -45,7 +46,7 @@ func TestRBACSync_SyncPermission(t *testing.T) { require.NoError(t, err) assert.Equal(t, 1, len(tt.identity.Permissions)) - assert.Equal(t, accesscontrol.GroupScopesByAction(tt.expectedPermissions), tt.identity.Permissions[tt.identity.OrgID]) + assert.Equal(t, accesscontrol.GroupScopesByActionContext(context.Background(), tt.expectedPermissions), tt.identity.Permissions[tt.identity.OrgID]) }) } } @@ -127,7 +128,8 @@ func TestRBACSync_SyncCloudRoles(t *testing.T) { return nil }, }, - log: log.NewNopLogger(), + log: log.NewNopLogger(), + tracer: tracing.InitializeTracerForTest(), } req := &authn.Request{} @@ -149,8 +151,9 @@ func setupTestEnv() *RBACSync { }, } s := &RBACSync{ - ac: acMock, - log: log.NewNopLogger(), + ac: acMock, + log: log.NewNopLogger(), + tracer: tracing.InitializeTracerForTest(), } return s } diff --git a/pkg/services/authn/authnimpl/sync/user_sync.go b/pkg/services/authn/authnimpl/sync/user_sync.go index cbc818f6592..524ece3a450 100644 --- a/pkg/services/authn/authnimpl/sync/user_sync.go +++ b/pkg/services/authn/authnimpl/sync/user_sync.go @@ -7,6 +7,7 @@ import ( "github.com/grafana/grafana/pkg/apimachinery/errutil" "github.com/grafana/grafana/pkg/infra/log" + "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/authn" "github.com/grafana/grafana/pkg/services/login" "github.com/grafana/grafana/pkg/services/org" @@ -47,15 +48,14 @@ var ( errSignupNotAllowed = errors.New("system administrator has disabled signup") ) -func ProvideUserSync(userService user.Service, - userProtectionService login.UserProtectionService, - authInfoService login.AuthInfoService, quotaService quota.Service) *UserSync { +func ProvideUserSync(userService user.Service, userProtectionService login.UserProtectionService, authInfoService login.AuthInfoService, quotaService quota.Service, tracer tracing.Tracer) *UserSync { return &UserSync{ userService: userService, authInfoService: authInfoService, userProtectionService: userProtectionService, quotaService: quotaService, log: log.New("user.sync"), + tracer: tracer, } } @@ -65,10 +65,14 @@ type UserSync struct { userProtectionService login.UserProtectionService quotaService quota.Service log log.Logger + tracer tracing.Tracer } // SyncUserHook syncs a user with the database func (s *UserSync) SyncUserHook(ctx context.Context, id *authn.Identity, _ *authn.Request) error { + ctx, span := s.tracer.Start(ctx, "user.sync.SyncUserHook") + defer span.End() + if !id.ClientParams.SyncUser { return nil } @@ -106,6 +110,9 @@ func (s *UserSync) SyncUserHook(ctx context.Context, id *authn.Identity, _ *auth } func (s *UserSync) FetchSyncedUserHook(ctx context.Context, identity *authn.Identity, r *authn.Request) error { + ctx, span := s.tracer.Start(ctx, "user.sync.FetchSyncedUserHook") + defer span.End() + if !identity.ClientParams.FetchSyncedUser { return nil } @@ -143,6 +150,9 @@ func (s *UserSync) FetchSyncedUserHook(ctx context.Context, identity *authn.Iden } func (s *UserSync) SyncLastSeenHook(ctx context.Context, identity *authn.Identity, r *authn.Request) error { + ctx, span := s.tracer.Start(ctx, "user.sync.SyncLastSeenHook") + defer span.End() + if r.GetMeta(authn.MetaKeyIsLogin) != "" { // Do not sync last seen for login requests return nil @@ -177,6 +187,9 @@ func (s *UserSync) SyncLastSeenHook(ctx context.Context, identity *authn.Identit } func (s *UserSync) EnableUserHook(ctx context.Context, identity *authn.Identity, _ *authn.Request) error { + ctx, span := s.tracer.Start(ctx, "user.sync.EnableUserHook") + defer span.End() + if !identity.ClientParams.EnableUser { return nil } @@ -196,6 +209,9 @@ func (s *UserSync) EnableUserHook(ctx context.Context, identity *authn.Identity, } func (s *UserSync) upsertAuthConnection(ctx context.Context, userID int64, identity *authn.Identity, createConnection bool) error { + ctx, span := s.tracer.Start(ctx, "user.sync.upsertAuthConnection") + defer span.End() + if identity.AuthenticatedBy == "" { return nil } @@ -222,6 +238,9 @@ func (s *UserSync) upsertAuthConnection(ctx context.Context, userID int64, ident } func (s *UserSync) updateUserAttributes(ctx context.Context, usr *user.User, id *authn.Identity, userAuth *login.UserAuth) error { + ctx, span := s.tracer.Start(ctx, "user.sync.updateUserAttributes") + defer span.End() + if errProtection := s.userProtectionService.AllowUserMapping(usr, id.AuthenticatedBy); errProtection != nil { return errUserProtection.Errorf("user mapping not allowed: %w", errProtection) } @@ -273,6 +292,8 @@ func (s *UserSync) updateUserAttributes(ctx context.Context, usr *user.User, id } func (s *UserSync) createUser(ctx context.Context, id *authn.Identity) (*user.User, error) { + ctx, span := s.tracer.Start(ctx, "user.sync.createUser") + defer span.End() // FIXME(jguer): this should be done in the user service // quota check: we can have quotas on both global and org level // therefore we need to query check quota for both user and org services @@ -312,6 +333,9 @@ func (s *UserSync) createUser(ctx context.Context, id *authn.Identity) (*user.Us } func (s *UserSync) getUser(ctx context.Context, identity *authn.Identity) (*user.User, *login.UserAuth, error) { + ctx, span := s.tracer.Start(ctx, "user.sync.getUser") + defer span.End() + // Check auth info fist if identity.AuthID != "" && identity.AuthenticatedBy != "" { query := &login.GetAuthInfoQuery{AuthId: identity.AuthID, AuthModule: identity.AuthenticatedBy} @@ -361,6 +385,9 @@ func (s *UserSync) getUser(ctx context.Context, identity *authn.Identity) (*user } func (s *UserSync) lookupByOneOf(ctx context.Context, params login.UserLookupParams) (*user.User, error) { + ctx, span := s.tracer.Start(ctx, "user.sync.lookupByOneOf") + defer span.End() + var usr *user.User var err error diff --git a/pkg/services/authn/authnimpl/sync/user_sync_test.go b/pkg/services/authn/authnimpl/sync/user_sync_test.go index eb0e7fafd35..1a01b748bd2 100644 --- a/pkg/services/authn/authnimpl/sync/user_sync_test.go +++ b/pkg/services/authn/authnimpl/sync/user_sync_test.go @@ -7,6 +7,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/grafana/grafana/pkg/infra/tracing" "github.com/grafana/grafana/pkg/services/authn" "github.com/grafana/grafana/pkg/services/login" "github.com/grafana/grafana/pkg/services/login/authinfoimpl" @@ -426,7 +427,7 @@ func TestUserSync_SyncUserHook(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - s := ProvideUserSync(tt.fields.userService, userProtection, tt.fields.authInfoService, tt.fields.quotaService) + s := ProvideUserSync(tt.fields.userService, userProtection, tt.fields.authInfoService, tt.fields.quotaService, tracing.InitializeTracerForTest()) err := s.SyncUserHook(tt.args.ctx, tt.args.id, nil) if tt.wantErr { require.Error(t, err) @@ -462,7 +463,9 @@ func TestUserSync_FetchSyncedUserHook(t *testing.T) { for _, tt := range tests { t.Run(tt.desc, func(t *testing.T) { - s := UserSync{} + s := UserSync{ + tracer: tracing.InitializeTracerForTest(), + } err := s.FetchSyncedUserHook(context.Background(), tt.identity, tt.req) require.ErrorIs(t, err, tt.expectedErr) }) @@ -515,7 +518,7 @@ func TestUserSync_EnableDisabledUserHook(t *testing.T) { return nil } - s := UserSync{userService: userSvc} + s := UserSync{userService: userSvc, tracer: tracing.InitializeTracerForTest()} err := s.EnableUserHook(context.Background(), tt.identity, nil) require.NoError(t, err) assert.Equal(t, tt.enableUser, called) diff --git a/pkg/services/authz/zanzana/zanzana.go b/pkg/services/authz/zanzana/zanzana.go index 5d8ecd0c9d6..3062511a031 100644 --- a/pkg/services/authz/zanzana/zanzana.go +++ b/pkg/services/authz/zanzana/zanzana.go @@ -12,6 +12,11 @@ const ( TypeTeam string = "team" ) +const ( + RelationTeamMember string = "member" + RelationTeamAdmin string = "admin" +) + func NewObject(typ, id string) string { return fmt.Sprintf("%s:%s", typ, id) } @@ -49,7 +54,7 @@ func TranslateToTuple(user string, action, kind, identifier string, orgID int64) tuple.User = user tuple.Relation = relation - // UID in grafana are not guarantee to be unique across orgs so we need to scope them. + // Some uid:s in grafana are not guarantee to be unique across orgs so we need to scope them. if t.orgScoped { tuple.Object = NewScopedObject(t.typ, identifier, strconv.FormatInt(orgID, 10)) } else { diff --git a/pkg/services/cloudmigration/api/api.go b/pkg/services/cloudmigration/api/api.go index cc221f66b98..e436857ab64 100644 --- a/pkg/services/cloudmigration/api/api.go +++ b/pkg/services/cloudmigration/api/api.go @@ -376,11 +376,12 @@ func (cma *CloudMigrationAPI) CreateSnapshot(c *contextmodel.ReqContext) respons defer span.End() uid := web.Params(c.Req)[":uid"] + if err := util.ValidateUID(uid); err != nil { return response.ErrOrFallback(http.StatusBadRequest, "invalid session uid", err) } - ss, err := cma.cloudMigrationService.CreateSnapshot(ctx, uid) + ss, err := cma.cloudMigrationService.CreateSnapshot(ctx, c.SignedInUser, uid) if err != nil { return response.ErrOrFallback(http.StatusInternalServerError, "error creating snapshot", err) } diff --git a/pkg/services/cloudmigration/api/curl_commands.txt b/pkg/services/cloudmigration/api/curl_commands.txt index f4556aae0e1..925df467c31 100644 --- a/pkg/services/cloudmigration/api/curl_commands.txt +++ b/pkg/services/cloudmigration/api/curl_commands.txt @@ -1,7 +1,7 @@ [sample token] // NOT A REAL TOKEN eyJUb2tlbiI6ImNvbXBsZXRlbHlfZmFrZV90b2tlbl9jZG9peTFhYzdwdXlwZCIsIkluc3RhbmNlIjp7IlN0YWNrSUQiOjEyMzQ1LCJTbHVnIjoic3R1Ymluc3RhbmNlIiwiUmVnaW9uU2x1ZyI6ImZha2UtcmVnaW9uIiwiQ2x1c3RlclNsdWciOiJmYWtlLWNsdXNlciJ9fQ== -[create session} +[create session] curl -X POST -H "Content-Type: application/json" \ http://admin:admin@localhost:3000/api/cloudmigration/migration \ -d '{"AuthToken":"eyJUb2tlbiI6ImNvbXBsZXRlbHlfZmFrZV90b2tlbl9jZG9peTFhYzdwdXlwZCIsIkluc3RhbmNlIjp7IlN0YWNrSUQiOjEyMzQ1LCJTbHVnIjoic3R1Ymluc3RhbmNlIiwiUmVnaW9uU2x1ZyI6ImZha2UtcmVnaW9uIiwiQ2x1c3RlclNsdWciOiJmYWtlLWNsdXNlciJ9fQ=="}' diff --git a/pkg/services/cloudmigration/cloudmigration.go b/pkg/services/cloudmigration/cloudmigration.go index a431ba10f67..5c0d13cbe08 100644 --- a/pkg/services/cloudmigration/cloudmigration.go +++ b/pkg/services/cloudmigration/cloudmigration.go @@ -4,6 +4,7 @@ import ( "context" "github.com/grafana/grafana/pkg/services/gcom" + "github.com/grafana/grafana/pkg/services/user" ) type Service interface { @@ -24,7 +25,7 @@ type Service interface { GetMigrationStatus(ctx context.Context, runUID string) (*CloudMigrationSnapshot, error) GetMigrationRunList(ctx context.Context, migUID string) (*CloudMigrationRunList, error) - CreateSnapshot(ctx context.Context, sessionUid string) (*CloudMigrationSnapshot, error) + CreateSnapshot(ctx context.Context, signedInUser *user.SignedInUser, sessionUid string) (*CloudMigrationSnapshot, error) GetSnapshot(ctx context.Context, query GetSnapshotsQuery) (*CloudMigrationSnapshot, error) GetSnapshotList(ctx context.Context, query ListSnapshotsQuery) ([]CloudMigrationSnapshot, error) UploadSnapshot(ctx context.Context, sessionUid string, snapshotUid string) error diff --git a/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration.go b/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration.go index 3b631d84bd9..7b085ea15d8 100644 --- a/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration.go +++ b/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration.go @@ -7,7 +7,6 @@ import ( "errors" "fmt" "net/http" - "os" "path/filepath" "sync" "time" @@ -26,6 +25,7 @@ import ( "github.com/grafana/grafana/pkg/services/folder" "github.com/grafana/grafana/pkg/services/gcom" "github.com/grafana/grafana/pkg/services/secrets" + "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" "github.com/prometheus/client_golang/prometheus" @@ -41,7 +41,6 @@ type Service struct { cfg *setting.Cfg buildSnapshotMutex sync.Mutex - buildSnapshotError bool features featuremgmt.FeatureToggles gmsClient gmsclient.Client @@ -391,7 +390,7 @@ func (s *Service) RunMigration(ctx context.Context, uid string) (*cloudmigration } // Get migration data JSON - request, err := s.getMigrationDataJSON(ctx) + request, err := s.getMigrationDataJSON(ctx, &user.SignedInUser{}) if err != nil { s.log.Error("error getting the json request body for migration run", "err", err.Error()) return nil, fmt.Errorf("migration data get error: %w", err) @@ -459,8 +458,10 @@ func (s *Service) DeleteSession(ctx context.Context, uid string) (*cloudmigratio return c, nil } -func (s *Service) CreateSnapshot(ctx context.Context, sessionUid string) (*cloudmigration.CloudMigrationSnapshot, error) { - ctx, span := s.tracer.Start(ctx, "CloudMigrationService.CreateSnapshot") +func (s *Service) CreateSnapshot(ctx context.Context, signedInUser *user.SignedInUser, sessionUid string) (*cloudmigration.CloudMigrationSnapshot, error) { + ctx, span := s.tracer.Start(ctx, "CloudMigrationService.CreateSnapshot", trace.WithAttributes( + attribute.String("sessionUid", sessionUid), + )) defer span.End() // fetch session for the gms auth token @@ -470,28 +471,25 @@ func (s *Service) CreateSnapshot(ctx context.Context, sessionUid string) (*cloud } // query gms to establish new snapshot - initResp, err := s.gmsClient.InitializeSnapshot(ctx, *session) + timeoutCtx, cancel := context.WithTimeout(ctx, s.cfg.CloudMigration.StartSnapshotTimeout) + defer cancel() + initResp, err := s.gmsClient.StartSnapshot(timeoutCtx, *session) if err != nil { return nil, fmt.Errorf("initializing snapshot with GMS for session %s: %w", sessionUid, err) } - // create new directory for snapshot writing - snapshotUid := util.GenerateShortUID() - dir := filepath.Join("cloudmigration.snapshots", fmt.Sprintf("snapshot-%s-%s", snapshotUid, initResp.GMSSnapshotUID)) - err = os.MkdirAll(dir, 0750) - if err != nil { - return nil, fmt.Errorf("creating snapshot directory: %w", err) + if s.cfg.CloudMigration.SnapshotFolder == "" { + return nil, fmt.Errorf("snapshot folder is not set") } - // save snapshot to the db snapshot := cloudmigration.CloudMigrationSnapshot{ - UID: snapshotUid, + UID: util.GenerateShortUID(), SessionUID: sessionUid, Status: cloudmigration.SnapshotStatusInitializing, EncryptionKey: initResp.EncryptionKey, UploadURL: initResp.UploadURL, - GMSSnapshotUID: initResp.GMSSnapshotUID, - LocalDir: dir, + GMSSnapshotUID: initResp.SnapshotID, + LocalDir: filepath.Join(s.cfg.CloudMigration.SnapshotFolder, "grafana", "snapshots", initResp.SnapshotID), } uid, err := s.store.CreateSnapshot(ctx, snapshot) @@ -501,7 +499,11 @@ func (s *Service) CreateSnapshot(ctx context.Context, sessionUid string) (*cloud snapshot.UID = uid // start building the snapshot asynchronously while we return a success response to the client - go s.buildSnapshot(context.Background(), snapshot) + go func() { + if err := s.buildSnapshot(context.Background(), signedInUser, initResp.MaxItemsPerPartition, snapshot); err != nil { + s.log.Error("building snapshot", "err", err.Error()) + } + }() return &snapshot, nil } diff --git a/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration_noop.go b/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration_noop.go index d435b9f1ba8..1027f1254f4 100644 --- a/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration_noop.go +++ b/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration_noop.go @@ -5,6 +5,7 @@ import ( "github.com/grafana/grafana/pkg/services/cloudmigration" "github.com/grafana/grafana/pkg/services/gcom" + "github.com/grafana/grafana/pkg/services/user" ) // NoopServiceImpl Define the Service Implementation. @@ -60,7 +61,7 @@ func (s *NoopServiceImpl) RunMigration(context.Context, string) (*cloudmigration return nil, cloudmigration.ErrFeatureDisabledError } -func (s *NoopServiceImpl) CreateSnapshot(ctx context.Context, sessionUid string) (*cloudmigration.CloudMigrationSnapshot, error) { +func (s *NoopServiceImpl) CreateSnapshot(ctx context.Context, user *user.SignedInUser, sessionUid string) (*cloudmigration.CloudMigrationSnapshot, error) { return nil, cloudmigration.ErrFeatureDisabledError } diff --git a/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration_test.go b/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration_test.go index 04ac1ff3217..eef78c9401f 100644 --- a/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration_test.go +++ b/pkg/services/cloudmigration/cloudmigrationimpl/cloudmigration_test.go @@ -2,8 +2,11 @@ package cloudmigrationimpl import ( "context" + "os" + "path/filepath" "testing" + "github.com/google/uuid" "github.com/grafana/grafana/pkg/api/routing" "github.com/grafana/grafana/pkg/components/simplejson" "github.com/grafana/grafana/pkg/infra/db" @@ -109,73 +112,6 @@ func Test_CreateGetRunMigrationsAndRuns(t *testing.T) { require.NotNil(t, createResp.UID, delMigResp.UID) } -func Test_ExecuteAsyncWorkflow(t *testing.T) { - s := setUpServiceTest(t, false) - - createTokenResp, err := s.CreateToken(context.Background()) - assert.NoError(t, err) - assert.NotEmpty(t, createTokenResp.Token) - - cmd := cloudmigration.CloudMigrationSessionRequest{ - AuthToken: createTokenResp.Token, - } - - createResp, err := s.CreateSession(context.Background(), cmd) - require.NoError(t, err) - require.NotEmpty(t, createResp.UID) - require.NotEmpty(t, createResp.Slug) - - getSessionResp, err := s.GetSession(context.Background(), createResp.UID) - require.NoError(t, err) - require.NotNil(t, getSessionResp) - require.Equal(t, createResp.UID, getSessionResp.UID) - require.Equal(t, createResp.Slug, getSessionResp.Slug) - - listResp, err := s.GetSessionList(context.Background()) - require.NoError(t, err) - require.NotNil(t, listResp) - require.Equal(t, 1, len(listResp.Sessions)) - require.Equal(t, createResp.UID, listResp.Sessions[0].UID) - require.Equal(t, createResp.Slug, listResp.Sessions[0].Slug) - - sessionUid := createResp.UID - snapshotResp, err := s.CreateSnapshot(ctxWithSignedInUser(), sessionUid) - require.NoError(t, err) - require.NotEmpty(t, snapshotResp.UID) - require.Equal(t, sessionUid, snapshotResp.SessionUID) - snapshotUid := snapshotResp.UID - - // Service doesn't currently expose updating a snapshot externally, so we will just manually add a resource - err = (s.(*Service)).store.CreateUpdateSnapshotResources(context.Background(), snapshotUid, []cloudmigration.CloudMigrationResource{{Type: cloudmigration.DashboardDataType, RefID: "qwerty", Status: cloudmigration.ItemStatusOK}}) - assert.NoError(t, err) - - snapshot, err := s.GetSnapshot(ctxWithSignedInUser(), cloudmigration.GetSnapshotsQuery{ - SnapshotUID: snapshotUid, - SessionUID: sessionUid, - ResultPage: 1, - ResultLimit: 100, - }) - require.NoError(t, err) - assert.Equal(t, snapshotResp.UID, snapshot.UID) - assert.Equal(t, snapshotResp.EncryptionKey, snapshot.EncryptionKey) - assert.Len(t, snapshot.Resources, 1) - assert.Equal(t, "qwerty", snapshot.Resources[0].RefID) - - snapshots, err := s.GetSnapshotList(ctxWithSignedInUser(), cloudmigration.ListSnapshotsQuery{SessionUID: sessionUid, Page: 1, Limit: 100}) - require.NoError(t, err) - assert.Len(t, snapshots, 1) - assert.Equal(t, snapshotResp.UID, snapshots[0].UID) - assert.Equal(t, snapshotResp.EncryptionKey, snapshots[0].EncryptionKey) - assert.Empty(t, snapshots[0].Resources) - - err = s.UploadSnapshot(ctxWithSignedInUser(), sessionUid, snapshotUid) - require.NoError(t, err) - - assert.Panics(t, func() { - err = s.CancelSnapshot(ctxWithSignedInUser(), sessionUid, snapshotUid) - }) -} - func ctxWithSignedInUser() context.Context { c := &contextmodel.ReqContext{ SignedInUser: &user.SignedInUser{OrgID: 1}, @@ -202,6 +138,7 @@ func setUpServiceTest(t *testing.T, withDashboardMock bool) cloudmigration.Servi require.NoError(t, err) // dont know if this is the best, but dont want to refactor at the moment cfg.CloudMigration.IsDeveloperMode = true + cfg.CloudMigration.SnapshotFolder = filepath.Join(os.TempDir(), uuid.NewString()) dashboardService := dashboards.NewFakeDashboardService(t) if withDashboardMock { diff --git a/pkg/services/cloudmigration/cloudmigrationimpl/fake/cloudmigration_fake.go b/pkg/services/cloudmigration/cloudmigrationimpl/fake/cloudmigration_fake.go index 2de9080c4f0..9192ebd99b5 100644 --- a/pkg/services/cloudmigration/cloudmigrationimpl/fake/cloudmigration_fake.go +++ b/pkg/services/cloudmigration/cloudmigrationimpl/fake/cloudmigration_fake.go @@ -7,6 +7,7 @@ import ( "github.com/grafana/grafana/pkg/services/cloudmigration" "github.com/grafana/grafana/pkg/services/gcom" + "github.com/grafana/grafana/pkg/services/user" ) var fixedDate = time.Date(2024, 6, 5, 17, 30, 40, 0, time.UTC) @@ -129,7 +130,7 @@ func (m FakeServiceImpl) GetMigrationRunList(_ context.Context, _ string) (*clou }, nil } -func (m FakeServiceImpl) CreateSnapshot(ctx context.Context, sessionUid string) (*cloudmigration.CloudMigrationSnapshot, error) { +func (m FakeServiceImpl) CreateSnapshot(ctx context.Context, user *user.SignedInUser, sessionUid string) (*cloudmigration.CloudMigrationSnapshot, error) { if m.ReturnError { return nil, fmt.Errorf("mock error") } diff --git a/pkg/services/cloudmigration/cloudmigrationimpl/snapshot_mgmt.go b/pkg/services/cloudmigration/cloudmigrationimpl/snapshot_mgmt.go index 0d43a3c7127..fad2fba3d2e 100644 --- a/pkg/services/cloudmigration/cloudmigrationimpl/snapshot_mgmt.go +++ b/pkg/services/cloudmigration/cloudmigrationimpl/snapshot_mgmt.go @@ -2,17 +2,24 @@ package cloudmigrationimpl import ( "context" + cryptoRand "crypto/rand" + "fmt" "time" + snapshot "github.com/grafana/grafana-cloud-migration-snapshot/src" + "github.com/grafana/grafana-cloud-migration-snapshot/src/contracts" + "github.com/grafana/grafana-cloud-migration-snapshot/src/infra/crypto" "github.com/grafana/grafana/pkg/services/cloudmigration" - "github.com/grafana/grafana/pkg/services/contexthandler" + "github.com/grafana/grafana/pkg/services/cloudmigration/slicesext" "github.com/grafana/grafana/pkg/services/dashboards" "github.com/grafana/grafana/pkg/services/datasources" "github.com/grafana/grafana/pkg/services/folder" + "github.com/grafana/grafana/pkg/services/user" "github.com/grafana/grafana/pkg/util/retryer" + "golang.org/x/crypto/nacl/box" ) -func (s *Service) getMigrationDataJSON(ctx context.Context) (*cloudmigration.MigrateDataRequest, error) { +func (s *Service) getMigrationDataJSON(ctx context.Context, signedInUser *user.SignedInUser) (*cloudmigration.MigrateDataRequest, error) { // Data sources dataSources, err := s.getDataSources(ctx) if err != nil { @@ -28,7 +35,7 @@ func (s *Service) getMigrationDataJSON(ctx context.Context) (*cloudmigration.Mig } // Folders - folders, err := s.getFolders(ctx) + folders, err := s.getFolders(ctx, signedInUser) if err != nil { s.log.Error("Failed to get folders", "err", err) return nil, err @@ -111,10 +118,9 @@ func (s *Service) getDataSources(ctx context.Context) ([]datasources.AddDataSour return result, err } -func (s *Service) getFolders(ctx context.Context) ([]folder.Folder, error) { - reqCtx := contexthandler.FromContext(ctx) +func (s *Service) getFolders(ctx context.Context, signedInUser *user.SignedInUser) ([]folder.Folder, error) { folders, err := s.folderService.GetFolders(ctx, folder.GetFoldersQuery{ - SignedInUser: reqCtx.SignedInUser, + SignedInUser: signedInUser, }) if err != nil { return nil, err @@ -143,11 +149,10 @@ func (s *Service) getDashboards(ctx context.Context) ([]dashboards.Dashboard, er } // asynchronous process for writing the snapshot to the filesystem and updating the snapshot status -func (s *Service) buildSnapshot(ctx context.Context, snapshotMeta cloudmigration.CloudMigrationSnapshot) { +func (s *Service) buildSnapshot(ctx context.Context, signedInUser *user.SignedInUser, maxItemsPerPartition uint32, snapshotMeta cloudmigration.CloudMigrationSnapshot) error { // TODO -- make sure we can only build one snapshot at a time s.buildSnapshotMutex.Lock() defer s.buildSnapshotMutex.Unlock() - s.buildSnapshotError = false // update snapshot status to creating, add some retries since this is a background task if err := retryer.Retry(func() (retryer.RetrySignal, error) { @@ -158,18 +163,60 @@ func (s *Service) buildSnapshot(ctx context.Context, snapshotMeta cloudmigration return retryer.FuncComplete, err }, 10, time.Millisecond*100, time.Second*10); err != nil { s.log.Error("failed to set snapshot status to 'creating'", "err", err) - s.buildSnapshotError = true - return + return fmt.Errorf("setting snapshot status to creating: snapshotUID=%s %w", snapshotMeta.UID, err) } - // build snapshot - // just sleep for now to simulate snapshot creation happening - // need to do a couple of fancy things when we implement this: - // - some sort of regular check-in so we know we haven't timed out - // - a channel to listen for cancel events - // - retries baked into the snapshot writing process? - s.log.Debug("snapshot meta", "snapshot", snapshotMeta) - time.Sleep(3 * time.Second) + publicKey, privateKey, err := box.GenerateKey(cryptoRand.Reader) + if err != nil { + return fmt.Errorf("nacl: generating public and private key: %w", err) + } + + // Use GMS public key + the grafana generated private private key to encrypt snapshot files. + snapshotWriter, err := snapshot.NewSnapshotWriter(contracts.AssymetricKeys{ + Public: []byte(snapshotMeta.EncryptionKey), + Private: privateKey[:], + }, + crypto.NewNacl(), + snapshotMeta.LocalDir, + ) + if err != nil { + return fmt.Errorf("instantiating snapshot writer: %w", err) + } + + migrationData, err := s.getMigrationDataJSON(ctx, signedInUser) + if err != nil { + return fmt.Errorf("fetching migration data: %w", err) + } + + resourcesGroupedByType := make(map[cloudmigration.MigrateDataType][]snapshot.MigrateDataRequestItemDTO, 0) + for _, item := range migrationData.Items { + resourcesGroupedByType[item.Type] = append(resourcesGroupedByType[item.Type], snapshot.MigrateDataRequestItemDTO{ + Type: snapshot.MigrateDataType(item.Type), + RefID: item.RefID, + Name: item.Name, + Data: item.Data, + }) + } + + for _, resourceType := range []cloudmigration.MigrateDataType{ + cloudmigration.DatasourceDataType, + cloudmigration.FolderDataType, + cloudmigration.DashboardDataType, + } { + for _, chunk := range slicesext.Chunks(int(maxItemsPerPartition), resourcesGroupedByType[resourceType]) { + if err := snapshotWriter.Write(string(resourceType), chunk); err != nil { + return fmt.Errorf("writing resources to snapshot writer: resourceType=%s %w", resourceType, err) + } + } + } + + // Add the grafana generated public key to the index file so gms can use it to decrypt the snapshot files later. + // This works because the snapshot files are being encrypted with + // the grafana generated private key + the gms public key. + _, err = snapshotWriter.Finish(publicKey[:]) + if err != nil { + return fmt.Errorf("finishing writing snapshot files and generating index file: %w", err) + } // update snapshot status to pending upload with retry if err := retryer.Retry(func() (retryer.RetrySignal, error) { @@ -180,8 +227,10 @@ func (s *Service) buildSnapshot(ctx context.Context, snapshotMeta cloudmigration return retryer.FuncComplete, err }, 10, time.Millisecond*100, time.Second*10); err != nil { s.log.Error("failed to set snapshot status to 'pending upload'", "err", err) - s.buildSnapshotError = true + return fmt.Errorf("setting snapshot status to pending upload: snapshotID=%s %w", snapshotMeta.UID, err) } + + return nil } // asynchronous process for and updating the snapshot status @@ -189,7 +238,6 @@ func (s *Service) uploadSnapshot(ctx context.Context, snapshotMeta cloudmigratio // TODO -- make sure we can only upload one snapshot at a time s.buildSnapshotMutex.Lock() defer s.buildSnapshotMutex.Unlock() - s.buildSnapshotError = false // update snapshot status to uploading, add some retries since this is a background task if err := retryer.Retry(func() (retryer.RetrySignal, error) { @@ -200,7 +248,6 @@ func (s *Service) uploadSnapshot(ctx context.Context, snapshotMeta cloudmigratio return retryer.FuncComplete, err }, 10, time.Millisecond*100, time.Second*10); err != nil { s.log.Error("failed to set snapshot status to 'creating'", "err", err) - s.buildSnapshotError = true return } @@ -218,7 +265,6 @@ func (s *Service) uploadSnapshot(ctx context.Context, snapshotMeta cloudmigratio return retryer.FuncComplete, err }, 10, time.Millisecond*100, time.Second*10); err != nil { s.log.Error("failed to set snapshot status to 'pending upload'", "err", err) - s.buildSnapshotError = true } // simulate the rest diff --git a/pkg/services/cloudmigration/gmsclient/client.go b/pkg/services/cloudmigration/gmsclient/client.go index 6f13a60acf3..6e0fb157ccc 100644 --- a/pkg/services/cloudmigration/gmsclient/client.go +++ b/pkg/services/cloudmigration/gmsclient/client.go @@ -9,7 +9,7 @@ import ( type Client interface { ValidateKey(context.Context, cloudmigration.CloudMigrationSession) error MigrateData(context.Context, cloudmigration.CloudMigrationSession, cloudmigration.MigrateDataRequest) (*cloudmigration.MigrateDataResponse, error) - InitializeSnapshot(context.Context, cloudmigration.CloudMigrationSession) (*cloudmigration.InitializeSnapshotResponse, error) + StartSnapshot(context.Context, cloudmigration.CloudMigrationSession) (*cloudmigration.StartSnapshotResponse, error) GetSnapshotStatus(context.Context, cloudmigration.CloudMigrationSession, cloudmigration.CloudMigrationSnapshot) (*cloudmigration.CloudMigrationSnapshot, error) } diff --git a/pkg/services/cloudmigration/gmsclient/gms_client.go b/pkg/services/cloudmigration/gmsclient/gms_client.go index 383fcabb8e2..4d4e6cc41b2 100644 --- a/pkg/services/cloudmigration/gmsclient/gms_client.go +++ b/pkg/services/cloudmigration/gmsclient/gms_client.go @@ -111,8 +111,43 @@ func (c *gmsClientImpl) MigrateData(ctx context.Context, cm cloudmigration.Cloud return &result, nil } -func (c *gmsClientImpl) InitializeSnapshot(context.Context, cloudmigration.CloudMigrationSession) (*cloudmigration.InitializeSnapshotResponse, error) { - panic("not implemented") +func (c *gmsClientImpl) StartSnapshot(ctx context.Context, session cloudmigration.CloudMigrationSession) (*cloudmigration.StartSnapshotResponse, error) { + logger := c.log.FromContext(ctx) + + path := fmt.Sprintf("https://cms-%s.%s/cloud-migrations/api/v1/start-snapshot", session.ClusterSlug, c.domain) + + // Send the request to cms with the associated auth token + req, err := http.NewRequest(http.MethodPost, path, nil) + if err != nil { + c.log.Error("error creating http request to start snapshot", "err", err.Error()) + return nil, fmt.Errorf("http request error: %w", err) + } + req.Header.Set("Content-Type", "application/json") + req.Header.Set("Authorization", fmt.Sprintf("Bearer %d:%s", session.StackID, session.AuthToken)) + + client := &http.Client{} + resp, err := client.Do(req) + if err != nil { + c.log.Error("error sending http request to start snapshot", "err", err.Error()) + return nil, fmt.Errorf("http request error: %w", err) + } else if resp.StatusCode >= 400 { + c.log.Error("received error response to start snapshot", "statusCode", resp.StatusCode) + return nil, fmt.Errorf("http request error: %w", err) + } + + defer func() { + if err := resp.Body.Close(); err != nil { + logger.Error("closing request body: %w", err) + } + }() + + var result cloudmigration.StartSnapshotResponse + if err := json.NewDecoder(resp.Body).Decode(&result); err != nil { + logger.Error("unmarshalling response body: %w", err) + return nil, fmt.Errorf("unmarshalling start snapshot response: %w", err) + } + + return &result, nil } func (c *gmsClientImpl) GetSnapshotStatus(context.Context, cloudmigration.CloudMigrationSession, cloudmigration.CloudMigrationSnapshot) (*cloudmigration.CloudMigrationSnapshot, error) { diff --git a/pkg/services/cloudmigration/gmsclient/inmemory_client.go b/pkg/services/cloudmigration/gmsclient/inmemory_client.go index 3148fb109f1..c7b9b9abb87 100644 --- a/pkg/services/cloudmigration/gmsclient/inmemory_client.go +++ b/pkg/services/cloudmigration/gmsclient/inmemory_client.go @@ -15,7 +15,7 @@ func NewInMemoryClient() Client { } type memoryClientImpl struct { - snapshot *cloudmigration.InitializeSnapshotResponse + snapshot *cloudmigration.StartSnapshotResponse } func (c *memoryClientImpl) ValidateKey(ctx context.Context, cm cloudmigration.CloudMigrationSession) error { @@ -48,11 +48,11 @@ func (c *memoryClientImpl) MigrateData( return &result, nil } -func (c *memoryClientImpl) InitializeSnapshot(context.Context, cloudmigration.CloudMigrationSession) (*cloudmigration.InitializeSnapshotResponse, error) { - c.snapshot = &cloudmigration.InitializeSnapshotResponse{ - EncryptionKey: util.GenerateShortUID(), - GMSSnapshotUID: util.GenerateShortUID(), - UploadURL: "localhost:3000", +func (c *memoryClientImpl) StartSnapshot(context.Context, cloudmigration.CloudMigrationSession) (*cloudmigration.StartSnapshotResponse, error) { + c.snapshot = &cloudmigration.StartSnapshotResponse{ + EncryptionKey: util.GenerateShortUID(), + SnapshotID: util.GenerateShortUID(), + UploadURL: "localhost:3000", } return c.snapshot, nil diff --git a/pkg/services/cloudmigration/model.go b/pkg/services/cloudmigration/model.go index 40904dd4d93..fe257f07c50 100644 --- a/pkg/services/cloudmigration/model.go +++ b/pkg/services/cloudmigration/model.go @@ -195,8 +195,12 @@ type CreateSessionResponse struct { SnapshotUid string } -type InitializeSnapshotResponse struct { - EncryptionKey string - UploadURL string - GMSSnapshotUID string +type StartSnapshotResponse struct { + SnapshotID string `json:"snapshotID"` + MaxItemsPerPartition uint32 `json:"maxItemsPerPartition"` + Algo string `json:"algo"` + UploadURL string `json:"uploadURL"` + PresignedURLFormData map[string]string `json:"presignedURLFormData"` + EncryptionKey string `json:"encryptionKey"` + Nonce string `json:"nonce"` } diff --git a/pkg/services/cloudmigration/slicesext/slicesext.go b/pkg/services/cloudmigration/slicesext/slicesext.go new file mode 100644 index 00000000000..66d9fb6b6cf --- /dev/null +++ b/pkg/services/cloudmigration/slicesext/slicesext.go @@ -0,0 +1,33 @@ +package slicesext + +import "math" + +// Partitions the input into slices where the length is <= chunkSize. +// +// Example: +// +// Chunks(2, []int{1, 2, 3, 4}) +// => [][]int{{1, 2}, {3, 4}} +func Chunks[T any](chunkSize int, xs []T) [][]T { + if chunkSize < 0 { + panic("chunk size must be greater than or equal to 0") + } + if chunkSize == 0 { + return [][]T{} + } + + out := make([][]T, 0, int(math.Ceil(float64(len(xs))/float64(chunkSize)))) + + for i := 0; i < len(xs); i += chunkSize { + var chunk []T + if i+chunkSize < len(xs) { + chunk = xs[i : i+chunkSize] + } else { + chunk = xs[i:] + } + + out = append(out, chunk) + } + + return out +} diff --git a/pkg/services/cloudmigration/slicesext/slicesext_test.go b/pkg/services/cloudmigration/slicesext/slicesext_test.go new file mode 100644 index 00000000000..150f92b004e --- /dev/null +++ b/pkg/services/cloudmigration/slicesext/slicesext_test.go @@ -0,0 +1,80 @@ +package slicesext + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestChunks(t *testing.T) { + t.Parallel() + + t.Run("chunkSize must be greater than 0", func(t *testing.T) { + t.Parallel() + + assert.PanicsWithValue(t, "chunk size must be greater than or equal to 0", func() { + Chunks(-1, []string{}) + }) + }) + + t.Run("basic", func(t *testing.T) { + t.Parallel() + + cases := []struct { + description string + chunkSize int + input []int + expected [][]int + }{ + { + description: "empty slice", + chunkSize: 2, + input: []int{}, + expected: [][]int{}, + }, + { + description: "nil slice", + chunkSize: 2, + input: nil, + expected: [][]int{}, + }, + { + description: "chunk size is 0", + chunkSize: 0, + input: []int{1, 2, 3}, + expected: [][]int{}, + }, + { + description: "chunk size is greater than slice length", + chunkSize: 3, + input: []int{1}, + expected: [][]int{{1}}, + }, + { + description: "chunk size is 1", + chunkSize: 1, + input: []int{1, 2, 3}, + expected: [][]int{{1}, {2}, {3}}, + }, + { + description: "chunk size is 2 and slice length is 3", + chunkSize: 2, + input: []int{1, 2, 3}, + expected: [][]int{{1, 2}, {3}}, + }, + { + description: "chunk size is 2 and slice length is 6", + chunkSize: 2, + input: []int{1, 2, 3, 4, 5, 6}, + expected: [][]int{{1, 2}, {3, 4}, {5, 6}}, + }, + } + + for _, tt := range cases { + t.Run(tt.description, func(t *testing.T) { + result := Chunks(tt.chunkSize, tt.input) + assert.Equal(t, tt.expected, result) + }) + } + }) +} diff --git a/pkg/services/dashboards/database/database_folder_test.go b/pkg/services/dashboards/database/database_folder_test.go index e8fd90273e7..1f4101b190e 100644 --- a/pkg/services/dashboards/database/database_folder_test.go +++ b/pkg/services/dashboards/database/database_folder_test.go @@ -288,7 +288,7 @@ func TestIntegrationDashboardInheritedFolderRBAC(t *testing.T) { UserID: u.ID, OrgID: u.OrgID, OrgRole: org.RoleAdmin, - Permissions: map[int64]map[string][]string{u.OrgID: accesscontrol.GroupScopesByAction([]accesscontrol.Permission{ + Permissions: map[int64]map[string][]string{u.OrgID: accesscontrol.GroupScopesByActionContext(context.Background(), []accesscontrol.Permission{ { Action: dashboards.ActionFoldersCreate, }, { diff --git a/pkg/services/featuremgmt/toggles-gitlog.csv b/pkg/services/featuremgmt/toggles-gitlog.csv index d2ffa07d38f..a0c15aada46 100644 --- a/pkg/services/featuremgmt/toggles-gitlog.csv +++ b/pkg/services/featuremgmt/toggles-gitlog.csv @@ -1,24 +1,24 @@ #name,created,deleted,hash,author -newNavigation,2022-01-26T17:44:20Z,2022-06-16T09:48:38Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -trimDefaults,2022-01-26T17:44:20Z,2023-11-02T15:35:14Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -dashboardPreviews,2022-01-26T17:44:20Z,2023-04-13T17:42:24Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -live-config,2022-01-26T17:44:20Z,2023-02-03T21:21:48Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley accesscontrol,2022-01-26T17:44:20Z,2022-05-16T10:45:41Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -tempoServiceGraph,2022-01-26T17:44:20Z,2022-07-19T07:00:58Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -httpclientprovider_azure_auth,2022-01-26T17:44:20Z,2022-05-30T15:43:32Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -tempoBackendSearch,2022-01-26T17:44:20Z,2022-06-01T17:32:10Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -showFeatureFlagsInUI,2022-01-26T17:44:20Z,2023-02-09T00:01:34Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -queryOverLive,2022-01-26T17:44:20Z,,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -validatedQueries,2022-01-26T17:44:20Z,2022-05-16T21:17:05Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -fullRangeLogsVolume,2022-01-26T17:44:20Z,2022-02-15T08:05:03Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -prometheus_azure_auth,2022-01-26T17:44:20Z,2022-08-11T14:12:57Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -live-service-web-worker,2022-01-26T17:44:20Z,,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -envelopeEncryption,2022-01-26T17:44:20Z,2022-05-24T08:34:47Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +dashboardPreviews,2022-01-26T17:44:20Z,2023-04-13T17:42:24Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley database_metrics,2022-01-26T17:44:20Z,2023-04-28T13:19:06Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -live-pipeline,2022-01-26T17:44:20Z,2023-03-22T18:09:44Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -service-accounts,2022-01-26T17:44:20Z,2022-04-21T09:41:37Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley -tempoSearch,2022-01-26T17:44:20Z,2022-06-01T17:32:10Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley disable_http_request_histogram,2022-01-26T17:44:20Z,2022-06-01T12:33:59Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +envelopeEncryption,2022-01-26T17:44:20Z,2022-05-24T08:34:47Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +fullRangeLogsVolume,2022-01-26T17:44:20Z,2022-02-15T08:05:03Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +httpclientprovider_azure_auth,2022-01-26T17:44:20Z,2022-05-30T15:43:32Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +live-config,2022-01-26T17:44:20Z,2023-02-03T21:21:48Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +live-pipeline,2022-01-26T17:44:20Z,2023-03-22T18:09:44Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +live-service-web-worker,2022-01-26T17:44:20Z,,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +newNavigation,2022-01-26T17:44:20Z,2022-06-16T09:48:38Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +prometheus_azure_auth,2022-01-26T17:44:20Z,2022-08-11T14:12:57Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +queryOverLive,2022-01-26T17:44:20Z,,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +service-accounts,2022-01-26T17:44:20Z,2022-04-21T09:41:37Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +showFeatureFlagsInUI,2022-01-26T17:44:20Z,2023-02-09T00:01:34Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +tempoBackendSearch,2022-01-26T17:44:20Z,2022-06-01T17:32:10Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +tempoSearch,2022-01-26T17:44:20Z,2022-06-01T17:32:10Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +tempoServiceGraph,2022-01-26T17:44:20Z,2022-07-19T07:00:58Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +trimDefaults,2022-01-26T17:44:20Z,2023-11-02T15:35:14Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley +validatedQueries,2022-01-26T17:44:20Z,2022-05-16T21:17:05Z,5d66194ec5d8a7c174a075b6023dcbf58d17b861,Ryan McKinley featureHighlights,2022-02-03T11:53:23Z,,a79c048344bddff7a868b040d9a08953917480f9,Alex Khomenko lokiBackendMode,2022-02-07T07:43:48Z,2022-06-08T06:14:34Z,560c77390550e12e8c0be507c00f27cde0aa31e5,Gábor Farkas swaggerUi,2022-02-08T12:38:43Z,2023-03-01T14:36:37Z,35fe58de374003bb4b077a878cc47ffc0a9d27b5,Sofia Papagiannaki @@ -32,8 +32,8 @@ dashboardComments,2022-02-22T07:47:42Z,2023-03-11T12:28:12Z,28c30a34adbe94d0f08a lokiLive,2022-03-01T22:46:52Z,2023-06-19T10:03:51Z,796bc27f75d52148d5b15cc8c4901276c344df2d,Ryan McKinley fileStoreApi,2022-03-03T06:53:26Z,2022-03-11T18:08:19Z,a8b90d9a2524765c49923c48a7fcf0025c85b733,Artur Wierzbicki azureMonitorResourcePickerForMetrics,2022-03-14T19:07:45Z,2023-01-30T16:19:03Z,275f33cf37bb4221ef120310a87c17d2e0ff5f35,Sarah Zinger -storageLocalUpload,2022-03-17T17:19:23Z,2022-07-18T17:44:42Z,1cfb9a4a1916d3eac473e5ccd0cb77ce281f044f,Ryan McKinley storage,2022-03-17T17:19:23Z,,1cfb9a4a1916d3eac473e5ccd0cb77ce281f044f,Ryan McKinley +storageLocalUpload,2022-03-17T17:19:23Z,2022-07-18T17:44:42Z,1cfb9a4a1916d3eac473e5ccd0cb77ce281f044f,Ryan McKinley saveDashboardDrawer,2022-03-30T17:07:41Z,2022-05-02T16:29:22Z,edf384c730a448a5e90b21bbbce49bc0e70e8197,Ryan McKinley accesscontrol-builtins,2022-03-31T09:40:57Z,2022-05-19T07:29:36Z,0d87de153a2b8406d03efe0cf43b5a926ce7acab,Gabriel MABILLE alertProvisioning,2022-04-01T06:32:00Z,2022-06-05T05:45:36Z,b8e277ee4c070b64ba4cf024b18c460626d1a2d3,Alexander Weaver @@ -65,7 +65,7 @@ lokiDataframeApi,2022-06-13T06:33:46Z,2023-04-13T13:22:09Z,8fd9cb48548313cf43ebc topnav,2022-06-20T14:25:43Z,,3c3293df78344a782fb65e5f977fd148daa597ce,Torkel Ödegaard customBranding,2022-06-22T15:05:52Z,2022-10-05T12:07:35Z,405df77e3e6abcf5264ba192abe33630bd64da20,Tania useLegacyHeatmapPanel,2022-06-23T18:48:28Z,2022-11-23T18:46:21Z,dd5a3b77472884035de13ddd441f41d0dd007e4b,Ryan McKinley -scenes,2022-07-07T06:53:02Z,,935334cbdabef8b0516bfe6c8ed45dd063cce7e9,Torkel Ödegaard +scenes,2022-07-07T06:53:02Z,2024-06-27T07:03:46Z,935334cbdabef8b0516bfe6c8ed45dd063cce7e9,Torkel Ödegaard disableSecretsCompatibility,2022-07-12T20:27:37Z,,2d8a91a8461098f83aa512c867aff5af17b7893e,Guilherme Caulada dashboardsFromStorage,2022-07-14T22:36:17Z,2023-03-20T16:36:49Z,da1701ce576ab26506d6256567b73a597043623a,Ryan McKinley exploreMixedDatasource,2022-07-27T14:40:59Z,2022-07-27T15:17:31Z,e2258120e742b31ecde50e8de93544220a0762a3,Kristina @@ -169,7 +169,7 @@ elasticToggleableFilters,2023-06-27T08:38:20Z,2023-07-28T12:49:02Z,c1ce24c90f75d vizAndWidgetSplit,2023-06-27T10:22:13Z,,2785ed80d999b9ee1770e1209284d4fccd985401,Alexa V nestedFolderPicker,2023-06-28T09:40:29Z,2024-06-04T09:16:12Z,f18a7f7d9696a6e80606dc49d5ac0064384f111d,Josh Hunt frontendSandboxMonitorOnly,2023-07-05T11:48:25Z,,72f6793344fb3a63f5a8a86570b786b518264366,Esteban Beltran -prometheusIncrementalQueryInstrumentation,2023-07-05T19:39:49Z,,daf9f9cd199e0bbc110222a3f005dc05dab1681a,Galen Kistler +prometheusIncrementalQueryInstrumentation,2023-07-05T19:39:49Z,2024-06-20T13:04:22Z,daf9f9cd199e0bbc110222a3f005dc05dab1681a,Galen Kistler dashboardEmbed,2023-07-06T14:43:20Z,2024-04-19T10:48:08Z,420b19e0e4bbdb97ae707cc1360bef7f79839d02,Alex Khomenko awsDatasourcesTempCredentials,2023-07-06T15:06:11Z,,d33508453f6f1f7aab262b54c36ef471ed3eab87,Ida Štambuk logsExploreTableVisualisation,2023-07-12T13:52:42Z,,7e4e743a42052183f549f7fa88cd0cc362844ad1,Sven Grossmann @@ -222,7 +222,7 @@ libraryPanelRBAC,2023-10-11T23:30:50Z,,a12cb8cbf3a9b33841b2f2cb1522be11de78c86a, awsDatasourcesNewFormStyling,2023-10-12T08:59:10Z,,2771fb940342aa152377b26b9554eb15082f90ac,Ida Štambuk cachingOptimizeSerializationMemoryUsage,2023-10-12T16:56:49Z,,94ce87571ddfcede0fb7a229a65502b385d5bca3,Michael Mandrus panelTitleSearchInV1,2023-10-13T12:04:24Z,,bf2f2540da7a4e4b8d80e1fa4ae3d05868cf7b69,Arati R -exploreContentOutline,2023-10-13T16:57:13Z,,4ec54bc2c39ba43843c693fdb2a4529b6a4703f2,Haris Rozajac +exploreContentOutline,2023-10-13T16:57:13Z,2024-06-24T15:45:42Z,4ec54bc2c39ba43843c693fdb2a4529b6a4703f2,Haris Rozajac formatString,2023-10-13T18:17:12Z,,889576ac1d9278b1c6e3e278e8195968646a2db0,Sol pluginsInstrumentationStatusSource,2023-10-17T08:27:45Z,2024-02-21T11:57:40Z,f5076d1868caa14ce44a70e812315541b4199d9f,Giuseppe Guerra teamHttpHeaders,2023-10-17T10:23:54Z,,be5ba6813209b5b24e955e0f761032cb5826b578,Eric Leijonmarck @@ -232,8 +232,8 @@ prometheusPromQAIL,2023-10-19T15:45:32Z,,5580d061019bee46ea2e69c94041f3da14585ce cloudWatchBatchQueries,2023-10-20T19:09:41Z,,ecbc52f51529e1f35e26895db1a10f8a1c2f4244,Isabella Siu alertingContactPointsV2,2023-10-25T13:57:53Z,2023-11-30T12:37:14Z,e12e40fc2493160338237b0b94e72fa530a78ef4,Gilles De Mey alertmanagerRemoteOnly,2023-10-30T16:27:08Z,,363830883cb1f5de30f7015df5cba419df47468e,Santiago -alertmanagerRemoteSecondary,2023-10-30T16:27:08Z,,363830883cb1f5de30f7015df5cba419df47468e,Santiago alertmanagerRemotePrimary,2023-10-30T16:27:08Z,,363830883cb1f5de30f7015df5cba419df47468e,Santiago +alertmanagerRemoteSecondary,2023-10-30T16:27:08Z,,363830883cb1f5de30f7015df5cba419df47468e,Santiago annotationPermissionUpdate,2023-10-31T13:30:13Z,,c51c51458e4dd103aa0c099aa48b0d41f9375f86,Ieva kubernetesPlaylistsAPI,2023-10-31T17:26:39Z,2023-11-08T19:14:05Z,dd773e74f120ba908cafd596a6875c2d7fa199bf,Ryan McKinley traceToProfiles,2023-11-01T10:14:24Z,2024-01-22T14:21:14Z,c39e9a8f527b79881b95f64fd1c413b4bff42983,Joey @@ -271,8 +271,8 @@ alertingQueryOptimization,2024-01-10T20:52:58Z,,afa33f12b2cf50d2c7e438f498d27b06 newFolderPicker,2024-01-15T11:43:19Z,,ec53487c995777b314f566f5a1054e3f8e29ec05,Ashley Harrison kubernetesFeatureToggles,2024-01-18T05:32:44Z,,41e523bde7db5706f339d418c68d019039a8062e,Ryan McKinley returnToPrevious,2024-01-18T17:12:14Z,2024-05-27T15:47:57Z,5800e40fba2accf96d81328f000e35bbb7c7acf1,Laura Fernández -jitterAlertRulesWithinGroups,2024-01-18T18:48:11Z,,00a260effab802edc8f72df50bfb6447aac343f0,Alexander Weaver jitterAlertRules,2024-01-18T18:48:11Z,2024-02-09T21:53:58Z,00a260effab802edc8f72df50bfb6447aac343f0,Alexander Weaver +jitterAlertRulesWithinGroups,2024-01-18T18:48:11Z,,00a260effab802edc8f72df50bfb6447aac343f0,Alexander Weaver onPremToCloudMigrations,2024-01-22T16:09:08Z,,cf13cb9f70c2230f17450667ce59440304fb023c,Michael Mandrus alertingSaveStatePeriodic,2024-01-23T16:03:30Z,,aa25776f813926cb4f1947d4ae5a014f4e7728ff,Jean-Philippe Quéméner promQLScope,2024-01-29T20:22:17Z,,43d0664340f3e3af219d7b5c747f486a073f5ce3,Kyle Brandt @@ -285,17 +285,17 @@ newPDFRendering,2024-02-08T12:09:34Z,,28e66b4ad82ecebb551374325f0be4332412341c,A autoMigrateGraphPanel,2024-02-08T22:00:48Z,,829672759c12b27f849c92c3a2aee4a6b0037920,Nathan Marrs dashboardSceneSolo,2024-02-11T08:08:47Z,,fe6d1460b09b403fc74fd20e95f61513eede2555,Torkel Ödegaard kubernetesAggregator,2024-02-12T20:59:35Z,,d6e6298103d5d6a4efd1c21a3d74f429b506f3a7,Todd Treece -autoMigrateStatPanel,2024-02-14T16:06:25Z,,ce750e06187599da6b9c0a91ef95c7a62fe0d069,Nathan Marrs -autoMigrateWorldmapPanel,2024-02-14T16:06:25Z,,ce750e06187599da6b9c0a91ef95c7a62fe0d069,Nathan Marrs autoMigratePiechartPanel,2024-02-14T16:06:25Z,,ce750e06187599da6b9c0a91ef95c7a62fe0d069,Nathan Marrs +autoMigrateStatPanel,2024-02-14T16:06:25Z,,ce750e06187599da6b9c0a91ef95c7a62fe0d069,Nathan Marrs autoMigrateTablePanel,2024-02-14T16:06:25Z,,ce750e06187599da6b9c0a91ef95c7a62fe0d069,Nathan Marrs +autoMigrateWorldmapPanel,2024-02-14T16:06:25Z,,ce750e06187599da6b9c0a91ef95c7a62fe0d069,Nathan Marrs groupByVariable,2024-02-14T17:18:04Z,,f016f95298fe490a865612864520f3622f8e804a,Dominik Prokop alertingUpgradeDryrunOnStart,2024-02-16T16:29:54Z,2024-03-14T14:36:35Z,dfaf6d1e2e13b2bd11dc8f0cd4432bfcad819aa9,Matthew Jacobson expressionParser,2024-02-17T00:59:11Z,,f23f50f58d7ab5cb1fd88b42b6c58ec09c1a159d,Ryan McKinley sqlExpressions,2024-02-27T21:16:00Z,,70009201d44c2d0ab39cc77081808a69a6c4fd63,Scott Lepper aiGeneratedDashboardChanges,2024-03-05T12:01:31Z,,a7c06d26f14b2a9fa8faa929a6c9a0c355018429,Ivan Ortega Alba scopeFilters,2024-03-05T15:41:19Z,,b3efb4217e48656f24aacdffd5737595d7361afe,Carl Bergquist -betterPageScrolling,2024-03-06T15:06:47Z,,6a4e0c692ab26f4d4cb99ae615013e0b6e23f90b,Josh Hunt +betterPageScrolling,2024-03-06T15:06:47Z,2024-06-18T13:33:08Z,6a4e0c692ab26f4d4cb99ae615013e0b6e23f90b,Josh Hunt emailVerificationEnforcement,2024-03-11T14:09:44Z,2024-03-22T13:30:58Z,0b55d72fb5698e1ea2cf73eaceae166cd5619daa,Karl Persson ssoSettingsSAML,2024-03-14T11:04:45Z,,831ee9ee1696c0aa7a6e4ca022ddfc0ab28b86dc,linoman publicDashboardsScene,2024-03-22T14:48:21Z,,8d4ca72f2a0e66c446d58d8bf13fadbc988fce11,Juan Cabanas @@ -309,17 +309,17 @@ cloudWatchNewLabelParsing,2024-04-05T15:57:56Z,,58f32150c262605d188874b88f44a7de exploreMetrics,2024-04-09T18:15:18Z,,66c0fd4dcc3202e11f41b302d27894dc162fb288,Darren Janeczek accessActionSets,2024-04-12T16:19:25Z,,56f4664875047d6861ea3facbc94cd921e263950,Ieva disableNumericMetricsSortingInExpressions,2024-04-16T14:52:47Z,,d3fee607e2818747ad02daf6b8c58cc801075076,Nick Richmond -queryServiceRewrite,2024-04-19T09:26:21Z,,5a8384a2455bbd3c0ba5ec67e5f5e3cc4a836904,Ryan McKinley -queryServiceFromUI,2024-04-19T09:26:21Z,,5a8384a2455bbd3c0ba5ec67e5f5e3cc4a836904,Ryan McKinley queryService,2024-04-19T09:26:21Z,,5a8384a2455bbd3c0ba5ec67e5f5e3cc4a836904,Ryan McKinley +queryServiceFromUI,2024-04-19T09:26:21Z,,5a8384a2455bbd3c0ba5ec67e5f5e3cc4a836904,Ryan McKinley +queryServiceRewrite,2024-04-19T09:26:21Z,,5a8384a2455bbd3c0ba5ec67e5f5e3cc4a836904,Ryan McKinley grafanaManagedRecordingRules,2024-04-22T17:53:16Z,,c32953e52cf9fd46a462711bc23fde15a5c3b6bf,Alexander Weaver logsExploreTableDefaultVisualization,2024-05-02T15:28:15Z,,840aeddbd1957117d9b62074c155e87bb4afd4b4,Galen Kistler -autofixDSUID,2024-05-03T11:32:07Z,,b6f899d953a0924760dc5fd5a3d40669c86d475d,Andres Martinez Gotor +autofixDSUID,2024-05-03T11:32:07Z,2024-06-20T10:56:39Z,b6f899d953a0924760dc5fd5a3d40669c86d475d,Andres Martinez Gotor newDashboardSharingComponent,2024-05-03T15:02:18Z,,d1434fad3a68bc1d2b49725be31e45526e6ad349,Juan Cabanas tlsMemcached,2024-05-09T19:12:08Z,,b009536329d110afd807ef2f27f2b7dcc7d310ba,lean.dev notificationBanner,2024-05-13T09:32:34Z,,f3953b4955c218cc4678e842faa3d3380fd0f8f7,Alex Khomenko -dualWritePlaylistsMode3,2024-05-14T12:11:56Z,2024-05-31T18:18:09Z,6836bfe1ea1bf62f4eb66dc1328a456183874f81,Arati R dualWritePlaylistsMode2,2024-05-14T12:11:56Z,2024-05-31T18:18:09Z,6836bfe1ea1bf62f4eb66dc1328a456183874f81,Arati R +dualWritePlaylistsMode3,2024-05-14T12:11:56Z,2024-05-31T18:18:09Z,6836bfe1ea1bf62f4eb66dc1328a456183874f81,Arati R dashboardRestore,2024-05-16T17:36:26Z,,42d75ac737d7ac001a6d53376e25512408a01db5,Ezequiel Victorero datasourceProxyDisableRBAC,2024-05-21T13:05:16Z,,0072e4a92d896df343d9586522d6f7533773da78,Aaron Godin alertingDisableSendAlertsExternal,2024-05-23T12:29:19Z,,8421919cb552b9e8dbd4ebba20bcc67bbc5e6b4f,Steve Simpson @@ -330,3 +330,17 @@ alertingCentralAlertHistory,2024-05-29T15:01:38Z,,289ce6185574df99acea37b86c2e08 pluginProxyPreserveTrailingSlash,2024-06-05T11:36:14Z,,fe3e5917f1bc83ab29b6a57578316e054718aa4a,Marcus Efraimsson kubernetesDashboards,2024-06-05T14:34:23Z,,41e0430f83bf7db50c4caaa1472afa3bf3d5c2dc,Ryan McKinley azureMonitorPrometheusExemplars,2024-06-06T16:53:17Z,,c9778c3332aa93e5dd8bc3b894264e1955f0d593,Andreas Christou +pinNavItems,2024-06-10T11:40:03Z,,84b638fb26cecf856374bb3d09b123061b4b8a6b,Laura Fernández +authZGRPCServer,2024-06-13T09:41:35Z,,afcb5a855c26e985e43861bff6fab36b1b008109,Gabriel MABILLE +openSearchBackendFlowEnabled,2024-06-17T09:41:50Z,,ab2af9b8f75cd13595f4d487c1168e849768a518,Ida Štambuk +ssoSettingsLDAP,2024-06-18T11:31:27Z,,d074cc7892b96a1333bd07011baff146ea71e21d,Mihai Doarna +databaseReadReplica,2024-06-18T15:07:15Z,,50244ed4a1435cbf3e3c87d4af34fd7937f7c259,Kristin Laemmert +disableClassicHTTPHistogram,2024-06-18T19:37:44Z,,3bbc821131f1b10ace139dbb4a6880fb77686646,Dave Henderson +zanzana,2024-06-19T13:59:47Z,,3fe29809bec39239c45d672d686392725773f2e1,Karl Persson +failWrongDSUID,2024-06-20T10:56:39Z,,44fd13c742e606b8409e23eb62cab8bab24310f1,Andres Martinez Gotor +passScopeToDashboardApi,2024-06-20T15:49:19Z,,543e71eb2862187d12e8ee7742badb06e4c913e8,Bogdan Matei +alertingApiServer,2024-06-20T20:52:03Z,,b07592620279f16b0353444e7aba3c457c50d7ec,Yuri Tseretyan +dashboardRestoreUI,2024-06-25T14:43:13Z,,a3879e02bb3b7e8e917ba1bb4163bb230f917f2c,Laura Fernández +cloudWatchRoundUpEndTime,2024-06-27T15:10:28Z,,ba5b33227c343cb2c7dad15ff85a745869c68da9,Ida Štambuk +bodyScrolling,2024-07-01T10:28:39Z,,c0058f9c7e390d8a196f5b375382334287633ea9,Ashley Harrison +cloudwatchMetricInsightsCrossAccount,2024-07-02T10:34:12Z,,36ff0fe63a7710eb496f2f048feb71e6eb6e3c56,Ida Štambuk diff --git a/pkg/services/featuremgmt/toggles_gen.json b/pkg/services/featuremgmt/toggles_gen.json index e6f2ff21a65..a68a06f0350 100644 --- a/pkg/services/featuremgmt/toggles_gen.json +++ b/pkg/services/featuremgmt/toggles_gen.json @@ -94,7 +94,7 @@ "metadata": { "name": "alertingApiServer", "resourceVersion": "1718908755156", - "creationTimestamp": "2024-06-20T18:39:15Z" + "creationTimestamp": "2024-06-20T20:52:03Z" }, "spec": { "description": "Register Alerting APIs with the K8s API server", @@ -145,15 +145,19 @@ { "metadata": { "name": "alertingInsights", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-09-14T12:58:04Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-09-14T12:58:04Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Show the new alerting insights landing page", "stage": "GA", "codeowner": "@grafana/alerting-squad", "frontend": true, - "hideFromAdminPage": true + "hideFromAdminPage": true, + "expression": "true" } }, { @@ -172,14 +176,18 @@ { "metadata": { "name": "alertingNoDataErrorExecution", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-08-15T14:27:15Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-08-15T14:27:15Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Changes how Alerting state manager handles execution of NoData/Error", "stage": "GA", "codeowner": "@grafana/alerting-squad", - "requiresRestart": true + "requiresRestart": true, + "expression": "true" } }, { @@ -198,13 +206,17 @@ { "metadata": { "name": "alertingQueryOptimization", - "resourceVersion": "1718727528075", - "creationTimestamp": "2024-01-10T20:52:58Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2024-01-10T20:52:58Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Optimizes eligible queries in order to reduce load on datasources", "stage": "GA", - "codeowner": "@grafana/alerting-squad" + "codeowner": "@grafana/alerting-squad", + "expression": "false" } }, { @@ -222,13 +234,17 @@ { "metadata": { "name": "alertingSimplifiedRouting", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-11-10T13:14:39Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-11-10T13:14:39Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables users to easily configure alert notifications by specifying a contact point directly when editing or creating an alert rule", "stage": "GA", - "codeowner": "@grafana/alerting-squad" + "codeowner": "@grafana/alerting-squad", + "expression": "true" } }, { @@ -270,26 +286,34 @@ { "metadata": { "name": "angularDeprecationUI", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-08-29T14:05:47Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-08-29T14:05:47Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Display Angular warnings in dashboards and panels", "stage": "GA", "codeowner": "@grafana/plugins-platform-backend", - "frontend": true + "frontend": true, + "expression": "true" } }, { "metadata": { "name": "annotationPermissionUpdate", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-10-31T13:30:13Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-10-31T13:30:13Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Change the way annotation permissions work by scoping them to folders and dashboards.", "stage": "GA", - "codeowner": "@grafana/identity-access-team" + "codeowner": "@grafana/identity-access-team", + "expression": "true" } }, { @@ -310,7 +334,7 @@ "metadata": { "name": "authZGRPCServer", "resourceVersion": "1718727528075", - "creationTimestamp": "2024-06-18T16:18:48Z" + "creationTimestamp": "2024-06-13T09:41:35Z" }, "spec": { "description": "Enables the gRPC server for authorization", @@ -416,7 +440,7 @@ "name": "autofixDSUID", "resourceVersion": "1717578796182", "creationTimestamp": "2024-05-03T11:32:07Z", - "deletionTimestamp": "2024-06-18T14:28:32Z" + "deletionTimestamp": "2024-06-20T10:56:39Z" }, "spec": { "description": "Automatically migrates invalid datasource UIDs", @@ -427,26 +451,34 @@ { "metadata": { "name": "awsAsyncQueryCaching", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-07-21T15:34:07Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-07-21T15:34:07Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enable caching for async queries for Redshift and Athena. Requires that the datasource has caching and async query support enabled", "stage": "GA", - "codeowner": "@grafana/aws-datasources" + "codeowner": "@grafana/aws-datasources", + "expression": "true" } }, { "metadata": { "name": "awsDatasourcesNewFormStyling", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-10-12T08:59:10Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-10-12T08:59:10Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Applies new form styling for configuration and query editors in AWS plugins", "stage": "GA", "codeowner": "@grafana/aws-datasources", - "frontend": true + "frontend": true, + "expression": "true" } }, { @@ -476,8 +508,11 @@ { "metadata": { "name": "bodyScrolling", - "resourceVersion": "1719825052257", - "creationTimestamp": "2024-07-01T09:10:52Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2024-07-01T10:28:39Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Adjusts Page to make body the scrollable element", @@ -485,7 +520,8 @@ "codeowner": "@grafana/grafana-frontend-platform", "frontend": true, "hideFromAdminPage": true, - "hideFromDocs": true + "hideFromDocs": true, + "expression": "false" } }, { @@ -556,45 +592,57 @@ { "metadata": { "name": "cloudWatchCrossAccountQuerying", - "resourceVersion": "1718727528075", - "creationTimestamp": "2022-11-28T11:39:12Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2022-11-28T11:39:12Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables cross-account querying in CloudWatch datasources", "stage": "GA", "codeowner": "@grafana/aws-datasources", - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { "metadata": { "name": "cloudWatchNewLabelParsing", - "resourceVersion": "1718727528075", - "creationTimestamp": "2024-04-05T15:57:56Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2024-04-05T15:57:56Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Updates CloudWatch label parsing to be more accurate", "stage": "GA", - "codeowner": "@grafana/aws-datasources" + "codeowner": "@grafana/aws-datasources", + "expression": "true" } }, { "metadata": { "name": "cloudWatchRoundUpEndTime", - "resourceVersion": "1719324143210", - "creationTimestamp": "2024-06-25T14:02:23Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2024-06-27T15:10:28Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Round up end time for metric queries to the next minute to avoid missing data", "stage": "GA", - "codeowner": "@grafana/aws-datasources" + "codeowner": "@grafana/aws-datasources", + "expression": "true" } }, { "metadata": { "name": "cloudwatchMetricInsightsCrossAccount", "resourceVersion": "1719497905377", - "creationTimestamp": "2024-06-27T14:18:25Z" + "creationTimestamp": "2024-07-02T10:34:12Z" }, "spec": { "description": "Enables cross account observability for Cloudwatch Metric Insights", @@ -620,14 +668,18 @@ { "metadata": { "name": "correlations", - "resourceVersion": "1718727528075", - "creationTimestamp": "2022-09-16T13:14:27Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2022-09-16T13:14:27Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Correlations page", "stage": "GA", "codeowner": "@grafana/explore-squad", - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { @@ -649,13 +701,17 @@ { "metadata": { "name": "dashboardRestoreUI", - "resourceVersion": "1719321338253", - "creationTimestamp": "2024-06-25T13:15:38Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2024-06-25T14:43:13Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables the frontend to be able to restore a recently deleted dashboard", "stage": "experimental", - "codeowner": "@grafana/grafana-frontend-platform" + "codeowner": "@grafana/grafana-frontend-platform", + "expression": "false" } }, { @@ -700,53 +756,69 @@ { "metadata": { "name": "dashgpt", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-08-30T20:22:05Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-08-30T20:22:05Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enable AI powered features in dashboards", "stage": "GA", "codeowner": "@grafana/dashboards-squad", - "frontend": true + "frontend": true, + "expression": "true" } }, { "metadata": { "name": "databaseReadReplica", - "resourceVersion": "1718727528075", - "creationTimestamp": "2024-06-18T16:18:48Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2024-06-18T15:07:15Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Use a read replica for some database queries.", "stage": "experimental", - "codeowner": "@grafana/grafana-backend-services-squad" + "codeowner": "@grafana/grafana-backend-services-squad", + "expression": "false" } }, { "metadata": { "name": "dataplaneFrontendFallback", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-04-07T21:13:19Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-04-07T21:13:19Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Support dataplane contract field name change for transformations and field name matchers where the name is different", "stage": "GA", "codeowner": "@grafana/observability-metrics", "frontend": true, - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { "metadata": { "name": "datasourceProxyDisableRBAC", - "resourceVersion": "1718727528075", - "creationTimestamp": "2024-05-21T13:05:16Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2024-05-21T13:05:16Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Disables applying a plugin route's ReqAction field to authorization", "stage": "GA", "codeowner": "@grafana/identity-access-team", - "hideFromDocs": true + "hideFromDocs": true, + "expression": "false" } }, { @@ -792,7 +864,7 @@ "metadata": { "name": "disableClassicHTTPHistogram", "resourceVersion": "1718727528075", - "creationTimestamp": "2024-06-18T16:18:48Z" + "creationTimestamp": "2024-06-18T19:37:44Z" }, "spec": { "description": "Disables classic HTTP Histogram (use with enableNativeHTTPHistogram)", @@ -805,14 +877,18 @@ { "metadata": { "name": "disableEnvelopeEncryption", - "resourceVersion": "1718727528075", - "creationTimestamp": "2022-05-24T08:34:47Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2022-05-24T08:34:47Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Disable envelope encryption (emergency only)", "stage": "GA", "codeowner": "@grafana/grafana-as-code", - "hideFromAdminPage": true + "hideFromAdminPage": true, + "expression": "false" } }, { @@ -898,7 +974,7 @@ "name": "exploreContentOutline", "resourceVersion": "1717578796182", "creationTimestamp": "2023-10-13T16:57:13Z", - "deletionTimestamp": "2024-06-17T09:45:00Z" + "deletionTimestamp": "2024-06-24T15:45:42Z" }, "spec": { "description": "Content outline sidebar", @@ -911,14 +987,18 @@ { "metadata": { "name": "exploreMetrics", - "resourceVersion": "1718727528075", - "creationTimestamp": "2024-04-09T18:15:18Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2024-04-09T18:15:18Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables the new Explore Metrics core app", "stage": "GA", "codeowner": "@grafana/dashboards-squad", - "frontend": true + "frontend": true, + "expression": "true" } }, { @@ -989,7 +1069,7 @@ "metadata": { "name": "failWrongDSUID", "resourceVersion": "1718721033692", - "creationTimestamp": "2024-06-18T14:30:33Z" + "creationTimestamp": "2024-06-20T10:56:39Z" }, "spec": { "description": "Throws an error if a datasource has an invalid UIDs", @@ -1013,14 +1093,18 @@ { "metadata": { "name": "featureHighlights", - "resourceVersion": "1718727528075", - "creationTimestamp": "2022-02-03T11:53:23Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2022-02-03T11:53:23Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Highlight Grafana Enterprise features", "stage": "GA", "codeowner": "@grafana/grafana-as-code", - "allowSelfServe": true + "allowSelfServe": true, + "expression": "false" } }, { @@ -1185,15 +1269,19 @@ { "metadata": { "name": "influxdbBackendMigration", - "resourceVersion": "1718727528075", + "resourceVersion": "1720021873452", "creationTimestamp": "2022-02-09T18:26:16Z", - "deletionTimestamp": "2023-01-17T14:11:26Z" + "deletionTimestamp": "2023-01-17T14:11:26Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Query InfluxDB InfluxQL without the proxy", "stage": "GA", "codeowner": "@grafana/observability-metrics", - "frontend": true + "frontend": true, + "expression": "true" } }, { @@ -1277,14 +1365,18 @@ { "metadata": { "name": "kubernetesPlaylists", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-10-05T19:00:36Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-10-05T19:00:36Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Use the kubernetes API in the frontend for playlists, and route /api/playlist requests to k8s", "stage": "GA", "codeowner": "@grafana/grafana-app-platform-squad", - "requiresRestart": true + "requiresRestart": true, + "expression": "true" } }, { @@ -1341,28 +1433,36 @@ { "metadata": { "name": "logRowsPopoverMenu", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-11-16T09:48:10Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-11-16T09:48:10Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enable filtering menu displayed when text of a log line is selected", "stage": "GA", "codeowner": "@grafana/observability-logs", - "frontend": true + "frontend": true, + "expression": "true" } }, { "metadata": { "name": "logsContextDatasourceUi", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-01-27T14:12:01Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-01-27T14:12:01Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Allow datasource to provide custom UI for context view", "stage": "GA", "codeowner": "@grafana/observability-logs", "frontend": true, - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { @@ -1381,27 +1481,35 @@ { "metadata": { "name": "logsExploreTableVisualisation", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-07-12T13:52:42Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-07-12T13:52:42Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "A table visualisation for logs in Explore", "stage": "GA", "codeowner": "@grafana/observability-logs", - "frontend": true + "frontend": true, + "expression": "true" } }, { "metadata": { "name": "logsInfiniteScrolling", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-11-09T10:54:03Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-11-09T10:54:03Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables infinite scrolling for the Logs panel in Explore and Dashboards", "stage": "GA", "codeowner": "@grafana/observability-logs", - "frontend": true + "frontend": true, + "expression": "true" } }, { @@ -1431,14 +1539,18 @@ { "metadata": { "name": "lokiMetricDataplane", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-04-13T13:07:08Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-04-13T13:07:08Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Changes metric responses from Loki to be compliant with the dataplane specification.", "stage": "GA", "codeowner": "@grafana/observability-logs", - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { @@ -1457,28 +1569,36 @@ { "metadata": { "name": "lokiQueryHints", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-12-18T20:43:16Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-12-18T20:43:16Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables query hints for Loki", "stage": "GA", "codeowner": "@grafana/observability-logs", - "frontend": true + "frontend": true, + "expression": "true" } }, { "metadata": { "name": "lokiQuerySplitting", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-02-09T17:27:02Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-02-09T17:27:02Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Split large interval queries into subqueries with smaller time intervals", "stage": "GA", "codeowner": "@grafana/observability-logs", "frontend": true, - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { @@ -1509,25 +1629,33 @@ { "metadata": { "name": "lokiStructuredMetadata", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-11-16T16:06:14Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-11-16T16:06:14Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables the loki data source to request structured metadata from the Loki server", "stage": "GA", - "codeowner": "@grafana/observability-logs" + "codeowner": "@grafana/observability-logs", + "expression": "true" } }, { "metadata": { "name": "managedPluginsInstall", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-10-18T13:17:03Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-10-18T13:17:03Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Install managed plugins directly from plugins catalog", "stage": "GA", - "codeowner": "@grafana/plugins-platform-backend" + "codeowner": "@grafana/plugins-platform-backend", + "expression": "true" } }, { @@ -1570,13 +1698,17 @@ { "metadata": { "name": "nestedFolders", - "resourceVersion": "1718727528075", - "creationTimestamp": "2022-10-26T14:15:14Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2022-10-26T14:15:14Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enable folder nesting", "stage": "GA", - "codeowner": "@grafana/search-and-storage" + "codeowner": "@grafana/search-and-storage", + "expression": "true" } }, { @@ -1686,7 +1818,7 @@ "metadata": { "name": "openSearchBackendFlowEnabled", "resourceVersion": "1718727528075", - "creationTimestamp": "2024-06-18T16:18:48Z" + "creationTimestamp": "2024-06-17T09:41:50Z" }, "spec": { "description": "Enables the backend query flow for Open Search datasource plugin", @@ -1711,14 +1843,18 @@ { "metadata": { "name": "panelMonitoring", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-10-09T05:19:08Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-10-09T05:19:08Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables panel monitoring through logs and measurements", "stage": "GA", "codeowner": "@grafana/dataviz-squad", - "frontend": true + "frontend": true, + "expression": "true" } }, { @@ -1751,7 +1887,7 @@ "metadata": { "name": "passScopeToDashboardApi", "resourceVersion": "1718290335877", - "creationTimestamp": "2024-06-13T14:52:15Z" + "creationTimestamp": "2024-06-20T15:49:19Z" }, "spec": { "description": "Enables the passing of scopes to dashboards fetching in Grafana", @@ -1789,7 +1925,7 @@ "metadata": { "name": "pinNavItems", "resourceVersion": "1718727528075", - "creationTimestamp": "2024-06-18T16:18:48Z" + "creationTimestamp": "2024-06-10T11:40:03Z" }, "spec": { "description": "Enables pinning of nav items", @@ -1800,13 +1936,17 @@ { "metadata": { "name": "pluginProxyPreserveTrailingSlash", - "resourceVersion": "1718727528075", - "creationTimestamp": "2024-06-05T11:36:14Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2024-06-05T11:36:14Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Preserve plugin proxy trailing slash.", "stage": "GA", - "codeowner": "@grafana/plugins-platform-backend" + "codeowner": "@grafana/plugins-platform-backend", + "expression": "false" } }, { @@ -1889,26 +2029,34 @@ { "metadata": { "name": "prometheusConfigOverhaulAuth", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-07-26T16:09:53Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-07-26T16:09:53Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Update the Prometheus configuration page with the new auth component", "stage": "GA", - "codeowner": "@grafana/observability-metrics" + "codeowner": "@grafana/observability-metrics", + "expression": "true" } }, { "metadata": { "name": "prometheusDataplane", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-03-29T15:26:32Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-03-29T15:26:32Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Changes responses to from Prometheus to be compliant with the dataplane specification. In particular, when this feature toggle is active, the numeric `Field.Name` is set from 'Value' to the value of the `__name__` label.", "stage": "GA", "codeowner": "@grafana/observability-metrics", - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { @@ -1916,7 +2064,7 @@ "name": "prometheusIncrementalQueryInstrumentation", "resourceVersion": "1718727528075", "creationTimestamp": "2023-07-05T19:39:49Z", - "deletionTimestamp": "2024-06-20T11:30:37Z" + "deletionTimestamp": "2024-06-20T13:04:22Z" }, "spec": { "description": "Adds RudderStack events to incremental queries", @@ -1928,15 +2076,19 @@ { "metadata": { "name": "prometheusMetricEncyclopedia", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-03-07T18:41:05Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-03-07T18:41:05Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Adds the metrics explorer component to the Prometheus query builder as an option in metric select", "stage": "GA", "codeowner": "@grafana/observability-metrics", "frontend": true, - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { @@ -1955,14 +2107,18 @@ { "metadata": { "name": "publicDashboards", - "resourceVersion": "1718727528075", - "creationTimestamp": "2022-04-07T18:30:19Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2022-04-07T18:30:19Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "[Deprecated] Public dashboards are now enabled by default; to disable them, use the configuration setting. This feature toggle will be removed in the next major version.", "stage": "GA", "codeowner": "@grafana/sharing-squad", - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { @@ -2060,26 +2216,34 @@ { "metadata": { "name": "recordedQueriesMulti", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-06-14T12:34:22Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-06-14T12:34:22Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables writing multiple items from a single query within Recorded Queries", "stage": "GA", - "codeowner": "@grafana/observability-metrics" + "codeowner": "@grafana/observability-metrics", + "expression": "true" } }, { "metadata": { "name": "recoveryThreshold", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-10-10T14:51:50Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-10-10T14:51:50Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables feature recovery threshold (aka hysteresis) for threshold server-side expression", "stage": "GA", "codeowner": "@grafana/alerting-squad", - "requiresRestart": true + "requiresRestart": true, + "expression": "true" } }, { @@ -2139,7 +2303,7 @@ "name": "scenes", "resourceVersion": "1718727528075", "creationTimestamp": "2022-07-07T06:53:02Z", - "deletionTimestamp": "2024-06-26T11:58:18Z" + "deletionTimestamp": "2024-06-27T07:03:46Z" }, "spec": { "description": "Experimental framework to build interactive dashboards", @@ -2215,21 +2379,25 @@ { "metadata": { "name": "ssoSettingsApi", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-11-08T09:50:01Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-11-08T09:50:01Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables the SSO settings API and the OAuth configuration UIs in Grafana", "stage": "GA", "codeowner": "@grafana/identity-access-team", - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { "metadata": { "name": "ssoSettingsLDAP", "resourceVersion": "1718727528075", - "creationTimestamp": "2024-06-18T16:18:48Z" + "creationTimestamp": "2024-06-18T11:31:27Z" }, "spec": { "description": "Use the new SSO Settings API to configure LDAP", @@ -2305,53 +2473,69 @@ { "metadata": { "name": "topnav", - "resourceVersion": "1718727528075", - "creationTimestamp": "2022-06-20T14:25:43Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2022-06-20T14:25:43Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables topnav support in external plugins. The new Grafana navigation cannot be disabled.", "stage": "deprecated", - "codeowner": "@grafana/grafana-frontend-platform" + "codeowner": "@grafana/grafana-frontend-platform", + "expression": "true" } }, { "metadata": { "name": "traceQLStreaming", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-07-26T13:33:16Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-07-26T13:33:16Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables response streaming of TraceQL queries of the Tempo data source", "stage": "GA", "codeowner": "@grafana/observability-traces-and-profiling", - "frontend": true + "frontend": true, + "expression": "false" } }, { "metadata": { "name": "transformationsRedesign", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-07-12T16:35:49Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-07-12T16:35:49Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Enables the transformations redesign", "stage": "GA", "codeowner": "@grafana/observability-metrics", "frontend": true, - "allowSelfServe": true + "allowSelfServe": true, + "expression": "true" } }, { "metadata": { "name": "transformationsVariableSupport", - "resourceVersion": "1718727528075", - "creationTimestamp": "2023-10-04T14:28:46Z" + "resourceVersion": "1720021873452", + "creationTimestamp": "2023-10-04T14:28:46Z", + "annotations": { + "grafana.app/updatedTimestamp": "2024-07-03 15:51:13.452477 +0000 UTC" + } }, "spec": { "description": "Allows using variables in transformations", "stage": "GA", "codeowner": "@grafana/dataviz-squad", - "frontend": true + "frontend": true, + "expression": "true" } }, { @@ -2408,7 +2592,7 @@ "metadata": { "name": "zanzana", "resourceVersion": "1718787304727", - "creationTimestamp": "2024-06-19T08:55:04Z" + "creationTimestamp": "2024-06-19T13:59:47Z" }, "spec": { "description": "Use openFGA as authorization engine.", diff --git a/pkg/services/featuremgmt/toggles_gen_test.go b/pkg/services/featuremgmt/toggles_gen_test.go index 06143768bd4..32e8357768c 100644 --- a/pkg/services/featuremgmt/toggles_gen_test.go +++ b/pkg/services/featuremgmt/toggles_gen_test.go @@ -59,6 +59,7 @@ func TestFeatureToggleFiles(t *testing.T) { AllowSelfServe: flag.AllowSelfServe, HideFromAdminPage: flag.HideFromAdminPage, HideFromDocs: flag.HideFromDocs, + Expression: flag.Expression, // EnabledVersion: ???, } diff --git a/pkg/services/grpcserver/interceptors/auth.go b/pkg/services/grpcserver/interceptors/auth.go index 455a35184d0..ea81d45153f 100644 --- a/pkg/services/grpcserver/interceptors/auth.go +++ b/pkg/services/grpcserver/interceptors/auth.go @@ -126,7 +126,7 @@ func (a *authenticator) getSignedInUser(ctx context.Context, token string) (*use if err != nil { a.logger.Error("failed fetching permissions for user", "userID", signedInUser.UserID, "error", err) } - signedInUser.Permissions[signedInUser.OrgID] = accesscontrol.GroupScopesByAction(permissions) + signedInUser.Permissions[signedInUser.OrgID] = accesscontrol.GroupScopesByActionContext(context.Background(), permissions) } return signedInUser, nil diff --git a/pkg/services/ldap/api/service_test.go b/pkg/services/ldap/api/service_test.go index 95fd54a0234..0e8ddc3c3dc 100644 --- a/pkg/services/ldap/api/service_test.go +++ b/pkg/services/ldap/api/service_test.go @@ -1,6 +1,7 @@ package api import ( + "context" "encoding/json" "errors" "io" @@ -663,5 +664,5 @@ search_base_dns = ["dc=grafana,dc=org"]`) } func userWithPermissions(orgID int64, permissions []accesscontrol.Permission) *user.SignedInUser { - return &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction(permissions)}} + return &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByActionContext(context.Background(), permissions)}} } diff --git a/pkg/services/navtree/models.go b/pkg/services/navtree/models.go index b3c22e7fdb5..59bd2fff3f4 100644 --- a/pkg/services/navtree/models.go +++ b/pkg/services/navtree/models.go @@ -140,6 +140,7 @@ func (root *NavTreeRoot) ApplyCostManagementIA() { orgAdminNode := root.FindById(NavIDCfg) var costManagementApp *NavLink var adaptiveMetricsApp *NavLink + var adaptiveLogsApp *NavLink var attributionsApp *NavLink var logVolumeExplorerApp *NavLink @@ -151,6 +152,8 @@ func (root *NavTreeRoot) ApplyCostManagementIA() { costManagementApp = element case "plugin-page-grafana-adaptive-metrics-app": adaptiveMetricsApp = element + case "plugin-page-grafana-adaptivelogs-app": + adaptiveLogsApp = element case "plugin-page-grafana-attributions-app": attributionsApp = element case "plugin-page-grafana-logvolumeexplorer-app": @@ -173,6 +176,9 @@ func (root *NavTreeRoot) ApplyCostManagementIA() { costManagementLogsNode := FindByURL(costManagementApp.Children, "/a/grafana-costmanagementui-app/logs") if costManagementLogsNode != nil { + if adaptiveLogsApp != nil { + costManagementLogsNode.Children = append(costManagementLogsNode.Children, adaptiveLogsApp) + } if logVolumeExplorerApp != nil { costManagementLogsNode.Children = append(costManagementLogsNode.Children, logVolumeExplorerApp) } diff --git a/pkg/services/navtree/navtreeimpl/applinks.go b/pkg/services/navtree/navtreeimpl/applinks.go index 8d146d61ef5..393af522b1c 100644 --- a/pkg/services/navtree/navtreeimpl/applinks.go +++ b/pkg/services/navtree/navtreeimpl/applinks.go @@ -298,6 +298,7 @@ func (s *ServiceImpl) readNavigationSettings() { "grafana-cloud-link-app": {SectionID: navtree.NavIDCfgPlugins, SortWeight: 3}, "grafana-costmanagementui-app": {SectionID: navtree.NavIDCfg, Text: "Cost management"}, "grafana-adaptive-metrics-app": {SectionID: navtree.NavIDCfg, Text: "Adaptive Metrics"}, + "grafana-adaptivelogs-app": {SectionID: navtree.NavIDCfg, Text: "Adaptive Logs"}, "grafana-attributions-app": {SectionID: navtree.NavIDCfg, Text: "Attributions"}, "grafana-logvolumeexplorer-app": {SectionID: navtree.NavIDCfg, Text: "Log Volume Explorer"}, "grafana-easystart-app": {SectionID: navtree.NavIDRoot, SortWeight: navtree.WeightApps + 1, Text: "Connections", Icon: "adjust-circle"}, diff --git a/pkg/services/ngalert/state/cache.go b/pkg/services/ngalert/state/cache.go index 25e8a083b67..d6fca25632c 100644 --- a/pkg/services/ngalert/state/cache.go +++ b/pkg/services/ngalert/state/cache.go @@ -183,7 +183,7 @@ func calculateState(ctx context.Context, log log.Logger, alertRule *ngModels.Ale } } if len(dupes) > 0 { - log.Warn("Rule declares one or many reserved labels. Those rules labels will be ignored", "labels", dupes) + log.Debug("Rule declares one or many reserved labels. Those rules labels will be ignored", "labels", dupes) } dupes = make(data.Labels) for key, val := range resultLabels { @@ -196,7 +196,7 @@ func calculateState(ctx context.Context, log log.Logger, alertRule *ngModels.Ale } } if len(dupes) > 0 { - log.Warn("Evaluation result contains either reserved labels or labels declared in the rules. Those labels from the result will be ignored", "labels", dupes) + log.Debug("Evaluation result contains either reserved labels or labels declared in the rules. Those labels from the result will be ignored", "labels", dupes) } cacheID := lbs.Fingerprint() diff --git a/pkg/services/preference/model.go b/pkg/services/preference/model.go index 576ead990d5..674f5895472 100644 --- a/pkg/services/preference/model.go +++ b/pkg/services/preference/model.go @@ -67,6 +67,7 @@ type SavePreferenceCommand struct { Language string `json:"language,omitempty"` QueryHistory *QueryHistoryPreference `json:"queryHistory,omitempty"` CookiePreferences []CookieType `json:"cookiePreferences,omitempty"` + Navbar *NavbarPreference `json:"navbar,omitempty"` } type PatchPreferenceCommand struct { @@ -82,18 +83,24 @@ type PatchPreferenceCommand struct { Language *string `json:"language,omitempty"` QueryHistory *QueryHistoryPreference `json:"queryHistory,omitempty"` CookiePreferences []CookieType `json:"cookiePreferences,omitempty"` + Navbar *NavbarPreference `json:"navbar,omitempty"` } type PreferenceJSONData struct { Language string `json:"language"` QueryHistory QueryHistoryPreference `json:"queryHistory"` CookiePreferences map[string]struct{} `json:"cookiePreferences"` + Navbar NavbarPreference `json:"navbar"` } type QueryHistoryPreference struct { HomeTab string `json:"homeTab"` } +type NavbarPreference struct { + SavedItemIds []string `json:"savedItemIds"` +} + func (j *PreferenceJSONData) FromDB(data []byte) error { dec := json.NewDecoder(bytes.NewBuffer(data)) dec.UseNumber() diff --git a/pkg/services/preference/prefapi/api.go b/pkg/services/preference/prefapi/api.go index a77639571eb..51d2718f419 100644 --- a/pkg/services/preference/prefapi/api.go +++ b/pkg/services/preference/prefapi/api.go @@ -46,6 +46,7 @@ func UpdatePreferencesFor(ctx context.Context, HomeDashboardID: dtoCmd.HomeDashboardID, QueryHistory: dtoCmd.QueryHistory, CookiePreferences: dtoCmd.Cookies, + Navbar: dtoCmd.Navbar, } if err := preferenceService.Save(ctx, &saveCmd); err != nil { @@ -96,6 +97,13 @@ func GetPreferencesFor(ctx context.Context, dto.Language = &preference.JSONData.Language } + if preference.JSONData.Navbar.SavedItemIds != nil { + dto.Navbar = &preferences.NavbarPreference{ + SavedItemIds: []string{}, + } + dto.Navbar.SavedItemIds = preference.JSONData.Navbar.SavedItemIds + } + if preference.JSONData.QueryHistory.HomeTab != "" { dto.QueryHistory = &preferences.QueryHistoryPreference{ HomeTab: &preference.JSONData.QueryHistory.HomeTab, diff --git a/pkg/services/preference/prefimpl/pref.go b/pkg/services/preference/prefimpl/pref.go index cf3bc80a9dc..0de2069efed 100644 --- a/pkg/services/preference/prefimpl/pref.go +++ b/pkg/services/preference/prefimpl/pref.go @@ -71,6 +71,10 @@ func (s *Service) GetWithDefaults(ctx context.Context, query *pref.GetPreference res.JSONData.QueryHistory.HomeTab = p.JSONData.QueryHistory.HomeTab } + if p.JSONData.Navbar.SavedItemIds != nil { + res.JSONData.Navbar.SavedItemIds = p.JSONData.Navbar.SavedItemIds + } + if p.JSONData.CookiePreferences != nil { res.JSONData.CookiePreferences = p.JSONData.CookiePreferences } @@ -170,6 +174,13 @@ func (s *Service) Patch(ctx context.Context, cmd *pref.PatchPreferenceCommand) e preference.JSONData.Language = *cmd.Language } + if cmd.Navbar != nil && cmd.Navbar.SavedItemIds != nil { + if preference.JSONData == nil { + preference.JSONData = &pref.PreferenceJSONData{} + } + preference.JSONData.Navbar.SavedItemIds = cmd.Navbar.SavedItemIds + } + if cmd.QueryHistory != nil { if preference.JSONData == nil { preference.JSONData = &pref.PreferenceJSONData{} @@ -257,6 +268,9 @@ func preferenceData(cmd *pref.SavePreferenceCommand) (*pref.PreferenceJSONData, Language: cmd.Language, } + if cmd.Navbar != nil { + jsonData.Navbar = *cmd.Navbar + } if cmd.QueryHistory != nil { jsonData.QueryHistory = *cmd.QueryHistory } diff --git a/pkg/services/publicdashboards/database/database_test.go b/pkg/services/publicdashboards/database/database_test.go index fd8273cc198..d2e506063b1 100644 --- a/pkg/services/publicdashboards/database/database_test.go +++ b/pkg/services/publicdashboards/database/database_test.go @@ -91,7 +91,7 @@ func TestIntegrationListPublicDashboard(t *testing.T) { {Action: dashboards.ActionDashboardsRead, Scope: fmt.Sprintf("dashboards:uid:%s", cDash.UID)}, } - usr := &user.SignedInUser{UserID: 1, OrgID: orgId, Permissions: map[int64]map[string][]string{orgId: accesscontrol.GroupScopesByAction(permissions)}} + usr := &user.SignedInUser{UserID: 1, OrgID: orgId, Permissions: map[int64]map[string][]string{orgId: accesscontrol.GroupScopesByActionContext(context.Background(), permissions)}} actest.AddUserPermissionToDB(t, sqlStore, usr) @@ -120,7 +120,7 @@ func TestIntegrationListPublicDashboard(t *testing.T) { {Action: dashboards.ActionDashboardsRead, Scope: fmt.Sprintf("dashboards:uid:%s", cDash.UID)}, } - usr := &user.SignedInUser{UserID: 1, OrgID: orgId, Permissions: map[int64]map[string][]string{orgId: accesscontrol.GroupScopesByAction(permissions)}} + usr := &user.SignedInUser{UserID: 1, OrgID: orgId, Permissions: map[int64]map[string][]string{orgId: accesscontrol.GroupScopesByActionContext(context.Background(), permissions)}} actest.AddUserPermissionToDB(t, sqlStore, usr) @@ -148,7 +148,7 @@ func TestIntegrationListPublicDashboard(t *testing.T) { {Action: dashboards.ActionDashboardsRead, Scope: "dashboards:uid:another-dashboard-2-uid"}, } - usr := &user.SignedInUser{UserID: 1, OrgID: orgId, Permissions: map[int64]map[string][]string{orgId: accesscontrol.GroupScopesByAction(permissions)}} + usr := &user.SignedInUser{UserID: 1, OrgID: orgId, Permissions: map[int64]map[string][]string{orgId: accesscontrol.GroupScopesByActionContext(context.Background(), permissions)}} actest.AddUserPermissionToDB(t, sqlStore, usr) diff --git a/pkg/services/searchV2/service.go b/pkg/services/searchV2/service.go index 0b2c0e63867..b0ca3096dfc 100644 --- a/pkg/services/searchV2/service.go +++ b/pkg/services/searchV2/service.go @@ -199,7 +199,7 @@ func (s *StandardSearchService) getUser(ctx context.Context, backendUser *backen return nil, errors.New("auth error") } - usr.Permissions[orgId] = accesscontrol.GroupScopesByAction(permissions) + usr.Permissions[orgId] = accesscontrol.GroupScopesByActionContext(ctx, permissions) return usr, nil } diff --git a/pkg/services/serviceaccounts/api/api_test.go b/pkg/services/serviceaccounts/api/api_test.go index 531270e8c6a..144869b390a 100644 --- a/pkg/services/serviceaccounts/api/api_test.go +++ b/pkg/services/serviceaccounts/api/api_test.go @@ -1,6 +1,7 @@ package api import ( + "context" "encoding/json" "fmt" "net/http" @@ -87,7 +88,7 @@ func TestServiceAccountsAPI_CreateServiceAccount(t *testing.T) { req := server.NewRequest(http.MethodPost, "/api/serviceaccounts/", strings.NewReader(tt.body)) webtest.RequestWithSignedInUser(req, &user.SignedInUser{ OrgRole: tt.basicRole, OrgID: 1, IsAnonymous: true, - Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}) + Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}) res, err := server.SendJSON(req) require.NoError(t, err) @@ -124,7 +125,7 @@ func TestServiceAccountsAPI_DeleteServiceAccount(t *testing.T) { t.Run(tt.desc, func(t *testing.T) { server := setupTests(t) req := server.NewRequest(http.MethodDelete, fmt.Sprintf("/api/serviceaccounts/%d", tt.id), nil) - webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}) + webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}) res, err := server.Send(req) require.NoError(t, err) @@ -165,7 +166,7 @@ func TestServiceAccountsAPI_RetrieveServiceAccount(t *testing.T) { a.service = &satests.FakeServiceAccountService{ExpectedServiceAccountProfile: tt.expectedSA} }) req := server.NewGetRequest(fmt.Sprintf("/api/serviceaccounts/%d", tt.id)) - webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}) + webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}) res, err := server.Send(req) require.NoError(t, err) assert.Equal(t, tt.expectedCode, res.StatusCode) @@ -228,7 +229,7 @@ func TestServiceAccountsAPI_UpdateServiceAccount(t *testing.T) { }) req := server.NewRequest(http.MethodPatch, fmt.Sprintf("/api/serviceaccounts/%d", tt.id), strings.NewReader(tt.body)) - webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgRole: tt.basicRole, OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}) + webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgRole: tt.basicRole, OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}) res, err := server.SendJSON(req) require.NoError(t, err) @@ -282,7 +283,7 @@ func TestServiceAccountsAPI_MigrateApiKeysToServiceAccounts(t *testing.T) { }) req := server.NewRequest(http.MethodPost, "/api/serviceaccounts/migrate", nil) - webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgRole: tt.basicRole, OrgID: tt.orgId, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}) + webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgRole: tt.basicRole, OrgID: tt.orgId, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}) res, err := server.SendJSON(req) require.NoError(t, err) diff --git a/pkg/services/serviceaccounts/api/token_test.go b/pkg/services/serviceaccounts/api/token_test.go index 5c672c16d86..087d786b723 100644 --- a/pkg/services/serviceaccounts/api/token_test.go +++ b/pkg/services/serviceaccounts/api/token_test.go @@ -1,6 +1,7 @@ package api import ( + "context" "fmt" "net/http" "strings" @@ -47,7 +48,7 @@ func TestServiceAccountsAPI_ListTokens(t *testing.T) { a.service = &satests.FakeServiceAccountService{} }) req := server.NewGetRequest(fmt.Sprintf("/api/serviceaccounts/%d/tokens", tt.id)) - webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}) + webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}) res, err := server.Send(req) require.NoError(t, err) @@ -116,7 +117,7 @@ func TestServiceAccountsAPI_CreateToken(t *testing.T) { } }) req := server.NewRequest(http.MethodPost, fmt.Sprintf("/api/serviceaccounts/%d/tokens", tt.id), strings.NewReader(tt.body)) - webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}) + webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}) res, err := server.SendJSON(req) require.NoError(t, err) @@ -168,7 +169,7 @@ func TestServiceAccountsAPI_DeleteToken(t *testing.T) { }) req := server.NewRequest(http.MethodDelete, fmt.Sprintf("/api/serviceaccounts/%d/tokens/%d", tt.saID, tt.apikeyID), nil) - webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}}) + webtest.RequestWithSignedInUser(req, &user.SignedInUser{OrgID: 1, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}}) res, err := server.SendJSON(req) require.NoError(t, err) diff --git a/pkg/services/sqlstore/permissions/dashboard_test.go b/pkg/services/sqlstore/permissions/dashboard_test.go index 640254d5def..caf74dbcad9 100644 --- a/pkg/services/sqlstore/permissions/dashboard_test.go +++ b/pkg/services/sqlstore/permissions/dashboard_test.go @@ -173,7 +173,7 @@ func TestIntegration_DashboardPermissionFilter(t *testing.T) { recursiveQueriesAreSupported, err := store.RecursiveQueriesAreSupported() require.NoError(t, err) - usr := &user.SignedInUser{OrgID: 1, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.permissions)}} + usr := &user.SignedInUser{OrgID: 1, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.permissions)}} for _, features := range []featuremgmt.FeatureToggles{featuremgmt.WithFeatures(), featuremgmt.WithFeatures(featuremgmt.FlagPermissionsFilterRemoveSubquery)} { m := features.GetEnabled(context.Background()) @@ -345,7 +345,7 @@ func TestIntegration_DashboardPermissionFilter_WithSelfContainedPermissions(t *t recursiveQueriesAreSupported, err := store.RecursiveQueriesAreSupported() require.NoError(t, err) - usr := &user.SignedInUser{OrgID: 1, OrgRole: org.RoleViewer, AuthenticatedBy: login.ExtendedJWTModule, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tt.signedInUserPermissions)}} + usr := &user.SignedInUser{OrgID: 1, OrgRole: org.RoleViewer, AuthenticatedBy: login.ExtendedJWTModule, Permissions: map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tt.signedInUserPermissions)}} for _, features := range []featuremgmt.FeatureToggles{featuremgmt.WithFeatures(), featuremgmt.WithFeatures(featuremgmt.FlagPermissionsFilterRemoveSubquery)} { m := features.GetEnabled(context.Background()) @@ -456,7 +456,7 @@ func TestIntegration_DashboardNestedPermissionFilter(t *testing.T) { Action: dashboards.ActionFoldersWrite, Scope: dashboards.ScopeFoldersAll, }) - usr := &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction(tc.permissions)}} + usr := &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByActionContext(context.Background(), tc.permissions)}} for _, features := range []featuremgmt.FeatureToggles{featuremgmt.WithFeatures(append(tc.features, featuremgmt.FlagAccessActionSets)...), featuremgmt.WithFeatures(tc.features...), featuremgmt.WithFeatures(append(tc.features, featuremgmt.FlagPermissionsFilterRemoveSubquery)...)} { m := features.GetEnabled(context.Background()) @@ -564,7 +564,7 @@ func TestIntegration_DashboardNestedPermissionFilter_WithSelfContainedPermission for _, tc := range testCases { helperUser := &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, AuthenticatedBy: login.ExtendedJWTModule, - Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction([]accesscontrol.Permission{ + Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByActionContext(context.Background(), []accesscontrol.Permission{ { Action: dashboards.ActionFoldersCreate, }, @@ -583,7 +583,7 @@ func TestIntegration_DashboardNestedPermissionFilter_WithSelfContainedPermission } t.Run(tc.desc+" with features "+strings.Join(keys, ","), func(t *testing.T) { - usr := &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, AuthenticatedBy: login.ExtendedJWTModule, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction(tc.signedInUserPermissions)}} + usr := &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, AuthenticatedBy: login.ExtendedJWTModule, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByActionContext(context.Background(), tc.signedInUserPermissions)}} db := setupNestedTest(t, helperUser, []accesscontrol.Permission{}, orgID, features) recursiveQueriesAreSupported, err := db.RecursiveQueriesAreSupported() require.NoError(t, err) @@ -693,7 +693,7 @@ func TestIntegration_DashboardNestedPermissionFilter_WithActionSets(t *testing.T Scope: "folders:uid:unrelated"}, accesscontrol.Permission{ Action: dashboards.ActionDashboardsCreate, Scope: "folders:uid:unrelated"}) - usr := &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction(tc.signedInUserPermissions)}} + usr := &user.SignedInUser{OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByActionContext(context.Background(), tc.signedInUserPermissions)}} for _, features := range []featuremgmt.FeatureToggles{featuremgmt.WithFeatures(tc.features...), featuremgmt.WithFeatures(append(tc.features, featuremgmt.FlagPermissionsFilterRemoveSubquery)...)} { m := features.GetEnabled(context.Background()) diff --git a/pkg/services/sqlstore/permissions/dashboards_bench_test.go b/pkg/services/sqlstore/permissions/dashboards_bench_test.go index d84639b6274..ac6bbddeaa4 100644 --- a/pkg/services/sqlstore/permissions/dashboards_bench_test.go +++ b/pkg/services/sqlstore/permissions/dashboards_bench_test.go @@ -34,7 +34,7 @@ import ( func benchmarkDashboardPermissionFilter(b *testing.B, numUsers, numDashboards, numFolders, nestingLevel int) { usr := user.SignedInUser{UserID: 1, OrgID: 1, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{ - 1: accesscontrol.GroupScopesByAction([]accesscontrol.Permission{ + 1: accesscontrol.GroupScopesByActionContext(context.Background(), []accesscontrol.Permission{ { Action: dashboards.ActionFoldersCreate, }, diff --git a/pkg/services/sqlstore/searchstore/search_test.go b/pkg/services/sqlstore/searchstore/search_test.go index 39732fdadbf..33dcc0f3402 100644 --- a/pkg/services/sqlstore/searchstore/search_test.go +++ b/pkg/services/sqlstore/searchstore/search_test.go @@ -320,7 +320,7 @@ func TestBuilder_RBAC(t *testing.T) { for _, tc := range testsCases { t.Run(tc.desc, func(t *testing.T) { if len(tc.userPermissions) > 0 { - user.Permissions = map[int64]map[string][]string{1: accesscontrol.GroupScopesByAction(tc.userPermissions)} + user.Permissions = map[int64]map[string][]string{1: accesscontrol.GroupScopesByActionContext(context.Background(), tc.userPermissions)} } builder := &searchstore.Builder{ diff --git a/pkg/services/sqlstore/user.go b/pkg/services/sqlstore/user.go index 00861d9bc39..991643b73ae 100644 --- a/pkg/services/sqlstore/user.go +++ b/pkg/services/sqlstore/user.go @@ -64,6 +64,7 @@ func (ss *SQLStore) createUser(ctx context.Context, sess *DBSession, args user.C // create user usr = user.User{ + UID: util.GenerateShortUID(), Email: args.Email, Login: args.Login, IsAdmin: args.IsAdmin, diff --git a/pkg/services/ssosettings/api/api_test.go b/pkg/services/ssosettings/api/api_test.go index 2eb202ea3ac..9084d4d3155 100644 --- a/pkg/services/ssosettings/api/api_test.go +++ b/pkg/services/ssosettings/api/api_test.go @@ -2,6 +2,7 @@ package api import ( "bytes" + "context" "encoding/json" "errors" "fmt" @@ -550,7 +551,7 @@ func TestSSOSettingsAPI_List(t *testing.T) { func getPermissionsForActionAndScope(action, scope string) map[int64]map[string][]string { return map[int64]map[string][]string{ - 1: accesscontrol.GroupScopesByAction([]accesscontrol.Permission{{ + 1: accesscontrol.GroupScopesByActionContext(context.Background(), []accesscontrol.Permission{{ Action: action, Scope: scope, }}), } diff --git a/pkg/services/store/entity/entity.pb.go b/pkg/services/store/entity/entity.pb.go index 97cb0a6d8da..fa46488db0e 100644 --- a/pkg/services/store/entity/entity.pb.go +++ b/pkg/services/store/entity/entity.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.33.0 +// protoc-gen-go v1.34.1 // protoc (unknown) // source: entity.proto @@ -1401,7 +1401,7 @@ type EntityListRequest struct { WithStatus bool `protobuf:"varint,10,opt,name=with_status,json=withStatus,proto3" json:"with_status,omitempty"` // list deleted entities instead of active ones Deleted bool `protobuf:"varint,12,opt,name=deleted,proto3" json:"deleted,omitempty"` - // Limit to a set of origin keys (empty is all) + // Deprecated: Limit to a set of origin keys (empty is all) OriginKeys []string `protobuf:"bytes,13,rep,name=origin_keys,json=originKeys,proto3" json:"origin_keys,omitempty"` } diff --git a/pkg/services/store/entity/entity_grpc.pb.go b/pkg/services/store/entity/entity_grpc.pb.go index fd670d1106a..9d8bed0ed0b 100644 --- a/pkg/services/store/entity/entity_grpc.pb.go +++ b/pkg/services/store/entity/entity_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.3.0 +// - protoc-gen-go-grpc v1.4.0 // - protoc (unknown) // source: entity.proto @@ -15,8 +15,8 @@ import ( // This is a compile-time assertion to ensure that this generated file // is compatible with the grpc package it is being compiled against. -// Requires gRPC-Go v1.32.0 or later. -const _ = grpc.SupportPackageIsVersion7 +// Requires gRPC-Go v1.62.0 or later. +const _ = grpc.SupportPackageIsVersion8 const ( EntityStore_Read_FullMethodName = "/entity.EntityStore/Read" @@ -32,6 +32,8 @@ const ( // EntityStoreClient is the client API for EntityStore service. // // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. +// +// The entity store provides a basic CRUD (+watch eventually) interface for generic entities type EntityStoreClient interface { Read(ctx context.Context, in *ReadEntityRequest, opts ...grpc.CallOption) (*Entity, error) Create(ctx context.Context, in *CreateEntityRequest, opts ...grpc.CallOption) (*CreateEntityResponse, error) @@ -52,8 +54,9 @@ func NewEntityStoreClient(cc grpc.ClientConnInterface) EntityStoreClient { } func (c *entityStoreClient) Read(ctx context.Context, in *ReadEntityRequest, opts ...grpc.CallOption) (*Entity, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(Entity) - err := c.cc.Invoke(ctx, EntityStore_Read_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, EntityStore_Read_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -61,8 +64,9 @@ func (c *entityStoreClient) Read(ctx context.Context, in *ReadEntityRequest, opt } func (c *entityStoreClient) Create(ctx context.Context, in *CreateEntityRequest, opts ...grpc.CallOption) (*CreateEntityResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(CreateEntityResponse) - err := c.cc.Invoke(ctx, EntityStore_Create_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, EntityStore_Create_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -70,8 +74,9 @@ func (c *entityStoreClient) Create(ctx context.Context, in *CreateEntityRequest, } func (c *entityStoreClient) Update(ctx context.Context, in *UpdateEntityRequest, opts ...grpc.CallOption) (*UpdateEntityResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(UpdateEntityResponse) - err := c.cc.Invoke(ctx, EntityStore_Update_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, EntityStore_Update_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -79,8 +84,9 @@ func (c *entityStoreClient) Update(ctx context.Context, in *UpdateEntityRequest, } func (c *entityStoreClient) Delete(ctx context.Context, in *DeleteEntityRequest, opts ...grpc.CallOption) (*DeleteEntityResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(DeleteEntityResponse) - err := c.cc.Invoke(ctx, EntityStore_Delete_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, EntityStore_Delete_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -88,8 +94,9 @@ func (c *entityStoreClient) Delete(ctx context.Context, in *DeleteEntityRequest, } func (c *entityStoreClient) History(ctx context.Context, in *EntityHistoryRequest, opts ...grpc.CallOption) (*EntityHistoryResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(EntityHistoryResponse) - err := c.cc.Invoke(ctx, EntityStore_History_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, EntityStore_History_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -97,8 +104,9 @@ func (c *entityStoreClient) History(ctx context.Context, in *EntityHistoryReques } func (c *entityStoreClient) List(ctx context.Context, in *EntityListRequest, opts ...grpc.CallOption) (*EntityListResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(EntityListResponse) - err := c.cc.Invoke(ctx, EntityStore_List_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, EntityStore_List_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -106,11 +114,12 @@ func (c *entityStoreClient) List(ctx context.Context, in *EntityListRequest, opt } func (c *entityStoreClient) Watch(ctx context.Context, opts ...grpc.CallOption) (EntityStore_WatchClient, error) { - stream, err := c.cc.NewStream(ctx, &EntityStore_ServiceDesc.Streams[0], EntityStore_Watch_FullMethodName, opts...) + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + stream, err := c.cc.NewStream(ctx, &EntityStore_ServiceDesc.Streams[0], EntityStore_Watch_FullMethodName, cOpts...) if err != nil { return nil, err } - x := &entityStoreWatchClient{stream} + x := &entityStoreWatchClient{ClientStream: stream} return x, nil } @@ -137,8 +146,9 @@ func (x *entityStoreWatchClient) Recv() (*EntityWatchResponse, error) { } func (c *entityStoreClient) IsHealthy(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(HealthCheckResponse) - err := c.cc.Invoke(ctx, EntityStore_IsHealthy_FullMethodName, in, out, opts...) + err := c.cc.Invoke(ctx, EntityStore_IsHealthy_FullMethodName, in, out, cOpts...) if err != nil { return nil, err } @@ -148,6 +158,8 @@ func (c *entityStoreClient) IsHealthy(ctx context.Context, in *HealthCheckReques // EntityStoreServer is the server API for EntityStore service. // All implementations should embed UnimplementedEntityStoreServer // for forward compatibility +// +// The entity store provides a basic CRUD (+watch eventually) interface for generic entities type EntityStoreServer interface { Read(context.Context, *ReadEntityRequest) (*Entity, error) Create(context.Context, *CreateEntityRequest) (*CreateEntityResponse, error) @@ -308,7 +320,7 @@ func _EntityStore_List_Handler(srv interface{}, ctx context.Context, dec func(in } func _EntityStore_Watch_Handler(srv interface{}, stream grpc.ServerStream) error { - return srv.(EntityStoreServer).Watch(&entityStoreWatchServer{stream}) + return srv.(EntityStoreServer).Watch(&entityStoreWatchServer{ServerStream: stream}) } type EntityStore_WatchServer interface { diff --git a/pkg/services/store/entity/sqlstash/sql_storage_server.go b/pkg/services/store/entity/sqlstash/sql_storage_server.go index b5b89530d72..723bf34c52d 100644 --- a/pkg/services/store/entity/sqlstash/sql_storage_server.go +++ b/pkg/services/store/entity/sqlstash/sql_storage_server.go @@ -655,6 +655,7 @@ func (s *sqlEntityServer) List(ctx context.Context, r *entity.EntityListRequest) rvSubQuery.AddWhere("("+strings.Join(where, " OR ")+")", args...) } + // nolint:staticcheck if len(r.OriginKeys) > 0 { entityQuery.AddWhereIn("origin_key", ToAnyList(r.OriginKeys)) rvMaxQuery.AddWhereIn("origin_key", ToAnyList(r.OriginKeys)) diff --git a/pkg/services/store/entity/sqlstash/testdata/grpc-req-create.json b/pkg/services/store/entity/sqlstash/testdata/grpc-req-create.json index 27a8fd2ca07..ae7c2a0125b 100644 --- a/pkg/services/store/entity/sqlstash/testdata/grpc-req-create.json +++ b/pkg/services/store/entity/sqlstash/testdata/grpc-req-create.json @@ -6,7 +6,7 @@ "namespace": "default", "name": "adnj1llchbbi8a", "group_version": "v0alpha1", - "key": "/playlist.grafana.app/playlists/namespaces/default/adnj1llchbbi8a", + "key": "/group/playlist.grafana.app/resource/playlists/namespaces/default/name/adnj1llchbbi8a", "meta": "eyJtZXRhZGF0YSI6eyJuYW1lIjoiYWRuajFsbGNoYmJpOGEiLCJuYW1lc3BhY2UiOiJkZWZhdWx0IiwidWlkIjoiYjAxOTljNjAtNWYzYS00MWJlLTliYTYtN2E1MmYxZGU4M2ZmIiwiY3JlYXRpb25UaW1lc3RhbXAiOiIyMDI0LTA2LTAyVDAzOjI4OjE3WiIsImFubm90YXRpb25zIjp7ImdyYWZhbmEuYXBwL29yaWdpbktleSI6IjIiLCJncmFmYW5hLmFwcC9vcmlnaW5OYW1lIjoiU1FMIiwiZ3JhZmFuYS5hcHAvb3JpZ2luVGltZXN0YW1wIjoiMjAyNC0wNi0wMlQwMzoyODoxN1oiLCJncmFmYW5hLmFwcC91cGRhdGVkVGltZXN0YW1wIjoiMjAyNC0wNi0wMlQwMzoyODoxN1oifX19", "body": "eyJraW5kIjoiUGxheWxpc3QiLCJhcGlWZXJzaW9uIjoicGxheWxpc3QuZ3JhZmFuYS5hcHAvdjBhbHBoYTEiLCJtZXRhZGF0YSI6eyJuYW1lIjoiYWRuajFsbGNoYmJpOGEiLCJuYW1lc3BhY2UiOiJkZWZhdWx0IiwidWlkIjoiYjAxOTljNjAtNWYzYS00MWJlLTliYTYtN2E1MmYxZGU4M2ZmIiwiY3JlYXRpb25UaW1lc3RhbXAiOiIyMDI0LTA2LTAyVDAzOjI4OjE3WiIsImFubm90YXRpb25zIjp7ImdyYWZhbmEuYXBwL29yaWdpbktleSI6IjIiLCJncmFmYW5hLmFwcC9vcmlnaW5OYW1lIjoiU1FMIiwiZ3JhZmFuYS5hcHAvb3JpZ2luVGltZXN0YW1wIjoiMjAyNC0wNi0wMlQwMzoyODoxN1oiLCJncmFmYW5hLmFwcC91cGRhdGVkVGltZXN0YW1wIjoiMjAyNC0wNi0wMlQwMzoyODoxN1oifX0sInNwZWMiOnsidGl0bGUiOiJ0ZXN0IHBsYXlsaXN0IiwiaW50ZXJ2YWwiOiI1bSIsIml0ZW1zIjpbeyJ0eXBlIjoiZGFzaGJvYXJkX2J5X3VpZCIsInZhbHVlIjoiY2RuaXY1M2dtZDR3MGUifV19fQo=", "title": "test playlist", diff --git a/pkg/services/store/entity/sqlstash/testdata/grpc-req-delete.json b/pkg/services/store/entity/sqlstash/testdata/grpc-req-delete.json index 4802693b534..a3a593b17d3 100644 --- a/pkg/services/store/entity/sqlstash/testdata/grpc-req-delete.json +++ b/pkg/services/store/entity/sqlstash/testdata/grpc-req-delete.json @@ -1,3 +1,3 @@ { - "key": "/playlist.grafana.app/playlists/namespaces/default/sdfsdfsdf" + "key": "/group/playlist.grafana.app/resource/playlists/namespaces/default/name/sdfsdfsdf" } diff --git a/pkg/services/store/entity/sqlstash/testdata/grpc-req-update.json b/pkg/services/store/entity/sqlstash/testdata/grpc-req-update.json index a94dabcb233..5b93ee07546 100644 --- a/pkg/services/store/entity/sqlstash/testdata/grpc-req-update.json +++ b/pkg/services/store/entity/sqlstash/testdata/grpc-req-update.json @@ -7,7 +7,7 @@ "namespace": "default", "name": "sdfsdfsdf", "group_version": "v0alpha1", - "key": "/playlist.grafana.app/playlists/namespaces/default/sdfsdfsdf", + "key": "/group/playlist.grafana.app/resource/playlists/namespaces/default/name/sdfsdfsdf", "meta": "eyJtZXRhZGF0YSI6eyJuYW1lIjoic2Rmc2Rmc2RmIiwibmFtZXNwYWNlIjoiZGVmYXVsdCIsInVpZCI6IjNjNzY5YjJlLWFhYTctNDZmNi1hYjgzLWUwMzgwNTBhNmE3NSIsInJlc291cmNlVmVyc2lvbiI6IjEiLCJjcmVhdGlvblRpbWVzdGFtcCI6IjIwMjQtMDYtMDJUMDM6NDk6MjlaIiwibWFuYWdlZEZpZWxkcyI6W3sibWFuYWdlciI6Ik1vemlsbGEiLCJvcGVyYXRpb24iOiJVcGRhdGUiLCJhcGlWZXJzaW9uIjoicGxheWxpc3QuZ3JhZmFuYS5hcHAvdjBhbHBoYTEiLCJ0aW1lIjoiMjAyNC0wNi0wMlQwMzo1Mzo1NVoiLCJmaWVsZHNUeXBlIjoiRmllbGRzVjEiLCJmaWVsZHNWMSI6eyJmOnNwZWMiOnsiZjppbnRlcnZhbCI6e30sImY6aXRlbXMiOnt9LCJmOnRpdGxlIjp7fX19fV19fQ==", "body": "eyJraW5kIjoiUGxheWxpc3QiLCJhcGlWZXJzaW9uIjoicGxheWxpc3QuZ3JhZmFuYS5hcHAvdjBhbHBoYTEiLCJtZXRhZGF0YSI6eyJuYW1lIjoic2Rmc2Rmc2RmIiwibmFtZXNwYWNlIjoiZGVmYXVsdCIsInVpZCI6IjNjNzY5YjJlLWFhYTctNDZmNi1hYjgzLWUwMzgwNTBhNmE3NSIsInJlc291cmNlVmVyc2lvbiI6IjEiLCJjcmVhdGlvblRpbWVzdGFtcCI6IjIwMjQtMDYtMDJUMDM6NDk6MjlaIiwibWFuYWdlZEZpZWxkcyI6W3sibWFuYWdlciI6Ik1vemlsbGEiLCJvcGVyYXRpb24iOiJVcGRhdGUiLCJhcGlWZXJzaW9uIjoicGxheWxpc3QuZ3JhZmFuYS5hcHAvdjBhbHBoYTEiLCJ0aW1lIjoiMjAyNC0wNi0wMlQwMzo1Mzo1NVoiLCJmaWVsZHNUeXBlIjoiRmllbGRzVjEiLCJmaWVsZHNWMSI6eyJmOnNwZWMiOnsiZjppbnRlcnZhbCI6e30sImY6aXRlbXMiOnt9LCJmOnRpdGxlIjp7fX19fV19LCJzcGVjIjp7InRpdGxlIjoieHpjdnp4Y3Zxd2Vxd2UiLCJpbnRlcnZhbCI6IjVtIiwiaXRlbXMiOlt7InR5cGUiOiJkYXNoYm9hcmRfYnlfdWlkIiwidmFsdWUiOiJjZG5pdjUzZ21kNHcwZSJ9XX19Cg==", "title": "xzcvzxcvqweqwe", diff --git a/pkg/services/store/entity/sqlstash/testdata/grpc-res-entity.json b/pkg/services/store/entity/sqlstash/testdata/grpc-res-entity.json index b0bf49ededf..438e1292259 100644 --- a/pkg/services/store/entity/sqlstash/testdata/grpc-res-entity.json +++ b/pkg/services/store/entity/sqlstash/testdata/grpc-res-entity.json @@ -6,7 +6,7 @@ "namespace": "default", "name": "sdfsdfsdf", "group_version": "v0alpha1", - "key": "/playlist.grafana.app/playlists/namespaces/default/sdfsdfsdf", + "key": "/group/playlist.grafana.app/resource/playlists/namespace/default/name/sdfsdfsdf", "meta": "eyJtZXRhZGF0YSI6eyJuYW1lIjoic2Rmc2Rmc2RmIiwibmFtZXNwYWNlIjoiZGVmYXVsdCIsInVpZCI6IjAyZmVhOGVlLTk2ZDYtNGIzMy04ZGI5LTU5MmI0NzU4NTM4NSIsImNyZWF0aW9uVGltZXN0YW1wIjoiMjAyNC0wNi0wNFQxNToxODozNFoiLCJtYW5hZ2VkRmllbGRzIjpbeyJtYW5hZ2VyIjoiTW96aWxsYSIsIm9wZXJhdGlvbiI6IlVwZGF0ZSIsImFwaVZlcnNpb24iOiJwbGF5bGlzdC5ncmFmYW5hLmFwcC92MGFscGhhMSIsInRpbWUiOiIyMDI0LTA2LTA0VDE1OjE4OjM0WiIsImZpZWxkc1R5cGUiOiJGaWVsZHNWMSIsImZpZWxkc1YxIjp7ImY6c3BlYyI6eyJmOmludGVydmFsIjp7fSwiZjppdGVtcyI6e30sImY6dGl0bGUiOnt9fX19XX19", "body": "eyJraW5kIjoiUGxheWxpc3QiLCJhcGlWZXJzaW9uIjoicGxheWxpc3QuZ3JhZmFuYS5hcHAvdjBhbHBoYTEiLCJtZXRhZGF0YSI6eyJuYW1lIjoic2Rmc2Rmc2RmIiwibmFtZXNwYWNlIjoiZGVmYXVsdCIsInVpZCI6IjAyZmVhOGVlLTk2ZDYtNGIzMy04ZGI5LTU5MmI0NzU4NTM4NSIsImNyZWF0aW9uVGltZXN0YW1wIjoiMjAyNC0wNi0wNFQxNToxODozNFoiLCJtYW5hZ2VkRmllbGRzIjpbeyJtYW5hZ2VyIjoiTW96aWxsYSIsIm9wZXJhdGlvbiI6IlVwZGF0ZSIsImFwaVZlcnNpb24iOiJwbGF5bGlzdC5ncmFmYW5hLmFwcC92MGFscGhhMSIsInRpbWUiOiIyMDI0LTA2LTA0VDE1OjE4OjM0WiIsImZpZWxkc1R5cGUiOiJGaWVsZHNWMSIsImZpZWxkc1YxIjp7ImY6c3BlYyI6eyJmOmludGVydmFsIjp7fSwiZjppdGVtcyI6e30sImY6dGl0bGUiOnt9fX19XX0sInNwZWMiOnsidGl0bGUiOiJ4emN2enhjdiIsImludGVydmFsIjoiNW0iLCJpdGVtcyI6W3sidHlwZSI6ImRhc2hib2FyZF9ieV91aWQiLCJ2YWx1ZSI6ImNkbml2NTNnbWQ0dzBlIn1dfX0K", "title": "xzcvzxcv", diff --git a/pkg/services/team/teamapi/team_members_test.go b/pkg/services/team/teamapi/team_members_test.go index 68065c4d001..9fba37925fa 100644 --- a/pkg/services/team/teamapi/team_members_test.go +++ b/pkg/services/team/teamapi/team_members_test.go @@ -281,5 +281,5 @@ func Test_getTeamMembershipUpdates(t *testing.T) { } func authedUserWithPermissions(userID, orgID int64, permissions []accesscontrol.Permission) *user.SignedInUser { - return &user.SignedInUser{UserID: userID, OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByAction(permissions)}} + return &user.SignedInUser{UserID: userID, OrgID: orgID, OrgRole: org.RoleViewer, Permissions: map[int64]map[string][]string{orgID: accesscontrol.GroupScopesByActionContext(context.Background(), permissions)}} } diff --git a/pkg/services/team/teamimpl/store.go b/pkg/services/team/teamimpl/store.go index 7c422d8abf5..8f3db689fd3 100644 --- a/pkg/services/team/teamimpl/store.go +++ b/pkg/services/team/teamimpl/store.go @@ -11,7 +11,6 @@ import ( "github.com/grafana/grafana/pkg/infra/db" ac "github.com/grafana/grafana/pkg/services/accesscontrol" "github.com/grafana/grafana/pkg/services/dashboards/dashboardaccess" - "github.com/grafana/grafana/pkg/services/sqlstore/migrator" "github.com/grafana/grafana/pkg/services/team" "github.com/grafana/grafana/pkg/setting" "github.com/grafana/grafana/pkg/util" @@ -567,25 +566,3 @@ func (ss *xormStore) getTeamMembers(ctx context.Context, query *team.GetTeamMemb func (ss *xormStore) RegisterDelete(query string) { ss.deletes = append(ss.deletes, query) } - -// This is just to ensure that all teams have a valid uid. -// To protect against upgrade / downgrade we need to run this for a couple of releases. -// FIXME: Remove this migration and make uid field required https://github.com/grafana/identity-access-team/issues/552 -func (ss *xormStore) uidMigration() error { - return ss.db.WithDbSession(context.Background(), func(sess *db.Session) error { - switch ss.db.GetDBType() { - case migrator.SQLite: - _, err := sess.Exec("UPDATE team SET uid=printf('t%09d',id) WHERE uid IS NULL;") - return err - case migrator.Postgres: - _, err := sess.Exec("UPDATE team SET uid='t' || lpad('' || id::text,9,'0') WHERE uid IS NULL;") - return err - case migrator.MySQL: - _, err := sess.Exec("UPDATE team SET uid=concat('t',lpad(id,9,'0')) WHERE uid IS NULL;") - return err - default: - // this branch should be unreachable - return nil - } - }) -} diff --git a/pkg/services/team/teamimpl/team.go b/pkg/services/team/teamimpl/team.go index 1eb8e7c1b2d..e7c9537b751 100644 --- a/pkg/services/team/teamimpl/team.go +++ b/pkg/services/team/teamimpl/team.go @@ -18,11 +18,6 @@ type Service struct { } func ProvideService(db db.DB, cfg *setting.Cfg, tracer tracing.Tracer) (team.Service, error) { - store := &xormStore{db: db, cfg: cfg, deletes: []string{}} - - if err := store.uidMigration(); err != nil { - return nil, err - } return &Service{ store: &xormStore{db: db, cfg: cfg, deletes: []string{}}, tracer: tracer, diff --git a/pkg/services/user/userimpl/user.go b/pkg/services/user/userimpl/user.go index 3e340736498..db911d4c408 100644 --- a/pkg/services/user/userimpl/user.go +++ b/pkg/services/user/userimpl/user.go @@ -17,7 +17,6 @@ import ( "github.com/grafana/grafana/pkg/services/org" "github.com/grafana/grafana/pkg/services/quota" "github.com/grafana/grafana/pkg/services/serviceaccounts" - "github.com/grafana/grafana/pkg/services/sqlstore/migrator" "github.com/grafana/grafana/pkg/services/supportbundles" "github.com/grafana/grafana/pkg/services/team" "github.com/grafana/grafana/pkg/services/user" @@ -65,10 +64,6 @@ func ProvideService( return s, err } - if err := s.uidMigration(db); err != nil { - return nil, err - } - bundleRegistry.RegisterSupportItemCollector(s.supportBundleCollector()) return s, nil } @@ -529,25 +524,3 @@ func readQuotaConfig(cfg *setting.Cfg) (*quota.Map, error) { limits.Set(globalQuotaTag, cfg.Quota.Global.User) return limits, nil } - -// This is just to ensure that all users have a valid uid. -// To protect against upgrade / downgrade we need to run this for a couple of releases. -// FIXME: Remove this migration and make uid field required https://github.com/grafana/identity-access-team/issues/552 -func (s *Service) uidMigration(store db.DB) error { - return store.WithDbSession(context.Background(), func(sess *db.Session) error { - switch store.GetDBType() { - case migrator.SQLite: - _, err := sess.Exec("UPDATE user SET uid=printf('u%09d',id) WHERE uid IS NULL;") - return err - case migrator.Postgres: - _, err := sess.Exec("UPDATE `user` SET uid='u' || lpad('' || id::text,9,'0') WHERE uid IS NULL;") - return err - case migrator.MySQL: - _, err := sess.Exec("UPDATE user SET uid=concat('u',lpad(id,9,'0')) WHERE uid IS NULL;") - return err - default: - // this branch should be unreachable - return nil - } - }) -} diff --git a/pkg/setting/setting_cloud_migration.go b/pkg/setting/setting_cloud_migration.go index 3c68147a5ec..67d295d34b8 100644 --- a/pkg/setting/setting_cloud_migration.go +++ b/pkg/setting/setting_cloud_migration.go @@ -1,12 +1,15 @@ package setting import ( + "os" "time" ) type CloudMigrationSettings struct { IsTarget bool GcomAPIToken string + SnapshotFolder string + StartSnapshotTimeout time.Duration FetchInstanceTimeout time.Duration CreateAccessPolicyTimeout time.Duration FetchAccessPolicyTimeout time.Duration @@ -23,6 +26,8 @@ func (cfg *Cfg) readCloudMigrationSettings() { cloudMigration := cfg.Raw.Section("cloud_migration") cfg.CloudMigration.IsTarget = cloudMigration.Key("is_target").MustBool(false) cfg.CloudMigration.GcomAPIToken = cloudMigration.Key("gcom_api_token").MustString("") + cfg.CloudMigration.SnapshotFolder = cloudMigration.Key("snapshot_folder").MustString("") + cfg.CloudMigration.StartSnapshotTimeout = cloudMigration.Key("start_snapshot_timeout").MustDuration(5 * time.Second) cfg.CloudMigration.FetchInstanceTimeout = cloudMigration.Key("fetch_instance_timeout").MustDuration(5 * time.Second) cfg.CloudMigration.CreateAccessPolicyTimeout = cloudMigration.Key("create_access_policy_timeout").MustDuration(5 * time.Second) cfg.CloudMigration.FetchAccessPolicyTimeout = cloudMigration.Key("fetch_access_policy_timeout").MustDuration(5 * time.Second) @@ -32,4 +37,9 @@ func (cfg *Cfg) readCloudMigrationSettings() { cfg.CloudMigration.DeleteTokenTimeout = cloudMigration.Key("delete_token_timeout").MustDuration(5 * time.Second) cfg.CloudMigration.TokenExpiresAfter = cloudMigration.Key("token_expires_after").MustDuration(7 * 24 * time.Hour) cfg.CloudMigration.IsDeveloperMode = cloudMigration.Key("developer_mode").MustBool(false) + + if cfg.CloudMigration.SnapshotFolder == "" { + homeDir, _ := os.UserHomeDir() + cfg.CloudMigration.SnapshotFolder = homeDir + } } diff --git a/pkg/storage/unified/apistore/doc.go b/pkg/storage/unified/apistore/doc.go new file mode 100644 index 00000000000..5fb2f8ac31f --- /dev/null +++ b/pkg/storage/unified/apistore/doc.go @@ -0,0 +1,5 @@ +// Package apistore provides a kubernetes store.Interface for a ResourceServer +// +// This package is responsible for running all the apiserver specific logic +// before and after sending requests to the StorageServer +package apistore diff --git a/pkg/storage/unified/apistore/storage.go b/pkg/storage/unified/apistore/storage.go index c4cd32f244b..1f158bcd655 100644 --- a/pkg/storage/unified/apistore/storage.go +++ b/pkg/storage/unified/apistore/storage.go @@ -13,7 +13,6 @@ import ( "io" "reflect" "strconv" - "strings" apierrors "k8s.io/apimachinery/pkg/api/errors" "k8s.io/apimachinery/pkg/api/meta" @@ -21,7 +20,6 @@ import ( "k8s.io/apimachinery/pkg/conversion" "k8s.io/apimachinery/pkg/runtime" "k8s.io/apimachinery/pkg/runtime/schema" - "k8s.io/apimachinery/pkg/selection" "k8s.io/apimachinery/pkg/watch" "k8s.io/apiserver/pkg/storage" "k8s.io/apiserver/pkg/storage/storagebackend" @@ -33,8 +31,6 @@ import ( "github.com/grafana/grafana/pkg/storage/unified/resource" ) -const SortByKey = "grafana.app/sortBy" - var _ storage.Interface = (*Storage)(nil) // Storage implements storage.Interface and stores resources in unified storage @@ -306,28 +302,6 @@ func toListRequest(key string, opts storage.ListOptions) (*resource.ListRequest, for _, r := range requirements { v := r.Key() - // TODO?? sorting in list not supported - if v == SortByKey { - if r.Operator() != selection.Equals { - return nil, predicate, apierrors.NewBadRequest("invalid sort operation // " + r.String()) - } - parts := strings.Split(v, " ") - if len(parts) != 2 { - return nil, predicate, apierrors.NewBadRequest("invalid sort operation // " + r.String()) - } - sort := &resource.Sort{Field: parts[0]} - switch parts[1] { - case "ASC": - sort.Order = resource.Sort_ASC - case "DESC": - sort.Order = resource.Sort_DESC - default: - return nil, predicate, apierrors.NewBadRequest("invalid sort order // " + r.String()) - } - // TODO! Must update the predicate! - continue - } - req.Options.Labels = append(req.Options.Labels, &resource.Requirement{ Key: v, Operator: string(r.Operator()), @@ -336,6 +310,17 @@ func toListRequest(key string, opts storage.ListOptions) (*resource.ListRequest, } } + if opts.Predicate.Field != nil && !opts.Predicate.Field.Empty() { + requirements := opts.Predicate.Field.Requirements() + for _, r := range requirements { + requirement := &resource.Requirement{Key: r.Field, Operator: string(r.Operator)} + if r.Value != "" { + requirement.Values = append(requirement.Values, r.Value) + } + req.Options.Labels = append(req.Options.Labels, requirement) + } + } + if opts.ResourceVersion != "" { rv, err := strconv.ParseInt(opts.ResourceVersion, 10, 64) if err != nil { diff --git a/pkg/storage/unified/entitybridge/doc.go b/pkg/storage/unified/entitybridge/doc.go new file mode 100644 index 00000000000..aed47e41441 --- /dev/null +++ b/pkg/storage/unified/entitybridge/doc.go @@ -0,0 +1,5 @@ +// Package entitybridge implements an ResourceServer using existing EntityAPI contracts +// +// This package will be removed and replaced with a more streamlined SQL implementation +// that leverages what we have learned from the entity deployments so far +package entitybridge diff --git a/pkg/storage/unified/entitybridge/entitybridge.go b/pkg/storage/unified/entitybridge/entitybridge.go index 51f75279f40..aa33261b0cc 100644 --- a/pkg/storage/unified/entitybridge/entitybridge.go +++ b/pkg/storage/unified/entitybridge/entitybridge.go @@ -8,6 +8,7 @@ import ( "time" "gocloud.dev/blob/fileblob" + "k8s.io/apimachinery/pkg/selection" "k8s.io/klog/v2" grafanaregistry "github.com/grafana/grafana/pkg/apiserver/registry/generic" @@ -29,7 +30,7 @@ func ProvideResourceServer(db db.DB, cfg *setting.Cfg, features featuremgmt.Feat } supportBlobs := true - useEntitySQL := true // save in SQL (but watch not working) + useEntitySQL := true // Create a local blob filesystem blob store if supportBlobs { @@ -271,11 +272,15 @@ func (b *entityBridge) PrepareList(ctx context.Context, req *resource.ListReques WithBody: true, } - // Assumes everything is equals if len(req.Options.Labels) > 0 { query.Labels = make(map[string]string) for _, q := range req.Options.Labels { - query.Labels[q.Key] = q.Values[0] + // The entity structure only supports equals + // the rest will be processed handled by the upstream predicate + op := selection.Operator(q.Operator) + if op == selection.Equals || op == selection.DoubleEquals { + query.Labels[q.Key] = q.Values[0] + } } } diff --git a/pkg/storage/unified/resource/cdk_backend.go b/pkg/storage/unified/resource/cdk_backend.go index 3d3415131ff..fc201b13413 100644 --- a/pkg/storage/unified/resource/cdk_backend.go +++ b/pkg/storage/unified/resource/cdk_backend.go @@ -69,8 +69,9 @@ type cdkBackend struct { nextRV NextResourceVersion mutex sync.Mutex - // Typically one... the server wrapper - subscribers []chan *WrittenEvent + // Simple watch stream -- NOTE, this only works for single tenant! + broadcaster Broadcaster[*WrittenEvent] + stream chan<- *WrittenEvent } func (s *cdkBackend) getPath(key *ResourceKey, rv int64) string { @@ -123,24 +124,19 @@ func (s *cdkBackend) WriteEvent(ctx context.Context, event WriteEvent) (rv int64 } // Async notify all subscribers - if s.subscribers != nil { + if s.stream != nil { go func() { write := &WrittenEvent{ - WriteEvent: event, - + WriteEvent: event, Timestamp: time.Now().UnixMilli(), ResourceVersion: rv, } - for _, sub := range s.subscribers { - sub <- write - } + s.stream <- write }() } - return rv, err } -// Read implements ResourceStoreServer. func (s *cdkBackend) Read(ctx context.Context, req *ReadRequest) (*ReadResponse, error) { rv := req.ResourceVersion @@ -167,15 +163,11 @@ func (s *cdkBackend) Read(ctx context.Context, req *ReadRequest) (*ReadResponse, } raw, err := s.bucket.ReadAll(ctx, path) - if err == nil && bytes.Contains(raw, []byte(`"DeletedMarker"`)) { - tmp := &unstructured.Unstructured{} - err = tmp.UnmarshalJSON(raw) - if err == nil && tmp.GetKind() == "DeletedMarker" { - return nil, apierrors.NewNotFound(schema.GroupResource{ - Group: req.Key.Group, - Resource: req.Key.Resource, - }, req.Key.Name) - } + if err == nil && isDeletedMarker(raw) { + return nil, apierrors.NewNotFound(schema.GroupResource{ + Group: req.Key.Group, + Resource: req.Key.Resource, + }, req.Key.Name) } return &ReadResponse{ @@ -184,7 +176,17 @@ func (s *cdkBackend) Read(ctx context.Context, req *ReadRequest) (*ReadResponse, }, err } -// List implements AppendingStore. +func isDeletedMarker(raw []byte) bool { + if bytes.Contains(raw, []byte(`"DeletedMarker"`)) { + tmp := &unstructured.Unstructured{} + err := tmp.UnmarshalJSON(raw) + if err == nil && tmp.GetKind() == "DeletedMarker" { + return true + } + } + return false +} + func (s *cdkBackend) PrepareList(ctx context.Context, req *ListRequest) (*ListResponse, error) { resources, err := buildTree(ctx, s, req.Options.Key) if err != nil { @@ -198,44 +200,31 @@ func (s *cdkBackend) PrepareList(ctx context.Context, req *ListRequest) (*ListRe if err != nil { return nil, err } - rsp.Items = append(rsp.Items, &ResourceWrapper{ - ResourceVersion: latest.rv, - Value: raw, - }) + if !isDeletedMarker(raw) { + rsp.Items = append(rsp.Items, &ResourceWrapper{ + ResourceVersion: latest.rv, + Value: raw, + }) + } } return rsp, nil } -// Watch implements AppendingStore. func (s *cdkBackend) WatchWriteEvents(ctx context.Context) (<-chan *WrittenEvent, error) { - stream := make(chan *WrittenEvent, 10) - { - s.mutex.Lock() - defer s.mutex.Unlock() + s.mutex.Lock() + defer s.mutex.Unlock() - // Add the event stream - s.subscribers = append(s.subscribers, stream) - } - - // Wait for context done - go func() { - // Wait till the context is done - <-ctx.Done() - - // Then remove the subscription - s.mutex.Lock() - defer s.mutex.Unlock() - - // Copy all streams without our listener - subs := []chan *WrittenEvent{} - for _, sub := range s.subscribers { - if sub != stream { - subs = append(subs, sub) - } + if s.broadcaster == nil { + var err error + s.broadcaster, err = NewBroadcaster(context.Background(), func(c chan<- *WrittenEvent) error { + s.stream = c + return nil + }) + if err != nil { + return nil, err } - s.subscribers = subs - }() - return stream, nil + } + return s.broadcaster.Subscribe(ctx) } // group > resource > namespace > name > versions diff --git a/pkg/storage/unified/resource/doc.go b/pkg/storage/unified/resource/doc.go new file mode 100644 index 00000000000..9c186ed6c46 --- /dev/null +++ b/pkg/storage/unified/resource/doc.go @@ -0,0 +1,2 @@ +// Package resource creates a ResourceServer that handles generic storage operations +package resource diff --git a/pkg/storage/unified/resource/grpc/authenticator.go b/pkg/storage/unified/resource/grpc/authenticator.go index f77cc87de92..7aed3e5b3bb 100644 --- a/pkg/storage/unified/resource/grpc/authenticator.go +++ b/pkg/storage/unified/resource/grpc/authenticator.go @@ -39,14 +39,14 @@ func (f *Authenticator) Authenticate(ctx context.Context) (context.Context, erro if !ok { return nil, fmt.Errorf("no metadata found") } - user, err := f.DecodeMetadata(ctx, md) + user, err := f.decodeMetadata(ctx, md) if err != nil { return nil, err } return identity.WithRequester(ctx, user), nil } -func (f *Authenticator) DecodeMetadata(ctx context.Context, meta metadata.MD) (identity.Requester, error) { +func (f *Authenticator) decodeMetadata(ctx context.Context, meta metadata.MD) (identity.Requester, error) { // Avoid NPE/panic with getting keys getter := func(key string) string { v := meta.Get(key) diff --git a/pkg/storage/unified/resource/grpc/authenticator_test.go b/pkg/storage/unified/resource/grpc/authenticator_test.go index d871cce721c..2167b996991 100644 --- a/pkg/storage/unified/resource/grpc/authenticator_test.go +++ b/pkg/storage/unified/resource/grpc/authenticator_test.go @@ -23,7 +23,7 @@ func TestBasicEncodeDecode(t *testing.T) { auth := &Authenticator{} md := encodeIdentityInMetadata(before) - after, err := auth.DecodeMetadata(context.Background(), md) + after, err := auth.decodeMetadata(context.Background(), md) require.NoError(t, err) require.Equal(t, before.GetID(), after.GetID()) require.Equal(t, before.GetUID(), after.GetUID()) diff --git a/pkg/storage/unified/resource/resource.pb.go b/pkg/storage/unified/resource/resource.pb.go index 9f38ba6f98a..f4fa4297747 100644 --- a/pkg/storage/unified/resource/resource.pb.go +++ b/pkg/storage/unified/resource/resource.pb.go @@ -1201,12 +1201,16 @@ type ListOptions struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // Namespace+Group+Resource+etc + // Group+Namespace+Resource (not name) Key *ResourceKey `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` // (best effort) Match label // Allowed to send more results than actually match because the filter will be appled // to the resutls agin in the client. That time with the full field selector Labels []*Requirement `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty"` + // (best effort) fields matcher + // Allowed to send more results than actually match because the filter will be appled + // to the resutls agin in the client. That time with the full field selector + Fields []*Requirement `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"` } func (x *ListOptions) Reset() { @@ -1255,6 +1259,13 @@ func (x *ListOptions) GetLabels() []*Requirement { return nil } +func (x *ListOptions) GetFields() []*Requirement { + if x != nil { + return x.Fields + } + return nil +} + type ListRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -2529,13 +2540,16 @@ var file_resource_proto_rawDesc = []byte{ 0x63, 0x65, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x1a, 0x0a, 0x05, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, - 0x22, 0x65, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x27, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, - 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, - 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, + 0x22, 0x94, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x27, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, + 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, + 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x06, 0x6c, 0x61, 0x62, + 0x65, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x65, 0x73, 0x6f, + 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x2d, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x22, 0xec, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, + 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0xec, 0x01, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x65, 0x78, 0x74, 0x5f, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x6e, 0x65, 0x78, 0x74, 0x50, 0x61, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, @@ -2831,53 +2845,54 @@ var file_resource_proto_depIdxs = []int32{ 1, // 8: resource.Sort.order:type_name -> resource.Sort.Order 5, // 9: resource.ListOptions.key:type_name -> resource.ResourceKey 17, // 10: resource.ListOptions.labels:type_name -> resource.Requirement - 0, // 11: resource.ListRequest.version_match:type_name -> resource.ResourceVersionMatch - 19, // 12: resource.ListRequest.options:type_name -> resource.ListOptions - 6, // 13: resource.ListResponse.items:type_name -> resource.ResourceWrapper - 19, // 14: resource.WatchRequest.options:type_name -> resource.ListOptions - 2, // 15: resource.WatchEvent.type:type_name -> resource.WatchEvent.Type - 35, // 16: resource.WatchEvent.resource:type_name -> resource.WatchEvent.Resource - 35, // 17: resource.WatchEvent.previous:type_name -> resource.WatchEvent.Resource - 5, // 18: resource.HistoryRequest.key:type_name -> resource.ResourceKey - 7, // 19: resource.HistoryResponse.items:type_name -> resource.ResourceMeta - 5, // 20: resource.OriginRequest.key:type_name -> resource.ResourceKey - 5, // 21: resource.ResourceOriginInfo.key:type_name -> resource.ResourceKey - 27, // 22: resource.OriginResponse.items:type_name -> resource.ResourceOriginInfo - 3, // 23: resource.HealthCheckResponse.status:type_name -> resource.HealthCheckResponse.ServingStatus - 5, // 24: resource.PutBlobRequest.resource:type_name -> resource.ResourceKey - 4, // 25: resource.PutBlobRequest.method:type_name -> resource.PutBlobRequest.Method - 8, // 26: resource.PutBlobResponse.status:type_name -> resource.StatusResult - 5, // 27: resource.GetBlobRequest.resource:type_name -> resource.ResourceKey - 8, // 28: resource.GetBlobResponse.status:type_name -> resource.StatusResult - 15, // 29: resource.ResourceStore.Read:input_type -> resource.ReadRequest - 9, // 30: resource.ResourceStore.Create:input_type -> resource.CreateRequest - 11, // 31: resource.ResourceStore.Update:input_type -> resource.UpdateRequest - 13, // 32: resource.ResourceStore.Delete:input_type -> resource.DeleteRequest - 20, // 33: resource.ResourceStore.List:input_type -> resource.ListRequest - 22, // 34: resource.ResourceStore.Watch:input_type -> resource.WatchRequest - 15, // 35: resource.ResourceIndex.Read:input_type -> resource.ReadRequest - 24, // 36: resource.ResourceIndex.History:input_type -> resource.HistoryRequest - 26, // 37: resource.ResourceIndex.Origin:input_type -> resource.OriginRequest - 31, // 38: resource.BlobStore.PutBlob:input_type -> resource.PutBlobRequest - 33, // 39: resource.BlobStore.GetBlob:input_type -> resource.GetBlobRequest - 29, // 40: resource.Diagnostics.IsHealthy:input_type -> resource.HealthCheckRequest - 16, // 41: resource.ResourceStore.Read:output_type -> resource.ReadResponse - 10, // 42: resource.ResourceStore.Create:output_type -> resource.CreateResponse - 12, // 43: resource.ResourceStore.Update:output_type -> resource.UpdateResponse - 14, // 44: resource.ResourceStore.Delete:output_type -> resource.DeleteResponse - 21, // 45: resource.ResourceStore.List:output_type -> resource.ListResponse - 23, // 46: resource.ResourceStore.Watch:output_type -> resource.WatchEvent - 16, // 47: resource.ResourceIndex.Read:output_type -> resource.ReadResponse - 25, // 48: resource.ResourceIndex.History:output_type -> resource.HistoryResponse - 28, // 49: resource.ResourceIndex.Origin:output_type -> resource.OriginResponse - 32, // 50: resource.BlobStore.PutBlob:output_type -> resource.PutBlobResponse - 34, // 51: resource.BlobStore.GetBlob:output_type -> resource.GetBlobResponse - 30, // 52: resource.Diagnostics.IsHealthy:output_type -> resource.HealthCheckResponse - 41, // [41:53] is the sub-list for method output_type - 29, // [29:41] is the sub-list for method input_type - 29, // [29:29] is the sub-list for extension type_name - 29, // [29:29] is the sub-list for extension extendee - 0, // [0:29] is the sub-list for field type_name + 17, // 11: resource.ListOptions.fields:type_name -> resource.Requirement + 0, // 12: resource.ListRequest.version_match:type_name -> resource.ResourceVersionMatch + 19, // 13: resource.ListRequest.options:type_name -> resource.ListOptions + 6, // 14: resource.ListResponse.items:type_name -> resource.ResourceWrapper + 19, // 15: resource.WatchRequest.options:type_name -> resource.ListOptions + 2, // 16: resource.WatchEvent.type:type_name -> resource.WatchEvent.Type + 35, // 17: resource.WatchEvent.resource:type_name -> resource.WatchEvent.Resource + 35, // 18: resource.WatchEvent.previous:type_name -> resource.WatchEvent.Resource + 5, // 19: resource.HistoryRequest.key:type_name -> resource.ResourceKey + 7, // 20: resource.HistoryResponse.items:type_name -> resource.ResourceMeta + 5, // 21: resource.OriginRequest.key:type_name -> resource.ResourceKey + 5, // 22: resource.ResourceOriginInfo.key:type_name -> resource.ResourceKey + 27, // 23: resource.OriginResponse.items:type_name -> resource.ResourceOriginInfo + 3, // 24: resource.HealthCheckResponse.status:type_name -> resource.HealthCheckResponse.ServingStatus + 5, // 25: resource.PutBlobRequest.resource:type_name -> resource.ResourceKey + 4, // 26: resource.PutBlobRequest.method:type_name -> resource.PutBlobRequest.Method + 8, // 27: resource.PutBlobResponse.status:type_name -> resource.StatusResult + 5, // 28: resource.GetBlobRequest.resource:type_name -> resource.ResourceKey + 8, // 29: resource.GetBlobResponse.status:type_name -> resource.StatusResult + 15, // 30: resource.ResourceStore.Read:input_type -> resource.ReadRequest + 9, // 31: resource.ResourceStore.Create:input_type -> resource.CreateRequest + 11, // 32: resource.ResourceStore.Update:input_type -> resource.UpdateRequest + 13, // 33: resource.ResourceStore.Delete:input_type -> resource.DeleteRequest + 20, // 34: resource.ResourceStore.List:input_type -> resource.ListRequest + 22, // 35: resource.ResourceStore.Watch:input_type -> resource.WatchRequest + 15, // 36: resource.ResourceIndex.Read:input_type -> resource.ReadRequest + 24, // 37: resource.ResourceIndex.History:input_type -> resource.HistoryRequest + 26, // 38: resource.ResourceIndex.Origin:input_type -> resource.OriginRequest + 31, // 39: resource.BlobStore.PutBlob:input_type -> resource.PutBlobRequest + 33, // 40: resource.BlobStore.GetBlob:input_type -> resource.GetBlobRequest + 29, // 41: resource.Diagnostics.IsHealthy:input_type -> resource.HealthCheckRequest + 16, // 42: resource.ResourceStore.Read:output_type -> resource.ReadResponse + 10, // 43: resource.ResourceStore.Create:output_type -> resource.CreateResponse + 12, // 44: resource.ResourceStore.Update:output_type -> resource.UpdateResponse + 14, // 45: resource.ResourceStore.Delete:output_type -> resource.DeleteResponse + 21, // 46: resource.ResourceStore.List:output_type -> resource.ListResponse + 23, // 47: resource.ResourceStore.Watch:output_type -> resource.WatchEvent + 16, // 48: resource.ResourceIndex.Read:output_type -> resource.ReadResponse + 25, // 49: resource.ResourceIndex.History:output_type -> resource.HistoryResponse + 28, // 50: resource.ResourceIndex.Origin:output_type -> resource.OriginResponse + 32, // 51: resource.BlobStore.PutBlob:output_type -> resource.PutBlobResponse + 34, // 52: resource.BlobStore.GetBlob:output_type -> resource.GetBlobResponse + 30, // 53: resource.Diagnostics.IsHealthy:output_type -> resource.HealthCheckResponse + 42, // [42:54] is the sub-list for method output_type + 30, // [30:42] is the sub-list for method input_type + 30, // [30:30] is the sub-list for extension type_name + 30, // [30:30] is the sub-list for extension extendee + 0, // [0:30] is the sub-list for field type_name } func init() { file_resource_proto_init() } diff --git a/pkg/storage/unified/resource/resource.proto b/pkg/storage/unified/resource/resource.proto index 6d4b408fec0..46fd9a8c7b7 100644 --- a/pkg/storage/unified/resource/resource.proto +++ b/pkg/storage/unified/resource/resource.proto @@ -154,9 +154,9 @@ message ReadResponse { // The label filtering requirements: // https://github.com/kubernetes/kubernetes/blob/v1.30.1/staging/src/k8s.io/apimachinery/pkg/labels/selector.go#L141 message Requirement { - string key = 1; + string key = 1; string operator = 2; // See https://github.com/kubernetes/kubernetes/blob/v1.30.1/staging/src/k8s.io/apimachinery/pkg/selection/operator.go#L21 - repeated string values = 3; // typically one value, but depends on the operator + repeated string values = 3; // typically one value, but depends on the operator } message Sort { @@ -164,12 +164,12 @@ message Sort { ASC = 0; DESC = 1; } - string field = 1; + string field = 1; Order order = 2; } message ListOptions { - // Namespace+Group+Resource+etc + // Group+Namespace+Resource (not name) ResourceKey key = 1; // (best effort) Match label @@ -177,11 +177,10 @@ message ListOptions { // to the resutls agin in the client. That time with the full field selector repeated Requirement labels = 2; - // TODO (later!) once we have a blob > search doc - // Match fields (not yet supported) - // metadata.name - // metadata.namespace - // repeated Requirement fields = 3; + // (best effort) fields matcher + // Allowed to send more results than actually match because the filter will be appled + // to the resutls agin in the client. That time with the full field selector + repeated Requirement fields = 3; } enum ResourceVersionMatch { @@ -217,16 +216,16 @@ message ListResponse { int64 resource_version = 3; // remainingItemCount is the number of subsequent items in the list which are not included in this - // list response. If the list request contained label or field selectors, then the number of - // remaining items is unknown and the field will be left unset and omitted during serialization. - // If the list is complete (either because it is not chunking or because this is the last chunk), - // then there are no more remaining items and this field will be left unset and omitted during - // serialization. + // list response. If the list request contained label or field selectors, then the number of + // remaining items is unknown and the field will be left unset and omitted during serialization. + // If the list is complete (either because it is not chunking or because this is the last chunk), + // then there are no more remaining items and this field will be left unset and omitted during + // serialization. // - // The intended use of the remainingItemCount is *estimating* the size of a collection. Clients - // should not rely on the remainingItemCount to be set or to be exact. - // +optional - int64 remaining_item_count = 4; // 0 won't be set either (no next page token) + // The intended use of the remainingItemCount is *estimating* the size of a collection. Clients + // should not rely on the remainingItemCount to be set or to be exact. + // +optional + int64 remaining_item_count = 4; // 0 won't be set either (no next page token) } message WatchRequest { diff --git a/pkg/storage/unified/resource/server.go b/pkg/storage/unified/resource/server.go index 4080718832d..c873deb01ba 100644 --- a/pkg/storage/unified/resource/server.go +++ b/pkg/storage/unified/resource/server.go @@ -22,13 +22,11 @@ import ( // Package-level errors. var ( - ErrNotFound = errors.New("entity not found") - ErrOptimisticLockingFailed = errors.New("optimistic locking failed") - ErrUserNotFoundInContext = errors.New("user not found in context") - ErrUnableToReadResourceJSON = errors.New("unable to read resource json") - ErrNextPageTokenNotSupported = errors.New("nextPageToken not yet supported") - ErrLimitNotSupported = errors.New("limit not yet supported") - ErrNotImplementedYet = errors.New("not implemented yet") + ErrNotFound = errors.New("entity not found") + ErrOptimisticLockingFailed = errors.New("optimistic locking failed") + ErrUserNotFoundInContext = errors.New("user not found in context") + ErrUnableToReadResourceJSON = errors.New("unable to read resource json") + ErrNotImplementedYet = errors.New("not implemented yet") ) // ResourceServer implements all services diff --git a/pkg/storage/unified/resource/server_test.go b/pkg/storage/unified/resource/server_test.go index 9125bca00dc..cff77381043 100644 --- a/pkg/storage/unified/resource/server_test.go +++ b/pkg/storage/unified/resource/server_test.go @@ -2,7 +2,6 @@ package resource import ( "context" - "embed" "encoding/json" "fmt" "os" @@ -21,6 +20,7 @@ import ( func TestSimpleServer(t *testing.T) { testUserA := &identity.StaticRequester{ Namespace: identity.NamespaceUser, + Login: "testuser", UserID: 123, UserUID: "u123", OrgRole: identity.RoleAdmin, @@ -38,7 +38,10 @@ func TestSimpleServer(t *testing.T) { Metadata: fileblob.MetadataDontWrite, // skip }) require.NoError(t, err) +<<<<<<< HEAD +======= +>>>>>>> origin/resource-store-bridge fmt.Printf("ROOT: %s\n\n", tmp) } store, err := NewCDKBackend(ctx, CDKBackendOptions{ @@ -52,7 +55,30 @@ func TestSimpleServer(t *testing.T) { require.NoError(t, err) t.Run("playlist happy CRUD paths", func(t *testing.T) { - raw := testdata(t, "01_create_playlist.json") + raw := []byte(`{ + "apiVersion": "playlist.grafana.app/v0alpha1", + "kind": "Playlist", + "metadata": { + "name": "fdgsv37qslr0ga", + "namespace": "default", + "annotations": { + "grafana.app/originName": "elsewhere", + "grafana.app/originPath": "path/to/item", + "grafana.app/originTimestamp": "2024-02-02T00:00:00Z" + } + }, + "spec": { + "title": "hello", + "interval": "5m", + "items": [ + { + "type": "dashboard_by_uid", + "value": "vmie2cmWz" + } + ] + } + }`) + key := &ResourceKey{ Group: "playlist.grafana.app", Resource: "rrrr", // can be anything :( @@ -131,15 +157,15 @@ func TestSimpleServer(t *testing.T) { require.NoError(t, err) require.NotNil(t, found.Status) require.Equal(t, int32(404), found.Status.Code) + + // And the deleted value should not be in the results + all, err = server.List(ctx, &ListRequest{Options: &ListOptions{ + Key: &ResourceKey{ + Group: key.Group, + Resource: key.Resource, + }, + }}) + require.NoError(t, err) + require.Len(t, all.Items, 0) // empty }) } - -//go:embed testdata/* -var testdataFS embed.FS - -func testdata(t *testing.T, filename string) []byte { - t.Helper() - b, err := testdataFS.ReadFile(`testdata/` + filename) - require.NoError(t, err) - return b -} diff --git a/pkg/tests/apis/peakq/peakq_test.go b/pkg/tests/apis/peakq/peakq_test.go index 58bcbbee146..23c4adee3c2 100644 --- a/pkg/tests/apis/peakq/peakq_test.go +++ b/pkg/tests/apis/peakq/peakq_test.go @@ -2,7 +2,10 @@ package playlist import ( "encoding/json" +<<<<<<< HEAD "fmt" +======= +>>>>>>> origin/resource-store-bridge "testing" "github.com/stretchr/testify/require" @@ -35,7 +38,11 @@ func TestIntegrationFoldersApp(t *testing.T) { v1Disco, err := json.MarshalIndent(resources, "", " ") require.NoError(t, err) +<<<<<<< HEAD fmt.Printf("%s", string(v1Disco)) +======= + //fmt.Printf("%s", string(v1Disco)) +>>>>>>> origin/resource-store-bridge require.JSONEq(t, `{ "kind": "APIResourceList", "apiVersion": "v1", diff --git a/pkg/tsdb/graphite/admission_handler.go b/pkg/tsdb/graphite/admission_handler.go new file mode 100644 index 00000000000..829324d844b --- /dev/null +++ b/pkg/tsdb/graphite/admission_handler.go @@ -0,0 +1,77 @@ +package graphite + +import ( + "context" + "fmt" + "net/http" + + "github.com/grafana/grafana-plugin-sdk-go/backend" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" +) + +var ( + _ backend.AdmissionHandler = (*Service)(nil) +) + +// ValidateAdmission implements backend.AdmissionHandler. +func (s *Service) ValidateAdmission(ctx context.Context, req *backend.AdmissionRequest) (*backend.ValidationResponse, error) { + rsp, err := s.MutateAdmission(ctx, req) + if rsp != nil { + return &backend.ValidationResponse{ + Allowed: rsp.Allowed, + Result: rsp.Result, + Warnings: rsp.Warnings, + }, err + } + return nil, err +} + +// MutateAdmission implements backend.AdmissionHandler. +func (s *Service) MutateAdmission(ctx context.Context, req *backend.AdmissionRequest) (*backend.MutationResponse, error) { + expected := (&backend.DataSourceInstanceSettings{}).GVK() + if req.Kind.Kind != expected.Kind && req.Kind.Group != expected.Group { + return getBadRequest("expected DataSourceInstanceSettings protobuf payload"), nil + } + + // Convert the payload from protobuf to an SDK struct + settings, err := backend.DataSourceInstanceSettingsFromProto(req.ObjectBytes, "") + if err != nil { + return nil, err + } + if settings == nil { + return getBadRequest("missing datasource settings"), nil + } + + switch settings.APIVersion { + case "", "v0alpha1": + // OK! + default: + return getBadRequest(fmt.Sprintf("expected apiVersion: v0alpha1, found: %s", settings.APIVersion)), nil + } + if settings.URL != "" { + return getBadRequest("unsupported URL value"), nil + } + + pb, err := backend.DataSourceInstanceSettingsToProtoBytes(settings) + return &backend.MutationResponse{ + Allowed: true, + ObjectBytes: pb, + }, err +} + +// ConvertObject implements backend.AdmissionHandler. +func (s *Service) ConvertObject(ctx context.Context, req *backend.ConversionRequest) (*backend.ConversionResponse, error) { + return nil, fmt.Errorf("not implemented") +} + +func getBadRequest(msg string) *backend.MutationResponse { + return &backend.MutationResponse{ + Allowed: false, + Result: &backend.StatusResult{ + Status: "Failure", + Message: msg, + Reason: string(metav1.StatusReasonBadRequest), + Code: http.StatusBadRequest, + }, + } +} diff --git a/public/api-merged.json b/public/api-merged.json index e4aa026504a..2fe5f57a88f 100644 --- a/public/api-merged.json +++ b/public/api-merged.json @@ -17014,6 +17014,18 @@ } } }, + "NavbarPreference": { + "type": "object", + "title": "NavbarPreference defines model for NavbarPreference.", + "properties": { + "savedItemIds": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, "NewApiKeyResult": { "type": "object", "properties": { @@ -17577,6 +17589,9 @@ "language": { "type": "string" }, + "navbar": { + "$ref": "#/definitions/NavbarPreference" + }, "queryHistory": { "$ref": "#/definitions/QueryHistoryPreference" }, @@ -18168,6 +18183,9 @@ "description": "Selected language (beta)", "type": "string" }, + "navbar": { + "$ref": "#/definitions/NavbarPreference" + }, "queryHistory": { "$ref": "#/definitions/QueryHistoryPreference" }, @@ -21419,6 +21437,9 @@ "language": { "type": "string" }, + "navbar": { + "$ref": "#/definitions/NavbarPreference" + }, "queryHistory": { "$ref": "#/definitions/QueryHistoryPreference" }, diff --git a/public/app/features/admin/UserListAnonymousPage.tsx b/public/app/features/admin/UserListAnonymousPage.tsx index fe7405c0fbe..5f4a9423a29 100644 --- a/public/app/features/admin/UserListAnonymousPage.tsx +++ b/public/app/features/admin/UserListAnonymousPage.tsx @@ -59,7 +59,7 @@ const UserListAnonymousDevicesPageUnConnected = ({
{ // for timing options expect(within(defaultPolicy).getByTestId('timing-options')).toHaveTextContent( - 'Wait30s to group instances,5m before sending updates' + 'Wait 30s to group instances · Wait 5m before sending updates · Repeated every 4h' ); // should have custom policies @@ -485,3 +486,29 @@ describe('useCreateDropdownMenuActions', () => { }); }); }); + +describe('TimingOptionsMeta', () => { + it('should render nothing without options', () => { + render(); + expect(screen.queryByText(/wait/i)).not.toBeInTheDocument(); + }); + + it('should render only repeat interval', () => { + render(); + expect(screen.getByText(/repeated every/i)).toBeInTheDocument(); + expect(screen.getByText('5h')).toBeInTheDocument(); + }); + + it('should render all options', () => { + render(); + expect( + first( + screen.getAllByText( + (_, element) => + element?.textContent === 'Wait 30s to group instances · Wait 5m before sending updates · Repeated every 4h', + { collapseWhitespace: false, trim: false, exact: true } + ) + ) + ).toBeInTheDocument(); + }); +}); diff --git a/public/app/features/alerting/unified/components/notification-policies/Policy.tsx b/public/app/features/alerting/unified/components/notification-policies/Policy.tsx index 8923768799b..194bcfd5679 100644 --- a/public/app/features/alerting/unified/components/notification-policies/Policy.tsx +++ b/public/app/features/alerting/unified/components/notification-policies/Policy.tsx @@ -21,6 +21,7 @@ import { getTagColorsFromName, useStyles2, } from '@grafana/ui'; +import { t, Trans } from 'app/core/internationalization'; import ConditionalWrap from 'app/features/alerting/unified/components/ConditionalWrap'; import { AlertmanagerGroup, @@ -720,40 +721,84 @@ const MuteTimings: FC<{ timings: string[]; alertManagerSourceName: string }> = ( ); }; -const TimingOptionsMeta: FC<{ timingOptions: TimingOptions }> = ({ timingOptions }) => { +interface TimingOptionsMetaProps { + timingOptions: TimingOptions; +} +export const TimingOptionsMeta = ({ timingOptions }: TimingOptionsMetaProps) => { const groupWait = timingOptions.group_wait; const groupInterval = timingOptions.group_interval; + const repeatInterval = timingOptions.repeat_interval; // we don't have any timing options to show – we're inheriting everything from the parent // and those show up in a separate "inherited properties" component - if (!groupWait && !groupInterval) { + if (!groupWait && !groupInterval && !repeatInterval) { return null; } + const metaOptions: ReactNode[] = []; + + if (groupWait) { + metaOptions.push( + + + + Wait to group instances + + + + ); + } + + if (groupInterval) { + metaOptions.push( + + + + Wait before sending updates + + + + ); + } + + if (repeatInterval) { + metaOptions.push( + + + + Repeated every + + + + ); + } + return ( - Wait - {groupWait && ( - - - {groupWait} to group instances - {groupWait && groupInterval && ','} - - - )} - {groupInterval && ( - - - {groupInterval} before sending updates - - - )} + {metaOptions.map((meta, index) => ( + + {meta} + {index < metaOptions.length - 1 && ' · '} + + ))} ); }; @@ -976,4 +1021,8 @@ const getStyles = (theme: GrafanaTheme2) => ({ }), }); +// This is a convencience component to deal with I18n shenanigans +// see https://github.com/grafana/grafana/blob/main/contribute/internationalization.md#jsx +const PrimaryText = ({ content }: { content: string }) => {content}; + export { Policy }; diff --git a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts index b55f281e4a8..201773bd2f6 100644 --- a/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts +++ b/public/app/features/dashboard-scene/pages/DashboardScenePageStateManager.ts @@ -322,40 +322,57 @@ export function getDashboardScenePageStateManager(): DashboardScenePageStateMana } function getErrorScene(msg: string) { - return createDashboardSceneFromDashboardModel( - new DashboardModel( - { - ...defaultDashboard, - title: msg, - panels: [ + const dto: DashboardDTO = { + dashboard: { + ...defaultDashboard, + uid: 'error-dash', + title: msg, + annotations: { + list: [ { - fieldConfig: { - defaults: {}, - overrides: [], + builtIn: 1, + datasource: { + type: 'grafana', + uid: '-- Grafana --', }, - gridPos: { - h: 6, - w: 12, - x: 7, - y: 0, - }, - id: 1, - options: { - code: { - language: 'plaintext', - showLineNumbers: false, - showMiniMap: false, - }, - content: `

${msg}

`, - mode: 'html', - }, - title: '', - transparent: true, - type: 'text', + enable: false, + hide: true, + iconColor: 'rgba(0, 211, 255, 1)', + name: 'Annotations & Alerts', + type: 'dashboard', }, ], }, - { canSave: false, canEdit: false } - ) - ); + + panels: [ + { + fieldConfig: { + defaults: {}, + overrides: [], + }, + gridPos: { + h: 6, + w: 12, + x: 7, + y: 0, + }, + id: 1, + options: { + code: { + language: 'plaintext', + showLineNumbers: false, + showMiniMap: false, + }, + content: `

${msg}

`, + mode: 'html', + }, + title: '', + transparent: true, + type: 'text', + }, + ], + }, + meta: { canSave: false, canEdit: false }, + }; + return createDashboardSceneFromDashboardModel(new DashboardModel(dto.dashboard, dto.meta), dto.dashboard); } diff --git a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataAlertingTab.test.tsx b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataAlertingTab.test.tsx index e5fabb7f09d..1726c669031 100644 --- a/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataAlertingTab.test.tsx +++ b/public/app/features/dashboard-scene/panel-edit/PanelDataPane/PanelDataAlertingTab.test.tsx @@ -28,7 +28,7 @@ import { DataSourceType, GRAFANA_RULES_SOURCE_NAME } from 'app/features/alerting import { DashboardModel, PanelModel } from 'app/features/dashboard/state'; import { getDatasourceSrv } from 'app/features/plugins/datasource_srv'; import { configureStore } from 'app/store/configureStore'; -import { AccessControlAction } from 'app/types'; +import { AccessControlAction, DashboardDataDTO } from 'app/types'; import { AlertQuery, PromRulesResponse } from 'app/types/unified-alerting-dto'; import { createDashboardSceneFromDashboardModel } from '../../serialization/transformSaveModelToScene'; @@ -359,7 +359,7 @@ async function clickNewButton() { } function createModel(dashboard: DashboardModel) { - const scene = createDashboardSceneFromDashboardModel(dashboard); + const scene = createDashboardSceneFromDashboardModel(dashboard, {} as DashboardDataDTO); const vizPanel = findVizPanelByKey(scene, getVizPanelKeyForPanelId(34))!; const model = new PanelDataAlertingTab(VizPanelManager.createFor(vizPanel)); jest.spyOn(utils, 'getDashboardSceneFor').mockReturnValue(scene); diff --git a/public/app/features/dashboard-scene/scene/DashboardControls.tsx b/public/app/features/dashboard-scene/scene/DashboardControls.tsx index a289695953b..b4396867d6b 100644 --- a/public/app/features/dashboard-scene/scene/DashboardControls.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardControls.tsx @@ -14,6 +14,7 @@ import { sceneGraph, SceneObjectUrlSyncConfig, SceneObjectUrlValues, + CancelActivationHandler, } from '@grafana/scenes'; import { Box, Stack, useStyles2 } from '@grafana/ui'; @@ -74,6 +75,20 @@ export class DashboardControls extends SceneObjectBase { refreshPicker: state.refreshPicker ?? new SceneRefreshPicker({}), ...state, }); + + this.addActivationHandler(() => { + let refreshPickerDeactivation: CancelActivationHandler | undefined; + + if (this.state.hideTimeControls) { + refreshPickerDeactivation = this.state.refreshPicker.activate(); + } + + return () => { + if (refreshPickerDeactivation) { + refreshPickerDeactivation(); + } + }; + }); } /** diff --git a/public/app/features/dashboard-scene/scene/DashboardScene.tsx b/public/app/features/dashboard-scene/scene/DashboardScene.tsx index a456c924de0..1b5e2691591 100644 --- a/public/app/features/dashboard-scene/scene/DashboardScene.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardScene.tsx @@ -78,7 +78,7 @@ import { ScopesScene } from './Scopes/ScopesScene'; import { ViewPanelScene } from './ViewPanelScene'; import { setupKeyboardShortcuts } from './keyboardShortcuts'; -export const PERSISTED_PROPS = ['title', 'description', 'tags', 'editable', 'graphTooltip', 'links', 'meta']; +export const PERSISTED_PROPS = ['title', 'description', 'tags', 'editable', 'graphTooltip', 'links', 'meta', 'preload']; export interface DashboardSceneState extends SceneObjectState { /** The title */ @@ -91,6 +91,8 @@ export interface DashboardSceneState extends SceneObjectState { links: DashboardLink[]; /** Is editable */ editable?: boolean; + /** Allows disabling grid lazy loading */ + preload?: boolean; /** A uid when saved */ uid?: string; /** @deprecated */ diff --git a/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.tsx b/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.tsx index 0e220a4e448..8c50aa0585c 100644 --- a/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.tsx +++ b/public/app/features/dashboard-scene/scene/DashboardSceneRenderer.tsx @@ -68,7 +68,7 @@ export function DashboardSceneRenderer({ model }: SceneComponentProps {scopes && !meta.dashboardNotFound && } - {controls && hasControls && ( + {controls && (
diff --git a/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModel.test.ts.snap b/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModel.test.ts.snap index 48a27c18ea2..9b5c0a119ae 100644 --- a/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModel.test.ts.snap +++ b/public/app/features/dashboard-scene/serialization/__snapshots__/transformSceneToSaveModel.test.ts.snap @@ -278,6 +278,7 @@ exports[`transformSceneToSaveModel Given a scene with rows Should transform back "type": "row", }, ], + "preload": false, "refresh": "", "schemaVersion": 39, "tags": [ @@ -545,6 +546,7 @@ exports[`transformSceneToSaveModel Given a simple scene with custom settings Sho "type": "text", }, ], + "preload": false, "refresh": "5m", "schemaVersion": 39, "tags": [ @@ -902,6 +904,7 @@ exports[`transformSceneToSaveModel Given a simple scene with variables Should tr "type": "text", }, ], + "preload": false, "refresh": "", "schemaVersion": 39, "tags": [ diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts index 444676ca936..ea3e0c936f5 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.test.ts @@ -111,7 +111,7 @@ describe('transformSaveModelToScene', () => { }; const oldModel = new DashboardModel(dash); - const scene = createDashboardSceneFromDashboardModel(oldModel); + const scene = createDashboardSceneFromDashboardModel(oldModel, dash); const dashboardControls = scene.state.controls!; expect(scene.state.title).toBe('test'); @@ -138,11 +138,13 @@ describe('transformSaveModelToScene', () => { it('should apply cursor sync behavior', () => { const dash = { ...defaultDashboard, + title: 'Test dashboard', + uid: 'test-uid', graphTooltip: DashboardCursorSync.Crosshair, }; const oldModel = new DashboardModel(dash); - const scene = createDashboardSceneFromDashboardModel(oldModel); + const scene = createDashboardSceneFromDashboardModel(oldModel, dash); const cursorSync = scene.state.$behaviors?.find((b) => b instanceof behaviors.CursorSync); expect(cursorSync).toBeInstanceOf(behaviors.CursorSync); @@ -150,8 +152,13 @@ describe('transformSaveModelToScene', () => { }); it('should apply live now timer behavior', () => { - const oldModel = new DashboardModel(defaultDashboard); - const scene = createDashboardSceneFromDashboardModel(oldModel); + const dash = { + ...defaultDashboard, + title: 'Test dashboard', + uid: 'test-uid', + }; + const oldModel = new DashboardModel(dash); + const scene = createDashboardSceneFromDashboardModel(oldModel, dash); const liveNowTimer = scene.state.$behaviors?.find((b) => b instanceof behaviors.LiveNowTimer); expect(liveNowTimer).toBeInstanceOf(behaviors.LiveNowTimer); @@ -172,7 +179,7 @@ describe('transformSaveModelToScene', () => { }; const oldModel = new DashboardModel(dash); - const scene = createDashboardSceneFromDashboardModel(oldModel); + const scene = createDashboardSceneFromDashboardModel(oldModel, dash); expect(scene.state.$variables?.state.variables).toBeDefined(); }); }); @@ -212,12 +219,14 @@ describe('transformSaveModelToScene', () => { const dashboard = { ...defaultDashboard, + title: 'Test dashboard', + uid: 'test-uid', panels: [row], }; const oldModel = new DashboardModel(dashboard); - const scene = createDashboardSceneFromDashboardModel(oldModel); + const scene = createDashboardSceneFromDashboardModel(oldModel, dashboard); const body = scene.state.body as SceneGridLayout; expect(body.state.children).toHaveLength(1); @@ -304,12 +313,14 @@ describe('transformSaveModelToScene', () => { const dashboard = { ...defaultDashboard, + title: 'Test dashboard', + uid: 'test-uid', panels: [panelOutOfRow, libPanelOutOfRow, rowWithPanel, panelInRow, libPanelInRow, emptyRow], }; const oldModel = new DashboardModel(dashboard); - const scene = createDashboardSceneFromDashboardModel(oldModel); + const scene = createDashboardSceneFromDashboardModel(oldModel, dashboard); const body = scene.state.body as SceneGridLayout; expect(body.state.children).toHaveLength(4); diff --git a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts index 2d76314a1cb..1e11bc51bde 100644 --- a/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts +++ b/public/app/features/dashboard-scene/serialization/transformSaveModelToScene.ts @@ -30,7 +30,7 @@ import { AdHocFiltersVariable, } from '@grafana/scenes'; import { DashboardModel, PanelModel } from 'app/features/dashboard/state'; -import { DashboardDTO } from 'app/types'; +import { DashboardDTO, DashboardDataDTO } from 'app/types'; import { AlertStatesDataLayer } from '../scene/AlertStatesDataLayer'; import { DashboardAnnotationsDataLayer } from '../scene/DashboardAnnotationsDataLayer'; @@ -74,7 +74,7 @@ export function transformSaveModelToScene(rsp: DashboardDTO): DashboardScene { // Just to have migrations run const oldModel = new DashboardModel(rsp.dashboard, rsp.meta); - const scene = createDashboardSceneFromDashboardModel(oldModel); + const scene = createDashboardSceneFromDashboardModel(oldModel, rsp.dashboard); // TODO: refactor createDashboardSceneFromDashboardModel to work on Dashboard schema model scene.setInitialSaveModel(rsp.dashboard); @@ -190,7 +190,7 @@ function createRowFromPanelModel(row: PanelModel, content: SceneGridItemLike[]): }); } -export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel) { +export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel, dto: DashboardDataDTO) { let variables: SceneVariableSet | undefined; let annotationLayers: SceneDataLayerProvider[] = []; let alertStatesLayer: AlertStatesDataLayer | undefined; @@ -249,6 +249,7 @@ export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel) const dashboardScene = new DashboardScene({ description: oldModel.description, editable: oldModel.editable, + preload: dto.preload ?? false, id: oldModel.id, isDirty: false, links: oldModel.links || [], @@ -258,7 +259,7 @@ export function createDashboardSceneFromDashboardModel(oldModel: DashboardModel) uid: oldModel.uid, version: oldModel.version, body: new SceneGridLayout({ - isLazy: true, + isLazy: dto.preload ? false : true, children: createSceneObjectsForPanels(oldModel.panels), $behaviors: [trackIfEmpty], }), diff --git a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.ts b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.ts index e633b7fb0ce..d6bba6aa82f 100644 --- a/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.ts +++ b/public/app/features/dashboard-scene/serialization/transformSceneToSaveModel.ts @@ -112,6 +112,7 @@ export function transformSceneToSaveModel(scene: DashboardScene, isSnapshot = fa uid: state.uid, id: state.id, editable: state.editable, + preload: state.preload, time: { from: timeRange.from, to: timeRange.to, diff --git a/public/app/features/dashboard-scene/settings/GeneralSettingsEditView.tsx b/public/app/features/dashboard-scene/settings/GeneralSettingsEditView.tsx index fafe32472c7..73b1d8cdceb 100644 --- a/public/app/features/dashboard-scene/settings/GeneralSettingsEditView.tsx +++ b/public/app/features/dashboard-scene/settings/GeneralSettingsEditView.tsx @@ -12,6 +12,7 @@ import { Label, RadioButtonGroup, Stack, + Switch, TagsInput, TextArea, } from '@grafana/ui'; @@ -161,6 +162,10 @@ export class GeneralSettingsEditView this.getCursorSync()?.setState({ sync: value }); }; + public onPreloadChange = (preload: boolean) => { + this._dashboard.setState({ preload }); + }; + public onDeleteDashboard = () => {}; static Component = ({ model }: SceneComponentProps) => { @@ -271,6 +276,20 @@ export class GeneralSettingsEditView > + + + model.onPreloadChange(e.currentTarget.checked)} + /> + {meta.canDelete && } diff --git a/public/app/features/dashboard/components/HelpWizard/SupportSnapshotService.ts b/public/app/features/dashboard/components/HelpWizard/SupportSnapshotService.ts index 0a1f9b39f2c..e9f68ad556d 100644 --- a/public/app/features/dashboard/components/HelpWizard/SupportSnapshotService.ts +++ b/public/app/features/dashboard/components/HelpWizard/SupportSnapshotService.ts @@ -83,7 +83,7 @@ export class SupportSnapshotService extends StateManagerBase({ - query: (queryArg) => ({ url: `/cloudmigration/migration/run/${queryArg.runUid}` }), - }), deleteSession: build.mutation({ query: (queryArg) => ({ url: `/cloudmigration/migration/${queryArg.uid}`, method: 'DELETE' }), }), getSession: build.query({ query: (queryArg) => ({ url: `/cloudmigration/migration/${queryArg.uid}` }), }), - getCloudMigrationRunList: build.query({ - query: (queryArg) => ({ url: `/cloudmigration/migration/${queryArg.uid}/run` }), + createSnapshot: build.mutation({ + query: (queryArg) => ({ url: `/cloudmigration/migration/${queryArg.uid}/snapshot`, method: 'POST' }), }), - runCloudMigration: build.mutation({ - query: (queryArg) => ({ url: `/cloudmigration/migration/${queryArg.uid}/run`, method: 'POST' }), + getSnapshot: build.query({ + query: (queryArg) => ({ + url: `/cloudmigration/migration/${queryArg.uid}/snapshot/${queryArg.snapshotUid}`, + params: { resultPage: queryArg.resultPage, resultLimit: queryArg.resultLimit }, + }), + }), + cancelSnapshot: build.mutation({ + query: (queryArg) => ({ + url: `/cloudmigration/migration/${queryArg.uid}/snapshot/${queryArg.snapshotUid}/cancel`, + method: 'POST', + }), + }), + uploadSnapshot: build.mutation({ + query: (queryArg) => ({ + url: `/cloudmigration/migration/${queryArg.uid}/snapshot/${queryArg.snapshotUid}/upload`, + method: 'POST', + }), + }), + getShapshotList: build.query({ + query: (queryArg) => ({ + url: `/cloudmigration/migration/${queryArg.uid}/snapshots`, + params: { page: queryArg.page, limit: queryArg.limit }, + }), + }), + getCloudMigrationToken: build.query({ + query: () => ({ url: `/cloudmigration/token` }), }), createCloudMigrationToken: build.mutation({ query: () => ({ url: `/cloudmigration/token`, method: 'POST' }), }), + deleteCloudMigrationToken: build.mutation({ + query: (queryArg) => ({ url: `/cloudmigration/token/${queryArg.uid}`, method: 'DELETE' }), + }), getDashboardByUid: build.query({ query: (queryArg) => ({ url: `/dashboards/uid/${queryArg.uid}` }), }), @@ -42,11 +66,6 @@ export type CreateSessionApiResponse = /** status 200 (empty) */ CloudMigrationS export type CreateSessionApiArg = { cloudMigrationSessionRequestDto: CloudMigrationSessionRequestDto; }; -export type GetCloudMigrationRunApiResponse = /** status 200 (empty) */ MigrateDataResponseDto; -export type GetCloudMigrationRunApiArg = { - /** RunUID of a migration run */ - runUid: string; -}; export type DeleteSessionApiResponse = unknown; export type DeleteSessionApiArg = { /** UID of a migration session */ @@ -57,18 +76,54 @@ export type GetSessionApiArg = { /** UID of a migration session */ uid: string; }; -export type GetCloudMigrationRunListApiResponse = /** status 200 (empty) */ SnapshotListDto; -export type GetCloudMigrationRunListApiArg = { - /** UID of a migration */ +export type CreateSnapshotApiResponse = /** status 200 (empty) */ CreateSnapshotResponseDto; +export type CreateSnapshotApiArg = { + /** UID of a session */ uid: string; }; -export type RunCloudMigrationApiResponse = /** status 200 (empty) */ MigrateDataResponseDto; -export type RunCloudMigrationApiArg = { - /** UID of a migration */ +export type GetSnapshotApiResponse = /** status 200 (empty) */ GetSnapshotResponseDto; +export type GetSnapshotApiArg = { + /** ResultPage is used for pagination with ResultLimit */ + resultPage?: number; + /** Max limit for snapshot results returned. */ + resultLimit?: number; + /** Session UID of a session */ + uid: string; + /** UID of a snapshot */ + snapshotUid: string; +}; +export type CancelSnapshotApiResponse = /** status 200 (empty) */ void; +export type CancelSnapshotApiArg = { + /** Session UID of a session */ + uid: string; + /** UID of a snapshot */ + snapshotUid: string; +}; +export type UploadSnapshotApiResponse = /** status 200 (empty) */ void; +export type UploadSnapshotApiArg = { + /** Session UID of a session */ + uid: string; + /** UID of a snapshot */ + snapshotUid: string; +}; +export type GetShapshotListApiResponse = /** status 200 (empty) */ SnapshotListResponseDto; +export type GetShapshotListApiArg = { + /** Page is used for pagination with limit */ + page?: number; + /** Max limit for results returned. */ + limit?: number; + /** Session UID of a session */ uid: string; }; +export type GetCloudMigrationTokenApiResponse = /** status 200 (empty) */ GetAccessTokenResponseDto; +export type GetCloudMigrationTokenApiArg = void; export type CreateCloudMigrationTokenApiResponse = /** status 200 (empty) */ CreateAccessTokenResponseDto; export type CreateCloudMigrationTokenApiArg = void; +export type DeleteCloudMigrationTokenApiResponse = /** status 204 (empty) */ void; +export type DeleteCloudMigrationTokenApiArg = { + /** UID of a cloud migration token */ + uid: string; +}; export type GetDashboardByUidApiResponse = /** status 200 (empty) */ DashboardFullWithMeta; export type GetDashboardByUidApiArg = { uid: string; @@ -95,21 +150,58 @@ export type ErrorResponseBody = { export type CloudMigrationSessionRequestDto = { authToken?: string; }; +export type CreateSnapshotResponseDto = { + uid?: string; +}; export type MigrateDataResponseItemDto = { error?: string; refId: string; - status: 'OK' | 'ERROR'; + status: 'OK' | 'ERROR' | 'PENDING' | 'UNKNOWN'; type: 'DASHBOARD' | 'DATASOURCE' | 'FOLDER'; }; -export type MigrateDataResponseDto = { - items?: MigrateDataResponseItemDto[]; +export type GetSnapshotResponseDto = { + created?: string; + finished?: string; + results?: MigrateDataResponseItemDto[]; + sessionUid?: string; + status?: + | 'INITIALIZING' + | 'CREATING' + | 'PENDING_UPLOAD' + | 'UPLOADING' + | 'PENDING_PROCESSING' + | 'PROCESSING' + | 'FINISHED' + | 'ERROR' + | 'UNKNOWN'; uid?: string; }; -export type MigrateDataResponseListDto = { +export type SnapshotDto = { + created?: string; + finished?: string; + sessionUid?: string; + status?: + | 'INITIALIZING' + | 'CREATING' + | 'PENDING_UPLOAD' + | 'UPLOADING' + | 'PENDING_PROCESSING' + | 'PROCESSING' + | 'FINISHED' + | 'ERROR' + | 'UNKNOWN'; uid?: string; }; -export type SnapshotListDto = { - runs?: MigrateDataResponseListDto[]; +export type SnapshotListResponseDto = { + snapshots?: SnapshotDto[]; +}; +export type GetAccessTokenResponseDto = { + createdAt?: string; + displayName?: string; + expiresAt?: string; + firstUsedAt?: string; + id?: string; + lastUsedAt?: string; }; export type CreateAccessTokenResponseDto = { token?: string; @@ -160,11 +252,15 @@ export type DashboardFullWithMeta = { export const { useGetSessionListQuery, useCreateSessionMutation, - useGetCloudMigrationRunQuery, useDeleteSessionMutation, useGetSessionQuery, - useGetCloudMigrationRunListQuery, - useRunCloudMigrationMutation, + useCreateSnapshotMutation, + useGetSnapshotQuery, + useCancelSnapshotMutation, + useUploadSnapshotMutation, + useGetShapshotListQuery, + useGetCloudMigrationTokenQuery, useCreateCloudMigrationTokenMutation, + useDeleteCloudMigrationTokenMutation, useGetDashboardByUidQuery, } = injectedRtkApi; diff --git a/public/app/features/migrate-to-cloud/api/index.ts b/public/app/features/migrate-to-cloud/api/index.ts index 696a5a8505b..6b05a867aef 100644 --- a/public/app/features/migrate-to-cloud/api/index.ts +++ b/public/app/features/migrate-to-cloud/api/index.ts @@ -4,42 +4,45 @@ import { BaseQueryFn, EndpointDefinition } from '@reduxjs/toolkit/dist/query'; import { generatedAPI } from './endpoints.gen'; export const cloudMigrationAPI = generatedAPI.enhanceEndpoints({ - addTagTypes: ['cloud-migration-config', 'cloud-migration-run', 'cloud-migration-run-list'], + addTagTypes: ['cloud-migration-session', 'cloud-migration-snapshot'], + endpoints: { // Cloud-side - create token createCloudMigrationToken: suppressErrorsOnQuery, // List Cloud Configs getSessionList: { - providesTags: ['cloud-migration-config'] /* should this be a -list? */, + providesTags: ['cloud-migration-session'] /* should this be a -list? */, }, // Create Cloud Config createSession(endpoint) { suppressErrorsOnQuery(endpoint); - endpoint.invalidatesTags = ['cloud-migration-config']; + endpoint.invalidatesTags = ['cloud-migration-session']; }, // Get one Cloud Config getSession: { - providesTags: ['cloud-migration-config'], + providesTags: ['cloud-migration-session'], }, // Delete one Cloud Config deleteSession: { - invalidatesTags: ['cloud-migration-config'], + invalidatesTags: ['cloud-migration-session', 'cloud-migration-snapshot'], }, - getCloudMigrationRunList: { - providesTags: ['cloud-migration-run-list'], + // Snapshot management + getSnapshot: { + providesTags: ['cloud-migration-snapshot'], }, - - getCloudMigrationRun: { - providesTags: ['cloud-migration-run'], + getShapshotList: { + providesTags: ['cloud-migration-snapshot'], }, - - runCloudMigration: { - invalidatesTags: ['cloud-migration-run-list'], + createSnapshot: { + invalidatesTags: ['cloud-migration-snapshot'], + }, + uploadSnapshot: { + invalidatesTags: ['cloud-migration-snapshot'], }, getDashboardByUid: suppressErrorsOnQuery, diff --git a/public/app/features/migrate-to-cloud/onprem/Page.tsx b/public/app/features/migrate-to-cloud/onprem/Page.tsx index c92a1de23c0..91b59f801a4 100644 --- a/public/app/features/migrate-to-cloud/onprem/Page.tsx +++ b/public/app/features/migrate-to-cloud/onprem/Page.tsx @@ -1,15 +1,17 @@ import { skipToken } from '@reduxjs/toolkit/query/react'; -import { useCallback, useState } from 'react'; +import { useCallback, useEffect, useState } from 'react'; import { Alert, Box, Button, Stack } from '@grafana/ui'; import { Trans, t } from 'app/core/internationalization'; import { + SnapshotDto, + useCreateSnapshotMutation, useDeleteSessionMutation, - useGetCloudMigrationRunListQuery, - useGetCloudMigrationRunQuery, useGetSessionListQuery, - useRunCloudMigrationMutation, + useGetShapshotListQuery, + useGetSnapshotQuery, + useUploadSnapshotMutation, } from '../api'; import { DisconnectModal } from './DisconnectModal'; @@ -32,7 +34,7 @@ import { ResourcesTable } from './ResourcesTable'; * 2. call GetCloudMigrationRun with the ID from first step to list the result of that migration */ -function useGetLatestMigrationDestination() { +function useGetLatestSession() { const result = useGetSessionListQuery(); const latestMigration = result.data?.sessions?.at(-1); @@ -42,64 +44,88 @@ function useGetLatestMigrationDestination() { }; } -function useGetLatestMigrationRun(migrationUid?: string) { - const listResult = useGetCloudMigrationRunListQuery(migrationUid ? { uid: migrationUid } : skipToken); - const latestMigrationRun = listResult.data?.runs?.at(-1); +const SHOULD_POLL_STATUSES: Array = [ + 'INITIALIZING', + 'CREATING', + 'UPLOADING', + 'PENDING_PROCESSING', + 'PROCESSING', +]; - const runResult = useGetCloudMigrationRunQuery( - latestMigrationRun?.uid && migrationUid ? { runUid: latestMigrationRun.uid } : skipToken - ); +const STATUS_POLL_INTERVAL = 5 * 1000; + +function useGetLatestSnapshot(sessionUid?: string) { + const [shouldPoll, setShouldPoll] = useState(false); + + const listResult = useGetShapshotListQuery(sessionUid ? { uid: sessionUid } : skipToken); + const lastItem = listResult.data?.snapshots?.at(-1); // TODO: account for pagination and ensure we're truely getting the last one + + const getSnapshotQueryArgs = sessionUid && lastItem?.uid ? { uid: sessionUid, snapshotUid: lastItem.uid } : skipToken; + + const snapshotResult = useGetSnapshotQuery(getSnapshotQueryArgs, { + pollingInterval: shouldPoll ? STATUS_POLL_INTERVAL : 0, + skipPollingIfUnfocused: true, + }); + + useEffect(() => { + const shouldPoll = SHOULD_POLL_STATUSES.includes(snapshotResult.data?.status); + setShouldPoll(shouldPoll); + }, [snapshotResult?.data?.status]); return { - ...runResult, + ...snapshotResult, - data: runResult.data, + error: listResult.error || snapshotResult.error, - error: listResult.error || runResult.error, - - isError: listResult.isError || runResult.isError, - isLoading: listResult.isLoading || runResult.isLoading, - isFetching: listResult.isFetching || runResult.isFetching, + // isSuccess and isUninitialised should always be from snapshotResult + // as only the 'final' values from those are important + isError: listResult.isError || snapshotResult.isError, + isLoading: listResult.isLoading || snapshotResult.isLoading, + isFetching: listResult.isFetching || snapshotResult.isFetching, }; } export const Page = () => { const [disconnectModalOpen, setDisconnectModalOpen] = useState(false); - const migrationDestination = useGetLatestMigrationDestination(); - const lastMigrationRun = useGetLatestMigrationRun(migrationDestination.data?.uid); - const [performRunMigration, runMigrationResult] = useRunCloudMigrationMutation(); + const session = useGetLatestSession(); + const snapshot = useGetLatestSnapshot(session.data?.uid); + const [performCreateSnapshot, createSnapshotResult] = useCreateSnapshotMutation(); + const [performUploadSnapshot, uploadSnapshotResult] = useUploadSnapshotMutation(); const [performDisconnect, disconnectResult] = useDeleteSessionMutation(); + const sessionUid = session.data?.uid; + const snapshotUid = snapshot.data?.uid; + const migrationMeta = session.data; + const isInitialLoading = session.isLoading; + // isBusy is not a loading state, but indicates that the system is doing *something* // and all buttons should be disabled const isBusy = - runMigrationResult.isLoading || - migrationDestination.isFetching || - lastMigrationRun.isFetching || + createSnapshotResult.isLoading || + uploadSnapshotResult.isLoading || + session.isLoading || + snapshot.isLoading || disconnectResult.isLoading; - const resources = lastMigrationRun.data?.items; - const migrationDestUID = migrationDestination.data?.uid; + const resources = snapshot.data?.results; const handleDisconnect = useCallback(async () => { - if (!migrationDestUID) { - return; + if (sessionUid) { + performDisconnect({ uid: sessionUid }); } + }, [performDisconnect, sessionUid]); - const resp = await performDisconnect({ uid: migrationDestUID }); - if (!('error' in resp)) { - setDisconnectModalOpen(false); + const handleCreateSnapshot = useCallback(() => { + if (sessionUid) { + performCreateSnapshot({ uid: sessionUid }); } - }, [migrationDestUID, performDisconnect]); + }, [performCreateSnapshot, sessionUid]); - const handleStartMigration = useCallback(() => { - if (migrationDestination.data?.uid) { - performRunMigration({ uid: migrationDestination.data?.uid }); + const handleUploadSnapshot = useCallback(() => { + if (sessionUid && snapshotUid) { + performUploadSnapshot({ uid: sessionUid, snapshotUid: snapshotUid }); } - }, [performRunMigration, migrationDestination]); - - const migrationMeta = migrationDestination.data; - const isInitialLoading = migrationDestination.isLoading; + }, [performUploadSnapshot, sessionUid, snapshotUid]); if (isInitialLoading) { // TODO: better loading state @@ -111,7 +137,7 @@ export const Page = () => { return ( <> - {runMigrationResult.isError && ( + {createSnapshotResult.isError && ( { } /> + + + + )} diff --git a/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/MetricsQueryEditor.tsx b/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/MetricsQueryEditor.tsx index a312c2ecddd..751392acf44 100644 --- a/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/MetricsQueryEditor.tsx +++ b/public/app/plugins/datasource/azuremonitor/components/MetricsQueryEditor/MetricsQueryEditor.tsx @@ -1,4 +1,4 @@ -import { PanelData } from '@grafana/data/src/types'; +import { PanelData } from '@grafana/data'; import { EditorRows, EditorRow, EditorFieldGroup } from '@grafana/experimental'; import { multiResourceCompatibleTypes } from '../../azureMetadata'; diff --git a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.tsx b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.tsx index 859031eec9a..d350e18bf66 100644 --- a/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.tsx +++ b/public/app/plugins/datasource/cloudwatch/components/QueryEditor/MetricsQueryEditor/SQLBuilderEditor/SQLBuilderSelectRow.tsx @@ -2,13 +2,15 @@ import { useEffect, useMemo } from 'react'; import { SelectableValue, toOption } from '@grafana/data'; import { EditorField, EditorFieldGroup, EditorSwitch } from '@grafana/experimental'; +import { config } from '@grafana/runtime'; import { Select } from '@grafana/ui'; import { CloudWatchDatasource } from '../../../../datasource'; -import { useDimensionKeys, useMetrics, useNamespaces } from '../../../../hooks'; +import { useAccountOptions, useDimensionKeys, useMetrics, useNamespaces } from '../../../../hooks'; import { STATISTICS } from '../../../../language/cloudwatch-sql/language'; import { CloudWatchMetricsQuery } from '../../../../types'; import { appendTemplateVariables } from '../../../../utils/utils'; +import { Account } from '../../../shared/Account'; import { getMetricNameFromExpression, @@ -48,13 +50,24 @@ const SQLBuilderSelectRow = ({ datasource, query, onQueryChange }: SQLBuilderSel const withSchemaEnabled = isUsingWithSchema(sql.from); const namespaceOptions = useNamespaces(datasource); - const metricOptions = useMetrics(datasource, { region: query.region, namespace }); + const metricOptions = useMetrics(datasource, { + region: query.region, + namespace, + ...(config.featureToggles.cloudWatchCrossAccountQuerying && + config.featureToggles.cloudwatchMetricInsightsCrossAccount + ? { accountId: query.accountId } + : {}), + }); const existingFilters = useMemo(() => stringArrayToDimensions(schemaLabels ?? []), [schemaLabels]); const unusedDimensionKeys = useDimensionKeys(datasource, { region: query.region, namespace, metricName, dimensionFilters: existingFilters, + ...(config.featureToggles.cloudWatchCrossAccountQuerying && + config.featureToggles.cloudwatchMetricInsightsCrossAccount + ? { accountId: query.accountId } + : {}), }); const dimensionKeys = useMemo( () => (schemaLabels?.length ? [...unusedDimensionKeys, ...schemaLabels.map(toOption)] : unusedDimensionKeys), @@ -76,9 +89,23 @@ const SQLBuilderSelectRow = ({ datasource, query, onQueryChange }: SQLBuilderSel return { ...query, sql }; }; + const accountState = useAccountOptions(datasource.resources, query.region); return ( <> + {config.featureToggles.cloudWatchCrossAccountQuerying && + config.featureToggles.cloudwatchMetricInsightsCrossAccount && ( + { + onQueryChange({ + ...query, + accountId, + }); + }} + /> + )} + + + + + + + ); +}; diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 92d54e9c3ae..b8fbb6294ff 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -61,6 +61,24 @@ "parse-mode-warning-body": "If you use a <1>parse_mode option other than <3>None, truncation may result in an invalid message, causing the notification to fail. For longer messages, we recommend using an alternative contact method.", "parse-mode-warning-title": "Telegram messages are limited to 4096 UTF-8 characters." } + }, + "policies": { + "metadata": { + "timingOptions": { + "groupInterval": { + "description": "How long to wait before sending a notification about new alerts that are added to a group of alerts for which an initial notification has already been sent.", + "label": "Wait <1> before sending updates" + }, + "groupWait": { + "description": "How long to initially wait to send a notification for a group of alert instances.", + "label": "Wait <1> to group instances" + }, + "repeatInterval": { + "description": "How often notifications are sent if the group of alerts has not changed since the last notification.", + "label": "Repeated every <1>" + } + } + } } }, "annotations": { @@ -446,6 +464,8 @@ "panel-options-graph-tooltip-description": "Controls tooltip and hover highlight behavior across different panels. Reload the dashboard for changes to take effect", "panel-options-graph-tooltip-label": "Graph tooltip", "panel-options-label": "Panel options", + "panels-preload-description": "When enabled all panels will start loading as soon as the dashboard has been loaded.", + "panels-preload-label": "Preload panels", "tags-label": "Tags", "title": "General", "title-label": "Title" @@ -968,8 +988,9 @@ "disconnect-error-title": "There was an error disconnecting", "run-migration-error-description": "See the Grafana server logs for more details", "run-migration-error-title": "There was an error migrating your resources", - "start-migration": "Upload everything", - "target-stack-title": "Uploading to" + "start-migration": "Build snapshot", + "target-stack-title": "Uploading to", + "upload-migration": "Upload & migrate snapshot" }, "token-status": { "active": "Token created and active", @@ -1635,7 +1656,7 @@ "restore-modal": { "restore-button": "Restore", "restore-loading": "Restoring...", - "text_one": "This action will restore {{numberOfDashboards}} dashboard.", + "text_one": "This action will restore {{numberOfDashboards}} dashboards.", "text_other": "This action will restore {{numberOfDashboards}} dashboards.", "title": "Restore Dashboards" } diff --git a/public/locales/pseudo-LOCALE/grafana.json b/public/locales/pseudo-LOCALE/grafana.json index 9a3df4cb747..da9480c587c 100644 --- a/public/locales/pseudo-LOCALE/grafana.json +++ b/public/locales/pseudo-LOCALE/grafana.json @@ -61,6 +61,24 @@ "parse-mode-warning-body": "Ĩƒ yőū ūşę ä <1>päřşę_mőđę őpŧįőʼn őŧĥęř ŧĥäʼn <3>Ńőʼnę, ŧřūʼnčäŧįőʼn mäy řęşūľŧ įʼn äʼn įʼnväľįđ męşşäģę, čäūşįʼnģ ŧĥę ʼnőŧįƒįčäŧįőʼn ŧő ƒäįľ. Főř ľőʼnģęř męşşäģęş, ŵę řęčőmmęʼnđ ūşįʼnģ äʼn äľŧęřʼnäŧįvę čőʼnŧäčŧ męŧĥőđ.", "parse-mode-warning-title": "Ŧęľęģřäm męşşäģęş äřę ľįmįŧęđ ŧő 4096 ŮŦF-8 čĥäřäčŧęřş." } + }, + "policies": { + "metadata": { + "timingOptions": { + "groupInterval": { + "description": "Ħőŵ ľőʼnģ ŧő ŵäįŧ þęƒőřę şęʼnđįʼnģ ä ʼnőŧįƒįčäŧįőʼn äþőūŧ ʼnęŵ äľęřŧş ŧĥäŧ äřę äđđęđ ŧő ä ģřőūp őƒ äľęřŧş ƒőř ŵĥįčĥ äʼn įʼnįŧįäľ ʼnőŧįƒįčäŧįőʼn ĥäş äľřęäđy þęęʼn şęʼnŧ.", + "label": "Ŵäįŧ <1> þęƒőřę şęʼnđįʼnģ ūpđäŧęş" + }, + "groupWait": { + "description": "Ħőŵ ľőʼnģ ŧő įʼnįŧįäľľy ŵäįŧ ŧő şęʼnđ ä ʼnőŧįƒįčäŧįőʼn ƒőř ä ģřőūp őƒ äľęřŧ įʼnşŧäʼnčęş.", + "label": "Ŵäįŧ <1> ŧő ģřőūp įʼnşŧäʼnčęş" + }, + "repeatInterval": { + "description": "Ħőŵ őƒŧęʼn ʼnőŧįƒįčäŧįőʼnş äřę şęʼnŧ įƒ ŧĥę ģřőūp őƒ äľęřŧş ĥäş ʼnőŧ čĥäʼnģęđ şįʼnčę ŧĥę ľäşŧ ʼnőŧįƒįčäŧįőʼn.", + "label": "Ŗępęäŧęđ ęvęřy <1>" + } + } + } } }, "annotations": { @@ -446,6 +464,8 @@ "panel-options-graph-tooltip-description": "Cőʼnŧřőľş ŧőőľŧįp äʼnđ ĥővęř ĥįģĥľįģĥŧ þęĥävįőř äčřőşş đįƒƒęřęʼnŧ päʼnęľş. Ŗęľőäđ ŧĥę đäşĥþőäřđ ƒőř čĥäʼnģęş ŧő ŧäĸę ęƒƒęčŧ", "panel-options-graph-tooltip-label": "Ğřäpĥ ŧőőľŧįp", "panel-options-label": "Päʼnęľ őpŧįőʼnş", + "panels-preload-description": "Ŵĥęʼn ęʼnäþľęđ äľľ päʼnęľş ŵįľľ şŧäřŧ ľőäđįʼnģ äş şőőʼn äş ŧĥę đäşĥþőäřđ ĥäş þęęʼn ľőäđęđ.", + "panels-preload-label": "Přęľőäđ päʼnęľş", "tags-label": "Ŧäģş", "title": "Ğęʼnęřäľ", "title-label": "Ŧįŧľę" @@ -968,8 +988,9 @@ "disconnect-error-title": "Ŧĥęřę ŵäş äʼn ęřřőř đįşčőʼnʼnęčŧįʼnģ", "run-migration-error-description": "Ŝęę ŧĥę Ğřäƒäʼnä şęřvęř ľőģş ƒőř mőřę đęŧäįľş", "run-migration-error-title": "Ŧĥęřę ŵäş äʼn ęřřőř mįģřäŧįʼnģ yőūř řęşőūřčęş", - "start-migration": "Ůpľőäđ ęvęřyŧĥįʼnģ", - "target-stack-title": "Ůpľőäđįʼnģ ŧő" + "start-migration": "ßūįľđ şʼnäpşĥőŧ", + "target-stack-title": "Ůpľőäđįʼnģ ŧő", + "upload-migration": "Ůpľőäđ & mįģřäŧę şʼnäpşĥőŧ" }, "token-status": { "active": "Ŧőĸęʼn čřęäŧęđ äʼnđ äčŧįvę", @@ -1635,7 +1656,7 @@ "restore-modal": { "restore-button": "Ŗęşŧőřę", "restore-loading": "Ŗęşŧőřįʼnģ...", - "text_one": "Ŧĥįş äčŧįőʼn ŵįľľ řęşŧőřę {{numberOfDashboards}} đäşĥþőäřđ.", + "text_one": "Ŧĥįş äčŧįőʼn ŵįľľ řęşŧőřę {{numberOfDashboards}} đäşĥþőäřđş.", "text_other": "Ŧĥįş äčŧįőʼn ŵįľľ řęşŧőřę {{numberOfDashboards}} đäşĥþőäřđş.", "title": "Ŗęşŧőřę Đäşĥþőäřđş" } diff --git a/public/openapi3.json b/public/openapi3.json index 715243edd83..46d1e24a1c3 100644 --- a/public/openapi3.json +++ b/public/openapi3.json @@ -7140,6 +7140,18 @@ }, "type": "object" }, + "NavbarPreference": { + "properties": { + "savedItemIds": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "title": "NavbarPreference defines model for NavbarPreference.", + "type": "object" + }, "NewApiKeyResult": { "properties": { "id": { @@ -7702,6 +7714,9 @@ "language": { "type": "string" }, + "navbar": { + "$ref": "#/components/schemas/NavbarPreference" + }, "queryHistory": { "$ref": "#/components/schemas/QueryHistoryPreference" }, @@ -8293,6 +8308,9 @@ "description": "Selected language (beta)", "type": "string" }, + "navbar": { + "$ref": "#/components/schemas/NavbarPreference" + }, "queryHistory": { "$ref": "#/components/schemas/QueryHistoryPreference" }, @@ -11543,6 +11561,9 @@ "language": { "type": "string" }, + "navbar": { + "$ref": "#/components/schemas/NavbarPreference" + }, "queryHistory": { "$ref": "#/components/schemas/QueryHistoryPreference" }, diff --git a/scripts/generate-rtk-apis.ts b/scripts/generate-rtk-apis.ts index af419895beb..72724c99a84 100644 --- a/scripts/generate-rtk-apis.ts +++ b/scripts/generate-rtk-apis.ts @@ -12,14 +12,21 @@ const config: ConfigFile = { apiFile: '../public/app/features/migrate-to-cloud/api/baseAPI.ts', apiImport: 'baseAPI', filterEndpoints: [ - 'createCloudMigrationToken', 'getSessionList', 'getSession', - 'createSession', 'deleteSession', - 'runCloudMigration', - 'getCloudMigrationRun', - 'getCloudMigrationRunList', + 'createSession', + + 'getShapshotList', + 'getSnapshot', + 'uploadSnapshot', + 'createSnapshot', + 'cancelSnapshot', + + 'createCloudMigrationToken', + 'deleteCloudMigrationToken', + 'getCloudMigrationToken', + 'getDashboardByUid', ], }, diff --git a/yarn.lock b/yarn.lock index 9b14c407e32..7b2268ecc40 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3126,13 +3126,13 @@ __metadata: linkType: soft "@grafana/e2e-selectors@npm:^11.0.0": - version: 11.0.0 - resolution: "@grafana/e2e-selectors@npm:11.0.0" + version: 11.1.0 + resolution: "@grafana/e2e-selectors@npm:11.1.0" dependencies: "@grafana/tsconfig": "npm:^1.3.0-rc1" - tslib: "npm:2.6.2" - typescript: "npm:5.3.3" - checksum: 10/0e327c5afc342bca9be46b0b3fb7b55d69e8b7b6e9912be3255ce52abcb8832265246a0e6b2f877112a752b6e44f6f7edf5c4d2a32b5edc84800d19c880dfc6c + tslib: "npm:2.6.3" + typescript: "npm:5.4.5" + checksum: 10/010a32e8b562d0da83b008646b9928a96a79957096eed713aa67b227d8ad6055d22cc0ec26f87fd9839cfb28344d0012f49c3c823defc6e91f4ab05ed7d8c465 languageName: node linkType: hard @@ -3580,9 +3580,9 @@ __metadata: languageName: unknown linkType: soft -"@grafana/scenes@npm:5.3.2": - version: 5.3.2 - resolution: "@grafana/scenes@npm:5.3.2" +"@grafana/scenes@npm:5.3.5": + version: 5.3.5 + resolution: "@grafana/scenes@npm:5.3.5" dependencies: "@grafana/e2e-selectors": "npm:^11.0.0" "@leeoniya/ufuzzy": "npm:^1.0.14" @@ -3597,7 +3597,7 @@ __metadata: "@grafana/ui": ^10.4.1 react: ^18.0.0 react-dom: ^18.0.0 - checksum: 10/90d2dd3b6daa293589a8933de8169d51814956ab4b425d2b5f750b3d504080944373345bce84e6a18a28260cc6fd9bf58c4e4046092a87d8ff0104b085f63e6d + checksum: 10/2ffbbda4a90e9b0f17c6a4d9b210b97321cc531427c1b11c75b32c72631c4122950bc310bb103cb29f17a50a98844fd91ae689872625614b0284befc61081eb5 languageName: node linkType: hard @@ -17145,7 +17145,7 @@ __metadata: "@grafana/prometheus": "workspace:*" "@grafana/runtime": "workspace:*" "@grafana/saga-icons": "workspace:*" - "@grafana/scenes": "npm:5.3.2" + "@grafana/scenes": "npm:5.3.5" "@grafana/schema": "workspace:*" "@grafana/sql": "workspace:*" "@grafana/tsconfig": "npm:^1.3.0-rc1" @@ -29432,13 +29432,6 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2.6.2": - version: 2.6.2 - resolution: "tslib@npm:2.6.2" - checksum: 10/bd26c22d36736513980091a1e356378e8b662ded04204453d353a7f34a4c21ed0afc59b5f90719d4ba756e581a162ecbf93118dc9c6be5acf70aa309188166ca - languageName: node - linkType: hard - "tslib@npm:2.6.3, tslib@npm:^2.0.0, tslib@npm:^2.0.1, tslib@npm:^2.0.3, tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.3.1, tslib@npm:^2.4.0, tslib@npm:^2.4.1, tslib@npm:^2.6.2": version: 2.6.3 resolution: "tslib@npm:2.6.3" @@ -29684,16 +29677,6 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5.3.3": - version: 5.3.3 - resolution: "typescript@npm:5.3.3" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10/6e4e6a14a50c222b3d14d4ea2f729e79f972fa536ac1522b91202a9a65af3605c2928c4a790a4a50aa13694d461c479ba92cedaeb1e7b190aadaa4e4b96b8e18 - languageName: node - linkType: hard - "typescript@npm:5.4.5, typescript@npm:>=2.7, typescript@npm:>=3 < 6, typescript@npm:^5.0.0, typescript@npm:^5.0.4, typescript@npm:^5.2.2": version: 5.4.5 resolution: "typescript@npm:5.4.5" @@ -29714,16 +29697,6 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.3.3#optional!builtin": - version: 5.3.3 - resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" - bin: - tsc: bin/tsc - tsserver: bin/tsserver - checksum: 10/c93786fcc9a70718ba1e3819bab56064ead5817004d1b8186f8ca66165f3a2d0100fee91fa64c840dcd45f994ca5d615d8e1f566d39a7470fc1e014dbb4cf15d - languageName: node - linkType: hard - "typescript@patch:typescript@npm%3A5.4.5#optional!builtin, typescript@patch:typescript@npm%3A>=2.7#optional!builtin, typescript@patch:typescript@npm%3A>=3 < 6#optional!builtin, typescript@patch:typescript@npm%3A^5.0.0#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin, typescript@patch:typescript@npm%3A^5.2.2#optional!builtin": version: 5.4.5 resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c"