mirror of https://github.com/grafana/grafana.git
				
				
				
			Create new query cache config app
This commit is contained in:
		
							parent
							
								
									6f70cf5e00
								
							
						
					
					
						commit
						f548a5914a
					
				|  | @ -0,0 +1,9 @@ | ||||||
|  | include ../sdk.mk | ||||||
|  | 
 | ||||||
|  | .PHONY: generate # Run Grafana App SDK code generation
 | ||||||
|  | generate: install-app-sdk update-app-sdk | ||||||
|  | 	@$(APP_SDK_BIN) generate \
 | ||||||
|  | 		--source=./kinds/ \
 | ||||||
|  | 		--gogenpath=./pkg/apis \
 | ||||||
|  | 		--grouping=group \
 | ||||||
|  | 		--defencoding=none | ||||||
|  | @ -0,0 +1,92 @@ | ||||||
|  | module github.com/grafana/grafana/apps/querycaching | ||||||
|  | 
 | ||||||
|  | go 1.24.0 | ||||||
|  | 
 | ||||||
|  | require ( | ||||||
|  | 	github.com/grafana/grafana-app-sdk v0.46.0 | ||||||
|  | 	github.com/grafana/grafana-app-sdk/logging v0.45.0 | ||||||
|  | 	k8s.io/apimachinery v0.34.1 | ||||||
|  | 	k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | require ( | ||||||
|  | 	github.com/beorn7/perks v1.0.1 // indirect | ||||||
|  | 	github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect | ||||||
|  | 	github.com/cenkalti/backoff/v5 v5.0.3 // indirect | ||||||
|  | 	github.com/cespare/xxhash/v2 v2.3.0 // indirect | ||||||
|  | 	github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect | ||||||
|  | 	github.com/emicklei/go-restful/v3 v3.13.0 // indirect | ||||||
|  | 	github.com/evanphx/json-patch v5.9.11+incompatible // indirect | ||||||
|  | 	github.com/fxamacker/cbor/v2 v2.9.0 // indirect | ||||||
|  | 	github.com/getkin/kin-openapi v0.133.0 // indirect | ||||||
|  | 	github.com/go-logr/logr v1.4.3 // indirect | ||||||
|  | 	github.com/go-logr/stdr v1.2.2 // indirect | ||||||
|  | 	github.com/go-openapi/jsonpointer v0.21.0 // indirect | ||||||
|  | 	github.com/go-openapi/jsonreference v0.21.0 // indirect | ||||||
|  | 	github.com/go-openapi/swag v0.23.0 // indirect | ||||||
|  | 	github.com/go-test/deep v1.1.1 // indirect | ||||||
|  | 	github.com/gogo/protobuf v1.3.2 // indirect | ||||||
|  | 	github.com/google/gnostic-models v0.7.0 // indirect | ||||||
|  | 	github.com/google/go-cmp v0.7.0 // indirect | ||||||
|  | 	github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 // indirect | ||||||
|  | 	github.com/google/uuid v1.6.0 // indirect | ||||||
|  | 	github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect | ||||||
|  | 	github.com/hashicorp/errwrap v1.1.0 // indirect | ||||||
|  | 	github.com/hashicorp/go-multierror v1.1.1 // indirect | ||||||
|  | 	github.com/josharian/intern v1.0.0 // indirect | ||||||
|  | 	github.com/json-iterator/go v1.1.12 // indirect | ||||||
|  | 	github.com/mailru/easyjson v0.9.0 // indirect | ||||||
|  | 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect | ||||||
|  | 	github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee // indirect | ||||||
|  | 	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect | ||||||
|  | 	github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect | ||||||
|  | 	github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 // indirect | ||||||
|  | 	github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 // indirect | ||||||
|  | 	github.com/onsi/ginkgo/v2 v2.22.2 // indirect | ||||||
|  | 	github.com/onsi/gomega v1.36.2 // indirect | ||||||
|  | 	github.com/perimeterx/marshmallow v1.1.5 // indirect | ||||||
|  | 	github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect | ||||||
|  | 	github.com/prometheus/client_golang v1.23.2 // indirect | ||||||
|  | 	github.com/prometheus/client_model v0.6.2 // indirect | ||||||
|  | 	github.com/prometheus/common v0.66.1 // indirect | ||||||
|  | 	github.com/prometheus/procfs v0.16.1 // indirect | ||||||
|  | 	github.com/puzpuzpuz/xsync/v2 v2.5.1 // indirect | ||||||
|  | 	github.com/rogpeppe/go-internal v1.14.1 // indirect | ||||||
|  | 	github.com/spf13/pflag v1.0.10 // indirect | ||||||
|  | 	github.com/woodsbury/decimal128 v1.3.0 // indirect | ||||||
|  | 	github.com/x448/float16 v0.8.4 // indirect | ||||||
|  | 	go.opentelemetry.io/auto/sdk v1.1.0 // indirect | ||||||
|  | 	go.opentelemetry.io/otel v1.38.0 // indirect | ||||||
|  | 	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect | ||||||
|  | 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 // indirect | ||||||
|  | 	go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect | ||||||
|  | 	go.opentelemetry.io/otel/metric v1.38.0 // indirect | ||||||
|  | 	go.opentelemetry.io/otel/sdk v1.38.0 // indirect | ||||||
|  | 	go.opentelemetry.io/otel/trace v1.38.0 // indirect | ||||||
|  | 	go.opentelemetry.io/proto/otlp v1.7.1 // indirect | ||||||
|  | 	go.yaml.in/yaml/v2 v2.4.2 // indirect | ||||||
|  | 	go.yaml.in/yaml/v3 v3.0.4 // indirect | ||||||
|  | 	golang.org/x/net v0.44.0 // indirect | ||||||
|  | 	golang.org/x/oauth2 v0.30.0 // indirect | ||||||
|  | 	golang.org/x/sync v0.17.0 // indirect | ||||||
|  | 	golang.org/x/sys v0.36.0 // indirect | ||||||
|  | 	golang.org/x/term v0.35.0 // indirect | ||||||
|  | 	golang.org/x/text v0.29.0 // indirect | ||||||
|  | 	golang.org/x/time v0.13.0 // indirect | ||||||
|  | 	gomodules.xyz/jsonpatch/v2 v2.5.0 // indirect | ||||||
|  | 	google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 // indirect | ||||||
|  | 	google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 // indirect | ||||||
|  | 	google.golang.org/grpc v1.75.1 // indirect | ||||||
|  | 	google.golang.org/protobuf v1.36.9 // indirect | ||||||
|  | 	gopkg.in/inf.v0 v0.9.1 // indirect | ||||||
|  | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
|  | 	k8s.io/api v0.34.1 // indirect | ||||||
|  | 	k8s.io/apiextensions-apiserver v0.34.1 // indirect | ||||||
|  | 	k8s.io/client-go v0.34.1 // indirect | ||||||
|  | 	k8s.io/klog/v2 v2.130.1 // indirect | ||||||
|  | 	k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 // indirect | ||||||
|  | 	sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 // indirect | ||||||
|  | 	sigs.k8s.io/randfill v1.0.0 // indirect | ||||||
|  | 	sigs.k8s.io/structured-merge-diff/v6 v6.3.0 // indirect | ||||||
|  | 	sigs.k8s.io/yaml v1.6.0 // indirect | ||||||
|  | ) | ||||||
|  | @ -0,0 +1,238 @@ | ||||||
|  | github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= | ||||||
|  | github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= | ||||||
|  | github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 h1:N7oVaKyGp8bttX0bfZGmcGkjz7DLQXhAn3DNd3T0ous= | ||||||
|  | github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874/go.mod h1:r5xuitiExdLAJ09PR7vBVENGvp4ZuTBeWTGtxuX3K+c= | ||||||
|  | github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM= | ||||||
|  | github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw= | ||||||
|  | github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs= | ||||||
|  | github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= | ||||||
|  | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= | ||||||
|  | github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
|  | github.com/emicklei/go-restful/v3 v3.13.0 h1:C4Bl2xDndpU6nJ4bc1jXd+uTmYPVUwkD6bFY/oTyCes= | ||||||
|  | github.com/emicklei/go-restful/v3 v3.13.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= | ||||||
|  | github.com/evanphx/json-patch v5.9.11+incompatible h1:ixHHqfcGvxhWkniF1tWxBHA0yb4Z+d1UQi45df52xW8= | ||||||
|  | github.com/evanphx/json-patch v5.9.11+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= | ||||||
|  | github.com/fxamacker/cbor/v2 v2.9.0 h1:NpKPmjDBgUfBms6tr6JZkTHtfFGcMKsw3eGcmD/sapM= | ||||||
|  | github.com/fxamacker/cbor/v2 v2.9.0/go.mod h1:vM4b+DJCtHn+zz7h3FFp/hDAI9WNWCsZj23V5ytsSxQ= | ||||||
|  | github.com/getkin/kin-openapi v0.133.0 h1:pJdmNohVIJ97r4AUFtEXRXwESr8b0bD721u/Tz6k8PQ= | ||||||
|  | github.com/getkin/kin-openapi v0.133.0/go.mod h1:boAciF6cXk5FhPqe/NQeBTeenbjqU4LhWBf09ILVvWE= | ||||||
|  | github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= | ||||||
|  | github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= | ||||||
|  | github.com/go-logr/logr v1.4.3/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= | ||||||
|  | github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= | ||||||
|  | github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= | ||||||
|  | github.com/go-openapi/jsonpointer v0.21.0 h1:YgdVicSA9vH5RiHs9TZW5oyafXZFc6+2Vc1rr/O9oNQ= | ||||||
|  | github.com/go-openapi/jsonpointer v0.21.0/go.mod h1:IUyH9l/+uyhIYQ/PXVA41Rexl+kOkAPDdXEYns6fzUY= | ||||||
|  | github.com/go-openapi/jsonreference v0.21.0 h1:Rs+Y7hSXT83Jacb7kFyjn4ijOuVGSvOdF2+tg1TRrwQ= | ||||||
|  | github.com/go-openapi/jsonreference v0.21.0/go.mod h1:LmZmgsrTkVg9LG4EaHeY8cBDslNPMo06cago5JNLkm4= | ||||||
|  | github.com/go-openapi/swag v0.23.0 h1:vsEVJDUo2hPJ2tu0/Xc+4noaxyEffXNIs3cOULZ+GrE= | ||||||
|  | github.com/go-openapi/swag v0.23.0/go.mod h1:esZ8ITTYEsH1V2trKHjAN8Ai7xHb8RV+YSZ577vPjgQ= | ||||||
|  | github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= | ||||||
|  | github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8= | ||||||
|  | github.com/go-test/deep v1.1.1 h1:0r/53hagsehfO4bzD2Pgr/+RgHqhmf+k1Bpse2cTu1U= | ||||||
|  | github.com/go-test/deep v1.1.1/go.mod h1:5C2ZWiW0ErCdrYzpqxLbTX7MG14M9iiw8DgHncVwcsE= | ||||||
|  | github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= | ||||||
|  | github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= | ||||||
|  | github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= | ||||||
|  | github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= | ||||||
|  | github.com/google/gnostic-models v0.7.0 h1:qwTtogB15McXDaNqTZdzPJRHvaVJlAl+HVQnLmJEJxo= | ||||||
|  | github.com/google/gnostic-models v0.7.0/go.mod h1:whL5G0m6dmc5cPxKc5bdKdEN3UjI7OUGxBlw57miDrQ= | ||||||
|  | github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= | ||||||
|  | github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= | ||||||
|  | github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= | ||||||
|  | github.com/google/pprof v0.0.0-20250403155104-27863c87afa6 h1:BHT72Gu3keYf3ZEu2J0b1vyeLSOYI8bm5wbJM/8yDe8= | ||||||
|  | github.com/google/pprof v0.0.0-20250403155104-27863c87afa6/go.mod h1:boTsfXsheKC2y+lKOCMpSfarhxDeIzfZG1jqGcPl3cA= | ||||||
|  | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= | ||||||
|  | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
|  | github.com/grafana/grafana-app-sdk v0.46.0 h1:gvzQvCQgZJ/73BfAcbDt/6TAMhnVikVPxZt/UwDl+oc= | ||||||
|  | github.com/grafana/grafana-app-sdk v0.46.0/go.mod h1:LCTrqR1SwBS13XGVYveBmM7giJDDjzuXK+M9VzPuPWc= | ||||||
|  | github.com/grafana/grafana-app-sdk/logging v0.45.0 h1:0SH6nYZpiLBZRwUq4J6+1vo8xuHKJjnO95/2pGOoA8w= | ||||||
|  | github.com/grafana/grafana-app-sdk/logging v0.45.0/go.mod h1:Gh/nBWnspK3oDNWtiM5qUF/fardHzOIEez+SPI3JeHA= | ||||||
|  | github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= | ||||||
|  | github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= | ||||||
|  | github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||||
|  | github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I= | ||||||
|  | github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= | ||||||
|  | github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo= | ||||||
|  | github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM= | ||||||
|  | github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= | ||||||
|  | github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= | ||||||
|  | github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= | ||||||
|  | github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= | ||||||
|  | github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= | ||||||
|  | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= | ||||||
|  | github.com/klauspost/compress v1.18.0 h1:c/Cqfb0r+Yi+JtIEq73FWXVkRonBlf0CRNYc8Zttxdo= | ||||||
|  | github.com/klauspost/compress v1.18.0/go.mod h1:2Pp+KzxcywXVXMr50+X0Q/Lsb43OQHYWRCY2AiWywWQ= | ||||||
|  | github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= | ||||||
|  | github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= | ||||||
|  | github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= | ||||||
|  | github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= | ||||||
|  | github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= | ||||||
|  | github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= | ||||||
|  | github.com/mailru/easyjson v0.9.0 h1:PrnmzHw7262yW8sTBwxi1PdJA3Iw/EKBa8psRf7d9a4= | ||||||
|  | github.com/mailru/easyjson v0.9.0/go.mod h1:1+xMtQp2MRNVL/V1bOzuP3aP8VNwRW55fQUto+XFtTU= | ||||||
|  | github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||||
|  | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= | ||||||
|  | github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= | ||||||
|  | github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | ||||||
|  | github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee h1:W5t00kpgFdJifH4BDsTlE89Zl93FEloxaWZfGcifgq8= | ||||||
|  | github.com/modern-go/reflect2 v1.0.3-0.20250322232337-35a7c28c31ee/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= | ||||||
|  | github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw= | ||||||
|  | github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= | ||||||
|  | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= | ||||||
|  | github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= | ||||||
|  | github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037 h1:G7ERwszslrBzRxj//JalHPu/3yz+De2J+4aLtSRlHiY= | ||||||
|  | github.com/oasdiff/yaml v0.0.0-20250309154309-f31be36b4037/go.mod h1:2bpvgLBZEtENV5scfDFEtB/5+1M4hkQhDQrccEJ/qGw= | ||||||
|  | github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90 h1:bQx3WeLcUWy+RletIKwUIt4x3t8n2SxavmoclizMb8c= | ||||||
|  | github.com/oasdiff/yaml3 v0.0.0-20250309153720-d2182401db90/go.mod h1:y5+oSEHCPT/DGrS++Wc/479ERge0zTFxaF8PbGKcg2o= | ||||||
|  | github.com/onsi/ginkgo/v2 v2.22.2 h1:/3X8Panh8/WwhU/3Ssa6rCKqPLuAkVY2I0RoyDLySlU= | ||||||
|  | github.com/onsi/ginkgo/v2 v2.22.2/go.mod h1:oeMosUL+8LtarXBHu/c0bx2D/K9zyQ6uX3cTyztHwsk= | ||||||
|  | github.com/onsi/gomega v1.36.2 h1:koNYke6TVk6ZmnyHrCXba/T/MoLBXFjeC1PtvYgw0A8= | ||||||
|  | github.com/onsi/gomega v1.36.2/go.mod h1:DdwyADRjrc825LhMEkD76cHR5+pUnjhUN8GlHlRPHzY= | ||||||
|  | github.com/perimeterx/marshmallow v1.1.5 h1:a2LALqQ1BlHM8PZblsDdidgv1mWi1DgC2UmX50IvK2s= | ||||||
|  | github.com/perimeterx/marshmallow v1.1.5/go.mod h1:dsXbUu8CRzfYP5a87xpp0xq9S3u0Vchtcl8we9tYaXw= | ||||||
|  | github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= | ||||||
|  | github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= | ||||||
|  | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
|  | github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= | ||||||
|  | github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
|  | github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o= | ||||||
|  | github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg= | ||||||
|  | github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk= | ||||||
|  | github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE= | ||||||
|  | github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs= | ||||||
|  | github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA= | ||||||
|  | github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg= | ||||||
|  | github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= | ||||||
|  | github.com/puzpuzpuz/xsync/v2 v2.5.1 h1:mVGYAvzDSu52+zaGyNjC+24Xw2bQi3kTr4QJ6N9pIIU= | ||||||
|  | github.com/puzpuzpuz/xsync/v2 v2.5.1/go.mod h1:gD2H2krq/w52MfPLE+Uy64TzJDVY7lP2znR9qmR35kU= | ||||||
|  | github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= | ||||||
|  | github.com/rogpeppe/go-internal v1.14.1/go.mod h1:MaRKkUm5W0goXpeCfT7UZI6fk/L7L7so1lCWt35ZSgc= | ||||||
|  | github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= | ||||||
|  | github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= | ||||||
|  | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
|  | github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= | ||||||
|  | github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= | ||||||
|  | github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= | ||||||
|  | github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= | ||||||
|  | github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= | ||||||
|  | github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= | ||||||
|  | github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= | ||||||
|  | github.com/woodsbury/decimal128 v1.3.0 h1:8pffMNWIlC0O5vbyHWFZAt5yWvWcrHA+3ovIIjVWss0= | ||||||
|  | github.com/woodsbury/decimal128 v1.3.0/go.mod h1:C5UTmyTjW3JftjUFzOVhC20BEQa2a4ZKOB5I6Zjb+ds= | ||||||
|  | github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= | ||||||
|  | github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= | ||||||
|  | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||||
|  | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= | ||||||
|  | go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA= | ||||||
|  | go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= | ||||||
|  | go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= | ||||||
|  | go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= | ||||||
|  | go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= | ||||||
|  | go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= | ||||||
|  | go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= | ||||||
|  | go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= | ||||||
|  | go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= | ||||||
|  | go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= | ||||||
|  | go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= | ||||||
|  | go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= | ||||||
|  | go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= | ||||||
|  | go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= | ||||||
|  | go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= | ||||||
|  | go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= | ||||||
|  | go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= | ||||||
|  | go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI= | ||||||
|  | go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU= | ||||||
|  | go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= | ||||||
|  | go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= | ||||||
|  | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||||
|  | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= | ||||||
|  | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
|  | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
|  | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
|  | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||||
|  | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||||
|  | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||||
|  | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= | ||||||
|  | golang.org/x/net v0.44.0 h1:evd8IRDyfNBMBTTY5XRF1vaZlD+EmWx6x8PkhR04H/I= | ||||||
|  | golang.org/x/net v0.44.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= | ||||||
|  | golang.org/x/oauth2 v0.30.0 h1:dnDm7JmhM45NNpd8FDDeLhK6FwqbOf4MLCM9zb1BOHI= | ||||||
|  | golang.org/x/oauth2 v0.30.0/go.mod h1:B++QgG3ZKulg6sRPGD/mqlHQs5rB3Ml9erfeDY7xKlU= | ||||||
|  | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
|  | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
|  | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
|  | golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= | ||||||
|  | golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= | ||||||
|  | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= | ||||||
|  | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
|  | golang.org/x/sys v0.36.0 h1:KVRy2GtZBrk1cBYA7MKu5bEZFxQk4NIDV6RLVcC8o0k= | ||||||
|  | golang.org/x/sys v0.36.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= | ||||||
|  | golang.org/x/term v0.35.0 h1:bZBVKBudEyhRcajGcNc3jIfWPqV4y/Kt2XcoigOWtDQ= | ||||||
|  | golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= | ||||||
|  | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
|  | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
|  | golang.org/x/text v0.29.0 h1:1neNs90w9YzJ9BocxfsQNHKuAT4pkghyXc4nhZ6sJvk= | ||||||
|  | golang.org/x/text v0.29.0/go.mod h1:7MhJOA9CD2qZyOKYazxdYMF85OwPdEr9jTtBpO7ydH4= | ||||||
|  | golang.org/x/time v0.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= | ||||||
|  | golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= | ||||||
|  | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
|  | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||||
|  | golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= | ||||||
|  | golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= | ||||||
|  | golang.org/x/tools v0.37.0 h1:DVSRzp7FwePZW356yEAChSdNcQo6Nsp+fex1SUW09lE= | ||||||
|  | golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= | ||||||
|  | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= | ||||||
|  | gomodules.xyz/jsonpatch/v2 v2.5.0 h1:JELs8RLM12qJGXU4u/TO3V25KW8GreMKl9pdkk14RM0= | ||||||
|  | gomodules.xyz/jsonpatch/v2 v2.5.0/go.mod h1:AH3dM2RI6uoBZxn3LVrfvJ3E0/9dG4cSrbuBJT4moAY= | ||||||
|  | gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= | ||||||
|  | gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= | ||||||
|  | google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090 h1:d8Nakh1G+ur7+P3GcMjpRDEkoLUcLW2iU92XVqR+XMQ= | ||||||
|  | google.golang.org/genproto/googleapis/api v0.0.0-20250908214217-97024824d090/go.mod h1:U8EXRNSd8sUYyDfs/It7KVWodQr+Hf9xtxyxWudSwEw= | ||||||
|  | google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090 h1:/OQuEa4YWtDt7uQWHd3q3sUMb+QOLQUg1xa8CEsRv5w= | ||||||
|  | google.golang.org/genproto/googleapis/rpc v0.0.0-20250908214217-97024824d090/go.mod h1:GmFNa4BdJZ2a8G+wCe9Bg3wwThLrJun751XstdJt5Og= | ||||||
|  | google.golang.org/grpc v1.75.1 h1:/ODCNEuf9VghjgO3rqLcfg8fiOP0nSluljWFlDxELLI= | ||||||
|  | google.golang.org/grpc v1.75.1/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ= | ||||||
|  | google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= | ||||||
|  | google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= | ||||||
|  | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= | ||||||
|  | gopkg.in/evanphx/json-patch.v4 v4.12.0 h1:n6jtcsulIzXPJaxegRbvFNNrZDjbij7ny3gmSPG+6V4= | ||||||
|  | gopkg.in/evanphx/json-patch.v4 v4.12.0/go.mod h1:p8EYWUEYMpynmqDbY58zCKCFZw8pRWMG4EsWvDvM72M= | ||||||
|  | gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= | ||||||
|  | gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= | ||||||
|  | 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/api v0.34.1 h1:jC+153630BMdlFukegoEL8E/yT7aLyQkIVuwhmwDgJM= | ||||||
|  | k8s.io/api v0.34.1/go.mod h1:SB80FxFtXn5/gwzCoN6QCtPD7Vbu5w2n1S0J5gFfTYk= | ||||||
|  | k8s.io/apiextensions-apiserver v0.34.1 h1:NNPBva8FNAPt1iSVwIE0FsdrVriRXMsaWFMqJbII2CI= | ||||||
|  | k8s.io/apiextensions-apiserver v0.34.1/go.mod h1:hP9Rld3zF5Ay2Of3BeEpLAToP+l4s5UlxiHfqRaRcMc= | ||||||
|  | k8s.io/apimachinery v0.34.1 h1:dTlxFls/eikpJxmAC7MVE8oOeP1zryV7iRyIjB0gky4= | ||||||
|  | k8s.io/apimachinery v0.34.1/go.mod h1:/GwIlEcWuTX9zKIg2mbw0LRFIsXwrfoVxn+ef0X13lw= | ||||||
|  | k8s.io/client-go v0.34.1 h1:ZUPJKgXsnKwVwmKKdPfw4tB58+7/Ik3CrjOEhsiZ7mY= | ||||||
|  | k8s.io/client-go v0.34.1/go.mod h1:kA8v0FP+tk6sZA0yKLRG67LWjqufAoSHA2xVGKw9Of8= | ||||||
|  | k8s.io/klog/v2 v2.130.1 h1:n9Xl7H1Xvksem4KFG4PYbdQCQxqc/tTUyrgXaOhHSzk= | ||||||
|  | k8s.io/klog/v2 v2.130.1/go.mod h1:3Jpz1GvMt720eyJH1ckRHK1EDfpxISzJ7I9OYgaDtPE= | ||||||
|  | k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b h1:MloQ9/bdJyIu9lb1PzujOPolHyvO06MXG5TUIj2mNAA= | ||||||
|  | k8s.io/kube-openapi v0.0.0-20250710124328-f3f2b991d03b/go.mod h1:UZ2yyWbFTpuhSbFhv24aGNOdoRdJZgsIObGBUaYVsts= | ||||||
|  | k8s.io/utils v0.0.0-20250604170112-4c0f3b243397 h1:hwvWFiBzdWw1FhfY1FooPn3kzWuJ8tmbZBHi4zVsl1Y= | ||||||
|  | k8s.io/utils v0.0.0-20250604170112-4c0f3b243397/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= | ||||||
|  | sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8 h1:gBQPwqORJ8d8/YNZWEjoZs7npUVDpVXUUOFfW6CgAqE= | ||||||
|  | sigs.k8s.io/json v0.0.0-20241014173422-cfa47c3a1cc8/go.mod h1:mdzfpAEoE6DHQEN0uh9ZbOCuHbLK5wOm7dK4ctXE9Tg= | ||||||
|  | sigs.k8s.io/randfill v1.0.0 h1:JfjMILfT8A6RbawdsK2JXGBR5AQVfd+9TbzrlneTyrU= | ||||||
|  | sigs.k8s.io/randfill v1.0.0/go.mod h1:XeLlZ/jmk4i1HRopwe7/aU3H5n1zNUcX6TM94b3QxOY= | ||||||
|  | sigs.k8s.io/structured-merge-diff/v6 v6.3.0 h1:jTijUJbW353oVOd9oTlifJqOGEkUw2jB/fXCbTiQEco= | ||||||
|  | sigs.k8s.io/structured-merge-diff/v6 v6.3.0/go.mod h1:M3W8sfWvn2HhQDIbGWj3S099YozAsymCo/wrT5ohRUE= | ||||||
|  | sigs.k8s.io/yaml v1.6.0 h1:G8fkbMSAFqgEFgh4b1wmtzDnioxFCUgTZhlbj5P9QYs= | ||||||
|  | sigs.k8s.io/yaml v1.6.0/go.mod h1:796bPqUfzR/0jLAl6XjHl3Ck7MiyVv8dbTdyT3/pMf4= | ||||||
|  | @ -0,0 +1,2 @@ | ||||||
|  | module: "github.com/grafana/grafana/apps/querycaching/kinds" | ||||||
|  | language: version: "v0.8.2" | ||||||
|  | @ -0,0 +1,68 @@ | ||||||
|  | package kinds | ||||||
|  | 
 | ||||||
|  | manifest: { | ||||||
|  | 	// appName is the unique name of your app. It is used to reference the app from other config objects, | ||||||
|  | 	// and to generate the group used by your app in the app platform API. | ||||||
|  | 	appName: "querycaching" | ||||||
|  | 	// groupOverride can be used to specify a non-appName-based API group. | ||||||
|  | 	// By default, an app's API group is LOWER(REPLACE(appName, '-', '')).ext.grafana.com, | ||||||
|  | 	// but there are cases where this needs to be changed. | ||||||
|  | 	// Keep in mind that changing this after an app is deployed can cause problems with clients and/or kind data. | ||||||
|  | 	// groupOverride: foo.ext.grafana.app | ||||||
|  | 	groupOverride: "querycaching.grafana.app" | ||||||
|  | 
 | ||||||
|  | 	// versions is a map of versions supported by your app. Version names should follow the format "v<integer>" or | ||||||
|  | 	// "v<integer>(alpha|beta)<integer>". Each version contains the kinds your app manages for that version. | ||||||
|  | 	// If your app needs access to kinds managed by another app, use permissions.accessKinds to allow your app access. | ||||||
|  | 	versions: { | ||||||
|  | 		"v1alpha1": v1alpha1 | ||||||
|  | 	} | ||||||
|  | 	// extraPermissions contains any additional permissions your app may require to function. | ||||||
|  | 	// Your app will always have all permissions for each kind it manages (the items defined in 'kinds'). | ||||||
|  | 	extraPermissions: { | ||||||
|  | 		// If your app needs access to additional kinds supplied by other apps, you can list them here | ||||||
|  | 		accessKinds: [ | ||||||
|  | 			// Here is an example for your app accessing the playlist kind for reads and watch | ||||||
|  | 			// { | ||||||
|  | 			//	group: "playlist.grafana.app" | ||||||
|  | 			//	resource: "playlists" | ||||||
|  | 			//	actions: ["get","list","watch"] | ||||||
|  | 			// } | ||||||
|  | 		] | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // v1alpha1 is the v1alpha1 version of the app's API. | ||||||
|  | // It includes kinds which the v1alpha1 API serves, and (future) custom routes served globally from the v1alpha1 version. | ||||||
|  | v1alpha1: { | ||||||
|  | 	// kinds is the list of kinds served by this version | ||||||
|  | 	kinds: [querycacheconfigv1alpha1] | ||||||
|  | 	// [OPTIONAL] | ||||||
|  | 	// served indicates whether this particular version is served by the API server. | ||||||
|  | 	// served should be set to false before a version is removed from the manifest entirely. | ||||||
|  | 	// served defaults to true if not present. | ||||||
|  | 	served: true | ||||||
|  | 	// [OPTIONAL] | ||||||
|  | 	// Codegen is a trait that tells the grafana-app-sdk, or other code generation tooling, how to process this kind. | ||||||
|  | 	// If not present, default values within the codegen trait are used. | ||||||
|  | 	// If you wish to specify codegen per-version, put this section in the version's object | ||||||
|  | 	// (for example, <no value>v1alpha1) instead. | ||||||
|  | 	codegen: { | ||||||
|  | 		// [OPTIONAL] | ||||||
|  | 		// ts contains TypeScript code generation properties for the kind | ||||||
|  | 		ts: { | ||||||
|  | 			// [OPTIONAL] | ||||||
|  | 			// enabled indicates whether the CLI should generate front-end TypeScript code for the kind. | ||||||
|  | 			// Defaults to true if not present. | ||||||
|  | 			enabled: true | ||||||
|  | 		} | ||||||
|  | 		// [OPTIONAL] | ||||||
|  | 		// go contains go code generation properties for the kind | ||||||
|  | 		go: { | ||||||
|  | 			// [OPTIONAL] | ||||||
|  | 			// enabled indicates whether the CLI should generate back-end go code for the kind. | ||||||
|  | 			// Defaults to true if not present. | ||||||
|  | 			enabled: true | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,19 @@ | ||||||
|  | package kinds | ||||||
|  | 
 | ||||||
|  | querycacheconfig: { | ||||||
|  | 	kind: "QueryCacheConfig" | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | querycacheconfigv1alpha1: querycacheconfig & { | ||||||
|  | 	schema: { | ||||||
|  | 		metadata: { | ||||||
|  | 			name: string | ||||||
|  | 		} | ||||||
|  | 		spec: { | ||||||
|  | 			use_default_ttl:  bool | ||||||
|  | 			ttl_ms:           int | ||||||
|  | 			ttl_resources_ms: int | ||||||
|  | 			enabled:          bool | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,18 @@ | ||||||
|  | package v1alpha1 | ||||||
|  | 
 | ||||||
|  | import "k8s.io/apimachinery/pkg/runtime/schema" | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	// APIGroup is the API group used by all kinds in this package
 | ||||||
|  | 	APIGroup = "querycaching.grafana.app" | ||||||
|  | 	// APIVersion is the API version used by all kinds in this package
 | ||||||
|  | 	APIVersion = "v1alpha1" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	// GroupVersion is a schema.GroupVersion consisting of the Group and Version constants for this package
 | ||||||
|  | 	GroupVersion = schema.GroupVersion{ | ||||||
|  | 		Group:   APIGroup, | ||||||
|  | 		Version: APIVersion, | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  | @ -0,0 +1,99 @@ | ||||||
|  | package v1alpha1 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 
 | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/resource" | ||||||
|  | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type QueryCacheConfigClient struct { | ||||||
|  | 	client *resource.TypedClient[*QueryCacheConfig, *QueryCacheConfigList] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewQueryCacheConfigClient(client resource.Client) *QueryCacheConfigClient { | ||||||
|  | 	return &QueryCacheConfigClient{ | ||||||
|  | 		client: resource.NewTypedClient[*QueryCacheConfig, *QueryCacheConfigList](client, QueryCacheConfigKind()), | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func NewQueryCacheConfigClientFromGenerator(generator resource.ClientGenerator) (*QueryCacheConfigClient, error) { | ||||||
|  | 	c, err := generator.ClientFor(QueryCacheConfigKind()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	return NewQueryCacheConfigClient(c), nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *QueryCacheConfigClient) Get(ctx context.Context, identifier resource.Identifier) (*QueryCacheConfig, error) { | ||||||
|  | 	return c.client.Get(ctx, identifier) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *QueryCacheConfigClient) List(ctx context.Context, namespace string, opts resource.ListOptions) (*QueryCacheConfigList, error) { | ||||||
|  | 	return c.client.List(ctx, namespace, opts) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *QueryCacheConfigClient) ListAll(ctx context.Context, namespace string, opts resource.ListOptions) (*QueryCacheConfigList, error) { | ||||||
|  | 	resp, err := c.client.List(ctx, namespace, resource.ListOptions{ | ||||||
|  | 		ResourceVersion: opts.ResourceVersion, | ||||||
|  | 		Limit:           opts.Limit, | ||||||
|  | 		LabelFilters:    opts.LabelFilters, | ||||||
|  | 		FieldSelectors:  opts.FieldSelectors, | ||||||
|  | 	}) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	for resp.GetContinue() != "" { | ||||||
|  | 		page, err := c.client.List(ctx, namespace, resource.ListOptions{ | ||||||
|  | 			Continue:        resp.GetContinue(), | ||||||
|  | 			ResourceVersion: opts.ResourceVersion, | ||||||
|  | 			Limit:           opts.Limit, | ||||||
|  | 			LabelFilters:    opts.LabelFilters, | ||||||
|  | 			FieldSelectors:  opts.FieldSelectors, | ||||||
|  | 		}) | ||||||
|  | 		if err != nil { | ||||||
|  | 			return nil, err | ||||||
|  | 		} | ||||||
|  | 		resp.SetContinue(page.GetContinue()) | ||||||
|  | 		resp.SetResourceVersion(page.GetResourceVersion()) | ||||||
|  | 		resp.SetItems(append(resp.GetItems(), page.GetItems()...)) | ||||||
|  | 	} | ||||||
|  | 	return resp, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *QueryCacheConfigClient) Create(ctx context.Context, obj *QueryCacheConfig, opts resource.CreateOptions) (*QueryCacheConfig, error) { | ||||||
|  | 	// Make sure apiVersion and kind are set
 | ||||||
|  | 	obj.APIVersion = GroupVersion.Identifier() | ||||||
|  | 	obj.Kind = QueryCacheConfigKind().Kind() | ||||||
|  | 	return c.client.Create(ctx, obj, opts) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *QueryCacheConfigClient) Update(ctx context.Context, obj *QueryCacheConfig, opts resource.UpdateOptions) (*QueryCacheConfig, error) { | ||||||
|  | 	return c.client.Update(ctx, obj, opts) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *QueryCacheConfigClient) Patch(ctx context.Context, identifier resource.Identifier, req resource.PatchRequest, opts resource.PatchOptions) (*QueryCacheConfig, error) { | ||||||
|  | 	return c.client.Patch(ctx, identifier, req, opts) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *QueryCacheConfigClient) UpdateStatus(ctx context.Context, identifier resource.Identifier, newStatus QueryCacheConfigStatus, opts resource.UpdateOptions) (*QueryCacheConfig, error) { | ||||||
|  | 	return c.client.Update(ctx, &QueryCacheConfig{ | ||||||
|  | 		TypeMeta: metav1.TypeMeta{ | ||||||
|  | 			Kind:       QueryCacheConfigKind().Kind(), | ||||||
|  | 			APIVersion: GroupVersion.Identifier(), | ||||||
|  | 		}, | ||||||
|  | 		ObjectMeta: metav1.ObjectMeta{ | ||||||
|  | 			ResourceVersion: opts.ResourceVersion, | ||||||
|  | 			Namespace:       identifier.Namespace, | ||||||
|  | 			Name:            identifier.Name, | ||||||
|  | 		}, | ||||||
|  | 		Status: newStatus, | ||||||
|  | 	}, resource.UpdateOptions{ | ||||||
|  | 		Subresource:     "status", | ||||||
|  | 		ResourceVersion: opts.ResourceVersion, | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (c *QueryCacheConfigClient) Delete(ctx context.Context, identifier resource.Identifier, opts resource.DeleteOptions) error { | ||||||
|  | 	return c.client.Delete(ctx, identifier, opts) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,28 @@ | ||||||
|  | //
 | ||||||
|  | // Code generated by grafana-app-sdk. DO NOT EDIT.
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | package v1alpha1 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"io" | ||||||
|  | 
 | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/resource" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // QueryCacheConfigJSONCodec is an implementation of resource.Codec for kubernetes JSON encoding
 | ||||||
|  | type QueryCacheConfigJSONCodec struct{} | ||||||
|  | 
 | ||||||
|  | // Read reads JSON-encoded bytes from `reader` and unmarshals them into `into`
 | ||||||
|  | func (*QueryCacheConfigJSONCodec) Read(reader io.Reader, into resource.Object) error { | ||||||
|  | 	return json.NewDecoder(reader).Decode(into) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Write writes JSON-encoded bytes into `writer` marshaled from `from`
 | ||||||
|  | func (*QueryCacheConfigJSONCodec) Write(writer io.Writer, from resource.Object) error { | ||||||
|  | 	return json.NewEncoder(writer).Encode(from) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Interface compliance checks
 | ||||||
|  | var _ resource.Codec = &QueryCacheConfigJSONCodec{} | ||||||
|  | @ -0,0 +1,36 @@ | ||||||
|  | // Code generated - EDITING IS FUTILE. DO NOT EDIT.
 | ||||||
|  | 
 | ||||||
|  | package v1alpha1 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	time "time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // metadata contains embedded CommonMetadata and can be extended with custom string fields
 | ||||||
|  | // TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
 | ||||||
|  | // without external reference as using the CommonMetadata reference breaks thema codegen.
 | ||||||
|  | type QueryCacheConfigMetadata struct { | ||||||
|  | 	// All extensions to this metadata need to have string values (for APIServer encoding-to-annotations purposes)
 | ||||||
|  | 	// Can't use this as it's not yet enforced CUE:
 | ||||||
|  | 	// ...string
 | ||||||
|  | 	// Have to do this gnarly regex instead
 | ||||||
|  | 	Name              string            `json:"name"` | ||||||
|  | 	UpdateTimestamp   time.Time         `json:"updateTimestamp"` | ||||||
|  | 	CreatedBy         string            `json:"createdBy"` | ||||||
|  | 	Uid               string            `json:"uid"` | ||||||
|  | 	CreationTimestamp time.Time         `json:"creationTimestamp"` | ||||||
|  | 	DeletionTimestamp *time.Time        `json:"deletionTimestamp,omitempty"` | ||||||
|  | 	Finalizers        []string          `json:"finalizers"` | ||||||
|  | 	ResourceVersion   string            `json:"resourceVersion"` | ||||||
|  | 	Generation        int64             `json:"generation"` | ||||||
|  | 	UpdatedBy         string            `json:"updatedBy"` | ||||||
|  | 	Labels            map[string]string `json:"labels"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewQueryCacheConfigMetadata creates a new QueryCacheConfigMetadata object.
 | ||||||
|  | func NewQueryCacheConfigMetadata() *QueryCacheConfigMetadata { | ||||||
|  | 	return &QueryCacheConfigMetadata{ | ||||||
|  | 		Finalizers: []string{}, | ||||||
|  | 		Labels:     map[string]string{}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,319 @@ | ||||||
|  | //
 | ||||||
|  | // Code generated by grafana-app-sdk. DO NOT EDIT.
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | package v1alpha1 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"fmt" | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/resource" | ||||||
|  | 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" | ||||||
|  | 	"k8s.io/apimachinery/pkg/runtime" | ||||||
|  | 	"k8s.io/apimachinery/pkg/runtime/schema" | ||||||
|  | 	"k8s.io/apimachinery/pkg/types" | ||||||
|  | 	"time" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // +k8s:openapi-gen=true
 | ||||||
|  | type QueryCacheConfig struct { | ||||||
|  | 	metav1.TypeMeta   `json:",inline" yaml:",inline"` | ||||||
|  | 	metav1.ObjectMeta `json:"metadata" yaml:"metadata"` | ||||||
|  | 
 | ||||||
|  | 	// Spec is the spec of the QueryCacheConfig
 | ||||||
|  | 	Spec QueryCacheConfigSpec `json:"spec" yaml:"spec"` | ||||||
|  | 
 | ||||||
|  | 	Status QueryCacheConfigStatus `json:"status" yaml:"status"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) GetSpec() any { | ||||||
|  | 	return o.Spec | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) SetSpec(spec any) error { | ||||||
|  | 	cast, ok := spec.(QueryCacheConfigSpec) | ||||||
|  | 	if !ok { | ||||||
|  | 		return fmt.Errorf("cannot set spec type %#v, not of type Spec", spec) | ||||||
|  | 	} | ||||||
|  | 	o.Spec = cast | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) GetSubresources() map[string]any { | ||||||
|  | 	return map[string]any{ | ||||||
|  | 		"status": o.Status, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) GetSubresource(name string) (any, bool) { | ||||||
|  | 	switch name { | ||||||
|  | 	case "status": | ||||||
|  | 		return o.Status, true | ||||||
|  | 	default: | ||||||
|  | 		return nil, false | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) SetSubresource(name string, value any) error { | ||||||
|  | 	switch name { | ||||||
|  | 	case "status": | ||||||
|  | 		cast, ok := value.(QueryCacheConfigStatus) | ||||||
|  | 		if !ok { | ||||||
|  | 			return fmt.Errorf("cannot set status type %#v, not of type QueryCacheConfigStatus", value) | ||||||
|  | 		} | ||||||
|  | 		o.Status = cast | ||||||
|  | 		return nil | ||||||
|  | 	default: | ||||||
|  | 		return fmt.Errorf("subresource '%s' does not exist", name) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) GetStaticMetadata() resource.StaticMetadata { | ||||||
|  | 	gvk := o.GroupVersionKind() | ||||||
|  | 	return resource.StaticMetadata{ | ||||||
|  | 		Name:      o.ObjectMeta.Name, | ||||||
|  | 		Namespace: o.ObjectMeta.Namespace, | ||||||
|  | 		Group:     gvk.Group, | ||||||
|  | 		Version:   gvk.Version, | ||||||
|  | 		Kind:      gvk.Kind, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) SetStaticMetadata(metadata resource.StaticMetadata) { | ||||||
|  | 	o.Name = metadata.Name | ||||||
|  | 	o.Namespace = metadata.Namespace | ||||||
|  | 	o.SetGroupVersionKind(schema.GroupVersionKind{ | ||||||
|  | 		Group:   metadata.Group, | ||||||
|  | 		Version: metadata.Version, | ||||||
|  | 		Kind:    metadata.Kind, | ||||||
|  | 	}) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) GetCommonMetadata() resource.CommonMetadata { | ||||||
|  | 	dt := o.DeletionTimestamp | ||||||
|  | 	var deletionTimestamp *time.Time | ||||||
|  | 	if dt != nil { | ||||||
|  | 		deletionTimestamp = &dt.Time | ||||||
|  | 	} | ||||||
|  | 	// Legacy ExtraFields support
 | ||||||
|  | 	extraFields := make(map[string]any) | ||||||
|  | 	if o.Annotations != nil { | ||||||
|  | 		extraFields["annotations"] = o.Annotations | ||||||
|  | 	} | ||||||
|  | 	if o.ManagedFields != nil { | ||||||
|  | 		extraFields["managedFields"] = o.ManagedFields | ||||||
|  | 	} | ||||||
|  | 	if o.OwnerReferences != nil { | ||||||
|  | 		extraFields["ownerReferences"] = o.OwnerReferences | ||||||
|  | 	} | ||||||
|  | 	return resource.CommonMetadata{ | ||||||
|  | 		UID:               string(o.UID), | ||||||
|  | 		ResourceVersion:   o.ResourceVersion, | ||||||
|  | 		Generation:        o.Generation, | ||||||
|  | 		Labels:            o.Labels, | ||||||
|  | 		CreationTimestamp: o.CreationTimestamp.Time, | ||||||
|  | 		DeletionTimestamp: deletionTimestamp, | ||||||
|  | 		Finalizers:        o.Finalizers, | ||||||
|  | 		UpdateTimestamp:   o.GetUpdateTimestamp(), | ||||||
|  | 		CreatedBy:         o.GetCreatedBy(), | ||||||
|  | 		UpdatedBy:         o.GetUpdatedBy(), | ||||||
|  | 		ExtraFields:       extraFields, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) SetCommonMetadata(metadata resource.CommonMetadata) { | ||||||
|  | 	o.UID = types.UID(metadata.UID) | ||||||
|  | 	o.ResourceVersion = metadata.ResourceVersion | ||||||
|  | 	o.Generation = metadata.Generation | ||||||
|  | 	o.Labels = metadata.Labels | ||||||
|  | 	o.CreationTimestamp = metav1.NewTime(metadata.CreationTimestamp) | ||||||
|  | 	if metadata.DeletionTimestamp != nil { | ||||||
|  | 		dt := metav1.NewTime(*metadata.DeletionTimestamp) | ||||||
|  | 		o.DeletionTimestamp = &dt | ||||||
|  | 	} else { | ||||||
|  | 		o.DeletionTimestamp = nil | ||||||
|  | 	} | ||||||
|  | 	o.Finalizers = metadata.Finalizers | ||||||
|  | 	if o.Annotations == nil { | ||||||
|  | 		o.Annotations = make(map[string]string) | ||||||
|  | 	} | ||||||
|  | 	if !metadata.UpdateTimestamp.IsZero() { | ||||||
|  | 		o.SetUpdateTimestamp(metadata.UpdateTimestamp) | ||||||
|  | 	} | ||||||
|  | 	if metadata.CreatedBy != "" { | ||||||
|  | 		o.SetCreatedBy(metadata.CreatedBy) | ||||||
|  | 	} | ||||||
|  | 	if metadata.UpdatedBy != "" { | ||||||
|  | 		o.SetUpdatedBy(metadata.UpdatedBy) | ||||||
|  | 	} | ||||||
|  | 	// Legacy support for setting Annotations, ManagedFields, and OwnerReferences via ExtraFields
 | ||||||
|  | 	if metadata.ExtraFields != nil { | ||||||
|  | 		if annotations, ok := metadata.ExtraFields["annotations"]; ok { | ||||||
|  | 			if cast, ok := annotations.(map[string]string); ok { | ||||||
|  | 				o.Annotations = cast | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if managedFields, ok := metadata.ExtraFields["managedFields"]; ok { | ||||||
|  | 			if cast, ok := managedFields.([]metav1.ManagedFieldsEntry); ok { | ||||||
|  | 				o.ManagedFields = cast | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		if ownerReferences, ok := metadata.ExtraFields["ownerReferences"]; ok { | ||||||
|  | 			if cast, ok := ownerReferences.([]metav1.OwnerReference); ok { | ||||||
|  | 				o.OwnerReferences = cast | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) GetCreatedBy() string { | ||||||
|  | 	if o.ObjectMeta.Annotations == nil { | ||||||
|  | 		o.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return o.ObjectMeta.Annotations["grafana.com/createdBy"] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) SetCreatedBy(createdBy string) { | ||||||
|  | 	if o.ObjectMeta.Annotations == nil { | ||||||
|  | 		o.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	o.ObjectMeta.Annotations["grafana.com/createdBy"] = createdBy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) GetUpdateTimestamp() time.Time { | ||||||
|  | 	if o.ObjectMeta.Annotations == nil { | ||||||
|  | 		o.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	parsed, _ := time.Parse(time.RFC3339, o.ObjectMeta.Annotations["grafana.com/updateTimestamp"]) | ||||||
|  | 	return parsed | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) SetUpdateTimestamp(updateTimestamp time.Time) { | ||||||
|  | 	if o.ObjectMeta.Annotations == nil { | ||||||
|  | 		o.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	o.ObjectMeta.Annotations["grafana.com/updateTimestamp"] = updateTimestamp.Format(time.RFC3339) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) GetUpdatedBy() string { | ||||||
|  | 	if o.ObjectMeta.Annotations == nil { | ||||||
|  | 		o.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return o.ObjectMeta.Annotations["grafana.com/updatedBy"] | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) SetUpdatedBy(updatedBy string) { | ||||||
|  | 	if o.ObjectMeta.Annotations == nil { | ||||||
|  | 		o.ObjectMeta.Annotations = make(map[string]string) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	o.ObjectMeta.Annotations["grafana.com/updatedBy"] = updatedBy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) Copy() resource.Object { | ||||||
|  | 	return resource.CopyObject(o) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) DeepCopyObject() runtime.Object { | ||||||
|  | 	return o.Copy() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) DeepCopy() *QueryCacheConfig { | ||||||
|  | 	cpy := &QueryCacheConfig{} | ||||||
|  | 	o.DeepCopyInto(cpy) | ||||||
|  | 	return cpy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfig) DeepCopyInto(dst *QueryCacheConfig) { | ||||||
|  | 	dst.TypeMeta.APIVersion = o.TypeMeta.APIVersion | ||||||
|  | 	dst.TypeMeta.Kind = o.TypeMeta.Kind | ||||||
|  | 	o.ObjectMeta.DeepCopyInto(&dst.ObjectMeta) | ||||||
|  | 	o.Spec.DeepCopyInto(&dst.Spec) | ||||||
|  | 	o.Status.DeepCopyInto(&dst.Status) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Interface compliance compile-time check
 | ||||||
|  | var _ resource.Object = &QueryCacheConfig{} | ||||||
|  | 
 | ||||||
|  | // +k8s:openapi-gen=true
 | ||||||
|  | type QueryCacheConfigList struct { | ||||||
|  | 	metav1.TypeMeta `json:",inline" yaml:",inline"` | ||||||
|  | 	metav1.ListMeta `json:"metadata" yaml:"metadata"` | ||||||
|  | 	Items           []QueryCacheConfig `json:"items" yaml:"items"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfigList) DeepCopyObject() runtime.Object { | ||||||
|  | 	return o.Copy() | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfigList) Copy() resource.ListObject { | ||||||
|  | 	cpy := &QueryCacheConfigList{ | ||||||
|  | 		TypeMeta: o.TypeMeta, | ||||||
|  | 		Items:    make([]QueryCacheConfig, len(o.Items)), | ||||||
|  | 	} | ||||||
|  | 	o.ListMeta.DeepCopyInto(&cpy.ListMeta) | ||||||
|  | 	for i := 0; i < len(o.Items); i++ { | ||||||
|  | 		if item, ok := o.Items[i].Copy().(*QueryCacheConfig); ok { | ||||||
|  | 			cpy.Items[i] = *item | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return cpy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfigList) GetItems() []resource.Object { | ||||||
|  | 	items := make([]resource.Object, len(o.Items)) | ||||||
|  | 	for i := 0; i < len(o.Items); i++ { | ||||||
|  | 		items[i] = &o.Items[i] | ||||||
|  | 	} | ||||||
|  | 	return items | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfigList) SetItems(items []resource.Object) { | ||||||
|  | 	o.Items = make([]QueryCacheConfig, len(items)) | ||||||
|  | 	for i := 0; i < len(items); i++ { | ||||||
|  | 		o.Items[i] = *items[i].(*QueryCacheConfig) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfigList) DeepCopy() *QueryCacheConfigList { | ||||||
|  | 	cpy := &QueryCacheConfigList{} | ||||||
|  | 	o.DeepCopyInto(cpy) | ||||||
|  | 	return cpy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (o *QueryCacheConfigList) DeepCopyInto(dst *QueryCacheConfigList) { | ||||||
|  | 	resource.CopyObjectInto(dst, o) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Interface compliance compile-time check
 | ||||||
|  | var _ resource.ListObject = &QueryCacheConfigList{} | ||||||
|  | 
 | ||||||
|  | // Copy methods for all subresource types
 | ||||||
|  | 
 | ||||||
|  | // DeepCopy creates a full deep copy of Spec
 | ||||||
|  | func (s *QueryCacheConfigSpec) DeepCopy() *QueryCacheConfigSpec { | ||||||
|  | 	cpy := &QueryCacheConfigSpec{} | ||||||
|  | 	s.DeepCopyInto(cpy) | ||||||
|  | 	return cpy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeepCopyInto deep copies Spec into another Spec object
 | ||||||
|  | func (s *QueryCacheConfigSpec) DeepCopyInto(dst *QueryCacheConfigSpec) { | ||||||
|  | 	resource.CopyObjectInto(dst, s) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeepCopy creates a full deep copy of QueryCacheConfigStatus
 | ||||||
|  | func (s *QueryCacheConfigStatus) DeepCopy() *QueryCacheConfigStatus { | ||||||
|  | 	cpy := &QueryCacheConfigStatus{} | ||||||
|  | 	s.DeepCopyInto(cpy) | ||||||
|  | 	return cpy | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // DeepCopyInto deep copies QueryCacheConfigStatus into another QueryCacheConfigStatus object
 | ||||||
|  | func (s *QueryCacheConfigStatus) DeepCopyInto(dst *QueryCacheConfigStatus) { | ||||||
|  | 	resource.CopyObjectInto(dst, s) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,34 @@ | ||||||
|  | //
 | ||||||
|  | // Code generated by grafana-app-sdk. DO NOT EDIT.
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | package v1alpha1 | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/resource" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // schema is unexported to prevent accidental overwrites
 | ||||||
|  | var ( | ||||||
|  | 	schemaQueryCacheConfig = resource.NewSimpleSchema("querycaching.grafana.app", "v1alpha1", &QueryCacheConfig{}, &QueryCacheConfigList{}, resource.WithKind("QueryCacheConfig"), | ||||||
|  | 		resource.WithPlural("querycacheconfigs"), resource.WithScope(resource.NamespacedScope)) | ||||||
|  | 	kindQueryCacheConfig = resource.Kind{ | ||||||
|  | 		Schema: schemaQueryCacheConfig, | ||||||
|  | 		Codecs: map[resource.KindEncoding]resource.Codec{ | ||||||
|  | 			resource.KindEncodingJSON: &QueryCacheConfigJSONCodec{}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | // Kind returns a resource.Kind for this Schema with a JSON codec
 | ||||||
|  | func QueryCacheConfigKind() resource.Kind { | ||||||
|  | 	return kindQueryCacheConfig | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Schema returns a resource.SimpleSchema representation of QueryCacheConfig
 | ||||||
|  | func QueryCacheConfigSchema() *resource.SimpleSchema { | ||||||
|  | 	return schemaQueryCacheConfig | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Interface compliance checks
 | ||||||
|  | var _ resource.Schema = kindQueryCacheConfig | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | // Code generated - EDITING IS FUTILE. DO NOT EDIT.
 | ||||||
|  | 
 | ||||||
|  | package v1alpha1 | ||||||
|  | 
 | ||||||
|  | // +k8s:openapi-gen=true
 | ||||||
|  | type QueryCacheConfigSpec struct { | ||||||
|  | 	UseDefaultTtl  bool  `json:"use_default_ttl"` | ||||||
|  | 	TtlMs          int64 `json:"ttl_ms"` | ||||||
|  | 	TtlResourcesMs int64 `json:"ttl_resources_ms"` | ||||||
|  | 	Enabled        bool  `json:"enabled"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewQueryCacheConfigSpec creates a new QueryCacheConfigSpec object.
 | ||||||
|  | func NewQueryCacheConfigSpec() *QueryCacheConfigSpec { | ||||||
|  | 	return &QueryCacheConfigSpec{} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,44 @@ | ||||||
|  | // Code generated - EDITING IS FUTILE. DO NOT EDIT.
 | ||||||
|  | 
 | ||||||
|  | package v1alpha1 | ||||||
|  | 
 | ||||||
|  | // +k8s:openapi-gen=true
 | ||||||
|  | type QueryCacheConfigstatusOperatorState struct { | ||||||
|  | 	// lastEvaluation is the ResourceVersion last evaluated
 | ||||||
|  | 	LastEvaluation string `json:"lastEvaluation"` | ||||||
|  | 	// state describes the state of the lastEvaluation.
 | ||||||
|  | 	// It is limited to three possible states for machine evaluation.
 | ||||||
|  | 	State QueryCacheConfigStatusOperatorStateState `json:"state"` | ||||||
|  | 	// descriptiveState is an optional more descriptive state field which has no requirements on format
 | ||||||
|  | 	DescriptiveState *string `json:"descriptiveState,omitempty"` | ||||||
|  | 	// details contains any extra information that is operator-specific
 | ||||||
|  | 	Details map[string]interface{} `json:"details,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewQueryCacheConfigstatusOperatorState creates a new QueryCacheConfigstatusOperatorState object.
 | ||||||
|  | func NewQueryCacheConfigstatusOperatorState() *QueryCacheConfigstatusOperatorState { | ||||||
|  | 	return &QueryCacheConfigstatusOperatorState{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // +k8s:openapi-gen=true
 | ||||||
|  | type QueryCacheConfigStatus struct { | ||||||
|  | 	// operatorStates is a map of operator ID to operator state evaluations.
 | ||||||
|  | 	// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
 | ||||||
|  | 	OperatorStates map[string]QueryCacheConfigstatusOperatorState `json:"operatorStates,omitempty"` | ||||||
|  | 	// additionalFields is reserved for future use
 | ||||||
|  | 	AdditionalFields map[string]interface{} `json:"additionalFields,omitempty"` | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // NewQueryCacheConfigStatus creates a new QueryCacheConfigStatus object.
 | ||||||
|  | func NewQueryCacheConfigStatus() *QueryCacheConfigStatus { | ||||||
|  | 	return &QueryCacheConfigStatus{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // +k8s:openapi-gen=true
 | ||||||
|  | type QueryCacheConfigStatusOperatorStateState string | ||||||
|  | 
 | ||||||
|  | const ( | ||||||
|  | 	QueryCacheConfigStatusOperatorStateStateSuccess    QueryCacheConfigStatusOperatorStateState = "success" | ||||||
|  | 	QueryCacheConfigStatusOperatorStateStateInProgress QueryCacheConfigStatusOperatorStateState = "in_progress" | ||||||
|  | 	QueryCacheConfigStatusOperatorStateStateFailed     QueryCacheConfigStatusOperatorStateState = "failed" | ||||||
|  | ) | ||||||
|  | @ -0,0 +1,122 @@ | ||||||
|  | //
 | ||||||
|  | // This file is generated by grafana-app-sdk
 | ||||||
|  | // DO NOT EDIT
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | package apis | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"encoding/json" | ||||||
|  | 	"fmt" | ||||||
|  | 	"strings" | ||||||
|  | 
 | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/app" | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/resource" | ||||||
|  | 	"k8s.io/apimachinery/pkg/runtime" | ||||||
|  | 	"k8s.io/kube-openapi/pkg/spec3" | ||||||
|  | 
 | ||||||
|  | 	v1alpha1 "github.com/grafana/grafana/apps/querycaching/pkg/apis/querycaching/v1alpha1" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	rawSchemaQueryCacheConfigv1alpha1     = []byte(`{"OperatorState":{"additionalProperties":false,"properties":{"descriptiveState":{"description":"descriptiveState is an optional more descriptive state field which has no requirements on format","type":"string"},"details":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"details contains any extra information that is operator-specific","type":"object"},"lastEvaluation":{"description":"lastEvaluation is the ResourceVersion last evaluated","type":"string"},"state":{"description":"state describes the state of the lastEvaluation.\nIt is limited to three possible states for machine evaluation.","enum":["success","in_progress","failed"],"type":"string"}},"required":["lastEvaluation","state"],"type":"object"},"QueryCacheConfig":{"properties":{"spec":{"$ref":"#/components/schemas/spec"},"status":{"$ref":"#/components/schemas/status"}},"required":["spec"]},"spec":{"additionalProperties":false,"properties":{"enabled":{"type":"boolean"},"ttl_ms":{"type":"integer"},"ttl_resources_ms":{"type":"integer"},"use_default_ttl":{"type":"boolean"}},"required":["use_default_ttl","ttl_ms","ttl_resources_ms","enabled"],"type":"object"},"status":{"additionalProperties":false,"properties":{"additionalFields":{"additionalProperties":{"additionalProperties":{},"type":"object"},"description":"additionalFields is reserved for future use","type":"object"},"operatorStates":{"additionalProperties":{"$ref":"#/components/schemas/OperatorState"},"description":"operatorStates is a map of operator ID to operator state evaluations.\nAny operator which consumes this kind SHOULD add its state evaluation information to this field.","type":"object"}},"type":"object"}}`) | ||||||
|  | 	versionSchemaQueryCacheConfigv1alpha1 app.VersionSchema | ||||||
|  | 	_                                     = json.Unmarshal(rawSchemaQueryCacheConfigv1alpha1, &versionSchemaQueryCacheConfigv1alpha1) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var appManifestData = app.ManifestData{ | ||||||
|  | 	AppName:          "querycaching", | ||||||
|  | 	Group:            "querycaching.grafana.app", | ||||||
|  | 	PreferredVersion: "v1alpha1", | ||||||
|  | 	Versions: []app.ManifestVersion{ | ||||||
|  | 		{ | ||||||
|  | 			Name:   "v1alpha1", | ||||||
|  | 			Served: true, | ||||||
|  | 			Kinds: []app.ManifestVersionKind{ | ||||||
|  | 				{ | ||||||
|  | 					Kind:       "QueryCacheConfig", | ||||||
|  | 					Plural:     "QueryCacheConfigs", | ||||||
|  | 					Scope:      "Namespaced", | ||||||
|  | 					Conversion: false, | ||||||
|  | 					Schema:     &versionSchemaQueryCacheConfigv1alpha1, | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 			Routes: app.ManifestVersionRoutes{ | ||||||
|  | 				Namespaced: map[string]spec3.PathProps{}, | ||||||
|  | 				Cluster:    map[string]spec3.PathProps{}, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 	}, | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func LocalManifest() app.Manifest { | ||||||
|  | 	return app.NewEmbeddedManifest(appManifestData) | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func RemoteManifest() app.Manifest { | ||||||
|  | 	return app.NewAPIServerManifest("querycaching") | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var kindVersionToGoType = map[string]resource.Kind{ | ||||||
|  | 	"QueryCacheConfig/v1alpha1": v1alpha1.QueryCacheConfigKind(), | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // ManifestGoTypeAssociator returns the associated resource.Kind instance for a given Kind and Version, if one exists.
 | ||||||
|  | // If there is no association for the provided Kind and Version, exists will return false.
 | ||||||
|  | func ManifestGoTypeAssociator(kind, version string) (goType resource.Kind, exists bool) { | ||||||
|  | 	goType, exists = kindVersionToGoType[fmt.Sprintf("%s/%s", kind, version)] | ||||||
|  | 	return goType, exists | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var customRouteToGoResponseType = map[string]any{} | ||||||
|  | 
 | ||||||
|  | // ManifestCustomRouteResponsesAssociator returns the associated response go type for a given kind, version, custom route path, and method, if one exists.
 | ||||||
|  | // kind may be empty for custom routes which are not kind subroutes. Leading slashes are removed from subroute paths.
 | ||||||
|  | // If there is no association for the provided kind, version, custom route path, and method, exists will return false.
 | ||||||
|  | // Resource routes (those without a kind) should prefix their route with "<namespace>/" if the route is namespaced (otherwise the route is assumed to be cluster-scope)
 | ||||||
|  | func ManifestCustomRouteResponsesAssociator(kind, version, path, verb string) (goType any, exists bool) { | ||||||
|  | 	if len(path) > 0 && path[0] == '/' { | ||||||
|  | 		path = path[1:] | ||||||
|  | 	} | ||||||
|  | 	goType, exists = customRouteToGoResponseType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))] | ||||||
|  | 	return goType, exists | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var customRouteToGoParamsType = map[string]runtime.Object{} | ||||||
|  | 
 | ||||||
|  | func ManifestCustomRouteQueryAssociator(kind, version, path, verb string) (goType runtime.Object, exists bool) { | ||||||
|  | 	if len(path) > 0 && path[0] == '/' { | ||||||
|  | 		path = path[1:] | ||||||
|  | 	} | ||||||
|  | 	goType, exists = customRouteToGoParamsType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))] | ||||||
|  | 	return goType, exists | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | var customRouteToGoRequestBodyType = map[string]any{} | ||||||
|  | 
 | ||||||
|  | func ManifestCustomRouteRequestBodyAssociator(kind, version, path, verb string) (goType any, exists bool) { | ||||||
|  | 	if len(path) > 0 && path[0] == '/' { | ||||||
|  | 		path = path[1:] | ||||||
|  | 	} | ||||||
|  | 	goType, exists = customRouteToGoRequestBodyType[fmt.Sprintf("%s|%s|%s|%s", version, kind, path, strings.ToUpper(verb))] | ||||||
|  | 	return goType, exists | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | type GoTypeAssociator struct{} | ||||||
|  | 
 | ||||||
|  | func NewGoTypeAssociator() *GoTypeAssociator { | ||||||
|  | 	return &GoTypeAssociator{} | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func (g *GoTypeAssociator) KindToGoType(kind, version string) (goType resource.Kind, exists bool) { | ||||||
|  | 	return ManifestGoTypeAssociator(kind, version) | ||||||
|  | } | ||||||
|  | func (g *GoTypeAssociator) CustomRouteReturnGoType(kind, version, path, verb string) (goType any, exists bool) { | ||||||
|  | 	return ManifestCustomRouteResponsesAssociator(kind, version, path, verb) | ||||||
|  | } | ||||||
|  | func (g *GoTypeAssociator) CustomRouteQueryGoType(kind, version, path, verb string) (goType runtime.Object, exists bool) { | ||||||
|  | 	return ManifestCustomRouteQueryAssociator(kind, version, path, verb) | ||||||
|  | } | ||||||
|  | func (g *GoTypeAssociator) CustomRouteRequestBodyGoType(kind, version, path, verb string) (goType any, exists bool) { | ||||||
|  | 	return ManifestCustomRouteRequestBodyAssociator(kind, version, path, verb) | ||||||
|  | } | ||||||
|  | @ -0,0 +1,55 @@ | ||||||
|  | package app | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  | 
 | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/app" | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/logging" | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/operator" | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/resource" | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/simple" | ||||||
|  | 
 | ||||||
|  | 	"k8s.io/apimachinery/pkg/runtime/schema" | ||||||
|  | 
 | ||||||
|  | 	querycachingv1alpha1 "github.com/grafana/grafana/apps/querycaching/pkg/apis/querycaching/v1alpha1" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | func New(cfg app.Config) (app.App, error) { | ||||||
|  | 	simpleConfig := simple.AppConfig{ | ||||||
|  | 		Name:       "correlation", | ||||||
|  | 		KubeConfig: cfg.KubeConfig, | ||||||
|  | 		InformerConfig: simple.AppInformerConfig{ | ||||||
|  | 			InformerOptions: operator.InformerOptions{ | ||||||
|  | 				ErrorHandler: func(ctx context.Context, err error) { | ||||||
|  | 					logging.FromContext(ctx).Error("Informer processing error", "error", err) | ||||||
|  | 				}, | ||||||
|  | 			}, | ||||||
|  | 		}, | ||||||
|  | 		ManagedKinds: []simple.AppManagedKind{{ | ||||||
|  | 			Kind: querycachingv1alpha1.QueryCacheConfigKind(), | ||||||
|  | 		}, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	a, err := simple.NewApp(simpleConfig) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	err = a.ValidateManifest(cfg.ManifestData) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	return a, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func GetKinds() map[schema.GroupVersion][]resource.Kind { | ||||||
|  | 	gv := schema.GroupVersion{ | ||||||
|  | 		Group:   querycachingv1alpha1.QueryCacheConfigKind().Group(), | ||||||
|  | 		Version: querycachingv1alpha1.QueryCacheConfigKind().Version(), | ||||||
|  | 	} | ||||||
|  | 	return map[schema.GroupVersion][]resource.Kind{ | ||||||
|  | 		gv: {querycachingv1alpha1.QueryCacheConfigKind()}, | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  | @ -0,0 +1,49 @@ | ||||||
|  | /* | ||||||
|  |  * This file was generated by grafana-app-sdk. DO NOT EDIT. | ||||||
|  |  */ | ||||||
|  | import { Spec } from './types.spec.gen'; | ||||||
|  | import { Status } from './types.status.gen'; | ||||||
|  | 
 | ||||||
|  | export interface Metadata { | ||||||
|  |     name: string; | ||||||
|  |     namespace: string; | ||||||
|  |     generateName?: string; | ||||||
|  |     selfLink?: string; | ||||||
|  |     uid?: string; | ||||||
|  |     resourceVersion?: string; | ||||||
|  |     generation?: number; | ||||||
|  |     creationTimestamp?: string; | ||||||
|  |     deletionTimestamp?: string; | ||||||
|  |     deletionGracePeriodSeconds?: number; | ||||||
|  |     labels?: Record<string, string>; | ||||||
|  |     annotations?: Record<string, string>; | ||||||
|  |     ownerReferences?: OwnerReference[]; | ||||||
|  |     finalizers?: string[]; | ||||||
|  |     managedFields?: ManagedFieldsEntry[]; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface OwnerReference { | ||||||
|  |     apiVersion: string; | ||||||
|  |     kind: string; | ||||||
|  |     name: string; | ||||||
|  |     uid: string; | ||||||
|  |     controller?: boolean; | ||||||
|  |     blockOwnerDeletion?: boolean; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface ManagedFieldsEntry { | ||||||
|  |     manager?: string; | ||||||
|  |     operation?: string; | ||||||
|  |     apiVersion?: string; | ||||||
|  |     time?: string; | ||||||
|  |     fieldsType?: string; | ||||||
|  |     subresource?: string; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export interface QueryCacheConfig { | ||||||
|  |     kind: string; | ||||||
|  |     apiVersion: string; | ||||||
|  |     metadata: Metadata; | ||||||
|  |     spec: Spec; | ||||||
|  |     status: Status; | ||||||
|  | } | ||||||
|  | @ -0,0 +1,36 @@ | ||||||
|  | // Code generated - EDITING IS FUTILE. DO NOT EDIT.
 | ||||||
|  | 
 | ||||||
|  | // metadata contains embedded CommonMetadata and can be extended with custom string fields
 | ||||||
|  | // TODO: use CommonMetadata instead of redefining here; currently needs to be defined here
 | ||||||
|  | // without external reference as using the CommonMetadata reference breaks thema codegen.
 | ||||||
|  | export interface Metadata { | ||||||
|  | 	// All extensions to this metadata need to have string values (for APIServer encoding-to-annotations purposes)
 | ||||||
|  | 	// Can't use this as it's not yet enforced CUE:
 | ||||||
|  | 	// ...string
 | ||||||
|  | 	// Have to do this gnarly regex instead
 | ||||||
|  | 	name: string; | ||||||
|  | 	updateTimestamp: string; | ||||||
|  | 	createdBy: string; | ||||||
|  | 	uid: string; | ||||||
|  | 	creationTimestamp: string; | ||||||
|  | 	deletionTimestamp?: string; | ||||||
|  | 	finalizers: string[]; | ||||||
|  | 	resourceVersion: string; | ||||||
|  | 	generation: number; | ||||||
|  | 	updatedBy: string; | ||||||
|  | 	labels: Record<string, string>; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export const defaultMetadata = (): Metadata => ({ | ||||||
|  | 	name: "", | ||||||
|  | 	updateTimestamp: "", | ||||||
|  | 	createdBy: "", | ||||||
|  | 	uid: "", | ||||||
|  | 	creationTimestamp: "", | ||||||
|  | 	finalizers: [], | ||||||
|  | 	resourceVersion: "", | ||||||
|  | 	generation: 0, | ||||||
|  | 	updatedBy: "", | ||||||
|  | 	labels: {}, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,16 @@ | ||||||
|  | // Code generated - EDITING IS FUTILE. DO NOT EDIT.
 | ||||||
|  | 
 | ||||||
|  | export interface Spec { | ||||||
|  | 	use_default_ttl: boolean; | ||||||
|  | 	ttl_ms: number; | ||||||
|  | 	ttl_resources_ms: number; | ||||||
|  | 	enabled: boolean; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export const defaultSpec = (): Spec => ({ | ||||||
|  | 	use_default_ttl: false, | ||||||
|  | 	ttl_ms: 0, | ||||||
|  | 	ttl_resources_ms: 0, | ||||||
|  | 	enabled: false, | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | @ -0,0 +1,30 @@ | ||||||
|  | // Code generated - EDITING IS FUTILE. DO NOT EDIT.
 | ||||||
|  | 
 | ||||||
|  | export interface OperatorState { | ||||||
|  | 	// lastEvaluation is the ResourceVersion last evaluated
 | ||||||
|  | 	lastEvaluation: string; | ||||||
|  | 	// state describes the state of the lastEvaluation.
 | ||||||
|  | 	// It is limited to three possible states for machine evaluation.
 | ||||||
|  | 	state: "success" | "in_progress" | "failed"; | ||||||
|  | 	// descriptiveState is an optional more descriptive state field which has no requirements on format
 | ||||||
|  | 	descriptiveState?: string; | ||||||
|  | 	// details contains any extra information that is operator-specific
 | ||||||
|  | 	details?: Record<string, any>; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export const defaultOperatorState = (): OperatorState => ({ | ||||||
|  | 	lastEvaluation: "", | ||||||
|  | 	state: "success", | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | export interface Status { | ||||||
|  | 	// operatorStates is a map of operator ID to operator state evaluations.
 | ||||||
|  | 	// Any operator which consumes this kind SHOULD add its state evaluation information to this field.
 | ||||||
|  | 	operatorStates?: Record<string, OperatorState>; | ||||||
|  | 	// additionalFields is reserved for future use
 | ||||||
|  | 	additionalFields?: Record<string, any>; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | export const defaultStatus = (): Status => ({ | ||||||
|  | }); | ||||||
|  | 
 | ||||||
							
								
								
									
										1
									
								
								go.work
								
								
								
								
							
							
						
						
									
										1
									
								
								go.work
								
								
								
								
							|  | @ -18,6 +18,7 @@ use ( | ||||||
| 	./apps/plugins | 	./apps/plugins | ||||||
| 	./apps/preferences | 	./apps/preferences | ||||||
| 	./apps/provisioning | 	./apps/provisioning | ||||||
|  | 	./apps/querycaching | ||||||
| 	./apps/scope | 	./apps/scope | ||||||
| 	./apps/secret | 	./apps/secret | ||||||
| 	./apps/shorturl | 	./apps/shorturl | ||||||
|  |  | ||||||
|  | @ -299,6 +299,10 @@ export interface FeatureToggles { | ||||||
|   */ |   */ | ||||||
|   kubernetesCorrelations?: boolean; |   kubernetesCorrelations?: boolean; | ||||||
|   /** |   /** | ||||||
|  |   * Adds support for Kubernetes querycaching | ||||||
|  |   */ | ||||||
|  |   kubernetesQueryCaching?: boolean; | ||||||
|  |   /** | ||||||
|   * Disable schema validation for dashboards/v1 |   * Disable schema validation for dashboards/v1 | ||||||
|   */ |   */ | ||||||
|   dashboardDisableSchemaValidationV1?: boolean; |   dashboardDisableSchemaValidationV1?: boolean; | ||||||
|  |  | ||||||
|  | @ -18,6 +18,7 @@ import ( | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/investigations" | 	"github.com/grafana/grafana/pkg/registry/apps/investigations" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/playlist" | 	"github.com/grafana/grafana/pkg/registry/apps/playlist" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/plugins" | 	"github.com/grafana/grafana/pkg/registry/apps/plugins" | ||||||
|  | 	"github.com/grafana/grafana/pkg/registry/apps/querycaching" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/shorturl" | 	"github.com/grafana/grafana/pkg/registry/apps/shorturl" | ||||||
| 	"github.com/grafana/grafana/pkg/services/apiserver" | 	"github.com/grafana/grafana/pkg/services/apiserver" | ||||||
| 	"github.com/grafana/grafana/pkg/services/apiserver/builder" | 	"github.com/grafana/grafana/pkg/services/apiserver/builder" | ||||||
|  | @ -36,6 +37,7 @@ func ProvideAppInstallers( | ||||||
| 	rulesAppInstaller *rules.AlertingRulesAppInstaller, | 	rulesAppInstaller *rules.AlertingRulesAppInstaller, | ||||||
| 	correlationsAppInstaller *correlations.CorrelationsAppInstaller, | 	correlationsAppInstaller *correlations.CorrelationsAppInstaller, | ||||||
| 	alertingNotificationAppInstaller *notifications.AlertingNotificationsAppInstaller, | 	alertingNotificationAppInstaller *notifications.AlertingNotificationsAppInstaller, | ||||||
|  | 	queryCachingAppInstaller *querycaching.QueryCachingAppInstaller, | ||||||
| ) []appsdkapiserver.AppInstaller { | ) []appsdkapiserver.AppInstaller { | ||||||
| 	installers := []appsdkapiserver.AppInstaller{ | 	installers := []appsdkapiserver.AppInstaller{ | ||||||
| 		playlistAppInstaller, | 		playlistAppInstaller, | ||||||
|  | @ -53,6 +55,9 @@ func ProvideAppInstallers( | ||||||
| 	if alertingNotificationAppInstaller != nil { | 	if alertingNotificationAppInstaller != nil { | ||||||
| 		installers = append(installers, alertingNotificationAppInstaller) | 		installers = append(installers, alertingNotificationAppInstaller) | ||||||
| 	} | 	} | ||||||
|  | 	if features.IsEnabledGlobally(featuremgmt.FlagKubernetesQueryCaching) { | ||||||
|  | 		installers = append(installers, queryCachingAppInstaller) | ||||||
|  | 	} | ||||||
| 	return installers | 	return installers | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -0,0 +1,44 @@ | ||||||
|  | package querycaching | ||||||
|  | 
 | ||||||
|  | import ( | ||||||
|  | 	restclient "k8s.io/client-go/rest" | ||||||
|  | 
 | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/app" | ||||||
|  | 	appsdkapiserver "github.com/grafana/grafana-app-sdk/k8s/apiserver" | ||||||
|  | 	"github.com/grafana/grafana-app-sdk/simple" | ||||||
|  | 	"github.com/grafana/grafana/apps/querycaching/pkg/apis" | ||||||
|  | 	querycachingapp "github.com/grafana/grafana/apps/querycaching/pkg/app" | ||||||
|  | 	"github.com/grafana/grafana/pkg/services/featuremgmt" | ||||||
|  | 	"github.com/grafana/grafana/pkg/setting" | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | var ( | ||||||
|  | 	_ appsdkapiserver.AppInstaller = (*QueryCachingAppInstaller)(nil) | ||||||
|  | ) | ||||||
|  | 
 | ||||||
|  | type QueryCachingAppInstaller struct { | ||||||
|  | 	appsdkapiserver.AppInstaller | ||||||
|  | 	cfg *setting.Cfg | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | func RegisterAppInstaller( | ||||||
|  | 	cfg *setting.Cfg, | ||||||
|  | 	features featuremgmt.FeatureToggles, | ||||||
|  | ) (*QueryCachingAppInstaller, error) { | ||||||
|  | 	installer := &QueryCachingAppInstaller{ | ||||||
|  | 		cfg: cfg, | ||||||
|  | 	} | ||||||
|  | 	provider := simple.NewAppProvider(apis.LocalManifest(), nil, querycachingapp.New) | ||||||
|  | 
 | ||||||
|  | 	appConfig := app.Config{ | ||||||
|  | 		KubeConfig:   restclient.Config{}, // this will be overridden by the installer's InitializeApp method
 | ||||||
|  | 		ManifestData: *apis.LocalManifest().ManifestData, | ||||||
|  | 	} | ||||||
|  | 	i, err := appsdkapiserver.NewDefaultAppInstaller(provider, appConfig, apis.NewGoTypeAssociator()) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	installer.AppInstaller = i | ||||||
|  | 
 | ||||||
|  | 	return installer, nil | ||||||
|  | } | ||||||
|  | @ -10,6 +10,7 @@ import ( | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/investigations" | 	"github.com/grafana/grafana/pkg/registry/apps/investigations" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/playlist" | 	"github.com/grafana/grafana/pkg/registry/apps/playlist" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/plugins" | 	"github.com/grafana/grafana/pkg/registry/apps/plugins" | ||||||
|  | 	"github.com/grafana/grafana/pkg/registry/apps/querycaching" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/shorturl" | 	"github.com/grafana/grafana/pkg/registry/apps/shorturl" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
|  | @ -24,4 +25,5 @@ var WireSet = wire.NewSet( | ||||||
| 	correlations.RegisterAppInstaller, | 	correlations.RegisterAppInstaller, | ||||||
| 	rules.RegisterAppInstaller, | 	rules.RegisterAppInstaller, | ||||||
| 	notifications.RegisterAppInstaller, | 	notifications.RegisterAppInstaller, | ||||||
|  | 	querycaching.RegisterAppInstaller, | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | @ -85,6 +85,7 @@ import ( | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/investigations" | 	"github.com/grafana/grafana/pkg/registry/apps/investigations" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/playlist" | 	"github.com/grafana/grafana/pkg/registry/apps/playlist" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/plugins" | 	"github.com/grafana/grafana/pkg/registry/apps/plugins" | ||||||
|  | 	"github.com/grafana/grafana/pkg/registry/apps/querycaching" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/apps/shorturl" | 	"github.com/grafana/grafana/pkg/registry/apps/shorturl" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/backgroundsvcs" | 	"github.com/grafana/grafana/pkg/registry/backgroundsvcs" | ||||||
| 	"github.com/grafana/grafana/pkg/registry/usagestatssvcs" | 	"github.com/grafana/grafana/pkg/registry/usagestatssvcs" | ||||||
|  | @ -768,7 +769,11 @@ func Initialize(ctx context.Context, cfg *setting.Cfg, opts Options, apiOpts api | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	v2 := appregistry.ProvideAppInstallers(featureToggles, playlistAppInstaller, pluginsAppInstaller, shortURLAppInstaller, alertingRulesAppInstaller, correlationsAppInstaller, alertingNotificationsAppInstaller) | 	queryCachingAppInstaller, err := querycaching.RegisterAppInstaller(cfg, featureToggles) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	v2 := appregistry.ProvideAppInstallers(featureToggles, playlistAppInstaller, pluginsAppInstaller, shortURLAppInstaller, alertingRulesAppInstaller, correlationsAppInstaller, alertingNotificationsAppInstaller, queryCachingAppInstaller) | ||||||
| 	builderMetrics := builder.ProvideBuilderMetrics(registerer) | 	builderMetrics := builder.ProvideBuilderMetrics(registerer) | ||||||
| 	apiserverService, err := apiserver.ProvideService(cfg, featureToggles, routeRegisterImpl, tracingService, serverLockService, sqlStore, kvStore, middlewareHandler, scopedPluginDatasourceProvider, plugincontextProvider, pluginstoreService, dualwriteService, resourceClient, inlineSecureValueSupport, eventualRestConfigProvider, v, eventualRestConfigProvider, registerer, aggregatorRunner, v2, builderMetrics) | 	apiserverService, err := apiserver.ProvideService(cfg, featureToggles, routeRegisterImpl, tracingService, serverLockService, sqlStore, kvStore, middlewareHandler, scopedPluginDatasourceProvider, plugincontextProvider, pluginstoreService, dualwriteService, resourceClient, inlineSecureValueSupport, eventualRestConfigProvider, v, eventualRestConfigProvider, registerer, aggregatorRunner, v2, builderMetrics) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  | @ -1372,7 +1377,11 @@ func InitializeForTest(ctx context.Context, t sqlutil.ITestDB, testingT interfac | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return nil, err | 		return nil, err | ||||||
| 	} | 	} | ||||||
| 	v2 := appregistry.ProvideAppInstallers(featureToggles, playlistAppInstaller, pluginsAppInstaller, shortURLAppInstaller, alertingRulesAppInstaller, correlationsAppInstaller, alertingNotificationsAppInstaller) | 	queryCachingAppInstaller, err := querycaching.RegisterAppInstaller(cfg, featureToggles) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return nil, err | ||||||
|  | 	} | ||||||
|  | 	v2 := appregistry.ProvideAppInstallers(featureToggles, playlistAppInstaller, pluginsAppInstaller, shortURLAppInstaller, alertingRulesAppInstaller, correlationsAppInstaller, alertingNotificationsAppInstaller, queryCachingAppInstaller) | ||||||
| 	builderMetrics := builder.ProvideBuilderMetrics(registerer) | 	builderMetrics := builder.ProvideBuilderMetrics(registerer) | ||||||
| 	apiserverService, err := apiserver.ProvideService(cfg, featureToggles, routeRegisterImpl, tracingService, serverLockService, sqlStore, kvStore, middlewareHandler, scopedPluginDatasourceProvider, plugincontextProvider, pluginstoreService, dualwriteService, resourceClient, inlineSecureValueSupport, eventualRestConfigProvider, v, eventualRestConfigProvider, registerer, aggregatorRunner, v2, builderMetrics) | 	apiserverService, err := apiserver.ProvideService(cfg, featureToggles, routeRegisterImpl, tracingService, serverLockService, sqlStore, kvStore, middlewareHandler, scopedPluginDatasourceProvider, plugincontextProvider, pluginstoreService, dualwriteService, resourceClient, inlineSecureValueSupport, eventualRestConfigProvider, v, eventualRestConfigProvider, registerer, aggregatorRunner, v2, builderMetrics) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
|  |  | ||||||
|  | @ -497,6 +497,13 @@ var ( | ||||||
| 			Owner:           grafanaDataProSquad, | 			Owner:           grafanaDataProSquad, | ||||||
| 			RequiresRestart: true, | 			RequiresRestart: true, | ||||||
| 		}, | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Name:            "kubernetesQueryCaching", | ||||||
|  | 			Description:     "Adds support for Kubernetes querycaching", | ||||||
|  | 			Stage:           FeatureStageExperimental, | ||||||
|  | 			Owner:           grafanaOperatorExperienceSquad, | ||||||
|  | 			RequiresRestart: true, | ||||||
|  | 		}, | ||||||
| 		{ | 		{ | ||||||
| 			Name:        "dashboardDisableSchemaValidationV1", | 			Name:        "dashboardDisableSchemaValidationV1", | ||||||
| 			Description: "Disable schema validation for dashboards/v1", | 			Description: "Disable schema validation for dashboards/v1", | ||||||
|  |  | ||||||
|  | @ -64,6 +64,7 @@ kubernetesShortURLs,experimental,@grafana/grafana-app-platform-squad,false,true, | ||||||
| useKubernetesShortURLsAPI,experimental,@grafana/sharing-squad,false,false,true | useKubernetesShortURLsAPI,experimental,@grafana/sharing-squad,false,false,true | ||||||
| kubernetesAlertingRules,experimental,@grafana/alerting-squad,false,true,false | kubernetesAlertingRules,experimental,@grafana/alerting-squad,false,true,false | ||||||
| kubernetesCorrelations,experimental,@grafana/datapro,false,true,false | kubernetesCorrelations,experimental,@grafana/datapro,false,true,false | ||||||
|  | kubernetesQueryCaching,experimental,@grafana/grafana-operator-experience-squad,false,true,false | ||||||
| dashboardDisableSchemaValidationV1,experimental,@grafana/grafana-app-platform-squad,false,false,false | dashboardDisableSchemaValidationV1,experimental,@grafana/grafana-app-platform-squad,false,false,false | ||||||
| dashboardDisableSchemaValidationV2,experimental,@grafana/grafana-app-platform-squad,false,false,false | dashboardDisableSchemaValidationV2,experimental,@grafana/grafana-app-platform-squad,false,false,false | ||||||
| dashboardSchemaValidationLogging,experimental,@grafana/grafana-app-platform-squad,false,false,false | dashboardSchemaValidationLogging,experimental,@grafana/grafana-app-platform-squad,false,false,false | ||||||
|  |  | ||||||
| 
 | 
|  | @ -267,6 +267,10 @@ const ( | ||||||
| 	// Adds support for Kubernetes correlations
 | 	// Adds support for Kubernetes correlations
 | ||||||
| 	FlagKubernetesCorrelations = "kubernetesCorrelations" | 	FlagKubernetesCorrelations = "kubernetesCorrelations" | ||||||
| 
 | 
 | ||||||
|  | 	// FlagKubernetesQueryCaching
 | ||||||
|  | 	// Adds support for Kubernetes querycaching
 | ||||||
|  | 	FlagKubernetesQueryCaching = "kubernetesQueryCaching" | ||||||
|  | 
 | ||||||
| 	// FlagDashboardDisableSchemaValidationV1
 | 	// FlagDashboardDisableSchemaValidationV1
 | ||||||
| 	// Disable schema validation for dashboards/v1
 | 	// Disable schema validation for dashboards/v1
 | ||||||
| 	FlagDashboardDisableSchemaValidationV1 = "dashboardDisableSchemaValidationV1" | 	FlagDashboardDisableSchemaValidationV1 = "dashboardDisableSchemaValidationV1" | ||||||
|  |  | ||||||
|  | @ -2212,6 +2212,19 @@ | ||||||
|         "requiresRestart": true |         "requiresRestart": true | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "metadata": { | ||||||
|  |         "name": "kubernetesQueryCaching", | ||||||
|  |         "resourceVersion": "1759871513704", | ||||||
|  |         "creationTimestamp": "2025-10-07T21:11:53Z" | ||||||
|  |       }, | ||||||
|  |       "spec": { | ||||||
|  |         "description": "Adds support for Kubernetes querycaching", | ||||||
|  |         "stage": "experimental", | ||||||
|  |         "codeowner": "@grafana/grafana-operator-experience-squad", | ||||||
|  |         "requiresRestart": true | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "metadata": { |       "metadata": { | ||||||
|         "name": "kubernetesShortURLs", |         "name": "kubernetesShortURLs", | ||||||
|  |  | ||||||
		Loading…
	
		Reference in New Issue