From a3a2543b28506113e898d364b687e861d9ea58f6 Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Wed, 20 May 2026 13:28:53 +0200 Subject: [PATCH 01/10] upgrade CI and dependencies, migrate e2e tests to testcontainers Signed-off-by: Artem Torubarov --- .github/workflows/test.yml | 27 +- .gitignore | 5 +- .gitmodules | 5 + .golangci.yml | 53 + CLAUDE.md | 95 + Dockerfile | 2 +- Makefile | 35 + README.md | 26 +- api/buf.gen.yaml | 10 +- api/gen/grpc/go/auth.pb.go | 283 +- api/gen/grpc/go/auth.pb.gw.go | 9 + api/gen/grpc/go/auth_grpc.pb.go | 10 +- api/gen/grpc/go/cluster.pb.go | 686 +-- api/gen/grpc/go/cluster.pb.gw.go | 30 +- api/gen/grpc/go/cluster_grpc.pb.go | 20 +- api/gen/grpc/go/crush_rule.pb.go | 330 +- api/gen/grpc/go/crush_rule.pb.gw.go | 15 +- api/gen/grpc/go/crush_rule_grpc.pb.go | 12 +- api/gen/grpc/go/status.pb.go | 5023 +++++++--------------- api/gen/grpc/go/status.pb.gw.go | 12 + api/gen/grpc/go/status_grpc.pb.go | 14 +- api/gen/grpc/go/users.pb.go | 505 +-- api/gen/grpc/go/users.pb.gw.go | 42 +- api/gen/grpc/go/users_grpc.pb.go | 28 +- api/openapi/ceph-api.swagger.json | 3683 ++++------------ docker-compose-test.yaml | 53 - go.mod | 344 +- go.sum | 791 +++- pkg/app/rados_conn.go | 2 +- pkg/app/rados_conn_mock.go | 2 +- pkg/app/start_test.go | 2 +- pkg/rados/production_conn.go | 2 +- pkg/rados/rados_mock.go | 2 +- pkg/rados/rados_mock_test.go | 2 +- pkg/types/ceph_errors.go | 2 +- pkg/types/ceph_errors_mock.go | 2 +- test/.dockerignore | 23 - test/Dockerfile | 34 +- test/auth_test.go | 2 + test/cluster_api_test.go | 2 + test/crush_rule_api_test.go | 2 + test/main_test.go | 29 + test/{init_test.go => setup_cgo_test.go} | 60 +- test/setup_nocgo_test.go | 12 + test/status_test.go | 3 +- test/testenv/ceph.go | 388 ++ test/testenv/tid.go | 203 + test/users_api_test.go | 2 + third_party/ceph | 1 + 49 files changed, 5211 insertions(+), 7714 deletions(-) create mode 100644 .gitmodules create mode 100644 .golangci.yml create mode 100644 CLAUDE.md create mode 100644 Makefile delete mode 100644 docker-compose-test.yaml delete mode 100644 test/.dockerignore create mode 100644 test/main_test.go rename test/{init_test.go => setup_cgo_test.go} (63%) create mode 100644 test/setup_nocgo_test.go create mode 100644 test/testenv/ceph.go create mode 100644 test/testenv/tid.go create mode 160000 third_party/ceph diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 0d22192..4ef6919 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -15,8 +15,27 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: KengoTODA/actions-setup-docker-compose@v1 + - name: Set up Go + uses: actions/setup-go@v4 with: - version: "2.14.2" - - name: Test - run: CEPH_DEMO_TAG=main-985bb830-main-centos-stream8-x86_64 docker-compose -f "docker-compose-test.yaml" up --build --exit-code-from api-test + go-version-file: go.mod + - name: make check + run: make check + - name: Check for fmt drift + run: | + if [[ -n "$(git status --porcelain)" ]]; then + echo "::error::make check produced uncommitted changes (likely go fmt): $(git status --porcelain)" + exit 1 + fi + - name: make lint + run: make lint + - name: make proto + run: make proto + - name: Check for proto drift + run: | + if [[ -n "$(git status --porcelain)" ]]; then + echo "::error::make proto produced uncommitted changes: $(git status --porcelain)" + exit 1 + fi + - name: make e2e-test + run: make e2e-test diff --git a/.gitignore b/.gitignore index 04b43e0..92b433a 100644 --- a/.gitignore +++ b/.gitignore @@ -27,7 +27,10 @@ __debug_bin fa-notes.md /tmp + changes.patch logs.txt -*.local \ No newline at end of file +*.local + +/ceph-api \ No newline at end of file diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d26cf6a --- /dev/null +++ b/.gitmodules @@ -0,0 +1,5 @@ +[submodule "third_party/ceph"] + path = third_party/ceph + url = https://github.com/ceph/ceph + update = none + shallow = true diff --git a/.golangci.yml b/.golangci.yml new file mode 100644 index 0000000..e7f1e57 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,53 @@ +version: "2" +run: + go: "1.25" + tests: true +linters: + default: none + enable: + - asasalint + - asciicheck + - copyloopvar + - durationcheck + - errcheck + - errchkjson + - errorlint + - gocritic + - govet + - ineffassign + - makezero + - nolintlint + - prealloc + - revive + - staticcheck + - unused + settings: + gocritic: + disabled-checks: + - captLocal + - commentFormatting + nolintlint: + require-explanation: true + revive: + rules: + - name: var-naming + disabled: true + exclusions: + generated: lax + presets: + - comments + - common-false-positives + - legacy + paths: + - api/gen + - api/openapi + - third_party + - examples +formatters: + exclusions: + generated: lax + paths: + - api/gen + - api/openapi + - third_party + - examples diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..ceaaa29 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,95 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## What this is + +Ceph API is a standalone Go service that exposes REST + gRPC APIs for administrating a Ceph cluster, as an alternative to the Ceph mgr RESTful module. It connects to a Ceph cluster over RADOS (rados user, keyring, mon host) using `github.com/ceph/go-ceph`, so it can run anywhere with `mon` reachability. + +## Build & run + +The binary requires CGO and the Ceph client libraries (`librados`, `librbd`, `libcephfs`) on the build/host machine. + +- **Build (real RADOS):** `CGO_ENABLED=1 go build ./cmd/ceph-api` — fails to link without ceph dev libs. +- **Run mock mode (no Ceph cluster needed):** `CGO_ENABLED=0 CFG_APP_CREATEADMIN=true CFG_APP_ADMINUSERNAME=admin CFG_APP_ADMINPASSWORD=yoursecretpass go run ./cmd/ceph-api/main.go`. Under `CGO_ENABLED=0`, `pkg/app/rados_conn_mock.go` and `pkg/rados/rados_mock.go` (`//go:build !cgo`) compile in instead of the real go-ceph connection. They serve canned JSON from `pkg/rados/mock-data/{mon,mon-input,mgr}/`. +- **macOS dev:** ceph dev libs aren't available natively. Use the Lima VM defined in `lima-ceph-dev.yaml` (`limactl create --name=ceph ./lima-ceph-dev.yaml && limactl start ceph`). +- **Docker:** `docker-compose up` brings up a Ceph demo container plus the API on `:9969` with admin `admin`/`yoursecretpass`. + +## Make targets + +The Makefile is the canonical entry point for all dev workflows. Run `make help` for a current list. + +- `make check` — `go fmt` + `go vet` + unit tests. No CGO, no Docker. +- `make lint` — `golangci-lint` via `go tool`. +- `make e2e-test` — `go test ./test/... -tid`. Builds the test binary inside `test/Dockerfile` (has librados/librbd/libcephfs), then runs it; tests spawn Ceph via testcontainers using the mounted host `docker.sock`. The inner container uses host networking to reach the sibling Ceph container. +- `make gate` — `check` + `lint`. +- `make full-gate` — `gate` + `e2e-test`. +- `make ceph-ref` — populate `third_party/ceph` at the pinned commit. +- `make ceph-ref-versions` — also fetch tags listed in `CEPH_REF_EXTRA_TAGS`. +- `make proto` — regenerate gRPC stubs + OpenAPI from `api/*.proto`. + +## Tests + +E2E tests live in `test/` and boot the full `app.Start` in-process against a real Ceph cluster started by `test/testenv/CephEnv`. Unit tests live alongside their packages under `pkg/`. + +- **Run e2e:** `make e2e-test`. +- **Run unit tests only:** `make check`. +- **Single e2e test:** `go test ./test/ -tid -run TestAuth -v`. +- **Test harness:** `test/testenv/CephEnv` starts `ghcr.io/arttor/ceph-test:v19` (multi-arch, pre-baked all-in-one cluster) on a private bridge network (static MON IP `192.168.56.7`), waits for `ceph health`, then enables `mgr dashboard` and `mgr restful` with known credentials so parity tests can hit both the dashboard API and ceph-api against the same cluster. +- **Build-tag layout in `test/`:** + - `main_test.go` — no tag. `TestMain` + `-tid` flag dispatch. + - `setup_cgo_test.go` — `//go:build cgo`. Declares shared vars (`tstCtx`, `admConn`, `cephEnv`, …) and `runSetup` that boots `CephEnv` + `app.Start`. + - `setup_nocgo_test.go` — `//go:build !cgo`. Stub `runSetup` that errors with "use `-tid`". + - Every other `*_test.go` in `test/` carries `//go:build cgo`. + +`golangci-lint`, `buf`, and the protoc plugins are declared as `tool` directives in `go.mod` and invoked via `go tool `. Add new Go-based tools the same way: `go get -tool @`. + +## API generation + +`.proto` files in `api/` are the **single source of truth** for both gRPC and REST APIs. To change the API: + +1. Edit a `.proto` in `api/` (or add a new one for a new service). +2. Map any new RPC to its HTTP route in `api/http.yaml` (consumed by grpc-gateway). +3. Run `make proto` — emits gRPC stubs and gateway wrappers to `api/gen/grpc/go/` and OpenAPI to `api/openapi/ceph-api.swagger.json`. +4. Implement the server stub in `pkg/api/`. +5. If you added a **new service** (not just a method), register it in both `pkg/api/grpc_server.go` and `pkg/api/grpc_http_gateway.go`. + +## Architecture + +**Single binary, single port.** gRPC and HTTP share the same listener via `soheilhy/cmux`; the HTTP side is grpc-gateway translating REST → gRPC plus a few hand-mounted OAuth handlers. Both default to `:9969`. + +**Composition root: `pkg/app/start.go`.** `app.Start` builds the dependency graph in a fixed order: tracer → RADOS connection (real or mock via build tag) → `rados.Svc` → `cephconfig.NewConfig` → API services (`api.NewClusterAPI`, `api.NewUsersAPI`, `api.NewCrushRuleAPI`, `api.NewStatusAPI`) → `user.New` (optionally creating the configured admin) → `auth.NewServer` (OAuth provider) → `api.NewGrpcServer` → `api.GRPCGateway` → `api.Serve`. To add a new gRPC service, instantiate it here and pass it to `NewGrpcServer`. + +**RADOS layer (`pkg/rados/`).** `Svc` is a thin wrapper over a `RadosConnInterface` exposing three primitives: `ExecMon`, `ExecMonWithInputBuff`, `ExecMgr`. **All Ceph interactions go through these.** Higher-level packages (`pkg/api/`, `pkg/cephconfig/`, `pkg/user/`) construct JSON command payloads and parse JSON responses. The real connection is in `production_conn.go` (`//go:build cgo`); the mock in `rados_mock.go` (`//go:build !cgo`) returns randomly-picked canned responses keyed by command prefix from the embedded `mock-data/` FS. + +**Auth (`pkg/auth/`).** OAuth 2.0 server built on `ory/fosite`. Token state and user/role records are persisted **in Ceph itself** via the rados layer (no external DB). Two HTTP auth surfaces coexist: +- `/api/oauth/{token,auth,revoke,introspect}` — proper OAuth 2.0 (password, refresh, etc.). +- `/api/auth` — legacy Ceph-dashboard-compatible login (no refresh token); kept for backwards compatibility. + +Authentication on gRPC calls is enforced by `auth.AuthFunc` wired as a gRPC interceptor in `NewGrpcServer`. + +**Users & permissions (`pkg/user/`).** Permission model mirrors upstream Ceph: each role grants a subset of `{read, create, update, delete}` over a fixed set of scopes (`pool`, `osd`, `monitor`, `rgw`, `cephfs`, `user`, etc.) defined in `pkg/user/system_roles.go`. Don't invent new scopes or permissions — extend `scopeSet`/`permissionSet` there if truly needed. + +**Configuration (`pkg/config/`).** Precedence: defaults from `pkg/config/config.yaml` → `-config ` → `-config-override ` → env vars of the form `CFG_` (e.g. `CFG_APP_ADMINPASSWORD`). The override flag exists specifically so secrets can be mounted from a separate file (e.g. a k8s Secret) without rewriting the main config. + +**Generated code.** `api/gen/grpc/go/*.pb.go`, `*_grpc.pb.go`, `*.pb.gw.go` and `api/openapi/ceph-api.swagger.json` are buf output — do not hand-edit; regenerate via `make proto` after changing protos. The repo-root `go_api_client.go` is a hand-written convenience wrapper around the generated gRPC client. + +## Ceph reference (`third_party/ceph`) + +The upstream Ceph repo is a git submodule at `third_party/ceph`, pinned to `v19.2.3` (squid). It is reference-only — never built or linked. Casual `git clone` does **not** populate it; run `make ceph-ref` once to fetch a slim history (`--filter=blob:none --depth=1`). + +Use it to: +- Look up dashboard handler logic for new endpoints — `third_party/ceph/src/pybind/mgr/dashboard/`. +- Look up restful handler logic — `third_party/ceph/src/pybind/mgr/restful/`. +- Read Ceph CLI command definitions — `third_party/ceph/src/mon/MonCommands.h`, `src/mgr/*.cc`. +- Read upstream docs — `third_party/ceph/doc/`. + +For cross-release diffs, `make ceph-ref-versions` fetches `v18.2.7` and `v20.0.0`. Then `git -C third_party/ceph diff v18.2.7..v19.2.3 -- src/pybind/mgr/dashboard/foo.py` shows the API drift. + +## Conventions worth knowing + +- **Build tags gate the RADOS backend.** Files in `pkg/app/`, `pkg/rados/`, and `pkg/types/` come in `cgo` / `!cgo` pairs. Under `CGO_ENABLED=1` the real go-ceph connection compiles in; under `CGO_ENABLED=0` the mock does. When adding new behavior that touches the connection, mirror it in both files. +- **Errors from Ceph come back as JSON in stdout plus a status string.** See `rados.Svc.ExecMon` — non-empty `cmdStatus` is logged but doesn't itself fail the call; check the response JSON for actual errors. +- **No DB.** All persistent state (users, OAuth clients, tokens) lives in Ceph via rados commands or the config-key store (`pkg/cephconfig/`). +- **Mock mode is offline-dev convenience, not contract.** `CGO_ENABLED=0` builds make `make check` runnable without ceph libs, but the mock JSON in `pkg/rados/mock-data/` is hand-curated and routinely lags real Ceph. Wire-format bugs are caught by `make e2e-test` against a real cluster, not by `make check`. New endpoint work must be validated against `make e2e-test`. Updating `mock-data/` for new endpoints is **not** required. +- **Tests live in two places.** Unit tests next to the code they test (`pkg/**/*_test.go`). E2E tests in `test/`. Test harness in `test/testenv/`. Anything in `test/` runs against a real Ceph started by `testenv.NewCephEnv` — no mocks. diff --git a/Dockerfile b/Dockerfile index bf5ad6e..0c4cb67 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.21 AS builder +FROM golang:1.25 AS builder ARG TARGETOS ARG TARGETARCH ARG GIT_COMMIT='not set' diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c92a1dd --- /dev/null +++ b/Makefile @@ -0,0 +1,35 @@ +.PHONY: help check lint e2e-test proto gate full-gate ceph-ref ceph-ref-versions + +CEPH_REF_DIR := third_party/ceph +CEPH_REF_COMMIT := v19.2.3 +CEPH_REF_EXTRA_TAGS ?= v18.2.7 v20.0.0 + +help: + @awk 'BEGIN {FS = ":.*##"} /^[a-zA-Z_-]+:.*?##/ { printf " %-22s %s\n", $$1, $$2 }' $(MAKEFILE_LIST) + +check: ## fmt + vet + unit tests + go fmt ./... + CGO_ENABLED=0 go vet ./... + CGO_ENABLED=0 go test ./pkg/... + +lint: ## golangci-lint + CGO_ENABLED=0 go tool golangci-lint run + +e2e-test: ## e2e tests in Docker (-tid) + CGO_ENABLED=0 go test ./test/... -tid + +proto: ## regenerate gRPC stubs and OpenAPI + cd api && go tool buf generate + +gate: check lint +full-gate: gate e2e-test + +ceph-ref: + @git submodule update --init --filter=blob:none --depth=1 $(CEPH_REF_DIR) 2>/dev/null || true + @git -C $(CEPH_REF_DIR) fetch --filter=blob:none --depth=1 origin tag $(CEPH_REF_COMMIT) 2>/dev/null || true + @git -C $(CEPH_REF_DIR) checkout $(CEPH_REF_COMMIT) + +ceph-ref-versions: ceph-ref + @for t in $(CEPH_REF_EXTRA_TAGS); do \ + git -C $(CEPH_REF_DIR) fetch --filter=blob:none --depth=1 origin tag $$t || true; \ + done diff --git a/README.md b/README.md index 1c6fece..23857e3 100644 --- a/README.md +++ b/README.md @@ -91,12 +91,14 @@ API config uses the following precedence order: ## Mock Mode -To run Ceph API in mock mode without a real Ceph cluster: +To run Ceph API in mock mode without a real Ceph cluster — and without needing CGO or ceph dev libraries installed: ```shell -CFG_APP_CREATEADMIN=true CFG_APP_ADMINUSERNAME=admin CFG_APP_ADMINPASSWORD=yoursecretpass go run -tags=mock ./cmd/ceph-api/main.go +CGO_ENABLED=0 CFG_APP_CREATEADMIN=true CFG_APP_ADMINUSERNAME=admin CFG_APP_ADMINPASSWORD=yoursecretpass go run ./cmd/ceph-api/main.go ``` +Under `CGO_ENABLED=0` the mock backend in `pkg/rados/rados_mock.go` is compiled in instead of the real go-ceph connection. Mock responses are served from canned JSON in `pkg/rados/mock-data/`. + ## Security Ceph API implements Fine-Grained permissions. Permission model was taken from original Ceph API. @@ -174,19 +176,25 @@ http://localhost:9969/api/oauth/token ## Test -Along with unit test project contains e2e test to run against real Ceph cluster. -E2E Tests can be found in [/test/](./test/) directory. +Unit tests live alongside their packages in `pkg/`. E2E tests are in [`test/`](./test/) and run against a real Ceph cluster started by [`test/testenv`](./test/testenv) (testcontainers). -Run tests from docker-compose: +The Makefile is the entry point. `make help` lists targets. ```shell -docker-compose -f docker-compose-test.yaml up --build --exit-code-from api-test +make check # fmt + vet + unit tests +make lint # golangci-lint +make e2e-test # e2e tests in Docker (-tid) +make gate # check + lint +make full-gate # gate + e2e-test +``` -# teardown -docker-compose -f docker-compose-test.yaml down -v +A single e2e test: + +```shell +go test ./test/ -tid -run TestAuth -v ``` -Test can be also run locally with `go test ./test/` if there are ceph credentials in `/etc/ceph/` directory. +`-tid` (test-in-docker) builds the test binary inside a container with ceph dev libs, so the host only needs Docker. Without `-tid`, the e2e suite runs natively and requires `librados-dev`, `librbd-dev`, `libcephfs-dev` on the host. ## Develop on MacOS diff --git a/api/buf.gen.yaml b/api/buf.gen.yaml index 96ca4e3..4c7ddd1 100644 --- a/api/buf.gen.yaml +++ b/api/buf.gen.yaml @@ -1,19 +1,19 @@ -version: v1 +version: v2 plugins: - - plugin: go + - local: ["go", "tool", "protoc-gen-go"] out: gen/grpc/go opt: paths=source_relative - - plugin: go-grpc + - local: ["go", "tool", "protoc-gen-go-grpc"] out: gen/grpc/go opt: - paths=source_relative - require_unimplemented_servers=false - - name: grpc-gateway + - local: ["go", "tool", "protoc-gen-grpc-gateway"] out: gen/grpc/go opt: - paths=source_relative - grpc_api_configuration=http.yaml - - name: openapiv2 + - local: ["go", "tool", "protoc-gen-openapiv2"] out: openapi opt: - grpc_api_configuration=http.yaml diff --git a/api/gen/grpc/go/auth.pb.go b/api/gen/grpc/go/auth.pb.go index 8f0e6cb..1ab57fc 100644 --- a/api/gen/grpc/go/auth.pb.go +++ b/api/gen/grpc/go/auth.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 +// protoc-gen-go v1.36.11 // protoc (unknown) // source: auth.proto @@ -15,6 +15,7 @@ import ( timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -25,21 +26,18 @@ const ( ) type LoginReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - Password string `protobuf:"bytes,2,opt,name=password,proto3" json:"password,omitempty"` + sizeCache protoimpl.SizeCache } func (x *LoginReq) Reset() { *x = LoginReq{} - if protoimpl.UnsafeEnabled { - mi := &file_auth_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_auth_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginReq) String() string { @@ -50,7 +48,7 @@ func (*LoginReq) ProtoMessage() {} func (x *LoginReq) ProtoReflect() protoreflect.Message { mi := &file_auth_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -80,25 +78,22 @@ func (x *LoginReq) GetPassword() string { } type LoginResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` Username string `protobuf:"bytes,2,opt,name=username,proto3" json:"username,omitempty"` PwdUpdateRequired bool `protobuf:"varint,3,opt,name=pwd_update_required,json=pwdUpdateRequired,proto3" json:"pwd_update_required,omitempty"` PwdExpirationDate *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=pwd_expiration_date,json=pwdExpirationDate,proto3,oneof" json:"pwd_expiration_date,omitempty"` Sso bool `protobuf:"varint,5,opt,name=sso,proto3" json:"sso,omitempty"` - Permissions map[string]*structpb.ListValue `protobuf:"bytes,6,rep,name=permissions,proto3" json:"permissions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Permissions map[string]*structpb.ListValue `protobuf:"bytes,6,rep,name=permissions,proto3" json:"permissions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *LoginResp) Reset() { *x = LoginResp{} - if protoimpl.UnsafeEnabled { - mi := &file_auth_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_auth_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *LoginResp) String() string { @@ -109,7 +104,7 @@ func (*LoginResp) ProtoMessage() {} func (x *LoginResp) ProtoReflect() protoreflect.Message { mi := &file_auth_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -167,20 +162,17 @@ func (x *LoginResp) GetPermissions() map[string]*structpb.ListValue { } type TokenCheckReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` unknownFields protoimpl.UnknownFields - - Token string `protobuf:"bytes,1,opt,name=token,proto3" json:"token,omitempty"` + sizeCache protoimpl.SizeCache } func (x *TokenCheckReq) Reset() { *x = TokenCheckReq{} - if protoimpl.UnsafeEnabled { - mi := &file_auth_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_auth_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TokenCheckReq) String() string { @@ -191,7 +183,7 @@ func (*TokenCheckReq) ProtoMessage() {} func (x *TokenCheckReq) ProtoReflect() protoreflect.Message { mi := &file_auth_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -214,24 +206,21 @@ func (x *TokenCheckReq) GetToken() string { } type TokenCheckResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` PwdUpdateRequired bool `protobuf:"varint,2,opt,name=pwd_update_required,json=pwdUpdateRequired,proto3" json:"pwd_update_required,omitempty"` PwdExpirationDate *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=pwd_expiration_date,json=pwdExpirationDate,proto3,oneof" json:"pwd_expiration_date,omitempty"` Sso bool `protobuf:"varint,4,opt,name=sso,proto3" json:"sso,omitempty"` - Permissions map[string]*structpb.ListValue `protobuf:"bytes,5,rep,name=permissions,proto3" json:"permissions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Permissions map[string]*structpb.ListValue `protobuf:"bytes,5,rep,name=permissions,proto3" json:"permissions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *TokenCheckResp) Reset() { *x = TokenCheckResp{} - if protoimpl.UnsafeEnabled { - mi := &file_auth_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_auth_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *TokenCheckResp) String() string { @@ -242,7 +231,7 @@ func (*TokenCheckResp) ProtoMessage() {} func (x *TokenCheckResp) ProtoReflect() protoreflect.Message { mi := &file_auth_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -294,120 +283,65 @@ func (x *TokenCheckResp) GetPermissions() map[string]*structpb.ListValue { var File_auth_proto protoreflect.FileDescriptor -var file_auth_proto_rawDesc = []byte{ - 0x0a, 0x0a, 0x61, 0x75, 0x74, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, 0x65, - 0x70, 0x68, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, - 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, - 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x42, - 0x0a, 0x08, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, - 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x22, 0x88, 0x03, 0x0a, 0x09, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x77, 0x64, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x11, 0x70, 0x77, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, - 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x13, 0x70, 0x77, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x11, 0x70, - 0x77, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, - 0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x73, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x03, 0x73, 0x73, 0x6f, 0x12, 0x42, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, 0x65, 0x70, - 0x68, 0x2e, 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x2e, 0x50, 0x65, 0x72, 0x6d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x70, 0x65, - 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x5a, 0x0a, 0x10, 0x50, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x70, 0x77, 0x64, 0x5f, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x22, 0x25, 0x0a, - 0x0d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x12, 0x14, - 0x0a, 0x05, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xfc, 0x02, 0x0a, 0x0e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x77, 0x64, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x70, 0x77, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, - 0x72, 0x65, 0x64, 0x12, 0x4f, 0x0a, 0x13, 0x70, 0x77, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x00, 0x52, 0x11, - 0x70, 0x77, 0x64, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x73, 0x6f, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x03, 0x73, 0x73, 0x6f, 0x12, 0x47, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x63, 0x65, - 0x70, 0x68, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x2e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, - 0x5a, 0x0a, 0x10, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, - 0x70, 0x77, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, - 0x61, 0x74, 0x65, 0x32, 0x9e, 0x01, 0x0a, 0x04, 0x41, 0x75, 0x74, 0x68, 0x12, 0x28, 0x0a, 0x05, - 0x4c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x0e, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4c, 0x6f, 0x67, - 0x69, 0x6e, 0x52, 0x65, 0x71, 0x1a, 0x0f, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4c, 0x6f, 0x67, - 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x12, 0x38, 0x0a, 0x06, 0x4c, 0x6f, 0x67, 0x6f, 0x75, 0x74, - 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, - 0x12, 0x32, 0x0a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x13, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x1a, 0x14, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x42, 0xcc, 0x02, 0x92, 0x41, 0xa1, 0x02, 0x12, 0x8c, 0x01, 0x0a, 0x13, - 0x43, 0x65, 0x70, 0x68, 0x20, 0x6d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x20, - 0x41, 0x50, 0x49, 0x22, 0x2d, 0x0a, 0x08, 0x43, 0x65, 0x70, 0x68, 0x20, 0x41, 0x50, 0x49, 0x12, - 0x21, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, - 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x79, 0x73, 0x6f, 0x2f, 0x63, 0x65, 0x70, 0x68, 0x2d, 0x61, - 0x70, 0x69, 0x2a, 0x46, 0x0a, 0x0f, 0x47, 0x50, 0x4c, 0x2d, 0x33, 0x2e, 0x30, 0x20, 0x6c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x79, 0x73, 0x6f, 0x2f, - 0x63, 0x65, 0x70, 0x68, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x62, 0x6c, 0x6f, 0x62, 0x2f, 0x6d, 0x61, - 0x69, 0x6e, 0x2f, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x2a, 0x02, 0x01, 0x02, 0x32, 0x10, - 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, 0x6f, 0x6e, - 0x3a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x6a, 0x73, - 0x6f, 0x6e, 0x5a, 0x52, 0x0a, 0x50, 0x0a, 0x06, 0x4f, 0x41, 0x75, 0x74, 0x68, 0x32, 0x12, 0x46, - 0x08, 0x03, 0x28, 0x02, 0x3a, 0x25, 0x68, 0x74, 0x74, 0x70, 0x3a, 0x2f, 0x2f, 0x6c, 0x6f, 0x63, - 0x61, 0x6c, 0x68, 0x6f, 0x73, 0x74, 0x3a, 0x39, 0x39, 0x36, 0x39, 0x2f, 0x61, 0x70, 0x69, 0x2f, - 0x6f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x19, 0x0a, 0x17, 0x0a, - 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x12, 0x0d, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x20, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x62, 0x14, 0x0a, 0x12, 0x0a, 0x06, 0x4f, 0x41, 0x75, 0x74, - 0x68, 0x32, 0x12, 0x08, 0x0a, 0x06, 0x6f, 0x70, 0x65, 0x6e, 0x69, 0x64, 0x5a, 0x25, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x79, 0x73, 0x6f, 0x2f, 0x63, - 0x65, 0x70, 0x68, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x65, 0x70, 0x68, - 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_auth_proto_rawDesc = "" + + "\n" + + "\n" + + "auth.proto\x12\x04ceph\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a.protoc-gen-openapiv2/options/annotations.proto\"B\n" + + "\bLoginReq\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\x12\x1a\n" + + "\bpassword\x18\x02 \x01(\tR\bpassword\"\x88\x03\n" + + "\tLoginResp\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\x12\x1a\n" + + "\busername\x18\x02 \x01(\tR\busername\x12.\n" + + "\x13pwd_update_required\x18\x03 \x01(\bR\x11pwdUpdateRequired\x12O\n" + + "\x13pwd_expiration_date\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampH\x00R\x11pwdExpirationDate\x88\x01\x01\x12\x10\n" + + "\x03sso\x18\x05 \x01(\bR\x03sso\x12B\n" + + "\vpermissions\x18\x06 \x03(\v2 .ceph.LoginResp.PermissionsEntryR\vpermissions\x1aZ\n" + + "\x10PermissionsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x120\n" + + "\x05value\x18\x02 \x01(\v2\x1a.google.protobuf.ListValueR\x05value:\x028\x01B\x16\n" + + "\x14_pwd_expiration_date\"%\n" + + "\rTokenCheckReq\x12\x14\n" + + "\x05token\x18\x01 \x01(\tR\x05token\"\xfc\x02\n" + + "\x0eTokenCheckResp\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\x12.\n" + + "\x13pwd_update_required\x18\x02 \x01(\bR\x11pwdUpdateRequired\x12O\n" + + "\x13pwd_expiration_date\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampH\x00R\x11pwdExpirationDate\x88\x01\x01\x12\x10\n" + + "\x03sso\x18\x04 \x01(\bR\x03sso\x12G\n" + + "\vpermissions\x18\x05 \x03(\v2%.ceph.TokenCheckResp.PermissionsEntryR\vpermissions\x1aZ\n" + + "\x10PermissionsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x120\n" + + "\x05value\x18\x02 \x01(\v2\x1a.google.protobuf.ListValueR\x05value:\x028\x01B\x16\n" + + "\x14_pwd_expiration_date2\x9e\x01\n" + + "\x04Auth\x12(\n" + + "\x05Login\x12\x0e.ceph.LoginReq\x1a\x0f.ceph.LoginResp\x128\n" + + "\x06Logout\x12\x16.google.protobuf.Empty\x1a\x16.google.protobuf.Empty\x122\n" + + "\x05Check\x12\x13.ceph.TokenCheckReq\x1a\x14.ceph.TokenCheckRespB\xcc\x02\x92A\xa1\x02\x12\x8c\x01\n" + + "\x13Ceph management API\"-\n" + + "\bCeph API\x12!https://github.com/clyso/ceph-api*F\n" + + "\x0fGPL-3.0 license\x123https://github.com/clyso/ceph-api/blob/main/LICENSE*\x02\x01\x022\x10application/json:\x10application/jsonZR\n" + + "P\n" + + "\x06OAuth2\x12F\b\x03(\x02:%http://localhost:9969/api/oauth/tokenB\x19\n" + + "\x17\n" + + "\x06openid\x12\rdefault scopeb\x14\n" + + "\x12\n" + + "\x06OAuth2\x12\b\n" + + "\x06openidZ%github.com/clyso/ceph-api/api/ceph;pbb\x06proto3" var ( file_auth_proto_rawDescOnce sync.Once - file_auth_proto_rawDescData = file_auth_proto_rawDesc + file_auth_proto_rawDescData []byte ) func file_auth_proto_rawDescGZIP() []byte { file_auth_proto_rawDescOnce.Do(func() { - file_auth_proto_rawDescData = protoimpl.X.CompressGZIP(file_auth_proto_rawDescData) + file_auth_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_auth_proto_rawDesc), len(file_auth_proto_rawDesc))) }) return file_auth_proto_rawDescData } var file_auth_proto_msgTypes = make([]protoimpl.MessageInfo, 6) -var file_auth_proto_goTypes = []interface{}{ +var file_auth_proto_goTypes = []any{ (*LoginReq)(nil), // 0: ceph.LoginReq (*LoginResp)(nil), // 1: ceph.LoginResp (*TokenCheckReq)(nil), // 2: ceph.TokenCheckReq @@ -443,63 +377,13 @@ func file_auth_proto_init() { if File_auth_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_auth_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_auth_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LoginResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_auth_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TokenCheckReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_auth_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TokenCheckResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_auth_proto_msgTypes[1].OneofWrappers = []interface{}{} - file_auth_proto_msgTypes[3].OneofWrappers = []interface{}{} + file_auth_proto_msgTypes[1].OneofWrappers = []any{} + file_auth_proto_msgTypes[3].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_auth_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_auth_proto_rawDesc), len(file_auth_proto_rawDesc)), NumEnums: 0, NumMessages: 6, NumExtensions: 0, @@ -510,7 +394,6 @@ func file_auth_proto_init() { MessageInfos: file_auth_proto_msgTypes, }.Build() File_auth_proto = out.File - file_auth_proto_rawDesc = nil file_auth_proto_goTypes = nil file_auth_proto_depIdxs = nil } diff --git a/api/gen/grpc/go/auth.pb.gw.go b/api/gen/grpc/go/auth.pb.gw.go index 77d7a3f..b0edb68 100644 --- a/api/gen/grpc/go/auth.pb.gw.go +++ b/api/gen/grpc/go/auth.pb.gw.go @@ -44,6 +44,9 @@ func request_Auth_Login_0(ctx context.Context, marshaler runtime.Marshaler, clie if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.Login(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -68,6 +71,9 @@ func request_Auth_Logout_0(ctx context.Context, marshaler runtime.Marshaler, cli if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.Logout(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -92,6 +98,9 @@ func request_Auth_Check_0(ctx context.Context, marshaler runtime.Marshaler, clie if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.Check(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } diff --git a/api/gen/grpc/go/auth_grpc.pb.go b/api/gen/grpc/go/auth_grpc.pb.go index ac8d19b..3c5b637 100644 --- a/api/gen/grpc/go/auth_grpc.pb.go +++ b/api/gen/grpc/go/auth_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: auth.proto @@ -89,13 +89,13 @@ type AuthServer interface { type UnimplementedAuthServer struct{} func (UnimplementedAuthServer) Login(context.Context, *LoginReq) (*LoginResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method Login not implemented") + return nil, status.Error(codes.Unimplemented, "method Login not implemented") } func (UnimplementedAuthServer) Logout(context.Context, *emptypb.Empty) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method Logout not implemented") + return nil, status.Error(codes.Unimplemented, "method Logout not implemented") } func (UnimplementedAuthServer) Check(context.Context, *TokenCheckReq) (*TokenCheckResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method Check not implemented") + return nil, status.Error(codes.Unimplemented, "method Check not implemented") } func (UnimplementedAuthServer) testEmbeddedByValue() {} @@ -107,7 +107,7 @@ type UnsafeAuthServer interface { } func RegisterAuthServer(s grpc.ServiceRegistrar, srv AuthServer) { - // If the following call pancis, it indicates UnimplementedAuthServer was + // If the following call panics, it indicates UnimplementedAuthServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/api/gen/grpc/go/cluster.pb.go b/api/gen/grpc/go/cluster.pb.go index f0a0f0a..6206693 100644 --- a/api/gen/grpc/go/cluster.pb.go +++ b/api/gen/grpc/go/cluster.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 +// protoc-gen-go v1.36.11 // protoc (unknown) // source: cluster.proto @@ -12,6 +12,7 @@ import ( emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -361,20 +362,17 @@ func (ConfigParam_ParamType) EnumDescriptor() ([]byte, []int) { } type ClusterStatus struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Status ClusterStatus_Status `protobuf:"varint,1,opt,name=status,proto3,enum=ceph.ClusterStatus_Status" json:"status,omitempty"` unknownFields protoimpl.UnknownFields - - Status ClusterStatus_Status `protobuf:"varint,1,opt,name=status,proto3,enum=ceph.ClusterStatus_Status" json:"status,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ClusterStatus) Reset() { *x = ClusterStatus{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ClusterStatus) String() string { @@ -385,7 +383,7 @@ func (*ClusterStatus) ProtoMessage() {} func (x *ClusterStatus) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -408,20 +406,17 @@ func (x *ClusterStatus) GetStatus() ClusterStatus_Status { } type ClusterUsers struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Users []*ClusterUser `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` unknownFields protoimpl.UnknownFields - - Users []*ClusterUser `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ClusterUsers) Reset() { *x = ClusterUsers{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ClusterUsers) String() string { @@ -432,7 +427,7 @@ func (*ClusterUsers) ProtoMessage() {} func (x *ClusterUsers) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -455,25 +450,22 @@ func (x *ClusterUsers) GetUsers() []*ClusterUser { } type ClusterUser struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // entity, e.g: "client.admin" Entity string `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` // user capabilities, e.g: {"mon": "allow r","osd":"allow rw pool=liverpool"} - Caps map[string]string `protobuf:"bytes,2,rep,name=caps,proto3" json:"caps,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Caps map[string]string `protobuf:"bytes,2,rep,name=caps,proto3" json:"caps,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // keyring - Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + Key string `protobuf:"bytes,3,opt,name=key,proto3" json:"key,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ClusterUser) Reset() { *x = ClusterUser{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ClusterUser) String() string { @@ -484,7 +476,7 @@ func (*ClusterUser) ProtoMessage() {} func (x *ClusterUser) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -521,23 +513,20 @@ func (x *ClusterUser) GetKey() string { } type UpdateClusterUserReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // user capabilities, e.g: {"mon": "allow r","osd":"allow rw pool=liverpool"} - Capabilities map[string]string `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Capabilities map[string]string `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // entity, e.g: "client.admin" - UserEntity string `protobuf:"bytes,2,opt,name=user_entity,proto3" json:"user_entity,omitempty"` + UserEntity string `protobuf:"bytes,2,opt,name=user_entity,proto3" json:"user_entity,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *UpdateClusterUserReq) Reset() { *x = UpdateClusterUserReq{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateClusterUserReq) String() string { @@ -548,7 +537,7 @@ func (*UpdateClusterUserReq) ProtoMessage() {} func (x *UpdateClusterUserReq) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -578,25 +567,22 @@ func (x *UpdateClusterUserReq) GetUserEntity() string { } type CreateClusterUserReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // user capabilities, e.g: {"mon": "allow r","osd":"allow rw pool=liverpool"} - Capabilities map[string]string `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Capabilities map[string]string `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` // entity, e.g: "client.admin" UserEntity string `protobuf:"bytes,2,opt,name=user_entity,proto3" json:"user_entity,omitempty"` // keyring file format - if import_data is set then other fields ignored - ImportData []byte `protobuf:"bytes,3,opt,name=import_data,proto3" json:"import_data,omitempty"` + ImportData []byte `protobuf:"bytes,3,opt,name=import_data,proto3" json:"import_data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateClusterUserReq) Reset() { *x = CreateClusterUserReq{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateClusterUserReq) String() string { @@ -607,7 +593,7 @@ func (*CreateClusterUserReq) ProtoMessage() {} func (x *CreateClusterUserReq) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -644,20 +630,17 @@ func (x *CreateClusterUserReq) GetImportData() []byte { } type ExportClusterUserReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Entities []string `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty"` unknownFields protoimpl.UnknownFields - - Entities []string `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ExportClusterUserReq) Reset() { *x = ExportClusterUserReq{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExportClusterUserReq) String() string { @@ -668,7 +651,7 @@ func (*ExportClusterUserReq) ProtoMessage() {} func (x *ExportClusterUserReq) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -691,20 +674,17 @@ func (x *ExportClusterUserReq) GetEntities() []string { } type DeleteClusterUserReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + UserEntity string `protobuf:"bytes,1,opt,name=user_entity,proto3" json:"user_entity,omitempty"` unknownFields protoimpl.UnknownFields - - UserEntity string `protobuf:"bytes,1,opt,name=user_entity,proto3" json:"user_entity,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteClusterUserReq) Reset() { *x = DeleteClusterUserReq{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteClusterUserReq) String() string { @@ -715,7 +695,7 @@ func (*DeleteClusterUserReq) ProtoMessage() {} func (x *DeleteClusterUserReq) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -738,21 +718,18 @@ func (x *DeleteClusterUserReq) GetUserEntity() string { } type ExportClusterUserResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` // User key and capabilities in Ceph config file format - Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ExportClusterUserResp) Reset() { *x = ExportClusterUserResp{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExportClusterUserResp) String() string { @@ -763,7 +740,7 @@ func (*ExportClusterUserResp) ProtoMessage() {} func (x *ExportClusterUserResp) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -787,26 +764,23 @@ func (x *ExportClusterUserResp) GetData() []byte { // Config Param Search type SearchConfigRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Service *ConfigParam_ServiceType `protobuf:"varint,1,opt,name=service,proto3,enum=ceph.ConfigParam_ServiceType,oneof" json:"service,omitempty"` + Name *string `protobuf:"bytes,2,opt,name=name,proto3,oneof" json:"name,omitempty"` + FullText *string `protobuf:"bytes,3,opt,name=full_text,json=fullText,proto3,oneof" json:"full_text,omitempty"` + Level *ConfigParam_ConfigLevel `protobuf:"varint,4,opt,name=level,proto3,enum=ceph.ConfigParam_ConfigLevel,oneof" json:"level,omitempty"` + Sort *SearchConfigRequest_SortField `protobuf:"varint,5,opt,name=sort,proto3,enum=ceph.SearchConfigRequest_SortField,oneof" json:"sort,omitempty"` + Order *SearchConfigRequest_SortOrder `protobuf:"varint,6,opt,name=order,proto3,enum=ceph.SearchConfigRequest_SortOrder,oneof" json:"order,omitempty"` + Type *ConfigParam_ParamType `protobuf:"varint,7,opt,name=type,proto3,enum=ceph.ConfigParam_ParamType,oneof" json:"type,omitempty"` unknownFields protoimpl.UnknownFields - - Service *ConfigParam_ServiceType `protobuf:"varint,1,opt,name=service,proto3,enum=ceph.ConfigParam_ServiceType,oneof" json:"service,omitempty"` - Name *string `protobuf:"bytes,2,opt,name=name,proto3,oneof" json:"name,omitempty"` - FullText *string `protobuf:"bytes,3,opt,name=full_text,json=fullText,proto3,oneof" json:"full_text,omitempty"` - Level *ConfigParam_ConfigLevel `protobuf:"varint,4,opt,name=level,proto3,enum=ceph.ConfigParam_ConfigLevel,oneof" json:"level,omitempty"` - Sort *SearchConfigRequest_SortField `protobuf:"varint,5,opt,name=sort,proto3,enum=ceph.SearchConfigRequest_SortField,oneof" json:"sort,omitempty"` - Order *SearchConfigRequest_SortOrder `protobuf:"varint,6,opt,name=order,proto3,enum=ceph.SearchConfigRequest_SortOrder,oneof" json:"order,omitempty"` - Type *ConfigParam_ParamType `protobuf:"varint,7,opt,name=type,proto3,enum=ceph.ConfigParam_ParamType,oneof" json:"type,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SearchConfigRequest) Reset() { *x = SearchConfigRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SearchConfigRequest) String() string { @@ -817,7 +791,7 @@ func (*SearchConfigRequest) ProtoMessage() {} func (x *SearchConfigRequest) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -882,10 +856,7 @@ func (x *SearchConfigRequest) GetType() ConfigParam_ParamType { } type ConfigParam struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Type ConfigParam_ParamType `protobuf:"varint,2,opt,name=type,proto3,enum=ceph.ConfigParam_ParamType" json:"type,omitempty"` Level ConfigParam_ConfigLevel `protobuf:"varint,3,opt,name=level,proto3,enum=ceph.ConfigParam_ConfigLevel" json:"level,omitempty"` @@ -901,15 +872,15 @@ type ConfigParam struct { Max *float64 `protobuf:"fixed64,13,opt,name=max,proto3,oneof" json:"max,omitempty"` CanUpdateAtRuntime bool `protobuf:"varint,14,opt,name=can_update_at_runtime,json=canUpdateAtRuntime,proto3" json:"can_update_at_runtime,omitempty"` Flags []string `protobuf:"bytes,15,rep,name=flags,proto3" json:"flags,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ConfigParam) Reset() { *x = ConfigParam{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ConfigParam) String() string { @@ -920,7 +891,7 @@ func (*ConfigParam) ProtoMessage() {} func (x *ConfigParam) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1041,20 +1012,17 @@ func (x *ConfigParam) GetFlags() []string { } type SearchConfigResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Params []*ConfigParam `protobuf:"bytes,1,rep,name=params,proto3" json:"params,omitempty"` unknownFields protoimpl.UnknownFields - - Params []*ConfigParam `protobuf:"bytes,1,rep,name=params,proto3" json:"params,omitempty"` + sizeCache protoimpl.SizeCache } func (x *SearchConfigResponse) Reset() { *x = SearchConfigResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_cluster_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SearchConfigResponse) String() string { @@ -1065,7 +1033,7 @@ func (*SearchConfigResponse) ProtoMessage() {} func (x *SearchConfigResponse) ProtoReflect() protoreflect.Message { mi := &file_cluster_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1089,216 +1057,151 @@ func (x *SearchConfigResponse) GetParams() []*ConfigParam { var File_cluster_proto protoreflect.FileDescriptor -var file_cluster_proto_rawDesc = []byte{ - 0x0a, 0x0d, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, - 0x04, 0x63, 0x65, 0x70, 0x68, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x70, 0x0a, 0x0d, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x2b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, 0x45, 0x44, 0x10, 0x00, - 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x4f, 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x53, 0x54, 0x41, 0x4c, 0x4c, - 0x45, 0x44, 0x10, 0x01, 0x22, 0x37, 0x0a, 0x0c, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x12, 0x27, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0xa1, 0x01, - 0x0a, 0x0b, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x12, 0x16, 0x0a, - 0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x65, - 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x2f, 0x0a, 0x04, 0x63, 0x61, 0x70, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x2e, 0x43, 0x61, 0x70, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x04, 0x63, 0x61, 0x70, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x1a, 0x37, 0x0a, 0x09, 0x43, 0x61, 0x70, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0xcb, 0x01, 0x0a, 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x50, 0x0a, 0x0c, 0x63, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, - 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x2e, 0x43, 0x61, 0x70, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, - 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, - 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0xed, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x50, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, - 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, - 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x63, 0x61, - 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x73, - 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x20, 0x0a, 0x0b, - 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x0b, 0x69, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x3f, - 0x0a, 0x11, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x32, 0x0a, 0x14, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x22, 0x38, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x20, 0x0a, 0x0b, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x22, 0x2b, 0x0a, - 0x15, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0x91, 0x04, 0x0a, 0x13, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, - 0x70, 0x65, 0x48, 0x00, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x88, 0x01, 0x01, - 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20, 0x0a, 0x09, 0x66, 0x75, 0x6c, - 0x6c, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x08, - 0x66, 0x75, 0x6c, 0x6c, 0x54, 0x65, 0x78, 0x74, 0x88, 0x01, 0x01, 0x12, 0x38, 0x0a, 0x05, 0x6c, - 0x65, 0x76, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x70, - 0x68, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x48, 0x03, 0x52, 0x05, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x3c, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, - 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, - 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x48, 0x04, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, - 0x88, 0x01, 0x01, 0x12, 0x3e, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x6f, - 0x72, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x48, 0x05, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x88, 0x01, 0x01, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x48, 0x06, - 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x22, 0x2a, 0x0a, 0x09, 0x53, 0x6f, 0x72, - 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x00, - 0x12, 0x08, 0x0a, 0x04, 0x54, 0x59, 0x50, 0x45, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x4c, 0x45, - 0x56, 0x45, 0x4c, 0x10, 0x02, 0x22, 0x1e, 0x0a, 0x09, 0x53, 0x6f, 0x72, 0x74, 0x4f, 0x72, 0x64, - 0x65, 0x72, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, - 0x45, 0x53, 0x43, 0x10, 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x66, - 0x75, 0x6c, 0x6c, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x6c, 0x65, 0x76, - 0x65, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x08, 0x0a, 0x06, 0x5f, - 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x22, 0xfe, - 0x06, 0x0a, 0x0b, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x12, 0x12, - 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x65, 0x76, 0x65, - 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x63, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x65, 0x73, 0x63, 0x12, 0x1b, 0x0a, 0x09, - 0x6c, 0x6f, 0x6e, 0x67, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6c, 0x6f, 0x6e, 0x67, 0x44, 0x65, 0x73, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x25, - 0x0a, 0x0e, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x44, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12, 0x39, 0x0a, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x63, 0x65, - 0x70, 0x68, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x65, 0x65, 0x5f, 0x61, 0x6c, 0x73, 0x6f, - 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x73, 0x65, 0x65, 0x41, 0x6c, 0x73, 0x6f, 0x12, - 0x1f, 0x0a, 0x0b, 0x65, 0x6e, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x0b, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x65, 0x6e, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x12, 0x15, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, - 0x03, 0x6d, 0x69, 0x6e, 0x88, 0x01, 0x01, 0x12, 0x15, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x88, 0x01, 0x01, 0x12, 0x31, - 0x0a, 0x15, 0x63, 0x61, 0x6e, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x61, 0x74, 0x5f, - 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x63, - 0x61, 0x6e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x74, 0x52, 0x75, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x22, 0xb1, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, - 0x6e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x6d, 0x6f, 0x6e, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, - 0x6d, 0x64, 0x73, 0x10, 0x02, 0x12, 0x07, 0x0a, 0x03, 0x6f, 0x73, 0x64, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x6d, 0x67, 0x72, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x72, 0x67, 0x77, 0x10, 0x05, - 0x12, 0x07, 0x0a, 0x03, 0x72, 0x62, 0x64, 0x10, 0x06, 0x12, 0x0e, 0x0a, 0x0a, 0x72, 0x62, 0x64, - 0x5f, 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x07, 0x12, 0x1a, 0x0a, 0x16, 0x69, 0x6d, 0x6d, - 0x75, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x61, - 0x63, 0x68, 0x65, 0x10, 0x08, 0x12, 0x0e, 0x0a, 0x0a, 0x6d, 0x64, 0x73, 0x5f, 0x63, 0x6c, 0x69, - 0x65, 0x6e, 0x74, 0x10, 0x09, 0x12, 0x11, 0x0a, 0x0d, 0x63, 0x65, 0x70, 0x68, 0x66, 0x73, 0x5f, - 0x6d, 0x69, 0x72, 0x72, 0x6f, 0x72, 0x10, 0x0a, 0x12, 0x11, 0x0a, 0x0d, 0x63, 0x65, 0x70, 0x68, - 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x72, 0x10, 0x0b, 0x22, 0x2f, 0x0a, 0x0b, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x09, 0x0a, 0x05, 0x62, 0x61, - 0x73, 0x69, 0x63, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, - 0x64, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x64, 0x65, 0x76, 0x10, 0x02, 0x22, 0x80, 0x01, 0x0a, - 0x09, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x12, 0x07, 0x0a, 0x03, 0x73, 0x74, - 0x72, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x10, 0x01, 0x12, 0x08, 0x0a, - 0x04, 0x61, 0x64, 0x64, 0x72, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x76, - 0x65, 0x63, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x62, 0x6f, 0x6f, 0x6c, 0x10, 0x04, 0x12, 0x07, - 0x0a, 0x03, 0x69, 0x6e, 0x74, 0x10, 0x05, 0x12, 0x09, 0x0a, 0x05, 0x66, 0x6c, 0x6f, 0x61, 0x74, - 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x75, 0x69, 0x6e, 0x74, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x10, 0x08, 0x12, 0x08, 0x0a, 0x04, 0x73, 0x65, 0x63, 0x73, 0x10, 0x09, - 0x12, 0x0d, 0x0a, 0x09, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x73, 0x10, 0x0a, 0x42, - 0x06, 0x0a, 0x04, 0x5f, 0x6d, 0x69, 0x6e, 0x42, 0x06, 0x0a, 0x04, 0x5f, 0x6d, 0x61, 0x78, 0x22, - 0x41, 0x0a, 0x14, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x32, 0x8c, 0x04, 0x0a, 0x07, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x12, 0x38, - 0x0a, 0x09, 0x47, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x1a, 0x13, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x3b, 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x13, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, - 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x1a, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x36, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x12, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x40, 0x0a, - 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x63, 0x65, - 0x70, 0x68, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x40, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x2e, - 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, - 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x12, 0x45, 0x0a, 0x0a, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, - 0x1a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6c, 0x75, - 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x1b, 0x2e, 0x63, 0x65, - 0x70, 0x68, 0x2e, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x12, 0x40, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x1a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x73, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x45, 0x0a, 0x0c, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x19, 0x2e, 0x63, 0x65, 0x70, - 0x68, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x6c, 0x79, 0x73, 0x6f, 0x2f, 0x63, 0x65, 0x70, 0x68, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x63, 0x65, 0x70, 0x68, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} +const file_cluster_proto_rawDesc = "" + + "\n" + + "\rcluster.proto\x12\x04ceph\x1a\x1bgoogle/protobuf/empty.proto\"p\n" + + "\rClusterStatus\x122\n" + + "\x06status\x18\x01 \x01(\x0e2\x1a.ceph.ClusterStatus.StatusR\x06status\"+\n" + + "\x06Status\x12\r\n" + + "\tINSTALLED\x10\x00\x12\x12\n" + + "\x0ePOST_INSTALLED\x10\x01\"7\n" + + "\fClusterUsers\x12'\n" + + "\x05users\x18\x01 \x03(\v2\x11.ceph.ClusterUserR\x05users\"\xa1\x01\n" + + "\vClusterUser\x12\x16\n" + + "\x06entity\x18\x01 \x01(\tR\x06entity\x12/\n" + + "\x04caps\x18\x02 \x03(\v2\x1b.ceph.ClusterUser.CapsEntryR\x04caps\x12\x10\n" + + "\x03key\x18\x03 \x01(\tR\x03key\x1a7\n" + + "\tCapsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xcb\x01\n" + + "\x14UpdateClusterUserReq\x12P\n" + + "\fcapabilities\x18\x01 \x03(\v2,.ceph.UpdateClusterUserReq.CapabilitiesEntryR\fcapabilities\x12 \n" + + "\vuser_entity\x18\x02 \x01(\tR\vuser_entity\x1a?\n" + + "\x11CapabilitiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xed\x01\n" + + "\x14CreateClusterUserReq\x12P\n" + + "\fcapabilities\x18\x01 \x03(\v2,.ceph.CreateClusterUserReq.CapabilitiesEntryR\fcapabilities\x12 \n" + + "\vuser_entity\x18\x02 \x01(\tR\vuser_entity\x12 \n" + + "\vimport_data\x18\x03 \x01(\fR\vimport_data\x1a?\n" + + "\x11CapabilitiesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"2\n" + + "\x14ExportClusterUserReq\x12\x1a\n" + + "\bentities\x18\x01 \x03(\tR\bentities\"8\n" + + "\x14DeleteClusterUserReq\x12 \n" + + "\vuser_entity\x18\x01 \x01(\tR\vuser_entity\"+\n" + + "\x15ExportClusterUserResp\x12\x12\n" + + "\x04data\x18\x01 \x01(\fR\x04data\"\x91\x04\n" + + "\x13SearchConfigRequest\x12<\n" + + "\aservice\x18\x01 \x01(\x0e2\x1d.ceph.ConfigParam.ServiceTypeH\x00R\aservice\x88\x01\x01\x12\x17\n" + + "\x04name\x18\x02 \x01(\tH\x01R\x04name\x88\x01\x01\x12 \n" + + "\tfull_text\x18\x03 \x01(\tH\x02R\bfullText\x88\x01\x01\x128\n" + + "\x05level\x18\x04 \x01(\x0e2\x1d.ceph.ConfigParam.ConfigLevelH\x03R\x05level\x88\x01\x01\x12<\n" + + "\x04sort\x18\x05 \x01(\x0e2#.ceph.SearchConfigRequest.SortFieldH\x04R\x04sort\x88\x01\x01\x12>\n" + + "\x05order\x18\x06 \x01(\x0e2#.ceph.SearchConfigRequest.SortOrderH\x05R\x05order\x88\x01\x01\x124\n" + + "\x04type\x18\a \x01(\x0e2\x1b.ceph.ConfigParam.ParamTypeH\x06R\x04type\x88\x01\x01\"*\n" + + "\tSortField\x12\b\n" + + "\x04NAME\x10\x00\x12\b\n" + + "\x04TYPE\x10\x01\x12\t\n" + + "\x05LEVEL\x10\x02\"\x1e\n" + + "\tSortOrder\x12\a\n" + + "\x03ASC\x10\x00\x12\b\n" + + "\x04DESC\x10\x01B\n" + + "\n" + + "\b_serviceB\a\n" + + "\x05_nameB\f\n" + + "\n" + + "_full_textB\b\n" + + "\x06_levelB\a\n" + + "\x05_sortB\b\n" + + "\x06_orderB\a\n" + + "\x05_type\"\xfe\x06\n" + + "\vConfigParam\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12/\n" + + "\x04type\x18\x02 \x01(\x0e2\x1b.ceph.ConfigParam.ParamTypeR\x04type\x123\n" + + "\x05level\x18\x03 \x01(\x0e2\x1d.ceph.ConfigParam.ConfigLevelR\x05level\x12\x12\n" + + "\x04desc\x18\x04 \x01(\tR\x04desc\x12\x1b\n" + + "\tlong_desc\x18\x05 \x01(\tR\blongDesc\x12#\n" + + "\rdefault_value\x18\x06 \x01(\tR\fdefaultValue\x12%\n" + + "\x0edaemon_default\x18\a \x01(\tR\rdaemonDefault\x12\x12\n" + + "\x04tags\x18\b \x03(\tR\x04tags\x129\n" + + "\bservices\x18\t \x03(\x0e2\x1d.ceph.ConfigParam.ServiceTypeR\bservices\x12\x19\n" + + "\bsee_also\x18\n" + + " \x03(\tR\aseeAlso\x12\x1f\n" + + "\venum_values\x18\v \x03(\tR\n" + + "enumValues\x12\x15\n" + + "\x03min\x18\f \x01(\x01H\x00R\x03min\x88\x01\x01\x12\x15\n" + + "\x03max\x18\r \x01(\x01H\x01R\x03max\x88\x01\x01\x121\n" + + "\x15can_update_at_runtime\x18\x0e \x01(\bR\x12canUpdateAtRuntime\x12\x14\n" + + "\x05flags\x18\x0f \x03(\tR\x05flags\"\xb1\x01\n" + + "\vServiceType\x12\n" + + "\n" + + "\x06common\x10\x00\x12\a\n" + + "\x03mon\x10\x01\x12\a\n" + + "\x03mds\x10\x02\x12\a\n" + + "\x03osd\x10\x03\x12\a\n" + + "\x03mgr\x10\x04\x12\a\n" + + "\x03rgw\x10\x05\x12\a\n" + + "\x03rbd\x10\x06\x12\x0e\n" + + "\n" + + "rbd_mirror\x10\a\x12\x1a\n" + + "\x16immutable_object_cache\x10\b\x12\x0e\n" + + "\n" + + "mds_client\x10\t\x12\x11\n" + + "\rcephfs_mirror\x10\n" + + "\x12\x11\n" + + "\rceph_exporter\x10\v\"/\n" + + "\vConfigLevel\x12\t\n" + + "\x05basic\x10\x00\x12\f\n" + + "\badvanced\x10\x01\x12\a\n" + + "\x03dev\x10\x02\"\x80\x01\n" + + "\tParamType\x12\a\n" + + "\x03str\x10\x00\x12\b\n" + + "\x04uuid\x10\x01\x12\b\n" + + "\x04addr\x10\x02\x12\v\n" + + "\aaddrvec\x10\x03\x12\b\n" + + "\x04bool\x10\x04\x12\a\n" + + "\x03int\x10\x05\x12\t\n" + + "\x05float\x10\x06\x12\b\n" + + "\x04uint\x10\a\x12\b\n" + + "\x04size\x10\b\x12\b\n" + + "\x04secs\x10\t\x12\r\n" + + "\tmillisecs\x10\n" + + "B\x06\n" + + "\x04_minB\x06\n" + + "\x04_max\"A\n" + + "\x14SearchConfigResponse\x12)\n" + + "\x06params\x18\x01 \x03(\v2\x11.ceph.ConfigParamR\x06params2\x8c\x04\n" + + "\aCluster\x128\n" + + "\tGetStatus\x12\x16.google.protobuf.Empty\x1a\x13.ceph.ClusterStatus\x12;\n" + + "\fUpdateStatus\x12\x13.ceph.ClusterStatus\x1a\x16.google.protobuf.Empty\x126\n" + + "\bGetUsers\x12\x16.google.protobuf.Empty\x1a\x12.ceph.ClusterUsers\x12@\n" + + "\n" + + "UpdateUser\x12\x1a.ceph.UpdateClusterUserReq\x1a\x16.google.protobuf.Empty\x12@\n" + + "\n" + + "CreateUser\x12\x1a.ceph.CreateClusterUserReq\x1a\x16.google.protobuf.Empty\x12E\n" + + "\n" + + "ExportUser\x12\x1a.ceph.ExportClusterUserReq\x1a\x1b.ceph.ExportClusterUserResp\x12@\n" + + "\n" + + "DeleteUser\x12\x1a.ceph.DeleteClusterUserReq\x1a\x16.google.protobuf.Empty\x12E\n" + + "\fSearchConfig\x12\x19.ceph.SearchConfigRequest\x1a\x1a.ceph.SearchConfigResponseB'Z%github.com/clyso/ceph-api/api/ceph;pbb\x06proto3" var ( file_cluster_proto_rawDescOnce sync.Once - file_cluster_proto_rawDescData = file_cluster_proto_rawDesc + file_cluster_proto_rawDescData []byte ) func file_cluster_proto_rawDescGZIP() []byte { file_cluster_proto_rawDescOnce.Do(func() { - file_cluster_proto_rawDescData = protoimpl.X.CompressGZIP(file_cluster_proto_rawDescData) + file_cluster_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_cluster_proto_rawDesc), len(file_cluster_proto_rawDesc))) }) return file_cluster_proto_rawDescData } var file_cluster_proto_enumTypes = make([]protoimpl.EnumInfo, 6) var file_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 14) -var file_cluster_proto_goTypes = []interface{}{ +var file_cluster_proto_goTypes = []any{ (ClusterStatus_Status)(0), // 0: ceph.ClusterStatus.Status (SearchConfigRequest_SortField)(0), // 1: ceph.SearchConfigRequest.SortField (SearchConfigRequest_SortOrder)(0), // 2: ceph.SearchConfigRequest.SortOrder @@ -1364,147 +1267,13 @@ func file_cluster_proto_init() { if File_cluster_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_cluster_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClusterStatus); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClusterUsers); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClusterUser); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateClusterUserReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateClusterUserReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportClusterUserReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteClusterUserReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExportClusterUserResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchConfigRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ConfigParam); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_cluster_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchConfigResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_cluster_proto_msgTypes[8].OneofWrappers = []interface{}{} - file_cluster_proto_msgTypes[9].OneofWrappers = []interface{}{} + file_cluster_proto_msgTypes[8].OneofWrappers = []any{} + file_cluster_proto_msgTypes[9].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_cluster_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_cluster_proto_rawDesc), len(file_cluster_proto_rawDesc)), NumEnums: 6, NumMessages: 14, NumExtensions: 0, @@ -1516,7 +1285,6 @@ func file_cluster_proto_init() { MessageInfos: file_cluster_proto_msgTypes, }.Build() File_cluster_proto = out.File - file_cluster_proto_rawDesc = nil file_cluster_proto_goTypes = nil file_cluster_proto_depIdxs = nil } diff --git a/api/gen/grpc/go/cluster.pb.gw.go b/api/gen/grpc/go/cluster.pb.gw.go index a135814..0698dba 100644 --- a/api/gen/grpc/go/cluster.pb.gw.go +++ b/api/gen/grpc/go/cluster.pb.gw.go @@ -41,6 +41,9 @@ func request_Cluster_GetStatus_0(ctx context.Context, marshaler runtime.Marshale protoReq emptypb.Empty metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.GetStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -62,6 +65,9 @@ func request_Cluster_UpdateStatus_0(ctx context.Context, marshaler runtime.Marsh if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.UpdateStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -83,6 +89,9 @@ func request_Cluster_GetUsers_0(ctx context.Context, marshaler runtime.Marshaler protoReq emptypb.Empty metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.GetUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -104,6 +113,9 @@ func request_Cluster_UpdateUser_0(ctx context.Context, marshaler runtime.Marshal if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.UpdateUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -128,6 +140,9 @@ func request_Cluster_CreateUser_0(ctx context.Context, marshaler runtime.Marshal if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.CreateUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -152,6 +167,9 @@ func request_Cluster_ExportUser_0(ctx context.Context, marshaler runtime.Marshal if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.ExportUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -174,6 +192,9 @@ func request_Cluster_DeleteUser_0(ctx context.Context, marshaler runtime.Marshal metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["user_entity"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user_entity") @@ -211,6 +232,9 @@ func request_Cluster_SearchConfig_0(ctx context.Context, marshaler runtime.Marsh protoReq SearchConfigRequest metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } if err := req.ParseForm(); err != nil { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } @@ -586,7 +610,8 @@ type response_Cluster_GetUsers_0 struct { } func (m response_Cluster_GetUsers_0) XXX_ResponseBody() interface{} { - return m.Users + response := m.ClusterUsers + return response.Users } type response_Cluster_ExportUser_0 struct { @@ -594,7 +619,8 @@ type response_Cluster_ExportUser_0 struct { } func (m response_Cluster_ExportUser_0) XXX_ResponseBody() interface{} { - return m.Data + response := m.ExportClusterUserResp + return response.Data } var ( diff --git a/api/gen/grpc/go/cluster_grpc.pb.go b/api/gen/grpc/go/cluster_grpc.pb.go index 7a40fce..a4488e2 100644 --- a/api/gen/grpc/go/cluster_grpc.pb.go +++ b/api/gen/grpc/go/cluster_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: cluster.proto @@ -158,28 +158,28 @@ type ClusterServer interface { type UnimplementedClusterServer struct{} func (UnimplementedClusterServer) GetStatus(context.Context, *emptypb.Empty) (*ClusterStatus, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetStatus not implemented") + return nil, status.Error(codes.Unimplemented, "method GetStatus not implemented") } func (UnimplementedClusterServer) UpdateStatus(context.Context, *ClusterStatus) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateStatus not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateStatus not implemented") } func (UnimplementedClusterServer) GetUsers(context.Context, *emptypb.Empty) (*ClusterUsers, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUsers not implemented") + return nil, status.Error(codes.Unimplemented, "method GetUsers not implemented") } func (UnimplementedClusterServer) UpdateUser(context.Context, *UpdateClusterUserReq) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateUser not implemented") } func (UnimplementedClusterServer) CreateUser(context.Context, *CreateClusterUserReq) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateUser not implemented") } func (UnimplementedClusterServer) ExportUser(context.Context, *ExportClusterUserReq) (*ExportClusterUserResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method ExportUser not implemented") + return nil, status.Error(codes.Unimplemented, "method ExportUser not implemented") } func (UnimplementedClusterServer) DeleteUser(context.Context, *DeleteClusterUserReq) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteUser not implemented") + return nil, status.Error(codes.Unimplemented, "method DeleteUser not implemented") } func (UnimplementedClusterServer) SearchConfig(context.Context, *SearchConfigRequest) (*SearchConfigResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SearchConfig not implemented") + return nil, status.Error(codes.Unimplemented, "method SearchConfig not implemented") } func (UnimplementedClusterServer) testEmbeddedByValue() {} @@ -191,7 +191,7 @@ type UnsafeClusterServer interface { } func RegisterClusterServer(s grpc.ServiceRegistrar, srv ClusterServer) { - // If the following call pancis, it indicates UnimplementedClusterServer was + // If the following call panics, it indicates UnimplementedClusterServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/api/gen/grpc/go/crush_rule.pb.go b/api/gen/grpc/go/crush_rule.pb.go index 38716ce..28829f1 100644 --- a/api/gen/grpc/go/crush_rule.pb.go +++ b/api/gen/grpc/go/crush_rule.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 +// protoc-gen-go v1.36.11 // protoc (unknown) // source: crush_rule.proto @@ -12,6 +12,7 @@ import ( emptypb "google.golang.org/protobuf/types/known/emptypb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -68,26 +69,23 @@ func (PoolType) EnumDescriptor() ([]byte, []int) { } type Rule struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + RuleId int64 `protobuf:"varint,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + RuleName string `protobuf:"bytes,2,opt,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` + Ruleset int64 `protobuf:"varint,3,opt,name=ruleset,proto3" json:"ruleset,omitempty"` + Type int64 `protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"` + MinSize int64 `protobuf:"varint,5,opt,name=min_size,json=minSize,proto3" json:"min_size,omitempty"` + MaxSize int64 `protobuf:"varint,6,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` + Steps []*Step `protobuf:"bytes,7,rep,name=steps,proto3" json:"steps,omitempty"` unknownFields protoimpl.UnknownFields - - RuleId int64 `protobuf:"varint,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` - RuleName string `protobuf:"bytes,2,opt,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` - Ruleset int64 `protobuf:"varint,3,opt,name=ruleset,proto3" json:"ruleset,omitempty"` - Type int64 `protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"` - MinSize int64 `protobuf:"varint,5,opt,name=min_size,json=minSize,proto3" json:"min_size,omitempty"` - MaxSize int64 `protobuf:"varint,6,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` - Steps []*Step `protobuf:"bytes,7,rep,name=steps,proto3" json:"steps,omitempty"` + sizeCache protoimpl.SizeCache } func (x *Rule) Reset() { *x = Rule{} - if protoimpl.UnsafeEnabled { - mi := &file_crush_rule_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_crush_rule_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Rule) String() string { @@ -98,7 +96,7 @@ func (*Rule) ProtoMessage() {} func (x *Rule) ProtoReflect() protoreflect.Message { mi := &file_crush_rule_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -163,20 +161,17 @@ func (x *Rule) GetSteps() []*Step { } type Step struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Entries map[string]string `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields - - Entries map[string]string `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + sizeCache protoimpl.SizeCache } func (x *Step) Reset() { *x = Step{} - if protoimpl.UnsafeEnabled { - mi := &file_crush_rule_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_crush_rule_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Step) String() string { @@ -187,7 +182,7 @@ func (*Step) ProtoMessage() {} func (x *Step) ProtoReflect() protoreflect.Message { mi := &file_crush_rule_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -211,25 +206,22 @@ func (x *Step) GetEntries() map[string]string { // CREATE RULE type CreateRuleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + DeviceClass *string `protobuf:"bytes,1,opt,name=device_class,json=deviceClass,proto3,oneof" json:"device_class,omitempty"` + FailureDomain string `protobuf:"bytes,2,opt,name=failure_domain,json=failureDomain,proto3" json:"failure_domain,omitempty"` + Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` + PoolType PoolType `protobuf:"varint,4,opt,name=pool_type,json=poolType,proto3,enum=ceph.PoolType" json:"pool_type,omitempty"` + Profile *string `protobuf:"bytes,5,opt,name=profile,proto3,oneof" json:"profile,omitempty"` + Root *string `protobuf:"bytes,6,opt,name=root,proto3,oneof" json:"root,omitempty"` unknownFields protoimpl.UnknownFields - - DeviceClass *string `protobuf:"bytes,1,opt,name=device_class,json=deviceClass,proto3,oneof" json:"device_class,omitempty"` - FailureDomain string `protobuf:"bytes,2,opt,name=failure_domain,json=failureDomain,proto3" json:"failure_domain,omitempty"` - Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"` - PoolType PoolType `protobuf:"varint,4,opt,name=pool_type,json=poolType,proto3,enum=ceph.PoolType" json:"pool_type,omitempty"` - Profile *string `protobuf:"bytes,5,opt,name=profile,proto3,oneof" json:"profile,omitempty"` - Root *string `protobuf:"bytes,6,opt,name=root,proto3,oneof" json:"root,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CreateRuleRequest) Reset() { *x = CreateRuleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_crush_rule_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_crush_rule_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateRuleRequest) String() string { @@ -240,7 +232,7 @@ func (*CreateRuleRequest) ProtoMessage() {} func (x *CreateRuleRequest) ProtoReflect() protoreflect.Message { mi := &file_crush_rule_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -299,20 +291,17 @@ func (x *CreateRuleRequest) GetRoot() string { // DELETE RULE type DeleteRuleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *DeleteRuleRequest) Reset() { *x = DeleteRuleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_crush_rule_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_crush_rule_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteRuleRequest) String() string { @@ -323,7 +312,7 @@ func (*DeleteRuleRequest) ProtoMessage() {} func (x *DeleteRuleRequest) ProtoReflect() protoreflect.Message { mi := &file_crush_rule_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -347,20 +336,17 @@ func (x *DeleteRuleRequest) GetName() string { // GET RULE type GetRuleRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRuleRequest) Reset() { *x = GetRuleRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_crush_rule_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_crush_rule_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRuleRequest) String() string { @@ -371,7 +357,7 @@ func (*GetRuleRequest) ProtoMessage() {} func (x *GetRuleRequest) ProtoReflect() protoreflect.Message { mi := &file_crush_rule_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -395,20 +381,17 @@ func (x *GetRuleRequest) GetName() string { // LIST RULES type ListRulesResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Rules []*Rule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` unknownFields protoimpl.UnknownFields - - Rules []*Rule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` + sizeCache protoimpl.SizeCache } func (x *ListRulesResponse) Reset() { *x = ListRulesResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_crush_rule_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_crush_rule_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ListRulesResponse) String() string { @@ -419,7 +402,7 @@ func (*ListRulesResponse) ProtoMessage() {} func (x *ListRulesResponse) ProtoReflect() protoreflect.Message { mi := &file_crush_rule_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -443,94 +426,68 @@ func (x *ListRulesResponse) GetRules() []*Rule { var File_crush_rule_proto protoreflect.FileDescriptor -var file_crush_rule_proto_rawDesc = []byte{ - 0x0a, 0x10, 0x63, 0x72, 0x75, 0x73, 0x68, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x12, 0x04, 0x63, 0x65, 0x70, 0x68, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc2, 0x01, 0x0a, 0x04, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x17, - 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x72, 0x75, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x75, 0x6c, 0x65, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x75, 0x6c, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x65, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x65, 0x74, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x07, 0x6d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x73, 0x74, 0x65, 0x70, - 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x53, - 0x74, 0x65, 0x70, 0x52, 0x05, 0x73, 0x74, 0x65, 0x70, 0x73, 0x22, 0x75, 0x0a, 0x04, 0x53, 0x74, - 0x65, 0x70, 0x12, 0x31, 0x0a, 0x07, 0x65, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x53, 0x74, 0x65, 0x70, 0x2e, - 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x65, 0x6e, - 0x74, 0x72, 0x69, 0x65, 0x73, 0x1a, 0x3a, 0x0a, 0x0c, 0x45, 0x6e, 0x74, 0x72, 0x69, 0x65, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, - 0x01, 0x22, 0x81, 0x02, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x65, 0x76, 0x69, 0x63, - 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x0b, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x25, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x6f, 0x6d, 0x61, 0x69, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x44, 0x6f, 0x6d, 0x61, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x09, 0x70, 0x6f, - 0x6f, 0x6c, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x0e, 0x2e, - 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x70, - 0x6f, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1d, 0x0a, 0x07, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x07, 0x70, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x17, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x02, 0x52, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x88, 0x01, 0x01, 0x42, - 0x0f, 0x0a, 0x0d, 0x5f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, - 0x42, 0x0a, 0x0a, 0x08, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x42, 0x07, 0x0a, 0x05, - 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x24, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x35, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x05, 0x72, 0x75, 0x6c, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, - 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2a, 0x28, 0x0a, 0x08, 0x50, - 0x6f, 0x6f, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x72, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x65, 0x72, 0x61, 0x73, - 0x75, 0x72, 0x65, 0x10, 0x01, 0x32, 0xfc, 0x01, 0x0a, 0x09, 0x43, 0x72, 0x75, 0x73, 0x68, 0x52, - 0x75, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x75, 0x6c, - 0x65, 0x12, 0x17, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, - 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x22, 0x00, 0x12, 0x3f, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x75, - 0x6c, 0x65, 0x12, 0x17, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x52, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, - 0x70, 0x74, 0x79, 0x22, 0x00, 0x12, 0x2d, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, - 0x12, 0x14, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x52, 0x75, - 0x6c, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, - 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x17, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, - 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x79, 0x73, 0x6f, 0x2f, 0x63, 0x65, 0x70, 0x68, 0x2d, 0x61, 0x70, - 0x69, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x65, 0x70, 0x68, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_crush_rule_proto_rawDesc = "" + + "\n" + + "\x10crush_rule.proto\x12\x04ceph\x1a\x1bgoogle/protobuf/empty.proto\"\xc2\x01\n" + + "\x04Rule\x12\x17\n" + + "\arule_id\x18\x01 \x01(\x03R\x06ruleId\x12\x1b\n" + + "\trule_name\x18\x02 \x01(\tR\bruleName\x12\x18\n" + + "\aruleset\x18\x03 \x01(\x03R\aruleset\x12\x12\n" + + "\x04type\x18\x04 \x01(\x03R\x04type\x12\x19\n" + + "\bmin_size\x18\x05 \x01(\x03R\aminSize\x12\x19\n" + + "\bmax_size\x18\x06 \x01(\x03R\amaxSize\x12 \n" + + "\x05steps\x18\a \x03(\v2\n" + + ".ceph.StepR\x05steps\"u\n" + + "\x04Step\x121\n" + + "\aentries\x18\x01 \x03(\v2\x17.ceph.Step.EntriesEntryR\aentries\x1a:\n" + + "\fEntriesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x81\x02\n" + + "\x11CreateRuleRequest\x12&\n" + + "\fdevice_class\x18\x01 \x01(\tH\x00R\vdeviceClass\x88\x01\x01\x12%\n" + + "\x0efailure_domain\x18\x02 \x01(\tR\rfailureDomain\x12\x12\n" + + "\x04name\x18\x03 \x01(\tR\x04name\x12+\n" + + "\tpool_type\x18\x04 \x01(\x0e2\x0e.ceph.PoolTypeR\bpoolType\x12\x1d\n" + + "\aprofile\x18\x05 \x01(\tH\x01R\aprofile\x88\x01\x01\x12\x17\n" + + "\x04root\x18\x06 \x01(\tH\x02R\x04root\x88\x01\x01B\x0f\n" + + "\r_device_classB\n" + + "\n" + + "\b_profileB\a\n" + + "\x05_root\"'\n" + + "\x11DeleteRuleRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"$\n" + + "\x0eGetRuleRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"5\n" + + "\x11ListRulesResponse\x12 \n" + + "\x05rules\x18\x01 \x03(\v2\n" + + ".ceph.RuleR\x05rules*(\n" + + "\bPoolType\x12\x0f\n" + + "\vreplication\x10\x00\x12\v\n" + + "\aerasure\x10\x012\xfc\x01\n" + + "\tCrushRule\x12?\n" + + "\n" + + "CreateRule\x12\x17.ceph.CreateRuleRequest\x1a\x16.google.protobuf.Empty\"\x00\x12?\n" + + "\n" + + "DeleteRule\x12\x17.ceph.DeleteRuleRequest\x1a\x16.google.protobuf.Empty\"\x00\x12-\n" + + "\aGetRule\x12\x14.ceph.GetRuleRequest\x1a\n" + + ".ceph.Rule\"\x00\x12>\n" + + "\tListRules\x12\x16.google.protobuf.Empty\x1a\x17.ceph.ListRulesResponse\"\x00B'Z%github.com/clyso/ceph-api/api/ceph;pbb\x06proto3" var ( file_crush_rule_proto_rawDescOnce sync.Once - file_crush_rule_proto_rawDescData = file_crush_rule_proto_rawDesc + file_crush_rule_proto_rawDescData []byte ) func file_crush_rule_proto_rawDescGZIP() []byte { file_crush_rule_proto_rawDescOnce.Do(func() { - file_crush_rule_proto_rawDescData = protoimpl.X.CompressGZIP(file_crush_rule_proto_rawDescData) + file_crush_rule_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_crush_rule_proto_rawDesc), len(file_crush_rule_proto_rawDesc))) }) return file_crush_rule_proto_rawDescData } var file_crush_rule_proto_enumTypes = make([]protoimpl.EnumInfo, 1) var file_crush_rule_proto_msgTypes = make([]protoimpl.MessageInfo, 7) -var file_crush_rule_proto_goTypes = []interface{}{ +var file_crush_rule_proto_goTypes = []any{ (PoolType)(0), // 0: ceph.PoolType (*Rule)(nil), // 1: ceph.Rule (*Step)(nil), // 2: ceph.Step @@ -566,86 +523,12 @@ func file_crush_rule_proto_init() { if File_crush_rule_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_crush_rule_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Rule); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_crush_rule_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Step); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_crush_rule_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateRuleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_crush_rule_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteRuleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_crush_rule_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRuleRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_crush_rule_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListRulesResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_crush_rule_proto_msgTypes[2].OneofWrappers = []interface{}{} + file_crush_rule_proto_msgTypes[2].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_crush_rule_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_crush_rule_proto_rawDesc), len(file_crush_rule_proto_rawDesc)), NumEnums: 1, NumMessages: 7, NumExtensions: 0, @@ -657,7 +540,6 @@ func file_crush_rule_proto_init() { MessageInfos: file_crush_rule_proto_msgTypes, }.Build() File_crush_rule_proto = out.File - file_crush_rule_proto_rawDesc = nil file_crush_rule_proto_goTypes = nil file_crush_rule_proto_depIdxs = nil } diff --git a/api/gen/grpc/go/crush_rule.pb.gw.go b/api/gen/grpc/go/crush_rule.pb.gw.go index c080869..903b080 100644 --- a/api/gen/grpc/go/crush_rule.pb.gw.go +++ b/api/gen/grpc/go/crush_rule.pb.gw.go @@ -44,6 +44,9 @@ func request_CrushRule_CreateRule_0(ctx context.Context, marshaler runtime.Marsh if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.CreateRule(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -66,6 +69,9 @@ func request_CrushRule_DeleteRule_0(ctx context.Context, marshaler runtime.Marsh metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") @@ -102,6 +108,9 @@ func request_CrushRule_GetRule_0(ctx context.Context, marshaler runtime.Marshale metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") @@ -137,6 +146,9 @@ func request_CrushRule_ListRules_0(ctx context.Context, marshaler runtime.Marsha protoReq emptypb.Empty metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.ListRules(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -352,7 +364,8 @@ type response_CrushRule_ListRules_0 struct { } func (m response_CrushRule_ListRules_0) XXX_ResponseBody() interface{} { - return m.Rules + response := m.ListRulesResponse + return response.Rules } var ( diff --git a/api/gen/grpc/go/crush_rule_grpc.pb.go b/api/gen/grpc/go/crush_rule_grpc.pb.go index 24edb82..ecfeb26 100644 --- a/api/gen/grpc/go/crush_rule_grpc.pb.go +++ b/api/gen/grpc/go/crush_rule_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: crush_rule.proto @@ -102,16 +102,16 @@ type CrushRuleServer interface { type UnimplementedCrushRuleServer struct{} func (UnimplementedCrushRuleServer) CreateRule(context.Context, *CreateRuleRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateRule not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateRule not implemented") } func (UnimplementedCrushRuleServer) DeleteRule(context.Context, *DeleteRuleRequest) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteRule not implemented") + return nil, status.Error(codes.Unimplemented, "method DeleteRule not implemented") } func (UnimplementedCrushRuleServer) GetRule(context.Context, *GetRuleRequest) (*Rule, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRule not implemented") + return nil, status.Error(codes.Unimplemented, "method GetRule not implemented") } func (UnimplementedCrushRuleServer) ListRules(context.Context, *emptypb.Empty) (*ListRulesResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRules not implemented") + return nil, status.Error(codes.Unimplemented, "method ListRules not implemented") } func (UnimplementedCrushRuleServer) testEmbeddedByValue() {} @@ -123,7 +123,7 @@ type UnsafeCrushRuleServer interface { } func RegisterCrushRuleServer(s grpc.ServiceRegistrar, srv CrushRuleServer) { - // If the following call pancis, it indicates UnimplementedCrushRuleServer was + // If the following call panics, it indicates UnimplementedCrushRuleServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/api/gen/grpc/go/status.pb.go b/api/gen/grpc/go/status.pb.go index c232def..d493797 100644 --- a/api/gen/grpc/go/status.pb.go +++ b/api/gen/grpc/go/status.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 +// protoc-gen-go v1.36.11 // protoc (unknown) // source: status.proto @@ -14,6 +14,7 @@ import ( timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -24,32 +25,29 @@ const ( ) type GetCephStatusResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Fsid string `protobuf:"bytes,1,opt,name=fsid,proto3" json:"fsid,omitempty"` - Health *CephStatusHealth `protobuf:"bytes,2,opt,name=health,proto3" json:"health,omitempty"` - ElectionEpoch int32 `protobuf:"varint,3,opt,name=election_epoch,json=electionEpoch,proto3" json:"election_epoch,omitempty"` - Quorum []int32 `protobuf:"varint,4,rep,packed,name=quorum,proto3" json:"quorum,omitempty"` - QuorumNames []string `protobuf:"bytes,5,rep,name=quorum_names,json=quorumNames,proto3" json:"quorum_names,omitempty"` - QuorumAge int32 `protobuf:"varint,6,opt,name=quorum_age,json=quorumAge,proto3" json:"quorum_age,omitempty"` - Monmap *CephStatusMonMap `protobuf:"bytes,7,opt,name=monmap,proto3" json:"monmap,omitempty"` - Osdmap *CephStatusOSDMap `protobuf:"bytes,8,opt,name=osdmap,proto3" json:"osdmap,omitempty"` - Pgmap *CephStatusPGMap `protobuf:"bytes,9,opt,name=pgmap,proto3" json:"pgmap,omitempty"` - Fsmap *CephStatusFSMap `protobuf:"bytes,10,opt,name=fsmap,proto3" json:"fsmap,omitempty"` - Mgrmap *CephStatusMgrMap `protobuf:"bytes,11,opt,name=mgrmap,proto3" json:"mgrmap,omitempty"` - Servicemap *CephStatusServiceMap `protobuf:"bytes,12,opt,name=servicemap,proto3" json:"servicemap,omitempty"` - ProgressEvents *structpb.Struct `protobuf:"bytes,13,opt,name=progress_events,json=progressEvents,proto3" json:"progress_events,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Fsid string `protobuf:"bytes,1,opt,name=fsid,proto3" json:"fsid,omitempty"` + Health *CephStatusHealth `protobuf:"bytes,2,opt,name=health,proto3" json:"health,omitempty"` + ElectionEpoch int32 `protobuf:"varint,3,opt,name=election_epoch,json=electionEpoch,proto3" json:"election_epoch,omitempty"` + Quorum []int32 `protobuf:"varint,4,rep,packed,name=quorum,proto3" json:"quorum,omitempty"` + QuorumNames []string `protobuf:"bytes,5,rep,name=quorum_names,json=quorumNames,proto3" json:"quorum_names,omitempty"` + QuorumAge int32 `protobuf:"varint,6,opt,name=quorum_age,json=quorumAge,proto3" json:"quorum_age,omitempty"` + Monmap *CephStatusMonMap `protobuf:"bytes,7,opt,name=monmap,proto3" json:"monmap,omitempty"` + Osdmap *CephStatusOSDMap `protobuf:"bytes,8,opt,name=osdmap,proto3" json:"osdmap,omitempty"` + Pgmap *CephStatusPGMap `protobuf:"bytes,9,opt,name=pgmap,proto3" json:"pgmap,omitempty"` + Fsmap *CephStatusFSMap `protobuf:"bytes,10,opt,name=fsmap,proto3" json:"fsmap,omitempty"` + Mgrmap *CephStatusMgrMap `protobuf:"bytes,11,opt,name=mgrmap,proto3" json:"mgrmap,omitempty"` + Servicemap *CephStatusServiceMap `protobuf:"bytes,12,opt,name=servicemap,proto3" json:"servicemap,omitempty"` + ProgressEvents *structpb.Struct `protobuf:"bytes,13,opt,name=progress_events,json=progressEvents,proto3" json:"progress_events,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetCephStatusResponse) Reset() { *x = GetCephStatusResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetCephStatusResponse) String() string { @@ -60,7 +58,7 @@ func (*GetCephStatusResponse) ProtoMessage() {} func (x *GetCephStatusResponse) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -167,10 +165,7 @@ func (x *GetCephStatusResponse) GetProgressEvents() *structpb.Struct { } type CephMonDumpResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` Fsid string `protobuf:"bytes,2,opt,name=fsid,proto3" json:"fsid,omitempty"` Modified *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=modified,proto3" json:"modified,omitempty"` @@ -185,15 +180,15 @@ type CephMonDumpResponse struct { Features *CephMonDumpFeatures `protobuf:"bytes,12,opt,name=features,proto3" json:"features,omitempty"` Mons []*CephMonDumpMonInfo `protobuf:"bytes,13,rep,name=mons,proto3" json:"mons,omitempty"` Quorum []int32 `protobuf:"varint,14,rep,packed,name=quorum,proto3" json:"quorum,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CephMonDumpResponse) Reset() { *x = CephMonDumpResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephMonDumpResponse) String() string { @@ -204,7 +199,7 @@ func (*CephMonDumpResponse) ProtoMessage() {} func (x *CephMonDumpResponse) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -318,21 +313,18 @@ func (x *CephMonDumpResponse) GetQuorum() []int32 { } type CephMonDumpFeatures struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Persistent []string `protobuf:"bytes,1,rep,name=persistent,proto3" json:"persistent,omitempty"` + Optional []string `protobuf:"bytes,2,rep,name=optional,proto3" json:"optional,omitempty"` unknownFields protoimpl.UnknownFields - - Persistent []string `protobuf:"bytes,1,rep,name=persistent,proto3" json:"persistent,omitempty"` - Optional []string `protobuf:"bytes,2,rep,name=optional,proto3" json:"optional,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CephMonDumpFeatures) Reset() { *x = CephMonDumpFeatures{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephMonDumpFeatures) String() string { @@ -343,7 +335,7 @@ func (*CephMonDumpFeatures) ProtoMessage() {} func (x *CephMonDumpFeatures) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -373,27 +365,24 @@ func (x *CephMonDumpFeatures) GetOptional() []string { } type CephMonDumpMonInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Rank int32 `protobuf:"varint,1,opt,name=rank,proto3" json:"rank,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + PublicAddrs *CephMonDumpAddrVec `protobuf:"bytes,3,opt,name=public_addrs,json=publicAddrs,proto3" json:"public_addrs,omitempty"` + Addr string `protobuf:"bytes,4,opt,name=addr,proto3" json:"addr,omitempty"` + PublicAddr string `protobuf:"bytes,5,opt,name=public_addr,json=publicAddr,proto3" json:"public_addr,omitempty"` + Priority int32 `protobuf:"varint,6,opt,name=priority,proto3" json:"priority,omitempty"` + Weight int32 `protobuf:"varint,7,opt,name=weight,proto3" json:"weight,omitempty"` + CrushLocation string `protobuf:"bytes,8,opt,name=crush_location,json=crushLocation,proto3" json:"crush_location,omitempty"` unknownFields protoimpl.UnknownFields - - Rank int32 `protobuf:"varint,1,opt,name=rank,proto3" json:"rank,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - PublicAddrs *CephMonDumpAddrVec `protobuf:"bytes,3,opt,name=public_addrs,json=publicAddrs,proto3" json:"public_addrs,omitempty"` - Addr string `protobuf:"bytes,4,opt,name=addr,proto3" json:"addr,omitempty"` - PublicAddr string `protobuf:"bytes,5,opt,name=public_addr,json=publicAddr,proto3" json:"public_addr,omitempty"` - Priority int32 `protobuf:"varint,6,opt,name=priority,proto3" json:"priority,omitempty"` - Weight int32 `protobuf:"varint,7,opt,name=weight,proto3" json:"weight,omitempty"` - CrushLocation string `protobuf:"bytes,8,opt,name=crush_location,json=crushLocation,proto3" json:"crush_location,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CephMonDumpMonInfo) Reset() { *x = CephMonDumpMonInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephMonDumpMonInfo) String() string { @@ -404,7 +393,7 @@ func (*CephMonDumpMonInfo) ProtoMessage() {} func (x *CephMonDumpMonInfo) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -476,20 +465,17 @@ func (x *CephMonDumpMonInfo) GetCrushLocation() string { } type CephMonDumpAddrVec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Addrvec []*CephMonDumpAddress `protobuf:"bytes,1,rep,name=addrvec,proto3" json:"addrvec,omitempty"` unknownFields protoimpl.UnknownFields - - Addrvec []*CephMonDumpAddress `protobuf:"bytes,1,rep,name=addrvec,proto3" json:"addrvec,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CephMonDumpAddrVec) Reset() { *x = CephMonDumpAddrVec{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephMonDumpAddrVec) String() string { @@ -500,7 +486,7 @@ func (*CephMonDumpAddrVec) ProtoMessage() {} func (x *CephMonDumpAddrVec) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -523,22 +509,19 @@ func (x *CephMonDumpAddrVec) GetAddrvec() []*CephMonDumpAddress { } type CephMonDumpAddress struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"` + Nonce int32 `protobuf:"varint,3,opt,name=nonce,proto3" json:"nonce,omitempty"` unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"` - Nonce int32 `protobuf:"varint,3,opt,name=nonce,proto3" json:"nonce,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CephMonDumpAddress) Reset() { *x = CephMonDumpAddress{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephMonDumpAddress) String() string { @@ -549,7 +532,7 @@ func (*CephMonDumpAddress) ProtoMessage() {} func (x *CephMonDumpAddress) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -586,22 +569,19 @@ func (x *CephMonDumpAddress) GetNonce() int32 { } type CephStatusHealth struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + Checks map[string]*structpb.Struct `protobuf:"bytes,2,rep,name=checks,proto3" json:"checks,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Mutes []*structpb.Value `protobuf:"bytes,3,rep,name=mutes,proto3" json:"mutes,omitempty"` unknownFields protoimpl.UnknownFields - - Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` - Checks map[string]*structpb.Struct `protobuf:"bytes,2,rep,name=checks,proto3" json:"checks,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Mutes []*structpb.Value `protobuf:"bytes,3,rep,name=mutes,proto3" json:"mutes,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CephStatusHealth) Reset() { *x = CephStatusHealth{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephStatusHealth) String() string { @@ -612,7 +592,7 @@ func (*CephStatusHealth) ProtoMessage() {} func (x *CephStatusHealth) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -649,22 +629,19 @@ func (x *CephStatusHealth) GetMutes() []*structpb.Value { } type CephStatusMonMap struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` - MinMonReleaseName string `protobuf:"bytes,2,opt,name=min_mon_release_name,json=minMonReleaseName,proto3" json:"min_mon_release_name,omitempty"` - NumMons int32 `protobuf:"varint,3,opt,name=num_mons,json=numMons,proto3" json:"num_mons,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` + MinMonReleaseName string `protobuf:"bytes,2,opt,name=min_mon_release_name,json=minMonReleaseName,proto3" json:"min_mon_release_name,omitempty"` + NumMons int32 `protobuf:"varint,3,opt,name=num_mons,json=numMons,proto3" json:"num_mons,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CephStatusMonMap) Reset() { *x = CephStatusMonMap{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephStatusMonMap) String() string { @@ -675,7 +652,7 @@ func (*CephStatusMonMap) ProtoMessage() {} func (x *CephStatusMonMap) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -712,26 +689,23 @@ func (x *CephStatusMonMap) GetNumMons() int32 { } type CephStatusOSDMap struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` - NumOsds int32 `protobuf:"varint,2,opt,name=num_osds,json=numOsds,proto3" json:"num_osds,omitempty"` - NumUpOsds int32 `protobuf:"varint,3,opt,name=num_up_osds,json=numUpOsds,proto3" json:"num_up_osds,omitempty"` - OsdUpSince int64 `protobuf:"varint,4,opt,name=osd_up_since,json=osdUpSince,proto3" json:"osd_up_since,omitempty"` - NumInOsds int32 `protobuf:"varint,5,opt,name=num_in_osds,json=numInOsds,proto3" json:"num_in_osds,omitempty"` - OsdInSince int64 `protobuf:"varint,6,opt,name=osd_in_since,json=osdInSince,proto3" json:"osd_in_since,omitempty"` - NumRemappedPgs int32 `protobuf:"varint,7,opt,name=num_remapped_pgs,json=numRemappedPgs,proto3" json:"num_remapped_pgs,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` + NumOsds int32 `protobuf:"varint,2,opt,name=num_osds,json=numOsds,proto3" json:"num_osds,omitempty"` + NumUpOsds int32 `protobuf:"varint,3,opt,name=num_up_osds,json=numUpOsds,proto3" json:"num_up_osds,omitempty"` + OsdUpSince int64 `protobuf:"varint,4,opt,name=osd_up_since,json=osdUpSince,proto3" json:"osd_up_since,omitempty"` + NumInOsds int32 `protobuf:"varint,5,opt,name=num_in_osds,json=numInOsds,proto3" json:"num_in_osds,omitempty"` + OsdInSince int64 `protobuf:"varint,6,opt,name=osd_in_since,json=osdInSince,proto3" json:"osd_in_since,omitempty"` + NumRemappedPgs int32 `protobuf:"varint,7,opt,name=num_remapped_pgs,json=numRemappedPgs,proto3" json:"num_remapped_pgs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CephStatusOSDMap) Reset() { *x = CephStatusOSDMap{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephStatusOSDMap) String() string { @@ -742,7 +716,7 @@ func (*CephStatusOSDMap) ProtoMessage() {} func (x *CephStatusOSDMap) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -807,27 +781,24 @@ func (x *CephStatusOSDMap) GetNumRemappedPgs() int32 { } type CephStatusPGMap struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PgsByState []*CephStatusPGState `protobuf:"bytes,1,rep,name=pgs_by_state,json=pgsByState,proto3" json:"pgs_by_state,omitempty"` + NumPgs int32 `protobuf:"varint,2,opt,name=num_pgs,json=numPgs,proto3" json:"num_pgs,omitempty"` + NumPools int32 `protobuf:"varint,3,opt,name=num_pools,json=numPools,proto3" json:"num_pools,omitempty"` + NumObjects int32 `protobuf:"varint,4,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` + DataBytes int64 `protobuf:"varint,5,opt,name=data_bytes,json=dataBytes,proto3" json:"data_bytes,omitempty"` + BytesUsed int64 `protobuf:"varint,6,opt,name=bytes_used,json=bytesUsed,proto3" json:"bytes_used,omitempty"` + BytesAvail int64 `protobuf:"varint,7,opt,name=bytes_avail,json=bytesAvail,proto3" json:"bytes_avail,omitempty"` + BytesTotal int64 `protobuf:"varint,8,opt,name=bytes_total,json=bytesTotal,proto3" json:"bytes_total,omitempty"` unknownFields protoimpl.UnknownFields - - PgsByState []*CephStatusPGState `protobuf:"bytes,1,rep,name=pgs_by_state,json=pgsByState,proto3" json:"pgs_by_state,omitempty"` - NumPgs int32 `protobuf:"varint,2,opt,name=num_pgs,json=numPgs,proto3" json:"num_pgs,omitempty"` - NumPools int32 `protobuf:"varint,3,opt,name=num_pools,json=numPools,proto3" json:"num_pools,omitempty"` - NumObjects int32 `protobuf:"varint,4,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` - DataBytes int64 `protobuf:"varint,5,opt,name=data_bytes,json=dataBytes,proto3" json:"data_bytes,omitempty"` - BytesUsed int64 `protobuf:"varint,6,opt,name=bytes_used,json=bytesUsed,proto3" json:"bytes_used,omitempty"` - BytesAvail int64 `protobuf:"varint,7,opt,name=bytes_avail,json=bytesAvail,proto3" json:"bytes_avail,omitempty"` - BytesTotal int64 `protobuf:"varint,8,opt,name=bytes_total,json=bytesTotal,proto3" json:"bytes_total,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CephStatusPGMap) Reset() { *x = CephStatusPGMap{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephStatusPGMap) String() string { @@ -838,7 +809,7 @@ func (*CephStatusPGMap) ProtoMessage() {} func (x *CephStatusPGMap) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -910,21 +881,18 @@ func (x *CephStatusPGMap) GetBytesTotal() int64 { } type CephStatusPGState struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + StateName string `protobuf:"bytes,1,opt,name=state_name,json=stateName,proto3" json:"state_name,omitempty"` + Count int32 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"` unknownFields protoimpl.UnknownFields - - StateName string `protobuf:"bytes,1,opt,name=state_name,json=stateName,proto3" json:"state_name,omitempty"` - Count int32 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CephStatusPGState) Reset() { *x = CephStatusPGState{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephStatusPGState) String() string { @@ -935,7 +903,7 @@ func (*CephStatusPGState) ProtoMessage() {} func (x *CephStatusPGState) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -965,22 +933,19 @@ func (x *CephStatusPGState) GetCount() int32 { } type CephStatusFSMap struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` + ByRank []*structpb.Value `protobuf:"bytes,2,rep,name=by_rank,json=byRank,proto3" json:"by_rank,omitempty"` + UpStandby int32 `protobuf:"varint,3,opt,name=up_standby,json=upStandby,proto3" json:"up_standby,omitempty"` unknownFields protoimpl.UnknownFields - - Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` - ByRank []*structpb.Value `protobuf:"bytes,2,rep,name=by_rank,json=byRank,proto3" json:"by_rank,omitempty"` - UpStandby int32 `protobuf:"varint,3,opt,name=up_standby,json=upStandby,proto3" json:"up_standby,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CephStatusFSMap) Reset() { *x = CephStatusFSMap{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephStatusFSMap) String() string { @@ -991,7 +956,7 @@ func (*CephStatusFSMap) ProtoMessage() {} func (x *CephStatusFSMap) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1028,23 +993,20 @@ func (x *CephStatusFSMap) GetUpStandby() int32 { } type CephStatusMgrMap struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Available bool `protobuf:"varint,1,opt,name=available,proto3" json:"available,omitempty"` + NumStandbys int32 `protobuf:"varint,2,opt,name=num_standbys,json=numStandbys,proto3" json:"num_standbys,omitempty"` + Modules []string `protobuf:"bytes,3,rep,name=modules,proto3" json:"modules,omitempty"` + Services map[string]string `protobuf:"bytes,4,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields - - Available bool `protobuf:"varint,1,opt,name=available,proto3" json:"available,omitempty"` - NumStandbys int32 `protobuf:"varint,2,opt,name=num_standbys,json=numStandbys,proto3" json:"num_standbys,omitempty"` - Modules []string `protobuf:"bytes,3,rep,name=modules,proto3" json:"modules,omitempty"` - Services map[string]string `protobuf:"bytes,4,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + sizeCache protoimpl.SizeCache } func (x *CephStatusMgrMap) Reset() { *x = CephStatusMgrMap{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephStatusMgrMap) String() string { @@ -1055,7 +1017,7 @@ func (*CephStatusMgrMap) ProtoMessage() {} func (x *CephStatusMgrMap) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1099,22 +1061,19 @@ func (x *CephStatusMgrMap) GetServices() map[string]string { } type CephStatusServiceMap struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` + Modified string `protobuf:"bytes,2,opt,name=modified,proto3" json:"modified,omitempty"` + Services map[string]*CephStatusService `protobuf:"bytes,3,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` unknownFields protoimpl.UnknownFields - - Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` - Modified string `protobuf:"bytes,2,opt,name=modified,proto3" json:"modified,omitempty"` - Services map[string]*CephStatusService `protobuf:"bytes,3,rep,name=services,proto3" json:"services,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + sizeCache protoimpl.SizeCache } func (x *CephStatusServiceMap) Reset() { *x = CephStatusServiceMap{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephStatusServiceMap) String() string { @@ -1125,7 +1084,7 @@ func (*CephStatusServiceMap) ProtoMessage() {} func (x *CephStatusServiceMap) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1162,21 +1121,18 @@ func (x *CephStatusServiceMap) GetServices() map[string]*CephStatusService { } type CephStatusService struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Daemons map[string]*structpb.Value `protobuf:"bytes,1,rep,name=daemons,proto3" json:"daemons,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` unknownFields protoimpl.UnknownFields - - Daemons map[string]*structpb.Value `protobuf:"bytes,1,rep,name=daemons,proto3" json:"daemons,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - Summary string `protobuf:"bytes,2,opt,name=summary,proto3" json:"summary,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CephStatusService) Reset() { *x = CephStatusService{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CephStatusService) String() string { @@ -1187,7 +1143,7 @@ func (*CephStatusService) ProtoMessage() {} func (x *CephStatusService) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1217,10 +1173,7 @@ func (x *CephStatusService) GetSummary() string { } type GetCephOsdDumpResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Epoch int32 `protobuf:"varint,1,opt,name=epoch,proto3" json:"epoch,omitempty"` Fsid string `protobuf:"bytes,2,opt,name=fsid,proto3" json:"fsid,omitempty"` Created *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=created,proto3" json:"created,omitempty"` @@ -1249,24 +1202,24 @@ type GetCephOsdDumpResponse struct { PgUpmapPrimaries []*structpb.Value `protobuf:"bytes,26,rep,name=pg_upmap_primaries,json=pgUpmapPrimaries,proto3" json:"pg_upmap_primaries,omitempty"` PgTemp []*structpb.Value `protobuf:"bytes,27,rep,name=pg_temp,json=pgTemp,proto3" json:"pg_temp,omitempty"` PrimaryTemp []*structpb.Value `protobuf:"bytes,28,rep,name=primary_temp,json=primaryTemp,proto3" json:"primary_temp,omitempty"` - Blocklist map[string]*timestamppb.Timestamp `protobuf:"bytes,29,rep,name=blocklist,proto3" json:"blocklist,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + Blocklist map[string]*timestamppb.Timestamp `protobuf:"bytes,29,rep,name=blocklist,proto3" json:"blocklist,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` RangeBlocklist *structpb.Struct `protobuf:"bytes,30,opt,name=range_blocklist,json=rangeBlocklist,proto3" json:"range_blocklist,omitempty"` - ErasureCodeProfiles map[string]*OsdDumpErasureCodeProfile `protobuf:"bytes,31,rep,name=erasure_code_profiles,json=erasureCodeProfiles,proto3" json:"erasure_code_profiles,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ErasureCodeProfiles map[string]*OsdDumpErasureCodeProfile `protobuf:"bytes,31,rep,name=erasure_code_profiles,json=erasureCodeProfiles,proto3" json:"erasure_code_profiles,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` RemovedSnapsQueue []*structpb.Value `protobuf:"bytes,32,rep,name=removed_snaps_queue,json=removedSnapsQueue,proto3" json:"removed_snaps_queue,omitempty"` NewRemovedSnaps []*structpb.Value `protobuf:"bytes,33,rep,name=new_removed_snaps,json=newRemovedSnaps,proto3" json:"new_removed_snaps,omitempty"` NewPurgedSnaps []*structpb.Value `protobuf:"bytes,34,rep,name=new_purged_snaps,json=newPurgedSnaps,proto3" json:"new_purged_snaps,omitempty"` CrushNodeFlags *structpb.Struct `protobuf:"bytes,35,opt,name=crush_node_flags,json=crushNodeFlags,proto3" json:"crush_node_flags,omitempty"` DeviceClassFlags *structpb.Struct `protobuf:"bytes,36,opt,name=device_class_flags,json=deviceClassFlags,proto3" json:"device_class_flags,omitempty"` StretchMode *OsdDumpStretchMode `protobuf:"bytes,37,opt,name=stretch_mode,json=stretchMode,proto3" json:"stretch_mode,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *GetCephOsdDumpResponse) Reset() { *x = GetCephOsdDumpResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[15] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetCephOsdDumpResponse) String() string { @@ -1277,7 +1230,7 @@ func (*GetCephOsdDumpResponse) ProtoMessage() {} func (x *GetCephOsdDumpResponse) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[15] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1552,10 +1505,7 @@ func (x *GetCephOsdDumpResponse) GetStretchMode() *OsdDumpStretchMode { } type OsdDumpPool struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Pool int32 `protobuf:"varint,1,opt,name=pool,proto3" json:"pool,omitempty"` PoolName string `protobuf:"bytes,2,opt,name=pool_name,json=poolName,proto3" json:"pool_name,omitempty"` CreateTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"` @@ -1617,15 +1567,15 @@ type OsdDumpPool struct { Options *structpb.Struct `protobuf:"bytes,59,opt,name=options,proto3" json:"options,omitempty"` ApplicationMetadata *structpb.Struct `protobuf:"bytes,60,opt,name=application_metadata,json=applicationMetadata,proto3" json:"application_metadata,omitempty"` ReadBalance *OsdDumpReadBalance `protobuf:"bytes,61,opt,name=read_balance,json=readBalance,proto3" json:"read_balance,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdDumpPool) Reset() { *x = OsdDumpPool{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[16] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpPool) String() string { @@ -1636,7 +1586,7 @@ func (*OsdDumpPool) ProtoMessage() {} func (x *OsdDumpPool) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[16] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2079,25 +2029,22 @@ func (x *OsdDumpPool) GetReadBalance() *OsdDumpReadBalance { } type OsdDumpLastPgMergeMeta struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SourcePgid string `protobuf:"bytes,1,opt,name=source_pgid,json=sourcePgid,proto3" json:"source_pgid,omitempty"` - ReadyEpoch int32 `protobuf:"varint,2,opt,name=ready_epoch,json=readyEpoch,proto3" json:"ready_epoch,omitempty"` - LastEpochStarted int32 `protobuf:"varint,3,opt,name=last_epoch_started,json=lastEpochStarted,proto3" json:"last_epoch_started,omitempty"` - LastEpochClean int32 `protobuf:"varint,4,opt,name=last_epoch_clean,json=lastEpochClean,proto3" json:"last_epoch_clean,omitempty"` - SourceVersion string `protobuf:"bytes,5,opt,name=source_version,json=sourceVersion,proto3" json:"source_version,omitempty"` - TargetVersion string `protobuf:"bytes,6,opt,name=target_version,json=targetVersion,proto3" json:"target_version,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + SourcePgid string `protobuf:"bytes,1,opt,name=source_pgid,json=sourcePgid,proto3" json:"source_pgid,omitempty"` + ReadyEpoch int32 `protobuf:"varint,2,opt,name=ready_epoch,json=readyEpoch,proto3" json:"ready_epoch,omitempty"` + LastEpochStarted int32 `protobuf:"varint,3,opt,name=last_epoch_started,json=lastEpochStarted,proto3" json:"last_epoch_started,omitempty"` + LastEpochClean int32 `protobuf:"varint,4,opt,name=last_epoch_clean,json=lastEpochClean,proto3" json:"last_epoch_clean,omitempty"` + SourceVersion string `protobuf:"bytes,5,opt,name=source_version,json=sourceVersion,proto3" json:"source_version,omitempty"` + TargetVersion string `protobuf:"bytes,6,opt,name=target_version,json=targetVersion,proto3" json:"target_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdDumpLastPgMergeMeta) Reset() { *x = OsdDumpLastPgMergeMeta{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[17] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpLastPgMergeMeta) String() string { @@ -2108,7 +2055,7 @@ func (*OsdDumpLastPgMergeMeta) ProtoMessage() {} func (x *OsdDumpLastPgMergeMeta) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[17] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2166,20 +2113,17 @@ func (x *OsdDumpLastPgMergeMeta) GetTargetVersion() string { } type OsdDumpHitSetParams struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdDumpHitSetParams) Reset() { *x = OsdDumpHitSetParams{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[18] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpHitSetParams) String() string { @@ -2190,7 +2134,7 @@ func (*OsdDumpHitSetParams) ProtoMessage() {} func (x *OsdDumpHitSetParams) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[18] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2213,27 +2157,24 @@ func (x *OsdDumpHitSetParams) GetType() string { } type OsdDumpReadBalance struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ScoreActing float64 `protobuf:"fixed64,1,opt,name=score_acting,json=scoreActing,proto3" json:"score_acting,omitempty"` - ScoreStable float64 `protobuf:"fixed64,2,opt,name=score_stable,json=scoreStable,proto3" json:"score_stable,omitempty"` - OptimalScore float64 `protobuf:"fixed64,3,opt,name=optimal_score,json=optimalScore,proto3" json:"optimal_score,omitempty"` - RawScoreActing float64 `protobuf:"fixed64,4,opt,name=raw_score_acting,json=rawScoreActing,proto3" json:"raw_score_acting,omitempty"` - RawScoreStable float64 `protobuf:"fixed64,5,opt,name=raw_score_stable,json=rawScoreStable,proto3" json:"raw_score_stable,omitempty"` - PrimaryAffinityWeighted float64 `protobuf:"fixed64,6,opt,name=primary_affinity_weighted,json=primaryAffinityWeighted,proto3" json:"primary_affinity_weighted,omitempty"` - AveragePrimaryAffinity float64 `protobuf:"fixed64,7,opt,name=average_primary_affinity,json=averagePrimaryAffinity,proto3" json:"average_primary_affinity,omitempty"` - AveragePrimaryAffinityWeighted float64 `protobuf:"fixed64,8,opt,name=average_primary_affinity_weighted,json=averagePrimaryAffinityWeighted,proto3" json:"average_primary_affinity_weighted,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + ScoreActing float64 `protobuf:"fixed64,1,opt,name=score_acting,json=scoreActing,proto3" json:"score_acting,omitempty"` + ScoreStable float64 `protobuf:"fixed64,2,opt,name=score_stable,json=scoreStable,proto3" json:"score_stable,omitempty"` + OptimalScore float64 `protobuf:"fixed64,3,opt,name=optimal_score,json=optimalScore,proto3" json:"optimal_score,omitempty"` + RawScoreActing float64 `protobuf:"fixed64,4,opt,name=raw_score_acting,json=rawScoreActing,proto3" json:"raw_score_acting,omitempty"` + RawScoreStable float64 `protobuf:"fixed64,5,opt,name=raw_score_stable,json=rawScoreStable,proto3" json:"raw_score_stable,omitempty"` + PrimaryAffinityWeighted float64 `protobuf:"fixed64,6,opt,name=primary_affinity_weighted,json=primaryAffinityWeighted,proto3" json:"primary_affinity_weighted,omitempty"` + AveragePrimaryAffinity float64 `protobuf:"fixed64,7,opt,name=average_primary_affinity,json=averagePrimaryAffinity,proto3" json:"average_primary_affinity,omitempty"` + AveragePrimaryAffinityWeighted float64 `protobuf:"fixed64,8,opt,name=average_primary_affinity_weighted,json=averagePrimaryAffinityWeighted,proto3" json:"average_primary_affinity_weighted,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdDumpReadBalance) Reset() { *x = OsdDumpReadBalance{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[19] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpReadBalance) String() string { @@ -2244,7 +2185,7 @@ func (*OsdDumpReadBalance) ProtoMessage() {} func (x *OsdDumpReadBalance) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[19] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2316,10 +2257,7 @@ func (x *OsdDumpReadBalance) GetAveragePrimaryAffinityWeighted() float64 { } type OsdDumpOsdInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Osd int32 `protobuf:"varint,1,opt,name=osd,proto3" json:"osd,omitempty"` Uuid string `protobuf:"bytes,2,opt,name=uuid,proto3" json:"uuid,omitempty"` Up int32 `protobuf:"varint,3,opt,name=up,proto3" json:"up,omitempty"` @@ -2341,15 +2279,15 @@ type OsdDumpOsdInfo struct { HeartbeatBackAddr string `protobuf:"bytes,19,opt,name=heartbeat_back_addr,json=heartbeatBackAddr,proto3" json:"heartbeat_back_addr,omitempty"` HeartbeatFrontAddr string `protobuf:"bytes,20,opt,name=heartbeat_front_addr,json=heartbeatFrontAddr,proto3" json:"heartbeat_front_addr,omitempty"` State []string `protobuf:"bytes,21,rep,name=state,proto3" json:"state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdDumpOsdInfo) Reset() { *x = OsdDumpOsdInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[20] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpOsdInfo) String() string { @@ -2360,7 +2298,7 @@ func (*OsdDumpOsdInfo) ProtoMessage() {} func (x *OsdDumpOsdInfo) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[20] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2523,20 +2461,17 @@ func (x *OsdDumpOsdInfo) GetState() []string { } type OsdDumpPublicAddrs struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Addrvec []*OsdDumpAddrVec `protobuf:"bytes,1,rep,name=addrvec,proto3" json:"addrvec,omitempty"` unknownFields protoimpl.UnknownFields - - Addrvec []*OsdDumpAddrVec `protobuf:"bytes,1,rep,name=addrvec,proto3" json:"addrvec,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdDumpPublicAddrs) Reset() { *x = OsdDumpPublicAddrs{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[21] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpPublicAddrs) String() string { @@ -2547,7 +2482,7 @@ func (*OsdDumpPublicAddrs) ProtoMessage() {} func (x *OsdDumpPublicAddrs) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[21] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2570,20 +2505,17 @@ func (x *OsdDumpPublicAddrs) GetAddrvec() []*OsdDumpAddrVec { } type OsdDumpClusterAddrs struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Addrvec []*OsdDumpAddrVec `protobuf:"bytes,1,rep,name=addrvec,proto3" json:"addrvec,omitempty"` unknownFields protoimpl.UnknownFields - - Addrvec []*OsdDumpAddrVec `protobuf:"bytes,1,rep,name=addrvec,proto3" json:"addrvec,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdDumpClusterAddrs) Reset() { *x = OsdDumpClusterAddrs{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[22] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpClusterAddrs) String() string { @@ -2594,7 +2526,7 @@ func (*OsdDumpClusterAddrs) ProtoMessage() {} func (x *OsdDumpClusterAddrs) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[22] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2617,20 +2549,17 @@ func (x *OsdDumpClusterAddrs) GetAddrvec() []*OsdDumpAddrVec { } type OsdDumpHeartbeatAddrs struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Addrvec []*OsdDumpAddrVec `protobuf:"bytes,1,rep,name=addrvec,proto3" json:"addrvec,omitempty"` unknownFields protoimpl.UnknownFields - - Addrvec []*OsdDumpAddrVec `protobuf:"bytes,1,rep,name=addrvec,proto3" json:"addrvec,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdDumpHeartbeatAddrs) Reset() { *x = OsdDumpHeartbeatAddrs{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[23] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpHeartbeatAddrs) String() string { @@ -2641,7 +2570,7 @@ func (*OsdDumpHeartbeatAddrs) ProtoMessage() {} func (x *OsdDumpHeartbeatAddrs) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[23] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2664,22 +2593,19 @@ func (x *OsdDumpHeartbeatAddrs) GetAddrvec() []*OsdDumpAddrVec { } type OsdDumpAddrVec struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` + Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"` + Nonce uint64 `protobuf:"varint,3,opt,name=nonce,proto3" json:"nonce,omitempty"` unknownFields protoimpl.UnknownFields - - Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"` - Addr string `protobuf:"bytes,2,opt,name=addr,proto3" json:"addr,omitempty"` - Nonce uint64 `protobuf:"varint,3,opt,name=nonce,proto3" json:"nonce,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdDumpAddrVec) Reset() { *x = OsdDumpAddrVec{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[24] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpAddrVec) String() string { @@ -2690,7 +2616,7 @@ func (*OsdDumpAddrVec) ProtoMessage() {} func (x *OsdDumpAddrVec) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[24] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2727,10 +2653,7 @@ func (x *OsdDumpAddrVec) GetNonce() uint64 { } type OsdDumpOsdXInfo struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Osd int32 `protobuf:"varint,1,opt,name=osd,proto3" json:"osd,omitempty"` DownStamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=down_stamp,json=downStamp,proto3" json:"down_stamp,omitempty"` LaggyProbability float64 `protobuf:"fixed64,3,opt,name=laggy_probability,json=laggyProbability,proto3" json:"laggy_probability,omitempty"` @@ -2739,15 +2662,15 @@ type OsdDumpOsdXInfo struct { OldWeight float64 `protobuf:"fixed64,6,opt,name=old_weight,json=oldWeight,proto3" json:"old_weight,omitempty"` LastPurgedSnapsScrub *timestamppb.Timestamp `protobuf:"bytes,7,opt,name=last_purged_snaps_scrub,json=lastPurgedSnapsScrub,proto3" json:"last_purged_snaps_scrub,omitempty"` DeadEpoch int32 `protobuf:"varint,8,opt,name=dead_epoch,json=deadEpoch,proto3" json:"dead_epoch,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdDumpOsdXInfo) Reset() { *x = OsdDumpOsdXInfo{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[25] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpOsdXInfo) String() string { @@ -2758,7 +2681,7 @@ func (*OsdDumpOsdXInfo) ProtoMessage() {} func (x *OsdDumpOsdXInfo) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[25] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2830,23 +2753,20 @@ func (x *OsdDumpOsdXInfo) GetDeadEpoch() int32 { } type OsdDumpErasureCodeProfile struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + K string `protobuf:"bytes,1,opt,name=k,proto3" json:"k,omitempty"` + M string `protobuf:"bytes,2,opt,name=m,proto3" json:"m,omitempty"` + Plugin string `protobuf:"bytes,3,opt,name=plugin,proto3" json:"plugin,omitempty"` + Technique string `protobuf:"bytes,4,opt,name=technique,proto3" json:"technique,omitempty"` unknownFields protoimpl.UnknownFields - - K string `protobuf:"bytes,1,opt,name=k,proto3" json:"k,omitempty"` - M string `protobuf:"bytes,2,opt,name=m,proto3" json:"m,omitempty"` - Plugin string `protobuf:"bytes,3,opt,name=plugin,proto3" json:"plugin,omitempty"` - Technique string `protobuf:"bytes,4,opt,name=technique,proto3" json:"technique,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdDumpErasureCodeProfile) Reset() { *x = OsdDumpErasureCodeProfile{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[26] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpErasureCodeProfile) String() string { @@ -2857,7 +2777,7 @@ func (*OsdDumpErasureCodeProfile) ProtoMessage() {} func (x *OsdDumpErasureCodeProfile) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[26] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2901,24 +2821,21 @@ func (x *OsdDumpErasureCodeProfile) GetTechnique() string { } type OsdDumpStretchMode struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - StretchModeEnabled bool `protobuf:"varint,1,opt,name=stretch_mode_enabled,json=stretchModeEnabled,proto3" json:"stretch_mode_enabled,omitempty"` - StretchBucketCount int32 `protobuf:"varint,2,opt,name=stretch_bucket_count,json=stretchBucketCount,proto3" json:"stretch_bucket_count,omitempty"` - DegradedStretchMode int32 `protobuf:"varint,3,opt,name=degraded_stretch_mode,json=degradedStretchMode,proto3" json:"degraded_stretch_mode,omitempty"` - RecoveringStretchMode int32 `protobuf:"varint,4,opt,name=recovering_stretch_mode,json=recoveringStretchMode,proto3" json:"recovering_stretch_mode,omitempty"` - StretchModeBucket int32 `protobuf:"varint,5,opt,name=stretch_mode_bucket,json=stretchModeBucket,proto3" json:"stretch_mode_bucket,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + StretchModeEnabled bool `protobuf:"varint,1,opt,name=stretch_mode_enabled,json=stretchModeEnabled,proto3" json:"stretch_mode_enabled,omitempty"` + StretchBucketCount int32 `protobuf:"varint,2,opt,name=stretch_bucket_count,json=stretchBucketCount,proto3" json:"stretch_bucket_count,omitempty"` + DegradedStretchMode int32 `protobuf:"varint,3,opt,name=degraded_stretch_mode,json=degradedStretchMode,proto3" json:"degraded_stretch_mode,omitempty"` + RecoveringStretchMode int32 `protobuf:"varint,4,opt,name=recovering_stretch_mode,json=recoveringStretchMode,proto3" json:"recovering_stretch_mode,omitempty"` + StretchModeBucket int32 `protobuf:"varint,5,opt,name=stretch_mode_bucket,json=stretchModeBucket,proto3" json:"stretch_mode_bucket,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdDumpStretchMode) Reset() { *x = OsdDumpStretchMode{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[27] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdDumpStretchMode) String() string { @@ -2929,7 +2846,7 @@ func (*OsdDumpStretchMode) ProtoMessage() {} func (x *OsdDumpStretchMode) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[27] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -2981,21 +2898,18 @@ func (x *OsdDumpStretchMode) GetStretchModeBucket() int32 { // PG DUMP type GetCephPgDumpResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + PgReady bool `protobuf:"varint,1,opt,name=pg_ready,json=pgReady,proto3" json:"pg_ready,omitempty"` + PgMap *PGMap `protobuf:"bytes,2,opt,name=pg_map,json=pgMap,proto3" json:"pg_map,omitempty"` unknownFields protoimpl.UnknownFields - - PgReady bool `protobuf:"varint,1,opt,name=pg_ready,json=pgReady,proto3" json:"pg_ready,omitempty"` - PgMap *PGMap `protobuf:"bytes,2,opt,name=pg_map,json=pgMap,proto3" json:"pg_map,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetCephPgDumpResponse) Reset() { *x = GetCephPgDumpResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[28] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetCephPgDumpResponse) String() string { @@ -3006,7 +2920,7 @@ func (*GetCephPgDumpResponse) ProtoMessage() {} func (x *GetCephPgDumpResponse) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[28] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3036,10 +2950,7 @@ func (x *GetCephPgDumpResponse) GetPgMap() *PGMap { } type PGMap struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Version int64 `protobuf:"varint,1,opt,name=version,proto3" json:"version,omitempty"` Stamp *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=stamp,proto3" json:"stamp,omitempty"` LastOsdmapEpoch int64 `protobuf:"varint,3,opt,name=last_osdmap_epoch,json=lastOsdmapEpoch,proto3" json:"last_osdmap_epoch,omitempty"` @@ -3051,15 +2962,15 @@ type PGMap struct { PoolStats []*PoolStats `protobuf:"bytes,9,rep,name=pool_stats,json=poolStats,proto3" json:"pool_stats,omitempty"` OsdStats []*OsdStats `protobuf:"bytes,10,rep,name=osd_stats,json=osdStats,proto3" json:"osd_stats,omitempty"` PoolStatfs []*PoolStatFs `protobuf:"bytes,11,rep,name=pool_statfs,json=poolStatfs,proto3" json:"pool_statfs,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PGMap) Reset() { *x = PGMap{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[29] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PGMap) String() string { @@ -3070,7 +2981,7 @@ func (*PGMap) ProtoMessage() {} func (x *PGMap) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[29] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3163,10 +3074,7 @@ func (x *PGMap) GetPoolStatfs() []*PoolStatFs { } type PGStatsSum struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` StatSum *PGStatsSum_PGStatsSum_StatSum `protobuf:"bytes,1,opt,name=stat_sum,json=statSum,proto3" json:"stat_sum,omitempty"` StoreStats *PGStatsSum_PGStatsSum_StoreStats `protobuf:"bytes,2,opt,name=store_stats,json=storeStats,proto3" json:"store_stats,omitempty"` LogSize int64 `protobuf:"varint,3,opt,name=log_size,json=logSize,proto3" json:"log_size,omitempty"` @@ -3174,15 +3082,15 @@ type PGStatsSum struct { Up int64 `protobuf:"varint,5,opt,name=up,proto3" json:"up,omitempty"` Acting int64 `protobuf:"varint,6,opt,name=acting,proto3" json:"acting,omitempty"` NumStoreStats int64 `protobuf:"varint,7,opt,name=num_store_stats,json=numStoreStats,proto3" json:"num_store_stats,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PGStatsSum) Reset() { *x = PGStatsSum{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[30] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PGStatsSum) String() string { @@ -3193,7 +3101,7 @@ func (*PGStatsSum) ProtoMessage() {} func (x *PGStatsSum) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[30] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3258,10 +3166,7 @@ func (x *PGStatsSum) GetNumStoreStats() int64 { } type OSDStatsSum struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` UpFrom int64 `protobuf:"varint,1,opt,name=up_from,json=upFrom,proto3" json:"up_from,omitempty"` Seq int64 `protobuf:"varint,2,opt,name=seq,proto3" json:"seq,omitempty"` NumPgs int64 `protobuf:"varint,3,opt,name=num_pgs,json=numPgs,proto3" json:"num_pgs,omitempty"` @@ -3283,15 +3188,15 @@ type OSDStatsSum struct { PerfStat *OSDStatsSum_PerfStat `protobuf:"bytes,19,opt,name=perf_stat,json=perfStat,proto3" json:"perf_stat,omitempty"` Alerts []string `protobuf:"bytes,20,rep,name=alerts,proto3" json:"alerts,omitempty"` NetworkPingTimes []*OSDStatsSum_NetworkPingTime `protobuf:"bytes,21,rep,name=network_ping_times,json=networkPingTimes,proto3" json:"network_ping_times,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OSDStatsSum) Reset() { *x = OSDStatsSum{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[31] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OSDStatsSum) String() string { @@ -3302,7 +3207,7 @@ func (*OSDStatsSum) ProtoMessage() {} func (x *OSDStatsSum) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[31] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3465,10 +3370,7 @@ func (x *OSDStatsSum) GetNetworkPingTimes() []*OSDStatsSum_NetworkPingTime { } type PGStatsDelta struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` StatSum *PGStatsDelta_PGStatsDelta_StatSum `protobuf:"bytes,1,opt,name=stat_sum,json=statSum,proto3" json:"stat_sum,omitempty"` StoreStats *PGStatsDelta_PGStatsDelta_StoreStats `protobuf:"bytes,2,opt,name=store_stats,json=storeStats,proto3" json:"store_stats,omitempty"` LogSize int64 `protobuf:"varint,3,opt,name=log_size,json=logSize,proto3" json:"log_size,omitempty"` @@ -3477,15 +3379,15 @@ type PGStatsDelta struct { Acting int64 `protobuf:"varint,6,opt,name=acting,proto3" json:"acting,omitempty"` NumStoreStats int64 `protobuf:"varint,7,opt,name=num_store_stats,json=numStoreStats,proto3" json:"num_store_stats,omitempty"` StampDelta string `protobuf:"bytes,8,opt,name=stamp_delta,json=stampDelta,proto3" json:"stamp_delta,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PGStatsDelta) Reset() { *x = PGStatsDelta{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[32] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PGStatsDelta) String() string { @@ -3496,7 +3398,7 @@ func (*PGStatsDelta) ProtoMessage() {} func (x *PGStatsDelta) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[32] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -3568,10 +3470,7 @@ func (x *PGStatsDelta) GetStampDelta() string { } type PGStat struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Pgid string `protobuf:"bytes,1,opt,name=pgid,proto3" json:"pgid,omitempty"` Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` ReportedSeq int64 `protobuf:"varint,3,opt,name=reported_seq,json=reportedSeq,proto3" json:"reported_seq,omitempty"` @@ -3625,15 +3524,15 @@ type PGStat struct { UpPrimary int64 `protobuf:"varint,51,opt,name=up_primary,json=upPrimary,proto3" json:"up_primary,omitempty"` ActingPrimary int64 `protobuf:"varint,52,opt,name=acting_primary,json=actingPrimary,proto3" json:"acting_primary,omitempty"` PurgedSnaps []int64 `protobuf:"varint,53,rep,packed,name=purged_snaps,json=purgedSnaps,proto3" json:"purged_snaps,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PGStat) Reset() { *x = PGStat{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[33] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PGStat) String() string { @@ -3644,7 +3543,7 @@ func (*PGStat) ProtoMessage() {} func (x *PGStat) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[33] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4031,10 +3930,7 @@ func (x *PGStat) GetPurgedSnaps() []int64 { } type PoolStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Poolid int64 `protobuf:"varint,1,opt,name=poolid,proto3" json:"poolid,omitempty"` NumPg int64 `protobuf:"varint,2,opt,name=num_pg,json=numPg,proto3" json:"num_pg,omitempty"` StatSum *PoolStats_PoolStats_StatSum `protobuf:"bytes,3,opt,name=stat_sum,json=statSum,proto3" json:"stat_sum,omitempty"` @@ -4044,15 +3940,15 @@ type PoolStats struct { Up int64 `protobuf:"varint,7,opt,name=up,proto3" json:"up,omitempty"` Acting int64 `protobuf:"varint,8,opt,name=acting,proto3" json:"acting,omitempty"` NumStoreStats int64 `protobuf:"varint,9,opt,name=num_store_stats,json=numStoreStats,proto3" json:"num_store_stats,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PoolStats) Reset() { *x = PoolStats{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[34] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PoolStats) String() string { @@ -4063,7 +3959,7 @@ func (*PoolStats) ProtoMessage() {} func (x *PoolStats) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[34] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4142,10 +4038,7 @@ func (x *PoolStats) GetNumStoreStats() int64 { } type OsdStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Osd int64 `protobuf:"varint,1,opt,name=osd,proto3" json:"osd,omitempty"` UpFrom int64 `protobuf:"varint,2,opt,name=up_from,json=upFrom,proto3" json:"up_from,omitempty"` Seq int64 `protobuf:"varint,3,opt,name=seq,proto3" json:"seq,omitempty"` @@ -4168,15 +4061,15 @@ type OsdStats struct { PerfStat *OsdStats_PerfStat `protobuf:"bytes,20,opt,name=perf_stat,json=perfStat,proto3" json:"perf_stat,omitempty"` Alerts []string `protobuf:"bytes,21,rep,name=alerts,proto3" json:"alerts,omitempty"` NetworkPingTimes []*OsdStats_NetworkPingTime `protobuf:"bytes,22,rep,name=network_ping_times,json=networkPingTimes,proto3" json:"network_ping_times,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdStats) Reset() { *x = OsdStats{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[35] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdStats) String() string { @@ -4187,7 +4080,7 @@ func (*OsdStats) ProtoMessage() {} func (x *OsdStats) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[35] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4357,31 +4250,28 @@ func (x *OsdStats) GetNetworkPingTimes() []*OsdStats_NetworkPingTime { } type PoolStatFs struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Poolid int64 `protobuf:"varint,1,opt,name=poolid,proto3" json:"poolid,omitempty"` - Osd int64 `protobuf:"varint,2,opt,name=osd,proto3" json:"osd,omitempty"` - Total int64 `protobuf:"varint,3,opt,name=total,proto3" json:"total,omitempty"` - Available int64 `protobuf:"varint,4,opt,name=available,proto3" json:"available,omitempty"` - InternallyReserved int64 `protobuf:"varint,5,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` - Allocated int64 `protobuf:"varint,6,opt,name=allocated,proto3" json:"allocated,omitempty"` - DataStored int64 `protobuf:"varint,7,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` - DataCompressed int64 `protobuf:"varint,8,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` - DataCompressedAllocated int64 `protobuf:"varint,9,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` - DataCompressedOriginal int64 `protobuf:"varint,10,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` - OmapAllocated int64 `protobuf:"varint,11,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` - InternalMetadata int64 `protobuf:"varint,12,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Poolid int64 `protobuf:"varint,1,opt,name=poolid,proto3" json:"poolid,omitempty"` + Osd int64 `protobuf:"varint,2,opt,name=osd,proto3" json:"osd,omitempty"` + Total int64 `protobuf:"varint,3,opt,name=total,proto3" json:"total,omitempty"` + Available int64 `protobuf:"varint,4,opt,name=available,proto3" json:"available,omitempty"` + InternallyReserved int64 `protobuf:"varint,5,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` + Allocated int64 `protobuf:"varint,6,opt,name=allocated,proto3" json:"allocated,omitempty"` + DataStored int64 `protobuf:"varint,7,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` + DataCompressed int64 `protobuf:"varint,8,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` + DataCompressedAllocated int64 `protobuf:"varint,9,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` + DataCompressedOriginal int64 `protobuf:"varint,10,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` + OmapAllocated int64 `protobuf:"varint,11,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` + InternalMetadata int64 `protobuf:"varint,12,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PoolStatFs) Reset() { *x = PoolStatFs{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[36] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PoolStatFs) String() string { @@ -4392,7 +4282,7 @@ func (*PoolStatFs) ProtoMessage() {} func (x *PoolStatFs) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[36] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4492,59 +4382,56 @@ func (x *PoolStatFs) GetInternalMetadata() int64 { } type PGStatsSum_PGStatsSum_StatSum struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NumBytes int64 `protobuf:"varint,1,opt,name=num_bytes,json=numBytes,proto3" json:"num_bytes,omitempty"` - NumObjects int64 `protobuf:"varint,2,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` - NumObjectClones int64 `protobuf:"varint,3,opt,name=num_object_clones,json=numObjectClones,proto3" json:"num_object_clones,omitempty"` - NumObjectCopies int64 `protobuf:"varint,4,opt,name=num_object_copies,json=numObjectCopies,proto3" json:"num_object_copies,omitempty"` - NumObjectsMissingOnPrimary int64 `protobuf:"varint,5,opt,name=num_objects_missing_on_primary,json=numObjectsMissingOnPrimary,proto3" json:"num_objects_missing_on_primary,omitempty"` - NumObjectsMissing int64 `protobuf:"varint,6,opt,name=num_objects_missing,json=numObjectsMissing,proto3" json:"num_objects_missing,omitempty"` - NumObjectsDegraded int64 `protobuf:"varint,7,opt,name=num_objects_degraded,json=numObjectsDegraded,proto3" json:"num_objects_degraded,omitempty"` - NumObjectsMisplaced int64 `protobuf:"varint,8,opt,name=num_objects_misplaced,json=numObjectsMisplaced,proto3" json:"num_objects_misplaced,omitempty"` - NumObjectsUnfound int64 `protobuf:"varint,9,opt,name=num_objects_unfound,json=numObjectsUnfound,proto3" json:"num_objects_unfound,omitempty"` - NumObjectsDirty int64 `protobuf:"varint,10,opt,name=num_objects_dirty,json=numObjectsDirty,proto3" json:"num_objects_dirty,omitempty"` - NumWhiteouts int64 `protobuf:"varint,11,opt,name=num_whiteouts,json=numWhiteouts,proto3" json:"num_whiteouts,omitempty"` - NumRead int64 `protobuf:"varint,12,opt,name=num_read,json=numRead,proto3" json:"num_read,omitempty"` - NumReadKb int64 `protobuf:"varint,13,opt,name=num_read_kb,json=numReadKb,proto3" json:"num_read_kb,omitempty"` - NumWrite int64 `protobuf:"varint,14,opt,name=num_write,json=numWrite,proto3" json:"num_write,omitempty"` - NumWriteKb int64 `protobuf:"varint,15,opt,name=num_write_kb,json=numWriteKb,proto3" json:"num_write_kb,omitempty"` - NumScrubErrors int64 `protobuf:"varint,16,opt,name=num_scrub_errors,json=numScrubErrors,proto3" json:"num_scrub_errors,omitempty"` - NumShallowScrubErrors int64 `protobuf:"varint,17,opt,name=num_shallow_scrub_errors,json=numShallowScrubErrors,proto3" json:"num_shallow_scrub_errors,omitempty"` - NumDeepScrubErrors int64 `protobuf:"varint,18,opt,name=num_deep_scrub_errors,json=numDeepScrubErrors,proto3" json:"num_deep_scrub_errors,omitempty"` - NumObjectsRecovered int64 `protobuf:"varint,19,opt,name=num_objects_recovered,json=numObjectsRecovered,proto3" json:"num_objects_recovered,omitempty"` - NumBytesRecovered int64 `protobuf:"varint,20,opt,name=num_bytes_recovered,json=numBytesRecovered,proto3" json:"num_bytes_recovered,omitempty"` - NumKeysRecovered int64 `protobuf:"varint,21,opt,name=num_keys_recovered,json=numKeysRecovered,proto3" json:"num_keys_recovered,omitempty"` - NumObjectsOmap int64 `protobuf:"varint,22,opt,name=num_objects_omap,json=numObjectsOmap,proto3" json:"num_objects_omap,omitempty"` - NumObjectsHitSetArchive int64 `protobuf:"varint,23,opt,name=num_objects_hit_set_archive,json=numObjectsHitSetArchive,proto3" json:"num_objects_hit_set_archive,omitempty"` - NumBytesHitSetArchive int64 `protobuf:"varint,24,opt,name=num_bytes_hit_set_archive,json=numBytesHitSetArchive,proto3" json:"num_bytes_hit_set_archive,omitempty"` - NumFlush int64 `protobuf:"varint,25,opt,name=num_flush,json=numFlush,proto3" json:"num_flush,omitempty"` - NumFlushKb int64 `protobuf:"varint,26,opt,name=num_flush_kb,json=numFlushKb,proto3" json:"num_flush_kb,omitempty"` - NumEvict int64 `protobuf:"varint,27,opt,name=num_evict,json=numEvict,proto3" json:"num_evict,omitempty"` - NumEvictKb int64 `protobuf:"varint,28,opt,name=num_evict_kb,json=numEvictKb,proto3" json:"num_evict_kb,omitempty"` - NumPromote int64 `protobuf:"varint,29,opt,name=num_promote,json=numPromote,proto3" json:"num_promote,omitempty"` - NumFlushModeHigh int64 `protobuf:"varint,30,opt,name=num_flush_mode_high,json=numFlushModeHigh,proto3" json:"num_flush_mode_high,omitempty"` - NumFlushModeLow int64 `protobuf:"varint,31,opt,name=num_flush_mode_low,json=numFlushModeLow,proto3" json:"num_flush_mode_low,omitempty"` - NumEvictModeSome int64 `protobuf:"varint,32,opt,name=num_evict_mode_some,json=numEvictModeSome,proto3" json:"num_evict_mode_some,omitempty"` - NumEvictModeFull int64 `protobuf:"varint,33,opt,name=num_evict_mode_full,json=numEvictModeFull,proto3" json:"num_evict_mode_full,omitempty"` - NumObjectsPinned int64 `protobuf:"varint,34,opt,name=num_objects_pinned,json=numObjectsPinned,proto3" json:"num_objects_pinned,omitempty"` - NumLegacySnapsets int64 `protobuf:"varint,35,opt,name=num_legacy_snapsets,json=numLegacySnapsets,proto3" json:"num_legacy_snapsets,omitempty"` - NumLargeOmapObjects int64 `protobuf:"varint,36,opt,name=num_large_omap_objects,json=numLargeOmapObjects,proto3" json:"num_large_omap_objects,omitempty"` - NumObjectsManifest int64 `protobuf:"varint,37,opt,name=num_objects_manifest,json=numObjectsManifest,proto3" json:"num_objects_manifest,omitempty"` - NumOmapBytes int64 `protobuf:"varint,38,opt,name=num_omap_bytes,json=numOmapBytes,proto3" json:"num_omap_bytes,omitempty"` - NumOmapKeys int64 `protobuf:"varint,39,opt,name=num_omap_keys,json=numOmapKeys,proto3" json:"num_omap_keys,omitempty"` - NumObjectsRepaired int64 `protobuf:"varint,40,opt,name=num_objects_repaired,json=numObjectsRepaired,proto3" json:"num_objects_repaired,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + NumBytes int64 `protobuf:"varint,1,opt,name=num_bytes,json=numBytes,proto3" json:"num_bytes,omitempty"` + NumObjects int64 `protobuf:"varint,2,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` + NumObjectClones int64 `protobuf:"varint,3,opt,name=num_object_clones,json=numObjectClones,proto3" json:"num_object_clones,omitempty"` + NumObjectCopies int64 `protobuf:"varint,4,opt,name=num_object_copies,json=numObjectCopies,proto3" json:"num_object_copies,omitempty"` + NumObjectsMissingOnPrimary int64 `protobuf:"varint,5,opt,name=num_objects_missing_on_primary,json=numObjectsMissingOnPrimary,proto3" json:"num_objects_missing_on_primary,omitempty"` + NumObjectsMissing int64 `protobuf:"varint,6,opt,name=num_objects_missing,json=numObjectsMissing,proto3" json:"num_objects_missing,omitempty"` + NumObjectsDegraded int64 `protobuf:"varint,7,opt,name=num_objects_degraded,json=numObjectsDegraded,proto3" json:"num_objects_degraded,omitempty"` + NumObjectsMisplaced int64 `protobuf:"varint,8,opt,name=num_objects_misplaced,json=numObjectsMisplaced,proto3" json:"num_objects_misplaced,omitempty"` + NumObjectsUnfound int64 `protobuf:"varint,9,opt,name=num_objects_unfound,json=numObjectsUnfound,proto3" json:"num_objects_unfound,omitempty"` + NumObjectsDirty int64 `protobuf:"varint,10,opt,name=num_objects_dirty,json=numObjectsDirty,proto3" json:"num_objects_dirty,omitempty"` + NumWhiteouts int64 `protobuf:"varint,11,opt,name=num_whiteouts,json=numWhiteouts,proto3" json:"num_whiteouts,omitempty"` + NumRead int64 `protobuf:"varint,12,opt,name=num_read,json=numRead,proto3" json:"num_read,omitempty"` + NumReadKb int64 `protobuf:"varint,13,opt,name=num_read_kb,json=numReadKb,proto3" json:"num_read_kb,omitempty"` + NumWrite int64 `protobuf:"varint,14,opt,name=num_write,json=numWrite,proto3" json:"num_write,omitempty"` + NumWriteKb int64 `protobuf:"varint,15,opt,name=num_write_kb,json=numWriteKb,proto3" json:"num_write_kb,omitempty"` + NumScrubErrors int64 `protobuf:"varint,16,opt,name=num_scrub_errors,json=numScrubErrors,proto3" json:"num_scrub_errors,omitempty"` + NumShallowScrubErrors int64 `protobuf:"varint,17,opt,name=num_shallow_scrub_errors,json=numShallowScrubErrors,proto3" json:"num_shallow_scrub_errors,omitempty"` + NumDeepScrubErrors int64 `protobuf:"varint,18,opt,name=num_deep_scrub_errors,json=numDeepScrubErrors,proto3" json:"num_deep_scrub_errors,omitempty"` + NumObjectsRecovered int64 `protobuf:"varint,19,opt,name=num_objects_recovered,json=numObjectsRecovered,proto3" json:"num_objects_recovered,omitempty"` + NumBytesRecovered int64 `protobuf:"varint,20,opt,name=num_bytes_recovered,json=numBytesRecovered,proto3" json:"num_bytes_recovered,omitempty"` + NumKeysRecovered int64 `protobuf:"varint,21,opt,name=num_keys_recovered,json=numKeysRecovered,proto3" json:"num_keys_recovered,omitempty"` + NumObjectsOmap int64 `protobuf:"varint,22,opt,name=num_objects_omap,json=numObjectsOmap,proto3" json:"num_objects_omap,omitempty"` + NumObjectsHitSetArchive int64 `protobuf:"varint,23,opt,name=num_objects_hit_set_archive,json=numObjectsHitSetArchive,proto3" json:"num_objects_hit_set_archive,omitempty"` + NumBytesHitSetArchive int64 `protobuf:"varint,24,opt,name=num_bytes_hit_set_archive,json=numBytesHitSetArchive,proto3" json:"num_bytes_hit_set_archive,omitempty"` + NumFlush int64 `protobuf:"varint,25,opt,name=num_flush,json=numFlush,proto3" json:"num_flush,omitempty"` + NumFlushKb int64 `protobuf:"varint,26,opt,name=num_flush_kb,json=numFlushKb,proto3" json:"num_flush_kb,omitempty"` + NumEvict int64 `protobuf:"varint,27,opt,name=num_evict,json=numEvict,proto3" json:"num_evict,omitempty"` + NumEvictKb int64 `protobuf:"varint,28,opt,name=num_evict_kb,json=numEvictKb,proto3" json:"num_evict_kb,omitempty"` + NumPromote int64 `protobuf:"varint,29,opt,name=num_promote,json=numPromote,proto3" json:"num_promote,omitempty"` + NumFlushModeHigh int64 `protobuf:"varint,30,opt,name=num_flush_mode_high,json=numFlushModeHigh,proto3" json:"num_flush_mode_high,omitempty"` + NumFlushModeLow int64 `protobuf:"varint,31,opt,name=num_flush_mode_low,json=numFlushModeLow,proto3" json:"num_flush_mode_low,omitempty"` + NumEvictModeSome int64 `protobuf:"varint,32,opt,name=num_evict_mode_some,json=numEvictModeSome,proto3" json:"num_evict_mode_some,omitempty"` + NumEvictModeFull int64 `protobuf:"varint,33,opt,name=num_evict_mode_full,json=numEvictModeFull,proto3" json:"num_evict_mode_full,omitempty"` + NumObjectsPinned int64 `protobuf:"varint,34,opt,name=num_objects_pinned,json=numObjectsPinned,proto3" json:"num_objects_pinned,omitempty"` + NumLegacySnapsets int64 `protobuf:"varint,35,opt,name=num_legacy_snapsets,json=numLegacySnapsets,proto3" json:"num_legacy_snapsets,omitempty"` + NumLargeOmapObjects int64 `protobuf:"varint,36,opt,name=num_large_omap_objects,json=numLargeOmapObjects,proto3" json:"num_large_omap_objects,omitempty"` + NumObjectsManifest int64 `protobuf:"varint,37,opt,name=num_objects_manifest,json=numObjectsManifest,proto3" json:"num_objects_manifest,omitempty"` + NumOmapBytes int64 `protobuf:"varint,38,opt,name=num_omap_bytes,json=numOmapBytes,proto3" json:"num_omap_bytes,omitempty"` + NumOmapKeys int64 `protobuf:"varint,39,opt,name=num_omap_keys,json=numOmapKeys,proto3" json:"num_omap_keys,omitempty"` + NumObjectsRepaired int64 `protobuf:"varint,40,opt,name=num_objects_repaired,json=numObjectsRepaired,proto3" json:"num_objects_repaired,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PGStatsSum_PGStatsSum_StatSum) Reset() { *x = PGStatsSum_PGStatsSum_StatSum{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[43] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PGStatsSum_PGStatsSum_StatSum) String() string { @@ -4555,7 +4442,7 @@ func (*PGStatsSum_PGStatsSum_StatSum) ProtoMessage() {} func (x *PGStatsSum_PGStatsSum_StatSum) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[43] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4851,29 +4738,26 @@ func (x *PGStatsSum_PGStatsSum_StatSum) GetNumObjectsRepaired() int64 { } type PGStatsSum_PGStatsSum_StoreStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` - InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` - Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` - DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` - DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` - DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` - DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` - OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` - InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` + Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` + InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` + Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` + DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` + DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` + DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` + DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` + OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` + InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PGStatsSum_PGStatsSum_StoreStats) Reset() { *x = PGStatsSum_PGStatsSum_StoreStats{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[44] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PGStatsSum_PGStatsSum_StoreStats) String() string { @@ -4884,7 +4768,7 @@ func (*PGStatsSum_PGStatsSum_StoreStats) ProtoMessage() {} func (x *PGStatsSum_PGStatsSum_StoreStats) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[44] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -4970,29 +4854,26 @@ func (x *PGStatsSum_PGStatsSum_StoreStats) GetInternalMetadata() int64 { } type OSDStatsSum_StatFs struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` - InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` - Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` - DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` - DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` - DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` - DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` - OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` - InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` + Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` + InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` + Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` + DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` + DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` + DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` + DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` + OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` + InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OSDStatsSum_StatFs) Reset() { *x = OSDStatsSum_StatFs{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[45] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[45] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OSDStatsSum_StatFs) String() string { @@ -5003,7 +4884,7 @@ func (*OSDStatsSum_StatFs) ProtoMessage() {} func (x *OSDStatsSum_StatFs) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[45] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5089,21 +4970,18 @@ func (x *OSDStatsSum_StatFs) GetInternalMetadata() int64 { } type OSDStatsSum_OpQueueAgeHist struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Histogram []int64 `protobuf:"varint,1,rep,packed,name=histogram,proto3" json:"histogram,omitempty"` + UpperBound int64 `protobuf:"varint,2,opt,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty"` unknownFields protoimpl.UnknownFields - - Histogram []int64 `protobuf:"varint,1,rep,packed,name=histogram,proto3" json:"histogram,omitempty"` - UpperBound int64 `protobuf:"varint,2,opt,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OSDStatsSum_OpQueueAgeHist) Reset() { *x = OSDStatsSum_OpQueueAgeHist{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[46] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[46] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OSDStatsSum_OpQueueAgeHist) String() string { @@ -5114,7 +4992,7 @@ func (*OSDStatsSum_OpQueueAgeHist) ProtoMessage() {} func (x *OSDStatsSum_OpQueueAgeHist) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[46] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5144,23 +5022,20 @@ func (x *OSDStatsSum_OpQueueAgeHist) GetUpperBound() int64 { } type OSDStatsSum_PerfStat struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CommitLatencyMs int64 `protobuf:"varint,1,opt,name=commit_latency_ms,json=commitLatencyMs,proto3" json:"commit_latency_ms,omitempty"` - ApplyLatencyMs int64 `protobuf:"varint,2,opt,name=apply_latency_ms,json=applyLatencyMs,proto3" json:"apply_latency_ms,omitempty"` - CommitLatencyNs int64 `protobuf:"varint,3,opt,name=commit_latency_ns,json=commitLatencyNs,proto3" json:"commit_latency_ns,omitempty"` - ApplyLatencyNs int64 `protobuf:"varint,4,opt,name=apply_latency_ns,json=applyLatencyNs,proto3" json:"apply_latency_ns,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + CommitLatencyMs int64 `protobuf:"varint,1,opt,name=commit_latency_ms,json=commitLatencyMs,proto3" json:"commit_latency_ms,omitempty"` + ApplyLatencyMs int64 `protobuf:"varint,2,opt,name=apply_latency_ms,json=applyLatencyMs,proto3" json:"apply_latency_ms,omitempty"` + CommitLatencyNs int64 `protobuf:"varint,3,opt,name=commit_latency_ns,json=commitLatencyNs,proto3" json:"commit_latency_ns,omitempty"` + ApplyLatencyNs int64 `protobuf:"varint,4,opt,name=apply_latency_ns,json=applyLatencyNs,proto3" json:"apply_latency_ns,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OSDStatsSum_PerfStat) Reset() { *x = OSDStatsSum_PerfStat{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[47] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[47] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OSDStatsSum_PerfStat) String() string { @@ -5171,7 +5046,7 @@ func (*OSDStatsSum_PerfStat) ProtoMessage() {} func (x *OSDStatsSum_PerfStat) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[47] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5215,22 +5090,19 @@ func (x *OSDStatsSum_PerfStat) GetApplyLatencyNs() int64 { } type OSDStatsSum_NetworkPingTime struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Osd int64 `protobuf:"varint,1,opt,name=osd,proto3" json:"osd,omitempty"` + LastUpdate *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_update,json=lastUpdate,proto3" json:"last_update,omitempty"` + Interfaces []*OSDStatsSum_NetworkPingTime_Interface `protobuf:"bytes,3,rep,name=interfaces,proto3" json:"interfaces,omitempty"` unknownFields protoimpl.UnknownFields - - Osd int64 `protobuf:"varint,1,opt,name=osd,proto3" json:"osd,omitempty"` - LastUpdate *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=last_update,json=lastUpdate,proto3" json:"last_update,omitempty"` - Interfaces []*OSDStatsSum_NetworkPingTime_Interface `protobuf:"bytes,3,rep,name=interfaces,proto3" json:"interfaces,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OSDStatsSum_NetworkPingTime) Reset() { *x = OSDStatsSum_NetworkPingTime{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[48] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[48] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OSDStatsSum_NetworkPingTime) String() string { @@ -5241,7 +5113,7 @@ func (*OSDStatsSum_NetworkPingTime) ProtoMessage() {} func (x *OSDStatsSum_NetworkPingTime) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[48] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5278,24 +5150,21 @@ func (x *OSDStatsSum_NetworkPingTime) GetInterfaces() []*OSDStatsSum_NetworkPing } type OSDStatsSum_NetworkPingTime_Interface struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` InterfaceName string `protobuf:"bytes,1,opt,name=interface_name,json=interfaceName,proto3" json:"interface_name,omitempty"` Average *OSDStatsSum_NetworkPingTime_Interface_Average `protobuf:"bytes,2,opt,name=average,proto3" json:"average,omitempty"` Min *OSDStatsSum_NetworkPingTime_Interface_Min `protobuf:"bytes,3,opt,name=min,proto3" json:"min,omitempty"` Max *OSDStatsSum_NetworkPingTime_Interface_Max `protobuf:"bytes,4,opt,name=max,proto3" json:"max,omitempty"` Last float64 `protobuf:"fixed64,5,opt,name=last,proto3" json:"last,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OSDStatsSum_NetworkPingTime_Interface) Reset() { *x = OSDStatsSum_NetworkPingTime_Interface{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[49] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[49] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OSDStatsSum_NetworkPingTime_Interface) String() string { @@ -5306,7 +5175,7 @@ func (*OSDStatsSum_NetworkPingTime_Interface) ProtoMessage() {} func (x *OSDStatsSum_NetworkPingTime_Interface) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[49] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5357,22 +5226,19 @@ func (x *OSDStatsSum_NetworkPingTime_Interface) GetLast() float64 { } type OSDStatsSum_NetworkPingTime_Interface_Average struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` + Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` + Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` unknownFields protoimpl.UnknownFields - - Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` - Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` - Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OSDStatsSum_NetworkPingTime_Interface_Average) Reset() { *x = OSDStatsSum_NetworkPingTime_Interface_Average{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[50] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[50] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OSDStatsSum_NetworkPingTime_Interface_Average) String() string { @@ -5383,7 +5249,7 @@ func (*OSDStatsSum_NetworkPingTime_Interface_Average) ProtoMessage() {} func (x *OSDStatsSum_NetworkPingTime_Interface_Average) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[50] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5420,22 +5286,19 @@ func (x *OSDStatsSum_NetworkPingTime_Interface_Average) GetMin15() float64 { } type OSDStatsSum_NetworkPingTime_Interface_Min struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` + Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` + Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` unknownFields protoimpl.UnknownFields - - Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` - Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` - Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OSDStatsSum_NetworkPingTime_Interface_Min) Reset() { *x = OSDStatsSum_NetworkPingTime_Interface_Min{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[51] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[51] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OSDStatsSum_NetworkPingTime_Interface_Min) String() string { @@ -5446,7 +5309,7 @@ func (*OSDStatsSum_NetworkPingTime_Interface_Min) ProtoMessage() {} func (x *OSDStatsSum_NetworkPingTime_Interface_Min) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[51] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5483,22 +5346,19 @@ func (x *OSDStatsSum_NetworkPingTime_Interface_Min) GetMin15() float64 { } type OSDStatsSum_NetworkPingTime_Interface_Max struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` + Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` + Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` unknownFields protoimpl.UnknownFields - - Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` - Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` - Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OSDStatsSum_NetworkPingTime_Interface_Max) Reset() { *x = OSDStatsSum_NetworkPingTime_Interface_Max{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[52] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[52] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OSDStatsSum_NetworkPingTime_Interface_Max) String() string { @@ -5509,7 +5369,7 @@ func (*OSDStatsSum_NetworkPingTime_Interface_Max) ProtoMessage() {} func (x *OSDStatsSum_NetworkPingTime_Interface_Max) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[52] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5546,59 +5406,56 @@ func (x *OSDStatsSum_NetworkPingTime_Interface_Max) GetMin15() float64 { } type PGStatsDelta_PGStatsDelta_StatSum struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NumBytes int64 `protobuf:"varint,1,opt,name=num_bytes,json=numBytes,proto3" json:"num_bytes,omitempty"` - NumObjects int64 `protobuf:"varint,2,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` - NumObjectClones int64 `protobuf:"varint,3,opt,name=num_object_clones,json=numObjectClones,proto3" json:"num_object_clones,omitempty"` - NumObjectCopies int64 `protobuf:"varint,4,opt,name=num_object_copies,json=numObjectCopies,proto3" json:"num_object_copies,omitempty"` - NumObjectsMissingOnPrimary int64 `protobuf:"varint,5,opt,name=num_objects_missing_on_primary,json=numObjectsMissingOnPrimary,proto3" json:"num_objects_missing_on_primary,omitempty"` - NumObjectsMissing int64 `protobuf:"varint,6,opt,name=num_objects_missing,json=numObjectsMissing,proto3" json:"num_objects_missing,omitempty"` - NumObjectsDegraded int64 `protobuf:"varint,7,opt,name=num_objects_degraded,json=numObjectsDegraded,proto3" json:"num_objects_degraded,omitempty"` - NumObjectsMisplaced int64 `protobuf:"varint,8,opt,name=num_objects_misplaced,json=numObjectsMisplaced,proto3" json:"num_objects_misplaced,omitempty"` - NumObjectsUnfound int64 `protobuf:"varint,9,opt,name=num_objects_unfound,json=numObjectsUnfound,proto3" json:"num_objects_unfound,omitempty"` - NumObjectsDirty int64 `protobuf:"varint,10,opt,name=num_objects_dirty,json=numObjectsDirty,proto3" json:"num_objects_dirty,omitempty"` - NumWhiteouts int64 `protobuf:"varint,11,opt,name=num_whiteouts,json=numWhiteouts,proto3" json:"num_whiteouts,omitempty"` - NumRead int64 `protobuf:"varint,12,opt,name=num_read,json=numRead,proto3" json:"num_read,omitempty"` - NumReadKb int64 `protobuf:"varint,13,opt,name=num_read_kb,json=numReadKb,proto3" json:"num_read_kb,omitempty"` - NumWrite int64 `protobuf:"varint,14,opt,name=num_write,json=numWrite,proto3" json:"num_write,omitempty"` - NumWriteKb int64 `protobuf:"varint,15,opt,name=num_write_kb,json=numWriteKb,proto3" json:"num_write_kb,omitempty"` - NumScrubErrors int64 `protobuf:"varint,16,opt,name=num_scrub_errors,json=numScrubErrors,proto3" json:"num_scrub_errors,omitempty"` - NumShallowScrubErrors int64 `protobuf:"varint,17,opt,name=num_shallow_scrub_errors,json=numShallowScrubErrors,proto3" json:"num_shallow_scrub_errors,omitempty"` - NumDeepScrubErrors int64 `protobuf:"varint,18,opt,name=num_deep_scrub_errors,json=numDeepScrubErrors,proto3" json:"num_deep_scrub_errors,omitempty"` - NumObjectsRecovered int64 `protobuf:"varint,19,opt,name=num_objects_recovered,json=numObjectsRecovered,proto3" json:"num_objects_recovered,omitempty"` - NumBytesRecovered int64 `protobuf:"varint,20,opt,name=num_bytes_recovered,json=numBytesRecovered,proto3" json:"num_bytes_recovered,omitempty"` - NumKeysRecovered int64 `protobuf:"varint,21,opt,name=num_keys_recovered,json=numKeysRecovered,proto3" json:"num_keys_recovered,omitempty"` - NumObjectsOmap int64 `protobuf:"varint,22,opt,name=num_objects_omap,json=numObjectsOmap,proto3" json:"num_objects_omap,omitempty"` - NumObjectsHitSetArchive int64 `protobuf:"varint,23,opt,name=num_objects_hit_set_archive,json=numObjectsHitSetArchive,proto3" json:"num_objects_hit_set_archive,omitempty"` - NumBytesHitSetArchive int64 `protobuf:"varint,24,opt,name=num_bytes_hit_set_archive,json=numBytesHitSetArchive,proto3" json:"num_bytes_hit_set_archive,omitempty"` - NumFlush int64 `protobuf:"varint,25,opt,name=num_flush,json=numFlush,proto3" json:"num_flush,omitempty"` - NumFlushKb int64 `protobuf:"varint,26,opt,name=num_flush_kb,json=numFlushKb,proto3" json:"num_flush_kb,omitempty"` - NumEvict int64 `protobuf:"varint,27,opt,name=num_evict,json=numEvict,proto3" json:"num_evict,omitempty"` - NumEvictKb int64 `protobuf:"varint,28,opt,name=num_evict_kb,json=numEvictKb,proto3" json:"num_evict_kb,omitempty"` - NumPromote int64 `protobuf:"varint,29,opt,name=num_promote,json=numPromote,proto3" json:"num_promote,omitempty"` - NumFlushModeHigh int64 `protobuf:"varint,30,opt,name=num_flush_mode_high,json=numFlushModeHigh,proto3" json:"num_flush_mode_high,omitempty"` - NumFlushModeLow int64 `protobuf:"varint,31,opt,name=num_flush_mode_low,json=numFlushModeLow,proto3" json:"num_flush_mode_low,omitempty"` - NumEvictModeSome int64 `protobuf:"varint,32,opt,name=num_evict_mode_some,json=numEvictModeSome,proto3" json:"num_evict_mode_some,omitempty"` - NumEvictModeFull int64 `protobuf:"varint,33,opt,name=num_evict_mode_full,json=numEvictModeFull,proto3" json:"num_evict_mode_full,omitempty"` - NumObjectsPinned int64 `protobuf:"varint,34,opt,name=num_objects_pinned,json=numObjectsPinned,proto3" json:"num_objects_pinned,omitempty"` - NumLegacySnapsets int64 `protobuf:"varint,35,opt,name=num_legacy_snapsets,json=numLegacySnapsets,proto3" json:"num_legacy_snapsets,omitempty"` - NumLargeOmapObjects int64 `protobuf:"varint,36,opt,name=num_large_omap_objects,json=numLargeOmapObjects,proto3" json:"num_large_omap_objects,omitempty"` - NumObjectsManifest int64 `protobuf:"varint,37,opt,name=num_objects_manifest,json=numObjectsManifest,proto3" json:"num_objects_manifest,omitempty"` - NumOmapBytes int64 `protobuf:"varint,38,opt,name=num_omap_bytes,json=numOmapBytes,proto3" json:"num_omap_bytes,omitempty"` - NumOmapKeys int64 `protobuf:"varint,39,opt,name=num_omap_keys,json=numOmapKeys,proto3" json:"num_omap_keys,omitempty"` - NumObjectsRepaired int64 `protobuf:"varint,40,opt,name=num_objects_repaired,json=numObjectsRepaired,proto3" json:"num_objects_repaired,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + NumBytes int64 `protobuf:"varint,1,opt,name=num_bytes,json=numBytes,proto3" json:"num_bytes,omitempty"` + NumObjects int64 `protobuf:"varint,2,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` + NumObjectClones int64 `protobuf:"varint,3,opt,name=num_object_clones,json=numObjectClones,proto3" json:"num_object_clones,omitempty"` + NumObjectCopies int64 `protobuf:"varint,4,opt,name=num_object_copies,json=numObjectCopies,proto3" json:"num_object_copies,omitempty"` + NumObjectsMissingOnPrimary int64 `protobuf:"varint,5,opt,name=num_objects_missing_on_primary,json=numObjectsMissingOnPrimary,proto3" json:"num_objects_missing_on_primary,omitempty"` + NumObjectsMissing int64 `protobuf:"varint,6,opt,name=num_objects_missing,json=numObjectsMissing,proto3" json:"num_objects_missing,omitempty"` + NumObjectsDegraded int64 `protobuf:"varint,7,opt,name=num_objects_degraded,json=numObjectsDegraded,proto3" json:"num_objects_degraded,omitempty"` + NumObjectsMisplaced int64 `protobuf:"varint,8,opt,name=num_objects_misplaced,json=numObjectsMisplaced,proto3" json:"num_objects_misplaced,omitempty"` + NumObjectsUnfound int64 `protobuf:"varint,9,opt,name=num_objects_unfound,json=numObjectsUnfound,proto3" json:"num_objects_unfound,omitempty"` + NumObjectsDirty int64 `protobuf:"varint,10,opt,name=num_objects_dirty,json=numObjectsDirty,proto3" json:"num_objects_dirty,omitempty"` + NumWhiteouts int64 `protobuf:"varint,11,opt,name=num_whiteouts,json=numWhiteouts,proto3" json:"num_whiteouts,omitempty"` + NumRead int64 `protobuf:"varint,12,opt,name=num_read,json=numRead,proto3" json:"num_read,omitempty"` + NumReadKb int64 `protobuf:"varint,13,opt,name=num_read_kb,json=numReadKb,proto3" json:"num_read_kb,omitempty"` + NumWrite int64 `protobuf:"varint,14,opt,name=num_write,json=numWrite,proto3" json:"num_write,omitempty"` + NumWriteKb int64 `protobuf:"varint,15,opt,name=num_write_kb,json=numWriteKb,proto3" json:"num_write_kb,omitempty"` + NumScrubErrors int64 `protobuf:"varint,16,opt,name=num_scrub_errors,json=numScrubErrors,proto3" json:"num_scrub_errors,omitempty"` + NumShallowScrubErrors int64 `protobuf:"varint,17,opt,name=num_shallow_scrub_errors,json=numShallowScrubErrors,proto3" json:"num_shallow_scrub_errors,omitempty"` + NumDeepScrubErrors int64 `protobuf:"varint,18,opt,name=num_deep_scrub_errors,json=numDeepScrubErrors,proto3" json:"num_deep_scrub_errors,omitempty"` + NumObjectsRecovered int64 `protobuf:"varint,19,opt,name=num_objects_recovered,json=numObjectsRecovered,proto3" json:"num_objects_recovered,omitempty"` + NumBytesRecovered int64 `protobuf:"varint,20,opt,name=num_bytes_recovered,json=numBytesRecovered,proto3" json:"num_bytes_recovered,omitempty"` + NumKeysRecovered int64 `protobuf:"varint,21,opt,name=num_keys_recovered,json=numKeysRecovered,proto3" json:"num_keys_recovered,omitempty"` + NumObjectsOmap int64 `protobuf:"varint,22,opt,name=num_objects_omap,json=numObjectsOmap,proto3" json:"num_objects_omap,omitempty"` + NumObjectsHitSetArchive int64 `protobuf:"varint,23,opt,name=num_objects_hit_set_archive,json=numObjectsHitSetArchive,proto3" json:"num_objects_hit_set_archive,omitempty"` + NumBytesHitSetArchive int64 `protobuf:"varint,24,opt,name=num_bytes_hit_set_archive,json=numBytesHitSetArchive,proto3" json:"num_bytes_hit_set_archive,omitempty"` + NumFlush int64 `protobuf:"varint,25,opt,name=num_flush,json=numFlush,proto3" json:"num_flush,omitempty"` + NumFlushKb int64 `protobuf:"varint,26,opt,name=num_flush_kb,json=numFlushKb,proto3" json:"num_flush_kb,omitempty"` + NumEvict int64 `protobuf:"varint,27,opt,name=num_evict,json=numEvict,proto3" json:"num_evict,omitempty"` + NumEvictKb int64 `protobuf:"varint,28,opt,name=num_evict_kb,json=numEvictKb,proto3" json:"num_evict_kb,omitempty"` + NumPromote int64 `protobuf:"varint,29,opt,name=num_promote,json=numPromote,proto3" json:"num_promote,omitempty"` + NumFlushModeHigh int64 `protobuf:"varint,30,opt,name=num_flush_mode_high,json=numFlushModeHigh,proto3" json:"num_flush_mode_high,omitempty"` + NumFlushModeLow int64 `protobuf:"varint,31,opt,name=num_flush_mode_low,json=numFlushModeLow,proto3" json:"num_flush_mode_low,omitempty"` + NumEvictModeSome int64 `protobuf:"varint,32,opt,name=num_evict_mode_some,json=numEvictModeSome,proto3" json:"num_evict_mode_some,omitempty"` + NumEvictModeFull int64 `protobuf:"varint,33,opt,name=num_evict_mode_full,json=numEvictModeFull,proto3" json:"num_evict_mode_full,omitempty"` + NumObjectsPinned int64 `protobuf:"varint,34,opt,name=num_objects_pinned,json=numObjectsPinned,proto3" json:"num_objects_pinned,omitempty"` + NumLegacySnapsets int64 `protobuf:"varint,35,opt,name=num_legacy_snapsets,json=numLegacySnapsets,proto3" json:"num_legacy_snapsets,omitempty"` + NumLargeOmapObjects int64 `protobuf:"varint,36,opt,name=num_large_omap_objects,json=numLargeOmapObjects,proto3" json:"num_large_omap_objects,omitempty"` + NumObjectsManifest int64 `protobuf:"varint,37,opt,name=num_objects_manifest,json=numObjectsManifest,proto3" json:"num_objects_manifest,omitempty"` + NumOmapBytes int64 `protobuf:"varint,38,opt,name=num_omap_bytes,json=numOmapBytes,proto3" json:"num_omap_bytes,omitempty"` + NumOmapKeys int64 `protobuf:"varint,39,opt,name=num_omap_keys,json=numOmapKeys,proto3" json:"num_omap_keys,omitempty"` + NumObjectsRepaired int64 `protobuf:"varint,40,opt,name=num_objects_repaired,json=numObjectsRepaired,proto3" json:"num_objects_repaired,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PGStatsDelta_PGStatsDelta_StatSum) Reset() { *x = PGStatsDelta_PGStatsDelta_StatSum{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[53] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[53] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PGStatsDelta_PGStatsDelta_StatSum) String() string { @@ -5609,7 +5466,7 @@ func (*PGStatsDelta_PGStatsDelta_StatSum) ProtoMessage() {} func (x *PGStatsDelta_PGStatsDelta_StatSum) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[53] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -5905,29 +5762,26 @@ func (x *PGStatsDelta_PGStatsDelta_StatSum) GetNumObjectsRepaired() int64 { } type PGStatsDelta_PGStatsDelta_StoreStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` - InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` - Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` - DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` - DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` - DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` - DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` - OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` - InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` + Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` + InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` + Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` + DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` + DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` + DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` + DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` + OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` + InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PGStatsDelta_PGStatsDelta_StoreStats) Reset() { *x = PGStatsDelta_PGStatsDelta_StoreStats{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[54] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[54] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PGStatsDelta_PGStatsDelta_StoreStats) String() string { @@ -5938,7 +5792,7 @@ func (*PGStatsDelta_PGStatsDelta_StoreStats) ProtoMessage() {} func (x *PGStatsDelta_PGStatsDelta_StoreStats) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[54] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6024,59 +5878,56 @@ func (x *PGStatsDelta_PGStatsDelta_StoreStats) GetInternalMetadata() int64 { } type PGStat_PGStat_StatSum struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NumBytes int64 `protobuf:"varint,1,opt,name=num_bytes,json=numBytes,proto3" json:"num_bytes,omitempty"` - NumObjects int64 `protobuf:"varint,2,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` - NumObjectClones int64 `protobuf:"varint,3,opt,name=num_object_clones,json=numObjectClones,proto3" json:"num_object_clones,omitempty"` - NumObjectCopies int64 `protobuf:"varint,4,opt,name=num_object_copies,json=numObjectCopies,proto3" json:"num_object_copies,omitempty"` - NumObjectsMissingOnPrimary int64 `protobuf:"varint,5,opt,name=num_objects_missing_on_primary,json=numObjectsMissingOnPrimary,proto3" json:"num_objects_missing_on_primary,omitempty"` - NumObjectsMissing int64 `protobuf:"varint,6,opt,name=num_objects_missing,json=numObjectsMissing,proto3" json:"num_objects_missing,omitempty"` - NumObjectsDegraded int64 `protobuf:"varint,7,opt,name=num_objects_degraded,json=numObjectsDegraded,proto3" json:"num_objects_degraded,omitempty"` - NumObjectsMisplaced int64 `protobuf:"varint,8,opt,name=num_objects_misplaced,json=numObjectsMisplaced,proto3" json:"num_objects_misplaced,omitempty"` - NumObjectsUnfound int64 `protobuf:"varint,9,opt,name=num_objects_unfound,json=numObjectsUnfound,proto3" json:"num_objects_unfound,omitempty"` - NumObjectsDirty int64 `protobuf:"varint,10,opt,name=num_objects_dirty,json=numObjectsDirty,proto3" json:"num_objects_dirty,omitempty"` - NumWhiteouts int64 `protobuf:"varint,11,opt,name=num_whiteouts,json=numWhiteouts,proto3" json:"num_whiteouts,omitempty"` - NumRead int64 `protobuf:"varint,12,opt,name=num_read,json=numRead,proto3" json:"num_read,omitempty"` - NumReadKb int64 `protobuf:"varint,13,opt,name=num_read_kb,json=numReadKb,proto3" json:"num_read_kb,omitempty"` - NumWrite int64 `protobuf:"varint,14,opt,name=num_write,json=numWrite,proto3" json:"num_write,omitempty"` - NumWriteKb int64 `protobuf:"varint,15,opt,name=num_write_kb,json=numWriteKb,proto3" json:"num_write_kb,omitempty"` - NumScrubErrors int64 `protobuf:"varint,16,opt,name=num_scrub_errors,json=numScrubErrors,proto3" json:"num_scrub_errors,omitempty"` - NumShallowScrubErrors int64 `protobuf:"varint,17,opt,name=num_shallow_scrub_errors,json=numShallowScrubErrors,proto3" json:"num_shallow_scrub_errors,omitempty"` - NumDeepScrubErrors int64 `protobuf:"varint,18,opt,name=num_deep_scrub_errors,json=numDeepScrubErrors,proto3" json:"num_deep_scrub_errors,omitempty"` - NumObjectsRecovered int64 `protobuf:"varint,19,opt,name=num_objects_recovered,json=numObjectsRecovered,proto3" json:"num_objects_recovered,omitempty"` - NumBytesRecovered int64 `protobuf:"varint,20,opt,name=num_bytes_recovered,json=numBytesRecovered,proto3" json:"num_bytes_recovered,omitempty"` - NumKeysRecovered int64 `protobuf:"varint,21,opt,name=num_keys_recovered,json=numKeysRecovered,proto3" json:"num_keys_recovered,omitempty"` - NumObjectsOmap int64 `protobuf:"varint,22,opt,name=num_objects_omap,json=numObjectsOmap,proto3" json:"num_objects_omap,omitempty"` - NumObjectsHitSetArchive int64 `protobuf:"varint,23,opt,name=num_objects_hit_set_archive,json=numObjectsHitSetArchive,proto3" json:"num_objects_hit_set_archive,omitempty"` - NumBytesHitSetArchive int64 `protobuf:"varint,24,opt,name=num_bytes_hit_set_archive,json=numBytesHitSetArchive,proto3" json:"num_bytes_hit_set_archive,omitempty"` - NumFlush int64 `protobuf:"varint,25,opt,name=num_flush,json=numFlush,proto3" json:"num_flush,omitempty"` - NumFlushKb int64 `protobuf:"varint,26,opt,name=num_flush_kb,json=numFlushKb,proto3" json:"num_flush_kb,omitempty"` - NumEvict int64 `protobuf:"varint,27,opt,name=num_evict,json=numEvict,proto3" json:"num_evict,omitempty"` - NumEvictKb int64 `protobuf:"varint,28,opt,name=num_evict_kb,json=numEvictKb,proto3" json:"num_evict_kb,omitempty"` - NumPromote int64 `protobuf:"varint,29,opt,name=num_promote,json=numPromote,proto3" json:"num_promote,omitempty"` - NumFlushModeHigh int64 `protobuf:"varint,30,opt,name=num_flush_mode_high,json=numFlushModeHigh,proto3" json:"num_flush_mode_high,omitempty"` - NumFlushModeLow int64 `protobuf:"varint,31,opt,name=num_flush_mode_low,json=numFlushModeLow,proto3" json:"num_flush_mode_low,omitempty"` - NumEvictModeSome int64 `protobuf:"varint,32,opt,name=num_evict_mode_some,json=numEvictModeSome,proto3" json:"num_evict_mode_some,omitempty"` - NumEvictModeFull int64 `protobuf:"varint,33,opt,name=num_evict_mode_full,json=numEvictModeFull,proto3" json:"num_evict_mode_full,omitempty"` - NumObjectsPinned int64 `protobuf:"varint,34,opt,name=num_objects_pinned,json=numObjectsPinned,proto3" json:"num_objects_pinned,omitempty"` - NumLegacySnapsets int64 `protobuf:"varint,35,opt,name=num_legacy_snapsets,json=numLegacySnapsets,proto3" json:"num_legacy_snapsets,omitempty"` - NumLargeOmapObjects int64 `protobuf:"varint,36,opt,name=num_large_omap_objects,json=numLargeOmapObjects,proto3" json:"num_large_omap_objects,omitempty"` - NumObjectsManifest int64 `protobuf:"varint,37,opt,name=num_objects_manifest,json=numObjectsManifest,proto3" json:"num_objects_manifest,omitempty"` - NumOmapBytes int64 `protobuf:"varint,38,opt,name=num_omap_bytes,json=numOmapBytes,proto3" json:"num_omap_bytes,omitempty"` - NumOmapKeys int64 `protobuf:"varint,39,opt,name=num_omap_keys,json=numOmapKeys,proto3" json:"num_omap_keys,omitempty"` - NumObjectsRepaired int64 `protobuf:"varint,40,opt,name=num_objects_repaired,json=numObjectsRepaired,proto3" json:"num_objects_repaired,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + NumBytes int64 `protobuf:"varint,1,opt,name=num_bytes,json=numBytes,proto3" json:"num_bytes,omitempty"` + NumObjects int64 `protobuf:"varint,2,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` + NumObjectClones int64 `protobuf:"varint,3,opt,name=num_object_clones,json=numObjectClones,proto3" json:"num_object_clones,omitempty"` + NumObjectCopies int64 `protobuf:"varint,4,opt,name=num_object_copies,json=numObjectCopies,proto3" json:"num_object_copies,omitempty"` + NumObjectsMissingOnPrimary int64 `protobuf:"varint,5,opt,name=num_objects_missing_on_primary,json=numObjectsMissingOnPrimary,proto3" json:"num_objects_missing_on_primary,omitempty"` + NumObjectsMissing int64 `protobuf:"varint,6,opt,name=num_objects_missing,json=numObjectsMissing,proto3" json:"num_objects_missing,omitempty"` + NumObjectsDegraded int64 `protobuf:"varint,7,opt,name=num_objects_degraded,json=numObjectsDegraded,proto3" json:"num_objects_degraded,omitempty"` + NumObjectsMisplaced int64 `protobuf:"varint,8,opt,name=num_objects_misplaced,json=numObjectsMisplaced,proto3" json:"num_objects_misplaced,omitempty"` + NumObjectsUnfound int64 `protobuf:"varint,9,opt,name=num_objects_unfound,json=numObjectsUnfound,proto3" json:"num_objects_unfound,omitempty"` + NumObjectsDirty int64 `protobuf:"varint,10,opt,name=num_objects_dirty,json=numObjectsDirty,proto3" json:"num_objects_dirty,omitempty"` + NumWhiteouts int64 `protobuf:"varint,11,opt,name=num_whiteouts,json=numWhiteouts,proto3" json:"num_whiteouts,omitempty"` + NumRead int64 `protobuf:"varint,12,opt,name=num_read,json=numRead,proto3" json:"num_read,omitempty"` + NumReadKb int64 `protobuf:"varint,13,opt,name=num_read_kb,json=numReadKb,proto3" json:"num_read_kb,omitempty"` + NumWrite int64 `protobuf:"varint,14,opt,name=num_write,json=numWrite,proto3" json:"num_write,omitempty"` + NumWriteKb int64 `protobuf:"varint,15,opt,name=num_write_kb,json=numWriteKb,proto3" json:"num_write_kb,omitempty"` + NumScrubErrors int64 `protobuf:"varint,16,opt,name=num_scrub_errors,json=numScrubErrors,proto3" json:"num_scrub_errors,omitempty"` + NumShallowScrubErrors int64 `protobuf:"varint,17,opt,name=num_shallow_scrub_errors,json=numShallowScrubErrors,proto3" json:"num_shallow_scrub_errors,omitempty"` + NumDeepScrubErrors int64 `protobuf:"varint,18,opt,name=num_deep_scrub_errors,json=numDeepScrubErrors,proto3" json:"num_deep_scrub_errors,omitempty"` + NumObjectsRecovered int64 `protobuf:"varint,19,opt,name=num_objects_recovered,json=numObjectsRecovered,proto3" json:"num_objects_recovered,omitempty"` + NumBytesRecovered int64 `protobuf:"varint,20,opt,name=num_bytes_recovered,json=numBytesRecovered,proto3" json:"num_bytes_recovered,omitempty"` + NumKeysRecovered int64 `protobuf:"varint,21,opt,name=num_keys_recovered,json=numKeysRecovered,proto3" json:"num_keys_recovered,omitempty"` + NumObjectsOmap int64 `protobuf:"varint,22,opt,name=num_objects_omap,json=numObjectsOmap,proto3" json:"num_objects_omap,omitempty"` + NumObjectsHitSetArchive int64 `protobuf:"varint,23,opt,name=num_objects_hit_set_archive,json=numObjectsHitSetArchive,proto3" json:"num_objects_hit_set_archive,omitempty"` + NumBytesHitSetArchive int64 `protobuf:"varint,24,opt,name=num_bytes_hit_set_archive,json=numBytesHitSetArchive,proto3" json:"num_bytes_hit_set_archive,omitempty"` + NumFlush int64 `protobuf:"varint,25,opt,name=num_flush,json=numFlush,proto3" json:"num_flush,omitempty"` + NumFlushKb int64 `protobuf:"varint,26,opt,name=num_flush_kb,json=numFlushKb,proto3" json:"num_flush_kb,omitempty"` + NumEvict int64 `protobuf:"varint,27,opt,name=num_evict,json=numEvict,proto3" json:"num_evict,omitempty"` + NumEvictKb int64 `protobuf:"varint,28,opt,name=num_evict_kb,json=numEvictKb,proto3" json:"num_evict_kb,omitempty"` + NumPromote int64 `protobuf:"varint,29,opt,name=num_promote,json=numPromote,proto3" json:"num_promote,omitempty"` + NumFlushModeHigh int64 `protobuf:"varint,30,opt,name=num_flush_mode_high,json=numFlushModeHigh,proto3" json:"num_flush_mode_high,omitempty"` + NumFlushModeLow int64 `protobuf:"varint,31,opt,name=num_flush_mode_low,json=numFlushModeLow,proto3" json:"num_flush_mode_low,omitempty"` + NumEvictModeSome int64 `protobuf:"varint,32,opt,name=num_evict_mode_some,json=numEvictModeSome,proto3" json:"num_evict_mode_some,omitempty"` + NumEvictModeFull int64 `protobuf:"varint,33,opt,name=num_evict_mode_full,json=numEvictModeFull,proto3" json:"num_evict_mode_full,omitempty"` + NumObjectsPinned int64 `protobuf:"varint,34,opt,name=num_objects_pinned,json=numObjectsPinned,proto3" json:"num_objects_pinned,omitempty"` + NumLegacySnapsets int64 `protobuf:"varint,35,opt,name=num_legacy_snapsets,json=numLegacySnapsets,proto3" json:"num_legacy_snapsets,omitempty"` + NumLargeOmapObjects int64 `protobuf:"varint,36,opt,name=num_large_omap_objects,json=numLargeOmapObjects,proto3" json:"num_large_omap_objects,omitempty"` + NumObjectsManifest int64 `protobuf:"varint,37,opt,name=num_objects_manifest,json=numObjectsManifest,proto3" json:"num_objects_manifest,omitempty"` + NumOmapBytes int64 `protobuf:"varint,38,opt,name=num_omap_bytes,json=numOmapBytes,proto3" json:"num_omap_bytes,omitempty"` + NumOmapKeys int64 `protobuf:"varint,39,opt,name=num_omap_keys,json=numOmapKeys,proto3" json:"num_omap_keys,omitempty"` + NumObjectsRepaired int64 `protobuf:"varint,40,opt,name=num_objects_repaired,json=numObjectsRepaired,proto3" json:"num_objects_repaired,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PGStat_PGStat_StatSum) Reset() { *x = PGStat_PGStat_StatSum{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[55] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[55] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PGStat_PGStat_StatSum) String() string { @@ -6087,7 +5938,7 @@ func (*PGStat_PGStat_StatSum) ProtoMessage() {} func (x *PGStat_PGStat_StatSum) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[55] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6383,59 +6234,56 @@ func (x *PGStat_PGStat_StatSum) GetNumObjectsRepaired() int64 { } type PoolStats_PoolStats_StatSum struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - NumBytes int64 `protobuf:"varint,1,opt,name=num_bytes,json=numBytes,proto3" json:"num_bytes,omitempty"` - NumObjects int64 `protobuf:"varint,2,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` - NumObjectClones int64 `protobuf:"varint,3,opt,name=num_object_clones,json=numObjectClones,proto3" json:"num_object_clones,omitempty"` - NumObjectCopies int64 `protobuf:"varint,4,opt,name=num_object_copies,json=numObjectCopies,proto3" json:"num_object_copies,omitempty"` - NumObjectsMissingOnPrimary int64 `protobuf:"varint,5,opt,name=num_objects_missing_on_primary,json=numObjectsMissingOnPrimary,proto3" json:"num_objects_missing_on_primary,omitempty"` - NumObjectsMissing int64 `protobuf:"varint,6,opt,name=num_objects_missing,json=numObjectsMissing,proto3" json:"num_objects_missing,omitempty"` - NumObjectsDegraded int64 `protobuf:"varint,7,opt,name=num_objects_degraded,json=numObjectsDegraded,proto3" json:"num_objects_degraded,omitempty"` - NumObjectsMisplaced int64 `protobuf:"varint,8,opt,name=num_objects_misplaced,json=numObjectsMisplaced,proto3" json:"num_objects_misplaced,omitempty"` - NumObjectsUnfound int64 `protobuf:"varint,9,opt,name=num_objects_unfound,json=numObjectsUnfound,proto3" json:"num_objects_unfound,omitempty"` - NumObjectsDirty int64 `protobuf:"varint,10,opt,name=num_objects_dirty,json=numObjectsDirty,proto3" json:"num_objects_dirty,omitempty"` - NumWhiteouts int64 `protobuf:"varint,11,opt,name=num_whiteouts,json=numWhiteouts,proto3" json:"num_whiteouts,omitempty"` - NumRead int64 `protobuf:"varint,12,opt,name=num_read,json=numRead,proto3" json:"num_read,omitempty"` - NumReadKb int64 `protobuf:"varint,13,opt,name=num_read_kb,json=numReadKb,proto3" json:"num_read_kb,omitempty"` - NumWrite int64 `protobuf:"varint,14,opt,name=num_write,json=numWrite,proto3" json:"num_write,omitempty"` - NumWriteKb int64 `protobuf:"varint,15,opt,name=num_write_kb,json=numWriteKb,proto3" json:"num_write_kb,omitempty"` - NumScrubErrors int64 `protobuf:"varint,16,opt,name=num_scrub_errors,json=numScrubErrors,proto3" json:"num_scrub_errors,omitempty"` - NumShallowScrubErrors int64 `protobuf:"varint,17,opt,name=num_shallow_scrub_errors,json=numShallowScrubErrors,proto3" json:"num_shallow_scrub_errors,omitempty"` - NumDeepScrubErrors int64 `protobuf:"varint,18,opt,name=num_deep_scrub_errors,json=numDeepScrubErrors,proto3" json:"num_deep_scrub_errors,omitempty"` - NumObjectsRecovered int64 `protobuf:"varint,19,opt,name=num_objects_recovered,json=numObjectsRecovered,proto3" json:"num_objects_recovered,omitempty"` - NumBytesRecovered int64 `protobuf:"varint,20,opt,name=num_bytes_recovered,json=numBytesRecovered,proto3" json:"num_bytes_recovered,omitempty"` - NumKeysRecovered int64 `protobuf:"varint,21,opt,name=num_keys_recovered,json=numKeysRecovered,proto3" json:"num_keys_recovered,omitempty"` - NumObjectsOmap int64 `protobuf:"varint,22,opt,name=num_objects_omap,json=numObjectsOmap,proto3" json:"num_objects_omap,omitempty"` - NumObjectsHitSetArchive int64 `protobuf:"varint,23,opt,name=num_objects_hit_set_archive,json=numObjectsHitSetArchive,proto3" json:"num_objects_hit_set_archive,omitempty"` - NumBytesHitSetArchive int64 `protobuf:"varint,24,opt,name=num_bytes_hit_set_archive,json=numBytesHitSetArchive,proto3" json:"num_bytes_hit_set_archive,omitempty"` - NumFlush int64 `protobuf:"varint,25,opt,name=num_flush,json=numFlush,proto3" json:"num_flush,omitempty"` - NumFlushKb int64 `protobuf:"varint,26,opt,name=num_flush_kb,json=numFlushKb,proto3" json:"num_flush_kb,omitempty"` - NumEvict int64 `protobuf:"varint,27,opt,name=num_evict,json=numEvict,proto3" json:"num_evict,omitempty"` - NumEvictKb int64 `protobuf:"varint,28,opt,name=num_evict_kb,json=numEvictKb,proto3" json:"num_evict_kb,omitempty"` - NumPromote int64 `protobuf:"varint,29,opt,name=num_promote,json=numPromote,proto3" json:"num_promote,omitempty"` - NumFlushModeHigh int64 `protobuf:"varint,30,opt,name=num_flush_mode_high,json=numFlushModeHigh,proto3" json:"num_flush_mode_high,omitempty"` - NumFlushModeLow int64 `protobuf:"varint,31,opt,name=num_flush_mode_low,json=numFlushModeLow,proto3" json:"num_flush_mode_low,omitempty"` - NumEvictModeSome int64 `protobuf:"varint,32,opt,name=num_evict_mode_some,json=numEvictModeSome,proto3" json:"num_evict_mode_some,omitempty"` - NumEvictModeFull int64 `protobuf:"varint,33,opt,name=num_evict_mode_full,json=numEvictModeFull,proto3" json:"num_evict_mode_full,omitempty"` - NumObjectsPinned int64 `protobuf:"varint,34,opt,name=num_objects_pinned,json=numObjectsPinned,proto3" json:"num_objects_pinned,omitempty"` - NumLegacySnapsets int64 `protobuf:"varint,35,opt,name=num_legacy_snapsets,json=numLegacySnapsets,proto3" json:"num_legacy_snapsets,omitempty"` - NumLargeOmapObjects int64 `protobuf:"varint,36,opt,name=num_large_omap_objects,json=numLargeOmapObjects,proto3" json:"num_large_omap_objects,omitempty"` - NumObjectsManifest int64 `protobuf:"varint,37,opt,name=num_objects_manifest,json=numObjectsManifest,proto3" json:"num_objects_manifest,omitempty"` - NumOmapBytes int64 `protobuf:"varint,38,opt,name=num_omap_bytes,json=numOmapBytes,proto3" json:"num_omap_bytes,omitempty"` - NumOmapKeys int64 `protobuf:"varint,39,opt,name=num_omap_keys,json=numOmapKeys,proto3" json:"num_omap_keys,omitempty"` - NumObjectsRepaired int64 `protobuf:"varint,40,opt,name=num_objects_repaired,json=numObjectsRepaired,proto3" json:"num_objects_repaired,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + NumBytes int64 `protobuf:"varint,1,opt,name=num_bytes,json=numBytes,proto3" json:"num_bytes,omitempty"` + NumObjects int64 `protobuf:"varint,2,opt,name=num_objects,json=numObjects,proto3" json:"num_objects,omitempty"` + NumObjectClones int64 `protobuf:"varint,3,opt,name=num_object_clones,json=numObjectClones,proto3" json:"num_object_clones,omitempty"` + NumObjectCopies int64 `protobuf:"varint,4,opt,name=num_object_copies,json=numObjectCopies,proto3" json:"num_object_copies,omitempty"` + NumObjectsMissingOnPrimary int64 `protobuf:"varint,5,opt,name=num_objects_missing_on_primary,json=numObjectsMissingOnPrimary,proto3" json:"num_objects_missing_on_primary,omitempty"` + NumObjectsMissing int64 `protobuf:"varint,6,opt,name=num_objects_missing,json=numObjectsMissing,proto3" json:"num_objects_missing,omitempty"` + NumObjectsDegraded int64 `protobuf:"varint,7,opt,name=num_objects_degraded,json=numObjectsDegraded,proto3" json:"num_objects_degraded,omitempty"` + NumObjectsMisplaced int64 `protobuf:"varint,8,opt,name=num_objects_misplaced,json=numObjectsMisplaced,proto3" json:"num_objects_misplaced,omitempty"` + NumObjectsUnfound int64 `protobuf:"varint,9,opt,name=num_objects_unfound,json=numObjectsUnfound,proto3" json:"num_objects_unfound,omitempty"` + NumObjectsDirty int64 `protobuf:"varint,10,opt,name=num_objects_dirty,json=numObjectsDirty,proto3" json:"num_objects_dirty,omitempty"` + NumWhiteouts int64 `protobuf:"varint,11,opt,name=num_whiteouts,json=numWhiteouts,proto3" json:"num_whiteouts,omitempty"` + NumRead int64 `protobuf:"varint,12,opt,name=num_read,json=numRead,proto3" json:"num_read,omitempty"` + NumReadKb int64 `protobuf:"varint,13,opt,name=num_read_kb,json=numReadKb,proto3" json:"num_read_kb,omitempty"` + NumWrite int64 `protobuf:"varint,14,opt,name=num_write,json=numWrite,proto3" json:"num_write,omitempty"` + NumWriteKb int64 `protobuf:"varint,15,opt,name=num_write_kb,json=numWriteKb,proto3" json:"num_write_kb,omitempty"` + NumScrubErrors int64 `protobuf:"varint,16,opt,name=num_scrub_errors,json=numScrubErrors,proto3" json:"num_scrub_errors,omitempty"` + NumShallowScrubErrors int64 `protobuf:"varint,17,opt,name=num_shallow_scrub_errors,json=numShallowScrubErrors,proto3" json:"num_shallow_scrub_errors,omitempty"` + NumDeepScrubErrors int64 `protobuf:"varint,18,opt,name=num_deep_scrub_errors,json=numDeepScrubErrors,proto3" json:"num_deep_scrub_errors,omitempty"` + NumObjectsRecovered int64 `protobuf:"varint,19,opt,name=num_objects_recovered,json=numObjectsRecovered,proto3" json:"num_objects_recovered,omitempty"` + NumBytesRecovered int64 `protobuf:"varint,20,opt,name=num_bytes_recovered,json=numBytesRecovered,proto3" json:"num_bytes_recovered,omitempty"` + NumKeysRecovered int64 `protobuf:"varint,21,opt,name=num_keys_recovered,json=numKeysRecovered,proto3" json:"num_keys_recovered,omitempty"` + NumObjectsOmap int64 `protobuf:"varint,22,opt,name=num_objects_omap,json=numObjectsOmap,proto3" json:"num_objects_omap,omitempty"` + NumObjectsHitSetArchive int64 `protobuf:"varint,23,opt,name=num_objects_hit_set_archive,json=numObjectsHitSetArchive,proto3" json:"num_objects_hit_set_archive,omitempty"` + NumBytesHitSetArchive int64 `protobuf:"varint,24,opt,name=num_bytes_hit_set_archive,json=numBytesHitSetArchive,proto3" json:"num_bytes_hit_set_archive,omitempty"` + NumFlush int64 `protobuf:"varint,25,opt,name=num_flush,json=numFlush,proto3" json:"num_flush,omitempty"` + NumFlushKb int64 `protobuf:"varint,26,opt,name=num_flush_kb,json=numFlushKb,proto3" json:"num_flush_kb,omitempty"` + NumEvict int64 `protobuf:"varint,27,opt,name=num_evict,json=numEvict,proto3" json:"num_evict,omitempty"` + NumEvictKb int64 `protobuf:"varint,28,opt,name=num_evict_kb,json=numEvictKb,proto3" json:"num_evict_kb,omitempty"` + NumPromote int64 `protobuf:"varint,29,opt,name=num_promote,json=numPromote,proto3" json:"num_promote,omitempty"` + NumFlushModeHigh int64 `protobuf:"varint,30,opt,name=num_flush_mode_high,json=numFlushModeHigh,proto3" json:"num_flush_mode_high,omitempty"` + NumFlushModeLow int64 `protobuf:"varint,31,opt,name=num_flush_mode_low,json=numFlushModeLow,proto3" json:"num_flush_mode_low,omitempty"` + NumEvictModeSome int64 `protobuf:"varint,32,opt,name=num_evict_mode_some,json=numEvictModeSome,proto3" json:"num_evict_mode_some,omitempty"` + NumEvictModeFull int64 `protobuf:"varint,33,opt,name=num_evict_mode_full,json=numEvictModeFull,proto3" json:"num_evict_mode_full,omitempty"` + NumObjectsPinned int64 `protobuf:"varint,34,opt,name=num_objects_pinned,json=numObjectsPinned,proto3" json:"num_objects_pinned,omitempty"` + NumLegacySnapsets int64 `protobuf:"varint,35,opt,name=num_legacy_snapsets,json=numLegacySnapsets,proto3" json:"num_legacy_snapsets,omitempty"` + NumLargeOmapObjects int64 `protobuf:"varint,36,opt,name=num_large_omap_objects,json=numLargeOmapObjects,proto3" json:"num_large_omap_objects,omitempty"` + NumObjectsManifest int64 `protobuf:"varint,37,opt,name=num_objects_manifest,json=numObjectsManifest,proto3" json:"num_objects_manifest,omitempty"` + NumOmapBytes int64 `protobuf:"varint,38,opt,name=num_omap_bytes,json=numOmapBytes,proto3" json:"num_omap_bytes,omitempty"` + NumOmapKeys int64 `protobuf:"varint,39,opt,name=num_omap_keys,json=numOmapKeys,proto3" json:"num_omap_keys,omitempty"` + NumObjectsRepaired int64 `protobuf:"varint,40,opt,name=num_objects_repaired,json=numObjectsRepaired,proto3" json:"num_objects_repaired,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PoolStats_PoolStats_StatSum) Reset() { *x = PoolStats_PoolStats_StatSum{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[56] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[56] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PoolStats_PoolStats_StatSum) String() string { @@ -6446,7 +6294,7 @@ func (*PoolStats_PoolStats_StatSum) ProtoMessage() {} func (x *PoolStats_PoolStats_StatSum) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[56] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6742,29 +6590,26 @@ func (x *PoolStats_PoolStats_StatSum) GetNumObjectsRepaired() int64 { } type PoolStats_PoolStats_StoreStats struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` - InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` - Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` - DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` - DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` - DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` - DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` - OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` - InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` + Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` + InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` + Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` + DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` + DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` + DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` + DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` + OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` + InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PoolStats_PoolStats_StoreStats) Reset() { *x = PoolStats_PoolStats_StoreStats{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[57] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[57] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *PoolStats_PoolStats_StoreStats) String() string { @@ -6775,7 +6620,7 @@ func (*PoolStats_PoolStats_StoreStats) ProtoMessage() {} func (x *PoolStats_PoolStats_StoreStats) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[57] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6861,29 +6706,26 @@ func (x *PoolStats_PoolStats_StoreStats) GetInternalMetadata() int64 { } type OsdStats_StatFs struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` - Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` - InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` - Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` - DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` - DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` - DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` - DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` - OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` - InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Total int64 `protobuf:"varint,1,opt,name=total,proto3" json:"total,omitempty"` + Available int64 `protobuf:"varint,2,opt,name=available,proto3" json:"available,omitempty"` + InternallyReserved int64 `protobuf:"varint,3,opt,name=internally_reserved,json=internallyReserved,proto3" json:"internally_reserved,omitempty"` + Allocated int64 `protobuf:"varint,4,opt,name=allocated,proto3" json:"allocated,omitempty"` + DataStored int64 `protobuf:"varint,5,opt,name=data_stored,json=dataStored,proto3" json:"data_stored,omitempty"` + DataCompressed int64 `protobuf:"varint,6,opt,name=data_compressed,json=dataCompressed,proto3" json:"data_compressed,omitempty"` + DataCompressedAllocated int64 `protobuf:"varint,7,opt,name=data_compressed_allocated,json=dataCompressedAllocated,proto3" json:"data_compressed_allocated,omitempty"` + DataCompressedOriginal int64 `protobuf:"varint,8,opt,name=data_compressed_original,json=dataCompressedOriginal,proto3" json:"data_compressed_original,omitempty"` + OmapAllocated int64 `protobuf:"varint,9,opt,name=omap_allocated,json=omapAllocated,proto3" json:"omap_allocated,omitempty"` + InternalMetadata int64 `protobuf:"varint,10,opt,name=internal_metadata,json=internalMetadata,proto3" json:"internal_metadata,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdStats_StatFs) Reset() { *x = OsdStats_StatFs{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[58] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[58] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdStats_StatFs) String() string { @@ -6894,7 +6736,7 @@ func (*OsdStats_StatFs) ProtoMessage() {} func (x *OsdStats_StatFs) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[58] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -6980,21 +6822,18 @@ func (x *OsdStats_StatFs) GetInternalMetadata() int64 { } type OsdStats_OpQueueAgeHist struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Histogram []int64 `protobuf:"varint,1,rep,packed,name=histogram,proto3" json:"histogram,omitempty"` + UpperBound int64 `protobuf:"varint,2,opt,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty"` unknownFields protoimpl.UnknownFields - - Histogram []int64 `protobuf:"varint,1,rep,packed,name=histogram,proto3" json:"histogram,omitempty"` - UpperBound int64 `protobuf:"varint,2,opt,name=upper_bound,json=upperBound,proto3" json:"upper_bound,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdStats_OpQueueAgeHist) Reset() { *x = OsdStats_OpQueueAgeHist{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[59] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[59] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdStats_OpQueueAgeHist) String() string { @@ -7005,7 +6844,7 @@ func (*OsdStats_OpQueueAgeHist) ProtoMessage() {} func (x *OsdStats_OpQueueAgeHist) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[59] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7035,23 +6874,20 @@ func (x *OsdStats_OpQueueAgeHist) GetUpperBound() int64 { } type OsdStats_PerfStat struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - CommitLatencyMs int64 `protobuf:"varint,1,opt,name=commit_latency_ms,json=commitLatencyMs,proto3" json:"commit_latency_ms,omitempty"` - ApplyLatencyMs int64 `protobuf:"varint,2,opt,name=apply_latency_ms,json=applyLatencyMs,proto3" json:"apply_latency_ms,omitempty"` - CommitLatencyNs int64 `protobuf:"varint,3,opt,name=commit_latency_ns,json=commitLatencyNs,proto3" json:"commit_latency_ns,omitempty"` - ApplyLatencyNs int64 `protobuf:"varint,4,opt,name=apply_latency_ns,json=applyLatencyNs,proto3" json:"apply_latency_ns,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + CommitLatencyMs int64 `protobuf:"varint,1,opt,name=commit_latency_ms,json=commitLatencyMs,proto3" json:"commit_latency_ms,omitempty"` + ApplyLatencyMs int64 `protobuf:"varint,2,opt,name=apply_latency_ms,json=applyLatencyMs,proto3" json:"apply_latency_ms,omitempty"` + CommitLatencyNs int64 `protobuf:"varint,3,opt,name=commit_latency_ns,json=commitLatencyNs,proto3" json:"commit_latency_ns,omitempty"` + ApplyLatencyNs int64 `protobuf:"varint,4,opt,name=apply_latency_ns,json=applyLatencyNs,proto3" json:"apply_latency_ns,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdStats_PerfStat) Reset() { *x = OsdStats_PerfStat{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[60] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[60] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdStats_PerfStat) String() string { @@ -7062,7 +6898,7 @@ func (*OsdStats_PerfStat) ProtoMessage() {} func (x *OsdStats_PerfStat) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[60] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7106,22 +6942,19 @@ func (x *OsdStats_PerfStat) GetApplyLatencyNs() int64 { } type OsdStats_NetworkPingTime struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Osd int64 `protobuf:"varint,1,opt,name=osd,proto3" json:"osd,omitempty"` + LastUpdate string `protobuf:"bytes,2,opt,name=last_update,json=lastUpdate,proto3" json:"last_update,omitempty"` + Interfaces []*OsdStats_NetworkPingTime_Interface `protobuf:"bytes,3,rep,name=interfaces,proto3" json:"interfaces,omitempty"` unknownFields protoimpl.UnknownFields - - Osd int64 `protobuf:"varint,1,opt,name=osd,proto3" json:"osd,omitempty"` - LastUpdate string `protobuf:"bytes,2,opt,name=last_update,json=lastUpdate,proto3" json:"last_update,omitempty"` - Interfaces []*OsdStats_NetworkPingTime_Interface `protobuf:"bytes,3,rep,name=interfaces,proto3" json:"interfaces,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdStats_NetworkPingTime) Reset() { *x = OsdStats_NetworkPingTime{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[61] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[61] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdStats_NetworkPingTime) String() string { @@ -7132,7 +6965,7 @@ func (*OsdStats_NetworkPingTime) ProtoMessage() {} func (x *OsdStats_NetworkPingTime) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[61] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7169,24 +7002,21 @@ func (x *OsdStats_NetworkPingTime) GetInterfaces() []*OsdStats_NetworkPingTime_I } type OsdStats_NetworkPingTime_Interface struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` InterfaceName string `protobuf:"bytes,1,opt,name=interface_name,json=interfaceName,proto3" json:"interface_name,omitempty"` Average *OsdStats_NetworkPingTime_Interface_Average `protobuf:"bytes,2,opt,name=average,proto3" json:"average,omitempty"` Min *OsdStats_NetworkPingTime_Interface_Min `protobuf:"bytes,3,opt,name=min,proto3" json:"min,omitempty"` Max *OsdStats_NetworkPingTime_Interface_Max `protobuf:"bytes,4,opt,name=max,proto3" json:"max,omitempty"` Last float64 `protobuf:"fixed64,5,opt,name=last,proto3" json:"last,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *OsdStats_NetworkPingTime_Interface) Reset() { *x = OsdStats_NetworkPingTime_Interface{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[62] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[62] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdStats_NetworkPingTime_Interface) String() string { @@ -7197,7 +7027,7 @@ func (*OsdStats_NetworkPingTime_Interface) ProtoMessage() {} func (x *OsdStats_NetworkPingTime_Interface) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[62] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7248,22 +7078,19 @@ func (x *OsdStats_NetworkPingTime_Interface) GetLast() float64 { } type OsdStats_NetworkPingTime_Interface_Average struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` + Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` + Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` unknownFields protoimpl.UnknownFields - - Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` - Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` - Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdStats_NetworkPingTime_Interface_Average) Reset() { *x = OsdStats_NetworkPingTime_Interface_Average{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[63] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[63] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdStats_NetworkPingTime_Interface_Average) String() string { @@ -7274,7 +7101,7 @@ func (*OsdStats_NetworkPingTime_Interface_Average) ProtoMessage() {} func (x *OsdStats_NetworkPingTime_Interface_Average) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[63] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7311,22 +7138,19 @@ func (x *OsdStats_NetworkPingTime_Interface_Average) GetMin15() float64 { } type OsdStats_NetworkPingTime_Interface_Min struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` + Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` + Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` unknownFields protoimpl.UnknownFields - - Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` - Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` - Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdStats_NetworkPingTime_Interface_Min) Reset() { *x = OsdStats_NetworkPingTime_Interface_Min{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[64] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[64] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdStats_NetworkPingTime_Interface_Min) String() string { @@ -7337,7 +7161,7 @@ func (*OsdStats_NetworkPingTime_Interface_Min) ProtoMessage() {} func (x *OsdStats_NetworkPingTime_Interface_Min) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[64] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7374,22 +7198,19 @@ func (x *OsdStats_NetworkPingTime_Interface_Min) GetMin15() float64 { } type OsdStats_NetworkPingTime_Interface_Max struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` + Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` + Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` unknownFields protoimpl.UnknownFields - - Min1 float64 `protobuf:"fixed64,1,opt,name=min1,proto3" json:"min1,omitempty"` - Min5 float64 `protobuf:"fixed64,2,opt,name=min5,proto3" json:"min5,omitempty"` - Min15 float64 `protobuf:"fixed64,3,opt,name=min15,proto3" json:"min15,omitempty"` + sizeCache protoimpl.SizeCache } func (x *OsdStats_NetworkPingTime_Interface_Max) Reset() { *x = OsdStats_NetworkPingTime_Interface_Max{} - if protoimpl.UnsafeEnabled { - mi := &file_status_proto_msgTypes[65] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_status_proto_msgTypes[65] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *OsdStats_NetworkPingTime_Interface_Max) String() string { @@ -7400,7 +7221,7 @@ func (*OsdStats_NetworkPingTime_Interface_Max) ProtoMessage() {} func (x *OsdStats_NetworkPingTime_Interface_Max) ProtoReflect() protoreflect.Message { mi := &file_status_proto_msgTypes[65] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -7438,1807 +7259,852 @@ func (x *OsdStats_NetworkPingTime_Interface_Max) GetMin15() float64 { var File_status_proto protoreflect.FileDescriptor -var file_status_proto_rawDesc = []byte{ - 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, - 0x63, 0x65, 0x70, 0x68, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x22, 0xc4, 0x04, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x73, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x73, 0x69, 0x64, 0x12, 0x2e, - 0x0a, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x25, - 0x0a, 0x0e, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x05, 0x52, 0x06, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x12, 0x21, 0x0a, - 0x0c, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0b, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x4e, 0x61, 0x6d, 0x65, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x41, 0x67, 0x65, 0x12, - 0x2e, 0x0a, 0x06, 0x6d, 0x6f, 0x6e, 0x6d, 0x61, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x4d, 0x6f, 0x6e, 0x4d, 0x61, 0x70, 0x52, 0x06, 0x6d, 0x6f, 0x6e, 0x6d, 0x61, 0x70, 0x12, - 0x2e, 0x0a, 0x06, 0x6f, 0x73, 0x64, 0x6d, 0x61, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x16, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x4f, 0x53, 0x44, 0x4d, 0x61, 0x70, 0x52, 0x06, 0x6f, 0x73, 0x64, 0x6d, 0x61, 0x70, 0x12, - 0x2b, 0x0a, 0x05, 0x70, 0x67, 0x6d, 0x61, 0x70, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x50, 0x47, 0x4d, 0x61, 0x70, 0x52, 0x05, 0x70, 0x67, 0x6d, 0x61, 0x70, 0x12, 0x2b, 0x0a, 0x05, - 0x66, 0x73, 0x6d, 0x61, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x65, - 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x53, 0x4d, - 0x61, 0x70, 0x52, 0x05, 0x66, 0x73, 0x6d, 0x61, 0x70, 0x12, 0x2e, 0x0a, 0x06, 0x6d, 0x67, 0x72, - 0x6d, 0x61, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x67, 0x72, 0x4d, 0x61, - 0x70, 0x52, 0x06, 0x6d, 0x67, 0x72, 0x6d, 0x61, 0x70, 0x12, 0x3a, 0x0a, 0x0a, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x6d, 0x61, 0x70, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x52, 0x0a, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x6d, 0x61, 0x70, 0x12, 0x40, 0x0a, 0x0f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0e, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, - 0x73, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xce, 0x04, 0x0a, 0x13, 0x43, 0x65, 0x70, 0x68, - 0x4d, 0x6f, 0x6e, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x12, 0x0a, 0x04, 0x66, 0x73, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x73, 0x69, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x6f, 0x64, - 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, - 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x4d, 0x6f, 0x6e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x12, - 0x2f, 0x0a, 0x14, 0x6d, 0x69, 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, - 0x73, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, - 0x69, 0x6e, 0x4d, 0x6f, 0x6e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x65, 0x6c, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x2d, 0x0a, - 0x12, 0x64, 0x69, 0x73, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x6c, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x64, 0x69, 0x73, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x4c, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x12, - 0x25, 0x0a, 0x0e, 0x74, 0x69, 0x65, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x65, 0x72, 0x5f, 0x6d, 0x6f, - 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x69, 0x65, 0x62, 0x72, 0x65, 0x61, - 0x6b, 0x65, 0x72, 0x4d, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, - 0x64, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x52, 0x61, 0x6e, 0x6b, 0x73, 0x12, 0x35, 0x0a, 0x08, 0x66, - 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x4d, 0x6f, 0x6e, 0x44, 0x75, 0x6d, 0x70, - 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, - 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x04, 0x6d, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x4d, 0x6f, 0x6e, 0x44, - 0x75, 0x6d, 0x70, 0x4d, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x6d, 0x6f, 0x6e, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x05, - 0x52, 0x06, 0x71, 0x75, 0x6f, 0x72, 0x75, 0x6d, 0x22, 0x51, 0x0a, 0x13, 0x43, 0x65, 0x70, 0x68, - 0x4d, 0x6f, 0x6e, 0x44, 0x75, 0x6d, 0x70, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, - 0x1e, 0x0a, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0a, 0x70, 0x65, 0x72, 0x73, 0x69, 0x73, 0x74, 0x65, 0x6e, 0x74, 0x12, - 0x1a, 0x0a, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x08, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x22, 0x89, 0x02, 0x0a, 0x12, - 0x43, 0x65, 0x70, 0x68, 0x4d, 0x6f, 0x6e, 0x44, 0x75, 0x6d, 0x70, 0x4d, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x6f, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x72, 0x61, 0x6e, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x70, 0x75, - 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x4d, 0x6f, 0x6e, 0x44, - 0x75, 0x6d, 0x70, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x63, 0x52, 0x0b, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x1a, 0x0a, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, - 0x70, 0x72, 0x69, 0x6f, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x72, 0x75, 0x73, 0x68, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x63, 0x72, 0x75, 0x73, 0x68, 0x4c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x48, 0x0a, 0x12, 0x43, 0x65, 0x70, 0x68, 0x4d, - 0x6f, 0x6e, 0x44, 0x75, 0x6d, 0x70, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x63, 0x12, 0x32, 0x0a, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x76, 0x65, 0x63, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x4d, 0x6f, 0x6e, 0x44, 0x75, 0x6d, - 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x76, 0x65, - 0x63, 0x22, 0x52, 0x0a, 0x12, 0x43, 0x65, 0x70, 0x68, 0x4d, 0x6f, 0x6e, 0x44, 0x75, 0x6d, 0x70, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, - 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, - 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, - 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0xe8, 0x01, 0x0a, 0x10, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x12, 0x3a, 0x0a, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x12, 0x2c, - 0x0a, 0x05, 0x6d, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x6d, 0x75, 0x74, 0x65, 0x73, 0x1a, 0x52, 0x0a, 0x0b, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, - 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x74, 0x0a, 0x10, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x6f, - 0x6e, 0x4d, 0x61, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2f, 0x0a, 0x14, 0x6d, 0x69, - 0x6e, 0x5f, 0x6d, 0x6f, 0x6e, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x6d, 0x69, 0x6e, 0x4d, 0x6f, 0x6e, - 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6e, - 0x75, 0x6d, 0x5f, 0x6d, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, - 0x75, 0x6d, 0x4d, 0x6f, 0x6e, 0x73, 0x22, 0xf1, 0x01, 0x0a, 0x10, 0x43, 0x65, 0x70, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x4f, 0x53, 0x44, 0x4d, 0x61, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x73, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x4f, 0x73, 0x64, 0x73, 0x12, 0x1e, 0x0a, 0x0b, - 0x6e, 0x75, 0x6d, 0x5f, 0x75, 0x70, 0x5f, 0x6f, 0x73, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x55, 0x70, 0x4f, 0x73, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0c, - 0x6f, 0x73, 0x64, 0x5f, 0x75, 0x70, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x6f, 0x73, 0x64, 0x55, 0x70, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x12, 0x1e, - 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x69, 0x6e, 0x5f, 0x6f, 0x73, 0x64, 0x73, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x49, 0x6e, 0x4f, 0x73, 0x64, 0x73, 0x12, 0x20, - 0x0a, 0x0c, 0x6f, 0x73, 0x64, 0x5f, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x6e, 0x63, 0x65, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6f, 0x73, 0x64, 0x49, 0x6e, 0x53, 0x69, 0x6e, 0x63, 0x65, - 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, - 0x5f, 0x70, 0x67, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x52, - 0x65, 0x6d, 0x61, 0x70, 0x70, 0x65, 0x64, 0x50, 0x67, 0x73, 0x22, 0xa3, 0x02, 0x0a, 0x0f, 0x43, - 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x47, 0x4d, 0x61, 0x70, 0x12, 0x39, - 0x0a, 0x0c, 0x70, 0x67, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0a, 0x70, - 0x67, 0x73, 0x42, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x75, 0x6d, - 0x5f, 0x70, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x50, - 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x50, 0x6f, 0x6f, 0x6c, 0x73, 0x12, - 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x64, 0x61, 0x74, 0x61, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x62, 0x79, 0x74, 0x65, 0x73, 0x55, 0x73, 0x65, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x12, - 0x1f, 0x0a, 0x0b, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x62, 0x79, 0x74, 0x65, 0x73, 0x54, 0x6f, 0x74, 0x61, 0x6c, - 0x22, 0x48, 0x0a, 0x11, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x50, 0x47, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x74, 0x65, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x77, 0x0a, 0x0f, 0x43, 0x65, - 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x46, 0x53, 0x4d, 0x61, 0x70, 0x12, 0x14, 0x0a, - 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x12, 0x2f, 0x0a, 0x07, 0x62, 0x79, 0x5f, 0x72, 0x61, 0x6e, 0x6b, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x62, 0x79, - 0x52, 0x61, 0x6e, 0x6b, 0x12, 0x1d, 0x0a, 0x0a, 0x75, 0x70, 0x5f, 0x73, 0x74, 0x61, 0x6e, 0x64, - 0x62, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x75, 0x70, 0x53, 0x74, 0x61, 0x6e, - 0x64, 0x62, 0x79, 0x22, 0xec, 0x01, 0x0a, 0x10, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x4d, 0x67, 0x72, 0x4d, 0x61, 0x70, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, - 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x74, - 0x61, 0x6e, 0x64, 0x62, 0x79, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6e, 0x75, - 0x6d, 0x53, 0x74, 0x61, 0x6e, 0x64, 0x62, 0x79, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x6d, 0x6f, 0x64, - 0x75, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x75, - 0x6c, 0x65, 0x73, 0x12, 0x40, 0x0a, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, - 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x4d, 0x67, 0x72, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x3b, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xe4, 0x01, 0x0a, 0x14, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x44, 0x0a, - 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x70, 0x2e, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x73, 0x1a, 0x54, 0x0a, 0x0d, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, - 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xc1, 0x01, 0x0a, 0x11, 0x43, 0x65, - 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, - 0x3e, 0x0a, 0x07, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x24, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x44, 0x61, 0x65, 0x6d, 0x6f, 0x6e, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x64, 0x61, 0x65, 0x6d, 0x6f, 0x6e, 0x73, 0x12, - 0x18, 0x0a, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x1a, 0x52, 0x0a, 0x0c, 0x44, 0x61, 0x65, - 0x6d, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xb3, 0x10, - 0x0a, 0x16, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x12, - 0x0a, 0x04, 0x66, 0x73, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x66, 0x73, - 0x69, 0x64, 0x12, 0x34, 0x0a, 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x07, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x36, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x69, 0x6e, 0x5f, 0x63, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x49, 0x6e, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x6c, - 0x61, 0x67, 0x73, 0x5f, 0x6e, 0x75, 0x6d, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x66, - 0x6c, 0x61, 0x67, 0x73, 0x4e, 0x75, 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x6c, 0x61, 0x67, 0x73, - 0x5f, 0x73, 0x65, 0x74, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x66, 0x6c, 0x61, 0x67, - 0x73, 0x53, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x72, 0x75, 0x73, 0x68, 0x5f, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x63, 0x72, 0x75, - 0x73, 0x68, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x75, 0x6c, - 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x66, - 0x75, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x2d, 0x0a, 0x12, 0x62, 0x61, 0x63, 0x6b, - 0x66, 0x69, 0x6c, 0x6c, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x62, 0x61, 0x63, 0x6b, 0x66, 0x69, 0x6c, 0x6c, 0x66, 0x75, - 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x65, 0x61, 0x72, 0x66, - 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, - 0x0d, 0x6e, 0x65, 0x61, 0x72, 0x66, 0x75, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x29, - 0x0a, 0x10, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, - 0x6f, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, - 0x72, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x6f, - 0x6c, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x70, 0x6f, 0x6f, - 0x6c, 0x4d, 0x61, 0x78, 0x12, 0x17, 0x0a, 0x07, 0x6d, 0x61, 0x78, 0x5f, 0x6f, 0x73, 0x64, 0x18, - 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x4f, 0x73, 0x64, 0x12, 0x39, 0x0a, - 0x19, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x61, 0x74, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x16, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x4d, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, - 0x61, 0x74, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6d, 0x69, 0x6e, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x5f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x69, 0x6e, 0x43, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x43, 0x6c, - 0x69, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x5f, - 0x6f, 0x73, 0x64, 0x5f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x11, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x4f, 0x73, 0x64, 0x52, 0x65, 0x6c, - 0x65, 0x61, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x63, 0x72, - 0x69, 0x6d, 0x73, 0x6f, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x43, 0x72, 0x69, 0x6d, 0x73, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x05, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, - 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x05, 0x70, 0x6f, 0x6f, - 0x6c, 0x73, 0x12, 0x28, 0x0a, 0x04, 0x6f, 0x73, 0x64, 0x73, 0x18, 0x16, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x14, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x4f, - 0x73, 0x64, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x6f, 0x73, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x09, - 0x6f, 0x73, 0x64, 0x5f, 0x78, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x17, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x15, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x4f, 0x73, - 0x64, 0x58, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x6f, 0x73, 0x64, 0x58, 0x69, 0x6e, 0x66, 0x6f, - 0x12, 0x31, 0x0a, 0x08, 0x70, 0x67, 0x5f, 0x75, 0x70, 0x6d, 0x61, 0x70, 0x18, 0x18, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x07, 0x70, 0x67, 0x55, 0x70, - 0x6d, 0x61, 0x70, 0x12, 0x3c, 0x0a, 0x0e, 0x70, 0x67, 0x5f, 0x75, 0x70, 0x6d, 0x61, 0x70, 0x5f, - 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x70, 0x67, 0x55, 0x70, 0x6d, 0x61, 0x70, 0x49, 0x74, 0x65, 0x6d, - 0x73, 0x12, 0x44, 0x0a, 0x12, 0x70, 0x67, 0x5f, 0x75, 0x70, 0x6d, 0x61, 0x70, 0x5f, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x70, 0x67, 0x55, 0x70, 0x6d, 0x61, 0x70, 0x50, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x69, 0x65, 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x70, 0x67, 0x5f, 0x74, 0x65, - 0x6d, 0x70, 0x18, 0x1b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x06, 0x70, 0x67, 0x54, 0x65, 0x6d, 0x70, 0x12, 0x39, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6d, - 0x61, 0x72, 0x79, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x18, 0x1c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x54, - 0x65, 0x6d, 0x70, 0x12, 0x49, 0x0a, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x6c, 0x69, 0x73, 0x74, - 0x18, 0x1d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x47, 0x65, - 0x74, 0x43, 0x65, 0x70, 0x68, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x6c, 0x69, 0x73, 0x74, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x40, - 0x0a, 0x0f, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x6c, 0x69, 0x73, - 0x74, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, - 0x52, 0x0e, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x6c, 0x69, 0x73, 0x74, - 0x12, 0x69, 0x0a, 0x15, 0x65, 0x72, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, - 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x1f, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x35, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, 0x4f, 0x73, - 0x64, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x45, 0x72, - 0x61, 0x73, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x13, 0x65, 0x72, 0x61, 0x73, 0x75, 0x72, 0x65, 0x43, - 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x13, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x5f, 0x71, 0x75, 0x65, - 0x75, 0x65, 0x18, 0x20, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x11, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x51, 0x75, - 0x65, 0x75, 0x65, 0x12, 0x42, 0x0a, 0x11, 0x6e, 0x65, 0x77, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x64, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x18, 0x21, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x6e, 0x65, 0x77, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x12, 0x40, 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x70, - 0x75, 0x72, 0x67, 0x65, 0x64, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x18, 0x22, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x50, 0x75, - 0x72, 0x67, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x12, 0x41, 0x0a, 0x10, 0x63, 0x72, 0x75, - 0x73, 0x68, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x23, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x0e, 0x63, 0x72, - 0x75, 0x73, 0x68, 0x4e, 0x6f, 0x64, 0x65, 0x46, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x45, 0x0a, 0x12, - 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x5f, 0x66, 0x6c, 0x61, - 0x67, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, - 0x74, 0x52, 0x10, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x46, 0x6c, - 0x61, 0x67, 0x73, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x18, 0x25, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x53, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x65, - 0x1a, 0x58, 0x0a, 0x0e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x6c, 0x69, 0x73, 0x74, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x67, 0x0a, 0x18, 0x45, 0x72, - 0x61, 0x73, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, - 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x45, 0x72, 0x61, 0x73, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x64, - 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xc3, 0x15, 0x0a, 0x0b, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x50, - 0x6f, 0x6f, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x04, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x6f, 0x6c, - 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x66, 0x6c, 0x61, 0x67, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x66, 0x6c, 0x61, 0x67, 0x73, - 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x66, 0x6c, - 0x61, 0x67, 0x73, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, - 0x73, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x07, 0x6d, 0x69, 0x6e, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x72, 0x75, 0x73, 0x68, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x63, 0x72, 0x75, 0x73, 0x68, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x3b, 0x0a, 0x1a, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x72, 0x75, 0x73, 0x68, 0x5f, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, - 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x72, 0x75, 0x73, 0x68, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3d, 0x0a, 0x1b, 0x70, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x5f, 0x63, 0x72, 0x75, 0x73, 0x68, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x72, 0x75, 0x73, 0x68, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x3f, 0x0a, 0x1c, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, - 0x67, 0x5f, 0x63, 0x72, 0x75, 0x73, 0x68, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x62, - 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x19, 0x70, 0x65, - 0x65, 0x72, 0x69, 0x6e, 0x67, 0x43, 0x72, 0x75, 0x73, 0x68, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x12, 0x50, 0x0a, 0x25, 0x70, 0x65, 0x65, 0x72, 0x69, - 0x6e, 0x67, 0x5f, 0x63, 0x72, 0x75, 0x73, 0x68, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, - 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x21, 0x70, 0x65, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x43, - 0x72, 0x75, 0x73, 0x68, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4d, 0x61, 0x6e, 0x64, 0x61, 0x74, - 0x6f, 0x72, 0x79, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x67, - 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x70, 0x67, 0x41, 0x75, 0x74, 0x6f, 0x73, 0x63, 0x61, - 0x6c, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x15, 0x0a, 0x06, 0x70, 0x67, 0x5f, 0x6e, 0x75, 0x6d, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x70, 0x67, 0x4e, 0x75, 0x6d, 0x12, 0x28, 0x0a, - 0x10, 0x70, 0x67, 0x5f, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x75, - 0x6d, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x70, 0x67, 0x50, 0x6c, 0x61, 0x63, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x17, 0x70, 0x67, 0x5f, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x70, 0x67, 0x50, 0x6c, 0x61, 0x63, - 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4e, 0x75, 0x6d, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x22, - 0x0a, 0x0d, 0x70, 0x67, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, - 0x13, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x70, 0x67, 0x4e, 0x75, 0x6d, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x67, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x65, 0x6e, - 0x64, 0x69, 0x6e, 0x67, 0x18, 0x14, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x70, 0x67, 0x4e, 0x75, - 0x6d, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x49, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x70, 0x67, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x15, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x44, - 0x75, 0x6d, 0x70, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x67, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x4d, 0x65, - 0x74, 0x61, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x67, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x4d, - 0x65, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, - 0x61, 0x6e, 0x67, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, - 0x63, 0x65, 0x5f, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x18, 0x17, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x52, - 0x65, 0x73, 0x65, 0x6e, 0x64, 0x12, 0x46, 0x0a, 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6f, - 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x72, - 0x65, 0x6e, 0x61, 0x75, 0x74, 0x69, 0x6c, 0x75, 0x73, 0x18, 0x18, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x1c, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x65, - 0x6e, 0x64, 0x50, 0x72, 0x65, 0x6e, 0x61, 0x75, 0x74, 0x69, 0x6c, 0x75, 0x73, 0x12, 0x46, 0x0a, - 0x20, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6f, 0x70, 0x5f, 0x72, - 0x65, 0x73, 0x65, 0x6e, 0x64, 0x5f, 0x70, 0x72, 0x65, 0x6c, 0x75, 0x6d, 0x69, 0x6e, 0x6f, 0x75, - 0x73, 0x18, 0x19, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x6f, 0x72, - 0x63, 0x65, 0x4f, 0x70, 0x52, 0x65, 0x73, 0x65, 0x6e, 0x64, 0x50, 0x72, 0x65, 0x6c, 0x75, 0x6d, - 0x69, 0x6e, 0x6f, 0x75, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x75, 0x69, 0x64, 0x18, 0x1a, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x04, 0x61, 0x75, 0x69, 0x64, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x6e, 0x61, - 0x70, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x6e, - 0x61, 0x70, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x5f, 0x73, - 0x65, 0x71, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x73, 0x6e, 0x61, 0x70, 0x53, 0x65, - 0x71, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, - 0x1d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x73, 0x6e, 0x61, 0x70, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x12, 0x35, 0x0a, 0x0a, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x18, 0x1e, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x09, 0x70, 0x6f, - 0x6f, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x64, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x12, 0x26, 0x0a, 0x0f, - 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x20, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x4d, 0x61, 0x78, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x5f, 0x6d, 0x61, - 0x78, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x21, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0f, 0x71, 0x75, 0x6f, 0x74, 0x61, 0x4d, 0x61, 0x78, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x69, 0x65, 0x72, 0x73, 0x18, 0x22, 0x20, 0x03, 0x28, 0x05, 0x52, - 0x05, 0x74, 0x69, 0x65, 0x72, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x65, 0x72, 0x5f, 0x6f, - 0x66, 0x18, 0x23, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x74, 0x69, 0x65, 0x72, 0x4f, 0x66, 0x12, - 0x1b, 0x0a, 0x09, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x18, 0x24, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x54, 0x69, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x65, 0x72, 0x18, 0x25, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x77, 0x72, 0x69, 0x74, 0x65, 0x54, 0x69, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x63, - 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x26, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x63, 0x61, 0x63, 0x68, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x27, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x6d, - 0x61, 0x78, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x28, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x10, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4d, 0x61, 0x78, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x12, 0x42, 0x0a, 0x1e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x79, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x18, 0x29, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1a, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x44, 0x69, 0x72, 0x74, 0x79, 0x52, 0x61, 0x74, 0x69, - 0x6f, 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x12, 0x4b, 0x0a, 0x23, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x79, 0x5f, 0x68, 0x69, 0x67, - 0x68, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x6d, 0x69, 0x63, 0x72, 0x6f, 0x18, 0x2a, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x1e, 0x63, 0x61, 0x63, 0x68, 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, - 0x44, 0x69, 0x72, 0x74, 0x79, 0x48, 0x69, 0x67, 0x68, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x4d, 0x69, - 0x63, 0x72, 0x6f, 0x12, 0x40, 0x0a, 0x1d, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x5f, 0x6d, - 0x69, 0x63, 0x72, 0x6f, 0x18, 0x2b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x63, 0x61, 0x63, 0x68, - 0x65, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x52, 0x61, 0x74, 0x69, 0x6f, - 0x4d, 0x69, 0x63, 0x72, 0x6f, 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6d, - 0x69, 0x6e, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2c, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x4d, 0x69, 0x6e, 0x46, 0x6c, 0x75, 0x73, - 0x68, 0x41, 0x67, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x6d, 0x69, - 0x6e, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x61, 0x67, 0x65, 0x18, 0x2d, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x10, 0x63, 0x61, 0x63, 0x68, 0x65, 0x4d, 0x69, 0x6e, 0x45, 0x76, 0x69, 0x63, 0x74, - 0x41, 0x67, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x65, 0x72, 0x61, 0x73, 0x75, 0x72, 0x65, 0x5f, 0x63, - 0x6f, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x18, 0x2e, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x12, 0x65, 0x72, 0x61, 0x73, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x50, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x74, - 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x2f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x48, 0x69, 0x74, 0x53, - 0x65, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x0c, 0x68, 0x69, 0x74, 0x53, 0x65, 0x74, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x24, 0x0a, 0x0e, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, - 0x74, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x30, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, - 0x68, 0x69, 0x74, 0x53, 0x65, 0x74, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x22, 0x0a, 0x0d, - 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x31, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0b, 0x68, 0x69, 0x74, 0x53, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x24, 0x0a, 0x0e, 0x75, 0x73, 0x65, 0x5f, 0x67, 0x6d, 0x74, 0x5f, 0x68, 0x69, 0x74, 0x73, - 0x65, 0x74, 0x18, 0x32, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x47, 0x6d, 0x74, - 0x48, 0x69, 0x74, 0x73, 0x65, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x65, - 0x61, 0x64, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x70, - 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x33, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x6d, 0x69, - 0x6e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x6f, 0x72, 0x50, - 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x6d, 0x69, 0x6e, 0x5f, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x66, 0x6f, 0x72, 0x5f, - 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x34, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x6d, - 0x69, 0x6e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x63, 0x79, 0x46, 0x6f, - 0x72, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x36, 0x0a, 0x18, 0x68, 0x69, 0x74, 0x5f, - 0x73, 0x65, 0x74, 0x5f, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, - 0x72, 0x61, 0x74, 0x65, 0x18, 0x35, 0x20, 0x01, 0x28, 0x04, 0x52, 0x14, 0x68, 0x69, 0x74, 0x53, - 0x65, 0x74, 0x47, 0x72, 0x61, 0x64, 0x65, 0x44, 0x65, 0x63, 0x61, 0x79, 0x52, 0x61, 0x74, 0x65, - 0x12, 0x30, 0x0a, 0x15, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6e, 0x18, 0x36, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x11, 0x68, 0x69, 0x74, 0x53, 0x65, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4c, 0x61, 0x73, - 0x74, 0x4e, 0x12, 0x37, 0x0a, 0x0b, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x37, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x0a, 0x67, 0x72, 0x61, 0x64, 0x65, 0x54, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x73, - 0x74, 0x72, 0x69, 0x70, 0x65, 0x5f, 0x77, 0x69, 0x64, 0x74, 0x68, 0x18, 0x38, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x69, 0x70, 0x65, 0x57, 0x69, 0x64, 0x74, 0x68, 0x12, 0x30, - 0x0a, 0x14, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x39, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x65, 0x78, - 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x61, 0x73, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x3a, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x08, 0x66, 0x61, 0x73, 0x74, 0x52, 0x65, 0x61, 0x64, 0x12, 0x31, 0x0a, - 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x3b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x4a, 0x0a, 0x14, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x3c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x13, 0x61, 0x70, 0x70, 0x6c, 0x69, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x3b, 0x0a, 0x0c, - 0x72, 0x65, 0x61, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x3d, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, - 0x70, 0x52, 0x65, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x0b, 0x72, 0x65, - 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x80, 0x02, 0x0a, 0x16, 0x4f, 0x73, - 0x64, 0x44, 0x75, 0x6d, 0x70, 0x4c, 0x61, 0x73, 0x74, 0x50, 0x67, 0x4d, 0x65, 0x72, 0x67, 0x65, - 0x4d, 0x65, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x70, - 0x67, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x50, 0x67, 0x69, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x61, 0x64, - 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x6c, 0x61, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x12, 0x25, - 0x0a, 0x0e, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x29, 0x0a, 0x13, - 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x48, 0x69, 0x74, 0x53, 0x65, 0x74, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x94, 0x03, 0x0a, 0x12, 0x4f, 0x73, 0x64, 0x44, - 0x75, 0x6d, 0x70, 0x52, 0x65, 0x61, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x21, - 0x0a, 0x0c, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x41, 0x63, 0x74, 0x69, 0x6e, - 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x61, 0x6c, 0x5f, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x6f, 0x70, 0x74, - 0x69, 0x6d, 0x61, 0x6c, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x77, - 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0e, 0x72, 0x61, 0x77, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x41, 0x63, 0x74, - 0x69, 0x6e, 0x67, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x61, 0x77, 0x5f, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x5f, 0x73, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x72, - 0x61, 0x77, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x3a, 0x0a, - 0x19, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x79, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x17, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x61, 0x76, 0x65, - 0x72, 0x61, 0x67, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x66, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x16, 0x61, 0x76, 0x65, - 0x72, 0x61, 0x67, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x41, 0x66, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x79, 0x12, 0x49, 0x0a, 0x21, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x5f, - 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1e, - 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x41, 0x66, - 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x65, 0x64, 0x22, 0xa6, - 0x06, 0x0a, 0x0e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x4f, 0x73, 0x64, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x73, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6f, 0x73, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x75, 0x75, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x75, 0x75, 0x69, 0x64, 0x12, 0x0e, 0x0a, 0x02, 0x75, 0x70, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x02, 0x75, 0x70, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x6e, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x6e, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x29, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x5f, 0x61, 0x66, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x41, 0x66, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x79, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, - 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x5f, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x42, - 0x65, 0x67, 0x69, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x65, - 0x61, 0x6e, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6c, 0x61, - 0x73, 0x74, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x45, 0x6e, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x70, - 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x70, 0x46, - 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x70, 0x5f, 0x74, 0x68, 0x72, 0x75, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x75, 0x70, 0x54, 0x68, 0x72, 0x75, 0x12, 0x17, 0x0a, 0x07, - 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, - 0x6f, 0x77, 0x6e, 0x41, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x6c, 0x6f, 0x73, 0x74, 0x5f, 0x61, 0x74, - 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6c, 0x6f, 0x73, 0x74, 0x41, 0x74, 0x12, 0x3b, - 0x0a, 0x0c, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x0d, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x44, - 0x75, 0x6d, 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x73, 0x52, 0x0b, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x3e, 0x0a, 0x0d, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, - 0x70, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x73, 0x52, 0x0c, 0x63, - 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x4d, 0x0a, 0x14, 0x68, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x73, 0x52, 0x12, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x42, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x4f, 0x0a, 0x15, 0x68, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x66, 0x72, 0x6f, 0x6e, 0x74, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x73, 0x52, 0x13, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, - 0x74, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0a, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x12, 0x21, 0x0a, 0x0c, - 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x63, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x2e, 0x0a, 0x13, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x62, 0x61, 0x63, - 0x6b, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x68, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x41, 0x64, 0x64, 0x72, 0x12, - 0x30, 0x0a, 0x14, 0x68, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x5f, 0x66, 0x72, 0x6f, - 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x14, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x68, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x46, 0x72, 0x6f, 0x6e, 0x74, 0x41, 0x64, 0x64, - 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x22, 0x44, 0x0a, 0x12, 0x4f, 0x73, 0x64, 0x44, 0x75, - 0x6d, 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x2e, 0x0a, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x76, 0x65, 0x63, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x41, 0x64, 0x64, - 0x72, 0x56, 0x65, 0x63, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x76, 0x65, 0x63, 0x22, 0x45, 0x0a, - 0x13, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x73, 0x12, 0x2e, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x76, 0x65, 0x63, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, - 0x44, 0x75, 0x6d, 0x70, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x63, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x76, 0x65, 0x63, 0x22, 0x47, 0x0a, 0x15, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x48, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x41, 0x64, 0x64, 0x72, 0x73, 0x12, 0x2e, 0x0a, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x76, 0x65, 0x63, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x41, 0x64, 0x64, - 0x72, 0x56, 0x65, 0x63, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x76, 0x65, 0x63, 0x22, 0x4e, 0x0a, - 0x0e, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x41, 0x64, 0x64, 0x72, 0x56, 0x65, 0x63, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x61, 0x64, 0x64, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x61, 0x64, 0x64, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x6e, 0x6f, 0x6e, 0x63, 0x65, 0x22, 0xdf, 0x02, - 0x0a, 0x0f, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x4f, 0x73, 0x64, 0x58, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x73, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6f, 0x73, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x64, 0x6f, 0x77, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x09, 0x64, 0x6f, 0x77, 0x6e, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x2b, - 0x0a, 0x11, 0x6c, 0x61, 0x67, 0x67, 0x79, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6c, 0x61, 0x67, 0x67, 0x79, - 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x25, 0x0a, 0x0e, 0x6c, - 0x61, 0x67, 0x67, 0x79, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6c, 0x61, 0x67, 0x67, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x1d, - 0x0a, 0x0a, 0x6f, 0x6c, 0x64, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x09, 0x6f, 0x6c, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x51, 0x0a, - 0x17, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x75, 0x72, 0x67, 0x65, 0x64, 0x5f, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, - 0x50, 0x75, 0x72, 0x67, 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x53, 0x63, 0x72, 0x75, 0x62, - 0x12, 0x1d, 0x0a, 0x0a, 0x64, 0x65, 0x61, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x64, 0x65, 0x61, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x22, - 0x6d, 0x0a, 0x19, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x45, 0x72, 0x61, 0x73, 0x75, 0x72, - 0x65, 0x43, 0x6f, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x0c, 0x0a, 0x01, - 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x6b, 0x12, 0x0c, 0x0a, 0x01, 0x6d, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x01, 0x6d, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x74, 0x65, 0x63, 0x68, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x22, 0x94, - 0x02, 0x0a, 0x12, 0x4f, 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x53, 0x74, 0x72, 0x65, 0x74, 0x63, - 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x12, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x65, - 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x73, 0x74, 0x72, 0x65, 0x74, - 0x63, 0x68, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x32, 0x0a, 0x15, 0x64, 0x65, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, - 0x65, 0x64, 0x53, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x36, 0x0a, - 0x17, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x72, 0x65, - 0x74, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, - 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x72, 0x65, 0x74, 0x63, - 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2e, 0x0a, 0x13, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x11, 0x73, 0x74, 0x72, 0x65, 0x74, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x22, 0x56, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, - 0x50, 0x67, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, - 0x0a, 0x08, 0x70, 0x67, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x07, 0x70, 0x67, 0x52, 0x65, 0x61, 0x64, 0x79, 0x12, 0x22, 0x0a, 0x06, 0x70, 0x67, 0x5f, - 0x6d, 0x61, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0b, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x50, 0x47, 0x4d, 0x61, 0x70, 0x52, 0x05, 0x70, 0x67, 0x4d, 0x61, 0x70, 0x22, 0xff, 0x03, - 0x0a, 0x05, 0x50, 0x47, 0x4d, 0x61, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x30, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x05, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x12, 0x2a, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x6f, 0x73, 0x64, 0x6d, - 0x61, 0x70, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, - 0x6c, 0x61, 0x73, 0x74, 0x4f, 0x73, 0x64, 0x6d, 0x61, 0x70, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, - 0x20, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x67, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x67, 0x53, 0x63, 0x61, - 0x6e, 0x12, 0x32, 0x0a, 0x0c, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x73, 0x75, - 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, - 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x52, 0x0a, 0x70, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x35, 0x0a, 0x0d, 0x6f, 0x73, 0x64, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x63, - 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x53, 0x44, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x52, - 0x0b, 0x6f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x38, 0x0a, 0x0e, - 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, 0x47, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x52, 0x0c, 0x70, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x27, 0x0a, 0x08, 0x70, 0x67, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, - 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x52, 0x07, 0x70, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x2e, 0x0a, 0x0a, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x09, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x09, 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x2b, 0x0a, 0x09, 0x6f, 0x73, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x52, 0x08, 0x6f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x31, 0x0a, 0x0b, - 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x66, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x10, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x46, 0x73, 0x52, 0x0a, 0x70, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x66, 0x73, 0x22, - 0xbf, 0x13, 0x0a, 0x0a, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x12, 0x3e, - 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, - 0x75, 0x6d, 0x2e, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x5f, 0x53, 0x74, - 0x61, 0x74, 0x53, 0x75, 0x6d, 0x52, 0x07, 0x73, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x47, - 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, 0x47, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x53, 0x75, 0x6d, 0x2e, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, - 0x5f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0a, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6c, 0x6f, 0x67, - 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6f, 0x6e, 0x64, - 0x69, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x75, 0x70, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, - 0x74, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6e, 0x75, 0x6d, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x1a, 0xe3, 0x0d, 0x0a, 0x12, 0x50, - 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, - 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, - 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, - 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6c, - 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, - 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x1e, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6f, - 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x1a, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x69, 0x73, 0x73, 0x69, - 0x6e, 0x67, 0x4f, 0x6e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x6e, - 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, - 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x6e, - 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x64, 0x65, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x44, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x32, 0x0a, - 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x73, - 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x75, - 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x5f, 0x75, 0x6e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, - 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x55, 0x6e, 0x66, 0x6f, 0x75, 0x6e, - 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x5f, 0x64, 0x69, 0x72, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, - 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x44, 0x69, 0x72, 0x74, 0x79, 0x12, 0x23, 0x0a, - 0x0d, 0x6e, 0x75, 0x6d, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x18, 0x0b, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6f, 0x75, - 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x0a, - 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6b, 0x62, 0x18, 0x0d, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x61, 0x64, 0x4b, 0x62, 0x12, 0x1b, 0x0a, - 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x75, - 0x6d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6b, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4b, 0x62, 0x12, 0x28, 0x0a, 0x10, - 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x72, 0x75, 0x62, - 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x68, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x53, 0x68, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x63, 0x72, 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, - 0x31, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x63, 0x72, 0x75, - 0x62, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, - 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x65, 0x70, 0x53, 0x63, 0x72, 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, 0x14, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, - 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x6d, 0x61, 0x70, 0x12, 0x3c, - 0x0a, 0x1b, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x68, 0x69, - 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x18, 0x17, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x17, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, - 0x69, 0x74, 0x53, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x38, 0x0a, 0x19, - 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, - 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x15, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x48, 0x69, 0x74, 0x53, 0x65, 0x74, 0x41, - 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, - 0x75, 0x73, 0x68, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, - 0x5f, 0x6b, 0x62, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x4b, 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, - 0x63, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, - 0x63, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, - 0x6b, 0x62, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, - 0x63, 0x74, 0x4b, 0x62, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x6d, - 0x6f, 0x74, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x50, 0x72, - 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, - 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x18, 0x1e, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4d, 0x6f, 0x64, 0x65, - 0x48, 0x69, 0x67, 0x68, 0x12, 0x2b, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, - 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, - 0x77, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x6f, 0x6d, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x53, 0x6f, 0x6d, 0x65, - 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x21, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, - 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x46, 0x75, 0x6c, 0x6c, 0x12, - 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x70, - 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x22, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x2e, 0x0a, - 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x65, 0x74, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x4c, - 0x65, 0x67, 0x61, 0x63, 0x79, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, - 0x16, 0x6e, 0x75, 0x6d, 0x5f, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x5f, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, - 0x75, 0x6d, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x4f, 0x6d, 0x61, 0x70, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x25, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x61, 0x6e, 0x69, - 0x66, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x6d, 0x61, 0x70, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x75, - 0x6d, 0x4f, 0x6d, 0x61, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x75, - 0x6d, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x27, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x4f, 0x6d, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, - 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x72, 0x65, - 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, - 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, - 0x1a, 0xae, 0x03, 0x0a, 0x15, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x5f, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2f, - 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, - 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, - 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x12, 0x27, - 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x64, 0x61, 0x74, 0x61, - 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x25, 0x0a, - 0x0e, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6f, 0x6d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x22, 0x89, 0x11, 0x0a, 0x0b, 0x4f, 0x53, 0x44, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, - 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x70, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x06, 0x75, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x73, 0x65, - 0x71, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x17, 0x0a, 0x07, - 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6e, - 0x75, 0x6d, 0x50, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x73, 0x64, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x4f, 0x73, 0x64, 0x73, - 0x12, 0x29, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, - 0x5f, 0x6f, 0x73, 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, - 0x50, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x73, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x16, 0x6e, - 0x75, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6f, 0x6d, 0x61, 0x70, - 0x5f, 0x6f, 0x73, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, - 0x50, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x6d, 0x61, 0x70, 0x4f, 0x73, 0x64, 0x73, 0x12, - 0x0e, 0x0a, 0x02, 0x6b, 0x62, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x6b, 0x62, 0x12, - 0x17, 0x0a, 0x07, 0x6b, 0x62, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x6b, 0x62, 0x55, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x6b, 0x62, 0x5f, 0x75, - 0x73, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x6b, 0x62, 0x55, 0x73, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0c, 0x6b, 0x62, - 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0a, 0x6b, 0x62, 0x55, 0x73, 0x65, 0x64, 0x4f, 0x6d, 0x61, 0x70, 0x12, 0x20, 0x0a, 0x0c, - 0x6b, 0x62, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x6b, 0x62, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x12, 0x19, - 0x0a, 0x08, 0x6b, 0x62, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x07, 0x6b, 0x62, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x66, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x4f, 0x53, 0x44, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x46, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x66, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x68, - 0x62, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x68, - 0x62, 0x50, 0x65, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x6e, 0x61, 0x70, 0x5f, 0x74, - 0x72, 0x69, 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x54, 0x72, 0x69, 0x6d, 0x51, 0x75, 0x65, - 0x75, 0x65, 0x4c, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x6e, 0x61, - 0x70, 0x5f, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x54, 0x72, 0x69, 0x6d, 0x6d, 0x69, 0x6e, - 0x67, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x5f, - 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, - 0x6e, 0x75, 0x6d, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, - 0x64, 0x12, 0x4b, 0x0a, 0x11, 0x6f, 0x70, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x61, 0x67, - 0x65, 0x5f, 0x68, 0x69, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x63, - 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x53, 0x44, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x2e, - 0x4f, 0x70, 0x51, 0x75, 0x65, 0x75, 0x65, 0x41, 0x67, 0x65, 0x48, 0x69, 0x73, 0x74, 0x52, 0x0e, - 0x6f, 0x70, 0x51, 0x75, 0x65, 0x75, 0x65, 0x41, 0x67, 0x65, 0x48, 0x69, 0x73, 0x74, 0x12, 0x37, - 0x0a, 0x09, 0x70, 0x65, 0x72, 0x66, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x53, 0x44, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x53, 0x75, 0x6d, 0x2e, 0x50, 0x65, 0x72, 0x66, 0x53, 0x74, 0x61, 0x74, 0x52, 0x08, 0x70, - 0x65, 0x72, 0x66, 0x53, 0x74, 0x61, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, - 0x73, 0x18, 0x14, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, - 0x4f, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x65, - 0x70, 0x68, 0x2e, 0x4f, 0x53, 0x44, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x2e, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x10, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x1a, 0x9f, 0x03, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x46, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, - 0x2f, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, - 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1f, - 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x12, - 0x27, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, - 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x64, 0x61, 0x74, - 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x25, - 0x0a, 0x0e, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6f, 0x6d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, - 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x1a, 0x4f, 0x0a, 0x0e, 0x4f, 0x70, 0x51, 0x75, 0x65, 0x75, 0x65, 0x41, 0x67, 0x65, - 0x48, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, - 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x67, 0x72, - 0x61, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x75, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, - 0x75, 0x6e, 0x64, 0x1a, 0xb6, 0x01, 0x0a, 0x08, 0x50, 0x65, 0x72, 0x66, 0x53, 0x74, 0x61, 0x74, - 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, - 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x12, 0x28, 0x0a, 0x10, - 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x4c, 0x61, 0x74, - 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, - 0x4e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6c, 0x61, 0x74, 0x65, - 0x6e, 0x63, 0x79, 0x5f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x70, - 0x70, 0x6c, 0x79, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4e, 0x73, 0x1a, 0x9e, 0x05, 0x0a, - 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, - 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x73, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6f, - 0x73, 0x64, 0x12, 0x3b, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x4b, 0x0a, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x53, 0x44, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, - 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, - 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x1a, 0xee, 0x03, 0x0a, - 0x09, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x4d, 0x0a, 0x07, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x53, 0x44, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x53, 0x75, 0x6d, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, - 0x67, 0x54, 0x69, 0x6d, 0x65, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, - 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x07, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, - 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, - 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x53, 0x44, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x75, 0x6d, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x4d, 0x69, 0x6e, 0x52, 0x03, - 0x6d, 0x69, 0x6e, 0x12, 0x41, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2f, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x53, 0x44, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x53, 0x75, 0x6d, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, 0x54, - 0x69, 0x6d, 0x65, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x4d, 0x61, - 0x78, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x1a, 0x47, 0x0a, 0x07, 0x41, 0x76, - 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6e, 0x31, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6e, - 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x35, 0x12, 0x14, 0x0a, - 0x05, 0x6d, 0x69, 0x6e, 0x31, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x6d, 0x69, - 0x6e, 0x31, 0x35, 0x1a, 0x43, 0x0a, 0x03, 0x4d, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, - 0x6e, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x31, 0x12, 0x12, - 0x0a, 0x04, 0x6d, 0x69, 0x6e, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x69, - 0x6e, 0x35, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x31, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x31, 0x35, 0x1a, 0x43, 0x0a, 0x03, 0x4d, 0x61, 0x78, 0x12, - 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6e, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, - 0x69, 0x6e, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6e, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x35, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x31, 0x35, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x31, 0x35, 0x22, 0xee, 0x13, - 0x0a, 0x0c, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x42, - 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, - 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x74, - 0x61, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x52, 0x07, 0x73, 0x74, 0x61, 0x74, 0x53, - 0x75, 0x6d, 0x12, 0x4b, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, - 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x2e, 0x50, 0x47, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x19, 0x0a, 0x08, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x6c, 0x6f, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6f, 0x6e, - 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x75, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, - 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, - 0x6d, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x64, 0x65, 0x6c, 0x74, - 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x44, 0x65, - 0x6c, 0x74, 0x61, 0x1a, 0xe5, 0x0d, 0x0a, 0x14, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, - 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x1b, 0x0a, 0x09, - 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, - 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, - 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x70, 0x69, - 0x65, 0x73, 0x12, 0x42, 0x0a, 0x1e, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1a, 0x6e, 0x75, 0x6d, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4f, 0x6e, 0x50, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, - 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x44, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x63, 0x65, - 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x4d, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, - 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x75, 0x6e, 0x66, 0x6f, - 0x75, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x55, 0x6e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, - 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x74, - 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x44, 0x69, 0x72, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x5f, - 0x77, 0x68, 0x69, 0x74, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x6e, 0x75, 0x6d, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x12, 0x19, 0x0a, - 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x07, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, - 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6b, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6e, - 0x75, 0x6d, 0x52, 0x65, 0x61, 0x64, 0x4b, 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x5f, 0x6b, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x4b, 0x62, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x73, - 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x72, 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x53, 0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, - 0x63, 0x72, 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6e, 0x75, - 0x6d, 0x5f, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x44, 0x65, - 0x65, 0x70, 0x53, 0x63, 0x72, 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x0a, - 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x75, - 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, - 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, - 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, - 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, - 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, - 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x12, - 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6f, - 0x6d, 0x61, 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x6d, 0x61, 0x70, 0x12, 0x3c, 0x0a, 0x1b, 0x6e, 0x75, 0x6d, - 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x74, - 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, - 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, 0x69, 0x74, 0x53, 0x65, 0x74, - 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x38, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x5f, 0x62, - 0x79, 0x74, 0x65, 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x63, - 0x68, 0x69, 0x76, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x48, 0x69, 0x74, 0x53, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, - 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x18, 0x19, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x12, 0x20, - 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x6b, 0x62, 0x18, 0x1a, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4b, 0x62, - 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x18, 0x1b, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, 0x74, 0x12, 0x20, 0x0a, - 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x6b, 0x62, 0x18, 0x1c, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, 0x74, 0x4b, 0x62, 0x12, - 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x1d, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, - 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, - 0x75, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x69, 0x67, 0x68, 0x12, - 0x2b, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, - 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x77, 0x12, 0x2d, 0x0a, 0x13, - 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x73, - 0x6f, 0x6d, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x45, 0x76, - 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x53, 0x6f, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x6e, - 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x75, - 0x6c, 0x6c, 0x18, 0x21, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, - 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x46, 0x75, 0x6c, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, - 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, - 0x18, 0x22, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, - 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x65, 0x74, 0x73, 0x18, - 0x23, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x75, 0x6d, 0x5f, - 0x6c, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x4c, 0x61, 0x72, - 0x67, 0x65, 0x4f, 0x6d, 0x61, 0x70, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x30, 0x0a, - 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x61, 0x6e, - 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x25, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, - 0x24, 0x0a, 0x0e, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x4f, 0x6d, 0x61, 0x70, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x6d, 0x61, - 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x27, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6e, 0x75, - 0x6d, 0x4f, 0x6d, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x75, 0x6d, - 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, - 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x52, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x1a, 0xb0, 0x03, 0x0a, 0x17, - 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x5f, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1c, 0x0a, - 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, - 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, - 0x74, 0x61, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, - 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, - 0x12, 0x38, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x16, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x64, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x6d, - 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0d, 0x6f, 0x6d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xc8, - 0x20, 0x0a, 0x06, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x67, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x67, 0x69, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x72, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x65, 0x64, 0x5f, 0x73, 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x72, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x53, 0x65, 0x71, 0x12, 0x25, 0x0a, 0x0e, 0x72, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0d, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x72, 0x65, - 0x73, 0x68, 0x12, 0x3b, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x3b, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x3b, 0x0a, 0x0b, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x65, 0x72, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x6c, - 0x61, 0x73, 0x74, 0x50, 0x65, 0x65, 0x72, 0x65, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x43, - 0x6c, 0x65, 0x61, 0x6e, 0x12, 0x48, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x63, - 0x61, 0x6d, 0x65, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x6c, 0x61, - 0x73, 0x74, 0x42, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x48, - 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x62, 0x65, 0x63, 0x61, 0x6d, 0x65, 0x5f, 0x70, 0x65, - 0x65, 0x72, 0x65, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x42, 0x65, 0x63, 0x61, - 0x6d, 0x65, 0x50, 0x65, 0x65, 0x72, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x0c, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x75, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x6c, 0x61, 0x73, 0x74, - 0x55, 0x6e, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x12, 0x43, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x75, 0x6e, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, - 0x73, 0x74, 0x55, 0x6e, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x41, 0x0a, 0x0e, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x73, 0x69, 0x7a, 0x65, 0x64, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x73, 0x69, 0x7a, 0x65, 0x64, 0x12, - 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6d, 0x61, 0x70, 0x70, 0x69, 0x6e, 0x67, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x6e, 0x64, - 0x69, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x63, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x12, - 0x16, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x61, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x70, 0x6c, 0x69, 0x74, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x18, 0x16, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0f, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x70, 0x6c, 0x69, 0x74, 0x42, - 0x69, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x72, 0x75, - 0x62, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x63, 0x72, - 0x75, 0x62, 0x12, 0x44, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, - 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x63, - 0x72, 0x75, 0x62, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x26, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x18, 0x19, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x65, 0x65, 0x70, 0x53, 0x63, 0x72, 0x75, 0x62, - 0x12, 0x4d, 0x0a, 0x15, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x63, - 0x72, 0x75, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x12, 0x6c, 0x61, 0x73, - 0x74, 0x44, 0x65, 0x65, 0x70, 0x53, 0x63, 0x72, 0x75, 0x62, 0x53, 0x74, 0x61, 0x6d, 0x70, 0x12, - 0x4f, 0x0a, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x63, 0x6c, 0x65, 0x61, 0x6e, 0x5f, 0x73, 0x63, - 0x72, 0x75, 0x62, 0x5f, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x13, 0x6c, 0x61, 0x73, - 0x74, 0x43, 0x6c, 0x65, 0x61, 0x6e, 0x53, 0x63, 0x72, 0x75, 0x62, 0x53, 0x74, 0x61, 0x6d, 0x70, - 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x73, 0x63, 0x72, 0x75, - 0x62, 0x62, 0x65, 0x64, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x53, 0x63, 0x72, 0x75, 0x62, 0x62, 0x65, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x6c, - 0x6f, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6c, - 0x6f, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x6c, 0x6f, 0x67, 0x5f, 0x64, 0x75, - 0x70, 0x73, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6c, - 0x6f, 0x67, 0x44, 0x75, 0x70, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6f, 0x6e, - 0x64, 0x69, 0x73, 0x6b, 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x1f, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x53, 0x69, - 0x7a, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x18, 0x20, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x64, 0x69, 0x72, 0x74, 0x79, - 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x21, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x64, 0x69, 0x72, 0x74, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6f, 0x6d, 0x61, 0x70, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x22, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x10, 0x6f, 0x6d, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x73, 0x49, 0x6e, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x68, 0x69, 0x74, 0x73, 0x65, 0x74, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x23, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x12, 0x68, 0x69, 0x74, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x3b, 0x0a, 0x1a, 0x68, 0x69, 0x74, 0x73, 0x65, - 0x74, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x69, 0x6e, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x24, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x68, 0x69, 0x74, - 0x73, 0x65, 0x74, 0x42, 0x79, 0x74, 0x65, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x49, 0x6e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x70, 0x69, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x25, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0f, 0x70, 0x69, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x12, 0x34, 0x0a, 0x16, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x26, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x14, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x49, - 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x6e, 0x61, 0x70, 0x74, 0x72, - 0x69, 0x6d, 0x71, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x27, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x73, - 0x6e, 0x61, 0x70, 0x74, 0x72, 0x69, 0x6d, 0x71, 0x4c, 0x65, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x63, - 0x72, 0x75, 0x62, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x73, - 0x63, 0x72, 0x75, 0x62, 0x5f, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x29, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x75, 0x62, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, - 0x6c, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x64, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x73, 0x63, 0x72, 0x75, - 0x62, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x5f, 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x65, 0x64, 0x18, 0x2b, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x54, 0x72, 0x69, 0x6d, 0x6d, - 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x73, 0x6e, 0x61, 0x70, 0x74, 0x72, 0x69, 0x6d, 0x5f, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x2c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x73, - 0x6e, 0x61, 0x70, 0x74, 0x72, 0x69, 0x6d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x36, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x2d, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x2e, - 0x50, 0x47, 0x53, 0x74, 0x61, 0x74, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x52, 0x07, - 0x73, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x0e, 0x0a, 0x02, 0x75, 0x70, 0x18, 0x2e, 0x20, - 0x03, 0x28, 0x03, 0x52, 0x02, 0x75, 0x70, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6e, - 0x67, 0x18, 0x2f, 0x20, 0x03, 0x28, 0x03, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x12, - 0x28, 0x0a, 0x10, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x5f, 0x6e, 0x6f, 0x5f, 0x6d, 0x69, 0x73, 0x73, - 0x69, 0x6e, 0x67, 0x18, 0x30, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x4e, 0x6f, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x16, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x73, 0x18, 0x31, 0x20, 0x03, 0x28, 0x03, 0x52, 0x14, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x12, - 0x1d, 0x0a, 0x0a, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x62, 0x79, 0x18, 0x32, 0x20, - 0x03, 0x28, 0x03, 0x52, 0x09, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x42, 0x79, 0x12, 0x1d, - 0x0a, 0x0a, 0x75, 0x70, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x33, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x09, 0x75, 0x70, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x25, 0x0a, - 0x0e, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, - 0x34, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x75, 0x72, 0x67, 0x65, 0x64, 0x5f, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x18, 0x35, 0x20, 0x03, 0x28, 0x03, 0x52, 0x0b, 0x70, 0x75, 0x72, 0x67, - 0x65, 0x64, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x1a, 0xdf, 0x0d, 0x0a, 0x0e, 0x50, 0x47, 0x53, 0x74, - 0x61, 0x74, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, - 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, - 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, - 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6c, - 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0f, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x73, - 0x12, 0x42, 0x0a, 0x1e, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1a, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4f, 0x6e, 0x50, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x69, 0x73, - 0x73, 0x69, 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x5f, 0x64, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x44, 0x65, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x4d, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, - 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x75, 0x6e, 0x66, 0x6f, 0x75, 0x6e, - 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x55, 0x6e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, - 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x79, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x44, 0x69, 0x72, 0x74, 0x79, 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x5f, 0x77, 0x68, - 0x69, 0x74, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, - 0x75, 0x6d, 0x57, 0x68, 0x69, 0x74, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, - 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, - 0x75, 0x6d, 0x52, 0x65, 0x61, 0x64, 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, - 0x61, 0x64, 0x5f, 0x6b, 0x62, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6e, 0x75, 0x6d, - 0x52, 0x65, 0x61, 0x64, 0x4b, 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x5f, 0x6b, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x4b, 0x62, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x63, 0x72, - 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0e, 0x6e, 0x75, 0x6d, 0x53, 0x63, 0x72, 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, - 0x37, 0x0a, 0x18, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, - 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x53, 0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x63, 0x72, - 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, - 0x64, 0x65, 0x65, 0x70, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x65, 0x70, - 0x53, 0x63, 0x72, 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6e, - 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x65, 0x64, 0x18, 0x13, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x12, - 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, - 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x12, - 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x6f, - 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, - 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x12, 0x28, 0x0a, - 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6f, 0x6d, 0x61, - 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x4f, 0x6d, 0x61, 0x70, 0x12, 0x3c, 0x0a, 0x1b, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x61, - 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x6e, 0x75, - 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x48, 0x69, 0x74, 0x53, 0x65, 0x74, 0x41, 0x72, - 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x38, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x79, 0x74, - 0x65, 0x73, 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, - 0x76, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, - 0x65, 0x73, 0x48, 0x69, 0x74, 0x53, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x18, 0x19, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x12, 0x20, 0x0a, 0x0c, - 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x6b, 0x62, 0x18, 0x1a, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4b, 0x62, 0x12, 0x1b, - 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x6e, - 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x6b, 0x62, 0x18, 0x1c, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, 0x74, 0x4b, 0x62, 0x12, 0x1f, 0x0a, - 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x1d, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x2d, - 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x5f, 0x68, 0x69, 0x67, 0x68, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, - 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x48, 0x69, 0x67, 0x68, 0x12, 0x2b, 0x0a, - 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, - 0x6c, 0x6f, 0x77, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x46, 0x6c, - 0x75, 0x73, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x4c, 0x6f, 0x77, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, - 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x6f, 0x6d, - 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, - 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x53, 0x6f, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, - 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x75, 0x6c, 0x6c, - 0x18, 0x21, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, 0x74, - 0x4d, 0x6f, 0x64, 0x65, 0x46, 0x75, 0x6c, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x22, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x6c, 0x65, - 0x67, 0x61, 0x63, 0x79, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x65, 0x74, 0x73, 0x18, 0x23, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x65, 0x74, 0x73, 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x75, 0x6d, 0x5f, 0x6c, 0x61, - 0x72, 0x67, 0x65, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x18, 0x24, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x4c, 0x61, 0x72, 0x67, 0x65, - 0x4f, 0x6d, 0x61, 0x70, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6e, - 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, - 0x65, 0x73, 0x74, 0x18, 0x25, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, - 0x0e, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, - 0x26, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x4f, 0x6d, 0x61, 0x70, 0x42, 0x79, - 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x5f, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x27, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x4f, - 0x6d, 0x61, 0x70, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x18, - 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x52, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x22, 0xe7, 0x13, 0x0a, 0x09, 0x50, 0x6f, - 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x6f, 0x6c, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x70, 0x6f, 0x6f, 0x6c, 0x69, 0x64, 0x12, - 0x15, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x6e, 0x75, 0x6d, 0x50, 0x67, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x73, - 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, - 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x5f, 0x53, 0x74, 0x61, 0x74, 0x53, 0x75, 0x6d, 0x52, 0x07, 0x73, 0x74, 0x61, - 0x74, 0x53, 0x75, 0x6d, 0x12, 0x45, 0x0a, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x65, 0x70, 0x68, - 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x50, 0x6f, 0x6f, 0x6c, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x5f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x0a, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6c, - 0x6f, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6c, - 0x6f, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x6b, - 0x5f, 0x6c, 0x6f, 0x67, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0d, 0x6f, 0x6e, 0x64, 0x69, 0x73, 0x6b, 0x4c, 0x6f, 0x67, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x0e, - 0x0a, 0x02, 0x75, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x75, 0x70, 0x12, 0x16, - 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0d, 0x6e, 0x75, 0x6d, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x1a, 0xe2, - 0x0d, 0x0a, 0x11, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x53, 0x74, 0x61, - 0x74, 0x53, 0x75, 0x6d, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, - 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x63, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, - 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6c, 0x6f, 0x6e, 0x65, 0x73, 0x12, 0x2a, - 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x63, 0x6f, 0x70, - 0x69, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x43, 0x6f, 0x70, 0x69, 0x65, 0x73, 0x12, 0x42, 0x0a, 0x1e, 0x6e, 0x75, - 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, - 0x67, 0x5f, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x1a, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x69, - 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4f, 0x6e, 0x50, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x2e, - 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6e, 0x67, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x12, 0x30, - 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x64, 0x65, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, - 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x44, 0x65, 0x67, 0x72, 0x61, 0x64, 0x65, 0x64, - 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, - 0x6d, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x13, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, 0x69, 0x73, 0x70, 0x6c, - 0x61, 0x63, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x5f, 0x75, 0x6e, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x55, 0x6e, 0x66, - 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x5f, 0x64, 0x69, 0x72, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0f, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x44, 0x69, 0x72, 0x74, 0x79, - 0x12, 0x23, 0x0a, 0x0d, 0x6e, 0x75, 0x6d, 0x5f, 0x77, 0x68, 0x69, 0x74, 0x65, 0x6f, 0x75, 0x74, - 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x57, 0x68, 0x69, 0x74, - 0x65, 0x6f, 0x75, 0x74, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x61, - 0x64, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x61, 0x64, - 0x12, 0x1e, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x72, 0x65, 0x61, 0x64, 0x5f, 0x6b, 0x62, 0x18, - 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x52, 0x65, 0x61, 0x64, 0x4b, 0x62, - 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x20, 0x0a, - 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x5f, 0x6b, 0x62, 0x18, 0x0f, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, 0x57, 0x72, 0x69, 0x74, 0x65, 0x4b, 0x62, 0x12, - 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, - 0x6f, 0x72, 0x73, 0x18, 0x10, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x53, 0x63, - 0x72, 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6e, 0x75, 0x6d, - 0x5f, 0x73, 0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x6e, 0x75, 0x6d, - 0x53, 0x68, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x63, 0x72, 0x75, 0x62, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x73, 0x12, 0x31, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x64, 0x65, 0x65, 0x70, 0x5f, 0x73, - 0x63, 0x72, 0x75, 0x62, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x18, 0x12, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x44, 0x65, 0x65, 0x70, 0x53, 0x63, 0x72, 0x75, 0x62, 0x45, - 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x32, 0x0a, 0x15, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, - 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, - 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, - 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, - 0x63, 0x6f, 0x76, 0x65, 0x72, 0x65, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x18, 0x16, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4f, 0x6d, 0x61, - 0x70, 0x12, 0x3c, 0x0a, 0x1b, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x5f, 0x68, 0x69, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, - 0x18, 0x17, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x48, 0x69, 0x74, 0x53, 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, - 0x38, 0x0a, 0x19, 0x6e, 0x75, 0x6d, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x5f, 0x68, 0x69, 0x74, - 0x5f, 0x73, 0x65, 0x74, 0x5f, 0x61, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x18, 0x18, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x15, 0x6e, 0x75, 0x6d, 0x42, 0x79, 0x74, 0x65, 0x73, 0x48, 0x69, 0x74, 0x53, - 0x65, 0x74, 0x41, 0x72, 0x63, 0x68, 0x69, 0x76, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, - 0x5f, 0x66, 0x6c, 0x75, 0x73, 0x68, 0x18, 0x19, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, - 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x66, 0x6c, - 0x75, 0x73, 0x68, 0x5f, 0x6b, 0x62, 0x18, 0x1a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, - 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4b, 0x62, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x75, 0x6d, 0x5f, - 0x65, 0x76, 0x69, 0x63, 0x74, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x6e, 0x75, 0x6d, - 0x45, 0x76, 0x69, 0x63, 0x74, 0x12, 0x20, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, - 0x63, 0x74, 0x5f, 0x6b, 0x62, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, 0x6d, - 0x45, 0x76, 0x69, 0x63, 0x74, 0x4b, 0x62, 0x12, 0x1f, 0x0a, 0x0b, 0x6e, 0x75, 0x6d, 0x5f, 0x70, - 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6e, 0x75, - 0x6d, 0x50, 0x72, 0x6f, 0x6d, 0x6f, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, - 0x66, 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x18, - 0x1e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4d, - 0x6f, 0x64, 0x65, 0x48, 0x69, 0x67, 0x68, 0x12, 0x2b, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x66, - 0x6c, 0x75, 0x73, 0x68, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x18, 0x1f, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0f, 0x6e, 0x75, 0x6d, 0x46, 0x6c, 0x75, 0x73, 0x68, 0x4d, 0x6f, 0x64, - 0x65, 0x4c, 0x6f, 0x77, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, - 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x73, 0x6f, 0x6d, 0x65, 0x18, 0x20, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x53, - 0x6f, 0x6d, 0x65, 0x12, 0x2d, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x65, 0x76, 0x69, 0x63, 0x74, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x75, 0x6c, 0x6c, 0x18, 0x21, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x10, 0x6e, 0x75, 0x6d, 0x45, 0x76, 0x69, 0x63, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x46, 0x75, - 0x6c, 0x6c, 0x12, 0x2c, 0x0a, 0x12, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x5f, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x18, 0x22, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, - 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x6c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x5f, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x65, 0x74, 0x73, 0x18, 0x23, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, - 0x75, 0x6d, 0x4c, 0x65, 0x67, 0x61, 0x63, 0x79, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x65, 0x74, 0x73, - 0x12, 0x33, 0x0a, 0x16, 0x6e, 0x75, 0x6d, 0x5f, 0x6c, 0x61, 0x72, 0x67, 0x65, 0x5f, 0x6f, 0x6d, - 0x61, 0x70, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x24, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x4f, 0x6d, 0x61, 0x70, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x73, 0x5f, 0x6d, 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x18, 0x25, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x4d, - 0x61, 0x6e, 0x69, 0x66, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, - 0x6d, 0x61, 0x70, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x26, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0c, 0x6e, 0x75, 0x6d, 0x4f, 0x6d, 0x61, 0x70, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x22, 0x0a, - 0x0d, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x27, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x4f, 0x6d, 0x61, 0x70, 0x4b, 0x65, 0x79, - 0x73, 0x12, 0x30, 0x0a, 0x14, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x5f, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x18, 0x28, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x12, 0x6e, 0x75, 0x6d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x70, 0x61, 0x69, - 0x72, 0x65, 0x64, 0x1a, 0xad, 0x03, 0x0a, 0x14, 0x50, 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x5f, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, - 0x12, 0x2f, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x72, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x69, - 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x64, - 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x43, - 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x64, 0x61, - 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x41, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, - 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, - 0x25, 0x0a, 0x0e, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, - 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6f, 0x6d, 0x61, 0x70, 0x41, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x22, 0xe4, 0x10, 0x0a, 0x08, 0x4f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x73, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6f, - 0x73, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x70, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x06, 0x75, 0x70, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x73, - 0x65, 0x71, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x73, 0x65, 0x71, 0x12, 0x17, 0x0a, - 0x07, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, - 0x6e, 0x75, 0x6d, 0x50, 0x67, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x5f, 0x6f, 0x73, - 0x64, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x4f, 0x73, 0x64, - 0x73, 0x12, 0x29, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6f, - 0x6c, 0x5f, 0x6f, 0x73, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, - 0x6d, 0x50, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x73, 0x64, 0x73, 0x12, 0x32, 0x0a, 0x16, - 0x6e, 0x75, 0x6d, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x5f, 0x6f, 0x6d, 0x61, - 0x70, 0x5f, 0x6f, 0x73, 0x64, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x6e, 0x75, - 0x6d, 0x50, 0x65, 0x72, 0x50, 0x6f, 0x6f, 0x6c, 0x4f, 0x6d, 0x61, 0x70, 0x4f, 0x73, 0x64, 0x73, - 0x12, 0x0e, 0x0a, 0x02, 0x6b, 0x62, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x02, 0x6b, 0x62, - 0x12, 0x17, 0x0a, 0x07, 0x6b, 0x62, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x06, 0x6b, 0x62, 0x55, 0x73, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0c, 0x6b, 0x62, 0x5f, - 0x75, 0x73, 0x65, 0x64, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0a, 0x6b, 0x62, 0x55, 0x73, 0x65, 0x64, 0x44, 0x61, 0x74, 0x61, 0x12, 0x20, 0x0a, 0x0c, 0x6b, - 0x62, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6f, 0x6d, 0x61, 0x70, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0a, 0x6b, 0x62, 0x55, 0x73, 0x65, 0x64, 0x4f, 0x6d, 0x61, 0x70, 0x12, 0x20, 0x0a, - 0x0c, 0x6b, 0x62, 0x5f, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0a, 0x6b, 0x62, 0x55, 0x73, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x61, 0x12, - 0x19, 0x0a, 0x08, 0x6b, 0x62, 0x5f, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x18, 0x0d, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x6b, 0x62, 0x41, 0x76, 0x61, 0x69, 0x6c, 0x12, 0x2d, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x66, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x63, 0x65, 0x70, - 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x46, - 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x66, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x62, 0x5f, - 0x70, 0x65, 0x65, 0x72, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x03, 0x52, 0x07, 0x68, 0x62, 0x50, - 0x65, 0x65, 0x72, 0x73, 0x12, 0x2d, 0x0a, 0x13, 0x73, 0x6e, 0x61, 0x70, 0x5f, 0x74, 0x72, 0x69, - 0x6d, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x10, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x73, 0x6e, 0x61, 0x70, 0x54, 0x72, 0x69, 0x6d, 0x51, 0x75, 0x65, 0x75, 0x65, - 0x4c, 0x65, 0x6e, 0x12, 0x2a, 0x0a, 0x11, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x5f, - 0x74, 0x72, 0x69, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x18, 0x11, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, - 0x6e, 0x75, 0x6d, 0x53, 0x6e, 0x61, 0x70, 0x54, 0x72, 0x69, 0x6d, 0x6d, 0x69, 0x6e, 0x67, 0x12, - 0x2e, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x64, 0x73, 0x5f, 0x72, 0x65, - 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x6e, 0x75, - 0x6d, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x70, 0x61, 0x69, 0x72, 0x65, 0x64, 0x12, - 0x48, 0x0a, 0x11, 0x6f, 0x70, 0x5f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x5f, 0x61, 0x67, 0x65, 0x5f, - 0x68, 0x69, 0x73, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x65, 0x70, - 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x4f, 0x70, 0x51, 0x75, 0x65, - 0x75, 0x65, 0x41, 0x67, 0x65, 0x48, 0x69, 0x73, 0x74, 0x52, 0x0e, 0x6f, 0x70, 0x51, 0x75, 0x65, - 0x75, 0x65, 0x41, 0x67, 0x65, 0x48, 0x69, 0x73, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x70, 0x65, 0x72, - 0x66, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x63, - 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x50, 0x65, 0x72, - 0x66, 0x53, 0x74, 0x61, 0x74, 0x52, 0x08, 0x70, 0x65, 0x72, 0x66, 0x53, 0x74, 0x61, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x18, 0x15, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x06, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x73, 0x12, 0x4c, 0x0a, 0x12, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x5f, 0x70, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x16, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, 0x54, - 0x69, 0x6d, 0x65, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x1a, 0x9f, 0x03, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x46, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x76, 0x61, 0x69, 0x6c, - 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, - 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x52, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, - 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x61, 0x74, 0x61, 0x53, 0x74, - 0x6f, 0x72, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x64, - 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x12, 0x3a, 0x0a, - 0x19, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x17, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x61, 0x74, - 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x6f, 0x72, 0x69, - 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, 0x64, 0x61, 0x74, - 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6f, 0x6d, 0x61, - 0x70, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x4f, 0x0a, 0x0e, 0x4f, 0x70, 0x51, 0x75, 0x65, - 0x75, 0x65, 0x41, 0x67, 0x65, 0x48, 0x69, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x68, 0x69, 0x73, - 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x68, 0x69, - 0x73, 0x74, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x12, 0x1f, 0x0a, 0x0b, 0x75, 0x70, 0x70, 0x65, 0x72, - 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x75, 0x70, - 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x1a, 0xb6, 0x01, 0x0a, 0x08, 0x50, 0x65, 0x72, - 0x66, 0x53, 0x74, 0x61, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, - 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, - 0x73, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, - 0x63, 0x79, 0x5f, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x70, 0x70, - 0x6c, 0x79, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4d, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6e, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x4c, 0x61, - 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4e, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x70, 0x70, 0x6c, 0x79, - 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x6c, 0x79, 0x4c, 0x61, 0x74, 0x65, 0x6e, 0x63, 0x79, 0x4e, - 0x73, 0x1a, 0xf6, 0x04, 0x0a, 0x0f, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, - 0x67, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x73, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x03, 0x6f, 0x73, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, - 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x6c, 0x61, - 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x48, 0x0a, 0x0a, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x66, 0x61, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x63, - 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x2e, 0x49, 0x6e, 0x74, - 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x52, 0x0a, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, - 0x65, 0x73, 0x1a, 0xe5, 0x03, 0x0a, 0x09, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, - 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, - 0x61, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4a, 0x0a, 0x07, 0x61, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, - 0x4f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x50, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, - 0x63, 0x65, 0x2e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x07, 0x61, 0x76, 0x65, 0x72, - 0x61, 0x67, 0x65, 0x12, 0x3e, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x4d, 0x69, 0x6e, 0x52, 0x03, - 0x6d, 0x69, 0x6e, 0x12, 0x3e, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x4f, 0x73, 0x64, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x2e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x50, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, - 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x2e, 0x4d, 0x61, 0x78, 0x52, 0x03, - 0x6d, 0x61, 0x78, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x04, 0x6c, 0x61, 0x73, 0x74, 0x1a, 0x47, 0x0a, 0x07, 0x41, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6e, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6e, 0x35, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x35, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, - 0x6e, 0x31, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x31, 0x35, - 0x1a, 0x43, 0x0a, 0x03, 0x4d, 0x69, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6e, 0x31, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x31, 0x12, 0x12, 0x0a, 0x04, 0x6d, - 0x69, 0x6e, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x35, 0x12, - 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x31, 0x35, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, - 0x6d, 0x69, 0x6e, 0x31, 0x35, 0x1a, 0x43, 0x0a, 0x03, 0x4d, 0x61, 0x78, 0x12, 0x12, 0x0a, 0x04, - 0x6d, 0x69, 0x6e, 0x31, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x6d, 0x69, 0x6e, 0x31, - 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6e, 0x35, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, - 0x6d, 0x69, 0x6e, 0x35, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x69, 0x6e, 0x31, 0x35, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x05, 0x6d, 0x69, 0x6e, 0x31, 0x35, 0x22, 0xcd, 0x03, 0x0a, 0x0a, 0x50, - 0x6f, 0x6f, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x46, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x6f, - 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x70, 0x6f, 0x6f, 0x6c, 0x69, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x73, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, - 0x6f, 0x73, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x76, 0x61, - 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x76, - 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x2f, 0x0a, 0x13, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x6e, 0x61, 0x6c, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x6c, 0x79, - 0x52, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x61, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x64, 0x61, 0x74, - 0x61, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x12, 0x27, 0x0a, 0x0f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x0e, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, - 0x12, 0x3a, 0x0a, 0x19, 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x17, 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x38, 0x0a, 0x18, - 0x64, 0x61, 0x74, 0x61, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x5f, - 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x16, - 0x64, 0x61, 0x74, 0x61, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x65, 0x64, 0x4f, 0x72, - 0x69, 0x67, 0x69, 0x6e, 0x61, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x6f, 0x6d, 0x61, 0x70, 0x5f, 0x61, - 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, - 0x6f, 0x6d, 0x61, 0x70, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x12, 0x2b, 0x0a, - 0x11, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6e, - 0x61, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x32, 0xed, 0x02, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x46, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x45, 0x0a, - 0x0e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, 0x4d, 0x6f, 0x6e, 0x44, 0x75, 0x6d, 0x70, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x19, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, - 0x65, 0x70, 0x68, 0x4d, 0x6f, 0x6e, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x48, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, 0x4f, - 0x73, 0x64, 0x44, 0x75, 0x6d, 0x70, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1c, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, 0x4f, 0x73, 0x64, - 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x46, - 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, 0x50, 0x67, 0x44, 0x75, 0x6d, 0x70, 0x12, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x1b, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x47, - 0x65, 0x74, 0x43, 0x65, 0x70, 0x68, 0x50, 0x67, 0x44, 0x75, 0x6d, 0x70, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x42, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x43, 0x65, 0x70, - 0x68, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, - 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x22, 0x00, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6c, 0x79, 0x73, 0x6f, 0x2f, 0x63, - 0x65, 0x70, 0x68, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x65, 0x70, 0x68, - 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, -} +const file_status_proto_rawDesc = "" + + "\n" + + "\fstatus.proto\x12\x04ceph\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"\xc4\x04\n" + + "\x15GetCephStatusResponse\x12\x12\n" + + "\x04fsid\x18\x01 \x01(\tR\x04fsid\x12.\n" + + "\x06health\x18\x02 \x01(\v2\x16.ceph.CephStatusHealthR\x06health\x12%\n" + + "\x0eelection_epoch\x18\x03 \x01(\x05R\relectionEpoch\x12\x16\n" + + "\x06quorum\x18\x04 \x03(\x05R\x06quorum\x12!\n" + + "\fquorum_names\x18\x05 \x03(\tR\vquorumNames\x12\x1d\n" + + "\n" + + "quorum_age\x18\x06 \x01(\x05R\tquorumAge\x12.\n" + + "\x06monmap\x18\a \x01(\v2\x16.ceph.CephStatusMonMapR\x06monmap\x12.\n" + + "\x06osdmap\x18\b \x01(\v2\x16.ceph.CephStatusOSDMapR\x06osdmap\x12+\n" + + "\x05pgmap\x18\t \x01(\v2\x15.ceph.CephStatusPGMapR\x05pgmap\x12+\n" + + "\x05fsmap\x18\n" + + " \x01(\v2\x15.ceph.CephStatusFSMapR\x05fsmap\x12.\n" + + "\x06mgrmap\x18\v \x01(\v2\x16.ceph.CephStatusMgrMapR\x06mgrmap\x12:\n" + + "\n" + + "servicemap\x18\f \x01(\v2\x1a.ceph.CephStatusServiceMapR\n" + + "servicemap\x12@\n" + + "\x0fprogress_events\x18\r \x01(\v2\x17.google.protobuf.StructR\x0eprogressEvents\"\xce\x04\n" + + "\x13CephMonDumpResponse\x12\x14\n" + + "\x05epoch\x18\x01 \x01(\x05R\x05epoch\x12\x12\n" + + "\x04fsid\x18\x02 \x01(\tR\x04fsid\x126\n" + + "\bmodified\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\bmodified\x124\n" + + "\acreated\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\acreated\x12&\n" + + "\x0fmin_mon_release\x18\x05 \x01(\x05R\rminMonRelease\x12/\n" + + "\x14min_mon_release_name\x18\x06 \x01(\tR\x11minMonReleaseName\x12+\n" + + "\x11election_strategy\x18\a \x01(\x05R\x10electionStrategy\x12-\n" + + "\x12disallowed_leaders\x18\b \x01(\tR\x11disallowedLeaders\x12!\n" + + "\fstretch_mode\x18\t \x01(\bR\vstretchMode\x12%\n" + + "\x0etiebreaker_mon\x18\n" + + " \x01(\tR\rtiebreakerMon\x12#\n" + + "\rremoved_ranks\x18\v \x01(\tR\fremovedRanks\x125\n" + + "\bfeatures\x18\f \x01(\v2\x19.ceph.CephMonDumpFeaturesR\bfeatures\x12,\n" + + "\x04mons\x18\r \x03(\v2\x18.ceph.CephMonDumpMonInfoR\x04mons\x12\x16\n" + + "\x06quorum\x18\x0e \x03(\x05R\x06quorum\"Q\n" + + "\x13CephMonDumpFeatures\x12\x1e\n" + + "\n" + + "persistent\x18\x01 \x03(\tR\n" + + "persistent\x12\x1a\n" + + "\boptional\x18\x02 \x03(\tR\boptional\"\x89\x02\n" + + "\x12CephMonDumpMonInfo\x12\x12\n" + + "\x04rank\x18\x01 \x01(\x05R\x04rank\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12;\n" + + "\fpublic_addrs\x18\x03 \x01(\v2\x18.ceph.CephMonDumpAddrVecR\vpublicAddrs\x12\x12\n" + + "\x04addr\x18\x04 \x01(\tR\x04addr\x12\x1f\n" + + "\vpublic_addr\x18\x05 \x01(\tR\n" + + "publicAddr\x12\x1a\n" + + "\bpriority\x18\x06 \x01(\x05R\bpriority\x12\x16\n" + + "\x06weight\x18\a \x01(\x05R\x06weight\x12%\n" + + "\x0ecrush_location\x18\b \x01(\tR\rcrushLocation\"H\n" + + "\x12CephMonDumpAddrVec\x122\n" + + "\aaddrvec\x18\x01 \x03(\v2\x18.ceph.CephMonDumpAddressR\aaddrvec\"R\n" + + "\x12CephMonDumpAddress\x12\x12\n" + + "\x04type\x18\x01 \x01(\tR\x04type\x12\x12\n" + + "\x04addr\x18\x02 \x01(\tR\x04addr\x12\x14\n" + + "\x05nonce\x18\x03 \x01(\x05R\x05nonce\"\xe8\x01\n" + + "\x10CephStatusHealth\x12\x16\n" + + "\x06status\x18\x01 \x01(\tR\x06status\x12:\n" + + "\x06checks\x18\x02 \x03(\v2\".ceph.CephStatusHealth.ChecksEntryR\x06checks\x12,\n" + + "\x05mutes\x18\x03 \x03(\v2\x16.google.protobuf.ValueR\x05mutes\x1aR\n" + + "\vChecksEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12-\n" + + "\x05value\x18\x02 \x01(\v2\x17.google.protobuf.StructR\x05value:\x028\x01\"t\n" + + "\x10CephStatusMonMap\x12\x14\n" + + "\x05epoch\x18\x01 \x01(\x05R\x05epoch\x12/\n" + + "\x14min_mon_release_name\x18\x02 \x01(\tR\x11minMonReleaseName\x12\x19\n" + + "\bnum_mons\x18\x03 \x01(\x05R\anumMons\"\xf1\x01\n" + + "\x10CephStatusOSDMap\x12\x14\n" + + "\x05epoch\x18\x01 \x01(\x05R\x05epoch\x12\x19\n" + + "\bnum_osds\x18\x02 \x01(\x05R\anumOsds\x12\x1e\n" + + "\vnum_up_osds\x18\x03 \x01(\x05R\tnumUpOsds\x12 \n" + + "\fosd_up_since\x18\x04 \x01(\x03R\n" + + "osdUpSince\x12\x1e\n" + + "\vnum_in_osds\x18\x05 \x01(\x05R\tnumInOsds\x12 \n" + + "\fosd_in_since\x18\x06 \x01(\x03R\n" + + "osdInSince\x12(\n" + + "\x10num_remapped_pgs\x18\a \x01(\x05R\x0enumRemappedPgs\"\xa3\x02\n" + + "\x0fCephStatusPGMap\x129\n" + + "\fpgs_by_state\x18\x01 \x03(\v2\x17.ceph.CephStatusPGStateR\n" + + "pgsByState\x12\x17\n" + + "\anum_pgs\x18\x02 \x01(\x05R\x06numPgs\x12\x1b\n" + + "\tnum_pools\x18\x03 \x01(\x05R\bnumPools\x12\x1f\n" + + "\vnum_objects\x18\x04 \x01(\x05R\n" + + "numObjects\x12\x1d\n" + + "\n" + + "data_bytes\x18\x05 \x01(\x03R\tdataBytes\x12\x1d\n" + + "\n" + + "bytes_used\x18\x06 \x01(\x03R\tbytesUsed\x12\x1f\n" + + "\vbytes_avail\x18\a \x01(\x03R\n" + + "bytesAvail\x12\x1f\n" + + "\vbytes_total\x18\b \x01(\x03R\n" + + "bytesTotal\"H\n" + + "\x11CephStatusPGState\x12\x1d\n" + + "\n" + + "state_name\x18\x01 \x01(\tR\tstateName\x12\x14\n" + + "\x05count\x18\x02 \x01(\x05R\x05count\"w\n" + + "\x0fCephStatusFSMap\x12\x14\n" + + "\x05epoch\x18\x01 \x01(\x05R\x05epoch\x12/\n" + + "\aby_rank\x18\x02 \x03(\v2\x16.google.protobuf.ValueR\x06byRank\x12\x1d\n" + + "\n" + + "up_standby\x18\x03 \x01(\x05R\tupStandby\"\xec\x01\n" + + "\x10CephStatusMgrMap\x12\x1c\n" + + "\tavailable\x18\x01 \x01(\bR\tavailable\x12!\n" + + "\fnum_standbys\x18\x02 \x01(\x05R\vnumStandbys\x12\x18\n" + + "\amodules\x18\x03 \x03(\tR\amodules\x12@\n" + + "\bservices\x18\x04 \x03(\v2$.ceph.CephStatusMgrMap.ServicesEntryR\bservices\x1a;\n" + + "\rServicesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xe4\x01\n" + + "\x14CephStatusServiceMap\x12\x14\n" + + "\x05epoch\x18\x01 \x01(\x05R\x05epoch\x12\x1a\n" + + "\bmodified\x18\x02 \x01(\tR\bmodified\x12D\n" + + "\bservices\x18\x03 \x03(\v2(.ceph.CephStatusServiceMap.ServicesEntryR\bservices\x1aT\n" + + "\rServicesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12-\n" + + "\x05value\x18\x02 \x01(\v2\x17.ceph.CephStatusServiceR\x05value:\x028\x01\"\xc1\x01\n" + + "\x11CephStatusService\x12>\n" + + "\adaemons\x18\x01 \x03(\v2$.ceph.CephStatusService.DaemonsEntryR\adaemons\x12\x18\n" + + "\asummary\x18\x02 \x01(\tR\asummary\x1aR\n" + + "\fDaemonsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12,\n" + + "\x05value\x18\x02 \x01(\v2\x16.google.protobuf.ValueR\x05value:\x028\x01\"\xb3\x10\n" + + "\x16GetCephOsdDumpResponse\x12\x14\n" + + "\x05epoch\x18\x01 \x01(\x05R\x05epoch\x12\x12\n" + + "\x04fsid\x18\x02 \x01(\tR\x04fsid\x124\n" + + "\acreated\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\acreated\x126\n" + + "\bmodified\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\bmodified\x12@\n" + + "\x0elast_up_change\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampR\flastUpChange\x12@\n" + + "\x0elast_in_change\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\flastInChange\x12\x14\n" + + "\x05flags\x18\a \x01(\tR\x05flags\x12\x1b\n" + + "\tflags_num\x18\b \x01(\x05R\bflagsNum\x12\x1b\n" + + "\tflags_set\x18\t \x03(\tR\bflagsSet\x12#\n" + + "\rcrush_version\x18\n" + + " \x01(\x05R\fcrushVersion\x12\x1d\n" + + "\n" + + "full_ratio\x18\v \x01(\x01R\tfullRatio\x12-\n" + + "\x12backfillfull_ratio\x18\f \x01(\x01R\x11backfillfullRatio\x12%\n" + + "\x0enearfull_ratio\x18\r \x01(\x01R\rnearfullRatio\x12)\n" + + "\x10cluster_snapshot\x18\x0e \x01(\tR\x0fclusterSnapshot\x12\x19\n" + + "\bpool_max\x18\x0f \x01(\x05R\apoolMax\x12\x17\n" + + "\amax_osd\x18\x10 \x01(\x05R\x06maxOsd\x129\n" + + "\x19require_min_compat_client\x18\x11 \x01(\tR\x16requireMinCompatClient\x12*\n" + + "\x11min_compat_client\x18\x12 \x01(\tR\x0fminCompatClient\x12.\n" + + "\x13require_osd_release\x18\x13 \x01(\tR\x11requireOsdRelease\x12#\n" + + "\rallow_crimson\x18\x14 \x01(\bR\fallowCrimson\x12'\n" + + "\x05pools\x18\x15 \x03(\v2\x11.ceph.OsdDumpPoolR\x05pools\x12(\n" + + "\x04osds\x18\x16 \x03(\v2\x14.ceph.OsdDumpOsdInfoR\x04osds\x122\n" + + "\tosd_xinfo\x18\x17 \x03(\v2\x15.ceph.OsdDumpOsdXInfoR\bosdXinfo\x121\n" + + "\bpg_upmap\x18\x18 \x03(\v2\x16.google.protobuf.ValueR\apgUpmap\x12<\n" + + "\x0epg_upmap_items\x18\x19 \x03(\v2\x16.google.protobuf.ValueR\fpgUpmapItems\x12D\n" + + "\x12pg_upmap_primaries\x18\x1a \x03(\v2\x16.google.protobuf.ValueR\x10pgUpmapPrimaries\x12/\n" + + "\apg_temp\x18\x1b \x03(\v2\x16.google.protobuf.ValueR\x06pgTemp\x129\n" + + "\fprimary_temp\x18\x1c \x03(\v2\x16.google.protobuf.ValueR\vprimaryTemp\x12I\n" + + "\tblocklist\x18\x1d \x03(\v2+.ceph.GetCephOsdDumpResponse.BlocklistEntryR\tblocklist\x12@\n" + + "\x0frange_blocklist\x18\x1e \x01(\v2\x17.google.protobuf.StructR\x0erangeBlocklist\x12i\n" + + "\x15erasure_code_profiles\x18\x1f \x03(\v25.ceph.GetCephOsdDumpResponse.ErasureCodeProfilesEntryR\x13erasureCodeProfiles\x12F\n" + + "\x13removed_snaps_queue\x18 \x03(\v2\x16.google.protobuf.ValueR\x11removedSnapsQueue\x12B\n" + + "\x11new_removed_snaps\x18! \x03(\v2\x16.google.protobuf.ValueR\x0fnewRemovedSnaps\x12@\n" + + "\x10new_purged_snaps\x18\" \x03(\v2\x16.google.protobuf.ValueR\x0enewPurgedSnaps\x12A\n" + + "\x10crush_node_flags\x18# \x01(\v2\x17.google.protobuf.StructR\x0ecrushNodeFlags\x12E\n" + + "\x12device_class_flags\x18$ \x01(\v2\x17.google.protobuf.StructR\x10deviceClassFlags\x12;\n" + + "\fstretch_mode\x18% \x01(\v2\x18.ceph.OsdDumpStretchModeR\vstretchMode\x1aX\n" + + "\x0eBlocklistEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x120\n" + + "\x05value\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x05value:\x028\x01\x1ag\n" + + "\x18ErasureCodeProfilesEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x125\n" + + "\x05value\x18\x02 \x01(\v2\x1f.ceph.OsdDumpErasureCodeProfileR\x05value:\x028\x01\"\xc3\x15\n" + + "\vOsdDumpPool\x12\x12\n" + + "\x04pool\x18\x01 \x01(\x05R\x04pool\x12\x1b\n" + + "\tpool_name\x18\x02 \x01(\tR\bpoolName\x12;\n" + + "\vcreate_time\x18\x03 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "createTime\x12\x14\n" + + "\x05flags\x18\x04 \x01(\x03R\x05flags\x12\x1f\n" + + "\vflags_names\x18\x05 \x01(\tR\n" + + "flagsNames\x12\x12\n" + + "\x04type\x18\x06 \x01(\x05R\x04type\x12\x12\n" + + "\x04size\x18\a \x01(\x05R\x04size\x12\x19\n" + + "\bmin_size\x18\b \x01(\x05R\aminSize\x12\x1d\n" + + "\n" + + "crush_rule\x18\t \x01(\x05R\tcrushRule\x12;\n" + + "\x1apeering_crush_bucket_count\x18\n" + + " \x01(\x05R\x17peeringCrushBucketCount\x12=\n" + + "\x1bpeering_crush_bucket_target\x18\v \x01(\x05R\x18peeringCrushBucketTarget\x12?\n" + + "\x1cpeering_crush_bucket_barrier\x18\f \x01(\x05R\x19peeringCrushBucketBarrier\x12P\n" + + "%peering_crush_bucket_mandatory_member\x18\r \x01(\x05R!peeringCrushBucketMandatoryMember\x12\x1f\n" + + "\vobject_hash\x18\x0e \x01(\x05R\n" + + "objectHash\x12*\n" + + "\x11pg_autoscale_mode\x18\x0f \x01(\tR\x0fpgAutoscaleMode\x12\x15\n" + + "\x06pg_num\x18\x10 \x01(\x05R\x05pgNum\x12(\n" + + "\x10pg_placement_num\x18\x11 \x01(\x05R\x0epgPlacementNum\x125\n" + + "\x17pg_placement_num_target\x18\x12 \x01(\x05R\x14pgPlacementNumTarget\x12\"\n" + + "\rpg_num_target\x18\x13 \x01(\x05R\vpgNumTarget\x12$\n" + + "\x0epg_num_pending\x18\x14 \x01(\x05R\fpgNumPending\x12I\n" + + "\x12last_pg_merge_meta\x18\x15 \x01(\v2\x1c.ceph.OsdDumpLastPgMergeMetaR\x0flastPgMergeMeta\x12\x1f\n" + + "\vlast_change\x18\x16 \x01(\tR\n" + + "lastChange\x12/\n" + + "\x14last_force_op_resend\x18\x17 \x01(\tR\x11lastForceOpResend\x12F\n" + + " last_force_op_resend_prenautilus\x18\x18 \x01(\tR\x1clastForceOpResendPrenautilus\x12F\n" + + " last_force_op_resend_preluminous\x18\x19 \x01(\tR\x1clastForceOpResendPreluminous\x12\x12\n" + + "\x04auid\x18\x1a \x01(\x04R\x04auid\x12\x1b\n" + + "\tsnap_mode\x18\x1b \x01(\tR\bsnapMode\x12\x19\n" + + "\bsnap_seq\x18\x1c \x01(\x04R\asnapSeq\x12\x1d\n" + + "\n" + + "snap_epoch\x18\x1d \x01(\x04R\tsnapEpoch\x125\n" + + "\n" + + "pool_snaps\x18\x1e \x03(\v2\x16.google.protobuf.ValueR\tpoolSnaps\x12#\n" + + "\rremoved_snaps\x18\x1f \x01(\tR\fremovedSnaps\x12&\n" + + "\x0fquota_max_bytes\x18 \x01(\x04R\rquotaMaxBytes\x12*\n" + + "\x11quota_max_objects\x18! \x01(\x04R\x0fquotaMaxObjects\x12\x14\n" + + "\x05tiers\x18\" \x03(\x05R\x05tiers\x12\x17\n" + + "\atier_of\x18# \x01(\x05R\x06tierOf\x12\x1b\n" + + "\tread_tier\x18$ \x01(\x05R\breadTier\x12\x1d\n" + + "\n" + + "write_tier\x18% \x01(\x05R\twriteTier\x12\x1d\n" + + "\n" + + "cache_mode\x18& \x01(\tR\tcacheMode\x12(\n" + + "\x10target_max_bytes\x18' \x01(\x04R\x0etargetMaxBytes\x12,\n" + + "\x12target_max_objects\x18( \x01(\x04R\x10targetMaxObjects\x12B\n" + + "\x1ecache_target_dirty_ratio_micro\x18) \x01(\x04R\x1acacheTargetDirtyRatioMicro\x12K\n" + + "#cache_target_dirty_high_ratio_micro\x18* \x01(\x04R\x1ecacheTargetDirtyHighRatioMicro\x12@\n" + + "\x1dcache_target_full_ratio_micro\x18+ \x01(\x04R\x19cacheTargetFullRatioMicro\x12-\n" + + "\x13cache_min_flush_age\x18, \x01(\x04R\x10cacheMinFlushAge\x12-\n" + + "\x13cache_min_evict_age\x18- \x01(\x04R\x10cacheMinEvictAge\x120\n" + + "\x14erasure_code_profile\x18. \x01(\tR\x12erasureCodeProfile\x12?\n" + + "\x0ehit_set_params\x18/ \x01(\v2\x19.ceph.OsdDumpHitSetParamsR\fhitSetParams\x12$\n" + + "\x0ehit_set_period\x180 \x01(\x04R\fhitSetPeriod\x12\"\n" + + "\rhit_set_count\x181 \x01(\x04R\vhitSetCount\x12$\n" + + "\x0euse_gmt_hitset\x182 \x01(\bR\fuseGmtHitset\x12>\n" + + "\x1cmin_read_recency_for_promote\x183 \x01(\x04R\x18minReadRecencyForPromote\x12@\n" + + "\x1dmin_write_recency_for_promote\x184 \x01(\x04R\x19minWriteRecencyForPromote\x126\n" + + "\x18hit_set_grade_decay_rate\x185 \x01(\x04R\x14hitSetGradeDecayRate\x120\n" + + "\x15hit_set_search_last_n\x186 \x01(\x04R\x11hitSetSearchLastN\x127\n" + + "\vgrade_table\x187 \x03(\v2\x16.google.protobuf.ValueR\n" + + "gradeTable\x12!\n" + + "\fstripe_width\x188 \x01(\x04R\vstripeWidth\x120\n" + + "\x14expected_num_objects\x189 \x01(\x04R\x12expectedNumObjects\x12\x1b\n" + + "\tfast_read\x18: \x01(\bR\bfastRead\x121\n" + + "\aoptions\x18; \x01(\v2\x17.google.protobuf.StructR\aoptions\x12J\n" + + "\x14application_metadata\x18< \x01(\v2\x17.google.protobuf.StructR\x13applicationMetadata\x12;\n" + + "\fread_balance\x18= \x01(\v2\x18.ceph.OsdDumpReadBalanceR\vreadBalance\"\x80\x02\n" + + "\x16OsdDumpLastPgMergeMeta\x12\x1f\n" + + "\vsource_pgid\x18\x01 \x01(\tR\n" + + "sourcePgid\x12\x1f\n" + + "\vready_epoch\x18\x02 \x01(\x05R\n" + + "readyEpoch\x12,\n" + + "\x12last_epoch_started\x18\x03 \x01(\x05R\x10lastEpochStarted\x12(\n" + + "\x10last_epoch_clean\x18\x04 \x01(\x05R\x0elastEpochClean\x12%\n" + + "\x0esource_version\x18\x05 \x01(\tR\rsourceVersion\x12%\n" + + "\x0etarget_version\x18\x06 \x01(\tR\rtargetVersion\")\n" + + "\x13OsdDumpHitSetParams\x12\x12\n" + + "\x04type\x18\x01 \x01(\tR\x04type\"\x94\x03\n" + + "\x12OsdDumpReadBalance\x12!\n" + + "\fscore_acting\x18\x01 \x01(\x01R\vscoreActing\x12!\n" + + "\fscore_stable\x18\x02 \x01(\x01R\vscoreStable\x12#\n" + + "\roptimal_score\x18\x03 \x01(\x01R\foptimalScore\x12(\n" + + "\x10raw_score_acting\x18\x04 \x01(\x01R\x0erawScoreActing\x12(\n" + + "\x10raw_score_stable\x18\x05 \x01(\x01R\x0erawScoreStable\x12:\n" + + "\x19primary_affinity_weighted\x18\x06 \x01(\x01R\x17primaryAffinityWeighted\x128\n" + + "\x18average_primary_affinity\x18\a \x01(\x01R\x16averagePrimaryAffinity\x12I\n" + + "!average_primary_affinity_weighted\x18\b \x01(\x01R\x1eaveragePrimaryAffinityWeighted\"\xa6\x06\n" + + "\x0eOsdDumpOsdInfo\x12\x10\n" + + "\x03osd\x18\x01 \x01(\x05R\x03osd\x12\x12\n" + + "\x04uuid\x18\x02 \x01(\tR\x04uuid\x12\x0e\n" + + "\x02up\x18\x03 \x01(\x05R\x02up\x12\x0e\n" + + "\x02in\x18\x04 \x01(\x05R\x02in\x12\x16\n" + + "\x06weight\x18\x05 \x01(\x01R\x06weight\x12)\n" + + "\x10primary_affinity\x18\x06 \x01(\x01R\x0fprimaryAffinity\x12(\n" + + "\x10last_clean_begin\x18\a \x01(\x05R\x0elastCleanBegin\x12$\n" + + "\x0elast_clean_end\x18\b \x01(\x05R\flastCleanEnd\x12\x17\n" + + "\aup_from\x18\t \x01(\x05R\x06upFrom\x12\x17\n" + + "\aup_thru\x18\n" + + " \x01(\x05R\x06upThru\x12\x17\n" + + "\adown_at\x18\v \x01(\x05R\x06downAt\x12\x17\n" + + "\alost_at\x18\f \x01(\x05R\x06lostAt\x12;\n" + + "\fpublic_addrs\x18\r \x01(\v2\x18.ceph.OsdDumpPublicAddrsR\vpublicAddrs\x12>\n" + + "\rcluster_addrs\x18\x0e \x01(\v2\x19.ceph.OsdDumpClusterAddrsR\fclusterAddrs\x12M\n" + + "\x14heartbeat_back_addrs\x18\x0f \x01(\v2\x1b.ceph.OsdDumpHeartbeatAddrsR\x12heartbeatBackAddrs\x12O\n" + + "\x15heartbeat_front_addrs\x18\x10 \x01(\v2\x1b.ceph.OsdDumpHeartbeatAddrsR\x13heartbeatFrontAddrs\x12\x1f\n" + + "\vpublic_addr\x18\x11 \x01(\tR\n" + + "publicAddr\x12!\n" + + "\fcluster_addr\x18\x12 \x01(\tR\vclusterAddr\x12.\n" + + "\x13heartbeat_back_addr\x18\x13 \x01(\tR\x11heartbeatBackAddr\x120\n" + + "\x14heartbeat_front_addr\x18\x14 \x01(\tR\x12heartbeatFrontAddr\x12\x14\n" + + "\x05state\x18\x15 \x03(\tR\x05state\"D\n" + + "\x12OsdDumpPublicAddrs\x12.\n" + + "\aaddrvec\x18\x01 \x03(\v2\x14.ceph.OsdDumpAddrVecR\aaddrvec\"E\n" + + "\x13OsdDumpClusterAddrs\x12.\n" + + "\aaddrvec\x18\x01 \x03(\v2\x14.ceph.OsdDumpAddrVecR\aaddrvec\"G\n" + + "\x15OsdDumpHeartbeatAddrs\x12.\n" + + "\aaddrvec\x18\x01 \x03(\v2\x14.ceph.OsdDumpAddrVecR\aaddrvec\"N\n" + + "\x0eOsdDumpAddrVec\x12\x12\n" + + "\x04type\x18\x01 \x01(\tR\x04type\x12\x12\n" + + "\x04addr\x18\x02 \x01(\tR\x04addr\x12\x14\n" + + "\x05nonce\x18\x03 \x01(\x04R\x05nonce\"\xdf\x02\n" + + "\x0fOsdDumpOsdXInfo\x12\x10\n" + + "\x03osd\x18\x01 \x01(\x05R\x03osd\x129\n" + + "\n" + + "down_stamp\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\tdownStamp\x12+\n" + + "\x11laggy_probability\x18\x03 \x01(\x01R\x10laggyProbability\x12%\n" + + "\x0elaggy_interval\x18\x04 \x01(\x01R\rlaggyInterval\x12\x1a\n" + + "\bfeatures\x18\x05 \x01(\x04R\bfeatures\x12\x1d\n" + + "\n" + + "old_weight\x18\x06 \x01(\x01R\toldWeight\x12Q\n" + + "\x17last_purged_snaps_scrub\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\x14lastPurgedSnapsScrub\x12\x1d\n" + + "\n" + + "dead_epoch\x18\b \x01(\x05R\tdeadEpoch\"m\n" + + "\x19OsdDumpErasureCodeProfile\x12\f\n" + + "\x01k\x18\x01 \x01(\tR\x01k\x12\f\n" + + "\x01m\x18\x02 \x01(\tR\x01m\x12\x16\n" + + "\x06plugin\x18\x03 \x01(\tR\x06plugin\x12\x1c\n" + + "\ttechnique\x18\x04 \x01(\tR\ttechnique\"\x94\x02\n" + + "\x12OsdDumpStretchMode\x120\n" + + "\x14stretch_mode_enabled\x18\x01 \x01(\bR\x12stretchModeEnabled\x120\n" + + "\x14stretch_bucket_count\x18\x02 \x01(\x05R\x12stretchBucketCount\x122\n" + + "\x15degraded_stretch_mode\x18\x03 \x01(\x05R\x13degradedStretchMode\x126\n" + + "\x17recovering_stretch_mode\x18\x04 \x01(\x05R\x15recoveringStretchMode\x12.\n" + + "\x13stretch_mode_bucket\x18\x05 \x01(\x05R\x11stretchModeBucket\"V\n" + + "\x15GetCephPgDumpResponse\x12\x19\n" + + "\bpg_ready\x18\x01 \x01(\bR\apgReady\x12\"\n" + + "\x06pg_map\x18\x02 \x01(\v2\v.ceph.PGMapR\x05pgMap\"\xff\x03\n" + + "\x05PGMap\x12\x18\n" + + "\aversion\x18\x01 \x01(\x03R\aversion\x120\n" + + "\x05stamp\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\x05stamp\x12*\n" + + "\x11last_osdmap_epoch\x18\x03 \x01(\x03R\x0flastOsdmapEpoch\x12 \n" + + "\flast_pg_scan\x18\x04 \x01(\x03R\n" + + "lastPgScan\x122\n" + + "\fpg_stats_sum\x18\x05 \x01(\v2\x10.ceph.PGStatsSumR\n" + + "pgStatsSum\x125\n" + + "\rosd_stats_sum\x18\x06 \x01(\v2\x11.ceph.OSDStatsSumR\vosdStatsSum\x128\n" + + "\x0epg_stats_delta\x18\a \x01(\v2\x12.ceph.PGStatsDeltaR\fpgStatsDelta\x12'\n" + + "\bpg_stats\x18\b \x03(\v2\f.ceph.PGStatR\apgStats\x12.\n" + + "\n" + + "pool_stats\x18\t \x03(\v2\x0f.ceph.PoolStatsR\tpoolStats\x12+\n" + + "\tosd_stats\x18\n" + + " \x03(\v2\x0e.ceph.OsdStatsR\bosdStats\x121\n" + + "\vpool_statfs\x18\v \x03(\v2\x10.ceph.PoolStatFsR\n" + + "poolStatfs\"\xbf\x13\n" + + "\n" + + "PGStatsSum\x12>\n" + + "\bstat_sum\x18\x01 \x01(\v2#.ceph.PGStatsSum.PGStatsSum_StatSumR\astatSum\x12G\n" + + "\vstore_stats\x18\x02 \x01(\v2&.ceph.PGStatsSum.PGStatsSum_StoreStatsR\n" + + "storeStats\x12\x19\n" + + "\blog_size\x18\x03 \x01(\x03R\alogSize\x12&\n" + + "\x0fondisk_log_size\x18\x04 \x01(\x03R\rondiskLogSize\x12\x0e\n" + + "\x02up\x18\x05 \x01(\x03R\x02up\x12\x16\n" + + "\x06acting\x18\x06 \x01(\x03R\x06acting\x12&\n" + + "\x0fnum_store_stats\x18\a \x01(\x03R\rnumStoreStats\x1a\xe3\r\n" + + "\x12PGStatsSum_StatSum\x12\x1b\n" + + "\tnum_bytes\x18\x01 \x01(\x03R\bnumBytes\x12\x1f\n" + + "\vnum_objects\x18\x02 \x01(\x03R\n" + + "numObjects\x12*\n" + + "\x11num_object_clones\x18\x03 \x01(\x03R\x0fnumObjectClones\x12*\n" + + "\x11num_object_copies\x18\x04 \x01(\x03R\x0fnumObjectCopies\x12B\n" + + "\x1enum_objects_missing_on_primary\x18\x05 \x01(\x03R\x1anumObjectsMissingOnPrimary\x12.\n" + + "\x13num_objects_missing\x18\x06 \x01(\x03R\x11numObjectsMissing\x120\n" + + "\x14num_objects_degraded\x18\a \x01(\x03R\x12numObjectsDegraded\x122\n" + + "\x15num_objects_misplaced\x18\b \x01(\x03R\x13numObjectsMisplaced\x12.\n" + + "\x13num_objects_unfound\x18\t \x01(\x03R\x11numObjectsUnfound\x12*\n" + + "\x11num_objects_dirty\x18\n" + + " \x01(\x03R\x0fnumObjectsDirty\x12#\n" + + "\rnum_whiteouts\x18\v \x01(\x03R\fnumWhiteouts\x12\x19\n" + + "\bnum_read\x18\f \x01(\x03R\anumRead\x12\x1e\n" + + "\vnum_read_kb\x18\r \x01(\x03R\tnumReadKb\x12\x1b\n" + + "\tnum_write\x18\x0e \x01(\x03R\bnumWrite\x12 \n" + + "\fnum_write_kb\x18\x0f \x01(\x03R\n" + + "numWriteKb\x12(\n" + + "\x10num_scrub_errors\x18\x10 \x01(\x03R\x0enumScrubErrors\x127\n" + + "\x18num_shallow_scrub_errors\x18\x11 \x01(\x03R\x15numShallowScrubErrors\x121\n" + + "\x15num_deep_scrub_errors\x18\x12 \x01(\x03R\x12numDeepScrubErrors\x122\n" + + "\x15num_objects_recovered\x18\x13 \x01(\x03R\x13numObjectsRecovered\x12.\n" + + "\x13num_bytes_recovered\x18\x14 \x01(\x03R\x11numBytesRecovered\x12,\n" + + "\x12num_keys_recovered\x18\x15 \x01(\x03R\x10numKeysRecovered\x12(\n" + + "\x10num_objects_omap\x18\x16 \x01(\x03R\x0enumObjectsOmap\x12<\n" + + "\x1bnum_objects_hit_set_archive\x18\x17 \x01(\x03R\x17numObjectsHitSetArchive\x128\n" + + "\x19num_bytes_hit_set_archive\x18\x18 \x01(\x03R\x15numBytesHitSetArchive\x12\x1b\n" + + "\tnum_flush\x18\x19 \x01(\x03R\bnumFlush\x12 \n" + + "\fnum_flush_kb\x18\x1a \x01(\x03R\n" + + "numFlushKb\x12\x1b\n" + + "\tnum_evict\x18\x1b \x01(\x03R\bnumEvict\x12 \n" + + "\fnum_evict_kb\x18\x1c \x01(\x03R\n" + + "numEvictKb\x12\x1f\n" + + "\vnum_promote\x18\x1d \x01(\x03R\n" + + "numPromote\x12-\n" + + "\x13num_flush_mode_high\x18\x1e \x01(\x03R\x10numFlushModeHigh\x12+\n" + + "\x12num_flush_mode_low\x18\x1f \x01(\x03R\x0fnumFlushModeLow\x12-\n" + + "\x13num_evict_mode_some\x18 \x01(\x03R\x10numEvictModeSome\x12-\n" + + "\x13num_evict_mode_full\x18! \x01(\x03R\x10numEvictModeFull\x12,\n" + + "\x12num_objects_pinned\x18\" \x01(\x03R\x10numObjectsPinned\x12.\n" + + "\x13num_legacy_snapsets\x18# \x01(\x03R\x11numLegacySnapsets\x123\n" + + "\x16num_large_omap_objects\x18$ \x01(\x03R\x13numLargeOmapObjects\x120\n" + + "\x14num_objects_manifest\x18% \x01(\x03R\x12numObjectsManifest\x12$\n" + + "\x0enum_omap_bytes\x18& \x01(\x03R\fnumOmapBytes\x12\"\n" + + "\rnum_omap_keys\x18' \x01(\x03R\vnumOmapKeys\x120\n" + + "\x14num_objects_repaired\x18( \x01(\x03R\x12numObjectsRepaired\x1a\xae\x03\n" + + "\x15PGStatsSum_StoreStats\x12\x14\n" + + "\x05total\x18\x01 \x01(\x03R\x05total\x12\x1c\n" + + "\tavailable\x18\x02 \x01(\x03R\tavailable\x12/\n" + + "\x13internally_reserved\x18\x03 \x01(\x03R\x12internallyReserved\x12\x1c\n" + + "\tallocated\x18\x04 \x01(\x03R\tallocated\x12\x1f\n" + + "\vdata_stored\x18\x05 \x01(\x03R\n" + + "dataStored\x12'\n" + + "\x0fdata_compressed\x18\x06 \x01(\x03R\x0edataCompressed\x12:\n" + + "\x19data_compressed_allocated\x18\a \x01(\x03R\x17dataCompressedAllocated\x128\n" + + "\x18data_compressed_original\x18\b \x01(\x03R\x16dataCompressedOriginal\x12%\n" + + "\x0eomap_allocated\x18\t \x01(\x03R\romapAllocated\x12+\n" + + "\x11internal_metadata\x18\n" + + " \x01(\x03R\x10internalMetadata\"\x89\x11\n" + + "\vOSDStatsSum\x12\x17\n" + + "\aup_from\x18\x01 \x01(\x03R\x06upFrom\x12\x10\n" + + "\x03seq\x18\x02 \x01(\x03R\x03seq\x12\x17\n" + + "\anum_pgs\x18\x03 \x01(\x03R\x06numPgs\x12\x19\n" + + "\bnum_osds\x18\x04 \x01(\x03R\anumOsds\x12)\n" + + "\x11num_per_pool_osds\x18\x05 \x01(\x03R\x0enumPerPoolOsds\x122\n" + + "\x16num_per_pool_omap_osds\x18\x06 \x01(\x03R\x12numPerPoolOmapOsds\x12\x0e\n" + + "\x02kb\x18\a \x01(\x03R\x02kb\x12\x17\n" + + "\akb_used\x18\b \x01(\x03R\x06kbUsed\x12 \n" + + "\fkb_used_data\x18\t \x01(\x03R\n" + + "kbUsedData\x12 \n" + + "\fkb_used_omap\x18\n" + + " \x01(\x03R\n" + + "kbUsedOmap\x12 \n" + + "\fkb_used_meta\x18\v \x01(\x03R\n" + + "kbUsedMeta\x12\x19\n" + + "\bkb_avail\x18\f \x01(\x03R\akbAvail\x120\n" + + "\x06statfs\x18\r \x01(\v2\x18.ceph.OSDStatsSum.StatFsR\x06statfs\x12\x19\n" + + "\bhb_peers\x18\x0e \x03(\x03R\ahbPeers\x12-\n" + + "\x13snap_trim_queue_len\x18\x0f \x01(\x03R\x10snapTrimQueueLen\x12*\n" + + "\x11num_snap_trimming\x18\x10 \x01(\x03R\x0fnumSnapTrimming\x12.\n" + + "\x13num_shards_repaired\x18\x11 \x01(\x03R\x11numShardsRepaired\x12K\n" + + "\x11op_queue_age_hist\x18\x12 \x01(\v2 .ceph.OSDStatsSum.OpQueueAgeHistR\x0eopQueueAgeHist\x127\n" + + "\tperf_stat\x18\x13 \x01(\v2\x1a.ceph.OSDStatsSum.PerfStatR\bperfStat\x12\x16\n" + + "\x06alerts\x18\x14 \x03(\tR\x06alerts\x12O\n" + + "\x12network_ping_times\x18\x15 \x03(\v2!.ceph.OSDStatsSum.NetworkPingTimeR\x10networkPingTimes\x1a\x9f\x03\n" + + "\x06StatFs\x12\x14\n" + + "\x05total\x18\x01 \x01(\x03R\x05total\x12\x1c\n" + + "\tavailable\x18\x02 \x01(\x03R\tavailable\x12/\n" + + "\x13internally_reserved\x18\x03 \x01(\x03R\x12internallyReserved\x12\x1c\n" + + "\tallocated\x18\x04 \x01(\x03R\tallocated\x12\x1f\n" + + "\vdata_stored\x18\x05 \x01(\x03R\n" + + "dataStored\x12'\n" + + "\x0fdata_compressed\x18\x06 \x01(\x03R\x0edataCompressed\x12:\n" + + "\x19data_compressed_allocated\x18\a \x01(\x03R\x17dataCompressedAllocated\x128\n" + + "\x18data_compressed_original\x18\b \x01(\x03R\x16dataCompressedOriginal\x12%\n" + + "\x0eomap_allocated\x18\t \x01(\x03R\romapAllocated\x12+\n" + + "\x11internal_metadata\x18\n" + + " \x01(\x03R\x10internalMetadata\x1aO\n" + + "\x0eOpQueueAgeHist\x12\x1c\n" + + "\thistogram\x18\x01 \x03(\x03R\thistogram\x12\x1f\n" + + "\vupper_bound\x18\x02 \x01(\x03R\n" + + "upperBound\x1a\xb6\x01\n" + + "\bPerfStat\x12*\n" + + "\x11commit_latency_ms\x18\x01 \x01(\x03R\x0fcommitLatencyMs\x12(\n" + + "\x10apply_latency_ms\x18\x02 \x01(\x03R\x0eapplyLatencyMs\x12*\n" + + "\x11commit_latency_ns\x18\x03 \x01(\x03R\x0fcommitLatencyNs\x12(\n" + + "\x10apply_latency_ns\x18\x04 \x01(\x03R\x0eapplyLatencyNs\x1a\x9e\x05\n" + + "\x0fNetworkPingTime\x12\x10\n" + + "\x03osd\x18\x01 \x01(\x03R\x03osd\x12;\n" + + "\vlast_update\x18\x02 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "lastUpdate\x12K\n" + + "\n" + + "interfaces\x18\x03 \x03(\v2+.ceph.OSDStatsSum.NetworkPingTime.InterfaceR\n" + + "interfaces\x1a\xee\x03\n" + + "\tInterface\x12%\n" + + "\x0einterface_name\x18\x01 \x01(\tR\rinterfaceName\x12M\n" + + "\aaverage\x18\x02 \x01(\v23.ceph.OSDStatsSum.NetworkPingTime.Interface.AverageR\aaverage\x12A\n" + + "\x03min\x18\x03 \x01(\v2/.ceph.OSDStatsSum.NetworkPingTime.Interface.MinR\x03min\x12A\n" + + "\x03max\x18\x04 \x01(\v2/.ceph.OSDStatsSum.NetworkPingTime.Interface.MaxR\x03max\x12\x12\n" + + "\x04last\x18\x05 \x01(\x01R\x04last\x1aG\n" + + "\aAverage\x12\x12\n" + + "\x04min1\x18\x01 \x01(\x01R\x04min1\x12\x12\n" + + "\x04min5\x18\x02 \x01(\x01R\x04min5\x12\x14\n" + + "\x05min15\x18\x03 \x01(\x01R\x05min15\x1aC\n" + + "\x03Min\x12\x12\n" + + "\x04min1\x18\x01 \x01(\x01R\x04min1\x12\x12\n" + + "\x04min5\x18\x02 \x01(\x01R\x04min5\x12\x14\n" + + "\x05min15\x18\x03 \x01(\x01R\x05min15\x1aC\n" + + "\x03Max\x12\x12\n" + + "\x04min1\x18\x01 \x01(\x01R\x04min1\x12\x12\n" + + "\x04min5\x18\x02 \x01(\x01R\x04min5\x12\x14\n" + + "\x05min15\x18\x03 \x01(\x01R\x05min15\"\xee\x13\n" + + "\fPGStatsDelta\x12B\n" + + "\bstat_sum\x18\x01 \x01(\v2'.ceph.PGStatsDelta.PGStatsDelta_StatSumR\astatSum\x12K\n" + + "\vstore_stats\x18\x02 \x01(\v2*.ceph.PGStatsDelta.PGStatsDelta_StoreStatsR\n" + + "storeStats\x12\x19\n" + + "\blog_size\x18\x03 \x01(\x03R\alogSize\x12&\n" + + "\x0fondisk_log_size\x18\x04 \x01(\x03R\rondiskLogSize\x12\x0e\n" + + "\x02up\x18\x05 \x01(\x03R\x02up\x12\x16\n" + + "\x06acting\x18\x06 \x01(\x03R\x06acting\x12&\n" + + "\x0fnum_store_stats\x18\a \x01(\x03R\rnumStoreStats\x12\x1f\n" + + "\vstamp_delta\x18\b \x01(\tR\n" + + "stampDelta\x1a\xe5\r\n" + + "\x14PGStatsDelta_StatSum\x12\x1b\n" + + "\tnum_bytes\x18\x01 \x01(\x03R\bnumBytes\x12\x1f\n" + + "\vnum_objects\x18\x02 \x01(\x03R\n" + + "numObjects\x12*\n" + + "\x11num_object_clones\x18\x03 \x01(\x03R\x0fnumObjectClones\x12*\n" + + "\x11num_object_copies\x18\x04 \x01(\x03R\x0fnumObjectCopies\x12B\n" + + "\x1enum_objects_missing_on_primary\x18\x05 \x01(\x03R\x1anumObjectsMissingOnPrimary\x12.\n" + + "\x13num_objects_missing\x18\x06 \x01(\x03R\x11numObjectsMissing\x120\n" + + "\x14num_objects_degraded\x18\a \x01(\x03R\x12numObjectsDegraded\x122\n" + + "\x15num_objects_misplaced\x18\b \x01(\x03R\x13numObjectsMisplaced\x12.\n" + + "\x13num_objects_unfound\x18\t \x01(\x03R\x11numObjectsUnfound\x12*\n" + + "\x11num_objects_dirty\x18\n" + + " \x01(\x03R\x0fnumObjectsDirty\x12#\n" + + "\rnum_whiteouts\x18\v \x01(\x03R\fnumWhiteouts\x12\x19\n" + + "\bnum_read\x18\f \x01(\x03R\anumRead\x12\x1e\n" + + "\vnum_read_kb\x18\r \x01(\x03R\tnumReadKb\x12\x1b\n" + + "\tnum_write\x18\x0e \x01(\x03R\bnumWrite\x12 \n" + + "\fnum_write_kb\x18\x0f \x01(\x03R\n" + + "numWriteKb\x12(\n" + + "\x10num_scrub_errors\x18\x10 \x01(\x03R\x0enumScrubErrors\x127\n" + + "\x18num_shallow_scrub_errors\x18\x11 \x01(\x03R\x15numShallowScrubErrors\x121\n" + + "\x15num_deep_scrub_errors\x18\x12 \x01(\x03R\x12numDeepScrubErrors\x122\n" + + "\x15num_objects_recovered\x18\x13 \x01(\x03R\x13numObjectsRecovered\x12.\n" + + "\x13num_bytes_recovered\x18\x14 \x01(\x03R\x11numBytesRecovered\x12,\n" + + "\x12num_keys_recovered\x18\x15 \x01(\x03R\x10numKeysRecovered\x12(\n" + + "\x10num_objects_omap\x18\x16 \x01(\x03R\x0enumObjectsOmap\x12<\n" + + "\x1bnum_objects_hit_set_archive\x18\x17 \x01(\x03R\x17numObjectsHitSetArchive\x128\n" + + "\x19num_bytes_hit_set_archive\x18\x18 \x01(\x03R\x15numBytesHitSetArchive\x12\x1b\n" + + "\tnum_flush\x18\x19 \x01(\x03R\bnumFlush\x12 \n" + + "\fnum_flush_kb\x18\x1a \x01(\x03R\n" + + "numFlushKb\x12\x1b\n" + + "\tnum_evict\x18\x1b \x01(\x03R\bnumEvict\x12 \n" + + "\fnum_evict_kb\x18\x1c \x01(\x03R\n" + + "numEvictKb\x12\x1f\n" + + "\vnum_promote\x18\x1d \x01(\x03R\n" + + "numPromote\x12-\n" + + "\x13num_flush_mode_high\x18\x1e \x01(\x03R\x10numFlushModeHigh\x12+\n" + + "\x12num_flush_mode_low\x18\x1f \x01(\x03R\x0fnumFlushModeLow\x12-\n" + + "\x13num_evict_mode_some\x18 \x01(\x03R\x10numEvictModeSome\x12-\n" + + "\x13num_evict_mode_full\x18! \x01(\x03R\x10numEvictModeFull\x12,\n" + + "\x12num_objects_pinned\x18\" \x01(\x03R\x10numObjectsPinned\x12.\n" + + "\x13num_legacy_snapsets\x18# \x01(\x03R\x11numLegacySnapsets\x123\n" + + "\x16num_large_omap_objects\x18$ \x01(\x03R\x13numLargeOmapObjects\x120\n" + + "\x14num_objects_manifest\x18% \x01(\x03R\x12numObjectsManifest\x12$\n" + + "\x0enum_omap_bytes\x18& \x01(\x03R\fnumOmapBytes\x12\"\n" + + "\rnum_omap_keys\x18' \x01(\x03R\vnumOmapKeys\x120\n" + + "\x14num_objects_repaired\x18( \x01(\x03R\x12numObjectsRepaired\x1a\xb0\x03\n" + + "\x17PGStatsDelta_StoreStats\x12\x14\n" + + "\x05total\x18\x01 \x01(\x03R\x05total\x12\x1c\n" + + "\tavailable\x18\x02 \x01(\x03R\tavailable\x12/\n" + + "\x13internally_reserved\x18\x03 \x01(\x03R\x12internallyReserved\x12\x1c\n" + + "\tallocated\x18\x04 \x01(\x03R\tallocated\x12\x1f\n" + + "\vdata_stored\x18\x05 \x01(\x03R\n" + + "dataStored\x12'\n" + + "\x0fdata_compressed\x18\x06 \x01(\x03R\x0edataCompressed\x12:\n" + + "\x19data_compressed_allocated\x18\a \x01(\x03R\x17dataCompressedAllocated\x128\n" + + "\x18data_compressed_original\x18\b \x01(\x03R\x16dataCompressedOriginal\x12%\n" + + "\x0eomap_allocated\x18\t \x01(\x03R\romapAllocated\x12+\n" + + "\x11internal_metadata\x18\n" + + " \x01(\x03R\x10internalMetadata\"\xc8 \n" + + "\x06PGStat\x12\x12\n" + + "\x04pgid\x18\x01 \x01(\tR\x04pgid\x12\x18\n" + + "\aversion\x18\x02 \x01(\tR\aversion\x12!\n" + + "\freported_seq\x18\x03 \x01(\x03R\vreportedSeq\x12%\n" + + "\x0ereported_epoch\x18\x04 \x01(\x03R\rreportedEpoch\x12\x14\n" + + "\x05state\x18\x05 \x01(\tR\x05state\x129\n" + + "\n" + + "last_fresh\x18\x06 \x01(\v2\x1a.google.protobuf.TimestampR\tlastFresh\x12;\n" + + "\vlast_change\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "lastChange\x12;\n" + + "\vlast_active\x18\b \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "lastActive\x12;\n" + + "\vlast_peered\x18\t \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "lastPeered\x129\n" + + "\n" + + "last_clean\x18\n" + + " \x01(\v2\x1a.google.protobuf.TimestampR\tlastClean\x12H\n" + + "\x12last_became_active\x18\v \x01(\v2\x1a.google.protobuf.TimestampR\x10lastBecameActive\x12H\n" + + "\x12last_became_peered\x18\f \x01(\v2\x1a.google.protobuf.TimestampR\x10lastBecamePeered\x12=\n" + + "\flast_unstale\x18\r \x01(\v2\x1a.google.protobuf.TimestampR\vlastUnstale\x12C\n" + + "\x0flast_undegraded\x18\x0e \x01(\v2\x1a.google.protobuf.TimestampR\x0elastUndegraded\x12A\n" + + "\x0elast_fullsized\x18\x0f \x01(\v2\x1a.google.protobuf.TimestampR\rlastFullsized\x12#\n" + + "\rmapping_epoch\x18\x10 \x01(\x03R\fmappingEpoch\x12\x1b\n" + + "\tlog_start\x18\x11 \x01(\tR\blogStart\x12(\n" + + "\x10ondisk_log_start\x18\x12 \x01(\tR\x0eondiskLogStart\x12\x18\n" + + "\acreated\x18\x13 \x01(\x03R\acreated\x12(\n" + + "\x10last_epoch_clean\x18\x14 \x01(\x03R\x0elastEpochClean\x12\x16\n" + + "\x06parent\x18\x15 \x01(\tR\x06parent\x12*\n" + + "\x11parent_split_bits\x18\x16 \x01(\x03R\x0fparentSplitBits\x12\x1d\n" + + "\n" + + "last_scrub\x18\x17 \x01(\tR\tlastScrub\x12D\n" + + "\x10last_scrub_stamp\x18\x18 \x01(\v2\x1a.google.protobuf.TimestampR\x0elastScrubStamp\x12&\n" + + "\x0flast_deep_scrub\x18\x19 \x01(\tR\rlastDeepScrub\x12M\n" + + "\x15last_deep_scrub_stamp\x18\x1a \x01(\v2\x1a.google.protobuf.TimestampR\x12lastDeepScrubStamp\x12O\n" + + "\x16last_clean_scrub_stamp\x18\x1b \x01(\v2\x1a.google.protobuf.TimestampR\x13lastCleanScrubStamp\x12)\n" + + "\x10objects_scrubbed\x18\x1c \x01(\x03R\x0fobjectsScrubbed\x12\x19\n" + + "\blog_size\x18\x1d \x01(\x03R\alogSize\x12\"\n" + + "\rlog_dups_size\x18\x1e \x01(\x03R\vlogDupsSize\x12&\n" + + "\x0fondisk_log_size\x18\x1f \x01(\x03R\rondiskLogSize\x12#\n" + + "\rstats_invalid\x18 \x01(\bR\fstatsInvalid\x12.\n" + + "\x13dirty_stats_invalid\x18! \x01(\bR\x11dirtyStatsInvalid\x12,\n" + + "\x12omap_stats_invalid\x18\" \x01(\bR\x10omapStatsInvalid\x120\n" + + "\x14hitset_stats_invalid\x18# \x01(\bR\x12hitsetStatsInvalid\x12;\n" + + "\x1ahitset_bytes_stats_invalid\x18$ \x01(\bR\x17hitsetBytesStatsInvalid\x12*\n" + + "\x11pin_stats_invalid\x18% \x01(\bR\x0fpinStatsInvalid\x124\n" + + "\x16manifest_stats_invalid\x18& \x01(\bR\x14manifestStatsInvalid\x12#\n" + + "\rsnaptrimq_len\x18' \x01(\x03R\fsnaptrimqLen\x12.\n" + + "\x13last_scrub_duration\x18( \x01(\x03R\x11lastScrubDuration\x12%\n" + + "\x0escrub_schedule\x18) \x01(\tR\rscrubSchedule\x12%\n" + + "\x0escrub_duration\x18* \x01(\x01R\rscrubDuration\x12'\n" + + "\x0fobjects_trimmed\x18+ \x01(\x03R\x0eobjectsTrimmed\x12+\n" + + "\x11snaptrim_duration\x18, \x01(\x01R\x10snaptrimDuration\x126\n" + + "\bstat_sum\x18- \x01(\v2\x1b.ceph.PGStat.PGStat_StatSumR\astatSum\x12\x0e\n" + + "\x02up\x18. \x03(\x03R\x02up\x12\x16\n" + + "\x06acting\x18/ \x03(\x03R\x06acting\x12(\n" + + "\x10avail_no_missing\x180 \x03(\x03R\x0eavailNoMissing\x124\n" + + "\x16object_location_counts\x181 \x03(\x03R\x14objectLocationCounts\x12\x1d\n" + + "\n" + + "blocked_by\x182 \x03(\x03R\tblockedBy\x12\x1d\n" + + "\n" + + "up_primary\x183 \x01(\x03R\tupPrimary\x12%\n" + + "\x0eacting_primary\x184 \x01(\x03R\ractingPrimary\x12!\n" + + "\fpurged_snaps\x185 \x03(\x03R\vpurgedSnaps\x1a\xdf\r\n" + + "\x0ePGStat_StatSum\x12\x1b\n" + + "\tnum_bytes\x18\x01 \x01(\x03R\bnumBytes\x12\x1f\n" + + "\vnum_objects\x18\x02 \x01(\x03R\n" + + "numObjects\x12*\n" + + "\x11num_object_clones\x18\x03 \x01(\x03R\x0fnumObjectClones\x12*\n" + + "\x11num_object_copies\x18\x04 \x01(\x03R\x0fnumObjectCopies\x12B\n" + + "\x1enum_objects_missing_on_primary\x18\x05 \x01(\x03R\x1anumObjectsMissingOnPrimary\x12.\n" + + "\x13num_objects_missing\x18\x06 \x01(\x03R\x11numObjectsMissing\x120\n" + + "\x14num_objects_degraded\x18\a \x01(\x03R\x12numObjectsDegraded\x122\n" + + "\x15num_objects_misplaced\x18\b \x01(\x03R\x13numObjectsMisplaced\x12.\n" + + "\x13num_objects_unfound\x18\t \x01(\x03R\x11numObjectsUnfound\x12*\n" + + "\x11num_objects_dirty\x18\n" + + " \x01(\x03R\x0fnumObjectsDirty\x12#\n" + + "\rnum_whiteouts\x18\v \x01(\x03R\fnumWhiteouts\x12\x19\n" + + "\bnum_read\x18\f \x01(\x03R\anumRead\x12\x1e\n" + + "\vnum_read_kb\x18\r \x01(\x03R\tnumReadKb\x12\x1b\n" + + "\tnum_write\x18\x0e \x01(\x03R\bnumWrite\x12 \n" + + "\fnum_write_kb\x18\x0f \x01(\x03R\n" + + "numWriteKb\x12(\n" + + "\x10num_scrub_errors\x18\x10 \x01(\x03R\x0enumScrubErrors\x127\n" + + "\x18num_shallow_scrub_errors\x18\x11 \x01(\x03R\x15numShallowScrubErrors\x121\n" + + "\x15num_deep_scrub_errors\x18\x12 \x01(\x03R\x12numDeepScrubErrors\x122\n" + + "\x15num_objects_recovered\x18\x13 \x01(\x03R\x13numObjectsRecovered\x12.\n" + + "\x13num_bytes_recovered\x18\x14 \x01(\x03R\x11numBytesRecovered\x12,\n" + + "\x12num_keys_recovered\x18\x15 \x01(\x03R\x10numKeysRecovered\x12(\n" + + "\x10num_objects_omap\x18\x16 \x01(\x03R\x0enumObjectsOmap\x12<\n" + + "\x1bnum_objects_hit_set_archive\x18\x17 \x01(\x03R\x17numObjectsHitSetArchive\x128\n" + + "\x19num_bytes_hit_set_archive\x18\x18 \x01(\x03R\x15numBytesHitSetArchive\x12\x1b\n" + + "\tnum_flush\x18\x19 \x01(\x03R\bnumFlush\x12 \n" + + "\fnum_flush_kb\x18\x1a \x01(\x03R\n" + + "numFlushKb\x12\x1b\n" + + "\tnum_evict\x18\x1b \x01(\x03R\bnumEvict\x12 \n" + + "\fnum_evict_kb\x18\x1c \x01(\x03R\n" + + "numEvictKb\x12\x1f\n" + + "\vnum_promote\x18\x1d \x01(\x03R\n" + + "numPromote\x12-\n" + + "\x13num_flush_mode_high\x18\x1e \x01(\x03R\x10numFlushModeHigh\x12+\n" + + "\x12num_flush_mode_low\x18\x1f \x01(\x03R\x0fnumFlushModeLow\x12-\n" + + "\x13num_evict_mode_some\x18 \x01(\x03R\x10numEvictModeSome\x12-\n" + + "\x13num_evict_mode_full\x18! \x01(\x03R\x10numEvictModeFull\x12,\n" + + "\x12num_objects_pinned\x18\" \x01(\x03R\x10numObjectsPinned\x12.\n" + + "\x13num_legacy_snapsets\x18# \x01(\x03R\x11numLegacySnapsets\x123\n" + + "\x16num_large_omap_objects\x18$ \x01(\x03R\x13numLargeOmapObjects\x120\n" + + "\x14num_objects_manifest\x18% \x01(\x03R\x12numObjectsManifest\x12$\n" + + "\x0enum_omap_bytes\x18& \x01(\x03R\fnumOmapBytes\x12\"\n" + + "\rnum_omap_keys\x18' \x01(\x03R\vnumOmapKeys\x120\n" + + "\x14num_objects_repaired\x18( \x01(\x03R\x12numObjectsRepaired\"\xe7\x13\n" + + "\tPoolStats\x12\x16\n" + + "\x06poolid\x18\x01 \x01(\x03R\x06poolid\x12\x15\n" + + "\x06num_pg\x18\x02 \x01(\x03R\x05numPg\x12<\n" + + "\bstat_sum\x18\x03 \x01(\v2!.ceph.PoolStats.PoolStats_StatSumR\astatSum\x12E\n" + + "\vstore_stats\x18\x04 \x01(\v2$.ceph.PoolStats.PoolStats_StoreStatsR\n" + + "storeStats\x12\x19\n" + + "\blog_size\x18\x05 \x01(\x03R\alogSize\x12&\n" + + "\x0fondisk_log_size\x18\x06 \x01(\x03R\rondiskLogSize\x12\x0e\n" + + "\x02up\x18\a \x01(\x03R\x02up\x12\x16\n" + + "\x06acting\x18\b \x01(\x03R\x06acting\x12&\n" + + "\x0fnum_store_stats\x18\t \x01(\x03R\rnumStoreStats\x1a\xe2\r\n" + + "\x11PoolStats_StatSum\x12\x1b\n" + + "\tnum_bytes\x18\x01 \x01(\x03R\bnumBytes\x12\x1f\n" + + "\vnum_objects\x18\x02 \x01(\x03R\n" + + "numObjects\x12*\n" + + "\x11num_object_clones\x18\x03 \x01(\x03R\x0fnumObjectClones\x12*\n" + + "\x11num_object_copies\x18\x04 \x01(\x03R\x0fnumObjectCopies\x12B\n" + + "\x1enum_objects_missing_on_primary\x18\x05 \x01(\x03R\x1anumObjectsMissingOnPrimary\x12.\n" + + "\x13num_objects_missing\x18\x06 \x01(\x03R\x11numObjectsMissing\x120\n" + + "\x14num_objects_degraded\x18\a \x01(\x03R\x12numObjectsDegraded\x122\n" + + "\x15num_objects_misplaced\x18\b \x01(\x03R\x13numObjectsMisplaced\x12.\n" + + "\x13num_objects_unfound\x18\t \x01(\x03R\x11numObjectsUnfound\x12*\n" + + "\x11num_objects_dirty\x18\n" + + " \x01(\x03R\x0fnumObjectsDirty\x12#\n" + + "\rnum_whiteouts\x18\v \x01(\x03R\fnumWhiteouts\x12\x19\n" + + "\bnum_read\x18\f \x01(\x03R\anumRead\x12\x1e\n" + + "\vnum_read_kb\x18\r \x01(\x03R\tnumReadKb\x12\x1b\n" + + "\tnum_write\x18\x0e \x01(\x03R\bnumWrite\x12 \n" + + "\fnum_write_kb\x18\x0f \x01(\x03R\n" + + "numWriteKb\x12(\n" + + "\x10num_scrub_errors\x18\x10 \x01(\x03R\x0enumScrubErrors\x127\n" + + "\x18num_shallow_scrub_errors\x18\x11 \x01(\x03R\x15numShallowScrubErrors\x121\n" + + "\x15num_deep_scrub_errors\x18\x12 \x01(\x03R\x12numDeepScrubErrors\x122\n" + + "\x15num_objects_recovered\x18\x13 \x01(\x03R\x13numObjectsRecovered\x12.\n" + + "\x13num_bytes_recovered\x18\x14 \x01(\x03R\x11numBytesRecovered\x12,\n" + + "\x12num_keys_recovered\x18\x15 \x01(\x03R\x10numKeysRecovered\x12(\n" + + "\x10num_objects_omap\x18\x16 \x01(\x03R\x0enumObjectsOmap\x12<\n" + + "\x1bnum_objects_hit_set_archive\x18\x17 \x01(\x03R\x17numObjectsHitSetArchive\x128\n" + + "\x19num_bytes_hit_set_archive\x18\x18 \x01(\x03R\x15numBytesHitSetArchive\x12\x1b\n" + + "\tnum_flush\x18\x19 \x01(\x03R\bnumFlush\x12 \n" + + "\fnum_flush_kb\x18\x1a \x01(\x03R\n" + + "numFlushKb\x12\x1b\n" + + "\tnum_evict\x18\x1b \x01(\x03R\bnumEvict\x12 \n" + + "\fnum_evict_kb\x18\x1c \x01(\x03R\n" + + "numEvictKb\x12\x1f\n" + + "\vnum_promote\x18\x1d \x01(\x03R\n" + + "numPromote\x12-\n" + + "\x13num_flush_mode_high\x18\x1e \x01(\x03R\x10numFlushModeHigh\x12+\n" + + "\x12num_flush_mode_low\x18\x1f \x01(\x03R\x0fnumFlushModeLow\x12-\n" + + "\x13num_evict_mode_some\x18 \x01(\x03R\x10numEvictModeSome\x12-\n" + + "\x13num_evict_mode_full\x18! \x01(\x03R\x10numEvictModeFull\x12,\n" + + "\x12num_objects_pinned\x18\" \x01(\x03R\x10numObjectsPinned\x12.\n" + + "\x13num_legacy_snapsets\x18# \x01(\x03R\x11numLegacySnapsets\x123\n" + + "\x16num_large_omap_objects\x18$ \x01(\x03R\x13numLargeOmapObjects\x120\n" + + "\x14num_objects_manifest\x18% \x01(\x03R\x12numObjectsManifest\x12$\n" + + "\x0enum_omap_bytes\x18& \x01(\x03R\fnumOmapBytes\x12\"\n" + + "\rnum_omap_keys\x18' \x01(\x03R\vnumOmapKeys\x120\n" + + "\x14num_objects_repaired\x18( \x01(\x03R\x12numObjectsRepaired\x1a\xad\x03\n" + + "\x14PoolStats_StoreStats\x12\x14\n" + + "\x05total\x18\x01 \x01(\x03R\x05total\x12\x1c\n" + + "\tavailable\x18\x02 \x01(\x03R\tavailable\x12/\n" + + "\x13internally_reserved\x18\x03 \x01(\x03R\x12internallyReserved\x12\x1c\n" + + "\tallocated\x18\x04 \x01(\x03R\tallocated\x12\x1f\n" + + "\vdata_stored\x18\x05 \x01(\x03R\n" + + "dataStored\x12'\n" + + "\x0fdata_compressed\x18\x06 \x01(\x03R\x0edataCompressed\x12:\n" + + "\x19data_compressed_allocated\x18\a \x01(\x03R\x17dataCompressedAllocated\x128\n" + + "\x18data_compressed_original\x18\b \x01(\x03R\x16dataCompressedOriginal\x12%\n" + + "\x0eomap_allocated\x18\t \x01(\x03R\romapAllocated\x12+\n" + + "\x11internal_metadata\x18\n" + + " \x01(\x03R\x10internalMetadata\"\xe4\x10\n" + + "\bOsdStats\x12\x10\n" + + "\x03osd\x18\x01 \x01(\x03R\x03osd\x12\x17\n" + + "\aup_from\x18\x02 \x01(\x03R\x06upFrom\x12\x10\n" + + "\x03seq\x18\x03 \x01(\x03R\x03seq\x12\x17\n" + + "\anum_pgs\x18\x04 \x01(\x03R\x06numPgs\x12\x19\n" + + "\bnum_osds\x18\x05 \x01(\x03R\anumOsds\x12)\n" + + "\x11num_per_pool_osds\x18\x06 \x01(\x03R\x0enumPerPoolOsds\x122\n" + + "\x16num_per_pool_omap_osds\x18\a \x01(\x03R\x12numPerPoolOmapOsds\x12\x0e\n" + + "\x02kb\x18\b \x01(\x03R\x02kb\x12\x17\n" + + "\akb_used\x18\t \x01(\x03R\x06kbUsed\x12 \n" + + "\fkb_used_data\x18\n" + + " \x01(\x03R\n" + + "kbUsedData\x12 \n" + + "\fkb_used_omap\x18\v \x01(\x03R\n" + + "kbUsedOmap\x12 \n" + + "\fkb_used_meta\x18\f \x01(\x03R\n" + + "kbUsedMeta\x12\x19\n" + + "\bkb_avail\x18\r \x01(\x03R\akbAvail\x12-\n" + + "\x06statfs\x18\x0e \x01(\v2\x15.ceph.OsdStats.StatFsR\x06statfs\x12\x19\n" + + "\bhb_peers\x18\x0f \x03(\x03R\ahbPeers\x12-\n" + + "\x13snap_trim_queue_len\x18\x10 \x01(\x03R\x10snapTrimQueueLen\x12*\n" + + "\x11num_snap_trimming\x18\x11 \x01(\x03R\x0fnumSnapTrimming\x12.\n" + + "\x13num_shards_repaired\x18\x12 \x01(\x03R\x11numShardsRepaired\x12H\n" + + "\x11op_queue_age_hist\x18\x13 \x01(\v2\x1d.ceph.OsdStats.OpQueueAgeHistR\x0eopQueueAgeHist\x124\n" + + "\tperf_stat\x18\x14 \x01(\v2\x17.ceph.OsdStats.PerfStatR\bperfStat\x12\x16\n" + + "\x06alerts\x18\x15 \x03(\tR\x06alerts\x12L\n" + + "\x12network_ping_times\x18\x16 \x03(\v2\x1e.ceph.OsdStats.NetworkPingTimeR\x10networkPingTimes\x1a\x9f\x03\n" + + "\x06StatFs\x12\x14\n" + + "\x05total\x18\x01 \x01(\x03R\x05total\x12\x1c\n" + + "\tavailable\x18\x02 \x01(\x03R\tavailable\x12/\n" + + "\x13internally_reserved\x18\x03 \x01(\x03R\x12internallyReserved\x12\x1c\n" + + "\tallocated\x18\x04 \x01(\x03R\tallocated\x12\x1f\n" + + "\vdata_stored\x18\x05 \x01(\x03R\n" + + "dataStored\x12'\n" + + "\x0fdata_compressed\x18\x06 \x01(\x03R\x0edataCompressed\x12:\n" + + "\x19data_compressed_allocated\x18\a \x01(\x03R\x17dataCompressedAllocated\x128\n" + + "\x18data_compressed_original\x18\b \x01(\x03R\x16dataCompressedOriginal\x12%\n" + + "\x0eomap_allocated\x18\t \x01(\x03R\romapAllocated\x12+\n" + + "\x11internal_metadata\x18\n" + + " \x01(\x03R\x10internalMetadata\x1aO\n" + + "\x0eOpQueueAgeHist\x12\x1c\n" + + "\thistogram\x18\x01 \x03(\x03R\thistogram\x12\x1f\n" + + "\vupper_bound\x18\x02 \x01(\x03R\n" + + "upperBound\x1a\xb6\x01\n" + + "\bPerfStat\x12*\n" + + "\x11commit_latency_ms\x18\x01 \x01(\x03R\x0fcommitLatencyMs\x12(\n" + + "\x10apply_latency_ms\x18\x02 \x01(\x03R\x0eapplyLatencyMs\x12*\n" + + "\x11commit_latency_ns\x18\x03 \x01(\x03R\x0fcommitLatencyNs\x12(\n" + + "\x10apply_latency_ns\x18\x04 \x01(\x03R\x0eapplyLatencyNs\x1a\xf6\x04\n" + + "\x0fNetworkPingTime\x12\x10\n" + + "\x03osd\x18\x01 \x01(\x03R\x03osd\x12\x1f\n" + + "\vlast_update\x18\x02 \x01(\tR\n" + + "lastUpdate\x12H\n" + + "\n" + + "interfaces\x18\x03 \x03(\v2(.ceph.OsdStats.NetworkPingTime.InterfaceR\n" + + "interfaces\x1a\xe5\x03\n" + + "\tInterface\x12%\n" + + "\x0einterface_name\x18\x01 \x01(\tR\rinterfaceName\x12J\n" + + "\aaverage\x18\x02 \x01(\v20.ceph.OsdStats.NetworkPingTime.Interface.AverageR\aaverage\x12>\n" + + "\x03min\x18\x03 \x01(\v2,.ceph.OsdStats.NetworkPingTime.Interface.MinR\x03min\x12>\n" + + "\x03max\x18\x04 \x01(\v2,.ceph.OsdStats.NetworkPingTime.Interface.MaxR\x03max\x12\x12\n" + + "\x04last\x18\x05 \x01(\x01R\x04last\x1aG\n" + + "\aAverage\x12\x12\n" + + "\x04min1\x18\x01 \x01(\x01R\x04min1\x12\x12\n" + + "\x04min5\x18\x02 \x01(\x01R\x04min5\x12\x14\n" + + "\x05min15\x18\x03 \x01(\x01R\x05min15\x1aC\n" + + "\x03Min\x12\x12\n" + + "\x04min1\x18\x01 \x01(\x01R\x04min1\x12\x12\n" + + "\x04min5\x18\x02 \x01(\x01R\x04min5\x12\x14\n" + + "\x05min15\x18\x03 \x01(\x01R\x05min15\x1aC\n" + + "\x03Max\x12\x12\n" + + "\x04min1\x18\x01 \x01(\x01R\x04min1\x12\x12\n" + + "\x04min5\x18\x02 \x01(\x01R\x04min5\x12\x14\n" + + "\x05min15\x18\x03 \x01(\x01R\x05min15\"\xcd\x03\n" + + "\n" + + "PoolStatFs\x12\x16\n" + + "\x06poolid\x18\x01 \x01(\x03R\x06poolid\x12\x10\n" + + "\x03osd\x18\x02 \x01(\x03R\x03osd\x12\x14\n" + + "\x05total\x18\x03 \x01(\x03R\x05total\x12\x1c\n" + + "\tavailable\x18\x04 \x01(\x03R\tavailable\x12/\n" + + "\x13internally_reserved\x18\x05 \x01(\x03R\x12internallyReserved\x12\x1c\n" + + "\tallocated\x18\x06 \x01(\x03R\tallocated\x12\x1f\n" + + "\vdata_stored\x18\a \x01(\x03R\n" + + "dataStored\x12'\n" + + "\x0fdata_compressed\x18\b \x01(\x03R\x0edataCompressed\x12:\n" + + "\x19data_compressed_allocated\x18\t \x01(\x03R\x17dataCompressedAllocated\x128\n" + + "\x18data_compressed_original\x18\n" + + " \x01(\x03R\x16dataCompressedOriginal\x12%\n" + + "\x0eomap_allocated\x18\v \x01(\x03R\romapAllocated\x12+\n" + + "\x11internal_metadata\x18\f \x01(\x03R\x10internalMetadata2\xed\x02\n" + + "\x06Status\x12F\n" + + "\rGetCephStatus\x12\x16.google.protobuf.Empty\x1a\x1b.ceph.GetCephStatusResponse\"\x00\x12E\n" + + "\x0eGetCephMonDump\x12\x16.google.protobuf.Empty\x1a\x19.ceph.CephMonDumpResponse\"\x00\x12H\n" + + "\x0eGetCephOsdDump\x12\x16.google.protobuf.Empty\x1a\x1c.ceph.GetCephOsdDumpResponse\"\x00\x12F\n" + + "\rGetCephPgDump\x12\x16.google.protobuf.Empty\x1a\x1b.ceph.GetCephPgDumpResponse\"\x00\x12B\n" + + "\rGetCephReport\x12\x16.google.protobuf.Empty\x1a\x17.google.protobuf.Struct\"\x00B'Z%github.com/clyso/ceph-api/api/ceph;pbb\x06proto3" var ( file_status_proto_rawDescOnce sync.Once - file_status_proto_rawDescData = file_status_proto_rawDesc + file_status_proto_rawDescData []byte ) func file_status_proto_rawDescGZIP() []byte { file_status_proto_rawDescOnce.Do(func() { - file_status_proto_rawDescData = protoimpl.X.CompressGZIP(file_status_proto_rawDescData) + file_status_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_status_proto_rawDesc), len(file_status_proto_rawDesc))) }) return file_status_proto_rawDescData } var file_status_proto_msgTypes = make([]protoimpl.MessageInfo, 66) -var file_status_proto_goTypes = []interface{}{ +var file_status_proto_goTypes = []any{ (*GetCephStatusResponse)(nil), // 0: ceph.GetCephStatusResponse (*CephMonDumpResponse)(nil), // 1: ceph.CephMonDumpResponse (*CephMonDumpFeatures)(nil), // 2: ceph.CephMonDumpFeatures @@ -9443,733 +8309,11 @@ func file_status_proto_init() { if File_status_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_status_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCephStatusResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephMonDumpResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephMonDumpFeatures); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephMonDumpMonInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephMonDumpAddrVec); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephMonDumpAddress); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephStatusHealth); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephStatusMonMap); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephStatusOSDMap); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephStatusPGMap); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephStatusPGState); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephStatusFSMap); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephStatusMgrMap); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephStatusServiceMap); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CephStatusService); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCephOsdDumpResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpPool); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpLastPgMergeMeta); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpHitSetParams); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpReadBalance); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpOsdInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpPublicAddrs); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpClusterAddrs); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpHeartbeatAddrs); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpAddrVec); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpOsdXInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpErasureCodeProfile); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdDumpStretchMode); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetCephPgDumpResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PGMap); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PGStatsSum); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OSDStatsSum); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PGStatsDelta); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PGStat); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PoolStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PoolStatFs); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PGStatsSum_PGStatsSum_StatSum); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PGStatsSum_PGStatsSum_StoreStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OSDStatsSum_StatFs); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OSDStatsSum_OpQueueAgeHist); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OSDStatsSum_PerfStat); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OSDStatsSum_NetworkPingTime); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OSDStatsSum_NetworkPingTime_Interface); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OSDStatsSum_NetworkPingTime_Interface_Average); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OSDStatsSum_NetworkPingTime_Interface_Min); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OSDStatsSum_NetworkPingTime_Interface_Max); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PGStatsDelta_PGStatsDelta_StatSum); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PGStatsDelta_PGStatsDelta_StoreStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PGStat_PGStat_StatSum); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PoolStats_PoolStats_StatSum); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PoolStats_PoolStats_StoreStats); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdStats_StatFs); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdStats_OpQueueAgeHist); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdStats_PerfStat); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdStats_NetworkPingTime); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdStats_NetworkPingTime_Interface); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdStats_NetworkPingTime_Interface_Average); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdStats_NetworkPingTime_Interface_Min); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_status_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OsdStats_NetworkPingTime_Interface_Max); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_status_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_status_proto_rawDesc), len(file_status_proto_rawDesc)), NumEnums: 0, NumMessages: 66, NumExtensions: 0, @@ -10180,7 +8324,6 @@ func file_status_proto_init() { MessageInfos: file_status_proto_msgTypes, }.Build() File_status_proto = out.File - file_status_proto_rawDesc = nil file_status_proto_goTypes = nil file_status_proto_depIdxs = nil } diff --git a/api/gen/grpc/go/status.pb.gw.go b/api/gen/grpc/go/status.pb.gw.go index ed6efb8..91f2899 100644 --- a/api/gen/grpc/go/status.pb.gw.go +++ b/api/gen/grpc/go/status.pb.gw.go @@ -41,6 +41,9 @@ func request_Status_GetCephStatus_0(ctx context.Context, marshaler runtime.Marsh protoReq emptypb.Empty metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.GetCephStatus(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -59,6 +62,9 @@ func request_Status_GetCephMonDump_0(ctx context.Context, marshaler runtime.Mars protoReq emptypb.Empty metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.GetCephMonDump(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -77,6 +83,9 @@ func request_Status_GetCephOsdDump_0(ctx context.Context, marshaler runtime.Mars protoReq emptypb.Empty metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.GetCephOsdDump(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -95,6 +104,9 @@ func request_Status_GetCephReport_0(ctx context.Context, marshaler runtime.Marsh protoReq emptypb.Empty metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.GetCephReport(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } diff --git a/api/gen/grpc/go/status_grpc.pb.go b/api/gen/grpc/go/status_grpc.pb.go index 19d0528..67e6242 100644 --- a/api/gen/grpc/go/status_grpc.pb.go +++ b/api/gen/grpc/go/status_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: status.proto @@ -126,19 +126,19 @@ type StatusServer interface { type UnimplementedStatusServer struct{} func (UnimplementedStatusServer) GetCephStatus(context.Context, *emptypb.Empty) (*GetCephStatusResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetCephStatus not implemented") + return nil, status.Error(codes.Unimplemented, "method GetCephStatus not implemented") } func (UnimplementedStatusServer) GetCephMonDump(context.Context, *emptypb.Empty) (*CephMonDumpResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetCephMonDump not implemented") + return nil, status.Error(codes.Unimplemented, "method GetCephMonDump not implemented") } func (UnimplementedStatusServer) GetCephOsdDump(context.Context, *emptypb.Empty) (*GetCephOsdDumpResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetCephOsdDump not implemented") + return nil, status.Error(codes.Unimplemented, "method GetCephOsdDump not implemented") } func (UnimplementedStatusServer) GetCephPgDump(context.Context, *emptypb.Empty) (*GetCephPgDumpResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetCephPgDump not implemented") + return nil, status.Error(codes.Unimplemented, "method GetCephPgDump not implemented") } func (UnimplementedStatusServer) GetCephReport(context.Context, *emptypb.Empty) (*structpb.Struct, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetCephReport not implemented") + return nil, status.Error(codes.Unimplemented, "method GetCephReport not implemented") } func (UnimplementedStatusServer) testEmbeddedByValue() {} @@ -150,7 +150,7 @@ type UnsafeStatusServer interface { } func RegisterStatusServer(s grpc.ServiceRegistrar, srv StatusServer) { - // If the following call pancis, it indicates UnimplementedStatusServer was + // If the following call panics, it indicates UnimplementedStatusServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/api/gen/grpc/go/users.pb.go b/api/gen/grpc/go/users.pb.go index 0527564..7dd97ae 100644 --- a/api/gen/grpc/go/users.pb.go +++ b/api/gen/grpc/go/users.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.34.1 +// protoc-gen-go v1.36.11 // protoc (unknown) // source: users.proto @@ -14,6 +14,7 @@ import ( timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" + unsafe "unsafe" ) const ( @@ -24,20 +25,17 @@ const ( ) type RolesResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Roles []*Role `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` unknownFields protoimpl.UnknownFields - - Roles []*Role `protobuf:"bytes,1,rep,name=roles,proto3" json:"roles,omitempty"` + sizeCache protoimpl.SizeCache } func (x *RolesResp) Reset() { *x = RolesResp{} - if protoimpl.UnsafeEnabled { - mi := &file_users_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_users_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *RolesResp) String() string { @@ -48,7 +46,7 @@ func (*RolesResp) ProtoMessage() {} func (x *RolesResp) ProtoReflect() protoreflect.Message { mi := &file_users_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -71,22 +69,19 @@ func (x *RolesResp) GetRoles() []*Role { } type Role struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Description *string `protobuf:"bytes,2,opt,name=description,proto3,oneof" json:"description,omitempty"` - ScopesPermissions map[string]*structpb.ListValue `protobuf:"bytes,3,rep,name=scopes_permissions,proto3" json:"scopes_permissions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + ScopesPermissions map[string]*structpb.ListValue `protobuf:"bytes,3,rep,name=scopes_permissions,proto3" json:"scopes_permissions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Role) Reset() { *x = Role{} - if protoimpl.UnsafeEnabled { - mi := &file_users_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_users_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *Role) String() string { @@ -97,7 +92,7 @@ func (*Role) ProtoMessage() {} func (x *Role) ProtoReflect() protoreflect.Message { mi := &file_users_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -134,20 +129,17 @@ func (x *Role) GetScopesPermissions() map[string]*structpb.ListValue { } type GetRoleReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetRoleReq) Reset() { *x = GetRoleReq{} - if protoimpl.UnsafeEnabled { - mi := &file_users_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_users_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetRoleReq) String() string { @@ -158,7 +150,7 @@ func (*GetRoleReq) ProtoMessage() {} func (x *GetRoleReq) ProtoReflect() protoreflect.Message { mi := &file_users_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -181,21 +173,18 @@ func (x *GetRoleReq) GetName() string { } type CloneRoleReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + NewName string `protobuf:"bytes,2,opt,name=new_name,proto3" json:"new_name,omitempty"` unknownFields protoimpl.UnknownFields - - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - NewName string `protobuf:"bytes,2,opt,name=new_name,proto3" json:"new_name,omitempty"` + sizeCache protoimpl.SizeCache } func (x *CloneRoleReq) Reset() { *x = CloneRoleReq{} - if protoimpl.UnsafeEnabled { - mi := &file_users_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_users_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CloneRoleReq) String() string { @@ -206,7 +195,7 @@ func (*CloneRoleReq) ProtoMessage() {} func (x *CloneRoleReq) ProtoReflect() protoreflect.Message { mi := &file_users_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -236,20 +225,17 @@ func (x *CloneRoleReq) GetNewName() string { } type UsersResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` unknownFields protoimpl.UnknownFields - - Users []*User `protobuf:"bytes,1,rep,name=users,proto3" json:"users,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UsersResp) Reset() { *x = UsersResp{} - if protoimpl.UnsafeEnabled { - mi := &file_users_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_users_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UsersResp) String() string { @@ -260,7 +246,7 @@ func (*UsersResp) ProtoMessage() {} func (x *UsersResp) ProtoReflect() protoreflect.Message { mi := &file_users_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -283,10 +269,7 @@ func (x *UsersResp) GetUsers() []*User { } type User struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Email *string `protobuf:"bytes,1,opt,name=email,proto3,oneof" json:"email,omitempty"` Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` @@ -295,15 +278,15 @@ type User struct { PwdUpdateRequired bool `protobuf:"varint,6,opt,name=pwd_update_required,json=pwdUpdateRequired,proto3" json:"pwd_update_required,omitempty"` Roles []string `protobuf:"bytes,7,rep,name=roles,proto3" json:"roles,omitempty"` Username string `protobuf:"bytes,8,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *User) Reset() { *x = User{} - if protoimpl.UnsafeEnabled { - mi := &file_users_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_users_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *User) String() string { @@ -314,7 +297,7 @@ func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { mi := &file_users_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -386,20 +369,17 @@ func (x *User) GetUsername() string { } type GetUserReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + sizeCache protoimpl.SizeCache } func (x *GetUserReq) Reset() { *x = GetUserReq{} - if protoimpl.UnsafeEnabled { - mi := &file_users_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_users_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *GetUserReq) String() string { @@ -410,7 +390,7 @@ func (*GetUserReq) ProtoMessage() {} func (x *GetUserReq) ProtoReflect() protoreflect.Message { mi := &file_users_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -433,10 +413,7 @@ func (x *GetUserReq) GetUsername() string { } type CreateUserReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - + state protoimpl.MessageState `protogen:"open.v1"` Email *string `protobuf:"bytes,1,opt,name=email,proto3,oneof" json:"email,omitempty"` Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` @@ -445,15 +422,15 @@ type CreateUserReq struct { PwdUpdateRequired bool `protobuf:"varint,6,opt,name=pwd_update_required,json=pwdUpdateRequired,proto3" json:"pwd_update_required,omitempty"` Roles []string `protobuf:"bytes,7,rep,name=roles,proto3" json:"roles,omitempty"` Username string `protobuf:"bytes,8,opt,name=username,proto3" json:"username,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateUserReq) Reset() { *x = CreateUserReq{} - if protoimpl.UnsafeEnabled { - mi := &file_users_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_users_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateUserReq) String() string { @@ -464,7 +441,7 @@ func (*CreateUserReq) ProtoMessage() {} func (x *CreateUserReq) ProtoReflect() protoreflect.Message { mi := &file_users_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -536,22 +513,19 @@ func (x *CreateUserReq) GetUsername() string { } type UserChangePasswordReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` + OldPassword string `protobuf:"bytes,2,opt,name=old_password,proto3" json:"old_password,omitempty"` + NewPassword string `protobuf:"bytes,3,opt,name=new_password,proto3" json:"new_password,omitempty"` unknownFields protoimpl.UnknownFields - - Username string `protobuf:"bytes,1,opt,name=username,proto3" json:"username,omitempty"` - OldPassword string `protobuf:"bytes,2,opt,name=old_password,proto3" json:"old_password,omitempty"` - NewPassword string `protobuf:"bytes,3,opt,name=new_password,proto3" json:"new_password,omitempty"` + sizeCache protoimpl.SizeCache } func (x *UserChangePasswordReq) Reset() { *x = UserChangePasswordReq{} - if protoimpl.UnsafeEnabled { - mi := &file_users_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } + mi := &file_users_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UserChangePasswordReq) String() string { @@ -562,7 +536,7 @@ func (*UserChangePasswordReq) ProtoMessage() {} func (x *UserChangePasswordReq) ProtoReflect() protoreflect.Message { mi := &file_users_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -600,159 +574,99 @@ func (x *UserChangePasswordReq) GetNewPassword() string { var File_users_proto protoreflect.FileDescriptor -var file_users_proto_rawDesc = []byte{ - 0x0a, 0x0b, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x04, 0x63, - 0x65, 0x70, 0x68, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x2d, 0x0a, 0x09, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x20, 0x0a, 0x05, - 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x63, 0x65, - 0x70, 0x68, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x22, 0x86, - 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0b, 0x64, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x0b, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x88, - 0x01, 0x01, 0x12, 0x51, 0x0a, 0x12, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, - 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, - 0x73, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x12, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x60, 0x0a, 0x16, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x73, 0x50, - 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x30, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x64, 0x65, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x0a, 0x47, 0x65, 0x74, 0x52, 0x6f, - 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3e, 0x0a, 0x0c, 0x43, 0x6c, 0x6f, - 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, - 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x6e, 0x65, 0x77, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x2d, 0x0a, 0x09, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x20, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0xef, 0x02, 0x0a, 0x04, 0x55, 0x73, 0x65, - 0x72, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, - 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, - 0x3b, 0x0a, 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x4f, 0x0a, 0x13, - 0x70, 0x77, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x02, 0x52, 0x11, 0x70, 0x77, 0x64, 0x45, 0x78, 0x70, 0x69, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x88, 0x01, 0x01, 0x12, 0x2e, 0x0a, - 0x13, 0x70, 0x77, 0x64, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, - 0x69, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x70, 0x77, 0x64, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x72, 0x6f, - 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x42, - 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x70, 0x77, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x22, 0x28, 0x0a, 0x0a, 0x47, 0x65, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xd7, 0x02, 0x0a, 0x0d, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, - 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x12, 0x19, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x88, 0x01, - 0x01, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x17, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, - 0x12, 0x4f, 0x0a, 0x13, 0x70, 0x77, 0x64, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x48, 0x02, 0x52, 0x11, 0x70, 0x77, 0x64, - 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x61, 0x74, 0x65, 0x88, 0x01, - 0x01, 0x12, 0x2e, 0x0a, 0x13, 0x70, 0x77, 0x64, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, - 0x70, 0x77, 0x64, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, - 0x64, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x05, 0x72, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x42, 0x08, 0x0a, 0x06, 0x5f, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x42, 0x07, 0x0a, - 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x70, 0x77, 0x64, 0x5f, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x22, 0x7b, - 0x0a, 0x15, 0x55, 0x73, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, - 0x77, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x75, 0x73, 0x65, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x6f, 0x6c, 0x64, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, - 0x6f, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x5f, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x6e, 0x65, 0x77, 0x5f, 0x70, - 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6e, - 0x65, 0x77, 0x5f, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x32, 0x93, 0x05, 0x0a, 0x05, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x34, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x65, 0x70, - 0x68, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x27, 0x0a, 0x07, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x10, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x47, 0x65, - 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x0a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x55, 0x73, - 0x65, 0x72, 0x12, 0x13, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, - 0x36, 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x10, 0x2e, - 0x63, 0x65, 0x70, 0x68, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, - 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x55, 0x73, 0x65, 0x72, 0x12, 0x13, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x49, 0x0a, 0x12, 0x55, 0x73, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, - 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x1b, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x50, 0x61, 0x73, 0x73, 0x77, 0x6f, - 0x72, 0x64, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x34, 0x0a, - 0x09, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x1a, 0x0f, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x12, 0x27, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x10, - 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, - 0x1a, 0x0a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x30, 0x0a, 0x0a, - 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0a, 0x2e, 0x63, 0x65, 0x70, - 0x68, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x36, - 0x0a, 0x0a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x10, 0x2e, 0x63, - 0x65, 0x70, 0x68, 0x2e, 0x47, 0x65, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x30, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x0a, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x52, 0x6f, 0x6c, 0x65, - 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x37, 0x0a, 0x09, 0x43, 0x6c, 0x6f, 0x6e, - 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x12, 0x2e, 0x63, 0x65, 0x70, 0x68, 0x2e, 0x43, 0x6c, 0x6f, - 0x6e, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x71, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, - 0x79, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x63, 0x6c, 0x79, 0x73, 0x6f, 0x2f, 0x63, 0x65, 0x70, 0x68, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x61, - 0x70, 0x69, 0x2f, 0x63, 0x65, 0x70, 0x68, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, -} +const file_users_proto_rawDesc = "" + + "\n" + + "\vusers.proto\x12\x04ceph\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\"-\n" + + "\tRolesResp\x12 \n" + + "\x05roles\x18\x01 \x03(\v2\n" + + ".ceph.RoleR\x05roles\"\x86\x02\n" + + "\x04Role\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12%\n" + + "\vdescription\x18\x02 \x01(\tH\x00R\vdescription\x88\x01\x01\x12Q\n" + + "\x12scopes_permissions\x18\x03 \x03(\v2!.ceph.Role.ScopesPermissionsEntryR\x12scopes_permissions\x1a`\n" + + "\x16ScopesPermissionsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x120\n" + + "\x05value\x18\x02 \x01(\v2\x1a.google.protobuf.ListValueR\x05value:\x028\x01B\x0e\n" + + "\f_description\" \n" + + "\n" + + "GetRoleReq\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\">\n" + + "\fCloneRoleReq\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1a\n" + + "\bnew_name\x18\x02 \x01(\tR\bnew_name\"-\n" + + "\tUsersResp\x12 \n" + + "\x05users\x18\x01 \x03(\v2\n" + + ".ceph.UserR\x05users\"\xef\x02\n" + + "\x04User\x12\x19\n" + + "\x05email\x18\x01 \x01(\tH\x00R\x05email\x88\x01\x01\x12\x18\n" + + "\aenabled\x18\x02 \x01(\bR\aenabled\x12\x17\n" + + "\x04name\x18\x03 \x01(\tH\x01R\x04name\x88\x01\x01\x12;\n" + + "\vlast_update\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "lastUpdate\x12O\n" + + "\x13pwd_expiration_date\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampH\x02R\x11pwdExpirationDate\x88\x01\x01\x12.\n" + + "\x13pwd_update_required\x18\x06 \x01(\bR\x11pwdUpdateRequired\x12\x14\n" + + "\x05roles\x18\a \x03(\tR\x05roles\x12\x1a\n" + + "\busername\x18\b \x01(\tR\busernameB\b\n" + + "\x06_emailB\a\n" + + "\x05_nameB\x16\n" + + "\x14_pwd_expiration_date\"(\n" + + "\n" + + "GetUserReq\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\"\xd7\x02\n" + + "\rCreateUserReq\x12\x19\n" + + "\x05email\x18\x01 \x01(\tH\x00R\x05email\x88\x01\x01\x12\x18\n" + + "\aenabled\x18\x02 \x01(\bR\aenabled\x12\x17\n" + + "\x04name\x18\x03 \x01(\tH\x01R\x04name\x88\x01\x01\x12\x1a\n" + + "\bpassword\x18\x04 \x01(\tR\bpassword\x12O\n" + + "\x13pwd_expiration_date\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampH\x02R\x11pwdExpirationDate\x88\x01\x01\x12.\n" + + "\x13pwd_update_required\x18\x06 \x01(\bR\x11pwdUpdateRequired\x12\x14\n" + + "\x05roles\x18\a \x03(\tR\x05roles\x12\x1a\n" + + "\busername\x18\b \x01(\tR\busernameB\b\n" + + "\x06_emailB\a\n" + + "\x05_nameB\x16\n" + + "\x14_pwd_expiration_date\"{\n" + + "\x15UserChangePasswordReq\x12\x1a\n" + + "\busername\x18\x01 \x01(\tR\busername\x12\"\n" + + "\fold_password\x18\x02 \x01(\tR\fold_password\x12\"\n" + + "\fnew_password\x18\x03 \x01(\tR\fnew_password2\x93\x05\n" + + "\x05Users\x124\n" + + "\tListUsers\x12\x16.google.protobuf.Empty\x1a\x0f.ceph.UsersResp\x12'\n" + + "\aGetUser\x12\x10.ceph.GetUserReq\x1a\n" + + ".ceph.User\x129\n" + + "\n" + + "CreateUser\x12\x13.ceph.CreateUserReq\x1a\x16.google.protobuf.Empty\x126\n" + + "\n" + + "DeleteUser\x12\x10.ceph.GetUserReq\x1a\x16.google.protobuf.Empty\x129\n" + + "\n" + + "UpdateUser\x12\x13.ceph.CreateUserReq\x1a\x16.google.protobuf.Empty\x12I\n" + + "\x12UserChangePassword\x12\x1b.ceph.UserChangePasswordReq\x1a\x16.google.protobuf.Empty\x124\n" + + "\tListRoles\x12\x16.google.protobuf.Empty\x1a\x0f.ceph.RolesResp\x12'\n" + + "\aGetRole\x12\x10.ceph.GetRoleReq\x1a\n" + + ".ceph.Role\x120\n" + + "\n" + + "CreateRole\x12\n" + + ".ceph.Role\x1a\x16.google.protobuf.Empty\x126\n" + + "\n" + + "DeleteRole\x12\x10.ceph.GetRoleReq\x1a\x16.google.protobuf.Empty\x120\n" + + "\n" + + "UpdateRole\x12\n" + + ".ceph.Role\x1a\x16.google.protobuf.Empty\x127\n" + + "\tCloneRole\x12\x12.ceph.CloneRoleReq\x1a\x16.google.protobuf.EmptyB'Z%github.com/clyso/ceph-api/api/ceph;pbb\x06proto3" var ( file_users_proto_rawDescOnce sync.Once - file_users_proto_rawDescData = file_users_proto_rawDesc + file_users_proto_rawDescData []byte ) func file_users_proto_rawDescGZIP() []byte { file_users_proto_rawDescOnce.Do(func() { - file_users_proto_rawDescData = protoimpl.X.CompressGZIP(file_users_proto_rawDescData) + file_users_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_users_proto_rawDesc), len(file_users_proto_rawDesc))) }) return file_users_proto_rawDescData } var file_users_proto_msgTypes = make([]protoimpl.MessageInfo, 10) -var file_users_proto_goTypes = []interface{}{ +var file_users_proto_goTypes = []any{ (*RolesResp)(nil), // 0: ceph.RolesResp (*Role)(nil), // 1: ceph.Role (*GetRoleReq)(nil), // 2: ceph.GetRoleReq @@ -811,124 +725,14 @@ func file_users_proto_init() { if File_users_proto != nil { return } - if !protoimpl.UnsafeEnabled { - file_users_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RolesResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_users_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Role); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_users_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetRoleReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_users_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CloneRoleReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_users_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UsersResp); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_users_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*User); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_users_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetUserReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_users_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateUserReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_users_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UserChangePasswordReq); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_users_proto_msgTypes[1].OneofWrappers = []interface{}{} - file_users_proto_msgTypes[5].OneofWrappers = []interface{}{} - file_users_proto_msgTypes[7].OneofWrappers = []interface{}{} + file_users_proto_msgTypes[1].OneofWrappers = []any{} + file_users_proto_msgTypes[5].OneofWrappers = []any{} + file_users_proto_msgTypes[7].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_users_proto_rawDesc, + RawDescriptor: unsafe.Slice(unsafe.StringData(file_users_proto_rawDesc), len(file_users_proto_rawDesc)), NumEnums: 0, NumMessages: 10, NumExtensions: 0, @@ -939,7 +743,6 @@ func file_users_proto_init() { MessageInfos: file_users_proto_msgTypes, }.Build() File_users_proto = out.File - file_users_proto_rawDesc = nil file_users_proto_goTypes = nil file_users_proto_depIdxs = nil } diff --git a/api/gen/grpc/go/users.pb.gw.go b/api/gen/grpc/go/users.pb.gw.go index 543cbee..2506d88 100644 --- a/api/gen/grpc/go/users.pb.gw.go +++ b/api/gen/grpc/go/users.pb.gw.go @@ -41,6 +41,9 @@ func request_Users_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, protoReq emptypb.Empty metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.ListUsers(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -60,6 +63,9 @@ func request_Users_GetUser_0(ctx context.Context, marshaler runtime.Marshaler, c metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") @@ -98,6 +104,9 @@ func request_Users_CreateUser_0(ctx context.Context, marshaler runtime.Marshaler if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.CreateUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -120,6 +129,9 @@ func request_Users_DeleteUser_0(ctx context.Context, marshaler runtime.Marshaler metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") @@ -159,6 +171,9 @@ func request_Users_UpdateUser_0(ctx context.Context, marshaler runtime.Marshaler if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") @@ -201,6 +216,9 @@ func request_Users_UserChangePassword_0(ctx context.Context, marshaler runtime.M if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["username"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "username") @@ -239,6 +257,9 @@ func request_Users_ListRoles_0(ctx context.Context, marshaler runtime.Marshaler, protoReq emptypb.Empty metadata runtime.ServerMetadata ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.ListRoles(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -258,6 +279,9 @@ func request_Users_GetRole_0(ctx context.Context, marshaler runtime.Marshaler, c metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") @@ -296,6 +320,9 @@ func request_Users_CreateRole_0(ctx context.Context, marshaler runtime.Marshaler if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } msg, err := client.CreateRole(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) return msg, metadata, err } @@ -318,6 +345,9 @@ func request_Users_DeleteRole_0(ctx context.Context, marshaler runtime.Marshaler metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") @@ -357,6 +387,9 @@ func request_Users_UpdateRole_0(ctx context.Context, marshaler runtime.Marshaler if err := marshaler.NewDecoder(req.Body).Decode(&protoReq); err != nil && !errors.Is(err, io.EOF) { return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) } + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") @@ -398,6 +431,9 @@ func request_Users_CloneRole_0(ctx context.Context, marshaler runtime.Marshaler, metadata runtime.ServerMetadata err error ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } val, ok := pathParams["name"] if !ok { return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "name") @@ -938,7 +974,8 @@ type response_Users_ListUsers_0 struct { } func (m response_Users_ListUsers_0) XXX_ResponseBody() interface{} { - return m.Users + response := m.UsersResp + return response.Users } type response_Users_ListRoles_0 struct { @@ -946,7 +983,8 @@ type response_Users_ListRoles_0 struct { } func (m response_Users_ListRoles_0) XXX_ResponseBody() interface{} { - return m.Roles + response := m.RolesResp + return response.Roles } var ( diff --git a/api/gen/grpc/go/users_grpc.pb.go b/api/gen/grpc/go/users_grpc.pb.go index 5ff44c0..d96dfaf 100644 --- a/api/gen/grpc/go/users_grpc.pb.go +++ b/api/gen/grpc/go/users_grpc.pb.go @@ -1,6 +1,6 @@ // Code generated by protoc-gen-go-grpc. DO NOT EDIT. // versions: -// - protoc-gen-go-grpc v1.5.1 +// - protoc-gen-go-grpc v1.6.1 // - protoc (unknown) // source: users.proto @@ -206,40 +206,40 @@ type UsersServer interface { type UnimplementedUsersServer struct{} func (UnimplementedUsersServer) ListUsers(context.Context, *emptypb.Empty) (*UsersResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListUsers not implemented") + return nil, status.Error(codes.Unimplemented, "method ListUsers not implemented") } func (UnimplementedUsersServer) GetUser(context.Context, *GetUserReq) (*User, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented") + return nil, status.Error(codes.Unimplemented, "method GetUser not implemented") } func (UnimplementedUsersServer) CreateUser(context.Context, *CreateUserReq) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateUser not implemented") } func (UnimplementedUsersServer) DeleteUser(context.Context, *GetUserReq) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteUser not implemented") + return nil, status.Error(codes.Unimplemented, "method DeleteUser not implemented") } func (UnimplementedUsersServer) UpdateUser(context.Context, *CreateUserReq) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateUser not implemented") } func (UnimplementedUsersServer) UserChangePassword(context.Context, *UserChangePasswordReq) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method UserChangePassword not implemented") + return nil, status.Error(codes.Unimplemented, "method UserChangePassword not implemented") } func (UnimplementedUsersServer) ListRoles(context.Context, *emptypb.Empty) (*RolesResp, error) { - return nil, status.Errorf(codes.Unimplemented, "method ListRoles not implemented") + return nil, status.Error(codes.Unimplemented, "method ListRoles not implemented") } func (UnimplementedUsersServer) GetRole(context.Context, *GetRoleReq) (*Role, error) { - return nil, status.Errorf(codes.Unimplemented, "method GetRole not implemented") + return nil, status.Error(codes.Unimplemented, "method GetRole not implemented") } func (UnimplementedUsersServer) CreateRole(context.Context, *Role) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method CreateRole not implemented") + return nil, status.Error(codes.Unimplemented, "method CreateRole not implemented") } func (UnimplementedUsersServer) DeleteRole(context.Context, *GetRoleReq) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method DeleteRole not implemented") + return nil, status.Error(codes.Unimplemented, "method DeleteRole not implemented") } func (UnimplementedUsersServer) UpdateRole(context.Context, *Role) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateRole not implemented") + return nil, status.Error(codes.Unimplemented, "method UpdateRole not implemented") } func (UnimplementedUsersServer) CloneRole(context.Context, *CloneRoleReq) (*emptypb.Empty, error) { - return nil, status.Errorf(codes.Unimplemented, "method CloneRole not implemented") + return nil, status.Error(codes.Unimplemented, "method CloneRole not implemented") } func (UnimplementedUsersServer) testEmbeddedByValue() {} @@ -251,7 +251,7 @@ type UnsafeUsersServer interface { } func RegisterUsersServer(s grpc.ServiceRegistrar, srv UsersServer) { - // If the following call pancis, it indicates UnimplementedUsersServer was + // If the following call panics, it indicates UnimplementedUsersServer was // embedded by pointer and is nil. This will cause panics if an // unimplemented method is ever invoked, so we test this at initialization // time to prevent it from happening at runtime later due to I/O. diff --git a/api/openapi/ceph-api.swagger.json b/api/openapi/ceph-api.swagger.json index 005369c..d6f2542 100644 --- a/api/openapi/ceph-api.swagger.json +++ b/api/openapi/ceph-api.swagger.json @@ -53,7 +53,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -85,7 +85,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -118,7 +118,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -152,7 +152,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -174,7 +174,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -206,7 +206,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -322,7 +322,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -343,7 +343,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -374,7 +374,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -407,7 +407,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -440,7 +440,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -474,7 +474,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -495,7 +495,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -527,7 +527,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -556,7 +556,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -590,7 +590,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -611,7 +611,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -643,7 +643,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -672,7 +672,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -701,7 +701,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -740,7 +740,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -763,7 +763,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -786,7 +786,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -809,7 +809,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -835,7 +835,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -856,7 +856,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -889,7 +889,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -925,7 +925,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -954,7 +954,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -983,7 +983,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -1022,7 +1022,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -1093,3148 +1093,1369 @@ ], "default": "common" }, - "PGStatPGStat_StatSum": { - "type": "object", - "properties": { - "numBytes": { - "type": "string", - "format": "int64" - }, - "numObjects": { - "type": "string", - "format": "int64" - }, - "numObjectClones": { - "type": "string", - "format": "int64" - }, - "numObjectCopies": { - "type": "string", - "format": "int64" - }, - "numObjectsMissingOnPrimary": { - "type": "string", - "format": "int64" - }, - "numObjectsMissing": { - "type": "string", - "format": "int64" - }, - "numObjectsDegraded": { - "type": "string", - "format": "int64" - }, - "numObjectsMisplaced": { - "type": "string", - "format": "int64" - }, - "numObjectsUnfound": { - "type": "string", - "format": "int64" - }, - "numObjectsDirty": { - "type": "string", - "format": "int64" - }, - "numWhiteouts": { - "type": "string", - "format": "int64" - }, - "numRead": { - "type": "string", - "format": "int64" - }, - "numReadKb": { - "type": "string", - "format": "int64" - }, - "numWrite": { - "type": "string", - "format": "int64" - }, - "numWriteKb": { - "type": "string", - "format": "int64" - }, - "numScrubErrors": { - "type": "string", - "format": "int64" - }, - "numShallowScrubErrors": { - "type": "string", - "format": "int64" - }, - "numDeepScrubErrors": { - "type": "string", - "format": "int64" - }, - "numObjectsRecovered": { - "type": "string", - "format": "int64" - }, - "numBytesRecovered": { - "type": "string", - "format": "int64" - }, - "numKeysRecovered": { - "type": "string", - "format": "int64" - }, - "numObjectsOmap": { - "type": "string", - "format": "int64" - }, - "numObjectsHitSetArchive": { - "type": "string", - "format": "int64" - }, - "numBytesHitSetArchive": { - "type": "string", - "format": "int64" - }, - "numFlush": { - "type": "string", - "format": "int64" - }, - "numFlushKb": { - "type": "string", - "format": "int64" - }, - "numEvict": { - "type": "string", - "format": "int64" - }, - "numEvictKb": { - "type": "string", - "format": "int64" - }, - "numPromote": { - "type": "string", - "format": "int64" - }, - "numFlushModeHigh": { - "type": "string", - "format": "int64" - }, - "numFlushModeLow": { - "type": "string", - "format": "int64" - }, - "numEvictModeSome": { - "type": "string", - "format": "int64" - }, - "numEvictModeFull": { - "type": "string", - "format": "int64" - }, - "numObjectsPinned": { - "type": "string", - "format": "int64" - }, - "numLegacySnapsets": { - "type": "string", - "format": "int64" - }, - "numLargeOmapObjects": { - "type": "string", - "format": "int64" - }, - "numObjectsManifest": { - "type": "string", - "format": "int64" - }, - "numOmapBytes": { - "type": "string", - "format": "int64" - }, - "numOmapKeys": { - "type": "string", - "format": "int64" - }, - "numObjectsRepaired": { - "type": "string", - "format": "int64" - } - } - }, - "PGStatsDeltaPGStatsDelta_StatSum": { - "type": "object", - "properties": { - "numBytes": { - "type": "string", - "format": "int64" - }, - "numObjects": { - "type": "string", - "format": "int64" - }, - "numObjectClones": { - "type": "string", - "format": "int64" - }, - "numObjectCopies": { - "type": "string", - "format": "int64" - }, - "numObjectsMissingOnPrimary": { - "type": "string", - "format": "int64" - }, - "numObjectsMissing": { - "type": "string", - "format": "int64" - }, - "numObjectsDegraded": { - "type": "string", - "format": "int64" - }, - "numObjectsMisplaced": { - "type": "string", - "format": "int64" - }, - "numObjectsUnfound": { - "type": "string", - "format": "int64" - }, - "numObjectsDirty": { - "type": "string", - "format": "int64" - }, - "numWhiteouts": { - "type": "string", - "format": "int64" - }, - "numRead": { - "type": "string", - "format": "int64" - }, - "numReadKb": { - "type": "string", - "format": "int64" - }, - "numWrite": { - "type": "string", - "format": "int64" - }, - "numWriteKb": { - "type": "string", - "format": "int64" - }, - "numScrubErrors": { - "type": "string", - "format": "int64" - }, - "numShallowScrubErrors": { - "type": "string", - "format": "int64" - }, - "numDeepScrubErrors": { - "type": "string", - "format": "int64" - }, - "numObjectsRecovered": { - "type": "string", - "format": "int64" - }, - "numBytesRecovered": { - "type": "string", - "format": "int64" - }, - "numKeysRecovered": { - "type": "string", - "format": "int64" - }, - "numObjectsOmap": { - "type": "string", - "format": "int64" - }, - "numObjectsHitSetArchive": { - "type": "string", - "format": "int64" - }, - "numBytesHitSetArchive": { - "type": "string", - "format": "int64" - }, - "numFlush": { - "type": "string", - "format": "int64" - }, - "numFlushKb": { - "type": "string", - "format": "int64" - }, - "numEvict": { - "type": "string", - "format": "int64" - }, - "numEvictKb": { - "type": "string", - "format": "int64" - }, - "numPromote": { - "type": "string", - "format": "int64" - }, - "numFlushModeHigh": { - "type": "string", - "format": "int64" - }, - "numFlushModeLow": { - "type": "string", - "format": "int64" - }, - "numEvictModeSome": { - "type": "string", - "format": "int64" - }, - "numEvictModeFull": { - "type": "string", - "format": "int64" - }, - "numObjectsPinned": { - "type": "string", - "format": "int64" - }, - "numLegacySnapsets": { - "type": "string", - "format": "int64" - }, - "numLargeOmapObjects": { - "type": "string", - "format": "int64" - }, - "numObjectsManifest": { - "type": "string", - "format": "int64" - }, - "numOmapBytes": { - "type": "string", - "format": "int64" - }, - "numOmapKeys": { - "type": "string", - "format": "int64" - }, - "numObjectsRepaired": { - "type": "string", - "format": "int64" - } - } - }, - "PGStatsDeltaPGStatsDelta_StoreStats": { - "type": "object", - "properties": { - "total": { - "type": "string", - "format": "int64" - }, - "available": { - "type": "string", - "format": "int64" - }, - "internallyReserved": { - "type": "string", - "format": "int64" - }, - "allocated": { - "type": "string", - "format": "int64" - }, - "dataStored": { - "type": "string", - "format": "int64" - }, - "dataCompressed": { - "type": "string", - "format": "int64" - }, - "dataCompressedAllocated": { - "type": "string", - "format": "int64" - }, - "dataCompressedOriginal": { - "type": "string", - "format": "int64" - }, - "omapAllocated": { - "type": "string", - "format": "int64" - }, - "internalMetadata": { - "type": "string", - "format": "int64" - } - } - }, - "PGStatsSumPGStatsSum_StatSum": { - "type": "object", - "properties": { - "numBytes": { - "type": "string", - "format": "int64" - }, - "numObjects": { - "type": "string", - "format": "int64" - }, - "numObjectClones": { - "type": "string", - "format": "int64" - }, - "numObjectCopies": { - "type": "string", - "format": "int64" - }, - "numObjectsMissingOnPrimary": { - "type": "string", - "format": "int64" - }, - "numObjectsMissing": { - "type": "string", - "format": "int64" - }, - "numObjectsDegraded": { - "type": "string", - "format": "int64" - }, - "numObjectsMisplaced": { - "type": "string", - "format": "int64" - }, - "numObjectsUnfound": { - "type": "string", - "format": "int64" - }, - "numObjectsDirty": { - "type": "string", - "format": "int64" - }, - "numWhiteouts": { - "type": "string", - "format": "int64" - }, - "numRead": { - "type": "string", - "format": "int64" - }, - "numReadKb": { - "type": "string", - "format": "int64" - }, - "numWrite": { - "type": "string", - "format": "int64" - }, - "numWriteKb": { - "type": "string", - "format": "int64" - }, - "numScrubErrors": { - "type": "string", - "format": "int64" - }, - "numShallowScrubErrors": { - "type": "string", - "format": "int64" - }, - "numDeepScrubErrors": { - "type": "string", - "format": "int64" - }, - "numObjectsRecovered": { - "type": "string", - "format": "int64" - }, - "numBytesRecovered": { - "type": "string", - "format": "int64" - }, - "numKeysRecovered": { - "type": "string", - "format": "int64" - }, - "numObjectsOmap": { - "type": "string", - "format": "int64" - }, - "numObjectsHitSetArchive": { - "type": "string", - "format": "int64" - }, - "numBytesHitSetArchive": { - "type": "string", - "format": "int64" - }, - "numFlush": { - "type": "string", - "format": "int64" - }, - "numFlushKb": { - "type": "string", - "format": "int64" - }, - "numEvict": { - "type": "string", - "format": "int64" - }, - "numEvictKb": { - "type": "string", - "format": "int64" - }, - "numPromote": { - "type": "string", - "format": "int64" - }, - "numFlushModeHigh": { - "type": "string", - "format": "int64" - }, - "numFlushModeLow": { - "type": "string", - "format": "int64" - }, - "numEvictModeSome": { - "type": "string", - "format": "int64" - }, - "numEvictModeFull": { - "type": "string", - "format": "int64" - }, - "numObjectsPinned": { - "type": "string", - "format": "int64" - }, - "numLegacySnapsets": { - "type": "string", - "format": "int64" - }, - "numLargeOmapObjects": { - "type": "string", - "format": "int64" - }, - "numObjectsManifest": { - "type": "string", - "format": "int64" - }, - "numOmapBytes": { - "type": "string", - "format": "int64" - }, - "numOmapKeys": { - "type": "string", - "format": "int64" - }, - "numObjectsRepaired": { - "type": "string", - "format": "int64" - } - } - }, - "PGStatsSumPGStatsSum_StoreStats": { - "type": "object", - "properties": { - "total": { - "type": "string", - "format": "int64" - }, - "available": { - "type": "string", - "format": "int64" - }, - "internallyReserved": { - "type": "string", - "format": "int64" - }, - "allocated": { - "type": "string", - "format": "int64" - }, - "dataStored": { - "type": "string", - "format": "int64" - }, - "dataCompressed": { - "type": "string", - "format": "int64" - }, - "dataCompressedAllocated": { - "type": "string", - "format": "int64" - }, - "dataCompressedOriginal": { - "type": "string", - "format": "int64" - }, - "omapAllocated": { - "type": "string", - "format": "int64" - }, - "internalMetadata": { - "type": "string", - "format": "int64" - } - } - }, - "PoolStatsPoolStats_StatSum": { - "type": "object", - "properties": { - "numBytes": { - "type": "string", - "format": "int64" - }, - "numObjects": { - "type": "string", - "format": "int64" - }, - "numObjectClones": { - "type": "string", - "format": "int64" - }, - "numObjectCopies": { - "type": "string", - "format": "int64" - }, - "numObjectsMissingOnPrimary": { - "type": "string", - "format": "int64" - }, - "numObjectsMissing": { - "type": "string", - "format": "int64" - }, - "numObjectsDegraded": { - "type": "string", - "format": "int64" - }, - "numObjectsMisplaced": { - "type": "string", - "format": "int64" - }, - "numObjectsUnfound": { - "type": "string", - "format": "int64" - }, - "numObjectsDirty": { - "type": "string", - "format": "int64" - }, - "numWhiteouts": { - "type": "string", - "format": "int64" - }, - "numRead": { - "type": "string", - "format": "int64" - }, - "numReadKb": { - "type": "string", - "format": "int64" - }, - "numWrite": { - "type": "string", - "format": "int64" - }, - "numWriteKb": { - "type": "string", - "format": "int64" - }, - "numScrubErrors": { - "type": "string", - "format": "int64" - }, - "numShallowScrubErrors": { - "type": "string", - "format": "int64" - }, - "numDeepScrubErrors": { - "type": "string", - "format": "int64" - }, - "numObjectsRecovered": { - "type": "string", - "format": "int64" - }, - "numBytesRecovered": { - "type": "string", - "format": "int64" - }, - "numKeysRecovered": { - "type": "string", - "format": "int64" - }, - "numObjectsOmap": { - "type": "string", - "format": "int64" - }, - "numObjectsHitSetArchive": { - "type": "string", - "format": "int64" - }, - "numBytesHitSetArchive": { - "type": "string", - "format": "int64" - }, - "numFlush": { - "type": "string", - "format": "int64" - }, - "numFlushKb": { - "type": "string", - "format": "int64" - }, - "numEvict": { - "type": "string", - "format": "int64" - }, - "numEvictKb": { - "type": "string", - "format": "int64" - }, - "numPromote": { - "type": "string", - "format": "int64" - }, - "numFlushModeHigh": { - "type": "string", - "format": "int64" - }, - "numFlushModeLow": { - "type": "string", - "format": "int64" - }, - "numEvictModeSome": { - "type": "string", - "format": "int64" - }, - "numEvictModeFull": { - "type": "string", - "format": "int64" - }, - "numObjectsPinned": { - "type": "string", - "format": "int64" - }, - "numLegacySnapsets": { - "type": "string", - "format": "int64" - }, - "numLargeOmapObjects": { - "type": "string", - "format": "int64" - }, - "numObjectsManifest": { - "type": "string", - "format": "int64" - }, - "numOmapBytes": { - "type": "string", - "format": "int64" - }, - "numOmapKeys": { - "type": "string", - "format": "int64" - }, - "numObjectsRepaired": { - "type": "string", - "format": "int64" - } - } - }, - "PoolStatsPoolStats_StoreStats": { - "type": "object", - "properties": { - "total": { - "type": "string", - "format": "int64" - }, - "available": { - "type": "string", - "format": "int64" - }, - "internallyReserved": { - "type": "string", - "format": "int64" - }, - "allocated": { - "type": "string", - "format": "int64" - }, - "dataStored": { - "type": "string", - "format": "int64" - }, - "dataCompressed": { - "type": "string", - "format": "int64" - }, - "dataCompressedAllocated": { - "type": "string", - "format": "int64" - }, - "dataCompressedOriginal": { - "type": "string", - "format": "int64" - }, - "omapAllocated": { - "type": "string", - "format": "int64" - }, - "internalMetadata": { - "type": "string", - "format": "int64" - } - } - }, - "SearchConfigRequestSortField": { - "type": "string", - "enum": [ - "NAME", - "TYPE", - "LEVEL" - ], - "default": "NAME" - }, - "SearchConfigRequestSortOrder": { - "type": "string", - "enum": [ - "ASC", - "DESC" - ], - "default": "ASC" - }, - "UsersUpdateRoleBody": { - "type": "object", - "properties": { - "description": { - "type": "string" - }, - "scopes_permissions": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "object" - } - } - } - } - }, - "UsersUserChangePasswordBody": { - "type": "object", - "properties": { - "old_password": { - "type": "string" - }, - "new_password": { - "type": "string" - } - } - }, - "cephCephMonDumpAddrVec": { - "type": "object", - "properties": { - "addrvec": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephCephMonDumpAddress" - } - } - } - }, - "cephCephMonDumpAddress": { - "type": "object", - "properties": { - "type": { - "type": "string" - }, - "addr": { - "type": "string" - }, - "nonce": { - "type": "integer", - "format": "int32" - } - } - }, - "cephCephMonDumpFeatures": { - "type": "object", - "properties": { - "persistent": { - "type": "array", - "items": { - "type": "string" - } - }, - "optional": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "cephCephMonDumpMonInfo": { - "type": "object", - "properties": { - "rank": { - "type": "integer", - "format": "int32" - }, - "name": { - "type": "string" - }, - "publicAddrs": { - "$ref": "#/definitions/cephCephMonDumpAddrVec" - }, - "addr": { - "type": "string" - }, - "publicAddr": { - "type": "string" - }, - "priority": { - "type": "integer", - "format": "int32" - }, - "weight": { - "type": "integer", - "format": "int32" - }, - "crushLocation": { - "type": "string" - } - } - }, - "cephCephMonDumpResponse": { - "type": "object", - "properties": { - "epoch": { - "type": "integer", - "format": "int32" - }, - "fsid": { - "type": "string" - }, - "modified": { - "type": "string", - "format": "date-time" - }, - "created": { - "type": "string", - "format": "date-time" - }, - "minMonRelease": { - "type": "integer", - "format": "int32" - }, - "minMonReleaseName": { - "type": "string" - }, - "electionStrategy": { - "type": "integer", - "format": "int32" - }, - "disallowedLeaders": { - "type": "string" - }, - "stretchMode": { - "type": "boolean" - }, - "tiebreakerMon": { - "type": "string" - }, - "removedRanks": { - "type": "string" - }, - "features": { - "$ref": "#/definitions/cephCephMonDumpFeatures" - }, - "mons": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephCephMonDumpMonInfo" - } - }, - "quorum": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - } - } - }, - "cephCephStatusFSMap": { - "type": "object", - "properties": { - "epoch": { - "type": "integer", - "format": "int32" - }, - "byRank": { - "type": "array", - "items": {} - }, - "upStandby": { - "type": "integer", - "format": "int32" - } - } - }, - "cephCephStatusHealth": { - "type": "object", - "properties": { - "status": { - "type": "string" - }, - "checks": { - "type": "object", - "additionalProperties": { - "type": "object" - } - }, - "mutes": { - "type": "array", - "items": {} - } - } - }, - "cephCephStatusMgrMap": { - "type": "object", - "properties": { - "available": { - "type": "boolean" - }, - "numStandbys": { - "type": "integer", - "format": "int32" - }, - "modules": { - "type": "array", - "items": { - "type": "string" - } - }, - "services": { - "type": "object", - "additionalProperties": { - "type": "string" - } - } - } - }, - "cephCephStatusMonMap": { - "type": "object", - "properties": { - "epoch": { - "type": "integer", - "format": "int32" - }, - "minMonReleaseName": { - "type": "string" - }, - "numMons": { - "type": "integer", - "format": "int32" - } - } - }, - "cephCephStatusOSDMap": { - "type": "object", - "properties": { - "epoch": { - "type": "integer", - "format": "int32" - }, - "numOsds": { - "type": "integer", - "format": "int32" - }, - "numUpOsds": { - "type": "integer", - "format": "int32" - }, - "osdUpSince": { - "type": "string", - "format": "int64" - }, - "numInOsds": { - "type": "integer", - "format": "int32" - }, - "osdInSince": { - "type": "string", - "format": "int64" - }, - "numRemappedPgs": { - "type": "integer", - "format": "int32" - } - } - }, - "cephCephStatusPGMap": { - "type": "object", - "properties": { - "pgsByState": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephCephStatusPGState" - } - }, - "numPgs": { - "type": "integer", - "format": "int32" - }, - "numPools": { - "type": "integer", - "format": "int32" - }, - "numObjects": { - "type": "integer", - "format": "int32" - }, - "dataBytes": { - "type": "string", - "format": "int64" - }, - "bytesUsed": { - "type": "string", - "format": "int64" - }, - "bytesAvail": { - "type": "string", - "format": "int64" - }, - "bytesTotal": { - "type": "string", - "format": "int64" - } - } - }, - "cephCephStatusPGState": { - "type": "object", - "properties": { - "stateName": { - "type": "string" - }, - "count": { - "type": "integer", - "format": "int32" - } - } - }, - "cephCephStatusService": { - "type": "object", - "properties": { - "daemons": { - "type": "object", - "additionalProperties": {} - }, - "summary": { - "type": "string" - } - } - }, - "cephCephStatusServiceMap": { - "type": "object", - "properties": { - "epoch": { - "type": "integer", - "format": "int32" - }, - "modified": { - "type": "string" - }, - "services": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/cephCephStatusService" - } - } - } - }, - "cephClusterStatus": { - "type": "object", - "properties": { - "status": { - "$ref": "#/definitions/cephClusterStatusStatus" - } - } - }, - "cephClusterStatusStatus": { - "type": "string", - "enum": [ - "INSTALLED", - "POST_INSTALLED" - ], - "default": "INSTALLED" - }, - "cephClusterUser": { - "type": "object", - "properties": { - "entity": { - "type": "string", - "title": "entity, e.g: \"client.admin\"" - }, - "caps": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "user capabilities, e.g: {\"mon\": \"allow r\",\"osd\":\"allow rw pool=liverpool\"}" - }, - "key": { - "type": "string", - "title": "keyring" - } - } - }, - "cephClusterUsers": { - "type": "object", - "properties": { - "users": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephClusterUser" - } - } - } - }, - "cephConfigParam": { - "type": "object", - "properties": { - "name": { - "type": "string" - }, - "type": { - "$ref": "#/definitions/ConfigParamParamType" - }, - "level": { - "$ref": "#/definitions/ConfigParamConfigLevel" - }, - "desc": { - "type": "string" - }, - "longDesc": { - "type": "string" - }, - "defaultValue": { - "type": "string" - }, - "daemonDefault": { - "type": "string" - }, - "tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "services": { - "type": "array", - "items": { - "$ref": "#/definitions/ConfigParamServiceType" - } - }, - "seeAlso": { - "type": "array", - "items": { - "type": "string" - } - }, - "enumValues": { - "type": "array", - "items": { - "type": "string" - } - }, - "min": { - "type": "number", - "format": "double" - }, - "max": { - "type": "number", - "format": "double" - }, - "canUpdateAtRuntime": { - "type": "boolean" - }, - "flags": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "cephCreateClusterUserReq": { - "type": "object", - "properties": { - "capabilities": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "user capabilities, e.g: {\"mon\": \"allow r\",\"osd\":\"allow rw pool=liverpool\"}" - }, - "user_entity": { - "type": "string", - "title": "entity, e.g: \"client.admin\"" - }, - "import_data": { - "type": "string", - "format": "byte", - "title": "keyring file format - if import_data is set then other fields ignored" - } - } - }, - "cephCreateRuleRequest": { - "type": "object", - "properties": { - "deviceClass": { - "type": "string" - }, - "failureDomain": { - "type": "string" - }, - "name": { - "type": "string" - }, - "poolType": { - "$ref": "#/definitions/cephPoolType" - }, - "profile": { - "type": "string" - }, - "root": { - "type": "string" - } - }, - "title": "CREATE RULE" - }, - "cephCreateUserReq": { - "type": "object", - "properties": { - "email": { - "type": "string" - }, - "enabled": { - "type": "boolean" - }, - "name": { - "type": "string" - }, - "password": { - "type": "string" - }, - "pwdExpirationDate": { - "type": "string", - "format": "date-time" - }, - "pwdUpdateRequired": { - "type": "boolean" - }, - "roles": { - "type": "array", - "items": { - "type": "string" - } - }, - "username": { - "type": "string" - } - } - }, - "cephExportClusterUserReq": { - "type": "object", - "properties": { - "entities": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "cephExportClusterUserResp": { - "type": "object", - "properties": { - "data": { - "type": "string", - "format": "byte", - "title": "User key and capabilities in Ceph config file format" - } - } - }, - "cephGetCephOsdDumpResponse": { - "type": "object", - "properties": { - "epoch": { - "type": "integer", - "format": "int32" - }, - "fsid": { - "type": "string" - }, - "created": { - "type": "string", - "format": "date-time" - }, - "modified": { - "type": "string", - "format": "date-time" - }, - "lastUpChange": { - "type": "string", - "format": "date-time" - }, - "lastInChange": { - "type": "string", - "format": "date-time" - }, - "flags": { - "type": "string" - }, - "flagsNum": { - "type": "integer", - "format": "int32" - }, - "flagsSet": { - "type": "array", - "items": { - "type": "string" - } - }, - "crushVersion": { - "type": "integer", - "format": "int32" - }, - "fullRatio": { - "type": "number", - "format": "double" - }, - "backfillfullRatio": { - "type": "number", - "format": "double" - }, - "nearfullRatio": { - "type": "number", - "format": "double" - }, - "clusterSnapshot": { - "type": "string" - }, - "poolMax": { - "type": "integer", - "format": "int32" - }, - "maxOsd": { - "type": "integer", - "format": "int32" - }, - "requireMinCompatClient": { - "type": "string" - }, - "minCompatClient": { - "type": "string" - }, - "requireOsdRelease": { - "type": "string" - }, - "allowCrimson": { - "type": "boolean" - }, - "pools": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpPool" - } - }, - "osds": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpOsdInfo" - } - }, - "osdXinfo": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpOsdXInfo" - } - }, - "pgUpmap": { - "type": "array", - "items": {} - }, - "pgUpmapItems": { - "type": "array", - "items": {} - }, - "pgUpmapPrimaries": { - "type": "array", - "items": {} - }, - "pgTemp": { - "type": "array", - "items": {} - }, - "primaryTemp": { - "type": "array", - "items": {} - }, - "blocklist": { - "type": "object", - "additionalProperties": { - "type": "string", - "format": "date-time" - } - }, - "rangeBlocklist": { - "type": "object" - }, - "erasureCodeProfiles": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/cephOsdDumpErasureCodeProfile" - } - }, - "removedSnapsQueue": { - "type": "array", - "items": {} - }, - "newRemovedSnaps": { - "type": "array", - "items": {} - }, - "newPurgedSnaps": { - "type": "array", - "items": {} - }, - "crushNodeFlags": { - "type": "object" - }, - "deviceClassFlags": { - "type": "object" - }, - "stretchMode": { - "$ref": "#/definitions/cephOsdDumpStretchMode" - } - } - }, - "cephGetCephPgDumpResponse": { - "type": "object", - "properties": { - "pgReady": { - "type": "boolean" - }, - "pgMap": { - "$ref": "#/definitions/cephPGMap" - } - }, - "title": "PG DUMP" - }, - "cephGetCephStatusResponse": { - "type": "object", - "properties": { - "fsid": { - "type": "string" - }, - "health": { - "$ref": "#/definitions/cephCephStatusHealth" - }, - "electionEpoch": { - "type": "integer", - "format": "int32" - }, - "quorum": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - }, - "quorumNames": { - "type": "array", - "items": { - "type": "string" - } - }, - "quorumAge": { - "type": "integer", - "format": "int32" - }, - "monmap": { - "$ref": "#/definitions/cephCephStatusMonMap" - }, - "osdmap": { - "$ref": "#/definitions/cephCephStatusOSDMap" - }, - "pgmap": { - "$ref": "#/definitions/cephCephStatusPGMap" - }, - "fsmap": { - "$ref": "#/definitions/cephCephStatusFSMap" - }, - "mgrmap": { - "$ref": "#/definitions/cephCephStatusMgrMap" - }, - "servicemap": { - "$ref": "#/definitions/cephCephStatusServiceMap" - }, - "progressEvents": { - "type": "object" - } - } - }, - "cephListRulesResponse": { - "type": "object", - "properties": { - "rules": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephRule" - } - } - }, - "title": "LIST RULES" - }, - "cephLoginReq": { - "type": "object", - "properties": { - "username": { - "type": "string" - }, - "password": { - "type": "string" - } - } - }, - "cephLoginResp": { - "type": "object", - "properties": { - "token": { - "type": "string" - }, - "username": { - "type": "string" - }, - "pwdUpdateRequired": { - "type": "boolean" - }, - "pwdExpirationDate": { - "type": "string", - "format": "date-time" - }, - "sso": { - "type": "boolean" - }, - "permissions": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "object" - } - } - } - } - }, - "cephOSDStatsSum": { - "type": "object", - "properties": { - "upFrom": { - "type": "string", - "format": "int64" - }, - "seq": { - "type": "string", - "format": "int64" - }, - "numPgs": { - "type": "string", - "format": "int64" - }, - "numOsds": { - "type": "string", - "format": "int64" - }, - "numPerPoolOsds": { - "type": "string", - "format": "int64" - }, - "numPerPoolOmapOsds": { - "type": "string", - "format": "int64" - }, - "kb": { - "type": "string", - "format": "int64" - }, - "kbUsed": { - "type": "string", - "format": "int64" - }, - "kbUsedData": { - "type": "string", - "format": "int64" - }, - "kbUsedOmap": { - "type": "string", - "format": "int64" - }, - "kbUsedMeta": { - "type": "string", - "format": "int64" - }, - "kbAvail": { - "type": "string", - "format": "int64" - }, - "statfs": { - "$ref": "#/definitions/cephOSDStatsSumStatFs" - }, - "hbPeers": { - "type": "array", - "items": { - "type": "string", - "format": "int64" - } - }, - "snapTrimQueueLen": { - "type": "string", - "format": "int64" - }, - "numSnapTrimming": { - "type": "string", - "format": "int64" - }, - "numShardsRepaired": { - "type": "string", - "format": "int64" - }, - "opQueueAgeHist": { - "$ref": "#/definitions/cephOSDStatsSumOpQueueAgeHist" - }, - "perfStat": { - "$ref": "#/definitions/cephOSDStatsSumPerfStat" - }, - "alerts": { - "type": "array", - "items": { - "type": "string" - } - }, - "networkPingTimes": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOSDStatsSumNetworkPingTime" - } - } - } - }, - "cephOSDStatsSumNetworkPingTime": { - "type": "object", - "properties": { - "osd": { - "type": "string", - "format": "int64" - }, - "lastUpdate": { - "type": "string", - "format": "date-time" - }, - "interfaces": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOSDStatsSumNetworkPingTimeInterface" - } - } - } - }, - "cephOSDStatsSumNetworkPingTimeInterface": { - "type": "object", - "properties": { - "interfaceName": { - "type": "string" - }, - "average": { - "$ref": "#/definitions/cephOSDStatsSumNetworkPingTimeInterfaceAverage" - }, - "min": { - "$ref": "#/definitions/cephOSDStatsSumNetworkPingTimeInterfaceMin" - }, - "max": { - "$ref": "#/definitions/cephOSDStatsSumNetworkPingTimeInterfaceMax" - }, - "last": { - "type": "number", - "format": "double" - } - } - }, - "cephOSDStatsSumNetworkPingTimeInterfaceAverage": { - "type": "object", - "properties": { - "min1": { - "type": "number", - "format": "double" - }, - "min5": { - "type": "number", - "format": "double" - }, - "min15": { - "type": "number", - "format": "double" - } - } - }, - "cephOSDStatsSumNetworkPingTimeInterfaceMax": { - "type": "object", - "properties": { - "min1": { - "type": "number", - "format": "double" - }, - "min5": { - "type": "number", - "format": "double" - }, - "min15": { - "type": "number", - "format": "double" - } - } - }, - "cephOSDStatsSumNetworkPingTimeInterfaceMin": { - "type": "object", - "properties": { - "min1": { - "type": "number", - "format": "double" - }, - "min5": { - "type": "number", - "format": "double" - }, - "min15": { - "type": "number", - "format": "double" - } - } - }, - "cephOSDStatsSumOpQueueAgeHist": { - "type": "object", - "properties": { - "histogram": { - "type": "array", - "items": { - "type": "string", - "format": "int64" - } - }, - "upperBound": { - "type": "string", - "format": "int64" - } - } + "SearchConfigRequestSortField": { + "type": "string", + "enum": [ + "NAME", + "TYPE", + "LEVEL" + ], + "default": "NAME" }, - "cephOSDStatsSumPerfStat": { - "type": "object", - "properties": { - "commitLatencyMs": { - "type": "string", - "format": "int64" - }, - "applyLatencyMs": { - "type": "string", - "format": "int64" - }, - "commitLatencyNs": { - "type": "string", - "format": "int64" - }, - "applyLatencyNs": { - "type": "string", - "format": "int64" - } - } + "SearchConfigRequestSortOrder": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ], + "default": "ASC" }, - "cephOSDStatsSumStatFs": { + "UsersUpdateRoleBody": { "type": "object", "properties": { - "total": { - "type": "string", - "format": "int64" - }, - "available": { - "type": "string", - "format": "int64" - }, - "internallyReserved": { - "type": "string", - "format": "int64" - }, - "allocated": { - "type": "string", - "format": "int64" - }, - "dataStored": { - "type": "string", - "format": "int64" - }, - "dataCompressed": { - "type": "string", - "format": "int64" - }, - "dataCompressedAllocated": { - "type": "string", - "format": "int64" - }, - "dataCompressedOriginal": { - "type": "string", - "format": "int64" - }, - "omapAllocated": { - "type": "string", - "format": "int64" + "description": { + "type": "string" }, - "internalMetadata": { - "type": "string", - "format": "int64" + "scopes_permissions": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object" + } + } } } }, - "cephOsdDumpAddrVec": { + "UsersUserChangePasswordBody": { "type": "object", "properties": { - "type": { + "old_password": { "type": "string" }, - "addr": { + "new_password": { "type": "string" - }, - "nonce": { - "type": "string", - "format": "uint64" } } }, - "cephOsdDumpClusterAddrs": { + "cephCephMonDumpAddrVec": { "type": "object", "properties": { "addrvec": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/cephOsdDumpAddrVec" + "$ref": "#/definitions/cephCephMonDumpAddress" } } } }, - "cephOsdDumpErasureCodeProfile": { + "cephCephMonDumpAddress": { "type": "object", "properties": { - "k": { - "type": "string" - }, - "m": { + "type": { "type": "string" }, - "plugin": { + "addr": { "type": "string" }, - "technique": { - "type": "string" + "nonce": { + "type": "integer", + "format": "int32" } } }, - "cephOsdDumpHeartbeatAddrs": { + "cephCephMonDumpFeatures": { "type": "object", "properties": { - "addrvec": { + "persistent": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpAddrVec" + "type": "string" + } + }, + "optional": { + "type": "array", + "items": { + "type": "string" } } } }, - "cephOsdDumpHitSetParams": { + "cephCephMonDumpMonInfo": { "type": "object", "properties": { - "type": { + "rank": { + "type": "integer", + "format": "int32" + }, + "name": { "type": "string" - } - } - }, - "cephOsdDumpLastPgMergeMeta": { - "type": "object", - "properties": { - "sourcePgid": { + }, + "publicAddrs": { + "$ref": "#/definitions/cephCephMonDumpAddrVec" + }, + "addr": { "type": "string" }, - "readyEpoch": { - "type": "integer", - "format": "int32" + "publicAddr": { + "type": "string" }, - "lastEpochStarted": { + "priority": { "type": "integer", "format": "int32" }, - "lastEpochClean": { + "weight": { "type": "integer", "format": "int32" }, - "sourceVersion": { - "type": "string" - }, - "targetVersion": { + "crushLocation": { "type": "string" } } }, - "cephOsdDumpOsdInfo": { + "cephCephMonDumpResponse": { "type": "object", "properties": { - "osd": { + "epoch": { "type": "integer", "format": "int32" }, - "uuid": { + "fsid": { "type": "string" }, - "up": { - "type": "integer", - "format": "int32" - }, - "in": { - "type": "integer", - "format": "int32" - }, - "weight": { - "type": "number", - "format": "double" - }, - "primaryAffinity": { - "type": "number", - "format": "double" - }, - "lastCleanBegin": { - "type": "integer", - "format": "int32" - }, - "lastCleanEnd": { - "type": "integer", - "format": "int32" + "modified": { + "type": "string", + "format": "date-time" }, - "upFrom": { - "type": "integer", - "format": "int32" + "created": { + "type": "string", + "format": "date-time" }, - "upThru": { + "minMonRelease": { "type": "integer", "format": "int32" }, - "downAt": { - "type": "integer", - "format": "int32" + "minMonReleaseName": { + "type": "string" }, - "lostAt": { + "electionStrategy": { "type": "integer", "format": "int32" }, - "publicAddrs": { - "$ref": "#/definitions/cephOsdDumpPublicAddrs" - }, - "clusterAddrs": { - "$ref": "#/definitions/cephOsdDumpClusterAddrs" - }, - "heartbeatBackAddrs": { - "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" + "disallowedLeaders": { + "type": "string" }, - "heartbeatFrontAddrs": { - "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" + "stretchMode": { + "type": "boolean" }, - "publicAddr": { + "tiebreakerMon": { "type": "string" }, - "clusterAddr": { + "removedRanks": { "type": "string" }, - "heartbeatBackAddr": { - "type": "string" + "features": { + "$ref": "#/definitions/cephCephMonDumpFeatures" }, - "heartbeatFrontAddr": { - "type": "string" + "mons": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephCephMonDumpMonInfo" + } }, - "state": { + "quorum": { "type": "array", "items": { - "type": "string" + "type": "integer", + "format": "int32" } } } }, - "cephOsdDumpOsdXInfo": { + "cephCephStatusFSMap": { "type": "object", "properties": { - "osd": { + "epoch": { "type": "integer", "format": "int32" }, - "downStamp": { - "type": "string", - "format": "date-time" + "byRank": { + "type": "array", + "items": {} }, - "laggyProbability": { - "type": "number", - "format": "double" + "upStandby": { + "type": "integer", + "format": "int32" + } + } + }, + "cephCephStatusHealth": { + "type": "object", + "properties": { + "status": { + "type": "string" }, - "laggyInterval": { - "type": "number", - "format": "double" + "checks": { + "type": "object", + "additionalProperties": { + "type": "object" + } }, - "features": { - "type": "string", - "format": "uint64" + "mutes": { + "type": "array", + "items": {} + } + } + }, + "cephCephStatusMgrMap": { + "type": "object", + "properties": { + "available": { + "type": "boolean" }, - "oldWeight": { - "type": "number", - "format": "double" + "numStandbys": { + "type": "integer", + "format": "int32" }, - "lastPurgedSnapsScrub": { - "type": "string", - "format": "date-time" + "modules": { + "type": "array", + "items": { + "type": "string" + } }, - "deadEpoch": { - "type": "integer", - "format": "int32" + "services": { + "type": "object", + "additionalProperties": { + "type": "string" + } } } }, - "cephOsdDumpPool": { + "cephCephStatusMonMap": { "type": "object", "properties": { - "pool": { + "epoch": { "type": "integer", "format": "int32" }, - "poolName": { - "type": "string" - }, - "createTime": { - "type": "string", - "format": "date-time" - }, - "flags": { - "type": "string", - "format": "int64" - }, - "flagsNames": { + "minMonReleaseName": { "type": "string" }, - "type": { + "numMons": { "type": "integer", "format": "int32" - }, - "size": { + } + } + }, + "cephCephStatusOSDMap": { + "type": "object", + "properties": { + "epoch": { "type": "integer", "format": "int32" }, - "minSize": { + "numOsds": { "type": "integer", "format": "int32" }, - "crushRule": { + "numUpOsds": { "type": "integer", "format": "int32" }, - "peeringCrushBucketCount": { + "osdUpSince": { + "type": "string", + "format": "int64" + }, + "numInOsds": { "type": "integer", "format": "int32" }, - "peeringCrushBucketTarget": { + "osdInSince": { + "type": "string", + "format": "int64" + }, + "numRemappedPgs": { "type": "integer", "format": "int32" + } + } + }, + "cephCephStatusPGMap": { + "type": "object", + "properties": { + "pgsByState": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephCephStatusPGState" + } }, - "peeringCrushBucketBarrier": { + "numPgs": { "type": "integer", "format": "int32" }, - "peeringCrushBucketMandatoryMember": { + "numPools": { "type": "integer", "format": "int32" }, - "objectHash": { + "numObjects": { "type": "integer", "format": "int32" }, - "pgAutoscaleMode": { - "type": "string" + "dataBytes": { + "type": "string", + "format": "int64" }, - "pgNum": { - "type": "integer", - "format": "int32" + "bytesUsed": { + "type": "string", + "format": "int64" }, - "pgPlacementNum": { - "type": "integer", - "format": "int32" + "bytesAvail": { + "type": "string", + "format": "int64" }, - "pgPlacementNumTarget": { - "type": "integer", - "format": "int32" + "bytesTotal": { + "type": "string", + "format": "int64" + } + } + }, + "cephCephStatusPGState": { + "type": "object", + "properties": { + "stateName": { + "type": "string" }, - "pgNumTarget": { + "count": { "type": "integer", "format": "int32" + } + } + }, + "cephCephStatusService": { + "type": "object", + "properties": { + "daemons": { + "type": "object", + "additionalProperties": {} }, - "pgNumPending": { + "summary": { + "type": "string" + } + } + }, + "cephCephStatusServiceMap": { + "type": "object", + "properties": { + "epoch": { "type": "integer", "format": "int32" }, - "lastPgMergeMeta": { - "$ref": "#/definitions/cephOsdDumpLastPgMergeMeta" - }, - "lastChange": { - "type": "string" - }, - "lastForceOpResend": { + "modified": { "type": "string" }, - "lastForceOpResendPrenautilus": { - "type": "string" + "services": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/cephCephStatusService" + } + } + } + }, + "cephClusterStatus": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/cephClusterStatusStatus" + } + } + }, + "cephClusterStatusStatus": { + "type": "string", + "enum": [ + "INSTALLED", + "POST_INSTALLED" + ], + "default": "INSTALLED" + }, + "cephClusterUser": { + "type": "object", + "properties": { + "entity": { + "type": "string", + "title": "entity, e.g: \"client.admin\"" }, - "lastForceOpResendPreluminous": { - "type": "string" + "caps": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "user capabilities, e.g: {\"mon\": \"allow r\",\"osd\":\"allow rw pool=liverpool\"}" }, - "auid": { + "key": { "type": "string", - "format": "uint64" - }, - "snapMode": { + "title": "keyring" + } + } + }, + "cephClusterUsers": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephClusterUser" + } + } + } + }, + "cephConfigParam": { + "type": "object", + "properties": { + "name": { "type": "string" }, - "snapSeq": { - "type": "string", - "format": "uint64" + "type": { + "$ref": "#/definitions/ConfigParamParamType" }, - "snapEpoch": { - "type": "string", - "format": "uint64" + "level": { + "$ref": "#/definitions/ConfigParamConfigLevel" }, - "poolSnaps": { - "type": "array", - "items": {} + "desc": { + "type": "string" }, - "removedSnaps": { + "longDesc": { "type": "string" }, - "quotaMaxBytes": { - "type": "string", - "format": "uint64" + "defaultValue": { + "type": "string" }, - "quotaMaxObjects": { - "type": "string", - "format": "uint64" + "daemonDefault": { + "type": "string" }, - "tiers": { + "tags": { "type": "array", "items": { - "type": "integer", - "format": "int32" + "type": "string" } }, - "tierOf": { - "type": "integer", - "format": "int32" - }, - "readTier": { - "type": "integer", - "format": "int32" + "services": { + "type": "array", + "items": { + "$ref": "#/definitions/ConfigParamServiceType" + } }, - "writeTier": { - "type": "integer", - "format": "int32" + "seeAlso": { + "type": "array", + "items": { + "type": "string" + } }, - "cacheMode": { - "type": "string" + "enumValues": { + "type": "array", + "items": { + "type": "string" + } }, - "targetMaxBytes": { - "type": "string", - "format": "uint64" + "min": { + "type": "number", + "format": "double" }, - "targetMaxObjects": { - "type": "string", - "format": "uint64" + "max": { + "type": "number", + "format": "double" }, - "cacheTargetDirtyRatioMicro": { - "type": "string", - "format": "uint64" + "canUpdateAtRuntime": { + "type": "boolean" }, - "cacheTargetDirtyHighRatioMicro": { - "type": "string", - "format": "uint64" + "flags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "cephCreateClusterUserReq": { + "type": "object", + "properties": { + "capabilities": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "user capabilities, e.g: {\"mon\": \"allow r\",\"osd\":\"allow rw pool=liverpool\"}" }, - "cacheTargetFullRatioMicro": { + "user_entity": { "type": "string", - "format": "uint64" + "title": "entity, e.g: \"client.admin\"" }, - "cacheMinFlushAge": { + "import_data": { "type": "string", - "format": "uint64" + "format": "byte", + "title": "keyring file format - if import_data is set then other fields ignored" + } + } + }, + "cephCreateRuleRequest": { + "type": "object", + "properties": { + "deviceClass": { + "type": "string" }, - "cacheMinEvictAge": { - "type": "string", - "format": "uint64" + "failureDomain": { + "type": "string" }, - "erasureCodeProfile": { + "name": { "type": "string" }, - "hitSetParams": { - "$ref": "#/definitions/cephOsdDumpHitSetParams" + "poolType": { + "$ref": "#/definitions/cephPoolType" }, - "hitSetPeriod": { - "type": "string", - "format": "uint64" + "profile": { + "type": "string" }, - "hitSetCount": { - "type": "string", - "format": "uint64" + "root": { + "type": "string" + } + }, + "title": "CREATE RULE" + }, + "cephCreateUserReq": { + "type": "object", + "properties": { + "email": { + "type": "string" }, - "useGmtHitset": { + "enabled": { "type": "boolean" }, - "minReadRecencyForPromote": { - "type": "string", - "format": "uint64" - }, - "minWriteRecencyForPromote": { - "type": "string", - "format": "uint64" - }, - "hitSetGradeDecayRate": { - "type": "string", - "format": "uint64" - }, - "hitSetSearchLastN": { - "type": "string", - "format": "uint64" - }, - "gradeTable": { - "type": "array", - "items": {} + "name": { + "type": "string" }, - "stripeWidth": { - "type": "string", - "format": "uint64" + "password": { + "type": "string" }, - "expectedNumObjects": { + "pwdExpirationDate": { "type": "string", - "format": "uint64" + "format": "date-time" }, - "fastRead": { + "pwdUpdateRequired": { "type": "boolean" }, - "options": { - "type": "object" - }, - "applicationMetadata": { - "type": "object" + "roles": { + "type": "array", + "items": { + "type": "string" + } }, - "readBalance": { - "$ref": "#/definitions/cephOsdDumpReadBalance" + "username": { + "type": "string" } } }, - "cephOsdDumpPublicAddrs": { + "cephExportClusterUserReq": { "type": "object", "properties": { - "addrvec": { + "entities": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpAddrVec" + "type": "string" } } } }, - "cephOsdDumpReadBalance": { + "cephExportClusterUserResp": { "type": "object", "properties": { - "scoreActing": { - "type": "number", - "format": "double" + "data": { + "type": "string", + "format": "byte", + "title": "User key and capabilities in Ceph config file format" + } + } + }, + "cephGetCephOsdDumpResponse": { + "type": "object", + "properties": { + "epoch": { + "type": "integer", + "format": "int32" }, - "scoreStable": { - "type": "number", - "format": "double" + "fsid": { + "type": "string" }, - "optimalScore": { - "type": "number", - "format": "double" + "created": { + "type": "string", + "format": "date-time" }, - "rawScoreActing": { - "type": "number", - "format": "double" + "modified": { + "type": "string", + "format": "date-time" }, - "rawScoreStable": { - "type": "number", - "format": "double" + "lastUpChange": { + "type": "string", + "format": "date-time" }, - "primaryAffinityWeighted": { + "lastInChange": { + "type": "string", + "format": "date-time" + }, + "flags": { + "type": "string" + }, + "flagsNum": { + "type": "integer", + "format": "int32" + }, + "flagsSet": { + "type": "array", + "items": { + "type": "string" + } + }, + "crushVersion": { + "type": "integer", + "format": "int32" + }, + "fullRatio": { "type": "number", "format": "double" }, - "averagePrimaryAffinity": { + "backfillfullRatio": { "type": "number", "format": "double" }, - "averagePrimaryAffinityWeighted": { + "nearfullRatio": { "type": "number", "format": "double" - } - } - }, - "cephOsdDumpStretchMode": { - "type": "object", - "properties": { - "stretchModeEnabled": { + }, + "clusterSnapshot": { + "type": "string" + }, + "poolMax": { + "type": "integer", + "format": "int32" + }, + "maxOsd": { + "type": "integer", + "format": "int32" + }, + "requireMinCompatClient": { + "type": "string" + }, + "minCompatClient": { + "type": "string" + }, + "requireOsdRelease": { + "type": "string" + }, + "allowCrimson": { "type": "boolean" }, - "stretchBucketCount": { - "type": "integer", - "format": "int32" + "pools": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpPool" + } + }, + "osds": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpOsdInfo" + } + }, + "osdXinfo": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpOsdXInfo" + } + }, + "pgUpmap": { + "type": "array", + "items": {} }, - "degradedStretchMode": { - "type": "integer", - "format": "int32" + "pgUpmapItems": { + "type": "array", + "items": {} }, - "recoveringStretchMode": { - "type": "integer", - "format": "int32" + "pgUpmapPrimaries": { + "type": "array", + "items": {} }, - "stretchModeBucket": { - "type": "integer", - "format": "int32" - } - } - }, - "cephOsdStats": { - "type": "object", - "properties": { - "osd": { - "type": "string", - "format": "int64" + "pgTemp": { + "type": "array", + "items": {} }, - "upFrom": { - "type": "string", - "format": "int64" + "primaryTemp": { + "type": "array", + "items": {} }, - "seq": { - "type": "string", - "format": "int64" + "blocklist": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "date-time" + } }, - "numPgs": { - "type": "string", - "format": "int64" + "rangeBlocklist": { + "type": "object" }, - "numOsds": { - "type": "string", - "format": "int64" + "erasureCodeProfiles": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/cephOsdDumpErasureCodeProfile" + } }, - "numPerPoolOsds": { - "type": "string", - "format": "int64" + "removedSnapsQueue": { + "type": "array", + "items": {} }, - "numPerPoolOmapOsds": { - "type": "string", - "format": "int64" + "newRemovedSnaps": { + "type": "array", + "items": {} }, - "kb": { - "type": "string", - "format": "int64" + "newPurgedSnaps": { + "type": "array", + "items": {} }, - "kbUsed": { - "type": "string", - "format": "int64" + "crushNodeFlags": { + "type": "object" }, - "kbUsedData": { - "type": "string", - "format": "int64" + "deviceClassFlags": { + "type": "object" }, - "kbUsedOmap": { - "type": "string", - "format": "int64" + "stretchMode": { + "$ref": "#/definitions/cephOsdDumpStretchMode" + } + } + }, + "cephGetCephStatusResponse": { + "type": "object", + "properties": { + "fsid": { + "type": "string" }, - "kbUsedMeta": { - "type": "string", - "format": "int64" + "health": { + "$ref": "#/definitions/cephCephStatusHealth" }, - "kbAvail": { - "type": "string", - "format": "int64" + "electionEpoch": { + "type": "integer", + "format": "int32" }, - "statfs": { - "$ref": "#/definitions/cephOsdStatsStatFs" + "quorum": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } }, - "hbPeers": { + "quorumNames": { "type": "array", "items": { - "type": "string", - "format": "int64" + "type": "string" } }, - "snapTrimQueueLen": { - "type": "string", - "format": "int64" + "quorumAge": { + "type": "integer", + "format": "int32" }, - "numSnapTrimming": { - "type": "string", - "format": "int64" + "monmap": { + "$ref": "#/definitions/cephCephStatusMonMap" }, - "numShardsRepaired": { - "type": "string", - "format": "int64" + "osdmap": { + "$ref": "#/definitions/cephCephStatusOSDMap" + }, + "pgmap": { + "$ref": "#/definitions/cephCephStatusPGMap" }, - "opQueueAgeHist": { - "$ref": "#/definitions/cephOsdStatsOpQueueAgeHist" + "fsmap": { + "$ref": "#/definitions/cephCephStatusFSMap" }, - "perfStat": { - "$ref": "#/definitions/cephOsdStatsPerfStat" + "mgrmap": { + "$ref": "#/definitions/cephCephStatusMgrMap" }, - "alerts": { - "type": "array", - "items": { - "type": "string" - } + "servicemap": { + "$ref": "#/definitions/cephCephStatusServiceMap" }, - "networkPingTimes": { + "progressEvents": { + "type": "object" + } + } + }, + "cephListRulesResponse": { + "type": "object", + "properties": { + "rules": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/cephOsdStatsNetworkPingTime" + "$ref": "#/definitions/cephRule" } } - } + }, + "title": "LIST RULES" }, - "cephOsdStatsNetworkPingTime": { + "cephLoginReq": { "type": "object", "properties": { - "osd": { - "type": "string", - "format": "int64" - }, - "lastUpdate": { + "username": { "type": "string" }, - "interfaces": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdStatsNetworkPingTimeInterface" - } + "password": { + "type": "string" } } }, - "cephOsdStatsNetworkPingTimeInterface": { + "cephLoginResp": { "type": "object", "properties": { - "interfaceName": { + "token": { "type": "string" }, - "average": { - "$ref": "#/definitions/cephOsdStatsNetworkPingTimeInterfaceAverage" + "username": { + "type": "string" }, - "min": { - "$ref": "#/definitions/cephOsdStatsNetworkPingTimeInterfaceMin" + "pwdUpdateRequired": { + "type": "boolean" }, - "max": { - "$ref": "#/definitions/cephOsdStatsNetworkPingTimeInterfaceMax" + "pwdExpirationDate": { + "type": "string", + "format": "date-time" }, - "last": { - "type": "number", - "format": "double" + "sso": { + "type": "boolean" + }, + "permissions": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object" + } + } } } }, - "cephOsdStatsNetworkPingTimeInterfaceAverage": { + "cephOsdDumpAddrVec": { "type": "object", "properties": { - "min1": { - "type": "number", - "format": "double" + "type": { + "type": "string" }, - "min5": { - "type": "number", - "format": "double" + "addr": { + "type": "string" }, - "min15": { - "type": "number", - "format": "double" + "nonce": { + "type": "string", + "format": "uint64" } } }, - "cephOsdStatsNetworkPingTimeInterfaceMax": { + "cephOsdDumpClusterAddrs": { "type": "object", "properties": { - "min1": { - "type": "number", - "format": "double" - }, - "min5": { - "type": "number", - "format": "double" - }, - "min15": { - "type": "number", - "format": "double" + "addrvec": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpAddrVec" + } } } }, - "cephOsdStatsNetworkPingTimeInterfaceMin": { + "cephOsdDumpErasureCodeProfile": { "type": "object", "properties": { - "min1": { - "type": "number", - "format": "double" + "k": { + "type": "string" }, - "min5": { - "type": "number", - "format": "double" + "m": { + "type": "string" }, - "min15": { - "type": "number", - "format": "double" + "plugin": { + "type": "string" + }, + "technique": { + "type": "string" } } }, - "cephOsdStatsOpQueueAgeHist": { + "cephOsdDumpHeartbeatAddrs": { "type": "object", "properties": { - "histogram": { + "addrvec": { "type": "array", "items": { - "type": "string", - "format": "int64" + "type": "object", + "$ref": "#/definitions/cephOsdDumpAddrVec" } - }, - "upperBound": { - "type": "string", - "format": "int64" } } }, - "cephOsdStatsPerfStat": { + "cephOsdDumpHitSetParams": { "type": "object", "properties": { - "commitLatencyMs": { - "type": "string", - "format": "int64" + "type": { + "type": "string" + } + } + }, + "cephOsdDumpLastPgMergeMeta": { + "type": "object", + "properties": { + "sourcePgid": { + "type": "string" + }, + "readyEpoch": { + "type": "integer", + "format": "int32" }, - "applyLatencyMs": { - "type": "string", - "format": "int64" + "lastEpochStarted": { + "type": "integer", + "format": "int32" }, - "commitLatencyNs": { - "type": "string", - "format": "int64" + "lastEpochClean": { + "type": "integer", + "format": "int32" }, - "applyLatencyNs": { - "type": "string", - "format": "int64" + "sourceVersion": { + "type": "string" + }, + "targetVersion": { + "type": "string" } } }, - "cephOsdStatsStatFs": { + "cephOsdDumpOsdInfo": { "type": "object", "properties": { - "total": { - "type": "string", - "format": "int64" + "osd": { + "type": "integer", + "format": "int32" }, - "available": { - "type": "string", - "format": "int64" + "uuid": { + "type": "string" }, - "internallyReserved": { - "type": "string", - "format": "int64" + "up": { + "type": "integer", + "format": "int32" }, - "allocated": { - "type": "string", - "format": "int64" + "in": { + "type": "integer", + "format": "int32" }, - "dataStored": { - "type": "string", - "format": "int64" + "weight": { + "type": "number", + "format": "double" }, - "dataCompressed": { - "type": "string", - "format": "int64" + "primaryAffinity": { + "type": "number", + "format": "double" }, - "dataCompressedAllocated": { - "type": "string", - "format": "int64" + "lastCleanBegin": { + "type": "integer", + "format": "int32" }, - "dataCompressedOriginal": { - "type": "string", - "format": "int64" + "lastCleanEnd": { + "type": "integer", + "format": "int32" }, - "omapAllocated": { - "type": "string", - "format": "int64" + "upFrom": { + "type": "integer", + "format": "int32" }, - "internalMetadata": { - "type": "string", - "format": "int64" - } - } - }, - "cephPGMap": { - "type": "object", - "properties": { - "version": { - "type": "string", - "format": "int64" + "upThru": { + "type": "integer", + "format": "int32" }, - "stamp": { - "type": "string", - "format": "date-time" + "downAt": { + "type": "integer", + "format": "int32" }, - "lastOsdmapEpoch": { - "type": "string", - "format": "int64" + "lostAt": { + "type": "integer", + "format": "int32" }, - "lastPgScan": { - "type": "string", - "format": "int64" + "publicAddrs": { + "$ref": "#/definitions/cephOsdDumpPublicAddrs" }, - "pgStatsSum": { - "$ref": "#/definitions/cephPGStatsSum" + "clusterAddrs": { + "$ref": "#/definitions/cephOsdDumpClusterAddrs" + }, + "heartbeatBackAddrs": { + "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" }, - "osdStatsSum": { - "$ref": "#/definitions/cephOSDStatsSum" + "heartbeatFrontAddrs": { + "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" }, - "pgStatsDelta": { - "$ref": "#/definitions/cephPGStatsDelta" + "publicAddr": { + "type": "string" }, - "pgStats": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephPGStat" - } + "clusterAddr": { + "type": "string" }, - "poolStats": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephPoolStats" - } + "heartbeatBackAddr": { + "type": "string" }, - "osdStats": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdStats" - } + "heartbeatFrontAddr": { + "type": "string" }, - "poolStatfs": { + "state": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/cephPoolStatFs" + "type": "string" } } } }, - "cephPGStat": { + "cephOsdDumpOsdXInfo": { "type": "object", "properties": { - "pgid": { - "type": "string" - }, - "version": { - "type": "string" - }, - "reportedSeq": { - "type": "string", - "format": "int64" - }, - "reportedEpoch": { - "type": "string", - "format": "int64" - }, - "state": { - "type": "string" - }, - "lastFresh": { - "type": "string", - "format": "date-time" + "osd": { + "type": "integer", + "format": "int32" }, - "lastChange": { + "downStamp": { "type": "string", "format": "date-time" }, - "lastActive": { - "type": "string", - "format": "date-time" + "laggyProbability": { + "type": "number", + "format": "double" }, - "lastPeered": { - "type": "string", - "format": "date-time" + "laggyInterval": { + "type": "number", + "format": "double" }, - "lastClean": { + "features": { "type": "string", - "format": "date-time" + "format": "uint64" }, - "lastBecameActive": { - "type": "string", - "format": "date-time" + "oldWeight": { + "type": "number", + "format": "double" }, - "lastBecamePeered": { + "lastPurgedSnapsScrub": { "type": "string", "format": "date-time" }, - "lastUnstale": { - "type": "string", - "format": "date-time" + "deadEpoch": { + "type": "integer", + "format": "int32" + } + } + }, + "cephOsdDumpPool": { + "type": "object", + "properties": { + "pool": { + "type": "integer", + "format": "int32" }, - "lastUndegraded": { - "type": "string", - "format": "date-time" + "poolName": { + "type": "string" }, - "lastFullsized": { + "createTime": { "type": "string", "format": "date-time" }, - "mappingEpoch": { + "flags": { "type": "string", "format": "int64" }, - "logStart": { + "flagsNames": { "type": "string" }, - "ondiskLogStart": { - "type": "string" + "type": { + "type": "integer", + "format": "int32" }, - "created": { - "type": "string", - "format": "int64" + "size": { + "type": "integer", + "format": "int32" }, - "lastEpochClean": { - "type": "string", - "format": "int64" + "minSize": { + "type": "integer", + "format": "int32" }, - "parent": { - "type": "string" + "crushRule": { + "type": "integer", + "format": "int32" }, - "parentSplitBits": { - "type": "string", - "format": "int64" + "peeringCrushBucketCount": { + "type": "integer", + "format": "int32" }, - "lastScrub": { - "type": "string" + "peeringCrushBucketTarget": { + "type": "integer", + "format": "int32" }, - "lastScrubStamp": { - "type": "string", - "format": "date-time" + "peeringCrushBucketBarrier": { + "type": "integer", + "format": "int32" }, - "lastDeepScrub": { - "type": "string" + "peeringCrushBucketMandatoryMember": { + "type": "integer", + "format": "int32" }, - "lastDeepScrubStamp": { - "type": "string", - "format": "date-time" + "objectHash": { + "type": "integer", + "format": "int32" }, - "lastCleanScrubStamp": { - "type": "string", - "format": "date-time" + "pgAutoscaleMode": { + "type": "string" }, - "objectsScrubbed": { - "type": "string", - "format": "int64" + "pgNum": { + "type": "integer", + "format": "int32" }, - "logSize": { - "type": "string", - "format": "int64" + "pgPlacementNum": { + "type": "integer", + "format": "int32" }, - "logDupsSize": { - "type": "string", - "format": "int64" + "pgPlacementNumTarget": { + "type": "integer", + "format": "int32" }, - "ondiskLogSize": { - "type": "string", - "format": "int64" + "pgNumTarget": { + "type": "integer", + "format": "int32" }, - "statsInvalid": { - "type": "boolean" + "pgNumPending": { + "type": "integer", + "format": "int32" + }, + "lastPgMergeMeta": { + "$ref": "#/definitions/cephOsdDumpLastPgMergeMeta" }, - "dirtyStatsInvalid": { - "type": "boolean" + "lastChange": { + "type": "string" }, - "omapStatsInvalid": { - "type": "boolean" + "lastForceOpResend": { + "type": "string" }, - "hitsetStatsInvalid": { - "type": "boolean" + "lastForceOpResendPrenautilus": { + "type": "string" }, - "hitsetBytesStatsInvalid": { - "type": "boolean" + "lastForceOpResendPreluminous": { + "type": "string" }, - "pinStatsInvalid": { - "type": "boolean" + "auid": { + "type": "string", + "format": "uint64" }, - "manifestStatsInvalid": { - "type": "boolean" + "snapMode": { + "type": "string" }, - "snaptrimqLen": { + "snapSeq": { "type": "string", - "format": "int64" + "format": "uint64" }, - "lastScrubDuration": { + "snapEpoch": { "type": "string", - "format": "int64" + "format": "uint64" }, - "scrubSchedule": { - "type": "string" + "poolSnaps": { + "type": "array", + "items": {} }, - "scrubDuration": { - "type": "number", - "format": "double" + "removedSnaps": { + "type": "string" }, - "objectsTrimmed": { + "quotaMaxBytes": { "type": "string", - "format": "int64" - }, - "snaptrimDuration": { - "type": "number", - "format": "double" + "format": "uint64" }, - "statSum": { - "$ref": "#/definitions/PGStatPGStat_StatSum" + "quotaMaxObjects": { + "type": "string", + "format": "uint64" }, - "up": { + "tiers": { "type": "array", "items": { - "type": "string", - "format": "int64" + "type": "integer", + "format": "int32" } }, - "acting": { - "type": "array", - "items": { - "type": "string", - "format": "int64" - } + "tierOf": { + "type": "integer", + "format": "int32" }, - "availNoMissing": { - "type": "array", - "items": { - "type": "string", - "format": "int64" - } + "readTier": { + "type": "integer", + "format": "int32" }, - "objectLocationCounts": { - "type": "array", - "items": { - "type": "string", - "format": "int64" - } + "writeTier": { + "type": "integer", + "format": "int32" }, - "blockedBy": { - "type": "array", - "items": { - "type": "string", - "format": "int64" - } + "cacheMode": { + "type": "string" }, - "upPrimary": { + "targetMaxBytes": { "type": "string", - "format": "int64" + "format": "uint64" }, - "actingPrimary": { + "targetMaxObjects": { "type": "string", - "format": "int64" - }, - "purgedSnaps": { - "type": "array", - "items": { - "type": "string", - "format": "int64" - } - } - } - }, - "cephPGStatsDelta": { - "type": "object", - "properties": { - "statSum": { - "$ref": "#/definitions/PGStatsDeltaPGStatsDelta_StatSum" - }, - "storeStats": { - "$ref": "#/definitions/PGStatsDeltaPGStatsDelta_StoreStats" + "format": "uint64" }, - "logSize": { + "cacheTargetDirtyRatioMicro": { "type": "string", - "format": "int64" + "format": "uint64" }, - "ondiskLogSize": { + "cacheTargetDirtyHighRatioMicro": { "type": "string", - "format": "int64" + "format": "uint64" }, - "up": { + "cacheTargetFullRatioMicro": { "type": "string", - "format": "int64" + "format": "uint64" }, - "acting": { + "cacheMinFlushAge": { "type": "string", - "format": "int64" + "format": "uint64" }, - "numStoreStats": { + "cacheMinEvictAge": { "type": "string", - "format": "int64" + "format": "uint64" }, - "stampDelta": { + "erasureCodeProfile": { "type": "string" - } - } - }, - "cephPGStatsSum": { - "type": "object", - "properties": { - "statSum": { - "$ref": "#/definitions/PGStatsSumPGStatsSum_StatSum" - }, - "storeStats": { - "$ref": "#/definitions/PGStatsSumPGStatsSum_StoreStats" - }, - "logSize": { - "type": "string", - "format": "int64" }, - "ondiskLogSize": { - "type": "string", - "format": "int64" + "hitSetParams": { + "$ref": "#/definitions/cephOsdDumpHitSetParams" }, - "up": { + "hitSetPeriod": { "type": "string", - "format": "int64" + "format": "uint64" }, - "acting": { + "hitSetCount": { "type": "string", - "format": "int64" + "format": "uint64" }, - "numStoreStats": { - "type": "string", - "format": "int64" - } - } - }, - "cephPoolStatFs": { - "type": "object", - "properties": { - "poolid": { - "type": "string", - "format": "int64" + "useGmtHitset": { + "type": "boolean" }, - "osd": { + "minReadRecencyForPromote": { "type": "string", - "format": "int64" + "format": "uint64" }, - "total": { + "minWriteRecencyForPromote": { "type": "string", - "format": "int64" + "format": "uint64" }, - "available": { + "hitSetGradeDecayRate": { "type": "string", - "format": "int64" + "format": "uint64" }, - "internallyReserved": { + "hitSetSearchLastN": { "type": "string", - "format": "int64" + "format": "uint64" }, - "allocated": { - "type": "string", - "format": "int64" + "gradeTable": { + "type": "array", + "items": {} }, - "dataStored": { + "stripeWidth": { "type": "string", - "format": "int64" + "format": "uint64" }, - "dataCompressed": { + "expectedNumObjects": { "type": "string", - "format": "int64" + "format": "uint64" }, - "dataCompressedAllocated": { - "type": "string", - "format": "int64" + "fastRead": { + "type": "boolean" }, - "dataCompressedOriginal": { - "type": "string", - "format": "int64" + "options": { + "type": "object" }, - "omapAllocated": { - "type": "string", - "format": "int64" + "applicationMetadata": { + "type": "object" }, - "internalMetadata": { - "type": "string", - "format": "int64" + "readBalance": { + "$ref": "#/definitions/cephOsdDumpReadBalance" } } }, - "cephPoolStats": { + "cephOsdDumpPublicAddrs": { "type": "object", "properties": { - "poolid": { - "type": "string", - "format": "int64" + "addrvec": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpAddrVec" + } + } + } + }, + "cephOsdDumpReadBalance": { + "type": "object", + "properties": { + "scoreActing": { + "type": "number", + "format": "double" }, - "numPg": { - "type": "string", - "format": "int64" + "scoreStable": { + "type": "number", + "format": "double" }, - "statSum": { - "$ref": "#/definitions/PoolStatsPoolStats_StatSum" + "optimalScore": { + "type": "number", + "format": "double" }, - "storeStats": { - "$ref": "#/definitions/PoolStatsPoolStats_StoreStats" + "rawScoreActing": { + "type": "number", + "format": "double" }, - "logSize": { - "type": "string", - "format": "int64" + "rawScoreStable": { + "type": "number", + "format": "double" }, - "ondiskLogSize": { - "type": "string", - "format": "int64" + "primaryAffinityWeighted": { + "type": "number", + "format": "double" }, - "up": { - "type": "string", - "format": "int64" + "averagePrimaryAffinity": { + "type": "number", + "format": "double" }, - "acting": { - "type": "string", - "format": "int64" + "averagePrimaryAffinityWeighted": { + "type": "number", + "format": "double" + } + } + }, + "cephOsdDumpStretchMode": { + "type": "object", + "properties": { + "stretchModeEnabled": { + "type": "boolean" }, - "numStoreStats": { - "type": "string", - "format": "int64" + "stretchBucketCount": { + "type": "integer", + "format": "int32" + }, + "degradedStretchMode": { + "type": "integer", + "format": "int32" + }, + "recoveringStretchMode": { + "type": "integer", + "format": "int32" + }, + "stretchModeBucket": { + "type": "integer", + "format": "int32" } } }, @@ -4463,7 +2684,7 @@ } } }, - "googlerpcStatus": { + "googleRpcStatus": { "type": "object", "properties": { "code": { diff --git a/docker-compose-test.yaml b/docker-compose-test.yaml deleted file mode 100644 index 05a1922..0000000 --- a/docker-compose-test.yaml +++ /dev/null @@ -1,53 +0,0 @@ -version: "3" - -services: - ceph: - logging: - driver: "none" - privileged: true - restart: always - image: quay.io/ceph/demo:${CEPH_DEMO_TAG:-main-985bb83-main-centos-arm64-stream8-aarch64} # for ARM - # image: quay.io/ceph/demo # alternative image not for ARM - command: demo - environment: - MON_IP: 192.168.55.2 - CEPH_PUBLIC_NETWORK: 192.168.55.0/24 - LANG: en_US.utf8 - OSD_TYPE: directory - volumes: - - ceph-conf:/etc/ceph - networks: - ceph-net-tst: - ipv4_address: "192.168.55.2" - api-test: - depends_on: - - ceph - deploy: - restart_policy: - condition: on-failure - delay: 2s - max_attempts: 5 - restart: always - volumes: - - ceph-conf:/etc/ceph - networks: - ceph-net-tst: - ipv4_address: "192.168.55.3" - build: - context: . - dockerfile: ./test/Dockerfile - -volumes: - # volume to share ceph creds between services - ceph-conf: - driver: local - driver_opts: - o: "size=128m,uid=1000,mode=777" - device: tmpfs - type: tmpfs -networks: - ceph-net-tst: - ipam: - driver: default - config: - - subnet: 192.168.55.0/24 diff --git a/go.mod b/go.mod index 389894c..59f5b46 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/clyso/ceph-api -go 1.21 +go 1.25.6 require ( github.com/ceph/go-ceph v0.26.0 @@ -8,103 +8,373 @@ require ( github.com/golang/protobuf v1.5.4 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 - github.com/mattn/go-colorable v0.1.13 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 + github.com/mattn/go-colorable v0.1.14 // indirect github.com/mattn/go-isatty v0.0.20 // indirect github.com/ory/fosite v0.46.1 github.com/prometheus/client_golang v1.19.0 github.com/rs/zerolog v1.32.0 github.com/spf13/viper v1.18.2 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.11.1 github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 - go.opentelemetry.io/otel v1.24.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 + go.opentelemetry.io/otel v1.41.0 go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect - go.opentelemetry.io/otel/sdk v1.24.0 - go.opentelemetry.io/otel/trace v1.24.0 - golang.org/x/crypto v0.24.0 - golang.org/x/sync v0.7.0 - golang.org/x/sys v0.21.0 // indirect; indirect0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 - google.golang.org/grpc v1.65.0 - google.golang.org/protobuf v1.34.1 + go.opentelemetry.io/otel/sdk v1.41.0 + go.opentelemetry.io/otel/trace v1.41.0 + golang.org/x/crypto v0.51.0 + golang.org/x/sync v0.20.0 + golang.org/x/sys v0.44.0 // indirect; indirect0 + google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d + google.golang.org/grpc v1.79.3 + google.golang.org/protobuf v1.36.11 ) require ( + github.com/aws/aws-sdk-go v1.50.9 + github.com/docker/docker v28.5.2+incompatible + github.com/docker/go-connections v0.6.0 github.com/soheilhy/cmux v0.1.5 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 - golang.org/x/oauth2 v0.20.0 + github.com/testcontainers/testcontainers-go v0.41.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 + golang.org/x/oauth2 v0.35.0 ) require ( - cloud.google.com/go/compute/metadata v0.3.0 // indirect + 4d63.com/gocheckcompilerdirectives v1.3.0 // indirect + 4d63.com/gochecknoglobals v0.2.2 // indirect + buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.11-20250718181942-e35f9b667443.1 // indirect + buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 // indirect + buf.build/gen/go/bufbuild/registry/connectrpc/go v1.19.1-20260126144947-819582968857.2 // indirect + buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.11-20260126144947-819582968857.1 // indirect + buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.11-20241007202033-cf42259fcbfc.1 // indirect + buf.build/go/app v0.2.0 // indirect + buf.build/go/bufplugin v0.9.0 // indirect + buf.build/go/bufprivateusage v0.1.0 // indirect + buf.build/go/interrupt v1.1.0 // indirect + buf.build/go/protovalidate v1.1.3 // indirect + buf.build/go/protoyaml v0.6.0 // indirect + buf.build/go/spdx v0.2.0 // indirect + buf.build/go/standard v0.1.0 // indirect + cel.dev/expr v0.25.1 // indirect + charm.land/lipgloss/v2 v2.0.3 // indirect + cloud.google.com/go/compute/metadata v0.9.0 // indirect + codeberg.org/chavacava/garif v0.2.0 // indirect + codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect + connectrpc.com/connect v1.19.1 // indirect + connectrpc.com/otelconnect v0.9.0 // indirect + dario.cat/mergo v1.0.2 // indirect + dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect + dev.gaijin.team/go/golib v0.6.0 // indirect + github.com/4meepo/tagalign v1.4.3 // indirect + github.com/Abirdcfly/dupword v0.1.7 // indirect + github.com/AdminBenni/iota-mixing v1.0.0 // indirect + github.com/AlwxSin/noinlineerr v1.0.5 // indirect + github.com/Antonboom/errname v1.1.1 // indirect + github.com/Antonboom/nilnil v1.1.1 // indirect + github.com/Antonboom/testifylint v1.6.4 // indirect + github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect + github.com/BurntSushi/toml v1.6.0 // indirect + github.com/ClickHouse/clickhouse-go-linter v1.2.0 // indirect + github.com/Djarvur/go-err113 v0.1.1 // indirect + github.com/Masterminds/semver/v3 v3.5.0 // indirect + github.com/Microsoft/go-winio v0.6.2 // indirect + github.com/MirrexOne/unqueryvet v1.5.4 // indirect + github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect + github.com/alecthomas/chroma/v2 v2.24.1 // indirect + github.com/alecthomas/go-check-sumtype v0.3.1 // indirect + github.com/alexkohler/nakedret/v2 v2.0.6 // indirect + github.com/alexkohler/prealloc v1.1.0 // indirect + github.com/alfatraining/structtag v1.0.0 // indirect + github.com/alingse/asasalint v0.0.11 // indirect + github.com/alingse/nilnesserr v0.2.0 // indirect + github.com/antlr4-go/antlr/v4 v4.13.1 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect + github.com/ashanbrown/forbidigo/v2 v2.3.1 // indirect + github.com/ashanbrown/makezero/v2 v2.2.1 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/bkielbasa/cyclop v1.2.3 // indirect + github.com/blizzy78/varnamelen v0.8.0 // indirect + github.com/bombsimon/wsl/v4 v4.7.0 // indirect + github.com/bombsimon/wsl/v5 v5.8.0 // indirect + github.com/breml/bidichk v0.3.3 // indirect + github.com/breml/errchkjson v0.4.1 // indirect + github.com/bufbuild/buf v1.66.0 // indirect + github.com/bufbuild/protocompile v0.14.2-0.20260202185951-d02d3732d113 // indirect + github.com/bufbuild/protoplugin v0.0.0-20250218205857-750e09ce93e1 // indirect + github.com/butuzov/ireturn v0.4.1 // indirect + github.com/butuzov/mirror v1.3.0 // indirect + github.com/catenacyber/perfsprint v0.10.1 // indirect + github.com/ccojocar/zxcvbn-go v1.0.4 // indirect + github.com/cenkalti/backoff/v4 v4.3.0 // indirect + github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cespare/xxhash/v2 v2.3.0 // indirect + github.com/charithe/durationcheck v0.0.11 // indirect + github.com/charmbracelet/colorprofile v0.4.3 // indirect + github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 // indirect + github.com/charmbracelet/x/ansi v0.11.7 // indirect + github.com/charmbracelet/x/term v0.2.2 // indirect + github.com/charmbracelet/x/termios v0.1.1 // indirect + github.com/charmbracelet/x/windows v0.2.2 // indirect + github.com/ckaznocha/intrange v0.3.1 // indirect + github.com/cli/browser v1.3.0 // indirect + github.com/clipperhouse/displaywidth v0.11.0 // indirect + github.com/clipperhouse/uax29/v2 v2.7.0 // indirect + github.com/containerd/errdefs v1.0.0 // indirect + github.com/containerd/errdefs/pkg v0.3.0 // indirect + github.com/containerd/log v0.1.0 // indirect + github.com/containerd/platforms v0.2.1 // indirect + github.com/containerd/stargz-snapshotter/estargz v0.18.2 // indirect + github.com/cpuguy83/dockercfg v0.3.2 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/creack/pty v1.1.24 // indirect github.com/creasty/defaults v1.7.0 // indirect github.com/cristalhq/jwt/v4 v4.0.2 // indirect - github.com/dave/jennifer v1.7.0 // indirect + github.com/curioswitch/go-reassign v0.3.0 // indirect + github.com/daixiang0/gci v0.13.7 // indirect + github.com/dave/dst v0.27.3 // indirect + github.com/dave/jennifer v1.7.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/denis-tingaikin/go-header v0.5.0 // indirect github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/distribution/reference v0.6.0 // indirect + github.com/dlclark/regexp2 v1.12.0 // indirect + github.com/docker/cli v29.2.1+incompatible // indirect + github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/docker/docker-credential-helpers v0.9.5 // indirect + github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect + github.com/ebitengine/purego v0.10.0 // indirect github.com/ecordell/optgen v0.0.9 // indirect + github.com/ettle/strcase v0.2.0 // indirect + github.com/fatih/color v1.19.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect + github.com/firefart/nonamedreturns v1.0.6 // indirect github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fzipp/gocyclo v0.6.0 // indirect + github.com/ghostiam/protogetter v0.3.20 // indirect + github.com/go-critic/go-critic v0.14.3 // indirect github.com/go-jose/go-jose/v3 v3.0.3 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect + github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-toolsmith/astcast v1.1.0 // indirect + github.com/go-toolsmith/astcopy v1.1.0 // indirect + github.com/go-toolsmith/astequal v1.2.0 // indirect + github.com/go-toolsmith/astfmt v1.1.0 // indirect + github.com/go-toolsmith/astp v1.1.0 // indirect + github.com/go-toolsmith/strparse v1.1.0 // indirect + github.com/go-toolsmith/typep v1.1.0 // indirect + github.com/go-viper/mapstructure/v2 v2.5.0 // indirect + github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect github.com/gobuffalo/pop/v6 v6.1.1 // indirect + github.com/gobwas/glob v0.2.3 // indirect + github.com/godoc-lint/godoc-lint v0.11.2 // indirect + github.com/gofrs/flock v0.13.0 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.1 // indirect + github.com/golang/glog v1.2.5 // indirect github.com/golang/mock v1.6.0 // indirect + github.com/golangci/asciicheck v0.5.0 // indirect + github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 // indirect + github.com/golangci/go-printf-func-name v0.1.1 // indirect + github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect + github.com/golangci/golangci-lint/v2 v2.12.2 // indirect + github.com/golangci/golines v0.15.0 // indirect + github.com/golangci/misspell v0.8.0 // indirect + github.com/golangci/plugin-module-register v0.1.2 // indirect + github.com/golangci/revgrep v0.8.0 // indirect + github.com/golangci/rowserrcheck v0.0.0-20260419091836-c5f79b8a11ba // indirect + github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect + github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect + github.com/google/cel-go v0.27.0 // indirect + github.com/google/go-cmp v0.7.0 // indirect + github.com/google/go-containerregistry v0.21.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/gorilla/websocket v1.5.1 // indirect + github.com/gordonklaus/ineffassign v0.2.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/gostaticanalysis/analysisutil v0.7.1 // indirect + github.com/gostaticanalysis/comment v1.5.0 // indirect + github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect + github.com/gostaticanalysis/nilerr v0.1.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect + github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/go-version v1.9.0 // indirect + github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hexops/gotextdiff v1.0.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/magiconair/properties v1.8.7 // indirect + github.com/jdx/go-netrc v1.0.0 // indirect + github.com/jgautheron/goconst v1.10.0 // indirect + github.com/jjti/go-spancheck v0.6.5 // indirect + github.com/jmespath/go-jmespath v0.4.0 // indirect + github.com/julz/importas v0.2.0 // indirect + github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect + github.com/kisielk/errcheck v1.10.0 // indirect + github.com/kkHAIKE/contextcheck v1.1.6 // indirect + github.com/klauspost/compress v1.18.5 // indirect + github.com/klauspost/pgzip v1.2.6 // indirect + github.com/kulti/thelper v0.7.1 // indirect + github.com/kunwardeep/paralleltest v1.0.15 // indirect + github.com/lasiar/canonicalheader v1.1.2 // indirect + github.com/ldez/exptostd v0.4.5 // indirect + github.com/ldez/gomoddirectives v0.8.0 // indirect + github.com/ldez/grignotin v0.10.1 // indirect + github.com/ldez/structtags v0.6.1 // indirect + github.com/ldez/tagliatelle v0.7.2 // indirect + github.com/ldez/usetesting v0.5.0 // indirect + github.com/leonklingele/grouper v1.1.2 // indirect + github.com/lucasb-eyer/go-colorful v1.4.0 // indirect + github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/macabu/inamedparam v0.2.0 // indirect + github.com/magiconair/properties v1.8.10 // indirect + github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect + github.com/manuelarte/funcorder v0.6.0 // indirect + github.com/maratori/testableexamples v1.0.1 // indirect + github.com/maratori/testpackage v1.1.2 // indirect + github.com/matoous/godox v1.1.0 // indirect + github.com/mattn/go-runewidth v0.0.23 // indirect github.com/mattn/goveralls v0.0.12 // indirect + github.com/mgechev/revive v1.15.0 // indirect + github.com/mitchellh/go-homedir v1.1.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/moby/docker-image-spec v1.3.1 // indirect + github.com/moby/go-archive v0.2.0 // indirect + github.com/moby/patternmatcher v0.6.1 // indirect + github.com/moby/sys/sequential v0.6.0 // indirect + github.com/moby/sys/user v0.4.0 // indirect + github.com/moby/sys/userns v0.1.0 // indirect + github.com/moby/term v0.5.2 // indirect github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect + github.com/moricho/tparallel v0.3.2 // indirect + github.com/morikuni/aec v1.1.0 // indirect + github.com/muesli/cancelreader v0.2.2 // indirect + github.com/nakabonne/nestif v0.3.1 // indirect + github.com/nishanths/exhaustive v0.12.0 // indirect + github.com/nishanths/predeclared v0.2.2 // indirect + github.com/nunnatsa/ginkgolinter v0.23.0 // indirect + github.com/opencontainers/go-digest v1.0.0 // indirect + github.com/opencontainers/image-spec v1.1.1 // indirect github.com/openzipkin/zipkin-go v0.4.2 // indirect github.com/ory/go-acc v0.2.9-0.20230103102148-6b1c9a70dbbe // indirect github.com/ory/go-convenience v0.1.0 // indirect github.com/ory/x v0.0.616 // indirect - github.com/pelletier/go-toml/v2 v2.1.1 // indirect + github.com/pelletier/go-toml/v2 v2.3.1 // indirect + github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect github.com/prometheus/client_model v0.6.0 // indirect github.com/prometheus/common v0.50.0 // indirect github.com/prometheus/procfs v0.13.0 // indirect + github.com/quasilyte/go-ruleguard v0.4.5 // indirect + github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect + github.com/quasilyte/gogrep v0.5.0 // indirect + github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect + github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect + github.com/quic-go/qpack v0.6.0 // indirect + github.com/quic-go/quic-go v0.59.0 // indirect + github.com/raeperd/recvcheck v0.2.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rogpeppe/go-internal v1.14.1 // indirect + github.com/rs/cors v1.11.1 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + github.com/ryancurrah/gomodguard v1.4.1 // indirect + github.com/ryancurrah/gomodguard/v2 v2.1.3 // indirect + github.com/ryanrolds/sqlclosecheck v0.6.0 // indirect github.com/sagikazarmark/locafero v0.4.0 // indirect github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect + github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect + github.com/sashamelentyev/interfacebloat v1.1.0 // indirect + github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210414080842-5b05eb8ff761 // indirect - github.com/sirupsen/logrus v1.9.3 // indirect + github.com/securego/gosec/v2 v2.26.1 // indirect + github.com/segmentio/asm v1.2.1 // indirect + github.com/segmentio/encoding v0.5.3 // indirect + github.com/shirou/gopsutil/v4 v4.26.4 // indirect + github.com/sirupsen/logrus v1.9.4 // indirect + github.com/sivchari/containedctx v1.0.3 // indirect + github.com/sonatard/noctx v0.5.1 // indirect github.com/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.0 // indirect + github.com/sourcegraph/go-diff v0.8.0 // indirect + github.com/spf13/afero v1.15.0 // indirect github.com/spf13/cast v1.6.0 // indirect - github.com/spf13/cobra v1.8.0 // indirect - github.com/spf13/pflag v1.0.5 // indirect + github.com/spf13/cobra v1.10.2 // indirect + github.com/spf13/pflag v1.0.10 // indirect + github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect + github.com/stbenjam/no-sprintf-host-port v0.3.1 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/subosito/gotenv v1.6.0 // indirect + github.com/tetafro/godot v1.5.6 // indirect + github.com/tetratelabs/wazero v1.11.0 // indirect + github.com/tidwall/btree v1.8.1 // indirect + github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 // indirect + github.com/timonwong/loggercheck v0.11.0 // indirect + github.com/tklauser/go-sysconf v0.3.16 // indirect + github.com/tklauser/numcpus v0.11.0 // indirect + github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect + github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect + github.com/ultraware/funlen v0.2.0 // indirect + github.com/ultraware/whitespace v0.2.0 // indirect + github.com/uudashr/gocognit v1.2.1 // indirect + github.com/uudashr/iface v1.4.2 // indirect + github.com/vbatts/tar-split v0.12.2 // indirect + github.com/xen0n/gosmopolitan v1.3.0 // indirect + github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect + github.com/yagipy/maintidx v1.0.0 // indirect + github.com/yeya24/promlinter v0.3.0 // indirect + github.com/ykadowak/zerologlint v0.1.5 // indirect + github.com/yusufpapurcu/wmi v1.2.4 // indirect + gitlab.com/bosi/decorder v0.4.2 // indirect + go-simpler.org/musttag v0.14.0 // indirect + go-simpler.org/sloglint v0.12.0 // indirect + go.augendre.info/arangolint v0.4.0 // indirect + go.augendre.info/fatcontext v0.9.0 // indirect + go.lsp.dev/jsonrpc2 v0.10.0 // indirect + go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 // indirect + go.lsp.dev/protocol v0.12.0 // indirect + go.lsp.dev/uri v0.3.0 // indirect + go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.24.0 // indirect go.opentelemetry.io/contrib/propagators/jaeger v1.24.0 // indirect go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect go.opentelemetry.io/otel/exporters/zipkin v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/proto/otlp v1.1.0 // indirect + go.opentelemetry.io/otel/metric v1.41.0 // indirect + go.opentelemetry.io/proto/otlp v1.9.0 // indirect go.uber.org/multierr v1.11.0 // indirect - golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 // indirect - golang.org/x/mod v0.17.0 // indirect - golang.org/x/net v0.26.0 // indirect - golang.org/x/text v0.16.0 // indirect - golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 // indirect + go.uber.org/zap v1.27.1 // indirect + go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect + golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 // indirect + golang.org/x/mod v0.36.0 // indirect + golang.org/x/net v0.54.0 // indirect + golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 // indirect + golang.org/x/term v0.43.0 // indirect + golang.org/x/text v0.37.0 // indirect + golang.org/x/time v0.11.0 // indirect + golang.org/x/tools v0.45.0 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d // indirect + google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + honnef.co/go/tools v0.7.0 // indirect + mvdan.cc/gofumpt v0.9.2 // indirect + mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect + mvdan.cc/xurls/v2 v2.6.0 // indirect + pluginrpc.com/pluginrpc v0.5.0 // indirect +) + +tool ( + github.com/bufbuild/buf/cmd/buf + github.com/golangci/golangci-lint/v2/cmd/golangci-lint + github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway + github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2 + golang.org/x/tools/cmd/goimports + google.golang.org/grpc/cmd/protoc-gen-go-grpc + google.golang.org/protobuf/cmd/protoc-gen-go ) diff --git a/go.sum b/go.sum index c9a4dfc..3fe8ead 100644 --- a/go.sum +++ b/go.sum @@ -1,78 +1,316 @@ +4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A= +4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY= +4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU= +4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0= +buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.11-20250718181942-e35f9b667443.1 h1:zQ9C3e6FtwSZUFuKAQfpIKGFk5ZuRoGt5g35Bix55sI= +buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.11-20250718181942-e35f9b667443.1/go.mod h1:1Znr6gmYBhbxWUPRrrVnSLXQsz8bvFVw1HHJq2bI3VQ= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 h1:PMmTMyvHScV9Mn8wc6ASge9uRcHy0jtqPd+fM35LmsQ= +buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1/go.mod h1:tvtbpgaVXZX4g6Pn+AnzFycuRK3MOz5HJfEGeEllXYM= +buf.build/gen/go/bufbuild/registry/connectrpc/go v1.19.1-20260126144947-819582968857.2 h1:XPrWCd9ydEo5Ofv1aNJVJaxndMXLQjRO9vVzsJG3jL8= +buf.build/gen/go/bufbuild/registry/connectrpc/go v1.19.1-20260126144947-819582968857.2/go.mod h1:mpsjeEaxOYPIJV2cz4IagLghZufRvx+NPVtInjEeoQ8= +buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.11-20260126144947-819582968857.1 h1:Yreby6Ypa58wdQUEm9Fnc5g8n/jP487Dq3aK5yBYwfk= +buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.11-20260126144947-819582968857.1/go.mod h1:1JJi9jvOqRxSMa+JxiZSm57doB+db/1WYCIa2lHfc40= +buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.11-20241007202033-cf42259fcbfc.1 h1:iGPvEJltOXUMANWf0zajcRcbiOXLD90ZwPUFvbcuv6Q= +buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.11-20241007202033-cf42259fcbfc.1/go.mod h1:nWVKKRA29zdt4uvkjka3i/y4mkrswyWwiu0TbdX0zts= +buf.build/go/app v0.2.0 h1:NYaH13A+RzPb7M5vO8uZYZ2maBZI5+MS9A9tQm66fy8= +buf.build/go/app v0.2.0/go.mod h1:0XVOYemubVbxNXVY0DnsVgWeGkcbbAvjDa1fmhBC+Wo= +buf.build/go/bufplugin v0.9.0 h1:ktZJNP3If7ldcWVqh46XKeiYJVPxHQxCfjzVQDzZ/lo= +buf.build/go/bufplugin v0.9.0/go.mod h1:Z0CxA3sKQ6EPz/Os4kJJneeRO6CjPeidtP1ABh5jPPY= +buf.build/go/bufprivateusage v0.1.0 h1:SzCoCcmzS3zyXHEXHeSQhGI7OTkgtljoknLzsUz9Gg4= +buf.build/go/bufprivateusage v0.1.0/go.mod h1:GlCCJ3VVF7EqqU0CoRmo1FzAwwaKymEWSr+ty69xU5w= +buf.build/go/interrupt v1.1.0 h1:olBuhgv9Sav4/9pkSLoxgiOsZDgM5VhRhvRpn3DL0lE= +buf.build/go/interrupt v1.1.0/go.mod h1:ql56nXPG1oHlvZa6efNC7SKAQ/tUjS6z0mhJl0gyeRM= +buf.build/go/protovalidate v1.1.3 h1:m2GVEgQWd7rk+vIoAZ+f0ygGjvQTuqPQapBBdcpWVPE= +buf.build/go/protovalidate v1.1.3/go.mod h1:9XIuohWz+kj+9JVn3WQneHA5LZP50mjvneZMnbLkiIE= +buf.build/go/protoyaml v0.6.0 h1:Nzz1lvcXF8YgNZXk+voPPwdU8FjDPTUV4ndNTXN0n2w= +buf.build/go/protoyaml v0.6.0/go.mod h1:RgUOsBu/GYKLDSIRgQXniXbNgFlGEZnQpRAUdLAFV2Q= +buf.build/go/spdx v0.2.0 h1:IItqM0/cMxvFJJumcBuP8NrsIzMs/UYjp/6WSpq8LTw= +buf.build/go/spdx v0.2.0/go.mod h1:bXdwQFem9Si3nsbNy8aJKGPoaPi5DKwdeEp5/ArZ6w8= +buf.build/go/standard v0.1.0 h1:g98T9IyvAl0vS3Pq8iVk6Cvj2ZiFvoUJRtfyGa0120U= +buf.build/go/standard v0.1.0/go.mod h1:PiqpHz/7ZFq+kqvYhc/SK3lxFIB9N/aiH2CFC2JHIQg= +cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4= +cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4= +charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU= +charm.land/lipgloss/v2 v2.0.3/go.mod h1:7myLU9iG/3xluAWzpY/fSxYYHCgoKTie7laxk6ATwXA= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -cloud.google.com/go/compute/metadata v0.3.0 h1:Tz+eQXMEqDIKRsmY3cHTL6FVaynIjX2QxYC4trgAKZc= -cloud.google.com/go/compute/metadata v0.3.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k= +cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs= +cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10= +codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY= +codeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ= +codeberg.org/polyfloyd/go-errorlint v1.9.0 h1:VkdEEmA1VBpH6ecQoMR4LdphVI3fA4RrCh2an7YmodI= +codeberg.org/polyfloyd/go-errorlint v1.9.0/go.mod h1:GPRRu2LzVijNn4YkrZYJfatQIdS+TrcK8rL5Xs24qw8= +connectrpc.com/connect v1.19.1 h1:R5M57z05+90EfEvCY1b7hBxDVOUl45PrtXtAV2fOC14= +connectrpc.com/connect v1.19.1/go.mod h1:tN20fjdGlewnSFeZxLKb0xwIZ6ozc3OQs2hTXy4du9w= +connectrpc.com/otelconnect v0.9.0 h1:NggB3pzRC3pukQWaYbRHJulxuXvmCKCKkQ9hbrHAWoA= +connectrpc.com/otelconnect v0.9.0/go.mod h1:AEkVLjCPXra+ObGFCOClcJkNjS7zPaQSqvO0lCyjfZc= +dario.cat/mergo v1.0.2 h1:85+piFYR1tMbRrLcDwR18y4UKJ3aH1Tbzi24VRW1TK8= +dario.cat/mergo v1.0.2/go.mod h1:E/hbnu0NxMFBjpMIE34DRGLWqDy0g5FuKDhCb31ngxA= +dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y= +dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI= +dev.gaijin.team/go/golib v0.6.0 h1:v6nnznFTs4bppib/NyU1PQxobwDHwCXXl15P7DV5Zgo= +dev.gaijin.team/go/golib v0.6.0/go.mod h1:uY1mShx8Z/aNHWDyAkZTkX+uCi5PdX7KsG1eDQa2AVE= +github.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8= +github.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c= +github.com/Abirdcfly/dupword v0.1.7 h1:2j8sInznrje4I0CMisSL6ipEBkeJUJAmK1/lfoNGWrQ= +github.com/Abirdcfly/dupword v0.1.7/go.mod h1:K0DkBeOebJ4VyOICFdppB23Q0YMOgVafM0zYW0n9lF4= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6 h1:He8afgbRMd7mFxO99hRNu+6tazq8nFF9lIwo9JFroBk= +github.com/AdaLogics/go-fuzz-headers v0.0.0-20240806141605-e8a1dd7889d6/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= +github.com/AdminBenni/iota-mixing v1.0.0 h1:Os6lpjG2dp/AE5fYBPAA1zfa2qMdCAWwPMCgpwKq7wo= +github.com/AdminBenni/iota-mixing v1.0.0/go.mod h1:i4+tpAaB+qMVIV9OK3m4/DAynOd5bQFaOu+2AhtBCNY= +github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY= +github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc= +github.com/Antonboom/errname v1.1.1 h1:bllB7mlIbTVzO9jmSWVWLjxTEbGBVQ1Ff/ClQgtPw9Q= +github.com/Antonboom/errname v1.1.1/go.mod h1:gjhe24xoxXp0ScLtHzjiXp0Exi1RFLKJb0bVBtWKCWQ= +github.com/Antonboom/nilnil v1.1.1 h1:9Mdr6BYd8WHCDngQnNVV0b554xyisFioEKi30sksufQ= +github.com/Antonboom/nilnil v1.1.1/go.mod h1:yCyAmSw3doopbOWhJlVci+HuyNRuHJKIv6V2oYQa8II= +github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ= +github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= +github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk= +github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/ClickHouse/clickhouse-go-linter v1.2.0 h1:zbm174up3hTKjp0wKZVnTzRiG7tSF5XZF0FJG/MuCBI= +github.com/ClickHouse/clickhouse-go-linter v1.2.0/go.mod h1:pLorS7ffPTfuUV9M0SJgfHA/h/WQPQUk2FWG9x74cQ4= +github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g= +github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k= github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE= +github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= +github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= +github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU= +github.com/MirrexOne/unqueryvet v1.5.4 h1:38QOxShO7JmMWT+eCdDMbcUgGCOeJphVkzzRgyLJgsQ= +github.com/MirrexOne/unqueryvet v1.5.4/go.mod h1:fs9Zq6eh1LRIhsDIsxf9PONVUjYdFHdtkHIgZdJnyPU= +github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4= +github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo= +github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0= +github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k= +github.com/alecthomas/chroma/v2 v2.24.1 h1:m5ffpfZbIb++k8AqFEKy9uVgY12xIQtBsQlc6DfZJQM= +github.com/alecthomas/chroma/v2 v2.24.1/go.mod h1:l+ohZ9xRXIbGe7cIW+YZgOGbvuVLjMps/FYN/CwuabI= +github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU= +github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E= +github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs= +github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4= +github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ= +github.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q= +github.com/alexkohler/prealloc v1.1.0 h1:cKGRBqlXw5iyQGLYhrXrDlcHxugXpTq4tQ5c91wkf8M= +github.com/alexkohler/prealloc v1.1.0/go.mod h1:fT39Jge3bQrfA7nPMDngUfvUbQGQeJyGQnR+913SCig= +github.com/alfatraining/structtag v1.0.0 h1:2qmcUqNcCoyVJ0up879K614L9PazjBSFruTB0GOFjCc= +github.com/alfatraining/structtag v1.0.0/go.mod h1:p3Xi5SwzTi+Ryj64DqjLWz7XurHxbGsq6y3ubePJPus= +github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= +github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= +github.com/alingse/nilnesserr v0.2.0 h1:raLem5KG7EFVb4UIDAXgrv3N2JIaffeKNtcEXkEWd/w= +github.com/alingse/nilnesserr v0.2.0/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg= +github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ= +github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= +github.com/ashanbrown/forbidigo/v2 v2.3.1 h1:KAZijvQ7zeIBKbhikT4jCm0TLYXC4u78bTiLh/8JROI= +github.com/ashanbrown/forbidigo/v2 v2.3.1/go.mod h1:2QDkLTzU6TV937eFROamXrW92M3paehdae4HCDCOZCM= +github.com/ashanbrown/makezero/v2 v2.2.1 h1:A7uU8dgB1PA9aelTxHMfHIQ8Qev8AB3JLxJUBUsejqM= +github.com/ashanbrown/makezero/v2 v2.2.1/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY= +github.com/aws/aws-sdk-go v1.50.9 h1:yX66aKnEtRc/uNV/1EH8CudRT5aLwVwcSwTBphuVPt8= +github.com/aws/aws-sdk-go v1.50.9/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= 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/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= -github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w= +github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo= +github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= +github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ= +github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= +github.com/bombsimon/wsl/v5 v5.8.0 h1:JTkyfs4yl8SPejrCF2GdABXE+mO1WvM7iUYzRWlsxDs= +github.com/bombsimon/wsl/v5 v5.8.0/go.mod h1:AbOLsulgkqP4ZnitHf9gwPtCOGlrzkk0jb0uNxRSY0o= +github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE= +github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE= +github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg= +github.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s= +github.com/bufbuild/buf v1.66.0 h1:6kksYJpu6r45bvPJSTwNSwRqiAjrwB9YyU7skjNzFVo= +github.com/bufbuild/buf v1.66.0/go.mod h1:tWVlwtIPZ7kzlCB9D0hbbfrroT0GNCybPdPQXq1i1Ac= +github.com/bufbuild/protocompile v0.14.2-0.20260202185951-d02d3732d113 h1:nxt1QhP9rMQNFhHTdcNFwJ9wKCSdBjd28gz+qGDv4kM= +github.com/bufbuild/protocompile v0.14.2-0.20260202185951-d02d3732d113/go.mod h1:cxhE8h+14t0Yxq2H9MV/UggzQ1L0gh0t2tJobITWsBE= +github.com/bufbuild/protoplugin v0.0.0-20250218205857-750e09ce93e1 h1:V1xulAoqLqVg44rY97xOR+mQpD2N+GzhMHVwJ030WEU= +github.com/bufbuild/protoplugin v0.0.0-20250218205857-750e09ce93e1/go.mod h1:c5D8gWRIZ2HLWO3gXYTtUfw/hbJyD8xikv2ooPxnklQ= +github.com/butuzov/ireturn v0.4.1 h1:vWb3NO4t77iku/sjCQ/2pHTQeOmxEhjIriJqRLg1Y+I= +github.com/butuzov/ireturn v0.4.1/go.mod h1:q+DXKzTDV5guNuXLnIab9fKXizTn2miZHLhxH7V/GB4= +github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc= +github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI= +github.com/catenacyber/perfsprint v0.10.1 h1:u7Riei30bk46XsG8nknMhKLXG9BcXz3+3tl/WpKm0PQ= +github.com/catenacyber/perfsprint v0.10.1/go.mod h1:DJTGsi/Zufpuus6XPGJyKOTMELe347o6akPvWG9Zcsc= +github.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc= +github.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das= +github.com/cenkalti/backoff/v4 v4.3.0 h1:MyRJ/UdXutAwSAT+s3wNd7MfTIcy71VQueUuFK343L8= +github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= +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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/ceph/go-ceph v0.26.0 h1:LZoATo25ZH5aeL5t85BwIbrNLKCDfcDM+e0qV0cmwHY= github.com/ceph/go-ceph v0.26.0/go.mod h1:ISxb295GszZwtLPkeWi+L2uLYBVsqbsh0M104jZMOX4= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= 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/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk= +github.com/charithe/durationcheck v0.0.11/go.mod h1:x5iZaixRNl8ctbM+3B2RrPG5t856TxRyVQEnbIEM2X4= +github.com/charmbracelet/colorprofile v0.4.3 h1:QPa1IWkYI+AOB+fE+mg/5/4HRMZcaXex9t5KX76i20Q= +github.com/charmbracelet/colorprofile v0.4.3/go.mod h1:/zT4BhpD5aGFpqQQqw7a+VtHCzu+zrQtt1zhMt9mR4Q= +github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318 h1:OqDqxQZliC7C8adA7KjelW3OjtAxREfeHkNcd66wpeI= +github.com/charmbracelet/ultraviolet v0.0.0-20251205161215-1948445e3318/go.mod h1:Y6kE2GzHfkyQQVCSL9r2hwokSrIlHGzZG+71+wDYSZI= +github.com/charmbracelet/x/ansi v0.11.7 h1:kzv1kJvjg2S3r9KHo8hDdHFQLEqn4RBCb39dAYC84jI= +github.com/charmbracelet/x/ansi v0.11.7/go.mod h1:9qGpnAVYz+8ACONkZBUWPtL7lulP9No6p1epAihUZwQ= +github.com/charmbracelet/x/term v0.2.2 h1:xVRT/S2ZcKdhhOuSP4t5cLi5o+JxklsoEObBSgfgZRk= +github.com/charmbracelet/x/term v0.2.2/go.mod h1:kF8CY5RddLWrsgVwpw4kAa6TESp6EB5y3uxGLeCqzAI= +github.com/charmbracelet/x/termios v0.1.1 h1:o3Q2bT8eqzGnGPOYheoYS8eEleT5ZVNYNy8JawjaNZY= +github.com/charmbracelet/x/termios v0.1.1/go.mod h1:rB7fnv1TgOPOyyKRJ9o+AsTU/vK5WHJ2ivHeut/Pcwo= +github.com/charmbracelet/x/windows v0.2.2 h1:IofanmuvaxnKHuV04sC0eBy/smG6kIKrWG2/jYn2GuM= +github.com/charmbracelet/x/windows v0.2.2/go.mod h1:/8XtdKZzedat74NQFn0NGlGL4soHB0YQZrETF96h75k= +github.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs= +github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk= +github.com/cli/browser v1.3.0 h1:LejqCrpWr+1pRqmEPDGnTZOjsMe7sehifLynZJuqJpo= +github.com/cli/browser v1.3.0/go.mod h1:HH8s+fOAxjhQoBUAsKuPCbqUuxZDhQ2/aD+SzsEfBTk= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/clipperhouse/displaywidth v0.11.0 h1:lBc6kY44VFw+TDx4I8opi/EtL9m20WSEFgwIwO+UVM8= +github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3JhNl3dSqnGhOoSD/o0= +github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= +github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= +github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= +github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= +github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= +github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk= +github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= +github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= +github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= +github.com/containerd/stargz-snapshotter/estargz v0.18.2 h1:yXkZFYIzz3eoLwlTUZKz2iQ4MrckBxJjkmD16ynUTrw= +github.com/containerd/stargz-snapshotter/estargz v0.18.2/go.mod h1:XyVU5tcJ3PRpkA9XS2T5us6Eg35yM0214Y+wvrZTBrY= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= +github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= +github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= +github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= +github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA= github.com/creasty/defaults v1.7.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= github.com/cristalhq/jwt/v4 v4.0.2 h1:g/AD3h0VicDamtlM70GWGElp8kssQEv+5wYd7L9WOhU= github.com/cristalhq/jwt/v4 v4.0.2/go.mod h1:HnYraSNKDRag1DZP92rYHyrjyQHnVEHPNqesmzs+miQ= -github.com/dave/jennifer v1.7.0 h1:uRbSBH9UTS64yXbh4FrMHfgfY762RD+C7bUPKODpSJE= -github.com/dave/jennifer v1.7.0/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs= +github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88= +github.com/daixiang0/gci v0.13.7 h1:+0bG5eK9vlI08J+J/NWGbWPTNiXPG4WhNLJOkSxWITQ= +github.com/daixiang0/gci v0.13.7/go.mod h1:812WVN6JLFY9S6Tv76twqmNqevN0pa3SX3nih0brVzQ= +github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY= +github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc= +github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= +github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= 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/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= +github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= +github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= +github.com/dlclark/regexp2 v1.12.0 h1:0j4c5qQmnC6XOWNjP3PIXURXN2gWx76rd3KvgdPkCz8= +github.com/dlclark/regexp2 v1.12.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= +github.com/docker/cli v29.2.1+incompatible h1:n3Jt0QVCN65eiVBoUTZQM9mcQICCJt3akW4pKAbKdJg= +github.com/docker/cli v29.2.1+incompatible/go.mod h1:JLrzqnKDaYBop7H2jaqPtU4hHvMKP+vjCwu2uszcLI8= +github.com/docker/distribution v2.8.3+incompatible h1:AtKxIZ36LoNK51+Z6RpzLpddBirtxJnzDrHLEKxTAYk= +github.com/docker/distribution v2.8.3+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= +github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaftjlSWt4AFexzM= +github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY= +github.com/docker/docker-credential-helpers v0.9.5/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= +github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= +github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= +github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= +github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= +github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= +github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= github.com/ecordell/optgen v0.0.9 h1:kmRMqOkbNsWayOnZSk2m5SeGaOTOc7amfi+MAnaMOeI= github.com/ecordell/optgen v0.0.9/go.mod h1:+YZ4tk5pNGMoeH+Y4F4HeDDj0SLOlIgMMNae7az4h5g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= +github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= -github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47AQUwhrg8E= +github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= +github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/ghostiam/protogetter v0.3.20 h1:oW7OPFit2FxZOpmMRPP9FffU4uUpfeE/rEdE1f+MzD0= +github.com/ghostiam/protogetter v0.3.20/go.mod h1:FjIu5Yfs6FT391m+Fjp3fbAYJ6rkL/J6ySpZBfnODuI= +github.com/go-critic/go-critic v0.14.3 h1:5R1qH2iFeo4I/RJU8vTezdqs08Egi4u5p6vOESA0pog= +github.com/go-critic/go-critic v0.14.3/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= -github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ= -github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= +github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= +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-toolsmith/astcast v1.1.0 h1:+JN9xZV1A+Re+95pgnMgDboWNVnIMMQXwfBwLRPgSC8= +github.com/go-toolsmith/astcast v1.1.0/go.mod h1:qdcuFWeGGS2xX5bLM/c3U9lewg7+Zu4mr+xPwZIB4ZU= +github.com/go-toolsmith/astcopy v1.1.0 h1:YGwBN0WM+ekI/6SS6+52zLDEf8Yvp3n2seZITCUBt5s= +github.com/go-toolsmith/astcopy v1.1.0/go.mod h1:hXM6gan18VA1T/daUEHCFcYiW8Ai1tIwIzHY6srfEAw= +github.com/go-toolsmith/astequal v1.0.3/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astequal v1.1.0/go.mod h1:sedf7VIdCL22LD8qIvv7Nn9MuWJruQA/ysswh64lffQ= +github.com/go-toolsmith/astequal v1.2.0 h1:3Fs3CYZ1k9Vo4FzFhwwewC3CHISHDnVUPC4x0bI2+Cw= +github.com/go-toolsmith/astequal v1.2.0/go.mod h1:c8NZ3+kSFtFY/8lPso4v8LuJjdJiUFVnSuU3s0qrrDY= +github.com/go-toolsmith/astfmt v1.1.0 h1:iJVPDPp6/7AaeLJEruMsBUlOYCmvg0MoCfJprsOmcco= +github.com/go-toolsmith/astfmt v1.1.0/go.mod h1:OrcLlRwu0CuiIBp/8b5PYF9ktGVZUjlNMV634mhwuQ4= +github.com/go-toolsmith/astp v1.1.0 h1:dXPuCl6u2llURjdPLLDxJeZInAeZ0/eZwFJmqZMnpQA= +github.com/go-toolsmith/astp v1.1.0/go.mod h1:0T1xFGz9hicKs8Z5MfAqSUitoUYS30pDMsRVIDHs8CA= +github.com/go-toolsmith/pkgload v1.2.2 h1:0CtmHq/02QhxcF7E9N5LIFcYFsMR5rdovfqTtRKkgIk= +github.com/go-toolsmith/pkgload v1.2.2/go.mod h1:R2hxLNRKuAsiXCo2i5J6ZQPhnPMOVtU+f0arbFPWCus= +github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/strparse v1.1.0 h1:GAioeZUK9TGxnLS+qfdqNbA4z0SSm5zVNtCQiyP2Bvw= +github.com/go-toolsmith/strparse v1.1.0/go.mod h1:7ksGy58fsaQkGQlY8WVoBFNyEPMGuJin1rfoPS4lBSQ= +github.com/go-toolsmith/typep v1.1.0 h1:fIRYDyF+JywLfqzyhdiHzRop/GQDxxNhLGQ6gFUNHus= +github.com/go-toolsmith/typep v1.1.0/go.mod h1:fVIw+7zjdsMxDA3ITWnH1yOiw1rnTQKCsF/sk2H/qig= +github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPEgAXnvj1Ro= +github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= +github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY= +github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= github.com/gobuffalo/attrs v1.0.3/go.mod h1:KvDJCE0avbufqS0Bw3UV7RQynESY0jjod+572ctX4t8= github.com/gobuffalo/envy v1.10.2/go.mod h1:qGAGwdvDsaEtPhfBzb3o0SfDea8ByGn9j8bKmVft9z8= github.com/gobuffalo/fizz v1.14.4/go.mod h1:9/2fGNXNeIFOXEEgTPJwiK63e44RjG+Nc4hfMm1ArGM= @@ -90,7 +328,13 @@ github.com/gobuffalo/pop/v6 v6.1.1 h1:eUDBaZcb0gYrmFnKwpuTEUA7t5ZHqNfvS4POqJYXDZ github.com/gobuffalo/pop/v6 v6.1.1/go.mod h1:1n7jAmI1i7fxuXPZjZb0VBPQDbksRtCoFnrDV5IsvaI= github.com/gobuffalo/tags/v3 v3.1.4/go.mod h1:ArRNo3ErlHO8BtdA0REaZxijuWnWzF6PUXngmMXd2I0= github.com/gobuffalo/validate/v3 v3.3.3/go.mod h1:YC7FsbJ/9hW/VjQdmXPvFqvRis4vrRYFxr69WiNZw6g= +github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/godoc-lint/godoc-lint v0.11.2 h1:Bp0FkJWoSdNsBikdNgIcgtaoo+xz6I/Y9s5WSBQUeeM= +github.com/godoc-lint/godoc-lint v0.11.2/go.mod h1:iVpGdL1JCikNH2gGeAn3Hh+AgN5Gx/I/cxV+91L41jo= +github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= +github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= @@ -101,8 +345,8 @@ github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69 github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= -github.com/golang/glog v1.2.1/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= +github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I= +github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= @@ -111,32 +355,92 @@ github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5y github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw= github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/golangci/asciicheck v0.5.0 h1:jczN/BorERZwK8oiFBOGvlGPknhvq0bjnysTj4nUfo0= +github.com/golangci/asciicheck v0.5.0/go.mod h1:5RMNAInbNFw2krqN6ibBxN/zfRFa9S6tA1nPdM0l8qQ= +github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 h1:CbTB8KpqnViI6lIXxp03Oclc4VFHi3K4BWC1TacsZ+A= +github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202/go.mod h1:NUw9Zr2Sy7+HxzdjIULge71wI6yEg1lWQr7Evcu8K0E= +github.com/golangci/go-printf-func-name v0.1.1 h1:hIYTFJqAGp1iwoIfsNTpoq1xZAarogrvjO9AfiW3B4U= +github.com/golangci/go-printf-func-name v0.1.1/go.mod h1:Es64MpWEZbh0UBtTAICOZiB+miW53w/K9Or/4QogJss= +github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d h1:viFft9sS/dxoYY0aiOTsLKO2aZQAPT4nlQCsimGcSGE= +github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d/go.mod h1:ivJ9QDg0XucIkmwhzCDsqcnxxlDStoTl89jDMIoNxKY= +github.com/golangci/golangci-lint/v2 v2.12.2 h1:7+d1uY0bq1MU2UV3R5pW5Q7QWdcoq4naMRXM+gsJKrs= +github.com/golangci/golangci-lint/v2 v2.12.2/go.mod h1:opqHHuIcTG2R+4akzWMd4o1BnD9/1LcjICWOujr91U8= +github.com/golangci/golines v0.15.0 h1:Qnph25g8Y1c5fdo1X7GaRDGgnMHgnxh4Gk4VfPTtRx0= +github.com/golangci/golines v0.15.0/go.mod h1:AZjXd23tbHMpowhtnGlj9KCNsysj72aeZVVHnVcZx10= +github.com/golangci/misspell v0.8.0 h1:qvxQhiE2/5z+BVRo1kwYA8yGz+lOlu5Jfvtx2b04Jbg= +github.com/golangci/misspell v0.8.0/go.mod h1:WZyyI2P3hxPY2UVHs3cS8YcllAeyfquQcKfdeE9AFVg= +github.com/golangci/plugin-module-register v0.1.2 h1:e5WM6PO6NIAEcij3B053CohVp3HIYbzSuP53UAYgOpg= +github.com/golangci/plugin-module-register v0.1.2/go.mod h1:1+QGTsKBvAIvPvoY/os+G5eoqxWn70HYDm2uvUyGuVw= +github.com/golangci/revgrep v0.8.0 h1:EZBctwbVd0aMeRnNUsFogoyayvKHyxlV3CdUA46FX2s= +github.com/golangci/revgrep v0.8.0/go.mod h1:U4R/s9dlXZsg8uJmaR1GrloUr14D7qDl8gi2iPXJH8k= +github.com/golangci/rowserrcheck v0.0.0-20260419091836-c5f79b8a11ba h1:lqtcnSMDuuJdu/LrKWi5RJzpSNLOJXYe/nzQutTI5kg= +github.com/golangci/rowserrcheck v0.0.0-20260419091836-c5f79b8a11ba/go.mod h1:sCBNcpRmhJCtbFGz49+IM3ETTFf7QdJ30AeYCd43NKk= +github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e h1:ai0EfmVYE2bRA5htgAG9r7s3tHsfjIhN98WshBTJ9jM= +github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e/go.mod h1:Vrn4B5oR9qRwM+f54koyeH3yzphlecwERs0el27Fr/s= +github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e h1:gD6P7NEo7Eqtt0ssnqSJNNndxe69DOQ24A5h7+i3KpM= +github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e/go.mod h1:h+wZwLjUTJnm/P2rwlbJdRPZXOzaT36/FwnPnY2inzc= +github.com/google/cel-go v0.27.0 h1:e7ih85+4qVrBuqQWTW4FKSqZYokVuc3HnhH5keboFTo= +github.com/google/cel-go v0.27.0/go.mod h1:tTJ11FWqnhw5KKpnWpvW9CJC3Y9GK4EIS0WXnBbebzw= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +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/go-containerregistry v0.21.0 h1:ocqxUOczFwAZQBMNE7kuzfqvDe0VWoZxQMOesXreCDI= +github.com/google/go-containerregistry v0.21.0/go.mod h1:ctO5aCaewH4AK1AumSF5DPW+0+R+d2FmylMJdp5G7p0= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= +github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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/gordonklaus/ineffassign v0.2.0 h1:Uths4KnmwxNJNzq87fwQQDDnbNb7De00VOk9Nu0TySs= +github.com/gordonklaus/ineffassign v0.2.0/go.mod h1:TIpymnagPSexySzs7F9FnO1XFTy8IT3a59vmZp5Y9Lw= github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= -github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= -github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= +github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/comment v1.5.0 h1:X82FLl+TswsUMpMh17srGRuKaaXprTaytmEpgnKIDu8= +github.com/gostaticanalysis/comment v1.5.0/go.mod h1:V6eb3gpCv9GNVqb6amXzEUX3jXLVK/AdA+IrAMSqvEc= +github.com/gostaticanalysis/forcetypeassert v0.2.0 h1:uSnWrrUEYDr86OCxWa4/Tp2jeYDlogZiZHzGkWFefTk= +github.com/gostaticanalysis/forcetypeassert v0.2.0/go.mod h1:M5iPavzE9pPqWyeiVXSFghQjljW1+l/Uke3PXHS6ILY= +github.com/gostaticanalysis/nilerr v0.1.2 h1:S6nk8a9N8g062nsx63kUkF6AzbHGw7zzyHMcpu52xQU= +github.com/gostaticanalysis/nilerr v0.1.2/go.mod h1:A19UHhoY3y8ahoL7YKz6sdjDtduwTSI4CsymaC2htPA= +github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= +github.com/gostaticanalysis/testutil v0.5.0 h1:Dq4wT1DdTwTGCQQv3rl3IvD5Ld0E6HiY+3Zh0sUGqw8= +github.com/gostaticanalysis/testutil v0.5.0/go.mod h1:OLQSbuM6zw2EvCcXTz1lVq5unyoNft372msDY0nY5Hs= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1 h1:/c3QmbOGMGTOumP2iT/rCwB7b0QDGLKzqOmktBjT+Is= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.1/go.mod h1:5SN9VR2LTsRFsrEC6FHgRbTWrTHu6tqPeKxEQv15giM= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo= +github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw= github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= +github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaXPSCnA= +github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= +github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= +github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= +github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= @@ -180,11 +484,33 @@ github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dv github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= github.com/jandelgado/gcov2lcov v1.0.5 h1:rkBt40h0CVK4oCb8Dps950gvfd1rYvQ8+cWa346lVU0= github.com/jandelgado/gcov2lcov v1.0.5/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss= +github.com/jdx/go-netrc v1.0.0 h1:QbLMLyCZGj0NA8glAhxUpf1zDg6cxnWgMBbjq40W0gQ= +github.com/jdx/go-netrc v1.0.0/go.mod h1:Gh9eFQJnoTNIRHXl2j5bJXA1u84hQWJWgGh569zF3v8= +github.com/jgautheron/goconst v1.10.0 h1:Ptt+OoE4NaEWKhLrWrrN3IpZdGLiqaf7WLnEX/iv4Jw= +github.com/jgautheron/goconst v1.10.0/go.mod h1:0p+wv1lFOiUr0IlNNT1nrm6+8DB8u2sU6KHGzFRXHDc= +github.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8= +github.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU= +github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= +github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= +github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= +github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ= +github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY= +github.com/karamaru-alpha/copyloopvar v1.2.2 h1:yfNQvP9YaGQR7VaWLYcfZUlRP2eo2vhExWKxD/fP6q0= +github.com/karamaru-alpha/copyloopvar v1.2.2/go.mod h1:oY4rGZqZ879JkJMtX3RRkcXRkmUvH0x35ykgaKgsgJY= github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/errcheck v1.10.0 h1:Lvs/YAHP24YKg08LA8oDw2z9fJVme090RAXd90S+rrw= +github.com/kisielk/errcheck v1.10.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE= +github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg= +github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= +github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= +github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/parsers/json v0.1.0 h1:dzSZl5pf5bBcW0Acnu20Djleto19T0CfHcvZ14NJ6fU= @@ -203,19 +529,58 @@ github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/kulti/thelper v0.7.1 h1:fI8QITAoFVLx+y+vSyuLBP+rcVIB8jKooNSCT2EiI98= +github.com/kulti/thelper v0.7.1/go.mod h1:NsMjfQEy6sd+9Kfw8kCP61W1I0nerGSYSFnGaxQkcbs= +github.com/kunwardeep/paralleltest v1.0.15 h1:ZMk4Qt306tHIgKISHWFJAO1IDQJLc6uDyJMLyncOb6w= +github.com/kunwardeep/paralleltest v1.0.15/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk= +github.com/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= +github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= +github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ= +github.com/ldez/exptostd v0.4.5/go.mod h1:QRjHRMXJrCTIm9WxVNH6VW7oN7KrGSht69bIRwvdFsM= +github.com/ldez/gomoddirectives v0.8.0 h1:JqIuTtgvFC2RdH1s357vrE23WJF2cpDCPFgA/TWDGpk= +github.com/ldez/gomoddirectives v0.8.0/go.mod h1:jutzamvZR4XYJLr0d5Honycp4Gy6GEg2mS9+2YX3F1Q= +github.com/ldez/grignotin v0.10.1 h1:keYi9rYsgbvqAZGI1liek5c+jv9UUjbvdj3Tbn5fn4o= +github.com/ldez/grignotin v0.10.1/go.mod h1:UlDbXFCARrXbWGNGP3S5vsysNXAPhnSuBufpTEbwOas= +github.com/ldez/structtags v0.6.1 h1:bUooFLbXx41tW8SvkfwfFkkjPYvFFs59AAMgVg6DUBk= +github.com/ldez/structtags v0.6.1/go.mod h1:YDxVSgDy/MON6ariaxLF2X09bh19qL7MtGBN5MrvbdY= +github.com/ldez/tagliatelle v0.7.2 h1:KuOlL70/fu9paxuxbeqlicJnCspCRjH0x8FW+NfgYUk= +github.com/ldez/tagliatelle v0.7.2/go.mod h1:PtGgm163ZplJfZMZ2sf5nhUT170rSuPgBimoyYtdaSI= +github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc= +github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ= +github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= +github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= +github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4= +github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= +github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= github.com/luna-duclos/instrumentedsql v1.1.3/go.mod h1:9J1njvFds+zN7y85EDhN9XNQLANWwZt2ULeIC8yMNYs= -github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= -github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= +github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= +github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= +github.com/magiconair/properties v1.8.10/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= +github.com/manuelarte/embeddedstructfieldcheck v0.4.0 h1:3mAIyaGRtjK6EO9E73JlXLtiy7ha80b2ZVGyacxgfww= +github.com/manuelarte/embeddedstructfieldcheck v0.4.0/go.mod h1:z8dFSyXqp+fC6NLDSljRJeNQJJDWnY7RoWFzV3PC6UM= +github.com/manuelarte/funcorder v0.6.0 h1:0hBngc4fa1IgNiI65A7sFGkMvoMCc878RjqB5V7rWP0= +github.com/manuelarte/funcorder v0.6.0/go.mod h1:id3NDhXdQBmeqXH7eVC6Z89xS6JxvZ8kF9xUxpArU/g= +github.com/maratori/testableexamples v1.0.1 h1:HfOQXs+XgfeRBJ+Wz0XfH+FHnoY9TVqL6Fcevpzy4q8= +github.com/maratori/testableexamples v1.0.1/go.mod h1:XE2F/nQs7B9N08JgyRmdGjYVGqxWwClLPCGSQhXQSrQ= +github.com/maratori/testpackage v1.1.2 h1:ffDSh+AgqluCLMXhM19f/cpvQAKygKAJXFl9aUjmbqs= +github.com/maratori/testpackage v1.1.2/go.mod h1:8F24GdVDFW5Ew43Et02jamrVMNXLUNaOynhDssITGfc= +github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4= +github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= @@ -224,24 +589,70 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw= +github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/goveralls v0.0.12 h1:PEEeF0k1SsTjOBQ8FOmrOAoCu4ytuMaWCnWe94zxbCg= github.com/mattn/goveralls v0.0.12/go.mod h1:44ImGEUfmqH8bBtaMrYKsM65LXfNLWmwaxFGjZwgMSQ= +github.com/mgechev/revive v1.15.0 h1:vJ0HzSBzfNyPbHKolgiFjHxLek9KUijhqh42yGoqZ8Q= +github.com/mgechev/revive v1.15.0/go.mod h1:LlAKO3QQe9OJ0pVZzI2GPa8CbXGZ/9lNpCGvK4T/a8A= github.com/microcosm-cc/bluemonday v1.0.20/go.mod h1:yfBmMi8mxvaZut3Yytv+jTXRY8mxyjJ0/kQBTElld50= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= +github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= +github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= +github.com/moby/go-archive v0.2.0 h1:zg5QDUM2mi0JIM9fdQZWC7U8+2ZfixfTYoHL7rWUcP8= +github.com/moby/go-archive v0.2.0/go.mod h1:mNeivT14o8xU+5q1YnNrkQVpK+dnNe/K6fHqnTg4qPU= +github.com/moby/patternmatcher v0.6.1 h1:qlhtafmr6kgMIJjKJMDmMWq7WLkKIo23hsrpR3x084U= +github.com/moby/patternmatcher v0.6.1/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= +github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= +github.com/moby/sys/atomicwriter v0.1.0/go.mod h1:Ul8oqv2ZMNHOceF643P6FKPXeCmYtlQMvpizfsSoaWs= +github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU= +github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko= +github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs= +github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs= +github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g= +github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28= +github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ= +github.com/moby/term v0.5.2/go.mod h1:d3djjFCrjnB+fl8NJux+EJzu0msscUP+f8it8hPkFLc= 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/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= +github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= +github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= +github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= +github.com/morikuni/aec v1.1.0 h1:vBBl0pUnvi/Je71dsRrhMBtreIqNMYErSAbEeb8jrXQ= +github.com/morikuni/aec v1.1.0/go.mod h1:xDRgiq/iw5l+zkao76YTKzKttOp2cwPEne25HDkJnBw= +github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= +github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= +github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= +github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= +github.com/nishanths/exhaustive v0.12.0/go.mod h1:mEZ95wPIZW+x8kC4TgC+9YCUgiST7ecevsVDTgc2obs= +github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= +github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/nunnatsa/ginkgolinter v0.23.0 h1:x3o4DGYOWbBMP/VdNQKgSj+25aJKx2Pe6lHr8gBcgf8= +github.com/nunnatsa/ginkgolinter v0.23.0/go.mod h1:9qN1+0akwXEccwV1CAcCDfcoBlWXHB+ML9884pL4SZ4= github.com/nyaruka/phonenumbers v1.1.1 h1:fyoZmpLN2VCmAnc51XcrNOUVP2wT1ZzQl348ggIaXII= github.com/nyaruka/phonenumbers v1.1.1/go.mod h1:cGaEsOrLjIL0iKGqJR5Rfywy86dSkbApEpXuM9KySNA= github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM= github.com/oleiade/reflections v1.0.1/go.mod h1:rdFxbxq4QXVZWj0F+e9jqjDkc7dbp97vkRixKo2JR60= +github.com/onsi/ginkgo/v2 v2.28.2 h1:DTrMfpqxiNUyQ3Y0zhn1n3cOO2euFgQPYIpkWwxVFps= +github.com/onsi/ginkgo/v2 v2.28.2/go.mod h1:CLtbVInNckU3/+gC8LzkGUb9oF+e8W8TdUsxPwvdOgE= +github.com/onsi/gomega v1.39.1 h1:1IJLAad4zjPn2PsnhH70V4DKRFlrCzGBNrNaru+Vf28= +github.com/onsi/gomega v1.39.1/go.mod h1:hL6yVALoTOxeWudERyfppUcZXjMwIMLnuSfruD2lcfg= +github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U= +github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM= +github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= +github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/openzipkin/zipkin-go v0.4.2 h1:zjqfqHjUpPmB3c1GlCvvgsM1G4LkvqQbBDueDOCg/jA= github.com/openzipkin/zipkin-go v0.4.2/go.mod h1:ZeVkFjuuBiSy13y8vpSDCjMi9GoI3hPpCJSBx/EYFhY= @@ -257,8 +668,17 @@ github.com/ory/jsonschema/v3 v3.0.7 h1:GQ9qfZDiJqs4l2d3p56dozCChvejQFZyLKGHYzDzO github.com/ory/jsonschema/v3 v3.0.7/go.mod h1:g8c8YOtN4TrR2wYeMdT02GDmzJDI0fEW2nI26BECafY= github.com/ory/x v0.0.616 h1:iaojp7MvFW1cdirSZFK/XeuJvyhUEVXQdY61bmIOkzk= github.com/ory/x v0.0.616/go.mod h1:Fqxxc1Ks6a4vZuqWwr6TYAeUDh2SAvxXyrk9N7Hidbo= -github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= -github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= +github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= +github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= +github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE= +github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs= +github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo= +github.com/otiai10/mint v1.3.1/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc= +github.com/pelletier/go-toml/v2 v2.3.1 h1:MYEvvGnQjeNkRF1qUuGolNtNExTDwct51yp7olPtrEc= +github.com/pelletier/go-toml/v2 v2.3.1/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 h1:KPpdlQLZcHfTMQRi6bFQ7ogNO0ltFT4PmtwTLW4W+14= +github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -266,6 +686,8 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE 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/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= +github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -275,50 +697,107 @@ github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57 github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= +github.com/quasilyte/go-ruleguard v0.4.5 h1:AGY0tiOT5hJX9BTdx/xBdoCubQUAE2grkqY2lSwvZcA= +github.com/quasilyte/go-ruleguard v0.4.5/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE= +github.com/quasilyte/go-ruleguard/dsl v0.3.23 h1:lxjt5B6ZCiBeeNO8/oQsegE6fLeCzuMRoVWSkXC4uvY= +github.com/quasilyte/go-ruleguard/dsl v0.3.23/go.mod h1:KeCP03KrjuSO0H1kTuZQCWlQPulDV6YMIXmpQss17rU= +github.com/quasilyte/gogrep v0.5.0 h1:eTKODPXbI8ffJMN+W2aE0+oL0z/nh8/5eNdiO34SOAo= +github.com/quasilyte/gogrep v0.5.0/go.mod h1:Cm9lpz9NZjEoL1tgZ2OgeUKPIxL1meE7eo60Z6Sk+Ng= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 h1:TCg2WBOl980XxGFEZSS6KlBGIV0diGdySzxATTWoqaU= +github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= +github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= +github.com/quic-go/qpack v0.6.0 h1:g7W+BMYynC1LbYLSqRt8PBg5Tgwxn214ZZR34VIOjz8= +github.com/quic-go/qpack v0.6.0/go.mod h1:lUpLKChi8njB4ty2bFLX2x4gzDqXwUpaO1DP9qMDZII= +github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw= +github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU= +github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74UI= +github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ= -github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= +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/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= +github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb7Elr+g= +github.com/ryancurrah/gomodguard v1.4.1/go.mod h1:qnMJwV1hX9m+YJseXEBhd2s90+1Xn6x9dLz11ualI1I= +github.com/ryancurrah/gomodguard/v2 v2.1.3 h1:E7sz3PJwE9Ba1reVxSpF6XLCPJZ74Kfw/LabTNM4GIA= +github.com/ryancurrah/gomodguard/v2 v2.1.3/go.mod h1:CQicdLGatWMxLX53JzoBjYlsNZhHbmLv2AVa0s2aivU= +github.com/ryanrolds/sqlclosecheck v0.6.0 h1:pEyL9okISdg1F1SEpJNlrEotkTGerv5BMk7U4AG0eVg= +github.com/ryanrolds/sqlclosecheck v0.6.0/go.mod h1:xyX16hsDaCMXHrMJ3JMzGf5OpDfHTOTTQrT7HOFUmeU= github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= +github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= +github.com/santhosh-tekuri/jsonschema/v6 v6.0.2/go.mod h1:JXeL+ps8p7/KNMjDQk3TCwPpBy0wYklyWTfbkIzdIFU= +github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= +github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= +github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ= +github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210414080842-5b05eb8ff761 h1:0b8DF5kR0PhRoRXDiEEdzrgBc8UqVY4JWLkQJCRsLME= github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210414080842-5b05eb8ff761/go.mod h1:/THDZYi7F/BsVEcYzYPqdcWFQ+1C2InkawTKfLOAnzg= +github.com/securego/gosec/v2 v2.26.1 h1:gdkttGhQFVehqRJ8grKH4DrpqM/QlPKNHBnl8QgcEC4= +github.com/securego/gosec/v2 v2.26.1/go.mod h1:57UW4p0uoP3kxoTkhoo3axLdVAi+OWrLg/Ax/kdqtPE= +github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0= +github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= +github.com/segmentio/encoding v0.5.3 h1:OjMgICtcSFuNvQCdwqMCv9Tg7lEOXGwm1J5RPQccx6w= +github.com/segmentio/encoding v0.5.3/go.mod h1:HS1ZKa3kSN32ZHVZ7ZLPLXWvOVIiZtyJnO1gPH1sKt0= +github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/shirou/gopsutil/v4 v4.26.4 h1:B4SXVbcwTyrocPHEmWBC4uCYr4Xcu3MK1TXqbprAOWY= +github.com/shirou/gopsutil/v4 v4.26.4/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ= github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= -github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= -github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= +github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= +github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= +github.com/sivchari/containedctx v1.0.3/go.mod h1:c1RDvCbnJLtH4lLcYD/GqwiBSSf4F5Qk0xld2rBqzJ4= github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= +github.com/sonatard/noctx v0.5.1 h1:wklWg9c9ZYugOAk7qG4yP4PBrlQsmSLPTvW1K4PRQMs= +github.com/sonatard/noctx v0.5.1/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas= github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= +github.com/sourcegraph/go-diff v0.8.0 h1:ipIyu4cTsLbIrln4l0qtHA3r0a7gyK4ntKjtQytHhvY= +github.com/sourcegraph/go-diff v0.8.0/go.mod h1:hWlcO7Al+UZStZAP8rBumHpCK5ZHQ5BXsMls8p4+F5E= github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= -github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8= -github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY= +github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= -github.com/spf13/cobra v1.8.0 h1:7aJaZx1B85qltLMc546zn58BxxfZdR/W22ej9CFoEf0= -github.com/spf13/cobra v1.8.0/go.mod h1:WXLWApfZ71AjXPya3WOlMsY9yMs7YeiHhFVlvLyhcho= -github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= +github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= +github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= +github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= +github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= +github.com/stbenjam/no-sprintf-host-port v0.3.1/go.mod h1:ODbZesTCHMVKthBHskvUUexdcNHAQRXk9NpSsL8p/HQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= @@ -334,64 +813,140 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= -github.com/tidwall/gjson v1.14.3 h1:9jvXn7olKEHU1S9vwoMGliaT8jq1vJ7IH/n9zD9Dnlw= -github.com/tidwall/gjson v1.14.3/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= +github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA= +github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= +github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= +github.com/testcontainers/testcontainers-go v0.41.0 h1:mfpsD0D36YgkxGj2LrIyxuwQ9i2wCKAD+ESsYM1wais= +github.com/testcontainers/testcontainers-go v0.41.0/go.mod h1:pdFrEIfaPl24zmBjerWTTYaY0M6UHsqA1YSvsoU40MI= +github.com/tetafro/godot v1.5.6 h1:IEkrFCwXaYHlOn4mGzGS3F3dkP6m9t0jpwqBFPIkKiA= +github.com/tetafro/godot v1.5.6/go.mod h1:eOkMrVQurDui411nBY2FA05EYH01r14LuWY/NrVDVcU= +github.com/tetratelabs/wazero v1.11.0 h1:+gKemEuKCTevU4d7ZTzlsvgd1uaToIDtlQlmNbwqYhA= +github.com/tetratelabs/wazero v1.11.0/go.mod h1:eV28rsN8Q+xwjogd7f4/Pp4xFxO7uOGbLcD/LzB1wiU= +github.com/tidwall/btree v1.8.1 h1:27ehoXvm5AG/g+1VxLS1SD3vRhp/H7LuEfwNvddEdmA= +github.com/tidwall/btree v1.8.1/go.mod h1:jBbTdUWhSZClZWoDg54VnvV7/54modSOzDN7VXftj1A= +github.com/tidwall/gjson v1.18.0 h1:FIDeeyB800efLX89e5a8Y0BNH+LOngJyGrIWxG2FKQY= +github.com/tidwall/gjson v1.18.0/go.mod h1:/wbyibRr2FHMks5tjHJ5F8dMZh3AcwJEMf5vlfC0lxk= github.com/tidwall/match v1.1.1 h1:+Ho715JplO36QYgwN9PGYNhgZvoUSc9X2c80KVTi+GA= github.com/tidwall/match v1.1.1/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM= github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4= github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU= github.com/tidwall/sjson v1.2.5 h1:kLy8mja+1c9jlljvWTlSazM7cKDRfJuR/bOJhcY5NcY= github.com/tidwall/sjson v1.2.5/go.mod h1:Fvgq9kS/6ociJEDnK0Fk1cpYF4FIW6ZF7LAe+6jwd28= +github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 h1:SiHe5XLTn9sFWJ5pBwJ5FN/4j34q9ZlOAD//kMoMYp0= +github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4/go.mod h1:sDHLK7rb/59v/ZxZ7KtymgcoxuUMxjXq8gtu9VMOK8M= +github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M= +github.com/timonwong/loggercheck v0.11.0/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= +github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= +github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= +github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= +github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= +github.com/tomarrell/wrapcheck/v2 v2.12.0 h1:H/qQ1aNWz/eeIhxKAFvkfIA+N7YDvq6TWVFL27Of9is= +github.com/tomarrell/wrapcheck/v2 v2.12.0/go.mod h1:AQhQuZd0p7b6rfW+vUwHm5OMCGgp63moQ9Qr/0BpIWo= +github.com/tommy-muehle/go-mnd/v2 v2.5.1 h1:NowYhSdyE/1zwK9QCLeRb6USWdoif80Ie+v+yU8u1Zw= +github.com/tommy-muehle/go-mnd/v2 v2.5.1/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/ultraware/funlen v0.2.0 h1:gCHmCn+d2/1SemTdYMiKLAHFYxTYz7z9VIDRaTGyLkI= +github.com/ultraware/funlen v0.2.0/go.mod h1:ZE0q4TsJ8T1SQcjmkhN/w+MceuatI6pBFSxxyteHIJA= +github.com/ultraware/whitespace v0.2.0 h1:TYowo2m9Nfj1baEQBjuHzvMRbp19i+RCcRYrSWoFa+g= +github.com/ultraware/whitespace v0.2.0/go.mod h1:XcP1RLD81eV4BW8UhQlpaR+SDc2givTvyI8a586WjW8= github.com/urfave/negroni v1.0.0 h1:kIimOitoypq34K7TG7DUaJ9kq/N4Ofuwi1sjz0KipXc= github.com/urfave/negroni v1.0.0/go.mod h1:Meg73S6kFm/4PpbYdq35yYWoCZ9mS/YSx+lKnmiohz4= +github.com/uudashr/gocognit v1.2.1 h1:CSJynt5txTnORn/DkhiB4mZjwPuifyASC8/6Q0I/QS4= +github.com/uudashr/gocognit v1.2.1/go.mod h1:acaubQc6xYlXFEMb9nWX2dYBzJ/bIjEkc1zzvyIZg5Q= +github.com/uudashr/iface v1.4.2 h1:06Vq5RKVYThBsj0Bnw4oasMjD1r+7CE/bcKOA8dVSvg= +github.com/uudashr/iface v1.4.2/go.mod h1:pbeBPlbuU2qkNDn0mmfrxP2X+wjPMIQAy+r1MBXSXtg= +github.com/vbatts/tar-split v0.12.2 h1:w/Y6tjxpeiFMR47yzZPlPj/FcPLpXbTUi/9H7d3CPa4= +github.com/vbatts/tar-split v0.12.2/go.mod h1:eF6B6i6ftWQcDqEn3/iGFRFRo8cBIMSJVOpnNdfTMFA= +github.com/xen0n/gosmopolitan v1.3.0 h1:zAZI1zefvo7gcpbCOrPSHJZJYA9ZgLfJqtKzZ5pHqQM= +github.com/xen0n/gosmopolitan v1.3.0/go.mod h1:rckfr5T6o4lBtM1ga7mLGKZmLxswUoH1zxHgNXOsEt4= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e h1:JVG44RsyaB9T2KIHavMF/ppJZNG9ZpyihvCd0w101no= +github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e/go.mod h1:RbqR21r5mrJuqunuUZ/Dhy/avygyECGrLceyNeo4LiM= +github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= +github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= +github.com/yeya24/promlinter v0.3.0 h1:JVDbMp08lVCP7Y6NP3qHroGAO6z2yGKQtS5JsjqtoFs= +github.com/yeya24/promlinter v0.3.0/go.mod h1:cDfJQQYv9uYciW60QT0eeHlFodotkYZlL+YcPQN+mW4= +github.com/ykadowak/zerologlint v0.1.5 h1:Gy/fMz1dFQN9JZTPjv1hxEk+sRWm05row04Yoolgdiw= +github.com/ykadowak/zerologlint v0.1.5/go.mod h1:KaUskqF3e/v59oPmdq1U1DnKcuHokl2/K1U4pmIELKg= +github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= +github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= +gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= +gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= +go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ= +go-simpler.org/assert v0.9.0/go.mod h1:74Eqh5eI6vCK6Y5l3PI8ZYFXG4Sa+tkr70OIPJAUr28= +go-simpler.org/musttag v0.14.0 h1:XGySZATqQYSEV3/YTy+iX+aofbZZllJaqwFWs+RTtSo= +go-simpler.org/musttag v0.14.0/go.mod h1:uP8EymctQjJ4Z1kUnjX0u2l60WfUdQxCwSNKzE1JEOE= +go-simpler.org/sloglint v0.12.0 h1:UzWDlLWNE5FLqsvyq3tWYHuQMbqrervOhT8qPl4Mmw4= +go-simpler.org/sloglint v0.12.0/go.mod h1:jBjjC2bm8rYrs88oTRlFX497kWjJsyZWYoNaXkGRI6I= +go.augendre.info/arangolint v0.4.0 h1:xSCZjRoS93nXazBSg5d0OGCi9APPLNMmmLrC995tR50= +go.augendre.info/arangolint v0.4.0/go.mod h1:l+f/b4plABuFISuKnTGD4RioXiCCgghv2xqst/xOvAA= +go.augendre.info/fatcontext v0.9.0 h1:Gt5jGD4Zcj8CDMVzjOJITlSb9cEch54hjRRlN3qDojE= +go.augendre.info/fatcontext v0.9.0/go.mod h1:L94brOAT1OOUNue6ph/2HnwxoNlds9aXDF2FcUntbNw= +go.lsp.dev/jsonrpc2 v0.10.0 h1:Pr/YcXJoEOTMc/b6OTmcR1DPJ3mSWl/SWiU1Cct6VmI= +go.lsp.dev/jsonrpc2 v0.10.0/go.mod h1:fmEzIdXPi/rf6d4uFcayi8HpFP1nBF99ERP1htC72Ac= +go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2 h1:hCzQgh6UcwbKgNSRurYWSqh8MufqRRPODRBblutn4TE= +go.lsp.dev/pkg v0.0.0-20210717090340-384b27a52fb2/go.mod h1:gtSHRuYfbCT0qnbLnovpie/WEmqyJ7T4n6VXiFMBtcw= +go.lsp.dev/protocol v0.12.0 h1:tNprUI9klQW5FAFVM4Sa+AbPFuVQByWhP1ttNUAjIWg= +go.lsp.dev/protocol v0.12.0/go.mod h1:Qb11/HgZQ72qQbeyPfJbu3hZBH23s1sr4st8czGeDMQ= +go.lsp.dev/uri v0.3.0 h1:KcZJmh6nFIBeJzTugn5JTU6OOyG0lDOo3R9KwTxTYbo= +go.lsp.dev/uri v0.3.0/go.mod h1:P5sbO1IQR+qySTWOCnhnK7phBx+W3zbLqSMDJNTw88I= +go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= +go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 h1:RtcvQ4iw3w9NBB5yRwgA4sSa82rfId7n4atVpvKx3bY= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0/go.mod h1:f/PbKbRd4cdUICWell6DmzvVJ7QrmBgFrRHjXmAXbK4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= go.opentelemetry.io/contrib/propagators/b3 v1.24.0 h1:n4xwCdTx3pZqZs2CjS/CUZAs03y3dZcGhC/FepKtEUY= go.opentelemetry.io/contrib/propagators/b3 v1.24.0/go.mod h1:k5wRxKRU2uXx2F8uNJ4TaonuEO/V7/5xoz7kdsDACT8= go.opentelemetry.io/contrib/propagators/jaeger v1.24.0 h1:CKtIfwSgDvJmaWsZROcHzONZgmQdMYn9mVYWypOWT5o= go.opentelemetry.io/contrib/propagators/jaeger v1.24.0/go.mod h1:Q5JA/Cfdy/ta+5VeEhrMJRWGyS6UNRwFbl+yS3W1h5I= go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0 h1:Q9PrD94WoMolBx44ef5UWWvufpVSME0MiSymXZfedso= go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0/go.mod h1:tjp49JHNvreAAoWjdCHIVD7NXMjuJ3Dp/9iNOuPPlC8= -go.opentelemetry.io/otel v1.24.0 h1:0LAOdjNmQeSTzGBzduGe/rU4tZhMwL5rWgtp9Ku5Jfo= -go.opentelemetry.io/otel v1.24.0/go.mod h1:W7b9Ozg4nkF5tWI5zsXkaKKDjdVjpD4oAt9Qi/MArHo= +go.opentelemetry.io/otel v1.41.0 h1:YlEwVsGAlCvczDILpUXpIpPSL/VPugt7zHThEMLce1c= +go.opentelemetry.io/otel v1.41.0/go.mod h1:Yt4UwgEKeT05QbLwbyHXEwhnjxNO6D8L5PQP51/46dE= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0 h1:t6wl9SPayj+c7lEIFgm4ooDBZVb01IhLB4InpomhRw8= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.24.0/go.mod h1:iSDOcsnSA5INXzZtwaBPrKp/lWu/V14Dd+llD0oI2EA= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 h1:Xw8U6u2f8DK2XAkGRFV7BBLENgnTGX9i4rQRxJf+/vs= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0/go.mod h1:6KW1Fm6R/s6Z3PGXwSJN2K4eT6wQB3vXX6CVnYX9NmM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 h1:inYW9ZhgqiDqh6BioM7DVHHzEGVq76Db5897WLGZ5Go= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0/go.mod h1:Izur+Wt8gClgMJqO/cZ8wdeeMryJ/xxiOVgFSSfpDTY= go.opentelemetry.io/otel/exporters/zipkin v1.24.0 h1:3evrL5poBuh1KF51D9gO/S+N/1msnm4DaBqs/rpXUqY= go.opentelemetry.io/otel/exporters/zipkin v1.24.0/go.mod h1:0EHgD8R0+8yRhUYJOGR8Hfg2dpiJQxDOszd5smVO9wM= -go.opentelemetry.io/otel/metric v1.24.0 h1:6EhoGWWK28x1fbpA4tYTOWBkPefTDQnb8WSGXlc88kI= -go.opentelemetry.io/otel/metric v1.24.0/go.mod h1:VYhLe1rFfxuTXLgj4CBiyz+9WYBA8pNGJgDcSFRKBco= -go.opentelemetry.io/otel/sdk v1.24.0 h1:YMPPDNymmQN3ZgczicBY3B6sf9n62Dlj9pWD3ucgoDw= -go.opentelemetry.io/otel/sdk v1.24.0/go.mod h1:KVrIYw6tEubO9E96HQpcmpTKDVn9gdv35HoYiQWGDFg= -go.opentelemetry.io/otel/trace v1.24.0 h1:CsKnnL4dUAr/0llH9FKuc698G04IrpWV0MQA/Y1YELI= -go.opentelemetry.io/otel/trace v1.24.0/go.mod h1:HPc3Xr/cOApsBI154IU0OI0HJexz+aw5uPdbs3UCjNU= -go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI= -go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY= +go.opentelemetry.io/otel/metric v1.41.0 h1:rFnDcs4gRzBcsO9tS8LCpgR0dxg4aaxWlJxCno7JlTQ= +go.opentelemetry.io/otel/metric v1.41.0/go.mod h1:xPvCwd9pU0VN8tPZYzDZV/BMj9CM9vs00GuBjeKhJps= +go.opentelemetry.io/otel/sdk v1.41.0 h1:YPIEXKmiAwkGl3Gu1huk1aYWwtpRLeskpV+wPisxBp8= +go.opentelemetry.io/otel/sdk v1.41.0/go.mod h1:ahFdU0G5y8IxglBf0QBJXgSe7agzjE4GiTJ6HT9ud90= +go.opentelemetry.io/otel/sdk/metric v1.41.0 h1:siZQIYBAUd1rlIWQT2uCxWJxcCO7q3TriaMlf08rXw8= +go.opentelemetry.io/otel/sdk/metric v1.41.0/go.mod h1:HNBuSvT7ROaGtGI50ArdRLUnvRTRGniSUZbxiWxSO8Y= +go.opentelemetry.io/otel/trace v1.41.0 h1:Vbk2co6bhj8L59ZJ6/xFTskY+tGAbOnCtQGVVa9TIN0= +go.opentelemetry.io/otel/trace v1.41.0/go.mod h1:U1NU4ULCoxeDKc09yCWdWe+3QoyweJcISEVa1RBzOis= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= +go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= +go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -403,6 +958,12 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= +go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= +go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= +go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +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-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= @@ -415,11 +976,19 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= +golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225 h1:LfspQV/FYTatPTr/3HzIcmiUFH7PGP+OQ6mgDYo3yuQ= -golang.org/x/exp v0.0.0-20240222234643-814bf88cf225/go.mod h1:CxmFvTBINI24O/j8iY7H1xHzx2i4OsyguNBmN/uPtqc= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= +golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= +golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= +golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= +golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 h1:qWFG1Dj7TBjOjOvhEOkmyGPVoquqUKnIU0lEVLp8xyk= +golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358/go.mod h1:4Mzdyp/6jzw9auFDJ3OMF5qksa7UvPnzKqTVGcb04ms= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= @@ -428,12 +997,16 @@ golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKG golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 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/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= -golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= +golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= +golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= +golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -442,10 +1015,12 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= @@ -454,22 +1029,25 @@ golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= +golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.20.0 h1:4mQdhULixXKP1rwYBW0vAijoXnkTG0BLCDRzfe1idMo= -golang.org/x/oauth2 v0.20.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI= +golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= +golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 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-20200625203802-6e8e738ad208/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.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= +golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -478,17 +1056,24 @@ golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -501,8 +1086,14 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= +golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa h1:efT73AJZfAAUV7SOip6pWGkwJDzIGiKBZGVzHYa+ve4= +golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= +golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 h1:HjU6IWBiAgRIdAJ9/y1rwCn+UELEmwV+VsTLzj/W4sE= +golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6/go.mod h1:Eqhaxk/wZsWEH8CRxLwj6xzEJbz7k1EFGqx7nyCoabE= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= @@ -511,6 +1102,10 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= +golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= +golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= +golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= @@ -520,8 +1115,12 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= -golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= +golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= +golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= +golang.org/x/time v0.11.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= @@ -535,38 +1134,57 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= +golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.1-0.20210205202024-ef80cdb6ec6d/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= +golang.org/x/tools v0.1.1-0.20210302220138-2ac05c832e1a/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= -golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= +golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= +golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= +golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= +golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= +golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= +golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= +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/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157 h1:7whR9kGa5LUwFtpLm2ArCEejtnxlGeLbAyjFY8sGNFw= -google.golang.org/genproto/googleapis/api v0.0.0-20240528184218-531527333157/go.mod h1:99sLkeliLXfdj2J75X3Ho+rrVCaJze0uwN7zDDkjPVU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117 h1:1GBuWVLM/KMVUv1t1En5Gs+gFZCNd360GGb4sSxtrhU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240604185151-ef581f913117/go.mod h1:EfXuqaE1J41VCDicxHzUDm+8rk+7ZdXzHV0IhO/I6s0= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 h1:JLQynH/LBHfCTSbDWl+py8C+Rg/k1OVH3xfcaiANuF0= +google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:kSJwQxqmFXeo79zOmbrALdflXQeAYcUbgS7PbpMknCY= +google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d h1:EocjzKLywydp5uZ5tJ79iP6Q0UjDnyiHkGRWxuPBP8s= +google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:48U2I+QQUYhsFrg2SY6r+nJzeOtjey7j//WBESw+qyQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 h1:mWPCjDEyshlQYzBpMNHaEof6UX1PmHcaUODUywQ0uac= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d h1:t/LOSXPJ9R0B6fnZNyALBRfZBH0Uy0gT+uR+SJ6syqQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.65.0 h1:bs/cUb4lp1G5iImFFd3u5ixQzweKizoZJAwBNLR42lc= -google.golang.org/grpc v1.65.0/go.mod h1:WgYC2ypjlB0EiQi6wdKixMqukr6lBc0Vo+oOgjrM5ZQ= -google.golang.org/protobuf v1.34.1 h1:9ddQBjfCyZPOHPUiPxpYESBLc+T8P3E+Vo4IbKZgFWg= -google.golang.org/protobuf v1.34.1/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= +google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1 h1:/WILD1UcXj/ujCxgoL/DvRgt2CP3txG8+FwkUbb9110= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1/go.mod h1:YNKnb2OAApgYn2oYY47Rn7alMr1zWjb2U8Q0aoGWiNc= +google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= +google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= @@ -579,11 +1197,24 @@ gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= +gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= +honnef.co/go/tools v0.7.0 h1:w6WUp1VbkqPEgLz4rkBzH/CSU6HkoqNLp6GstyTx3lU= +honnef.co/go/tools v0.7.0/go.mod h1:pm29oPxeP3P82ISxZDgIYeOaf9ta6Pi0EWvCFoLG2vc= +mvdan.cc/gofumpt v0.9.2 h1:zsEMWL8SVKGHNztrx6uZrXdp7AX8r421Vvp23sz7ik4= +mvdan.cc/gofumpt v0.9.2/go.mod h1:iB7Hn+ai8lPvofHd9ZFGVg2GOr8sBUw1QUWjNbmIL/s= +mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 h1:ssMzja7PDPJV8FStj7hq9IKiuiKhgz9ErWw+m68e7DI= +mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15/go.mod h1:4M5MMXl2kW6fivUT6yRGpLLPNfuGtU2Z0cPvFquGDYU= +mvdan.cc/xurls/v2 v2.6.0 h1:3NTZpeTxYVWNSokW3MKeyVkz/j7uYXYiMtXRUfmjbgI= +mvdan.cc/xurls/v2 v2.6.0/go.mod h1:bCvEZ1XvdA6wDnxY7jPPjEmigDtvtvPXAD/Exa9IMSk= +pluginrpc.com/pluginrpc v0.5.0 h1:tOQj2D35hOmvHyPu8e7ohW2/QvAnEtKscy2IJYWQ2yo= +pluginrpc.com/pluginrpc v0.5.0/go.mod h1:UNWZ941hcVAoOZUn8YZsMmOZBzbUjQa3XMns8RQLp9o= diff --git a/pkg/app/rados_conn.go b/pkg/app/rados_conn.go index 42f9ee9..4c03e17 100644 --- a/pkg/app/rados_conn.go +++ b/pkg/app/rados_conn.go @@ -1,4 +1,4 @@ -//go:build !mock +//go:build cgo package app diff --git a/pkg/app/rados_conn_mock.go b/pkg/app/rados_conn_mock.go index be1c46f..585c956 100644 --- a/pkg/app/rados_conn_mock.go +++ b/pkg/app/rados_conn_mock.go @@ -1,4 +1,4 @@ -//go:build mock +//go:build !cgo package app diff --git a/pkg/app/start_test.go b/pkg/app/start_test.go index cf1a687..6036b0f 100644 --- a/pkg/app/start_test.go +++ b/pkg/app/start_test.go @@ -1,4 +1,4 @@ -//go:build !mock +//go:build cgo package app diff --git a/pkg/rados/production_conn.go b/pkg/rados/production_conn.go index 97c2631..799b5a8 100644 --- a/pkg/rados/production_conn.go +++ b/pkg/rados/production_conn.go @@ -1,4 +1,4 @@ -//go:build !mock +//go:build cgo package rados diff --git a/pkg/rados/rados_mock.go b/pkg/rados/rados_mock.go index eec484e..3c73fc4 100644 --- a/pkg/rados/rados_mock.go +++ b/pkg/rados/rados_mock.go @@ -1,4 +1,4 @@ -//go:build mock +//go:build !cgo package rados diff --git a/pkg/rados/rados_mock_test.go b/pkg/rados/rados_mock_test.go index 7590a7e..808156f 100644 --- a/pkg/rados/rados_mock_test.go +++ b/pkg/rados/rados_mock_test.go @@ -1,4 +1,4 @@ -//go:build mock +//go:build !cgo package rados diff --git a/pkg/types/ceph_errors.go b/pkg/types/ceph_errors.go index 15c2004..050f569 100644 --- a/pkg/types/ceph_errors.go +++ b/pkg/types/ceph_errors.go @@ -1,4 +1,4 @@ -//go:build !mock +//go:build cgo package types diff --git a/pkg/types/ceph_errors_mock.go b/pkg/types/ceph_errors_mock.go index 719af25..671df73 100644 --- a/pkg/types/ceph_errors_mock.go +++ b/pkg/types/ceph_errors_mock.go @@ -1,4 +1,4 @@ -//go:build mock +//go:build !cgo package types diff --git a/test/.dockerignore b/test/.dockerignore deleted file mode 100644 index 732a546..0000000 --- a/test/.dockerignore +++ /dev/null @@ -1,23 +0,0 @@ -# Ignore git folder -.git/ - -# Ignore doc files -**/*.png -**/*.md - - -# Ignore all files which are not go type -!**/*.go -!**/*.mod -!**/*.sum - -# allow configs -!/pkg/config/** - -# Ignore unnecessary files inside allowed directories -# This should go after the allowed directories -**/*~ -**/*.log -**/.DS_Store -**/Thumbs.db -.vscode/ diff --git a/test/Dockerfile b/test/Dockerfile index a0a722a..3a8d370 100644 --- a/test/Dockerfile +++ b/test/Dockerfile @@ -1,27 +1,11 @@ -FROM golang:1.21 AS builder -ARG TARGETOS -ARG TARGETARCH -# pacific, quincy, reef -ENV CEPH_RELEASE="reef" +FROM golang:1.25-bookworm -RUN echo $TARGETARCH +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + librados-dev \ + librbd-dev \ + libcephfs-dev && \ + rm -rf /var/lib/apt/lists/* -WORKDIR /build - -# install build dependecies -RUN apt-get update && apt-get install -y gcc g++ librbd-dev librados-dev libcephfs-dev linux-headers-generic ceph-common - -# Copy the Go Modules manifests -COPY go.mod go.mod -COPY go.sum go.sum -# cache deps before building and copying source so that we don't need to re-download as much -# and so that source changes don't invalidate our downloaded layer -RUN go mod download - -# Copy the go source -COPY . . - -# build app -RUN CGO_ENABLED=1 go test ./test -c -o api-test - -CMD ["./api-test", "-test.v"] +ENV CGO_ENABLED=1 +WORKDIR /src diff --git a/test/auth_test.go b/test/auth_test.go index a9b9f90..b605983 100644 --- a/test/auth_test.go +++ b/test/auth_test.go @@ -1,3 +1,5 @@ +//go:build cgo + package test import ( diff --git a/test/cluster_api_test.go b/test/cluster_api_test.go index 6d80a86..6f07074 100644 --- a/test/cluster_api_test.go +++ b/test/cluster_api_test.go @@ -1,3 +1,5 @@ +//go:build cgo + package test import ( diff --git a/test/crush_rule_api_test.go b/test/crush_rule_api_test.go index ff52f9f..dd73ee9 100644 --- a/test/crush_rule_api_test.go +++ b/test/crush_rule_api_test.go @@ -1,3 +1,5 @@ +//go:build cgo + package test import ( diff --git a/test/main_test.go b/test/main_test.go new file mode 100644 index 0000000..b056c2b --- /dev/null +++ b/test/main_test.go @@ -0,0 +1,29 @@ +package test + +import ( + "flag" + "fmt" + "os" + "testing" + + "github.com/clyso/ceph-api/test/testenv" +) + +var tid = flag.Bool("tid", false, "run e2e tests inside a Docker container with CGo + ceph dev libs") + +func TestMain(m *testing.M) { + flag.Parse() + if *tid { + os.Exit(testenv.RunInDocker(testenv.DockerTestConfig{ + TestPkg: "./test/...", + DefaultTimeout: "15m", + ForwardEnv: []string{"CEPH_TEST_IMAGE"}, + })) + } + exitCode, err := runSetup(m) + if err != nil { + fmt.Fprintln(os.Stderr, "e2e setup:", err) + os.Exit(1) + } + os.Exit(exitCode) +} diff --git a/test/init_test.go b/test/setup_cgo_test.go similarity index 63% rename from test/init_test.go rename to test/setup_cgo_test.go index 7d4545c..6c98c2c 100644 --- a/test/init_test.go +++ b/test/setup_cgo_test.go @@ -1,3 +1,5 @@ +//go:build cgo + package test import ( @@ -14,6 +16,7 @@ import ( cephapi "github.com/clyso/ceph-api" "github.com/clyso/ceph-api/pkg/app" "github.com/clyso/ceph-api/pkg/config" + "github.com/clyso/ceph-api/test/testenv" "google.golang.org/grpc" "google.golang.org/grpc/credentials" ) @@ -25,6 +28,8 @@ var ( tstCtx context.Context grpcConn *grpc.ClientConn admConn *grpc.ClientConn + + cephEnv *testenv.CephEnv ) const ( @@ -32,17 +37,36 @@ const ( pass = "ceph-e2e-test-pass" ) -func TestMain(m *testing.M) { - err := config.Get(&conf) +func runSetup(m *testing.M) (int, error) { + bootCtx, bootCancel := context.WithTimeout(context.Background(), 5*time.Minute) + defer bootCancel() + + env, err := testenv.NewCephEnv(bootCtx) if err != nil { - panic(err) + return 1, fmt.Errorf("start ceph env: %w", err) + } + cephEnv = env + defer cephEnv.Close() + + confDir, err := env.CephConfig(bootCtx) + if err != nil { + return 1, fmt.Errorf("extract ceph config: %w", err) + } + defer os.RemoveAll(confDir) + + // librados reads CEPH_CONF before falling back to /etc/ceph/ceph.conf. + if err := os.Setenv("CEPH_CONF", confDir+"/ceph.conf"); err != nil { + return 1, fmt.Errorf("set CEPH_CONF: %w", err) + } + + if err := config.Get(&conf); err != nil { + return 1, fmt.Errorf("load config: %w", err) } conf.Log.Json = false conf.Api.Secure = false port, _ := getRandomPort() conf.Api.GrpcPort = port conf.Api.HttpPort = port - conf.App.CreateAdmin = true conf.App.AdminUsername = admin conf.App.AdminPassword = pass @@ -51,14 +75,14 @@ func TestMain(m *testing.M) { ctx, cancel := context.WithCancel(context.Background()) defer cancel() tstCtx = ctx + + appReady := make(chan error, 1) go func() { appCtx, cancelFn := context.WithCancel(ctx) defer cancelFn() - err = app.Start(appCtx, conf, config.Build{Version: "test"}) - if err != nil { - panic(err) - } + appReady <- app.Start(appCtx, conf, config.Build{Version: "test"}) }() + grpcAddr = fmt.Sprintf("localhost:%d", conf.Api.GrpcPort) if conf.Api.Secure { httpAddr = fmt.Sprintf("https://localhost:%d", conf.Api.HttpPort) @@ -78,7 +102,7 @@ func TestMain(m *testing.M) { grpc.WithBlock(), ) if err != nil { - panic(err) + return 1, fmt.Errorf("dial grpc: %w", err) } c, err := cephapi.New(tstCtx, cephapi.ClientConfig{ @@ -88,15 +112,23 @@ func TestMain(m *testing.M) { Password: pass, }) if err != nil { - panic(err) + return 1, fmt.Errorf("authenticate admin: %w", err) } admConn = c.Conn() + exitCode := m.Run() cancel() grpcConn.Close() c.Close() - // exit - os.Exit(exitCode) + + select { + case startErr := <-appReady: + if startErr != nil && startErr != context.Canceled { + fmt.Fprintln(os.Stderr, "app.Start exited:", startErr) + } + case <-time.After(5 * time.Second): + } + return exitCode, nil } func getRandomPort() (int, string) { @@ -106,11 +138,9 @@ func getRandomPort() (int, string) { } addr := l.Addr().String() addrs := strings.Split(addr, ":") - err = l.Close() - if err != nil { + if err := l.Close(); err != nil { panic(err) } - port, err := strconv.Atoi(addrs[len(addrs)-1]) if err != nil { panic(err) diff --git a/test/setup_nocgo_test.go b/test/setup_nocgo_test.go new file mode 100644 index 0000000..aa7f53a --- /dev/null +++ b/test/setup_nocgo_test.go @@ -0,0 +1,12 @@ +//go:build !cgo + +package test + +import ( + "errors" + "testing" +) + +func runSetup(_ *testing.M) (int, error) { + return 1, errors.New("CGo required to run e2e tests directly; use `go test ./test/... -tid` to run them inside a Docker container with ceph dev libs") +} diff --git a/test/status_test.go b/test/status_test.go index 639475f..8c2cc07 100644 --- a/test/status_test.go +++ b/test/status_test.go @@ -1,3 +1,5 @@ +//go:build cgo + package test import ( @@ -222,7 +224,6 @@ func Test_GetCephReport(t *testing.T) { // HEALTH Should be HEALTH_OK, HEALTH_WARN, HEALTH_ERR r.Contains([]string{"HEALTH_OK", "HEALTH_WARN", "HEALTH_ERR"}, healthStatus.GetStringValue(), "Health status should be HEALTH_OK, HEALTH_WARN, or HEALTH_ERR") - monmapField, ok := res.Fields["monmap"] r.True(ok, "Monmap field should exist") monmapStruct := monmapField.GetStructValue() diff --git a/test/testenv/ceph.go b/test/testenv/ceph.go new file mode 100644 index 0000000..b34b933 --- /dev/null +++ b/test/testenv/ceph.go @@ -0,0 +1,388 @@ +// Package testenv brings up a real Ceph cluster in Docker for e2e tests. +package testenv + +import ( + "bytes" + "context" + "fmt" + "io" + "os" + "path/filepath" + "strings" + "time" + + dockercontainer "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/network" + "github.com/docker/go-connections/nat" + "github.com/testcontainers/testcontainers-go" + tcexec "github.com/testcontainers/testcontainers-go/exec" + tcnetwork "github.com/testcontainers/testcontainers-go/network" +) + +const ( + networkSubnet = "192.168.56.0/24" + networkGateway = "192.168.56.1" + + MonIP = "192.168.56.7" + cephPublicNetwork = "192.168.56.0/24" + + DashboardPort = 8443 + RestfulPort = 8003 + RGWPort = 8080 + + DashboardUser = "ceph-api-test-admin" + DashboardPass = "ceph-api-test-pass" + RestfulUser = "ceph-api-test-restful" + + healthCheckTimeout = 3 * time.Minute + moduleEnableWait = 60 * time.Second + + envCephImage = "CEPH_TEST_IMAGE" + defaultCephImage = "ghcr.io/arttor/ceph-test:v19" +) + +type CephEnv struct { + tcNetwork *testcontainers.DockerNetwork + container testcontainers.Container + restfulKey string +} + +func NewCephEnv(ctx context.Context) (*CephEnv, error) { + env := &CephEnv{} + + if err := env.createNetwork(ctx); err != nil { + return nil, err + } + if err := env.startContainer(ctx); err != nil { + env.Close() + return nil, err + } + if err := env.waitHealthy(ctx, healthCheckTimeout); err != nil { + env.Close() + return nil, err + } + if err := env.enableDashboard(ctx); err != nil { + env.Close() + return nil, fmt.Errorf("enable dashboard: %w", err) + } + if err := env.enableRestful(ctx); err != nil { + env.Close() + return nil, fmt.Errorf("enable restful: %w", err) + } + return env, nil +} + +func (e *CephEnv) createNetwork(ctx context.Context) error { + net, err := tcnetwork.New(ctx, + tcnetwork.WithDriver("bridge"), + tcnetwork.WithIPAM(&network.IPAM{ + Driver: "default", + Config: []network.IPAMConfig{ + {Subnet: networkSubnet, Gateway: networkGateway}, + }, + }), + ) + if err != nil { + return fmt.Errorf("create network: %w", err) + } + e.tcNetwork = net + return nil +} + +func (e *CephEnv) startContainer(ctx context.Context) error { + image := os.Getenv(envCephImage) + if image == "" { + image = defaultCephImage + } + + netName := e.tcNetwork.Name + + req := testcontainers.ContainerRequest{ + Image: image, + Env: map[string]string{ + "MON_IP": MonIP, + "CEPH_PUBLIC_NETWORK": cephPublicNetwork, + }, + ExposedPorts: []string{ + fmt.Sprintf("%d/tcp", RGWPort), + fmt.Sprintf("%d/tcp", DashboardPort), + fmt.Sprintf("%d/tcp", RestfulPort), + }, + Networks: []string{netName}, + NetworkAliases: map[string][]string{netName: {"ceph"}}, + EndpointSettingsModifier: func(es map[string]*network.EndpointSettings) { + es[netName] = &network.EndpointSettings{ + IPAMConfig: &network.EndpointIPAMConfig{IPv4Address: MonIP}, + Aliases: []string{"ceph"}, + } + }, + HostConfigModifier: func(hc *dockercontainer.HostConfig) { + hc.Privileged = true + }, + ConfigModifier: func(cfg *dockercontainer.Config) { + cfg.Hostname = "ceph-demo" + }, + } + + c, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ + ContainerRequest: req, + Started: true, + }) + if err != nil { + return fmt.Errorf("start ceph container: %w", err) + } + e.container = c + return nil +} + +func (e *CephEnv) waitHealthy(ctx context.Context, timeout time.Duration) error { + ctx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + + // `ceph health` takes a few seconds to respond at all after container start. + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(5 * time.Second): + } + + ticker := time.NewTicker(2 * time.Second) + defer ticker.Stop() + + var lastErr error + for { + select { + case <-ctx.Done(): + return fmt.Errorf("timeout waiting for ceph health (last: %v): %w", lastErr, ctx.Err()) + case <-ticker.C: + exitCode, reader, err := e.container.Exec(ctx, []string{"ceph", "health"}, tcexec.Multiplexed()) + if err != nil { + lastErr = err + continue + } + if exitCode == 0 { + return nil + } + out, _ := io.ReadAll(reader) + lastErr = fmt.Errorf("exit %d: %s", exitCode, bytes.TrimSpace(out)) + } + } +} + +func (e *CephEnv) enableDashboard(ctx context.Context) error { + if err := e.execOK(ctx, []string{"ceph", "mgr", "module", "enable", "dashboard"}); err != nil { + return err + } + if err := e.execOK(ctx, []string{"ceph", "dashboard", "create-self-signed-cert"}); err != nil { + return err + } + + if err := e.writeFile(ctx, "/tmp/dash-pass.txt", DashboardPass); err != nil { + return fmt.Errorf("stage dashboard password: %w", err) + } + // Ignore: rerun against a reused container hits "user already exists". + _ = e.execLog(ctx, []string{ + "ceph", "dashboard", "ac-user-create", + "--enabled", "--force-password", + DashboardUser, "-i", "/tmp/dash-pass.txt", "administrator", + }) + + return e.waitMgrService(ctx, "dashboard") +} + +func (e *CephEnv) enableRestful(ctx context.Context) error { + if err := e.execOK(ctx, []string{"ceph", "mgr", "module", "enable", "restful"}); err != nil { + return err + } + if err := e.execOK(ctx, []string{"ceph", "restful", "create-self-signed-cert"}); err != nil { + return err + } + + exitCode, reader, err := e.container.Exec(ctx, []string{"ceph", "restful", "create-key", RestfulUser}, tcexec.Multiplexed()) + if err != nil { + return fmt.Errorf("create-key: %w", err) + } + out, _ := io.ReadAll(reader) + if exitCode != 0 { + return fmt.Errorf("create-key exit %d: %s", exitCode, bytes.TrimSpace(out)) + } + e.restfulKey = strings.TrimSpace(string(out)) + + return e.waitMgrService(ctx, "restful") +} + +// waitMgrService polls `ceph mgr services` until the named module reports a +// listening URL. The module can be config-active before the socket binds. +func (e *CephEnv) waitMgrService(ctx context.Context, moduleName string) error { + deadline := time.Now().Add(moduleEnableWait) + for time.Now().Before(deadline) { + exitCode, reader, err := e.container.Exec(ctx, []string{"ceph", "mgr", "services"}, tcexec.Multiplexed()) + if err == nil && exitCode == 0 { + out, _ := io.ReadAll(reader) + if bytes.Contains(out, []byte(`"`+moduleName+`":`)) { + return nil + } + } + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(2 * time.Second): + } + } + return fmt.Errorf("mgr module %s did not report a service URL within %s", moduleName, moduleEnableWait) +} + +func (e *CephEnv) execOK(ctx context.Context, cmd []string) error { + exitCode, reader, err := e.container.Exec(ctx, cmd, tcexec.Multiplexed()) + if err != nil { + return fmt.Errorf("exec %v: %w", cmd, err) + } + if exitCode != 0 { + out, _ := io.ReadAll(reader) + return fmt.Errorf("exec %v: exit %d: %s", cmd, exitCode, bytes.TrimSpace(out)) + } + return nil +} + +func (e *CephEnv) execLog(ctx context.Context, cmd []string) error { + exitCode, _, err := e.container.Exec(ctx, cmd, tcexec.Multiplexed()) + if err != nil { + return err + } + if exitCode != 0 { + return fmt.Errorf("exec %v: exit %d", cmd, exitCode) + } + return nil +} + +func (e *CephEnv) writeFile(ctx context.Context, path, content string) error { + return e.execOK(ctx, []string{"sh", "-c", fmt.Sprintf("cat > %s <<'EOF'\n%s\nEOF\n", path, content)}) +} + +func (e *CephEnv) Container() testcontainers.Container { + return e.container +} + +// MappedURL returns an http/https URL on the host that maps to the given +// container port. +func (e *CephEnv) MappedURL(ctx context.Context, scheme string, port int) (string, error) { + host, err := e.container.Host(ctx) + if err != nil { + return "", fmt.Errorf("get container host: %w", err) + } + mp, err := e.container.MappedPort(ctx, nat.Port(fmt.Sprintf("%d/tcp", port))) + if err != nil { + return "", fmt.Errorf("get mapped port %d: %w", port, err) + } + return fmt.Sprintf("%s://%s:%s", scheme, host, mp.Port()), nil +} + +// Dashboard returns the dashboard HTTPS URL and administrator credentials. +// The cert is self-signed; callers must skip verification. +func (e *CephEnv) Dashboard(ctx context.Context) (url, user, pass string, err error) { + u, err := e.MappedURL(ctx, "https", DashboardPort) + if err != nil { + return "", "", "", err + } + return u, DashboardUser, DashboardPass, nil +} + +func (e *CephEnv) Restful(ctx context.Context) (url, user, key string, err error) { + u, err := e.MappedURL(ctx, "https", RestfulPort) + if err != nil { + return "", "", "", err + } + return u, RestfulUser, e.restfulKey, nil +} + +func (e *CephEnv) RGW(ctx context.Context) (string, error) { + return e.MappedURL(ctx, "http", RGWPort) +} + +// CephConfig copies ceph.conf + admin keyring from the container into a tmp +// dir on the host, rewriting the global keyring path so a host-side process +// can use the conf directly. Caller must os.RemoveAll(dir) when done. +func (e *CephEnv) CephConfig(ctx context.Context) (string, error) { + dir, err := os.MkdirTemp("", "ceph-conf-*") + if err != nil { + return "", fmt.Errorf("create temp dir: %w", err) + } + + keyringPath := filepath.Join(dir, "ceph.client.admin.keyring") + if err := e.copyFileFromContainer(ctx, "/etc/ceph/ceph.client.admin.keyring", keyringPath); err != nil { + _ = os.RemoveAll(dir) + return "", fmt.Errorf("copy keyring: %w", err) + } + + conf, err := e.readFileFromContainer(ctx, "/etc/ceph/ceph.conf") + if err != nil { + _ = os.RemoveAll(dir) + return "", fmt.Errorf("read ceph.conf: %w", err) + } + + rewritten := rewriteKeyringPath(conf, keyringPath) + confPath := filepath.Join(dir, "ceph.conf") + if err := os.WriteFile(confPath, []byte(rewritten), 0o600); err != nil { + _ = os.RemoveAll(dir) + return "", fmt.Errorf("write ceph.conf: %w", err) + } + + return dir, nil +} + +func (e *CephEnv) readFileFromContainer(ctx context.Context, containerPath string) (string, error) { + rc, err := e.container.CopyFileFromContainer(ctx, containerPath) + if err != nil { + return "", err + } + defer func() { _ = rc.Close() }() + data, err := io.ReadAll(rc) + if err != nil { + return "", err + } + return string(data), nil +} + +func (e *CephEnv) copyFileFromContainer(ctx context.Context, containerPath, hostPath string) error { + content, err := e.readFileFromContainer(ctx, containerPath) + if err != nil { + return err + } + return os.WriteFile(hostPath, []byte(content), 0o600) +} + +func rewriteKeyringPath(conf, keyringPath string) string { + var out strings.Builder + section := "" + foundInGlobal := false + for _, line := range strings.Split(conf, "\n") { + trimmed := strings.TrimSpace(line) + if strings.HasPrefix(trimmed, "[") && strings.HasSuffix(trimmed, "]") { + section = trimmed + } + // Don't match keyring_dir and friends. + isKeyring := (strings.HasPrefix(trimmed, "keyring =") || strings.HasPrefix(trimmed, "keyring=")) && + !strings.HasPrefix(trimmed, "keyring_") + if isKeyring && section == "[global]" { + out.WriteString("\tkeyring = " + keyringPath + "\n") + foundInGlobal = true + continue + } + out.WriteString(line + "\n") + } + result := strings.TrimRight(out.String(), "\n") + "\n" + if !foundInGlobal { + result = strings.Replace(result, "[global]\n", "[global]\n\tkeyring = "+keyringPath+"\n", 1) + } + return result +} + +func (e *CephEnv) Close() { + ctx := context.Background() + if e.container != nil { + _ = e.container.Terminate(ctx) + } + if e.tcNetwork != nil { + _ = e.tcNetwork.Remove(ctx) + } +} diff --git a/test/testenv/tid.go b/test/testenv/tid.go new file mode 100644 index 0000000..5c57a90 --- /dev/null +++ b/test/testenv/tid.go @@ -0,0 +1,203 @@ +package testenv + +import ( + "context" + "flag" + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + + dockercontainer "github.com/docker/docker/api/types/container" + "github.com/docker/docker/api/types/mount" + "github.com/docker/docker/client" + "github.com/docker/docker/pkg/stdcopy" + "github.com/testcontainers/testcontainers-go" +) + +type DockerTestConfig struct { + TestPkg string + DefaultTimeout string + ForwardFlags []string + ForwardEnv []string +} + +// RunInDocker builds test/Dockerfile, mounts the repo + go mod cache + +// docker.sock, and runs `go test` against TestPkg inside the container. +// docker.sock is shared so inner tests can still spawn sibling containers. +func RunInDocker(cfg DockerTestConfig) int { + ctx := context.Background() + + repoRoot, err := findRepoRoot() + if err != nil { + fmt.Fprintf(os.Stderr, "tid: find repo root: %v\n", err) + return 1 + } + + modCache, err := goModCache() + if err != nil { + fmt.Fprintf(os.Stderr, "tid: %v\n", err) + return 1 + } + + req := testcontainers.ContainerRequest{ + FromDockerfile: testcontainers.FromDockerfile{ + Context: filepath.Join(repoRoot, "test"), + Dockerfile: "Dockerfile", + KeepImage: true, + }, + Cmd: []string{"sleep", "infinity"}, + HostConfigModifier: func(hc *dockercontainer.HostConfig) { + // Host networking so the inner test process can reach the + // CephEnv container's mapped host ports. + hc.NetworkMode = "host" + hc.Binds = []string{ + repoRoot + ":/src:ro", + modCache + ":/go/pkg/mod:ro", + "/var/run/docker.sock:/var/run/docker.sock", + } + hc.Mounts = append(hc.Mounts, mount.Mount{ + Type: mount.TypeVolume, + Source: "ceph-api-build-cache", + Target: "/root/.cache/go-build", + }) + }, + } + + container, err := testcontainers.GenericContainer(ctx, testcontainers.GenericContainerRequest{ + ContainerRequest: req, + Started: true, + }) + if err != nil { + fmt.Fprintf(os.Stderr, "tid: start container: %v\n", err) + return 1 + } + defer func() { _ = container.Terminate(ctx) }() + + cmd := buildInnerCmd(cfg) + + cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + if err != nil { + fmt.Fprintf(os.Stderr, "tid: docker client: %v\n", err) + return 1 + } + defer func() { _ = cli.Close() }() + + containerID := container.GetContainerID() + + var envVars []string + for _, key := range cfg.ForwardEnv { + if val, ok := os.LookupEnv(key); ok { + envVars = append(envVars, key+"="+val) + } + } + + execResp, err := cli.ContainerExecCreate(ctx, containerID, dockercontainer.ExecOptions{ + Cmd: cmd, + Env: envVars, + AttachStdout: true, + AttachStderr: true, + WorkingDir: "/src", + }) + if err != nil { + fmt.Fprintf(os.Stderr, "tid: exec create: %v\n", err) + return 1 + } + + attachResp, err := cli.ContainerExecAttach(ctx, execResp.ID, dockercontainer.ExecAttachOptions{}) + if err != nil { + fmt.Fprintf(os.Stderr, "tid: exec attach: %v\n", err) + return 1 + } + defer attachResp.Close() + + _, _ = stdcopy.StdCopy(os.Stdout, os.Stderr, attachResp.Reader) + + inspectResp, err := cli.ContainerExecInspect(ctx, execResp.ID) + if err != nil { + fmt.Fprintf(os.Stderr, "tid: exec inspect: %v\n", err) + return 1 + } + return inspectResp.ExitCode +} + +func findRepoRoot() (string, error) { + dir, err := os.Getwd() + if err != nil { + return "", err + } + for { + if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil { + return dir, nil + } + parent := filepath.Dir(dir) + if parent == dir { + return "", fmt.Errorf("go.mod not found") + } + dir = parent + } +} + +func goModCache() (string, error) { + out, err := exec.Command("go", "env", "GOMODCACHE").Output() + if err != nil { + return "", fmt.Errorf("go env GOMODCACHE: %w", err) + } + p := strings.TrimSpace(string(out)) + if p == "" { + return "", fmt.Errorf("GOMODCACHE is empty") + } + return p, nil +} + +func buildInnerCmd(cfg DockerTestConfig) []string { + cmd := []string{"go", "test", "-count=1", cfg.TestPkg} + + allowed := make(map[string]bool, len(cfg.ForwardFlags)) + for _, f := range cfg.ForwardFlags { + allowed[f] = true + } + allowed["test.run"] = true + allowed["test.timeout"] = true + allowed["test.v"] = true + + flag.Visit(func(f *flag.Flag) { + if !allowed[f.Name] { + return + } + switch f.Name { + case "test.run": + cmd = append(cmd, "-run", f.Value.String()) + case "test.bench": + cmd = append(cmd, "-bench", f.Value.String()) + case "test.benchmem": + if f.Value.String() == "true" { + cmd = append(cmd, "-benchmem") + } + case "test.timeout": + cmd = append(cmd, "-timeout", f.Value.String()) + case "test.v": + if f.Value.String() == "true" { + cmd = append(cmd, "-v") + } + } + }) + + hasTimeout := false + for _, a := range cmd { + if strings.HasPrefix(a, "-timeout") { + hasTimeout = true + break + } + } + if !hasTimeout { + timeout := cfg.DefaultTimeout + if timeout == "" { + timeout = "15m" + } + cmd = append(cmd, "-timeout", timeout) + } + + return cmd +} diff --git a/test/users_api_test.go b/test/users_api_test.go index 6731aa4..7b36c24 100644 --- a/test/users_api_test.go +++ b/test/users_api_test.go @@ -1,3 +1,5 @@ +//go:build cgo + package test import ( diff --git a/third_party/ceph b/third_party/ceph new file mode 160000 index 0000000..c92aebb --- /dev/null +++ b/third_party/ceph @@ -0,0 +1 @@ +Subproject commit c92aebb279828e9c3c1f5d24613efca272649e62 From 93eb955ff27cbd549c0b4b321eea9eefab6c78f1 Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Wed, 20 May 2026 14:34:50 +0200 Subject: [PATCH 02/10] fix lint errors Signed-off-by: Artem Torubarov --- go.mod | 1 - go.sum | 43 ++++++++++-------------------- go_api_client.go | 12 ++++----- pkg/api/api_server.go | 5 ++-- pkg/api/cluster_api_handlers.go | 4 +-- pkg/api/crush_rule_api_handlers.go | 6 ++--- pkg/api/grpc_http_gateway.go | 2 +- pkg/api/grpc_server.go | 4 +-- pkg/api/status_api_handlers.go | 4 +-- pkg/api/users_api_handlers.go | 4 +-- pkg/app/start.go | 13 ++++++--- pkg/auth/oauth_adapter.go | 6 +++-- pkg/auth/oauth_server.go | 2 +- pkg/config/config.go | 2 +- pkg/rados/rados_mock.go | 6 ++--- pkg/types/ceph_errors.go | 3 +-- pkg/types/ceph_errors_mock.go | 5 ++-- pkg/user/service.go | 2 +- test/setup_cgo_test.go | 31 ++++++++++++++++++--- test/status_test.go | 7 ++--- test/testenv/ceph.go | 5 +++- 21 files changed, 88 insertions(+), 79 deletions(-) diff --git a/go.mod b/go.mod index 59f5b46..ccd5759 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.25.6 require ( github.com/ceph/go-ceph v0.26.0 github.com/golang-jwt/jwt v3.2.2+incompatible - github.com/golang/protobuf v1.5.4 github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 diff --git a/go.sum b/go.sum index 3fe8ead..31ebc86 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ 4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0= buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.11-20250718181942-e35f9b667443.1 h1:zQ9C3e6FtwSZUFuKAQfpIKGFk5ZuRoGt5g35Bix55sI= buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.11-20250718181942-e35f9b667443.1/go.mod h1:1Znr6gmYBhbxWUPRrrVnSLXQsz8bvFVw1HHJq2bI3VQ= +buf.build/gen/go/bufbuild/protodescriptor/protocolbuffers/go v1.36.11-20250109164928-1da0de137947.1 h1:HwzzCRS4ZrEm1++rzSDxHnO0DOjiT1b8I/24e8a4exY= +buf.build/gen/go/bufbuild/protodescriptor/protocolbuffers/go v1.36.11-20250109164928-1da0de137947.1/go.mod h1:8PRKXhgNes29Tjrnv8KdZzg3I1QceOkzibW1QK7EXv0= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1 h1:PMmTMyvHScV9Mn8wc6ASge9uRcHy0jtqPd+fM35LmsQ= buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.11-20260209202127-80ab13bee0bf.1/go.mod h1:tvtbpgaVXZX4g6Pn+AnzFycuRK3MOz5HJfEGeEllXYM= buf.build/gen/go/bufbuild/registry/connectrpc/go v1.19.1-20260126144947-819582968857.2 h1:XPrWCd9ydEo5Ofv1aNJVJaxndMXLQjRO9vVzsJG3jL8= @@ -119,6 +121,8 @@ github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5 github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo= github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bmatcuk/doublestar/v4 v4.10.0 h1:zU9WiOla1YA122oLM6i4EXvGW62DvKZVxIe6TYWexEs= +github.com/bmatcuk/doublestar/v4 v4.10.0/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ= github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg= github.com/bombsimon/wsl/v5 v5.8.0 h1:JTkyfs4yl8SPejrCF2GdABXE+mO1WvM7iUYzRWlsxDs= @@ -127,6 +131,8 @@ github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE= github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE= github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg= github.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s= +github.com/brianvoe/gofakeit/v6 v6.28.0 h1:Xib46XXuQfmlLS2EXRuJpqcw8St6qSZz75OUo0tgAW4= +github.com/brianvoe/gofakeit/v6 v6.28.0/go.mod h1:Xj58BMSnFqcn/fAQeSK+/PLtC5kSb7FJIq4JyGa8vEs= github.com/bufbuild/buf v1.66.0 h1:6kksYJpu6r45bvPJSTwNSwRqiAjrwB9YyU7skjNzFVo= github.com/bufbuild/buf v1.66.0/go.mod h1:tWVlwtIPZ7kzlCB9D0hbbfrroT0GNCybPdPQXq1i1Ac= github.com/bufbuild/protocompile v0.14.2-0.20260202185951-d02d3732d113 h1:nxt1QhP9rMQNFhHTdcNFwJ9wKCSdBjd28gz+qGDv4kM= @@ -488,6 +494,8 @@ github.com/jdx/go-netrc v1.0.0 h1:QbLMLyCZGj0NA8glAhxUpf1zDg6cxnWgMBbjq40W0gQ= github.com/jdx/go-netrc v1.0.0/go.mod h1:Gh9eFQJnoTNIRHXl2j5bJXA1u84hQWJWgGh569zF3v8= github.com/jgautheron/goconst v1.10.0 h1:Ptt+OoE4NaEWKhLrWrrN3IpZdGLiqaf7WLnEX/iv4Jw= github.com/jgautheron/goconst v1.10.0/go.mod h1:0p+wv1lFOiUr0IlNNT1nrm6+8DB8u2sU6KHGzFRXHDc= +github.com/jhump/protoreflect/v2 v2.0.0-beta.2 h1:qZU+rEZUOYTz1Bnhi3xbwn+VxdXkLVeEpAeZzVXLY88= +github.com/jhump/protoreflect/v2 v2.0.0-beta.2/go.mod h1:4tnOYkB/mq7QTyS3YKtVtNrJv4Psqout8HA1U+hZtgM= github.com/jjti/go-spancheck v0.6.5 h1:lmi7pKxa37oKYIMScialXUK6hP3iY5F1gu+mLBPgYB8= github.com/jjti/go-spancheck v0.6.5/go.mod h1:aEogkeatBrbYsyW6y5TgDfihCulDYciL1B7rG2vSsrU= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= @@ -627,8 +635,6 @@ github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9 github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8= github.com/moricho/tparallel v0.3.2 h1:odr8aZVFA3NZrNybggMkYO3rgPRcqjeQUlBBFVxKHTI= github.com/moricho/tparallel v0.3.2/go.mod h1:OQ+K3b4Ln3l2TZveGCywybl68glfLEwFGqvnjok8b+U= -github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= -github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morikuni/aec v1.1.0 h1:vBBl0pUnvi/Je71dsRrhMBtreIqNMYErSAbEeb8jrXQ= github.com/morikuni/aec v1.1.0/go.mod h1:xDRgiq/iw5l+zkao76YTKzKttOp2cwPEne25HDkJnBw= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= @@ -697,6 +703,8 @@ github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57 github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= +github.com/protocolbuffers/protoscope v0.0.0-20221109213918-8e7a6aafa2c9 h1:arwj11zP0yJIxIRiDn22E0H8PxfF7TsTrc2wIPFIsf4= +github.com/protocolbuffers/protoscope v0.0.0-20221109213918-8e7a6aafa2c9/go.mod h1:SKZx6stCn03JN3BOWTwvVIO2ajMkb/zQdTceXYhKw/4= github.com/quasilyte/go-ruleguard v0.4.5 h1:AGY0tiOT5hJX9BTdx/xBdoCubQUAE2grkqY2lSwvZcA= github.com/quasilyte/go-ruleguard v0.4.5/go.mod h1:Vl05zJ538vcEEwu16V/Hdu7IYZWyKSwIy4c88Ro1kRE= github.com/quasilyte/go-ruleguard/dsl v0.3.23 h1:lxjt5B6ZCiBeeNO8/oQsegE6fLeCzuMRoVWSkXC4uvY= @@ -715,6 +723,8 @@ github.com/raeperd/recvcheck v0.2.0 h1:GnU+NsbiCqdC2XX5+vMZzP+jAJC5fht7rcVTAhX74 github.com/raeperd/recvcheck v0.2.0/go.mod h1:n04eYkwIR0JbgD73wT8wL4JjPC3wm0nFtzBnWNocnYU= github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rodaine/protogofakeit v0.1.1 h1:ZKouljuRM3A+TArppfBqnH8tGZHOwM/pjvtXe9DaXH8= +github.com/rodaine/protogofakeit v0.1.1/go.mod h1:pXn/AstBYMaSfc1/RqH3N82pBuxtWgejz1AlYpY1mI0= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.14.1 h1:UQB4HGPB6osV0SQTLymcB4TgvyWu6ZyliaW0tI/otEQ= @@ -727,7 +737,6 @@ github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OK github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= -github.com/russross/blackfriday v1.6.0 h1:KqfZb0pUVN2lYqZUYRddxF4OR8ZMURnJIG5Y3VRLtww= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb7Elr+g= @@ -909,8 +918,6 @@ go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.4 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 h1:RtcvQ4iw3w9NBB5yRwgA4sSa82rfId7n4atVpvKx3bY= go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0/go.mod h1:f/PbKbRd4cdUICWell6DmzvVJ7QrmBgFrRHjXmAXbK4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 h1:F7Jx+6hwnZ41NSFTO5q4LYDtJRXBf2PD0rNBkeB/lus= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0/go.mod h1:UHB22Z8QsdRDrnAtX4PntOl36ajSxcdUMt1sF7Y6E7Q= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= go.opentelemetry.io/contrib/propagators/b3 v1.24.0 h1:n4xwCdTx3pZqZs2CjS/CUZAs03y3dZcGhC/FepKtEUY= @@ -947,6 +954,8 @@ go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= +go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= +go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= @@ -958,8 +967,6 @@ go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= -go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8= -go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= @@ -976,13 +983,9 @@ golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.50.0 h1:zO47/JPrL6vsNkINmLoo/PH1gcxpls50DNogFvB5ZGI= -golang.org/x/crypto v0.50.0/go.mod h1:3muZ7vA7PBCE6xgPX7nkzzjiUq87kRItoJQM1Yo8S+Q= golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b h1:M2rDM6z3Fhozi9O7NWsxAkg/yqS/lQJ6PmkyIV3YP+o= -golang.org/x/exp v0.0.0-20250620022241-b7579e27df2b/go.mod h1:3//PLf8L/X+8b4vuAfHzxeRUl04Adcb341+IGKfnqS8= golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= @@ -1003,8 +1006,6 @@ golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2 golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= -golang.org/x/mod v0.35.0 h1:Ww1D637e6Pg+Zb2KrWfHQUnH2dQRLBQyAtpr/haaJeM= -golang.org/x/mod v0.35.0/go.mod h1:+GwiRhIInF8wPm+4AoT6L0FA1QWAad3OMdTRx4tFYlU= golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4= golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -1029,8 +1030,6 @@ golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfS golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= -golang.org/x/net v0.53.0 h1:d+qAbo5L0orcWAr0a9JweQpjXF19LMXJE8Ey7hwOdUA= -golang.org/x/net v0.53.0/go.mod h1:JvMuJH7rrdiCfbeHoo3fCQU24Lf5JJwT9W3sJFulfgs= golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= @@ -1086,12 +1085,8 @@ golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.43.0 h1:Rlag2XtaFTxp19wS8MXlJwTvoh8ArU6ezoyFsMyCTNI= -golang.org/x/sys v0.43.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= -golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa h1:efT73AJZfAAUV7SOip6pWGkwJDzIGiKBZGVzHYa+ve4= -golang.org/x/telemetry v0.0.0-20260409153401-be6f6cb8b1fa/go.mod h1:kHjTxDEnAu6/Nl9lDkzjWpR+bmKfxeiRuSDlsMb70gE= golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 h1:HjU6IWBiAgRIdAJ9/y1rwCn+UELEmwV+VsTLzj/W4sE= golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6/go.mod h1:Eqhaxk/wZsWEH8CRxLwj6xzEJbz7k1EFGqx7nyCoabE= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -1102,8 +1097,6 @@ golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= -golang.org/x/term v0.42.0 h1:UiKe+zDFmJobeJ5ggPwOshJIVt6/Ft0rcfrXZDLWAWY= -golang.org/x/term v0.42.0/go.mod h1:Dq/D+snpsbazcBG5+F9Q1n2rXV8Ma+71xEjTRufARgY= golang.org/x/term v0.43.0 h1:S4RLU2sB31O/NCl+zFN9Aru9A/Cq2aqKpTZJ6B+DwT4= golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -1115,8 +1108,6 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.36.0 h1:JfKh3XmcRPqZPKevfXVpI1wXPTqbkE5f7JA92a55Yxg= -golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164= golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= golang.org/x/time v0.11.0 h1:/bpjEDfN9tkoN/ryeYHnv5hcMlc8ncjMcM4XBk5NWV0= @@ -1145,8 +1136,6 @@ golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.8.0/go.mod h1:JxBZ99ISMI5ViVkT1tr6tdNmXeTrcpVSD3vZ1RsRdN4= -golang.org/x/tools v0.44.0 h1:UP4ajHPIcuMjT1GqzDWRlalUEoY+uzoZKnhOjbIPD2c= -golang.org/x/tools v0.44.0/go.mod h1:KA0AfVErSdxRZIsOVipbv3rQhVXTnlU6UhKxHd1seDI= golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8= golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0= golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnpsEAGHaNy0n/rJM= @@ -1166,12 +1155,8 @@ google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7 google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57 h1:JLQynH/LBHfCTSbDWl+py8C+Rg/k1OVH3xfcaiANuF0= -google.golang.org/genproto/googleapis/api v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:kSJwQxqmFXeo79zOmbrALdflXQeAYcUbgS7PbpMknCY= google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d h1:EocjzKLywydp5uZ5tJ79iP6Q0UjDnyiHkGRWxuPBP8s= google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:48U2I+QQUYhsFrg2SY6r+nJzeOtjey7j//WBESw+qyQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57 h1:mWPCjDEyshlQYzBpMNHaEof6UX1PmHcaUODUywQ0uac= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260209200024-4cfbd4190f57/go.mod h1:j9x/tPzZkyxcgEFkiKEEGxfvyumM01BEtsW8xzOahRQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d h1:t/LOSXPJ9R0B6fnZNyALBRfZBH0Uy0gT+uR+SJ6syqQ= google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= diff --git a/go_api_client.go b/go_api_client.go index 1a741b0..731fe6f 100644 --- a/go_api_client.go +++ b/go_api_client.go @@ -100,7 +100,7 @@ func New(ctx context.Context, conf ClientConfig) (*Client, error) { c.httpClient = http.DefaultClient if conf.Secure && conf.TLSSkipVerify { customTransport := http.DefaultTransport.(*http.Transport) - customTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} //nolint: gosec + customTransport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true} //nolint:gosec // honour caller opt-in to skip TLS verification c.httpClient = &http.Client{Transport: customTransport} } oauthCtx := context.WithValue(ctx, oauth2.HTTPClient, c.httpClient) @@ -110,10 +110,9 @@ func New(ctx context.Context, conf ClientConfig) (*Client, error) { } c.ts = ac.TokenSource(ctx, token) if !conf.Secure { - c.grpcConn, err = grpc.DialContext(ctx, grpcUrl, - grpc.WithTransportCredentials(insecure.NewCredentials()), //nolint: gosec + c.grpcConn, err = grpc.NewClient(grpcUrl, + grpc.WithTransportCredentials(insecure.NewCredentials()), grpc.WithConnectParams(grpc.ConnectParams{MinConnectTimeout: time.Second, Backoff: backoff.DefaultConfig}), - grpc.WithBlock(), grpc.WithChainUnaryInterceptor(func(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error { t, err := ac.PasswordCredentialsToken(oauthCtx, conf.Login, conf.Password) if err != nil { @@ -136,10 +135,9 @@ func New(ctx context.Context, conf ClientConfig) (*Client, error) { }), ) } else { - c.grpcConn, err = grpc.DialContext(ctx, grpcUrl, - grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: conf.TLSSkipVerify})), //nolint: gosec + c.grpcConn, err = grpc.NewClient(grpcUrl, + grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: conf.TLSSkipVerify})), //nolint:gosec // honour caller opt-in to skip TLS verification grpc.WithConnectParams(grpc.ConnectParams{MinConnectTimeout: time.Second, Backoff: backoff.DefaultConfig}), - grpc.WithBlock(), grpc.WithPerRPCCredentials(&oauth.TokenSource{TokenSource: c.ts}), ) } diff --git a/pkg/api/api_server.go b/pkg/api/api_server.go index fc8cbe8..fb26089 100644 --- a/pkg/api/api_server.go +++ b/pkg/api/api_server.go @@ -26,7 +26,8 @@ func Serve(ctx context.Context, conf Config, grpcServer *grpc.Server, httpServer zerolog.Ctx(ctx).Info().Msgf("serving grpc and http API on the same port %d", conf.HttpPort) var lis net.Listener if conf.Secure { - tlsConf, err := selfIssuedTlsConf() + var tlsConf *tls.Config + tlsConf, err = selfIssuedTlsConf() if err != nil { return nil, nil, err } @@ -136,7 +137,7 @@ func selfIssuedTlsConf() (*tls.Config, error) { if err != nil { return nil, err } - tlsConf := &tls.Config{InsecureSkipVerify: true} //nolint: gosec + tlsConf := &tls.Config{} tlsConf.Certificates = make([]tls.Certificate, 1) tlsConf.Certificates[0] = cert return tlsConf, nil diff --git a/pkg/api/cluster_api_handlers.go b/pkg/api/cluster_api_handlers.go index a17453e..44db013 100644 --- a/pkg/api/cluster_api_handlers.go +++ b/pkg/api/cluster_api_handlers.go @@ -123,7 +123,7 @@ func (c *clusterAPI) UpdateUser(ctx context.Context, req *pb.UpdateClusterUserRe monCmd := fmt.Sprintf(cmdTempl, req.UserEntity, strings.Join(caps, ",")) _, err := c.radosSvc.ExecMon(ctx, monCmd) if err != nil { - if errors.Is(err, types.RadosErrorNotFound) { + if errors.Is(err, types.ErrRadosNotFound) { return nil, types.ErrNotFound } return nil, err @@ -138,7 +138,7 @@ func (c *clusterAPI) GetStatus(ctx context.Context, _ *emptypb.Empty) (*pb.Clust const monCmd = `{"prefix":"config-key get", "key":"mgr/dashboard/cluster/status"}` cmdRes, err := c.radosSvc.ExecMon(ctx, monCmd) if err != nil { - if errors.Is(err, types.RadosErrorNotFound) { + if errors.Is(err, types.ErrRadosNotFound) { // If the status is not set, assume it is already fully functional. return &pb.ClusterStatus{Status: pb.ClusterStatus_POST_INSTALLED}, nil } diff --git a/pkg/api/crush_rule_api_handlers.go b/pkg/api/crush_rule_api_handlers.go index 15f7925..b12e5a9 100644 --- a/pkg/api/crush_rule_api_handlers.go +++ b/pkg/api/crush_rule_api_handlers.go @@ -58,10 +58,8 @@ func (c *crushRuleAPI) CreateRule(ctx context.Context, req *pb.CreateRuleRequest if req.Profile != nil { cmdMap["profile"] = *req.Profile } - } else { - if req.Root != nil { - cmdMap["root"] = *req.Root - } + } else if req.Root != nil { + cmdMap["root"] = *req.Root } cmdBytes, err := json.Marshal(cmdMap) diff --git a/pkg/api/grpc_http_gateway.go b/pkg/api/grpc_http_gateway.go index b7b5894..5c9d943 100644 --- a/pkg/api/grpc_http_gateway.go +++ b/pkg/api/grpc_http_gateway.go @@ -21,7 +21,7 @@ func GRPCGateway(ctx context.Context, conf Config, metricsHandler http.HandlerFu var opts []grpc.DialOption if conf.Secure { - opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: false}))) //nolint: gosec + opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) } else { opts = append(opts, grpc.WithTransportCredentials(insecure.NewCredentials())) } diff --git a/pkg/api/grpc_server.go b/pkg/api/grpc_server.go index 3e4c09c..7dc9c14 100644 --- a/pkg/api/grpc_server.go +++ b/pkg/api/grpc_server.go @@ -11,7 +11,6 @@ import ( "github.com/clyso/ceph-api/pkg/log" "github.com/clyso/ceph-api/pkg/trace" "github.com/clyso/ceph-api/pkg/types" - "github.com/golang/protobuf/proto" grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware" grpc_auth "github.com/grpc-ecosystem/go-grpc-middleware/auth" grpc_ctxtags "github.com/grpc-ecosystem/go-grpc-middleware/tags" @@ -25,6 +24,7 @@ import ( "google.golang.org/grpc/keepalive" "google.golang.org/grpc/reflection" "google.golang.org/grpc/status" + "google.golang.org/protobuf/protoadapt" ) func NewGrpcServer(conf Config, @@ -179,7 +179,7 @@ func convertApiError(ctx context.Context, err error) error { if err == nil { return nil } - details := []proto.Message{&errdetails.RequestInfo{RequestId: xctx.GetTraceID(ctx)}} + details := []protoadapt.MessageV1{&errdetails.RequestInfo{RequestId: xctx.GetTraceID(ctx)}} var code codes.Code var mappedErr error switch { diff --git a/pkg/api/status_api_handlers.go b/pkg/api/status_api_handlers.go index f63dd80..955b831 100644 --- a/pkg/api/status_api_handlers.go +++ b/pkg/api/status_api_handlers.go @@ -149,7 +149,7 @@ func (s *statusAPI) GetCephPgDump(ctx context.Context, body *emptypb.Empty) (*pb func convertToPbGetCephOsdDumpResponse(osdDump types.CephOsdDumpResponse) *pb.GetCephOsdDumpResponse { // Convert pools - var osdDumpPools []*pb.OsdDumpPool + osdDumpPools := make([]*pb.OsdDumpPool, 0, len(osdDump.Pools)) for _, pool := range osdDump.Pools { osdDumpPools = append(osdDumpPools, &pb.OsdDumpPool{ Pool: pool.Pool, @@ -221,7 +221,7 @@ func convertToPbGetCephOsdDumpResponse(osdDump types.CephOsdDumpResponse) *pb.Ge blocklistPb[ip] = t.Timestamp } - var osdXInfo []*pb.OsdDumpOsdXInfo + osdXInfo := make([]*pb.OsdDumpOsdXInfo, 0, len(osdDump.OsdXinfo)) for _, osdX := range osdDump.OsdXinfo { osdXInfo = append(osdXInfo, &pb.OsdDumpOsdXInfo{ Osd: osdX.Osd, diff --git a/pkg/api/users_api_handlers.go b/pkg/api/users_api_handlers.go index 45abd35..35d268a 100644 --- a/pkg/api/users_api_handlers.go +++ b/pkg/api/users_api_handlers.go @@ -148,7 +148,7 @@ func (u *usersAPI) CreateUser(ctx context.Context, req *pb.CreateUserReq) (*empt PwdUpdateRequired: false, } if req.PwdExpirationDate != nil { - var expIn int = int(req.PwdExpirationDate.Seconds) + expIn := int(req.PwdExpirationDate.Seconds) usr.PwdExpirationDate = &expIn } err := u.svc.CreateUser(ctx, usr) @@ -225,7 +225,7 @@ func (u *usersAPI) UpdateUser(ctx context.Context, req *pb.CreateUserReq) (*empt PwdUpdateRequired: req.PwdUpdateRequired, } if req.PwdExpirationDate != nil { - var expIn int = int(req.PwdExpirationDate.Seconds) + expIn := int(req.PwdExpirationDate.Seconds) usr.PwdExpirationDate = &expIn } err := u.svc.UpdateUser(ctx, usr) diff --git a/pkg/app/start.go b/pkg/app/start.go index 79a050d..1c3c51a 100644 --- a/pkg/app/start.go +++ b/pkg/app/start.go @@ -35,7 +35,11 @@ func Start(ctx context.Context, conf config.Config, build config.Build) error { if err != nil { return err } - defer shutdown(context.Background()) + defer func() { + if err := shutdown(context.Background()); err != nil { + logger.Warn().Err(err).Msg("tracer shutdown failed") + } + }() // get rados connection radosConn, err := getRadosConnection(conf.Rados) @@ -63,7 +67,8 @@ func Start(ctx context.Context, conf config.Config, build config.Build) error { } if conf.App.CreateAdmin { _, err = userSvc.GetUser(ctx, conf.App.AdminUsername) - if errors.Is(err, types.ErrNotFound) { + switch { + case errors.Is(err, types.ErrNotFound): err = userSvc.CreateUser(ctx, user.User{ Username: conf.App.AdminUsername, Roles: []string{"administrator"}, @@ -74,7 +79,7 @@ func Start(ctx context.Context, conf config.Config, build config.Build) error { if err != nil { return fmt.Errorf("%w: unable to create admin user", err) } - } else if err == nil { + case err == nil: err = userSvc.UpdateUser(ctx, user.User{ Username: conf.App.AdminUsername, Roles: []string{"administrator"}, @@ -85,7 +90,7 @@ func Start(ctx context.Context, conf config.Config, build config.Build) error { if err != nil { return fmt.Errorf("%w: unable to update admin user", err) } - } else { + default: logger.Info().Err(err).Msg("skip default administrator creation") } } diff --git a/pkg/auth/oauth_adapter.go b/pkg/auth/oauth_adapter.go index f3b1a02..04caf59 100644 --- a/pkg/auth/oauth_adapter.go +++ b/pkg/auth/oauth_adapter.go @@ -35,9 +35,11 @@ func (s *Server) Login(ctx context.Context, username, password string) (*LoginRe resBody := struct { Token string `json:"access_token"` }{} - json.Unmarshal(resp.Body.Bytes(), &resBody) + if err := json.Unmarshal(resp.Body.Bytes(), &resBody); err != nil { + return nil, fmt.Errorf("%w: decode auth response: %w", types.ErrInternal, err) + } if resBody.Token == "" { - return nil, fmt.Errorf("%w: unable to get token from auth resp boyd", types.ErrInternal) + return nil, fmt.Errorf("%w: unable to get token from auth response body", types.ErrInternal) } usr, err := s.userSvc.GetUser(ctx, username) if err != nil { diff --git a/pkg/auth/oauth_server.go b/pkg/auth/oauth_server.go index 7350254..64db757 100644 --- a/pkg/auth/oauth_server.go +++ b/pkg/auth/oauth_server.go @@ -80,7 +80,7 @@ func NewServer(config Config, userSvc *user.Service) (*Server, error) { compose.OAuth2AuthorizeImplicitFactory, compose.OAuth2ClientCredentialsGrantFactory, compose.OAuth2RefreshTokenGrantFactory, - compose.OAuth2ResourceOwnerPasswordCredentialsFactory, + compose.OAuth2ResourceOwnerPasswordCredentialsFactory, //nolint:staticcheck // ROPC grant required for Ceph dashboard login compatibility compose.RFC7523AssertionGrantFactory, compose.OAuth2TokenIntrospectionFactory, compose.OAuth2TokenRevocationFactory, diff --git a/pkg/config/config.go b/pkg/config/config.go index 950b461..5c702bf 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -50,7 +50,7 @@ func Get(conf any, sources ...Src) error { if err != nil { return fmt.Errorf("%w: unable to read default config.yaml", err) } - defer data.Close() + defer func() { _ = data.Close() }() v := viper.NewWithOptions(viper.EnvKeyReplacer(strings.NewReplacer(".", "_"))) v.SetConfigType("yaml") diff --git a/pkg/rados/rados_mock.go b/pkg/rados/rados_mock.go index 3c73fc4..2ce11b9 100644 --- a/pkg/rados/rados_mock.go +++ b/pkg/rados/rados_mock.go @@ -34,15 +34,15 @@ func NewMockConn() (RadosConnInterface, error) { // Load responses from the embedded FS monResponses, err := loadResponsesFromDir(monDir) if err != nil { - return nil, fmt.Errorf("error loading mon responses: %v", err) + return nil, fmt.Errorf("error loading mon responses: %w", err) } monInputResponses, err := loadResponsesFromDir(monInputDir) if err != nil { - return nil, fmt.Errorf("error loading mon-input responses: %v", err) + return nil, fmt.Errorf("error loading mon-input responses: %w", err) } mgrResponses, err := loadResponsesFromDir(mgrDir) if err != nil { - return nil, fmt.Errorf("error loading mgr responses: %v", err) + return nil, fmt.Errorf("error loading mgr responses: %w", err) } return &MockConn{ diff --git a/pkg/types/ceph_errors.go b/pkg/types/ceph_errors.go index 050f569..24b42c2 100644 --- a/pkg/types/ceph_errors.go +++ b/pkg/types/ceph_errors.go @@ -7,6 +7,5 @@ import ( ) const ( - // ErrNotFound is returned when an object is not found. - RadosErrorNotFound = rados.ErrNotFound + ErrRadosNotFound = rados.ErrNotFound ) diff --git a/pkg/types/ceph_errors_mock.go b/pkg/types/ceph_errors_mock.go index 671df73..5d3598f 100644 --- a/pkg/types/ceph_errors_mock.go +++ b/pkg/types/ceph_errors_mock.go @@ -2,9 +2,8 @@ package types -import "fmt" +import "errors" var ( - // ErrNotFound is returned when an object is not found. - RadosErrorNotFound = fmt.Errorf("Error Not Found") + ErrRadosNotFound = errors.New("error not found") ) diff --git a/pkg/user/service.go b/pkg/user/service.go index 7475284..377d3ae 100644 --- a/pkg/user/service.go +++ b/pkg/user/service.go @@ -56,7 +56,7 @@ func (s *Service) updateFromDB(ctx context.Context) error { s.roles = map[string]Role{} cmdRes, err := s.radosSvc.ExecMon(ctx, getDBMonCmd) if err != nil { - if errors.Is(err, types.RadosErrorNotFound) { + if errors.Is(err, types.ErrRadosNotFound) { return nil } return err diff --git a/test/setup_cgo_test.go b/test/setup_cgo_test.go index 6c98c2c..5dd0d6d 100644 --- a/test/setup_cgo_test.go +++ b/test/setup_cgo_test.go @@ -18,7 +18,9 @@ import ( "github.com/clyso/ceph-api/pkg/config" "github.com/clyso/ceph-api/test/testenv" "google.golang.org/grpc" + "google.golang.org/grpc/backoff" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" ) var ( @@ -92,14 +94,17 @@ func runSetup(m *testing.M) (int, error) { fmt.Println("http", httpAddr) fmt.Println("grpc", grpcAddr) - tlsOpt := grpc.WithInsecure() + if err := waitForTCP(ctx, grpcAddr, 2*time.Minute); err != nil { + return 1, fmt.Errorf("wait for api server: %w", err) + } + + tlsOpt := grpc.WithTransportCredentials(insecure.NewCredentials()) if conf.Api.Secure { tlsOpt = grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: true})) } - grpcConn, err = grpc.DialContext(ctx, grpcAddr, + grpcConn, err = grpc.NewClient(grpcAddr, tlsOpt, - grpc.WithBackoffMaxDelay(time.Second), - grpc.WithBlock(), + grpc.WithConnectParams(grpc.ConnectParams{Backoff: backoff.DefaultConfig, MinConnectTimeout: time.Second}), ) if err != nil { return 1, fmt.Errorf("dial grpc: %w", err) @@ -131,6 +136,24 @@ func runSetup(m *testing.M) (int, error) { return exitCode, nil } +func waitForTCP(ctx context.Context, addr string, timeout time.Duration) error { + ctx, cancel := context.WithTimeout(ctx, timeout) + defer cancel() + var dialer net.Dialer + for { + conn, err := dialer.DialContext(ctx, "tcp", addr) + if err == nil { + _ = conn.Close() + return nil + } + select { + case <-ctx.Done(): + return fmt.Errorf("%s not reachable: %w", addr, err) + case <-time.After(200 * time.Millisecond): + } + } +} + func getRandomPort() (int, string) { l, err := net.Listen("tcp", "localhost:0") if err != nil { diff --git a/test/status_test.go b/test/status_test.go index 8c2cc07..829edb7 100644 --- a/test/status_test.go +++ b/test/status_test.go @@ -123,9 +123,8 @@ func Test_GetCephOsdDump(t *testing.T) { r.NotEmpty(osd.State, "state array should not be empty at index %d", i) } - // Check OSD XInfo + // Check OSD XInfo. OSD IDs start at 0, so don't assert non-zero on xinfo.Osd. for i, xinfo := range res.OsdXinfo { - r.NotZero(xinfo.Osd, "xinfo.osd should not be zero at index %d", i) r.NotNil(xinfo.DownStamp, "xinfo.down_stamp should not be nil at index %d", i) r.NotZero(xinfo.Features, "xinfo.features should not be zero at index %d", i) } @@ -177,14 +176,12 @@ func Test_GetCephPgDump(t *testing.T) { t.Log("pg_stats_delta is nil; skipping delta checks.") } + // OSD IDs start at 0, so don't assert non-zero on osd identifiers here. if len(res.PgMap.OsdStats) > 0 { osdStat := res.PgMap.OsdStats[0] - r.NotZero(osdStat.Osd, "osd stats: osd should not be zero") - // If network_ping_times is present: if len(osdStat.NetworkPingTimes) > 0 { netPingTime := osdStat.NetworkPingTimes[0] - r.NotZero(netPingTime.Osd, "osd_stats[0].network_ping_times[0].osd should not be zero") r.NotNil(netPingTime.LastUpdate, "osd_stats[0].network_ping_times[0].last_update should not be nil") } else { t.Log("osd_stats[0].network_ping_times is empty; skipping ping time checks.") diff --git a/test/testenv/ceph.go b/test/testenv/ceph.go index b34b933..aef51b7 100644 --- a/test/testenv/ceph.go +++ b/test/testenv/ceph.go @@ -153,7 +153,10 @@ func (e *CephEnv) waitHealthy(ctx context.Context, timeout time.Duration) error for { select { case <-ctx.Done(): - return fmt.Errorf("timeout waiting for ceph health (last: %v): %w", lastErr, ctx.Err()) + if lastErr == nil { + return fmt.Errorf("timeout waiting for ceph health: %w", ctx.Err()) + } + return fmt.Errorf("timeout waiting for ceph health (last: %s): %w", lastErr.Error(), ctx.Err()) case <-ticker.C: exitCode, reader, err := e.container.Exec(ctx, []string{"ceph", "health"}, tcexec.Multiplexed()) if err != nil { From 1764fbfb89c93331eb8987fa0ef92dc8fb2a06bf Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Wed, 20 May 2026 15:32:47 +0200 Subject: [PATCH 03/10] upgrade dependecies Signed-off-by: Artem Torubarov --- .github/workflows/helm-lint.yml | 2 +- .github/workflows/release.yml | 30 +-- .github/workflows/test.yml | 4 +- .golangci.yml | 2 +- Dockerfile | 2 +- go.mod | 117 ++++---- go.sum | 439 +++++++++---------------------- lima-ceph-dev.yaml | 7 +- pkg/auth/oauth_server.go | 14 +- pkg/auth/oauth_token_endpoint.go | 4 +- pkg/types/ceph_errors.go | 2 +- test/Dockerfile | 2 +- test/testenv/ceph.go | 22 +- test/testenv/tid.go | 18 +- 14 files changed, 236 insertions(+), 429 deletions(-) diff --git a/.github/workflows/helm-lint.yml b/.github/workflows/helm-lint.yml index 7eed8c2..349b9ad 100644 --- a/.github/workflows/helm-lint.yml +++ b/.github/workflows/helm-lint.yml @@ -14,7 +14,7 @@ jobs: helm-lint: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Install helm uses: azure/setup-helm@v4.2.0 - name: Lint default chart diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 119e6a5..90827cb 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -16,7 +16,7 @@ jobs: id-token: write runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up QEMU uses: docker/setup-qemu-action@v3 - name: Set up Docker Buildx @@ -52,7 +52,7 @@ jobs: GIT_COMMIT=${{ github.sha }} - name: Generate artifact attestation - uses: actions/attest-build-provenance@v1 + uses: actions/attest-build-provenance@v3 with: subject-name: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME}} subject-digest: ${{ steps.push.outputs.digest }} @@ -68,12 +68,10 @@ jobs: id-token: write runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: read chart version id: chartVer - uses: mikefarah/yq@v4.43.1 - with: - cmd: yq '.version' deploy/ceph-api/Chart.yaml + run: echo "result=$(yq '.version' deploy/ceph-api/Chart.yaml)" >> "$GITHUB_OUTPUT" - name: Install helm uses: azure/setup-helm@v4.2.0 - name: Publish chart @@ -89,20 +87,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout - uses: actions/checkout@v2 - - - name: Create changelog text - id: changelog - uses: loopwerk/tag-changelog@v1 - with: - token: ${{ secrets.GITHUB_TOKEN }} - exclude_types: other,doc,chore + uses: actions/checkout@v6 - name: Create release - uses: actions/create-release@latest env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - tag_name: ${{ github.ref }} - release_name: Release ${{ github.ref }} - body: ${{ steps.changelog.outputs.changes }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh release create "${{ github.ref_name }}" \ + --title "Release ${{ github.ref_name }}" \ + --generate-notes diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 4ef6919..55617a7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,9 +14,9 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 + - uses: actions/checkout@v6 - name: Set up Go - uses: actions/setup-go@v4 + uses: actions/setup-go@v6 with: go-version-file: go.mod - name: make check diff --git a/.golangci.yml b/.golangci.yml index e7f1e57..39f3de1 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -1,6 +1,6 @@ version: "2" run: - go: "1.25" + go: "1.26" tests: true linters: default: none diff --git a/Dockerfile b/Dockerfile index 0c4cb67..a1a81ee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.25 AS builder +FROM golang:1.26 AS builder ARG TARGETOS ARG TARGETARCH ARG GIT_COMMIT='not set' diff --git a/go.mod b/go.mod index ccd5759..1e22d4b 100644 --- a/go.mod +++ b/go.mod @@ -1,43 +1,43 @@ module github.com/clyso/ceph-api -go 1.25.6 +go 1.26.3 require ( - github.com/ceph/go-ceph v0.26.0 + github.com/ceph/go-ceph v0.39.0 github.com/golang-jwt/jwt v3.2.2+incompatible github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 - github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 + github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 github.com/mattn/go-colorable v0.1.14 // indirect - github.com/mattn/go-isatty v0.0.20 // indirect - github.com/ory/fosite v0.46.1 - github.com/prometheus/client_golang v1.19.0 - github.com/rs/zerolog v1.32.0 - github.com/spf13/viper v1.18.2 + github.com/mattn/go-isatty v0.0.22 // indirect + github.com/ory/fosite v0.49.0 + github.com/prometheus/client_golang v1.23.2 + github.com/rs/zerolog v1.35.1 + github.com/spf13/viper v1.21.0 github.com/stretchr/testify v1.11.1 github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 - go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 - go.opentelemetry.io/otel v1.41.0 + go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 + go.opentelemetry.io/otel v1.43.0 go.opentelemetry.io/otel/exporters/jaeger v1.17.0 // indirect - go.opentelemetry.io/otel/sdk v1.41.0 - go.opentelemetry.io/otel/trace v1.41.0 + go.opentelemetry.io/otel/sdk v1.43.0 + go.opentelemetry.io/otel/trace v1.43.0 golang.org/x/crypto v0.51.0 golang.org/x/sync v0.20.0 - golang.org/x/sys v0.44.0 // indirect; indirect0 - google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d - google.golang.org/grpc v1.79.3 + golang.org/x/sys v0.44.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20260519071638-aa98bba5eb94 + google.golang.org/grpc v1.81.1 google.golang.org/protobuf v1.36.11 ) require ( - github.com/aws/aws-sdk-go v1.50.9 - github.com/docker/docker v28.5.2+incompatible - github.com/docker/go-connections v0.6.0 + github.com/aws/aws-sdk-go v1.55.8 + github.com/moby/moby/api v1.54.2 + github.com/moby/moby/client v0.4.1 github.com/soheilhy/cmux v0.1.5 - github.com/testcontainers/testcontainers-go v0.41.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 - golang.org/x/oauth2 v0.35.0 + github.com/testcontainers/testcontainers-go v0.42.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 + golang.org/x/oauth2 v0.36.0 ) require ( @@ -127,38 +127,36 @@ require ( github.com/containerd/stargz-snapshotter/estargz v0.18.2 // indirect github.com/cpuguy83/dockercfg v0.3.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect - github.com/creack/pty v1.1.24 // indirect - github.com/creasty/defaults v1.7.0 // indirect github.com/cristalhq/jwt/v4 v4.0.2 // indirect github.com/curioswitch/go-reassign v0.3.0 // indirect github.com/daixiang0/gci v0.13.7 // indirect github.com/dave/dst v0.27.3 // indirect - github.com/dave/jennifer v1.7.1 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/denis-tingaikin/go-header v0.5.0 // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/dgraph-io/ristretto v1.0.0 // indirect github.com/distribution/reference v0.6.0 // indirect github.com/dlclark/regexp2 v1.12.0 // indirect github.com/docker/cli v29.2.1+incompatible // indirect github.com/docker/distribution v2.8.3+incompatible // indirect + github.com/docker/docker v28.5.2+incompatible // indirect github.com/docker/docker-credential-helpers v0.9.5 // indirect + github.com/docker/go-connections v0.7.0 // indirect github.com/docker/go-units v0.5.0 // indirect github.com/dustin/go-humanize v1.0.1 // indirect github.com/ebitengine/purego v0.10.0 // indirect - github.com/ecordell/optgen v0.0.9 // indirect github.com/ettle/strcase v0.2.0 // indirect github.com/fatih/color v1.19.0 // indirect github.com/fatih/structtag v1.2.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/firefart/nonamedreturns v1.0.6 // indirect - github.com/fsnotify/fsnotify v1.7.0 // indirect + github.com/fsnotify/fsnotify v1.10.1 // indirect github.com/fzipp/gocyclo v0.6.0 // indirect github.com/ghostiam/protogetter v0.3.20 // indirect github.com/go-critic/go-critic v0.14.3 // indirect - github.com/go-jose/go-jose/v3 v3.0.3 // indirect + github.com/go-jose/go-jose/v3 v3.0.5 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-ole/go-ole v1.2.6 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-toolsmith/astcast v1.1.0 // indirect github.com/go-toolsmith/astcopy v1.1.0 // indirect github.com/go-toolsmith/astequal v1.2.0 // indirect @@ -168,12 +166,11 @@ require ( github.com/go-toolsmith/typep v1.1.0 // indirect github.com/go-viper/mapstructure/v2 v2.5.0 // indirect github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect - github.com/gobuffalo/pop/v6 v6.1.1 // indirect github.com/gobwas/glob v0.2.3 // indirect github.com/godoc-lint/godoc-lint v0.11.2 // indirect github.com/gofrs/flock v0.13.0 // indirect + github.com/gogo/googleapis v1.4.1 // indirect github.com/gogo/protobuf v1.3.2 // indirect - github.com/golang/glog v1.2.5 // indirect github.com/golang/mock v1.6.0 // indirect github.com/golangci/asciicheck v0.5.0 // indirect github.com/golangci/dupl v0.0.0-20260401084720-c99c5cf5c202 // indirect @@ -199,12 +196,12 @@ require ( github.com/gostaticanalysis/nilerr v0.1.2 // indirect github.com/hashicorp/go-cleanhttp v0.5.2 // indirect github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect - github.com/hashicorp/go-retryablehttp v0.7.5 // indirect + github.com/hashicorp/go-retryablehttp v0.7.8 // indirect github.com/hashicorp/go-version v1.9.0 // indirect github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/jaegertracing/jaeger-idl v0.7.1 // indirect github.com/jdx/go-netrc v1.0.0 // indirect github.com/jgautheron/goconst v1.10.0 // indirect github.com/jjti/go-spancheck v0.6.5 // indirect @@ -213,7 +210,7 @@ require ( github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect github.com/kisielk/errcheck v1.10.0 // indirect github.com/kkHAIKE/contextcheck v1.1.6 // indirect - github.com/klauspost/compress v1.18.5 // indirect + github.com/klauspost/compress v1.18.6 // indirect github.com/klauspost/pgzip v1.2.6 // indirect github.com/kulti/thelper v0.7.1 // indirect github.com/kunwardeep/paralleltest v1.0.15 // indirect @@ -226,7 +223,7 @@ require ( github.com/ldez/usetesting v0.5.0 // indirect github.com/leonklingele/grouper v1.1.2 // indirect github.com/lucasb-eyer/go-colorful v1.4.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e // indirect github.com/macabu/inamedparam v0.2.0 // indirect github.com/magiconair/properties v1.8.10 // indirect github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect @@ -238,7 +235,6 @@ require ( github.com/mattn/goveralls v0.0.12 // indirect github.com/mgechev/revive v1.15.0 // indirect github.com/mitchellh/go-homedir v1.1.0 // indirect - github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/moby/docker-image-spec v1.3.1 // indirect github.com/moby/go-archive v0.2.0 // indirect github.com/moby/patternmatcher v0.6.1 // indirect @@ -250,24 +246,26 @@ require ( github.com/moricho/tparallel v0.3.2 // indirect github.com/morikuni/aec v1.1.0 // indirect github.com/muesli/cancelreader v0.2.2 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect github.com/nakabonne/nestif v0.3.1 // indirect github.com/nishanths/exhaustive v0.12.0 // indirect github.com/nishanths/predeclared v0.2.2 // indirect github.com/nunnatsa/ginkgolinter v0.23.0 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect github.com/opencontainers/image-spec v1.1.1 // indirect - github.com/openzipkin/zipkin-go v0.4.2 // indirect + github.com/openzipkin/zipkin-go v0.4.3 // indirect github.com/ory/go-acc v0.2.9-0.20230103102148-6b1c9a70dbbe // indirect github.com/ory/go-convenience v0.1.0 // indirect - github.com/ory/x v0.0.616 // indirect + github.com/ory/pop/v6 v6.4.1 // indirect + github.com/ory/x v0.0.729 // indirect github.com/pelletier/go-toml/v2 v2.3.1 // indirect github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect - github.com/prometheus/client_model v0.6.0 // indirect - github.com/prometheus/common v0.50.0 // indirect - github.com/prometheus/procfs v0.13.0 // indirect + github.com/prometheus/client_model v0.6.2 // indirect + github.com/prometheus/common v0.67.5 // indirect + github.com/prometheus/procfs v0.20.1 // indirect github.com/quasilyte/go-ruleguard v0.4.5 // indirect github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect @@ -283,8 +281,7 @@ require ( github.com/ryancurrah/gomodguard v1.4.1 // indirect github.com/ryancurrah/gomodguard/v2 v2.1.3 // indirect github.com/ryanrolds/sqlclosecheck v0.6.0 // indirect - github.com/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/sagikazarmark/locafero v0.12.0 // indirect github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect github.com/sashamelentyev/interfacebloat v1.1.0 // indirect @@ -297,23 +294,22 @@ require ( github.com/sirupsen/logrus v1.9.4 // indirect github.com/sivchari/containedctx v1.0.3 // indirect github.com/sonatard/noctx v0.5.1 // indirect - github.com/sourcegraph/conc v0.3.0 // indirect github.com/sourcegraph/go-diff v0.8.0 // indirect github.com/spf13/afero v1.15.0 // indirect - github.com/spf13/cast v1.6.0 // indirect + github.com/spf13/cast v1.10.0 // indirect github.com/spf13/cobra v1.10.2 // indirect github.com/spf13/pflag v1.0.10 // indirect github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect github.com/stbenjam/no-sprintf-host-port v0.3.1 // indirect - github.com/stretchr/objx v0.5.2 // indirect + github.com/stretchr/objx v0.5.3 // indirect github.com/subosito/gotenv v1.6.0 // indirect github.com/tetafro/godot v1.5.6 // indirect github.com/tetratelabs/wazero v1.11.0 // indirect github.com/tidwall/btree v1.8.1 // indirect github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 // indirect github.com/timonwong/loggercheck v0.11.0 // indirect - github.com/tklauser/go-sysconf v0.3.16 // indirect - github.com/tklauser/numcpus v0.11.0 // indirect + github.com/tklauser/go-sysconf v0.4.0 // indirect + github.com/tklauser/numcpus v0.12.0 // indirect github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect github.com/ultraware/funlen v0.2.0 // indirect @@ -337,29 +333,28 @@ require ( go.lsp.dev/protocol v0.12.0 // indirect go.lsp.dev/uri v0.3.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 // indirect - go.opentelemetry.io/contrib/propagators/b3 v1.24.0 // indirect - go.opentelemetry.io/contrib/propagators/jaeger v1.24.0 // indirect - go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 // indirect - go.opentelemetry.io/otel/exporters/zipkin v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.41.0 // indirect - go.opentelemetry.io/proto/otlp v1.9.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.68.0 // indirect + go.opentelemetry.io/contrib/propagators/b3 v1.43.0 // indirect + go.opentelemetry.io/contrib/propagators/jaeger v1.43.0 // indirect + go.opentelemetry.io/contrib/samplers/jaegerremote v0.37.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 // indirect + go.opentelemetry.io/otel/exporters/zipkin v1.43.0 // indirect + go.opentelemetry.io/otel/metric v1.43.0 // indirect + go.opentelemetry.io/proto/otlp v1.10.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.1 // indirect + go.yaml.in/yaml/v2 v2.4.4 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect - golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa // indirect + golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a // indirect golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 // indirect golang.org/x/mod v0.36.0 // indirect golang.org/x/net v0.54.0 // indirect golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 // indirect golang.org/x/term v0.43.0 // indirect golang.org/x/text v0.37.0 // indirect - golang.org/x/time v0.11.0 // indirect golang.org/x/tools v0.45.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20260519071638-aa98bba5eb94 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1 // indirect - gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.7.0 // indirect mvdan.cc/gofumpt v0.9.2 // indirect diff --git a/go.sum b/go.sum index 31ebc86..bfe69d1 100644 --- a/go.sum +++ b/go.sum @@ -76,7 +76,6 @@ github.com/ClickHouse/clickhouse-go-linter v1.2.0 h1:zbm174up3hTKjp0wKZVnTzRiG7t github.com/ClickHouse/clickhouse-go-linter v1.2.0/go.mod h1:pLorS7ffPTfuUV9M0SJgfHA/h/WQPQUk2FWG9x74cQ4= github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g= github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k= -github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= github.com/Masterminds/semver/v3 v3.5.0 h1:kQceYJfbupGfZOKZQg0kou0DgAKhzDg2NZPAwZ/2OOE= github.com/Masterminds/semver/v3 v3.5.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM= github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY= @@ -111,9 +110,8 @@ github.com/ashanbrown/forbidigo/v2 v2.3.1 h1:KAZijvQ7zeIBKbhikT4jCm0TLYXC4u78bTi github.com/ashanbrown/forbidigo/v2 v2.3.1/go.mod h1:2QDkLTzU6TV937eFROamXrW92M3paehdae4HCDCOZCM= github.com/ashanbrown/makezero/v2 v2.2.1 h1:A7uU8dgB1PA9aelTxHMfHIQ8Qev8AB3JLxJUBUsejqM= github.com/ashanbrown/makezero/v2 v2.2.1/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY= -github.com/aws/aws-sdk-go v1.50.9 h1:yX66aKnEtRc/uNV/1EH8CudRT5aLwVwcSwTBphuVPt8= -github.com/aws/aws-sdk-go v1.50.9/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk= -github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ= +github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= @@ -152,9 +150,8 @@ github.com/cenkalti/backoff/v4 v4.3.0/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyY 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/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= -github.com/ceph/go-ceph v0.26.0 h1:LZoATo25ZH5aeL5t85BwIbrNLKCDfcDM+e0qV0cmwHY= -github.com/ceph/go-ceph v0.26.0/go.mod h1:ISxb295GszZwtLPkeWi+L2uLYBVsqbsh0M104jZMOX4= -github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/ceph/go-ceph v0.39.0 h1:fzINuBItJqhmTtnC4/iiTY+ONtsOqV7W+B/3xTS/DsY= +github.com/ceph/go-ceph v0.39.0/go.mod h1:UId58dqtDKTwnv3OY8rdpC+Ulz/AVpcvZqjXDICcd5c= 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/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk= @@ -181,7 +178,6 @@ github.com/clipperhouse/displaywidth v0.11.0/go.mod h1:bkrFNkf81G8HyVqmKGxsPufD3 github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk= github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= @@ -192,20 +188,13 @@ github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpS github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= github.com/containerd/stargz-snapshotter/estargz v0.18.2 h1:yXkZFYIzz3eoLwlTUZKz2iQ4MrckBxJjkmD16ynUTrw= github.com/containerd/stargz-snapshotter/estargz v0.18.2/go.mod h1:XyVU5tcJ3PRpkA9XS2T5us6Eg35yM0214Y+wvrZTBrY= -github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= -github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/dockercfg v0.3.2 h1:DlJTyZGBDlXqUZ2Dk2Q3xHs/FtnooJJVaad2S9GKorA= github.com/cpuguy83/dockercfg v0.3.2/go.mod h1:sugsbF4//dDlL/i+S+rtpIWp+5h0BHJHfjj5/jFyUJc= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= -github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= github.com/creack/pty v1.1.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= -github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA= -github.com/creasty/defaults v1.7.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= github.com/cristalhq/jwt/v4 v4.0.2 h1:g/AD3h0VicDamtlM70GWGElp8kssQEv+5wYd7L9WOhU= github.com/cristalhq/jwt/v4 v4.0.2/go.mod h1:HnYraSNKDRag1DZP92rYHyrjyQHnVEHPNqesmzs+miQ= github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs= @@ -222,10 +211,10 @@ github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1 github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8= github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY= -github.com/dgraph-io/ristretto v0.1.1 h1:6CWw5tJNgpegArSHpNHJKldNeq03FQCwYvfMVWajOK8= -github.com/dgraph-io/ristretto v0.1.1/go.mod h1:S1GPSBCYCIhmVNfcth17y2zZtQT6wzkzgwUve0VDWWA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 h1:tdlZCpZ/P9DhczCTSixgIKmwPv6+wP5DGjqLYw5SUiA= -github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= +github.com/dgraph-io/ristretto v1.0.0 h1:SYG07bONKMlFDUYu5pEu3DGAh8c2OFNzKm6G9J4Si84= +github.com/dgraph-io/ristretto v1.0.0/go.mod h1:jTi2FiYEhQ1NsMmA7DeBykizjOuY88NhKBkepyu1jPc= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13 h1:fAjc9m62+UWV/WAFKLNi6ZS0675eEUC9y3AlwSbQu1Y= +github.com/dgryski/go-farm v0.0.0-20200201041132-a6ae2369ad13/go.mod h1:SqUrOPUnsFjfmXRMNPybcSiG0BgUW2AuFH8PAnS2iTw= github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk= github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dlclark/regexp2 v1.12.0 h1:0j4c5qQmnC6XOWNjP3PIXURXN2gWx76rd3KvgdPkCz8= @@ -238,27 +227,22 @@ github.com/docker/docker v28.5.2+incompatible h1:DBX0Y0zAjZbSrm1uzOkdr1onVghKaft github.com/docker/docker v28.5.2+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/docker/docker-credential-helpers v0.9.5 h1:EFNN8DHvaiK8zVqFA2DT6BjXE0GzfLOZ38ggPTKePkY= github.com/docker/docker-credential-helpers v0.9.5/go.mod h1:v1S+hepowrQXITkEfw6o4+BMbGot02wiKpzWhGUZK6c= -github.com/docker/go-connections v0.6.0 h1:LlMG9azAe1TqfR7sO+NJttz1gy6KO7VJBh+pMmjSD94= -github.com/docker/go-connections v0.6.0/go.mod h1:AahvXYshr6JgfUJGdDCs2b5EZG/vmaMAntpSFH5BFKE= +github.com/docker/go-connections v0.7.0 h1:6SsRfJddP22WMrCkj19x9WKjEDTB+ahsdiGYf0mN39c= +github.com/docker/go-connections v0.7.0/go.mod h1:no1qkHdjq7kLMGUXYAduOhYPSJxxvgWBh7ogVvptn3Q= github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4= github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk= -github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU= github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ= -github.com/ecordell/optgen v0.0.9 h1:kmRMqOkbNsWayOnZSk2m5SeGaOTOc7amfi+MAnaMOeI= -github.com/ecordell/optgen v0.0.9/go.mod h1:+YZ4tk5pNGMoeH+Y4F4HeDDj0SLOlIgMMNae7az4h5g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q= github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A= -github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/fatih/color v1.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= -github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= @@ -267,16 +251,16 @@ github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47A github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo= github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= -github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= -github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/fsnotify/fsnotify v1.10.1 h1:b0/UzAf9yR5rhf3RPm9gf3ehBPpf0oZKIjtpKrx59Ho= +github.com/fsnotify/fsnotify v1.10.1/go.mod h1:TLheqan6HD6GBK6PrDWyDPBaEV8LspOxvPSjC+bVfgo= github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= github.com/ghostiam/protogetter v0.3.20 h1:oW7OPFit2FxZOpmMRPP9FffU4uUpfeE/rEdE1f+MzD0= github.com/ghostiam/protogetter v0.3.20/go.mod h1:FjIu5Yfs6FT391m+Fjp3fbAYJ6rkL/J6ySpZBfnODuI= github.com/go-critic/go-critic v0.14.3 h1:5R1qH2iFeo4I/RJU8vTezdqs08Egi4u5p6vOESA0pog= github.com/go-critic/go-critic v0.14.3/go.mod h1:xwntfW6SYAd7h1OqDzmN6hBX/JxsEKl5up/Y2bsxgVQ= -github.com/go-jose/go-jose/v3 v3.0.3 h1:fFKWeig/irsp7XD2zBxvnmA/XaRWp5V3CBsZXJF7G7k= -github.com/go-jose/go-jose/v3 v3.0.3/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= +github.com/go-jose/go-jose/v3 v3.0.5 h1:BLLJWbC4nMZOfuPVxoZIxeYsn6Nl2r1fITaJ78UQlVQ= +github.com/go-jose/go-jose/v3 v3.0.5/go.mod h1:5b+7YgP7ZICgJDBdfjZaIt+H/9L9T/YQrVfLAMboGkQ= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= @@ -284,12 +268,11 @@ 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-ole/go-ole v1.2.6 h1:/Fpf6oFPoeFik9ty7siob0G6Ke8QvQEuVcuChpwXzpY= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= github.com/go-quicktest/qt v1.101.0 h1:O1K29Txy5P2OK0dGo59b7b0LR6wKfIhttaAhHUyn7eI= github.com/go-quicktest/qt v1.101.0/go.mod h1:14Bz/f7NwaXPtdYEgzsx46kqSxVwTbzVZsDC26tQJow= -github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg= -github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEevZMzYi5KSi8KkcZtzBcTgAUUtapy0OI= github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI= @@ -317,42 +300,22 @@ github.com/go-viper/mapstructure/v2 v2.5.0 h1:vM5IJoUAy3d7zRSVtIwQgBj7BiWtMPfmPE github.com/go-viper/mapstructure/v2 v2.5.0/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM= github.com/go-xmlfmt/xmlfmt v1.1.3 h1:t8Ey3Uy7jDSEisW2K3somuMKIpzktkWptA0iFCnRUWY= github.com/go-xmlfmt/xmlfmt v1.1.3/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= -github.com/gobuffalo/attrs v1.0.3/go.mod h1:KvDJCE0avbufqS0Bw3UV7RQynESY0jjod+572ctX4t8= -github.com/gobuffalo/envy v1.10.2/go.mod h1:qGAGwdvDsaEtPhfBzb3o0SfDea8ByGn9j8bKmVft9z8= -github.com/gobuffalo/fizz v1.14.4/go.mod h1:9/2fGNXNeIFOXEEgTPJwiK63e44RjG+Nc4hfMm1ArGM= -github.com/gobuffalo/flect v0.3.0/go.mod h1:5pf3aGnsvqvCj50AVni7mJJF8ICxGZ8HomberC3pXLE= -github.com/gobuffalo/flect v1.0.0/go.mod h1:l9V6xSb4BlXwsxEMj3FVEub2nkdQjWhPvD8XTTlHPQc= -github.com/gobuffalo/genny/v2 v2.1.0/go.mod h1:4yoTNk4bYuP3BMM6uQKYPvtP6WsXFGm2w2EFYZdRls8= -github.com/gobuffalo/github_flavored_markdown v1.1.3/go.mod h1:IzgO5xS6hqkDmUh91BW/+Qxo/qYnvfzoz3A7uLkg77I= -github.com/gobuffalo/helpers v0.6.7/go.mod h1:j0u1iC1VqlCaJEEVkZN8Ia3TEzfj/zoXANqyJExTMTA= -github.com/gobuffalo/logger v1.0.7/go.mod h1:u40u6Bq3VVvaMcy5sRBclD8SXhBYPS0Qk95ubt+1xJM= -github.com/gobuffalo/nulls v0.4.2/go.mod h1:EElw2zmBYafU2R9W4Ii1ByIj177wA/pc0JdjtD0EsH8= -github.com/gobuffalo/packd v1.0.2/go.mod h1:sUc61tDqGMXON80zpKGp92lDb86Km28jfvX7IAyxFT8= -github.com/gobuffalo/plush/v4 v4.1.16/go.mod h1:6t7swVsarJ8qSLw1qyAH/KbrcSTwdun2ASEQkOznakg= -github.com/gobuffalo/plush/v4 v4.1.18/go.mod h1:xi2tJIhFI4UdzIL8sxZtzGYOd2xbBpcFbLZlIPGGZhU= -github.com/gobuffalo/pop/v6 v6.1.1 h1:eUDBaZcb0gYrmFnKwpuTEUA7t5ZHqNfvS4POqJYXDZY= -github.com/gobuffalo/pop/v6 v6.1.1/go.mod h1:1n7jAmI1i7fxuXPZjZb0VBPQDbksRtCoFnrDV5IsvaI= -github.com/gobuffalo/tags/v3 v3.1.4/go.mod h1:ArRNo3ErlHO8BtdA0REaZxijuWnWzF6PUXngmMXd2I0= -github.com/gobuffalo/validate/v3 v3.3.3/go.mod h1:YC7FsbJ/9hW/VjQdmXPvFqvRis4vrRYFxr69WiNZw6g= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= -github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/godoc-lint/godoc-lint v0.11.2 h1:Bp0FkJWoSdNsBikdNgIcgtaoo+xz6I/Y9s5WSBQUeeM= github.com/godoc-lint/godoc-lint v0.11.2/go.mod h1:iVpGdL1JCikNH2gGeAn3Hh+AgN5Gx/I/cxV+91L41jo= github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw= github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0= -github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= -github.com/gofrs/uuid v4.3.1+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid/v5 v5.4.0 h1:EfbpCTjqMuGyq5ZJwxqzn3Cbr2d0rUZU7v5ycAk/e/0= +github.com/gofrs/uuid/v5 v5.4.0/go.mod h1:CDOjlDMVAtN56jqyRUZh58JT31Tiw7/oQyEXZV+9bD8= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= +github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= github.com/golang-jwt/jwt v3.2.2+incompatible h1:IfV12K8xAKAnZqdXVzCZ+TOjboZ2keLg81eXfW3O+oY= github.com/golang-jwt/jwt v3.2.2+incompatible/go.mod h1:8pz2t5EyA70fFQQSrl6XZXzqecmYZeUEB8OUGHkxJ+I= github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= -github.com/golang/glog v1.2.5 h1:DrW6hGnjIhtvhOIiAKT6Psh/Kd/ldepEa81DKeiRJ5I= -github.com/golang/glog v1.2.5/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc= github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs= @@ -391,7 +354,6 @@ github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5a github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.4/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= @@ -400,12 +362,10 @@ github.com/google/go-containerregistry v0.21.0 h1:ocqxUOczFwAZQBMNE7kuzfqvDe0VWo github.com/google/go-containerregistry v0.21.0/go.mod h1:ctO5aCaewH4AK1AumSF5DPW+0+R+d2FmylMJdp5G7p0= github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83 h1:z2ogiKUYzX5Is6zr/vP9vJGqPwcdqsWjOt+V8J7+bTc= github.com/google/pprof v0.0.0-20260115054156-294ebfa9ad83/go.mod h1:MxpfABSjhmINe3F1It9d+8exIHFvUqtLIRCdOGNXqiI= -github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= 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/gordonklaus/ineffassign v0.2.0 h1:Uths4KnmwxNJNzq87fwQQDDnbNb7De00VOk9Nu0TySs= github.com/gordonklaus/ineffassign v0.2.0/go.mod h1:TIpymnagPSexySzs7F9FnO1XFTy8IT3a59vmZp5Y9Lw= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= @@ -425,17 +385,16 @@ github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDa github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0 h1:HWRh5R2+9EifMyIHV7ZV+MIZqgz+PMpZ14Jynv3O2Zs= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.28.0/go.mod h1:JfhWUomR1baixubs02l85lZYYOm7LV6om4ceouMv45c= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0 h1:5VipnvEpbqr2gA2VbM+nYVbkIF28c5ZQfqCBQ5g2xfk= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.29.0/go.mod h1:Hyl3n6Twe1hvtd9XUXDec4pTvgMSEixRuQKPTMH2bNs= github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= -github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= -github.com/hashicorp/go-hclog v1.5.0 h1:bI2ocEMgcVlz55Oj1xZNBsVi900c7II+fWDyV9o+13c= -github.com/hashicorp/go-hclog v1.5.0/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= +github.com/hashicorp/go-hclog v1.6.3 h1:Qr2kF+eVWjTiYmU7Y31tYlP1h0q/X3Nl3tPGdaB11/k= +github.com/hashicorp/go-hclog v1.6.3/go.mod h1:W4Qnvbt70Wk/zYJryRzDRU/4r0kIg0PVHBcfoyhpF5M= github.com/hashicorp/go-immutable-radix/v2 v2.1.0 h1:CUW5RYIcysz+D3B+l1mDeXrQ7fUvGGCwJfdASSzbrfo= github.com/hashicorp/go-immutable-radix/v2 v2.1.0/go.mod h1:hgdqLXA4f6NIjRVisM1TJ9aOJVNRqKZj+xDGF6m7PBw= -github.com/hashicorp/go-retryablehttp v0.7.5 h1:bJj+Pj19UZMIweq/iie+1u5YCdGrnxCT9yvm0e+Nd5M= -github.com/hashicorp/go-retryablehttp v0.7.5/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-retryablehttp v0.7.8 h1:ylXZWnqa7Lhqpk0L1P1LzDtGcCR0rPVUrx/c8Unxc48= +github.com/hashicorp/go-retryablehttp v0.7.8/go.mod h1:rjiScheydd+CxvumBsIrFKlx3iS0jrZ7LvzFGFmuKbw= github.com/hashicorp/go-uuid v1.0.3 h1:2gKiV6YVmrJ1i2CKKa9obLvRieoRGviZFL26PcT/Co8= github.com/hashicorp/go-uuid v1.0.3/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= @@ -443,53 +402,12 @@ github.com/hashicorp/go-version v1.9.0 h1:CeOIz6k+LoN3qX9Z0tyQrPtiB1DFYRPfCIBtaX github.com/hashicorp/go-version v1.9.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k= github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM= -github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= -github.com/jackc/chunkreader v1.0.0/go.mod h1:RT6O25fNZIuasFJRyZ4R/Y2BbhasbmZXF9QQ7T3kePo= -github.com/jackc/chunkreader/v2 v2.0.0/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/chunkreader/v2 v2.0.1/go.mod h1:odVSm741yZoC3dpHEUXIqA9tQRhFrgOHwnPIn9lDKlk= -github.com/jackc/pgconn v0.0.0-20190420214824-7e0022ef6ba3/go.mod h1:jkELnwuX+w9qN5YIfX0fl88Ehu4XC3keFuOJJk9pcnA= -github.com/jackc/pgconn v0.0.0-20190824142844-760dd75542eb/go.mod h1:lLjNuW/+OfW9/pnVKPazfWOgNfH2aPem8YQ7ilXGvJE= -github.com/jackc/pgconn v0.0.0-20190831204454-2fabfa3c18b7/go.mod h1:ZJKsE/KZfsUgOEh9hBm+xYTstcNHg7UPMVJqRfQxq4s= -github.com/jackc/pgconn v1.8.0/go.mod h1:1C2Pb36bGIP9QHGBYCjnyhqu7Rv3sGshaQUvmfGIB/o= -github.com/jackc/pgconn v1.9.0/go.mod h1:YctiPyvzfU11JFxoXokUOOKQXQmDMoJL9vJzHH8/2JY= -github.com/jackc/pgconn v1.9.1-0.20210724152538-d89c8390a530/go.mod h1:4z2w8XhRbP1hYxkpTuBjTS3ne3J48K83+u0zoyvg2pI= -github.com/jackc/pgconn v1.13.0/go.mod h1:AnowpAqO4CMIIJNZl2VJp+KrkAZciAkhEl0W0JIobpI= -github.com/jackc/pgio v1.0.0/go.mod h1:oP+2QK2wFfUWgr+gxjoBH9KGBb31Eio69xUb0w5bYf8= -github.com/jackc/pgmock v0.0.0-20190831213851-13a1b77aafa2/go.mod h1:fGZlG77KXmcq05nJLRkk0+p82V8B8Dw8KN2/V9c/OAE= -github.com/jackc/pgmock v0.0.0-20201204152224-4fe30f7445fd/go.mod h1:hrBW0Enj2AZTNpt/7Y5rr2xe/9Mn757Wtb2xeBzPv2c= -github.com/jackc/pgmock v0.0.0-20210724152146-4ad1a8207f65/go.mod h1:5R2h2EEX+qri8jOWMbJCtaPWkrrNc7OHwsp2TCqp7ak= -github.com/jackc/pgpassfile v1.0.0/go.mod h1:CEx0iS5ambNFdcRtxPj5JhEz+xB6uRky5eyVu/W2HEg= -github.com/jackc/pgproto3 v1.1.0/go.mod h1:eR5FA3leWg7p9aeAqi37XOTgTIbkABlvcPB3E5rlc78= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190420180111-c116219b62db/go.mod h1:bhq50y+xrl9n5mRYyCBFKkpRVTLYJVWeCc+mEAI3yXA= -github.com/jackc/pgproto3/v2 v2.0.0-alpha1.0.20190609003834-432c2951c711/go.mod h1:uH0AWtUmuShn0bcesswc4aBTWGvw0cAxIJp+6OB//Wg= -github.com/jackc/pgproto3/v2 v2.0.0-rc3/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.0-rc3.0.20190831210041-4c03ce451f29/go.mod h1:ryONWYqW6dqSg1Lw6vXNMXoBJhpzvWKnT95C46ckYeM= -github.com/jackc/pgproto3/v2 v2.0.6/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.1.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgproto3/v2 v2.3.1/go.mod h1:WfJCnwN3HIg9Ish/j3sgWXnAfK8A9Y0bwXYU5xKaEdA= -github.com/jackc/pgservicefile v0.0.0-20200714003250-2b9c44734f2b/go.mod h1:vsD4gTJCa9TptPL8sPkXrLZ+hDuNrZCnj29CQpr4X1E= -github.com/jackc/pgtype v0.0.0-20190421001408-4ed0de4755e0/go.mod h1:hdSHsc1V01CGwFsrv11mJRHWJ6aifDLfdV3aVjFF0zg= -github.com/jackc/pgtype v0.0.0-20190824184912-ab885b375b90/go.mod h1:KcahbBH1nCMSo2DXpzsoWOAfFkdEtEJpPbVLq8eE+mc= -github.com/jackc/pgtype v0.0.0-20190828014616-a8802b16cc59/go.mod h1:MWlu30kVJrUS8lot6TQqcg7mtthZ9T0EoIBFiJcmcyw= -github.com/jackc/pgtype v1.8.1-0.20210724151600-32e20a603178/go.mod h1:C516IlIV9NKqfsMCXTdChteoXmwgUceqaLfjg2e3NlM= -github.com/jackc/pgtype v1.12.0/go.mod h1:LUMuVrfsFfdKGLw+AFFVv6KtHOFMwRgDDzBt76IqCA4= -github.com/jackc/pgx/v4 v4.0.0-20190420224344-cc3461e65d96/go.mod h1:mdxmSJJuR08CZQyj1PVQBHy9XOp5p8/SHH6a0psbY9Y= -github.com/jackc/pgx/v4 v4.0.0-20190421002000-1b8f0016e912/go.mod h1:no/Y67Jkk/9WuGR0JG/JseM9irFbnEPbuWV2EELPNuM= -github.com/jackc/pgx/v4 v4.0.0-pre1.0.20190824185557-6972a5742186/go.mod h1:X+GQnOEnf1dqHGpw7JmHqHc1NxDoalibchSk9/RWuDc= -github.com/jackc/pgx/v4 v4.12.1-0.20210724153913-640aa07df17c/go.mod h1:1QD0+tgSXP7iUjYm9C1NxKhny7lq6ee99u/z+IHFcgs= -github.com/jackc/pgx/v4 v4.17.2/go.mod h1:lcxIZN44yMIrWI78a5CpucdD14hX0SBDbNRvjDBItsw= -github.com/jackc/puddle v0.0.0-20190413234325-e4ced69a3a2b/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v0.0.0-20190608224051-11cab39313c9/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.1.3/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jackc/puddle v1.3.0/go.mod h1:m4B5Dj62Y0fbyuIc15OsIqK0+JU8nkqQjsgx7dvjSWk= -github.com/jandelgado/gcov2lcov v1.0.5 h1:rkBt40h0CVK4oCb8Dps950gvfd1rYvQ8+cWa346lVU0= -github.com/jandelgado/gcov2lcov v1.0.5/go.mod h1:NnSxK6TMlg1oGDBfGelGbjgorT5/L3cchlbtgFYZSss= +github.com/jaegertracing/jaeger-idl v0.7.1 h1:hd5w6Fu7eaqnTexxi/ae8Cap6RSyreVlrEP7jtScmTI= +github.com/jaegertracing/jaeger-idl v0.7.1/go.mod h1:W+9vbcr2cVZyS6z/cbr540EOzSkKYml3hmaWEavxkB0= github.com/jdx/go-netrc v1.0.0 h1:QbLMLyCZGj0NA8glAhxUpf1zDg6cxnWgMBbjq40W0gQ= github.com/jdx/go-netrc v1.0.0/go.mod h1:Gh9eFQJnoTNIRHXl2j5bJXA1u84hQWJWgGh569zF3v8= github.com/jgautheron/goconst v1.10.0 h1:Ptt+OoE4NaEWKhLrWrrN3IpZdGLiqaf7WLnEX/iv4Jw= @@ -502,21 +420,18 @@ github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9Y github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= -github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= github.com/julz/importas v0.2.0 h1:y+MJN/UdL63QbFJHws9BVC5RpA2iq0kpjrFajTGivjQ= github.com/julz/importas v0.2.0/go.mod h1:pThlt589EnCYtMnmhmRYY/qn9lCf/frPOK+WMx3xiJY= github.com/karamaru-alpha/copyloopvar v1.2.2 h1:yfNQvP9YaGQR7VaWLYcfZUlRP2eo2vhExWKxD/fP6q0= github.com/karamaru-alpha/copyloopvar v1.2.2/go.mod h1:oY4rGZqZ879JkJMtX3RRkcXRkmUvH0x35ykgaKgsgJY= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/errcheck v1.10.0 h1:Lvs/YAHP24YKg08LA8oDw2z9fJVme090RAXd90S+rrw= github.com/kisielk/errcheck v1.10.0/go.mod h1:kQxWMMVZgIkDq7U8xtG/n2juOjbLgZtedi0D+/VL/i8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kkHAIKE/contextcheck v1.1.6 h1:7HIyRcnyzxL9Lz06NGhiKvenXq7Zw6Q0UQu/ttjfJCE= github.com/kkHAIKE/contextcheck v1.1.6/go.mod h1:3dDbMRNBFaq8HFXWC1JyvDSPm43CmE6IuHam8Wr0rkg= -github.com/klauspost/compress v1.18.5 h1:/h1gH5Ce+VWNLSWqPzOVn6XBO+vJbCNGvjoaGBFW2IE= -github.com/klauspost/compress v1.18.5/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= +github.com/klauspost/compress v1.18.6 h1:2jupLlAwFm95+YDR+NwD2MEfFO9d4z4Prjl1XXDjuao= +github.com/klauspost/compress v1.18.6/go.mod h1:cwPg85FWrGar70rWktvGQj8/hthj3wpl0PGDogxkrSQ= github.com/klauspost/pgzip v1.2.6 h1:8RXeL5crjEUFnR2/Sn6GJNWtSQ3Dk8pq4CL3jvdDyjU= github.com/klauspost/pgzip v1.2.6/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs= @@ -525,15 +440,13 @@ github.com/knadh/koanf/parsers/json v0.1.0 h1:dzSZl5pf5bBcW0Acnu20Djleto19T0CfHc github.com/knadh/koanf/parsers/json v0.1.0/go.mod h1:ll2/MlXcZ2BfXD6YJcjVFzhG9P0TdJ207aIBKQhV2hY= github.com/knadh/koanf/providers/rawbytes v0.1.0 h1:dpzgu2KO6uf6oCb4aP05KDmKmAmI51k5pe8RYKQ0qME= github.com/knadh/koanf/providers/rawbytes v0.1.0/go.mod h1:mMTB1/IcJ/yE++A2iEZbY1MLygX7vttU+C+S/YmPu9c= -github.com/knadh/koanf/v2 v2.0.1 h1:1dYGITt1I23x8cfx8ZnldtezdyaZtfAuRtIFOiRzK7g= -github.com/knadh/koanf/v2 v2.0.1/go.mod h1:ZeiIlIDXTE7w1lMT6UVcNiRAS2/rCeLn/GdLNvY1Dus= +github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ= +github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= -github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= -github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= @@ -541,6 +454,8 @@ github.com/kulti/thelper v0.7.1 h1:fI8QITAoFVLx+y+vSyuLBP+rcVIB8jKooNSCT2EiI98= github.com/kulti/thelper v0.7.1/go.mod h1:NsMjfQEy6sd+9Kfw8kCP61W1I0nerGSYSFnGaxQkcbs= github.com/kunwardeep/paralleltest v1.0.15 h1:ZMk4Qt306tHIgKISHWFJAO1IDQJLc6uDyJMLyncOb6w= github.com/kunwardeep/paralleltest v1.0.15/go.mod h1:di4moFqtfz3ToSKxhNjhOZL+696QtJGCFe132CbBLGk= +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/lasiar/canonicalheader v1.1.2 h1:vZ5uqwvDbyJCnMhmFYimgMZnJMjwljN5VGY0VKbMXb4= github.com/lasiar/canonicalheader v1.1.2/go.mod h1:qJCeLFS0G/QlLQ506T+Fk/fWMa2VmBUiEI2cuMK4djI= github.com/ldez/exptostd v0.4.5 h1:kv2ZGUVI6VwRfp/+bcQ6Nbx0ghFWcGIKInkG/oFn1aQ= @@ -557,16 +472,10 @@ github.com/ldez/usetesting v0.5.0 h1:3/QtzZObBKLy1F4F8jLuKJiKBjjVFi1IavpoWbmqLwc github.com/ldez/usetesting v0.5.0/go.mod h1:Spnb4Qppf8JTuRgblLrEWb7IE6rDmUpGvxY3iRrzvDQ= github.com/leonklingele/grouper v1.1.2 h1:o1ARBDLOmmasUaNDesWqWCIFH3u7hoFlM84YrjT3mIY= github.com/leonklingele/grouper v1.1.2/go.mod h1:6D0M/HVkhs2yRKRFZUoGjeDy7EZTfFBE9gl4kjmIGkA= -github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.1.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= -github.com/lib/pq v1.10.2/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= -github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/lucasb-eyer/go-colorful v1.4.0 h1:UtrWVfLdarDgc44HcS7pYloGHJUjHV/4FwW4TvVgFr4= github.com/lucasb-eyer/go-colorful v1.4.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= -github.com/luna-duclos/instrumentedsql v1.1.3/go.mod h1:9J1njvFds+zN7y85EDhN9XNQLANWwZt2ULeIC8yMNYs= +github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e h1:Q6MvJtQK/iRcRtzAscm/zF23XxJlbECiGPyRicsX+Ak= +github.com/lufia/plan9stats v0.0.0-20260330125221-c963978e514e/go.mod h1:autxFIvghDt3jPTLoqZ9OZ7s9qTGNAWmYCjVFWPX/zg= github.com/macabu/inamedparam v0.2.0 h1:VyPYpOc10nkhI2qeNUdh3Zket4fcZjEWe35poddBCpE= github.com/macabu/inamedparam v0.2.0/go.mod h1:+Pee9/YfGe5LJ62pYXqB89lJ+0k5bsR8Wgz/C0Zlq3U= github.com/magiconair/properties v1.8.10 h1:s31yESBquKXCV9a/ScB3ESkOjUYYv+X0rg8SYxI99mE= @@ -583,42 +492,30 @@ github.com/matoous/godox v1.1.0 h1:W5mqwbyWrwZv6OQ5Z1a/DHGMOvXYCBP3+Ht7KMoJhq4= github.com/matoous/godox v1.1.0/go.mod h1:jgE/3fUXiTurkdHOLT5WEkThTSuE7yxHv5iWPa80afs= github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= -github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ= -github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= -github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-colorable v0.1.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= -github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= -github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= -github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= -github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= -github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-isatty v0.0.22 h1:j8l17JJ9i6VGPUFUYoTUKPSgKe/83EYU2zBC7YNKMw4= +github.com/mattn/go-isatty v0.0.22/go.mod h1:ZXfXG4SQHsB/w3ZeOYbR0PrPwLy+n6xiMrJlRFqopa4= github.com/mattn/go-runewidth v0.0.23 h1:7ykA0T0jkPpzSvMS5i9uoNn2Xy3R383f9HDx3RybWcw= github.com/mattn/go-runewidth v0.0.23/go.mod h1:XBkDxAl56ILZc9knddidhrOlY5R/pDhgLpndooCuJAs= -github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= -github.com/mattn/go-sqlite3 v1.14.15/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= -github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg= github.com/mattn/goveralls v0.0.12 h1:PEEeF0k1SsTjOBQ8FOmrOAoCu4ytuMaWCnWe94zxbCg= github.com/mattn/goveralls v0.0.12/go.mod h1:44ImGEUfmqH8bBtaMrYKsM65LXfNLWmwaxFGjZwgMSQ= github.com/mgechev/revive v1.15.0 h1:vJ0HzSBzfNyPbHKolgiFjHxLek9KUijhqh42yGoqZ8Q= github.com/mgechev/revive v1.15.0/go.mod h1:LlAKO3QQe9OJ0pVZzI2GPa8CbXGZ/9lNpCGvK4T/a8A= -github.com/microcosm-cc/bluemonday v1.0.20/go.mod h1:yfBmMi8mxvaZut3Yytv+jTXRY8mxyjJ0/kQBTElld50= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= -github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ= github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw= github.com/moby/docker-image-spec v1.3.1 h1:jMKff3w6PgbfSa69GfNg+zN/XLhfXJGnEx3Nl2EsFP0= github.com/moby/docker-image-spec v1.3.1/go.mod h1:eKmb5VW8vQEh/BAr2yvVNvuiJuY6UIocYsFu/DxxRpo= github.com/moby/go-archive v0.2.0 h1:zg5QDUM2mi0JIM9fdQZWC7U8+2ZfixfTYoHL7rWUcP8= github.com/moby/go-archive v0.2.0/go.mod h1:mNeivT14o8xU+5q1YnNrkQVpK+dnNe/K6fHqnTg4qPU= +github.com/moby/moby/api v1.54.2 h1:wiat9QAhnDQjA7wk1kh/TqHz2I1uUA7M7t9SAl/JNXg= +github.com/moby/moby/api v1.54.2/go.mod h1:+RQ6wluLwtYaTd1WnPLykIDPekkuyD/ROWQClE83pzs= +github.com/moby/moby/client v0.4.1 h1:DMQgisVoMkmMs7fp3ROSdiBnoAu8+vo3GggFl06M/wY= +github.com/moby/moby/client v0.4.1/go.mod h1:z52C9O2POPOsnxZAy//WtKcQ32P+jT/NGeXu/7nfjGQ= github.com/moby/patternmatcher v0.6.1 h1:qlhtafmr6kgMIJjKJMDmMWq7WLkKIo23hsrpR3x084U= github.com/moby/patternmatcher v0.6.1/go.mod h1:hDPoyOpDY7OrrMDLaYoY3hf52gNCR/YOUYxkhApJIxc= github.com/moby/sys/atomicwriter v0.1.0 h1:kw5D/EqkBwsBFi0ss9v1VG3wIkVhzGvLklJ+w3A14Sw= @@ -639,6 +536,8 @@ github.com/morikuni/aec v1.1.0 h1:vBBl0pUnvi/Je71dsRrhMBtreIqNMYErSAbEeb8jrXQ= github.com/morikuni/aec v1.1.0/go.mod h1:xDRgiq/iw5l+zkao76YTKzKttOp2cwPEne25HDkJnBw= github.com/muesli/cancelreader v0.2.2 h1:3I4Kt4BQjOR54NavqnDogx/MIoWBFa0StPA8ELUXHmA= github.com/muesli/cancelreader v0.2.2/go.mod h1:3XuTXfFS2VjM+HTLZY9Ak0l6eUKfijIfMUZ4EgX0QYo= +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/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= github.com/nishanths/exhaustive v0.12.0 h1:vIY9sALmw6T/yxiASewa4TQcFsVYZQQRUQJhKRf3Swg= @@ -647,8 +546,8 @@ github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= github.com/nunnatsa/ginkgolinter v0.23.0 h1:x3o4DGYOWbBMP/VdNQKgSj+25aJKx2Pe6lHr8gBcgf8= github.com/nunnatsa/ginkgolinter v0.23.0/go.mod h1:9qN1+0akwXEccwV1CAcCDfcoBlWXHB+ML9884pL4SZ4= -github.com/nyaruka/phonenumbers v1.1.1 h1:fyoZmpLN2VCmAnc51XcrNOUVP2wT1ZzQl348ggIaXII= -github.com/nyaruka/phonenumbers v1.1.1/go.mod h1:cGaEsOrLjIL0iKGqJR5Rfywy86dSkbApEpXuM9KySNA= +github.com/nyaruka/phonenumbers v1.5.0 h1:0M+Gd9zl53QC4Nl5z1Yj1O/zPk2XXBUwR/vlzdXSJv4= +github.com/nyaruka/phonenumbers v1.5.0/go.mod h1:gv+CtldaFz+G3vHHnasBSirAi3O2XLqZzVWz4V1pl2E= github.com/oleiade/reflections v1.0.1 h1:D1XO3LVEYroYskEsoSiGItp9RUxG6jWnCVvrqH0HHQM= github.com/oleiade/reflections v1.0.1/go.mod h1:rdFxbxq4QXVZWj0F+e9jqjDkc7dbp97vkRixKo2JR60= github.com/onsi/ginkgo/v2 v2.28.2 h1:DTrMfpqxiNUyQ3Y0zhn1n3cOO2euFgQPYIpkWwxVFps= @@ -660,20 +559,22 @@ github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3I github.com/opencontainers/image-spec v1.1.1 h1:y0fUlFfIZhPF1W537XOLg0/fcx6zcHCJwooC2xJA040= github.com/opencontainers/image-spec v1.1.1/go.mod h1:qpqAh3Dmcf36wStyyWU+kCeDgrGnAve2nCC8+7h8Q0M= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= -github.com/openzipkin/zipkin-go v0.4.2 h1:zjqfqHjUpPmB3c1GlCvvgsM1G4LkvqQbBDueDOCg/jA= -github.com/openzipkin/zipkin-go v0.4.2/go.mod h1:ZeVkFjuuBiSy13y8vpSDCjMi9GoI3hPpCJSBx/EYFhY= -github.com/ory/fosite v0.46.1 h1:VC8h83cbWx7K5r/VToDldSC+317sKFqJjLOPB4Ns4AY= -github.com/ory/fosite v0.46.1/go.mod h1:fkMPsnm/UjiefE9dE9CdZQGOH48TWJLIzUcdGIXg8Kk= +github.com/openzipkin/zipkin-go v0.4.3 h1:9EGwpqkgnwdEIJ+Od7QVSEIH+ocmm5nPat0G7sjsSdg= +github.com/openzipkin/zipkin-go v0.4.3/go.mod h1:M9wCJZFWCo2RiY+o1eBCEMe0Dp2S5LDHcMZmk3RmK7c= +github.com/ory/fosite v0.49.0 h1:KNqO7RVt/1X8F08/UI0Y+GRvcpscCWgjqvpLBQPRovo= +github.com/ory/fosite v0.49.0/go.mod h1:FAn7IY+I6DjT1r29wMouPeRYq63DWUuBj++96uOS4mE= github.com/ory/go-acc v0.2.9-0.20230103102148-6b1c9a70dbbe h1:rvu4obdvqR0fkSIJ8IfgzKOWwZ5kOT2UNfLq81Qk7rc= github.com/ory/go-acc v0.2.9-0.20230103102148-6b1c9a70dbbe/go.mod h1:z4n3u6as84LbV4YmgjHhnwtccQqzf4cZlSk9f1FhygI= github.com/ory/go-convenience v0.1.0 h1:zouLKfF2GoSGnJwGq+PE/nJAE6dj2Zj5QlTgmMTsTS8= github.com/ory/go-convenience v0.1.0/go.mod h1:uEY/a60PL5c12nYz4V5cHY03IBmwIAEm8TWB0yn9KNs= -github.com/ory/herodot v0.9.13 h1:cN/Z4eOkErl/9W7hDIDLb79IO/bfsH+8yscBjRpB4IU= -github.com/ory/herodot v0.9.13/go.mod h1:IWDs9kSvFQqw/cQ8zi5ksyYvITiUU4dI7glUrhZcJYo= -github.com/ory/jsonschema/v3 v3.0.7 h1:GQ9qfZDiJqs4l2d3p56dozCChvejQFZyLKGHYzDzOSo= -github.com/ory/jsonschema/v3 v3.0.7/go.mod h1:g8c8YOtN4TrR2wYeMdT02GDmzJDI0fEW2nI26BECafY= -github.com/ory/x v0.0.616 h1:iaojp7MvFW1cdirSZFK/XeuJvyhUEVXQdY61bmIOkzk= -github.com/ory/x v0.0.616/go.mod h1:Fqxxc1Ks6a4vZuqWwr6TYAeUDh2SAvxXyrk9N7Hidbo= +github.com/ory/herodot v0.10.3-0.20250318104651-3179543efba8 h1:bBFBzJ+sy1l/9+uYaz5TLGNNe0GWeXPMyqLhUEy9gPg= +github.com/ory/herodot v0.10.3-0.20250318104651-3179543efba8/go.mod h1:aq2fDNzFXlh8wF6+ILtlEin2oZSrqR79/Zdsi05WEVA= +github.com/ory/jsonschema/v3 v3.0.9-0.20250317235931-280c5fc7bf0e h1:4tUrC7x4YWRVMFp+c64KACNSGchW1zXo4l6Pa9/1hA8= +github.com/ory/jsonschema/v3 v3.0.9-0.20250317235931-280c5fc7bf0e/go.mod h1:XWLxVK4un/iuIcrw+6lCeanbF3NZwO5k6RdLeu/loQk= +github.com/ory/pop/v6 v6.4.1 h1:mxwfgwIB+kRlE4hvcoeEuxFqXZai6TWgQ23sOCBTERo= +github.com/ory/pop/v6 v6.4.1/go.mod h1:o+a3+gdnfWUd/IpFCTKidX7sRgQ6GdPmH02XYiMH8cw= +github.com/ory/x v0.0.729 h1:7ttCYNCjCdspI6X0oaxGAXoiYWSBrwGRz6w/IG8s3I4= +github.com/ory/x v0.0.729/go.mod h1:qdUK3Sp4K4nRbYJG0sEnFO1tDLN/Ct53G+ymre0JhCU= github.com/otiai10/copy v1.2.0/go.mod h1:rrF5dJ5F0t/EWSYODDu4j9/vEeYHMkc8jt0zJChqQWw= github.com/otiai10/copy v1.14.0 h1:dCI/t1iTdYGtkvCuBG2BgR6KZa83PTclw4U5n2wAllU= github.com/otiai10/copy v1.14.0/go.mod h1:ECfuL02W+/FkTWZWgQqXPWZgW9oeKCSQ5qVfSc4qc4w= @@ -685,7 +586,6 @@ github.com/pelletier/go-toml/v2 v2.3.1 h1:MYEvvGnQjeNkRF1qUuGolNtNExTDwct51yp7ol github.com/pelletier/go-toml/v2 v2.3.1/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741 h1:KPpdlQLZcHfTMQRi6bFQ7ogNO0ltFT4PmtwTLW4W+14= github.com/petermattis/goid v0.0.0-20260113132338-7c7de50cc741/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -694,15 +594,15 @@ github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRI github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU= github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +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.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= -github.com/prometheus/client_model v0.6.0 h1:k1v3CzpSRUTrKMppY35TLwPvxHqBu0bYgxZzqGIgaos= -github.com/prometheus/client_model v0.6.0/go.mod h1:NTQHnmxFpouOD0DpvP4XujX3CdOAGQPoaGhyTchlyt8= -github.com/prometheus/common v0.50.0 h1:YSZE6aa9+luNa2da6/Tik0q0A5AbR+U003TItK57CPQ= -github.com/prometheus/common v0.50.0/go.mod h1:wHFBCEVWVmHMUpg7pYcOm2QUR/ocQdYSJVQJKnHc3xQ= -github.com/prometheus/procfs v0.13.0 h1:GqzLlQyfsPbaEHaQkO7tbDlriv/4o5Hudv6OXHGKX7o= -github.com/prometheus/procfs v0.13.0/go.mod h1:cd4PFCR54QLnGKPaKGA6l+cfuNXtht43ZKY6tow0Y1g= +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.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= +github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= +github.com/prometheus/procfs v0.20.1 h1:XwbrGOIplXW/AU3YhIhLODXMJYyC1isLFfYCsTEycfc= +github.com/prometheus/procfs v0.20.1/go.mod h1:o9EMBZGRyvDrSPH1RqdxhojkuXstoe4UlK79eF5TGGo= github.com/protocolbuffers/protoscope v0.0.0-20221109213918-8e7a6aafa2c9 h1:arwj11zP0yJIxIRiDn22E0H8PxfF7TsTrc2wIPFIsf4= github.com/protocolbuffers/protoscope v0.0.0-20221109213918-8e7a6aafa2c9/go.mod h1:SKZx6stCn03JN3BOWTwvVIO2ajMkb/zQdTceXYhKw/4= github.com/quasilyte/go-ruleguard v0.4.5 h1:AGY0tiOT5hJX9BTdx/xBdoCubQUAE2grkqY2lSwvZcA= @@ -725,18 +625,12 @@ github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rodaine/protogofakeit v0.1.1 h1:ZKouljuRM3A+TArppfBqnH8tGZHOwM/pjvtXe9DaXH8= github.com/rodaine/protogofakeit v0.1.1/go.mod h1:pXn/AstBYMaSfc1/RqH3N82pBuxtWgejz1AlYpY1mI0= -github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= 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/rs/cors v1.11.1 h1:eU3gRzXLRK57F5rKMGMZURNdIG4EoAmX8k94r9wXWHA= github.com/rs/cors v1.11.1/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= -github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= -github.com/rs/xid v1.5.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg= -github.com/rs/zerolog v1.13.0/go.mod h1:YbFCdg8HfsridGWAh22vktObvhZbQsZXe4/zB0OKkWU= -github.com/rs/zerolog v1.15.0/go.mod h1:xYTKnLHcpfU2225ny5qZjxnj9NvkumZYjJHlAThCjNc= -github.com/rs/zerolog v1.32.0 h1:keLypqrlIjaFsbmJOBdB/qvyF8KEtCWHwobLp5l/mQ0= -github.com/rs/zerolog v1.32.0/go.mod h1:/7mN4D5sKwJLZQ2b/znpjC3/GQWY/xaDXUM0kKWRHss= +github.com/rs/zerolog v1.35.1 h1:m7xQeoiLIiV0BCEY4Hs+j2NG4Gp2o2KPKmhnnLiazKI= +github.com/rs/zerolog v1.35.1/go.mod h1:EjML9kdfa/RMA7h/6z6pYmq1ykOuA8/mjWaEvGI+jcw= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.4.1 h1:eWC8eUMNZ/wM/PWuZBv7JxxqT5fiIKSIyTvjb7Elr+g= @@ -745,10 +639,8 @@ github.com/ryancurrah/gomodguard/v2 v2.1.3 h1:E7sz3PJwE9Ba1reVxSpF6XLCPJZ74Kfw/L github.com/ryancurrah/gomodguard/v2 v2.1.3/go.mod h1:CQicdLGatWMxLX53JzoBjYlsNZhHbmLv2AVa0s2aivU= github.com/ryanrolds/sqlclosecheck v0.6.0 h1:pEyL9okISdg1F1SEpJNlrEotkTGerv5BMk7U4AG0eVg= github.com/ryanrolds/sqlclosecheck v0.6.0/go.mod h1:xyX16hsDaCMXHrMJ3JMzGf5OpDfHTOTTQrT7HOFUmeU= -github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ= -github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4= -github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE= -github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ= +github.com/sagikazarmark/locafero v0.12.0 h1:/NQhBAkUb4+fH1jivKHWusDYFjMOOKU88eegjfxfHb4= +github.com/sagikazarmark/locafero v0.12.0/go.mod h1:sZh36u/YSZ918v0Io+U9ogLYQJ9tLLBmM4eneO6WwsI= github.com/sanposhiho/wastedassign/v2 v2.1.0 h1:crurBF7fJKIORrV85u9UUpePDYGWnwvv3+A96WvwXT0= github.com/sanposhiho/wastedassign/v2 v2.1.0/go.mod h1:+oSmSC+9bQ+VUAxA66nBb0Z7N8CK7mscKTDYC6aIek4= github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 h1:KRzFb2m7YtdldCEkzs6KqmJw4nqEVZGK7IN2kJkjTuQ= @@ -757,7 +649,6 @@ github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tM github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= github.com/sashamelentyev/usestdlibvars v1.29.0 h1:8J0MoRrw4/NAXtjQqTHrbW9NN+3iMf7Knkq057v4XOQ= github.com/sashamelentyev/usestdlibvars v1.29.0/go.mod h1:8PpnjHMk5VdeWlVb4wCdrB8PNbLqZ3wBZTZWkrpZZL8= -github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210414080842-5b05eb8ff761 h1:0b8DF5kR0PhRoRXDiEEdzrgBc8UqVY4JWLkQJCRsLME= github.com/seatgeek/logrus-gelf-formatter v0.0.0-20210414080842-5b05eb8ff761/go.mod h1:/THDZYi7F/BsVEcYzYPqdcWFQ+1C2InkawTKfLOAnzg= github.com/securego/gosec/v2 v2.26.1 h1:gdkttGhQFVehqRJ8grKH4DrpqM/QlPKNHBnl8QgcEC4= @@ -766,16 +657,12 @@ github.com/segmentio/asm v1.2.1 h1:DTNbBqs57ioxAD4PrArqftgypG4/qNpXoJx8TVXxPR0= github.com/segmentio/asm v1.2.1/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs= github.com/segmentio/encoding v0.5.3 h1:OjMgICtcSFuNvQCdwqMCv9Tg7lEOXGwm1J5RPQccx6w= github.com/segmentio/encoding v0.5.3/go.mod h1:HS1ZKa3kSN32ZHVZ7ZLPLXWvOVIiZtyJnO1gPH1sKt0= -github.com/sergi/go-diff v1.2.0 h1:XU+rvMAioB0UC3q1MFrIQy4Vo5/4VsRDQQXHsEya6xQ= -github.com/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= +github.com/sergi/go-diff v1.4.0 h1:n/SP9D5ad1fORl+llWyN+D6qoUETXNZARKjyY2/KVCw= +github.com/sergi/go-diff v1.4.0/go.mod h1:A0bzQcvG0E7Rwjx0REVgAGH58e96+X0MeOfepqsbeW4= github.com/shirou/gopsutil/v4 v4.26.4 h1:B4SXVbcwTyrocPHEmWBC4uCYr4Xcu3MK1TXqbprAOWY= github.com/shirou/gopsutil/v4 v4.26.4/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ= -github.com/shopspring/decimal v0.0.0-20180709203117-cd690d0c9e24/go.mod h1:M+9NzErvs504Cn4c5DxATwIqPbtswREoFCre64PpcG4= -github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o= -github.com/sirupsen/logrus v1.4.1/go.mod h1:ni0Sbl8bgC9z8RoU9G6nDWqqs/fq4eDPysMBDgk/93Q= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= -github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/sirupsen/logrus v1.9.4 h1:TsZE7l11zFCLZnZ+teH4Umoq5BhEIfIzfRDZ1Uzql2w= github.com/sirupsen/logrus v1.9.4/go.mod h1:ftWc9WdOfJ0a92nsE2jF5u5ZwH8Bv2zdeOC42RjbV2g= github.com/sivchari/containedctx v1.0.3 h1:x+etemjbsh2fB5ewm5FeLNi5bUjK0V8n0RB+Wwfd0XE= @@ -784,44 +671,32 @@ github.com/soheilhy/cmux v0.1.5 h1:jjzc5WVemNEDTLwv9tlmemhC73tI08BNOIGwBOo10Js= github.com/soheilhy/cmux v0.1.5/go.mod h1:T7TcVDs9LWfQgPlPsdngu6I6QIoyIFZDDC6sNE1GqG0= github.com/sonatard/noctx v0.5.1 h1:wklWg9c9ZYugOAk7qG4yP4PBrlQsmSLPTvW1K4PRQMs= github.com/sonatard/noctx v0.5.1/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas= -github.com/sourcegraph/annotate v0.0.0-20160123013949-f4cad6c6324d/go.mod h1:UdhH50NIW0fCiwBSr0co2m7BnFLdv4fQTgdqdJTHFeE= -github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo= -github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0= github.com/sourcegraph/go-diff v0.8.0 h1:ipIyu4cTsLbIrln4l0qtHA3r0a7gyK4ntKjtQytHhvY= github.com/sourcegraph/go-diff v0.8.0/go.mod h1:hWlcO7Al+UZStZAP8rBumHpCK5ZHQ5BXsMls8p4+F5E= -github.com/sourcegraph/syntaxhighlight v0.0.0-20170531221838-bd320f5d308e/go.mod h1:HuIsMU8RRBOtsCgI77wP899iHVBQpCmg4ErYMZB+2IA= github.com/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= -github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0= -github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cast v1.10.0 h1:h2x0u2shc1QuLHfxi+cTJvs30+ZAHOGRic8uyGTDWxY= +github.com/spf13/cast v1.10.0/go.mod h1:jNfB8QC9IA6ZuY2ZjDp0KtFO2LZZlg4S/7bzP6qqeHo= github.com/spf13/cobra v1.10.2 h1:DMTTonx5m65Ic0GOoRY2c16WCbHxOOw6xxezuLaBpcU= github.com/spf13/cobra v1.10.2/go.mod h1:7C1pvHqHw5A4vrJfjNwvOdzYu0Gml16OCs2GRiTUUS4= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.9/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/spf13/pflag v1.0.10 h1:4EBh2KAYBwaONj6b2Ye1GiHfwjqyROoF4RwYO+vPwFk= github.com/spf13/pflag v1.0.10/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= -github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +github.com/spf13/viper v1.21.0 h1:x5S+0EU27Lbphp4UKm1C+1oQO+rKx36vfCoaVebLFSU= +github.com/spf13/viper v1.21.0/go.mod h1:P0lhsswPGWD/1lZJ9ny3fYnVqxiegrlNrEmgLjbTCAY= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/stbenjam/no-sprintf-host-port v0.3.1 h1:AyX7+dxI4IdLBPtDbsGAyqiTSLpCP9hWRrXQDU4Cm/g= github.com/stbenjam/no-sprintf-host-port v0.3.1/go.mod h1:ODbZesTCHMVKthBHskvUUexdcNHAQRXk9NpSsL8p/HQ= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE= -github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= -github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= -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/objx v0.5.3 h1:jmXUvGomnU1o3W/V5h2VEradbpJDwGrzugQQvL0POH4= +github.com/stretchr/objx v0.5.3/go.mod h1:rDQraq+vQZU7Fde9LOZLr8Tax6zZvy4kuNKF+QYS+U0= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= -github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= -github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= 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/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8= @@ -830,8 +705,8 @@ github.com/tenntenn/modver v1.0.1 h1:2klLppGhDgzJrScMpkj9Ujy3rXPUspSjAcev9tSEBgA github.com/tenntenn/modver v1.0.1/go.mod h1:bePIyQPb7UeioSRkw3Q0XeMhYZSMx9B8ePqg6SAMGH0= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3 h1:f+jULpRQGxTSkNYKJ51yaw6ChIqO+Je8UqsTKN/cDag= github.com/tenntenn/text/transform v0.0.0-20200319021203-7eef512accb3/go.mod h1:ON8b8w4BN/kE1EOhwT0o+d62W65a6aPw1nouo9LMgyY= -github.com/testcontainers/testcontainers-go v0.41.0 h1:mfpsD0D36YgkxGj2LrIyxuwQ9i2wCKAD+ESsYM1wais= -github.com/testcontainers/testcontainers-go v0.41.0/go.mod h1:pdFrEIfaPl24zmBjerWTTYaY0M6UHsqA1YSvsoU40MI= +github.com/testcontainers/testcontainers-go v0.42.0 h1:He3IhTzTZOygSXLJPMX7n44XtK+qhjat1nI9cneBbUY= +github.com/testcontainers/testcontainers-go v0.42.0/go.mod h1:vZjdY1YmUA1qEForxOIOazfsrdyORJAbhi0bp8plN30= github.com/tetafro/godot v1.5.6 h1:IEkrFCwXaYHlOn4mGzGS3F3dkP6m9t0jpwqBFPIkKiA= github.com/tetafro/godot v1.5.6/go.mod h1:eOkMrVQurDui411nBY2FA05EYH01r14LuWY/NrVDVcU= github.com/tetratelabs/wazero v1.11.0 h1:+gKemEuKCTevU4d7ZTzlsvgd1uaToIDtlQlmNbwqYhA= @@ -850,10 +725,10 @@ github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4 h1:SiHe5XLTn9sFW github.com/timakin/bodyclose v0.0.0-20260129054331-73d1f95b84b4/go.mod h1:sDHLK7rb/59v/ZxZ7KtymgcoxuUMxjXq8gtu9VMOK8M= github.com/timonwong/loggercheck v0.11.0 h1:jdaMpYBl+Uq9mWPXv1r8jc5fC3gyXx4/WGwTnnNKn4M= github.com/timonwong/loggercheck v0.11.0/go.mod h1:HEAWU8djynujaAVX7QI65Myb8qgfcZ1uKbdpg3ZzKl8= -github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA= -github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI= -github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw= -github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ= +github.com/tklauser/go-sysconf v0.4.0 h1:7H0uAN+7RkwWRaxhYXDLqa5V3LPrJeV8wmD9dRUgPQU= +github.com/tklauser/go-sysconf v0.4.0/go.mod h1:8mTNWyog7H+MpKijp4VmKJAd2bbYQ2zuUwkYRbUArPI= +github.com/tklauser/numcpus v0.12.0 h1:NR85qdvHA9pFse3x3weVZ0r0ST8R6l5RHbZrlRaqob4= +github.com/tklauser/numcpus v0.12.0/go.mod h1:ABHeXzJnr/qqwguhClkZKT1/8VABcYrsyUiUGobwWJg= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75 h1:6fotK7otjonDflCTK0BCfls4SPy3NcCVb5dqqmbRknE= github.com/tmc/grpc-websocket-proxy v0.0.0-20220101234140-673ab2c3ae75/go.mod h1:KO6IkyS8Y3j8OdNO85qEYBsRPuteD+YciPomcXdrMnk= github.com/tomarrell/wrapcheck/v2 v2.12.0 h1:H/qQ1aNWz/eeIhxKAFvkfIA+N7YDvq6TWVFL27Of9is= @@ -891,7 +766,6 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -github.com/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= gitlab.com/bosi/decorder v0.4.2 h1:qbQaV3zgwnBZ4zPMhGLW4KZe7A7NwxEhJx39R3shffo= gitlab.com/bosi/decorder v0.4.2/go.mod h1:muuhHoaJkA9QLcYHq4Mj8FJUwDZ+EirSHRiaTcTf6T8= go-simpler.org/assert v0.9.0 h1:PfpmcSvL7yAnWyChSjOz6Sp6m9j5lyK8Ok9pEL31YkQ= @@ -914,80 +788,64 @@ go.lsp.dev/uri v0.3.0 h1:KcZJmh6nFIBeJzTugn5JTU6OOyG0lDOo3R9KwTxTYbo= go.lsp.dev/uri v0.3.0/go.mod h1:P5sbO1IQR+qySTWOCnhnK7phBx+W3zbLqSMDJNTw88I= go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ64= go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0 h1:4Pp6oUg3+e/6M4C0A/3kJ2VYa++dsWVTtGgLVj5xtHg= -go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.49.0/go.mod h1:Mjt1i1INqiaoZOMGR1RIUJN+i3ChKoFRqzrRQhlkbs0= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0 h1:RtcvQ4iw3w9NBB5yRwgA4sSa82rfId7n4atVpvKx3bY= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.49.0/go.mod h1:f/PbKbRd4cdUICWell6DmzvVJ7QrmBgFrRHjXmAXbK4= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0 h1:7iP2uCb7sGddAr30RRS6xjKy7AZ2JtTOPA3oolgVSw8= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.65.0/go.mod h1:c7hN3ddxs/z6q9xwvfLPk+UHlWRQyaeR1LdgfL/66l0= -go.opentelemetry.io/contrib/propagators/b3 v1.24.0 h1:n4xwCdTx3pZqZs2CjS/CUZAs03y3dZcGhC/FepKtEUY= -go.opentelemetry.io/contrib/propagators/b3 v1.24.0/go.mod h1:k5wRxKRU2uXx2F8uNJ4TaonuEO/V7/5xoz7kdsDACT8= -go.opentelemetry.io/contrib/propagators/jaeger v1.24.0 h1:CKtIfwSgDvJmaWsZROcHzONZgmQdMYn9mVYWypOWT5o= -go.opentelemetry.io/contrib/propagators/jaeger v1.24.0/go.mod h1:Q5JA/Cfdy/ta+5VeEhrMJRWGyS6UNRwFbl+yS3W1h5I= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0 h1:Q9PrD94WoMolBx44ef5UWWvufpVSME0MiSymXZfedso= -go.opentelemetry.io/contrib/samplers/jaegerremote v0.18.0/go.mod h1:tjp49JHNvreAAoWjdCHIVD7NXMjuJ3Dp/9iNOuPPlC8= -go.opentelemetry.io/otel v1.41.0 h1:YlEwVsGAlCvczDILpUXpIpPSL/VPugt7zHThEMLce1c= -go.opentelemetry.io/otel v1.41.0/go.mod h1:Yt4UwgEKeT05QbLwbyHXEwhnjxNO6D8L5PQP51/46dE= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0 h1:0Qx7VGBacMm9ZENQ7TnNObTYI4ShC+lHI16seduaxZo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.68.0/go.mod h1:Sje3i3MjSPKTSPvVWCaL8ugBzJwik3u4smCjUeuupqg= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.68.0 h1:cuXaPAfIoJKsYjBjPSb2nKZEmgM43zVr25l37IxhKME= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.68.0/go.mod h1:BuzhPofpCzlDi/Q/Xjg54M4/3oWqqyDe2Zeq7A2I0QE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0 h1:CqXxU8VOmDefoh0+ztfGaymYbhdB/tT3zs79QaZTNGY= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.68.0/go.mod h1:BuhAPThV8PBHBvg8ZzZ/Ok3idOdhWIodywz2xEcRbJo= +go.opentelemetry.io/contrib/propagators/b3 v1.43.0 h1:CETqV3QLLPTy5yNrqyMr41VnAOOD4lsRved7n4QG00A= +go.opentelemetry.io/contrib/propagators/b3 v1.43.0/go.mod h1:Q4mCiCdziYzpNR0g+6UqVotAlCDZdzz6L8jwY4knOrw= +go.opentelemetry.io/contrib/propagators/jaeger v1.43.0 h1:peiLMz1+aqJE+3L4mOVtR9wlmv+yh/JVYXCBjqmzJJE= +go.opentelemetry.io/contrib/propagators/jaeger v1.43.0/go.mod h1:Agvif+4A8p/3UtZzJ0MCcDEuQwgtrzM71DueU41DCs8= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.37.0 h1:MPbz6oY3ZM1GuzCdqKU2TSsE7W71W6e578f/m2q9rHw= +go.opentelemetry.io/contrib/samplers/jaegerremote v0.37.0/go.mod h1:+JlICiUxqOsm1bu6zTvygwOl5b5DRO+u8A+IgnL2ONs= +go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I= +go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0= go.opentelemetry.io/otel/exporters/jaeger v1.17.0 h1:D7UpUy2Xc2wsi1Ras6V40q806WM07rqoCWzXu7Sqy+4= go.opentelemetry.io/otel/exporters/jaeger v1.17.0/go.mod h1:nPCqOnEH9rNLKqH/+rrUjiMzHJdV1BlpKcTwRTyKkKI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0 h1:ao6Oe+wSebTlQ1OEht7jlYTzQKE+pnx/iNywFvTbuuI= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.41.0/go.mod h1:u3T6vz0gh/NVzgDgiwkgLxpsSF6PaPmo2il0apGJbls= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0 h1:inYW9ZhgqiDqh6BioM7DVHHzEGVq76Db5897WLGZ5Go= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.41.0/go.mod h1:Izur+Wt8gClgMJqO/cZ8wdeeMryJ/xxiOVgFSSfpDTY= -go.opentelemetry.io/otel/exporters/zipkin v1.24.0 h1:3evrL5poBuh1KF51D9gO/S+N/1msnm4DaBqs/rpXUqY= -go.opentelemetry.io/otel/exporters/zipkin v1.24.0/go.mod h1:0EHgD8R0+8yRhUYJOGR8Hfg2dpiJQxDOszd5smVO9wM= -go.opentelemetry.io/otel/metric v1.41.0 h1:rFnDcs4gRzBcsO9tS8LCpgR0dxg4aaxWlJxCno7JlTQ= -go.opentelemetry.io/otel/metric v1.41.0/go.mod h1:xPvCwd9pU0VN8tPZYzDZV/BMj9CM9vs00GuBjeKhJps= -go.opentelemetry.io/otel/sdk v1.41.0 h1:YPIEXKmiAwkGl3Gu1huk1aYWwtpRLeskpV+wPisxBp8= -go.opentelemetry.io/otel/sdk v1.41.0/go.mod h1:ahFdU0G5y8IxglBf0QBJXgSe7agzjE4GiTJ6HT9ud90= -go.opentelemetry.io/otel/sdk/metric v1.41.0 h1:siZQIYBAUd1rlIWQT2uCxWJxcCO7q3TriaMlf08rXw8= -go.opentelemetry.io/otel/sdk/metric v1.41.0/go.mod h1:HNBuSvT7ROaGtGI50ArdRLUnvRTRGniSUZbxiWxSO8Y= -go.opentelemetry.io/otel/trace v1.41.0 h1:Vbk2co6bhj8L59ZJ6/xFTskY+tGAbOnCtQGVVa9TIN0= -go.opentelemetry.io/otel/trace v1.41.0/go.mod h1:U1NU4ULCoxeDKc09yCWdWe+3QoyweJcISEVa1RBzOis= -go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= -go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= -go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= -go.uber.org/atomic v1.5.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= -go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0 h1:88Y4s2C8oTui1LGM6bTWkw0ICGcOLCAI5l6zsD1j20k= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.43.0/go.mod h1:Vl1/iaggsuRlrHf/hfPJPvVag77kKyvrLeD10kpMl+A= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 h1:3iZJKlCZufyRzPzlQhUIWVmfltrXuGyfjREgGP3UUjc= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0/go.mod h1:/G+nUPfhq2e+qiXMGxMwumDrP5jtzU+mWN7/sjT2rak= +go.opentelemetry.io/otel/exporters/zipkin v1.43.0 h1:EOCmLBQ5iUZQ8pK+cWObn6pBD/bFFcltwErVcf22TUU= +go.opentelemetry.io/otel/exporters/zipkin v1.43.0/go.mod h1:GReAT1nAoWUpGpvDmWh1QawwJMnBkz9XdU7yW4i3XxM= +go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM= +go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY= +go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg= +go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg= +go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw= +go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A= +go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A= +go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0= +go.opentelemetry.io/proto/otlp v1.10.0 h1:IQRWgT5srOCYfiWnpqUYz9CVmbO8bFmKcwYxpuCSL2g= +go.opentelemetry.io/proto/otlp v1.10.0/go.mod h1:/CV4QoCR/S9yaPj8utp3lvQPoqMtxXdzn7ozvvozVqk= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko= go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= -go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= -go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA= -go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= -go.uber.org/zap v1.13.0/go.mod h1:zwrFLgMcdUuIBviXEYEH1YKNaOBnKXsx2IPda5bBwHM= go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI= go.uber.org/zap v1.27.1 h1:08RqriUEv8+ArZRYSTXy1LeBScaMpVSTBhCeaZYfMYc= go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E= +go.yaml.in/yaml/v2 v2.4.4 h1:tuyd0P+2Ont/d6e2rl3be67goVK4R6deVxCUX5vyPaQ= +go.yaml.in/yaml/v2 v2.4.4/go.mod h1:gMZqIpDtDqOfM0uNfy0SkpRhvUryYH0Z6wdMYcacYXQ= 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-20190411191339-88737f569e3a/go.mod h1:WFFai1msRO1wXaEeE5yQxYXgSfI8pQAWXbQop6sCtWE= -golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= -golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 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/crypto v0.0.0-20201203163018-be400aefbc4c/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= -golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa h1:Zt3DZoOFFYkKhDT3v7Lm9FDMEV06GpzjG2jrqW+QTE0= -golang.org/x/exp v0.0.0-20260218203240-3dfff04db8fa/go.mod h1:K79w1Vqn7PoiZn+TkNpx3BUWUQksGO3JcVX6qIjytmA= +golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a h1:+3jdDGGB8NGb1Zktc737jlt3/A5f6UlwSzmvqUuufxw= +golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a/go.mod h1:d2fgXJLVs4dYDHUk5lwMIfzRzSrWCfGZb0ZqeLa/Vcw= golang.org/x/exp/typeparams v0.0.0-20220428152302-39d4317da171/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20230203172020-98cc5a0785f9/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 h1:qWFG1Dj7TBjOjOvhEOkmyGPVoquqUKnIU0lEVLp8xyk= @@ -996,8 +854,6 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTk golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= -golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc= -golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 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/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -1014,7 +870,6 @@ golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73r golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20190813141303-74dc4d7220e7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= @@ -1022,19 +877,16 @@ golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwY golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211123203042-d83791d6bcd9/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= -golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= -golang.org/x/net v0.0.0-20221002022538-bcab6841153b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= golang.org/x/net v0.9.0/go.mod h1:d48xBJpPfHeWQsugry2m+kC02ZBRGRgulfHnEXEuWns= golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= -golang.org/x/oauth2 v0.35.0 h1:Mv2mzuHuZuY2+bkyWXIHMfhNdJAdwW3FuWeCPYN5GVQ= -golang.org/x/oauth2 v0.35.0/go.mod h1:lzm5WQJQwKZ3nwavOZ3IS5Aulzxi68dUSgRHujetwEA= +golang.org/x/oauth2 v0.36.0 h1:peZ/1z27fi9hUOFCAZaHyrpWG5lwe0RJEEEeH0ThlIs= +golang.org/x/oauth2 v0.36.0/go.mod h1:YDBUJMTkDnJS+A4BP4eZBjCqtokkg1hODuPjwiGPO7Q= golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= @@ -1043,22 +895,15 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20220929204114-8fcdb60fdcc0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4= golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190403152447-81d4e9dc473e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -1069,30 +914,22 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211105183446-c75c47738b0c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 h1:HjU6IWBiAgRIdAJ9/y1rwCn+UELEmwV+VsTLzj/W4sE= golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6/go.mod h1:Eqhaxk/wZsWEH8CRxLwj6xzEJbz7k1EFGqx7nyCoabE= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= -golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= golang.org/x/term v0.7.0/go.mod h1:P32HKFT3hSsZrRxla30E9HqToFYAQPCMs/zFMBUFqPY= golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= @@ -1102,7 +939,6 @@ golang.org/x/term v0.43.0/go.mod h1:lrhlHNdQJHO+1qVYiHfFKVuVioJIheAc3fBSMFYEIsk= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= -golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= @@ -1116,15 +952,9 @@ golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= -golang.org/x/tools v0.0.0-20190425163242-31fd60d6bfdc/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= -golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= -golang.org/x/tools v0.0.0-20190823170909-c4a336ef6a2f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20200103221440-774c71fcf114/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.0.0-20200329025819-fd4102a86c65/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= golang.org/x/tools v0.0.0-20200724022722-7017fd6b1305/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= @@ -1142,45 +972,37 @@ golang.org/x/tools/go/expect v0.1.1-deprecated h1:jpBZDwmgPhXsKZC6WhL20P4b/wmnps golang.org/x/tools/go/expect v0.1.1-deprecated/go.mod h1:eihoPOH+FgIqa3FpoTwguz/bVUSGBlGQU67vpBeOrBY= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated h1:1h2MnaIAIXISqTFKdENegdpAgUXz6NrPEsbIeWaBRvM= golang.org/x/tools/go/packages/packagestest v0.1.1-deprecated/go.mod h1:RVAQXBGNv1ib0J382/DPCRS/BPnsGebyM1Gj5VSDpG8= -golang.org/x/xerrors v0.0.0-20190410155217-1f06c39b4373/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= -golang.org/x/xerrors v0.0.0-20190513163551-3ee3066db522/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 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= -gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk= -gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E= +gonum.org/v1/gonum v0.17.0 h1:VbpOemQlsSMrYmn7T2OUvQ4dqxQXU+ouZFQsZOx50z4= +gonum.org/v1/gonum v0.17.0/go.mod h1:El3tOrEuMpv2UdMrbNlKEh9vd86bmQ6vqIcDwxEOc1E= google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c= -google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d h1:EocjzKLywydp5uZ5tJ79iP6Q0UjDnyiHkGRWxuPBP8s= -google.golang.org/genproto/googleapis/api v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:48U2I+QQUYhsFrg2SY6r+nJzeOtjey7j//WBESw+qyQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d h1:t/LOSXPJ9R0B6fnZNyALBRfZBH0Uy0gT+uR+SJ6syqQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20260217215200-42d3e9bedb6d/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= +google.golang.org/genproto/googleapis/api v0.0.0-20260519071638-aa98bba5eb94 h1:DddG61lE5LkX6144z22i0gma9BMBs5aZ9B8lZLobxyw= +google.golang.org/genproto/googleapis/api v0.0.0-20260519071638-aa98bba5eb94/go.mod h1:1dCETSCY2YKZNXQE3h4fun3TYwF5p8jejRKZgfWAgAY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260519071638-aa98bba5eb94 h1:eZCjr/aAF8c5ccm5pb6T4EXgIei5MlAAPWPJk+5ArfY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20260519071638-aa98bba5eb94/go.mod h1:4Hqkh8ycfw05ld/3BWL7rJOSfebL2Q+DVDeRgYgxUU8= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk= -google.golang.org/grpc v1.79.3 h1:sybAEdRIEtvcD68Gx7dmnwjZKlyfuc61Dyo9pGXXkKE= -google.golang.org/grpc v1.79.3/go.mod h1:KmT0Kjez+0dde/v2j9vzwoAScgEPx/Bw1CYChhHLrHQ= +google.golang.org/grpc v1.81.1 h1:VnnIIZ88UzOOKLukQi+ImGz8O1Wdp8nAGGnvOfEIWQQ= +google.golang.org/grpc v1.81.1/go.mod h1:xGH9GfzOyMTGIOXBJmXt+BX/V0kcdQbdcuwQ/zNw42I= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1 h1:/WILD1UcXj/ujCxgoL/DvRgt2CP3txG8+FwkUbb9110= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1/go.mod h1:YNKnb2OAApgYn2oYY47Rn7alMr1zWjb2U8Q0aoGWiNc= google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE= google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/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/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= -gopkg.in/inconshreveable/log15.v2 v2.0.0-20180818164646-67afb5ed74ec/go.mod h1:aPpfJ7XW+gOuirDoZ8gHhLh3kZ1B08FtV2bbmy7Jv3s= -gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= -gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= -gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= @@ -1192,7 +1014,6 @@ gotest.tools/v3 v3.5.2 h1:7koQfIKdy+I8UTetycgUqXWSDwpgv193Ka+qRsmBY8Q= gotest.tools/v3 v3.5.2/go.mod h1:LtdLGcnqToBH83WByAAi/wiwSFCArdFIUV/xxN4pcjA= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= -honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg= honnef.co/go/tools v0.7.0 h1:w6WUp1VbkqPEgLz4rkBzH/CSU6HkoqNLp6GstyTx3lU= honnef.co/go/tools v0.7.0/go.mod h1:pm29oPxeP3P82ISxZDgIYeOaf9ta6Pi0EWvCFoLG2vc= mvdan.cc/gofumpt v0.9.2 h1:zsEMWL8SVKGHNztrx6uZrXdp7AX8r421Vvp23sz7ik4= @@ -1201,5 +1022,7 @@ mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 h1:ssMzja7PDPJV8FStj7hq9IKiu mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15/go.mod h1:4M5MMXl2kW6fivUT6yRGpLLPNfuGtU2Z0cPvFquGDYU= mvdan.cc/xurls/v2 v2.6.0 h1:3NTZpeTxYVWNSokW3MKeyVkz/j7uYXYiMtXRUfmjbgI= mvdan.cc/xurls/v2 v2.6.0/go.mod h1:bCvEZ1XvdA6wDnxY7jPPjEmigDtvtvPXAD/Exa9IMSk= +pgregory.net/rapid v1.2.0 h1:keKAYRcjm+e1F0oAuU5F5+YPAWcyxNNRK2wud503Gnk= +pgregory.net/rapid v1.2.0/go.mod h1:PY5XlDGj0+V1FCq0o192FdRhpKHGTRIWBgqjDBTrq04= pluginrpc.com/pluginrpc v0.5.0 h1:tOQj2D35hOmvHyPu8e7ohW2/QvAnEtKscy2IJYWQ2yo= pluginrpc.com/pluginrpc v0.5.0/go.mod h1:UNWZ941hcVAoOZUn8YZsMmOZBzbUjQa3XMns8RQLp9o= diff --git a/lima-ceph-dev.yaml b/lima-ceph-dev.yaml index 7d0014c..802b9af 100644 --- a/lima-ceph-dev.yaml +++ b/lima-ceph-dev.yaml @@ -45,12 +45,7 @@ provision: sudo microceph cluster bootstrap sudo microceph disk add loop,4G,3 sudo microceph enable rgw - sudo apt-get update && apt-get install -y golang-go gcc g++ librbd-dev librados-dev linux-headers-generic ceph-common protobuf-compiler - sudo GO111MODULE=on GOBIN=/usr/local/bin go install github.com/bufbuild/buf/cmd/buf@v1.29.0 - sudo GO111MODULE=on GOBIN=/usr/local/bin go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.28 - sudo GO111MODULE=on GOBIN=/usr/local/bin go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@v1.2 - sudo GO111MODULE=on GOBIN=/usr/local/bin go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-grpc-gateway@v2.19.1 - sudo GO111MODULE=on GOBIN=/usr/local/bin go install github.com/grpc-ecosystem/grpc-gateway/v2/protoc-gen-openapiv2@v2.19.1 + sudo apt-get update && apt-get install -y golang-go gcc g++ librbd-dev librados-dev linux-headers-generic ceph-common - mode: user # Link git config from host machine script: | diff --git a/pkg/auth/oauth_server.go b/pkg/auth/oauth_server.go index 64db757..925a7bb 100644 --- a/pkg/auth/oauth_server.go +++ b/pkg/auth/oauth_server.go @@ -131,18 +131,16 @@ type fositeStore struct { *storage.MemoryStore } -func (s *fositeStore) Authenticate(ctx context.Context, name string, secret string) error { - +func (s *fositeStore) Authenticate(ctx context.Context, name string, secret string) (string, error) { usr, err := s.userSvc.GetUser(ctx, name) if err != nil { - return fosite.ErrNotFound + return "", fosite.ErrNotFound } if !usr.Enabled { - return fosite.ErrNotFound.WithDebug("User disabled") + return "", fosite.ErrNotFound.WithDebug("User disabled") } - err = bcrypt.CompareHashAndPassword([]byte(usr.Password), []byte(secret)) - if err != nil { - return fosite.ErrNotFound.WithDebug("Invalid Credentials") + if err := bcrypt.CompareHashAndPassword([]byte(usr.Password), []byte(secret)); err != nil { + return "", fosite.ErrNotFound.WithDebug("Invalid Credentials") } - return nil + return usr.Username, nil } diff --git a/pkg/auth/oauth_token_endpoint.go b/pkg/auth/oauth_token_endpoint.go index a71e100..51a9205 100644 --- a/pkg/auth/oauth_token_endpoint.go +++ b/pkg/auth/oauth_token_endpoint.go @@ -54,9 +54,9 @@ func (s *Server) TokenEndpoint(rw http.ResponseWriter, req *http.Request) { return } session := accessRequest.GetSession().(*oauth2.JWTSession) - // Set token subject as login + // fosite sets session.Subject via SetSubject after Authenticate (password grant); + // the JWT "sub" claim is built from JWTClaims.Subject, which we must populate here. session.JWTClaims.Subject = usr.Username - session.Subject = usr.Username // Next we create a response for the access request. Again, we iterate through the TokenEndpointHandlers // and aggregate the result in response. diff --git a/pkg/types/ceph_errors.go b/pkg/types/ceph_errors.go index 24b42c2..b985610 100644 --- a/pkg/types/ceph_errors.go +++ b/pkg/types/ceph_errors.go @@ -6,6 +6,6 @@ import ( "github.com/ceph/go-ceph/rados" ) -const ( +var ( ErrRadosNotFound = rados.ErrNotFound ) diff --git a/test/Dockerfile b/test/Dockerfile index 3a8d370..471dfbf 100644 --- a/test/Dockerfile +++ b/test/Dockerfile @@ -1,4 +1,4 @@ -FROM golang:1.25-bookworm +FROM golang:1.26-bookworm RUN apt-get update && \ apt-get install -y --no-install-recommends \ diff --git a/test/testenv/ceph.go b/test/testenv/ceph.go index aef51b7..bba2776 100644 --- a/test/testenv/ceph.go +++ b/test/testenv/ceph.go @@ -6,14 +6,14 @@ import ( "context" "fmt" "io" + "net/netip" "os" "path/filepath" "strings" "time" - dockercontainer "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/network" - "github.com/docker/go-connections/nat" + mobycontainer "github.com/moby/moby/api/types/container" + "github.com/moby/moby/api/types/network" "github.com/testcontainers/testcontainers-go" tcexec "github.com/testcontainers/testcontainers-go/exec" tcnetwork "github.com/testcontainers/testcontainers-go/network" @@ -41,6 +41,12 @@ const ( defaultCephImage = "ghcr.io/arttor/ceph-test:v19" ) +var ( + networkSubnetPrefix = netip.MustParsePrefix(networkSubnet) + networkGatewayAddr = netip.MustParseAddr(networkGateway) + monIPAddr = netip.MustParseAddr(MonIP) +) + type CephEnv struct { tcNetwork *testcontainers.DockerNetwork container testcontainers.Container @@ -78,7 +84,7 @@ func (e *CephEnv) createNetwork(ctx context.Context) error { tcnetwork.WithIPAM(&network.IPAM{ Driver: "default", Config: []network.IPAMConfig{ - {Subnet: networkSubnet, Gateway: networkGateway}, + {Subnet: networkSubnetPrefix, Gateway: networkGatewayAddr}, }, }), ) @@ -112,14 +118,14 @@ func (e *CephEnv) startContainer(ctx context.Context) error { NetworkAliases: map[string][]string{netName: {"ceph"}}, EndpointSettingsModifier: func(es map[string]*network.EndpointSettings) { es[netName] = &network.EndpointSettings{ - IPAMConfig: &network.EndpointIPAMConfig{IPv4Address: MonIP}, + IPAMConfig: &network.EndpointIPAMConfig{IPv4Address: monIPAddr}, Aliases: []string{"ceph"}, } }, - HostConfigModifier: func(hc *dockercontainer.HostConfig) { + HostConfigModifier: func(hc *mobycontainer.HostConfig) { hc.Privileged = true }, - ConfigModifier: func(cfg *dockercontainer.Config) { + ConfigModifier: func(cfg *mobycontainer.Config) { cfg.Hostname = "ceph-demo" }, } @@ -273,7 +279,7 @@ func (e *CephEnv) MappedURL(ctx context.Context, scheme string, port int) (strin if err != nil { return "", fmt.Errorf("get container host: %w", err) } - mp, err := e.container.MappedPort(ctx, nat.Port(fmt.Sprintf("%d/tcp", port))) + mp, err := e.container.MappedPort(ctx, fmt.Sprintf("%d/tcp", port)) if err != nil { return "", fmt.Errorf("get mapped port %d: %w", port, err) } diff --git a/test/testenv/tid.go b/test/testenv/tid.go index 5c57a90..2b4cba5 100644 --- a/test/testenv/tid.go +++ b/test/testenv/tid.go @@ -9,10 +9,10 @@ import ( "path/filepath" "strings" - dockercontainer "github.com/docker/docker/api/types/container" - "github.com/docker/docker/api/types/mount" - "github.com/docker/docker/client" - "github.com/docker/docker/pkg/stdcopy" + "github.com/moby/moby/api/pkg/stdcopy" + mobycontainer "github.com/moby/moby/api/types/container" + "github.com/moby/moby/api/types/mount" + "github.com/moby/moby/client" "github.com/testcontainers/testcontainers-go" ) @@ -48,7 +48,7 @@ func RunInDocker(cfg DockerTestConfig) int { KeepImage: true, }, Cmd: []string{"sleep", "infinity"}, - HostConfigModifier: func(hc *dockercontainer.HostConfig) { + HostConfigModifier: func(hc *mobycontainer.HostConfig) { // Host networking so the inner test process can reach the // CephEnv container's mapped host ports. hc.NetworkMode = "host" @@ -77,7 +77,7 @@ func RunInDocker(cfg DockerTestConfig) int { cmd := buildInnerCmd(cfg) - cli, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) + cli, err := client.New(client.FromEnv) if err != nil { fmt.Fprintf(os.Stderr, "tid: docker client: %v\n", err) return 1 @@ -93,7 +93,7 @@ func RunInDocker(cfg DockerTestConfig) int { } } - execResp, err := cli.ContainerExecCreate(ctx, containerID, dockercontainer.ExecOptions{ + execResp, err := cli.ExecCreate(ctx, containerID, client.ExecCreateOptions{ Cmd: cmd, Env: envVars, AttachStdout: true, @@ -105,7 +105,7 @@ func RunInDocker(cfg DockerTestConfig) int { return 1 } - attachResp, err := cli.ContainerExecAttach(ctx, execResp.ID, dockercontainer.ExecAttachOptions{}) + attachResp, err := cli.ExecAttach(ctx, execResp.ID, client.ExecAttachOptions{}) if err != nil { fmt.Fprintf(os.Stderr, "tid: exec attach: %v\n", err) return 1 @@ -114,7 +114,7 @@ func RunInDocker(cfg DockerTestConfig) int { _, _ = stdcopy.StdCopy(os.Stdout, os.Stderr, attachResp.Reader) - inspectResp, err := cli.ContainerExecInspect(ctx, execResp.ID) + inspectResp, err := cli.ExecInspect(ctx, execResp.ID, client.ExecInspectOptions{}) if err != nil { fmt.Fprintf(os.Stderr, "tid: exec inspect: %v\n", err) return 1 From 75923c5dece741696005844e2eb1eecd4db9a71c Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Thu, 21 May 2026 14:04:19 +0200 Subject: [PATCH 04/10] dashboard parity tests Signed-off-by: Artem Torubarov --- Makefile | 4 +- api/buf.gen.yaml | 1 + api/openapi/ceph-api.swagger.json | 364 ++++++++++---------- go.mod | 2 +- pkg/api/grpc_http_gateway.go | 15 +- test/cluster_parity_test.go | 89 +++++ test/crush_rule_parity_test.go | 62 ++++ test/parity/api_diff.go | 38 +++ test/parity/api_diff.yaml | 19 ++ test/parity/client.go | 107 ++++++ test/parity/diff.go | 225 +++++++++++++ test/parity/diff_test.go | 157 +++++++++ test/parity/grpc.go | 66 ++++ test/parity/inventory.go | 270 +++++++++++++++ test/parity/recorder.go | 542 ++++++++++++++++++++++++++++++ test/setup_cgo_test.go | 70 ++++ test/setup_nocgo_test.go | 8 +- test/status_parity_test.go | 46 +++ test/users_parity_test.go | 149 ++++++++ 19 files changed, 2045 insertions(+), 189 deletions(-) create mode 100644 test/cluster_parity_test.go create mode 100644 test/crush_rule_parity_test.go create mode 100644 test/parity/api_diff.go create mode 100644 test/parity/api_diff.yaml create mode 100644 test/parity/client.go create mode 100644 test/parity/diff.go create mode 100644 test/parity/diff_test.go create mode 100644 test/parity/grpc.go create mode 100644 test/parity/inventory.go create mode 100644 test/parity/recorder.go create mode 100644 test/status_parity_test.go create mode 100644 test/users_parity_test.go diff --git a/Makefile b/Makefile index c92a1dd..a9573f4 100644 --- a/Makefile +++ b/Makefile @@ -10,13 +10,13 @@ help: check: ## fmt + vet + unit tests go fmt ./... CGO_ENABLED=0 go vet ./... - CGO_ENABLED=0 go test ./pkg/... + CGO_ENABLED=0 go test ./... lint: ## golangci-lint CGO_ENABLED=0 go tool golangci-lint run e2e-test: ## e2e tests in Docker (-tid) - CGO_ENABLED=0 go test ./test/... -tid + CGO_ENABLED=0 go test ./test/ -tid proto: ## regenerate gRPC stubs and OpenAPI cd api && go tool buf generate diff --git a/api/buf.gen.yaml b/api/buf.gen.yaml index 4c7ddd1..b3046bc 100644 --- a/api/buf.gen.yaml +++ b/api/buf.gen.yaml @@ -19,3 +19,4 @@ plugins: - grpc_api_configuration=http.yaml - allow_merge=true - merge_file_name=ceph-api + - json_names_for_fields=false diff --git a/api/openapi/ceph-api.swagger.json b/api/openapi/ceph-api.swagger.json index d6f2542..c20782b 100644 --- a/api/openapi/ceph-api.swagger.json +++ b/api/openapi/ceph-api.swagger.json @@ -239,7 +239,7 @@ "type": "string" }, { - "name": "fullText", + "name": "full_text", "in": "query", "required": false, "type": "string" @@ -1192,13 +1192,13 @@ "name": { "type": "string" }, - "publicAddrs": { + "public_addrs": { "$ref": "#/definitions/cephCephMonDumpAddrVec" }, "addr": { "type": "string" }, - "publicAddr": { + "public_addr": { "type": "string" }, "priority": { @@ -1209,7 +1209,7 @@ "type": "integer", "format": "int32" }, - "crushLocation": { + "crush_location": { "type": "string" } } @@ -1232,27 +1232,27 @@ "type": "string", "format": "date-time" }, - "minMonRelease": { + "min_mon_release": { "type": "integer", "format": "int32" }, - "minMonReleaseName": { + "min_mon_release_name": { "type": "string" }, - "electionStrategy": { + "election_strategy": { "type": "integer", "format": "int32" }, - "disallowedLeaders": { + "disallowed_leaders": { "type": "string" }, - "stretchMode": { + "stretch_mode": { "type": "boolean" }, - "tiebreakerMon": { + "tiebreaker_mon": { "type": "string" }, - "removedRanks": { + "removed_ranks": { "type": "string" }, "features": { @@ -1281,11 +1281,11 @@ "type": "integer", "format": "int32" }, - "byRank": { + "by_rank": { "type": "array", "items": {} }, - "upStandby": { + "up_standby": { "type": "integer", "format": "int32" } @@ -1315,7 +1315,7 @@ "available": { "type": "boolean" }, - "numStandbys": { + "num_standbys": { "type": "integer", "format": "int32" }, @@ -1340,10 +1340,10 @@ "type": "integer", "format": "int32" }, - "minMonReleaseName": { + "min_mon_release_name": { "type": "string" }, - "numMons": { + "num_mons": { "type": "integer", "format": "int32" } @@ -1356,27 +1356,27 @@ "type": "integer", "format": "int32" }, - "numOsds": { + "num_osds": { "type": "integer", "format": "int32" }, - "numUpOsds": { + "num_up_osds": { "type": "integer", "format": "int32" }, - "osdUpSince": { + "osd_up_since": { "type": "string", "format": "int64" }, - "numInOsds": { + "num_in_osds": { "type": "integer", "format": "int32" }, - "osdInSince": { + "osd_in_since": { "type": "string", "format": "int64" }, - "numRemappedPgs": { + "num_remapped_pgs": { "type": "integer", "format": "int32" } @@ -1385,38 +1385,38 @@ "cephCephStatusPGMap": { "type": "object", "properties": { - "pgsByState": { + "pgs_by_state": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/cephCephStatusPGState" } }, - "numPgs": { + "num_pgs": { "type": "integer", "format": "int32" }, - "numPools": { + "num_pools": { "type": "integer", "format": "int32" }, - "numObjects": { + "num_objects": { "type": "integer", "format": "int32" }, - "dataBytes": { + "data_bytes": { "type": "string", "format": "int64" }, - "bytesUsed": { + "bytes_used": { "type": "string", "format": "int64" }, - "bytesAvail": { + "bytes_avail": { "type": "string", "format": "int64" }, - "bytesTotal": { + "bytes_total": { "type": "string", "format": "int64" } @@ -1425,7 +1425,7 @@ "cephCephStatusPGState": { "type": "object", "properties": { - "stateName": { + "state_name": { "type": "string" }, "count": { @@ -1527,13 +1527,13 @@ "desc": { "type": "string" }, - "longDesc": { + "long_desc": { "type": "string" }, - "defaultValue": { + "default_value": { "type": "string" }, - "daemonDefault": { + "daemon_default": { "type": "string" }, "tags": { @@ -1548,13 +1548,13 @@ "$ref": "#/definitions/ConfigParamServiceType" } }, - "seeAlso": { + "see_also": { "type": "array", "items": { "type": "string" } }, - "enumValues": { + "enum_values": { "type": "array", "items": { "type": "string" @@ -1568,7 +1568,7 @@ "type": "number", "format": "double" }, - "canUpdateAtRuntime": { + "can_update_at_runtime": { "type": "boolean" }, "flags": { @@ -1603,16 +1603,16 @@ "cephCreateRuleRequest": { "type": "object", "properties": { - "deviceClass": { + "device_class": { "type": "string" }, - "failureDomain": { + "failure_domain": { "type": "string" }, "name": { "type": "string" }, - "poolType": { + "pool_type": { "$ref": "#/definitions/cephPoolType" }, "profile": { @@ -1639,11 +1639,11 @@ "password": { "type": "string" }, - "pwdExpirationDate": { + "pwd_expiration_date": { "type": "string", "format": "date-time" }, - "pwdUpdateRequired": { + "pwd_update_required": { "type": "boolean" }, "roles": { @@ -1696,64 +1696,64 @@ "type": "string", "format": "date-time" }, - "lastUpChange": { + "last_up_change": { "type": "string", "format": "date-time" }, - "lastInChange": { + "last_in_change": { "type": "string", "format": "date-time" }, "flags": { "type": "string" }, - "flagsNum": { + "flags_num": { "type": "integer", "format": "int32" }, - "flagsSet": { + "flags_set": { "type": "array", "items": { "type": "string" } }, - "crushVersion": { + "crush_version": { "type": "integer", "format": "int32" }, - "fullRatio": { + "full_ratio": { "type": "number", "format": "double" }, - "backfillfullRatio": { + "backfillfull_ratio": { "type": "number", "format": "double" }, - "nearfullRatio": { + "nearfull_ratio": { "type": "number", "format": "double" }, - "clusterSnapshot": { + "cluster_snapshot": { "type": "string" }, - "poolMax": { + "pool_max": { "type": "integer", "format": "int32" }, - "maxOsd": { + "max_osd": { "type": "integer", "format": "int32" }, - "requireMinCompatClient": { + "require_min_compat_client": { "type": "string" }, - "minCompatClient": { + "min_compat_client": { "type": "string" }, - "requireOsdRelease": { + "require_osd_release": { "type": "string" }, - "allowCrimson": { + "allow_crimson": { "type": "boolean" }, "pools": { @@ -1770,30 +1770,30 @@ "$ref": "#/definitions/cephOsdDumpOsdInfo" } }, - "osdXinfo": { + "osd_xinfo": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/cephOsdDumpOsdXInfo" } }, - "pgUpmap": { + "pg_upmap": { "type": "array", "items": {} }, - "pgUpmapItems": { + "pg_upmap_items": { "type": "array", "items": {} }, - "pgUpmapPrimaries": { + "pg_upmap_primaries": { "type": "array", "items": {} }, - "pgTemp": { + "pg_temp": { "type": "array", "items": {} }, - "primaryTemp": { + "primary_temp": { "type": "array", "items": {} }, @@ -1804,34 +1804,34 @@ "format": "date-time" } }, - "rangeBlocklist": { + "range_blocklist": { "type": "object" }, - "erasureCodeProfiles": { + "erasure_code_profiles": { "type": "object", "additionalProperties": { "$ref": "#/definitions/cephOsdDumpErasureCodeProfile" } }, - "removedSnapsQueue": { + "removed_snaps_queue": { "type": "array", "items": {} }, - "newRemovedSnaps": { + "new_removed_snaps": { "type": "array", "items": {} }, - "newPurgedSnaps": { + "new_purged_snaps": { "type": "array", "items": {} }, - "crushNodeFlags": { + "crush_node_flags": { "type": "object" }, - "deviceClassFlags": { + "device_class_flags": { "type": "object" }, - "stretchMode": { + "stretch_mode": { "$ref": "#/definitions/cephOsdDumpStretchMode" } } @@ -1845,7 +1845,7 @@ "health": { "$ref": "#/definitions/cephCephStatusHealth" }, - "electionEpoch": { + "election_epoch": { "type": "integer", "format": "int32" }, @@ -1856,13 +1856,13 @@ "format": "int32" } }, - "quorumNames": { + "quorum_names": { "type": "array", "items": { "type": "string" } }, - "quorumAge": { + "quorum_age": { "type": "integer", "format": "int32" }, @@ -1884,7 +1884,7 @@ "servicemap": { "$ref": "#/definitions/cephCephStatusServiceMap" }, - "progressEvents": { + "progress_events": { "type": "object" } } @@ -1922,10 +1922,10 @@ "username": { "type": "string" }, - "pwdUpdateRequired": { + "pwd_update_required": { "type": "boolean" }, - "pwdExpirationDate": { + "pwd_expiration_date": { "type": "string", "format": "date-time" }, @@ -2010,25 +2010,25 @@ "cephOsdDumpLastPgMergeMeta": { "type": "object", "properties": { - "sourcePgid": { + "source_pgid": { "type": "string" }, - "readyEpoch": { + "ready_epoch": { "type": "integer", "format": "int32" }, - "lastEpochStarted": { + "last_epoch_started": { "type": "integer", "format": "int32" }, - "lastEpochClean": { + "last_epoch_clean": { "type": "integer", "format": "int32" }, - "sourceVersion": { + "source_version": { "type": "string" }, - "targetVersion": { + "target_version": { "type": "string" } } @@ -2055,56 +2055,56 @@ "type": "number", "format": "double" }, - "primaryAffinity": { + "primary_affinity": { "type": "number", "format": "double" }, - "lastCleanBegin": { + "last_clean_begin": { "type": "integer", "format": "int32" }, - "lastCleanEnd": { + "last_clean_end": { "type": "integer", "format": "int32" }, - "upFrom": { + "up_from": { "type": "integer", "format": "int32" }, - "upThru": { + "up_thru": { "type": "integer", "format": "int32" }, - "downAt": { + "down_at": { "type": "integer", "format": "int32" }, - "lostAt": { + "lost_at": { "type": "integer", "format": "int32" }, - "publicAddrs": { + "public_addrs": { "$ref": "#/definitions/cephOsdDumpPublicAddrs" }, - "clusterAddrs": { + "cluster_addrs": { "$ref": "#/definitions/cephOsdDumpClusterAddrs" }, - "heartbeatBackAddrs": { + "heartbeat_back_addrs": { "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" }, - "heartbeatFrontAddrs": { + "heartbeat_front_addrs": { "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" }, - "publicAddr": { + "public_addr": { "type": "string" }, - "clusterAddr": { + "cluster_addr": { "type": "string" }, - "heartbeatBackAddr": { + "heartbeat_back_addr": { "type": "string" }, - "heartbeatFrontAddr": { + "heartbeat_front_addr": { "type": "string" }, "state": { @@ -2122,15 +2122,15 @@ "type": "integer", "format": "int32" }, - "downStamp": { + "down_stamp": { "type": "string", "format": "date-time" }, - "laggyProbability": { + "laggy_probability": { "type": "number", "format": "double" }, - "laggyInterval": { + "laggy_interval": { "type": "number", "format": "double" }, @@ -2138,15 +2138,15 @@ "type": "string", "format": "uint64" }, - "oldWeight": { + "old_weight": { "type": "number", "format": "double" }, - "lastPurgedSnapsScrub": { + "last_purged_snaps_scrub": { "type": "string", "format": "date-time" }, - "deadEpoch": { + "dead_epoch": { "type": "integer", "format": "int32" } @@ -2159,10 +2159,10 @@ "type": "integer", "format": "int32" }, - "poolName": { + "pool_name": { "type": "string" }, - "createTime": { + "create_time": { "type": "string", "format": "date-time" }, @@ -2170,7 +2170,7 @@ "type": "string", "format": "int64" }, - "flagsNames": { + "flags_names": { "type": "string" }, "type": { @@ -2181,99 +2181,99 @@ "type": "integer", "format": "int32" }, - "minSize": { + "min_size": { "type": "integer", "format": "int32" }, - "crushRule": { + "crush_rule": { "type": "integer", "format": "int32" }, - "peeringCrushBucketCount": { + "peering_crush_bucket_count": { "type": "integer", "format": "int32" }, - "peeringCrushBucketTarget": { + "peering_crush_bucket_target": { "type": "integer", "format": "int32" }, - "peeringCrushBucketBarrier": { + "peering_crush_bucket_barrier": { "type": "integer", "format": "int32" }, - "peeringCrushBucketMandatoryMember": { + "peering_crush_bucket_mandatory_member": { "type": "integer", "format": "int32" }, - "objectHash": { + "object_hash": { "type": "integer", "format": "int32" }, - "pgAutoscaleMode": { + "pg_autoscale_mode": { "type": "string" }, - "pgNum": { + "pg_num": { "type": "integer", "format": "int32" }, - "pgPlacementNum": { + "pg_placement_num": { "type": "integer", "format": "int32" }, - "pgPlacementNumTarget": { + "pg_placement_num_target": { "type": "integer", "format": "int32" }, - "pgNumTarget": { + "pg_num_target": { "type": "integer", "format": "int32" }, - "pgNumPending": { + "pg_num_pending": { "type": "integer", "format": "int32" }, - "lastPgMergeMeta": { + "last_pg_merge_meta": { "$ref": "#/definitions/cephOsdDumpLastPgMergeMeta" }, - "lastChange": { + "last_change": { "type": "string" }, - "lastForceOpResend": { + "last_force_op_resend": { "type": "string" }, - "lastForceOpResendPrenautilus": { + "last_force_op_resend_prenautilus": { "type": "string" }, - "lastForceOpResendPreluminous": { + "last_force_op_resend_preluminous": { "type": "string" }, "auid": { "type": "string", "format": "uint64" }, - "snapMode": { + "snap_mode": { "type": "string" }, - "snapSeq": { + "snap_seq": { "type": "string", "format": "uint64" }, - "snapEpoch": { + "snap_epoch": { "type": "string", "format": "uint64" }, - "poolSnaps": { + "pool_snaps": { "type": "array", "items": {} }, - "removedSnaps": { + "removed_snaps": { "type": "string" }, - "quotaMaxBytes": { + "quota_max_bytes": { "type": "string", "format": "uint64" }, - "quotaMaxObjects": { + "quota_max_objects": { "type": "string", "format": "uint64" }, @@ -2284,104 +2284,104 @@ "format": "int32" } }, - "tierOf": { + "tier_of": { "type": "integer", "format": "int32" }, - "readTier": { + "read_tier": { "type": "integer", "format": "int32" }, - "writeTier": { + "write_tier": { "type": "integer", "format": "int32" }, - "cacheMode": { + "cache_mode": { "type": "string" }, - "targetMaxBytes": { + "target_max_bytes": { "type": "string", "format": "uint64" }, - "targetMaxObjects": { + "target_max_objects": { "type": "string", "format": "uint64" }, - "cacheTargetDirtyRatioMicro": { + "cache_target_dirty_ratio_micro": { "type": "string", "format": "uint64" }, - "cacheTargetDirtyHighRatioMicro": { + "cache_target_dirty_high_ratio_micro": { "type": "string", "format": "uint64" }, - "cacheTargetFullRatioMicro": { + "cache_target_full_ratio_micro": { "type": "string", "format": "uint64" }, - "cacheMinFlushAge": { + "cache_min_flush_age": { "type": "string", "format": "uint64" }, - "cacheMinEvictAge": { + "cache_min_evict_age": { "type": "string", "format": "uint64" }, - "erasureCodeProfile": { + "erasure_code_profile": { "type": "string" }, - "hitSetParams": { + "hit_set_params": { "$ref": "#/definitions/cephOsdDumpHitSetParams" }, - "hitSetPeriod": { + "hit_set_period": { "type": "string", "format": "uint64" }, - "hitSetCount": { + "hit_set_count": { "type": "string", "format": "uint64" }, - "useGmtHitset": { + "use_gmt_hitset": { "type": "boolean" }, - "minReadRecencyForPromote": { + "min_read_recency_for_promote": { "type": "string", "format": "uint64" }, - "minWriteRecencyForPromote": { + "min_write_recency_for_promote": { "type": "string", "format": "uint64" }, - "hitSetGradeDecayRate": { + "hit_set_grade_decay_rate": { "type": "string", "format": "uint64" }, - "hitSetSearchLastN": { + "hit_set_search_last_n": { "type": "string", "format": "uint64" }, - "gradeTable": { + "grade_table": { "type": "array", "items": {} }, - "stripeWidth": { + "stripe_width": { "type": "string", "format": "uint64" }, - "expectedNumObjects": { + "expected_num_objects": { "type": "string", "format": "uint64" }, - "fastRead": { + "fast_read": { "type": "boolean" }, "options": { "type": "object" }, - "applicationMetadata": { + "application_metadata": { "type": "object" }, - "readBalance": { + "read_balance": { "$ref": "#/definitions/cephOsdDumpReadBalance" } } @@ -2401,35 +2401,35 @@ "cephOsdDumpReadBalance": { "type": "object", "properties": { - "scoreActing": { + "score_acting": { "type": "number", "format": "double" }, - "scoreStable": { + "score_stable": { "type": "number", "format": "double" }, - "optimalScore": { + "optimal_score": { "type": "number", "format": "double" }, - "rawScoreActing": { + "raw_score_acting": { "type": "number", "format": "double" }, - "rawScoreStable": { + "raw_score_stable": { "type": "number", "format": "double" }, - "primaryAffinityWeighted": { + "primary_affinity_weighted": { "type": "number", "format": "double" }, - "averagePrimaryAffinity": { + "average_primary_affinity": { "type": "number", "format": "double" }, - "averagePrimaryAffinityWeighted": { + "average_primary_affinity_weighted": { "type": "number", "format": "double" } @@ -2438,22 +2438,22 @@ "cephOsdDumpStretchMode": { "type": "object", "properties": { - "stretchModeEnabled": { + "stretch_mode_enabled": { "type": "boolean" }, - "stretchBucketCount": { + "stretch_bucket_count": { "type": "integer", "format": "int32" }, - "degradedStretchMode": { + "degraded_stretch_mode": { "type": "integer", "format": "int32" }, - "recoveringStretchMode": { + "recovering_stretch_mode": { "type": "integer", "format": "int32" }, - "stretchModeBucket": { + "stretch_mode_bucket": { "type": "integer", "format": "int32" } @@ -2502,11 +2502,11 @@ "cephRule": { "type": "object", "properties": { - "ruleId": { + "rule_id": { "type": "string", "format": "int64" }, - "ruleName": { + "rule_name": { "type": "string" }, "ruleset": { @@ -2517,11 +2517,11 @@ "type": "string", "format": "int64" }, - "minSize": { + "min_size": { "type": "string", "format": "int64" }, - "maxSize": { + "max_size": { "type": "string", "format": "int64" }, @@ -2571,10 +2571,10 @@ "username": { "type": "string" }, - "pwdUpdateRequired": { + "pwd_update_required": { "type": "boolean" }, - "pwdExpirationDate": { + "pwd_expiration_date": { "type": "string", "format": "date-time" }, @@ -2620,15 +2620,15 @@ "name": { "type": "string" }, - "lastUpdate": { + "last_update": { "type": "string", "format": "date-time" }, - "pwdExpirationDate": { + "pwd_expiration_date": { "type": "string", "format": "date-time" }, - "pwdUpdateRequired": { + "pwd_update_required": { "type": "boolean" }, "roles": { @@ -2669,11 +2669,11 @@ "password": { "type": "string" }, - "pwdExpirationDate": { + "pwd_expiration_date": { "type": "string", "format": "date-time" }, - "pwdUpdateRequired": { + "pwd_update_required": { "type": "boolean" }, "roles": { diff --git a/go.mod b/go.mod index 1e22d4b..4bbec7d 100644 --- a/go.mod +++ b/go.mod @@ -38,6 +38,7 @@ require ( github.com/testcontainers/testcontainers-go v0.42.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.43.0 golang.org/x/oauth2 v0.36.0 + gopkg.in/yaml.v3 v3.0.1 ) require ( @@ -355,7 +356,6 @@ require ( golang.org/x/tools v0.45.0 // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260519071638-aa98bba5eb94 // indirect google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1 // indirect - gopkg.in/yaml.v3 v3.0.1 // indirect honnef.co/go/tools v0.7.0 // indirect mvdan.cc/gofumpt v0.9.2 // indirect mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect diff --git a/pkg/api/grpc_http_gateway.go b/pkg/api/grpc_http_gateway.go index 5c9d943..8494c20 100644 --- a/pkg/api/grpc_http_gateway.go +++ b/pkg/api/grpc_http_gateway.go @@ -14,10 +14,23 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials" "google.golang.org/grpc/credentials/insecure" + "google.golang.org/protobuf/encoding/protojson" ) func GRPCGateway(ctx context.Context, conf Config, metricsHandler http.HandlerFunc, oauthHandlers map[string]http.HandlerFunc) (http.Handler, error) { - mux := runtime.NewServeMux() + // UseProtoNames emits proto field names (snake_case) instead of the lowerCamelCase + // default, matching the Ceph dashboard wire format for drop-in parity. + mux := runtime.NewServeMux( + runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{ + MarshalOptions: protojson.MarshalOptions{ + UseProtoNames: true, + EmitUnpopulated: true, + }, + UnmarshalOptions: protojson.UnmarshalOptions{ + DiscardUnknown: true, + }, + }), + ) var opts []grpc.DialOption if conf.Secure { diff --git a/test/cluster_parity_test.go b/test/cluster_parity_test.go new file mode 100644 index 0000000..c80d627 --- /dev/null +++ b/test/cluster_parity_test.go @@ -0,0 +1,89 @@ +//go:build cgo + +package test + +import ( + "net/http" + "testing" + + "github.com/clyso/ceph-api/test/parity" + "github.com/stretchr/testify/require" +) + +const clusterAccept = "application/vnd.ceph.api.v0.1+json" + +func Test_Parity_Cluster_Status(t *testing.T) { + r := parity.New(t) + + get := parity.Call{Method: "GET", Path: "/api/cluster", Accept: clusterAccept} + put := parity.Call{ + Method: "PUT", Path: "/api/cluster", + Body: map[string]string{"status": "POST_INSTALLED"}, + Accept: clusterAccept, + } + + for _, b := range r.Backends(get) { + r.DoRecord(b, get) + } + for _, b := range r.Backends(put) { + r.DoRecord(b, put) + } + + t.Cleanup(func() { + r.Do(parity.Ours, parity.Call{ + Method: "PUT", Path: "/api/cluster", + Body: map[string]string{"status": "INSTALLED"}, + Accept: clusterAccept, + }) + }) +} + +func Test_Parity_Cluster_ConfigSearch(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/cluster/config/search", Accept: clusterAccept} + for _, b := range r.Backends(call) { + r.DoRecord(b, call) + } +} + +func Test_Parity_Cluster_Users_CRUD(t *testing.T) { + r := parity.New(t) + + const entity = "client.parity-cluster-user" + createBody := map[string]any{ + "user_entity": entity, + "capabilities": map[string]string{"mon": "allow r"}, + } + updateBody := map[string]any{ + "user_entity": entity, + "capabilities": map[string]string{"mon": "allow rw"}, + } + exportBody := map[string]any{"entities": []string{entity}} + + list := parity.Call{Method: "GET", Path: "/api/cluster/user", Accept: clusterAccept} + create := parity.Call{Method: "POST", Path: "/api/cluster/user", Body: createBody, Accept: clusterAccept} + update := parity.Call{Method: "PUT", Path: "/api/cluster/user", Body: updateBody, Accept: clusterAccept} + export := parity.Call{Method: "POST", Path: "/api/cluster/user/export", Body: exportBody, Accept: clusterAccept} + del := parity.Call{ + Method: "DELETE", Path: "/api/cluster/user/{user_entity}", + PathParams: map[string]string{"user_entity": entity}, + Accept: clusterAccept, + } + + r.Do(parity.Ours, del) + t.Cleanup(func() { r.Do(parity.Ours, del) }) + + // Each call's Backends decides which sides to drive; missing + // dashboard counterpart -> [Ours] only. + for _, b := range r.Backends(list) { + r.DoRecord(b, list) + resp, _ := r.DoRecord(b, create) + require.True(t, resp.StatusCode/100 == 2 || resp.StatusCode == http.StatusConflict, + "%s: create cluster user: status %d", b, resp.StatusCode) + r.DoRecord(b, update) + r.DoRecord(b, export) + resp, _ = r.DoRecord(b, del) + require.True(t, resp.StatusCode/100 == 2, + "%s: delete cluster user: status %d", b, resp.StatusCode) + } +} diff --git a/test/crush_rule_parity_test.go b/test/crush_rule_parity_test.go new file mode 100644 index 0000000..aff37a0 --- /dev/null +++ b/test/crush_rule_parity_test.go @@ -0,0 +1,62 @@ +//go:build cgo + +package test + +import ( + "net/http" + "testing" + + "github.com/clyso/ceph-api/test/parity" + "github.com/stretchr/testify/require" +) + +const crushRuleAccept = "application/vnd.ceph.api.v2.0+json" + +func Test_Parity_CrushRule_List(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/crush_rule", Accept: crushRuleAccept} + for _, b := range r.Backends(call) { + r.DoRecord(b, call) + } +} + +func Test_Parity_CrushRule_Get(t *testing.T) { + r := parity.New(t) + get := parity.Call{ + Method: "GET", Path: "/api/crush_rule/{name}", + PathParams: map[string]string{"name": "replicated_rule"}, + Accept: crushRuleAccept, + } + for _, b := range r.Backends(get) { + r.DoRecord(b, get) + } +} + +func Test_Parity_CrushRule_CRUD(t *testing.T) { + r := parity.New(t) + + const name = "parity-crush-rule" + createBody := map[string]any{ + "name": name, + "root": "default", + "failure_domain": "osd", + "device_class": "", + } + create := parity.Call{Method: "POST", Path: "/api/crush_rule", Body: createBody, Accept: crushRuleAccept} + del := parity.Call{ + Method: "DELETE", Path: "/api/crush_rule/{name}", + PathParams: map[string]string{"name": name}, Accept: crushRuleAccept, + } + + r.Do(parity.Ours, del) + t.Cleanup(func() { r.Do(parity.Ours, del) }) + + for _, b := range r.Backends(create) { + resp, _ := r.DoRecord(b, create) + require.True(t, resp.StatusCode/100 == 2 || resp.StatusCode == http.StatusConflict, + "%s: create crush rule: status %d", b, resp.StatusCode) + resp, _ = r.DoRecord(b, del) + require.True(t, resp.StatusCode/100 == 2, + "%s: delete crush rule: status %d", b, resp.StatusCode) + } +} diff --git a/test/parity/api_diff.go b/test/parity/api_diff.go new file mode 100644 index 0000000..914daf1 --- /dev/null +++ b/test/parity/api_diff.go @@ -0,0 +1,38 @@ +package parity + +import ( + "fmt" + "os" + "strings" + + "gopkg.in/yaml.v3" +) + +// loadAPIDiff parses api_diff.yaml. Keys are endpoint ids +// (" "); values are lists of Ignore. Both +// path and reason are required. An empty or missing file is OK (no +// declared divergences). +func loadAPIDiff(path string) (map[string][]Ignore, error) { + raw, err := os.ReadFile(path) + if err != nil { + if os.IsNotExist(err) { + return map[string][]Ignore{}, nil + } + return nil, err + } + out := map[string][]Ignore{} + if err := yaml.Unmarshal(raw, &out); err != nil { + return nil, fmt.Errorf("parse: %w", err) + } + for endpoint, ignores := range out { + for i, ig := range ignores { + if strings.TrimSpace(ig.Reason) == "" { + return nil, fmt.Errorf("%s ignore #%d (%s): reason: is required", endpoint, i, ig.Path) + } + if strings.TrimSpace(ig.Path) == "" { + return nil, fmt.Errorf("%s ignore #%d: path: is required", endpoint, i) + } + } + } + return out, nil +} diff --git a/test/parity/api_diff.yaml b/test/parity/api_diff.yaml new file mode 100644 index 0000000..b38e3d7 --- /dev/null +++ b/test/parity/api_diff.yaml @@ -0,0 +1,19 @@ +# Declared divergences between the ceph dashboard and ceph-api response +# bodies. Keys are endpoint ids in the form " " as +# they appear in inventory.yaml (e.g. "GET /api/role/{name}"). Values are +# lists of JSONPath ignores with a mandatory `reason:`. +# +# This file IS the migration guide for dashboard clients: every entry is +# something a client switching from the dashboard to ceph-api would +# observe. +# +# JSONPath subset: $ root, . descent, * wildcard for "any array index or +# map key" at a single position. See test/parity/diff.go for the matcher. +# +# Example: +# "GET /api/cluster": +# - path: $.uptime +# reason: live; varies between calls +# +# Empty until Phase 2.3 walks the parity tests endpoint by endpoint and +# decides what we promise to match vs intentionally diverge. diff --git a/test/parity/client.go b/test/parity/client.go new file mode 100644 index 0000000..9f0de45 --- /dev/null +++ b/test/parity/client.go @@ -0,0 +1,107 @@ +package parity + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "net/http" + "strings" +) + +// Client is a thin authenticated HTTP client targeting a single ceph-api or +// ceph-dashboard backend. Both backends accept the same POST /api/auth +// {"username","password"} -> {"token"} login shape (the dashboard's flow, +// which ceph-api mirrors at /api/auth for drop-in compatibility), so a +// single Client implementation covers both. +type Client struct { + BaseURL string + HTTP *http.Client + Token string +} + +// Login posts credentials to baseURL+/api/auth using the provided http.Client +// (the caller controls transport, e.g. tls.InsecureSkipVerify for the +// dashboard's self-signed cert) and returns a ready-to-use Client. +// +// accept is the versioned media type the dashboard's /api/auth requires +// (currently "application/vnd.ceph.api.v1.0+json"); pass the empty string for +// backends that accept plain application/json. The same Accept value is sent +// here and on every subsequent call via Client.Do is not bound to this value +// (each parity entry declares its own Accept). +func Login(ctx context.Context, baseURL string, hc *http.Client, accept, user, pass string) (*Client, error) { + body, err := json.Marshal(map[string]string{"username": user, "password": pass}) + if err != nil { + return nil, err + } + req, err := http.NewRequestWithContext(ctx, http.MethodPost, joinURL(baseURL, "/api/auth"), bytes.NewReader(body)) + if err != nil { + return nil, err + } + req.Header.Set("Content-Type", "application/json") + if accept != "" { + req.Header.Set("Accept", accept) + } + + resp, err := hc.Do(req) + if err != nil { + return nil, fmt.Errorf("login %s: %w", baseURL, err) + } + defer func() { _ = resp.Body.Close() }() + + raw, _ := io.ReadAll(resp.Body) + if resp.StatusCode != http.StatusOK && resp.StatusCode != http.StatusCreated { + return nil, fmt.Errorf("login %s: status %d: %s", baseURL, resp.StatusCode, strings.TrimSpace(string(raw))) + } + + var out struct { + Token string `json:"token"` + } + if err := json.Unmarshal(raw, &out); err != nil { + return nil, fmt.Errorf("login %s: parse response: %w (body=%s)", baseURL, err, raw) + } + if out.Token == "" { + return nil, fmt.Errorf("login %s: empty token in response: %s", baseURL, raw) + } + return &Client{BaseURL: baseURL, HTTP: hc, Token: out.Token}, nil +} + +// Do sends method+path against the client's base URL with the bearer token +// attached. Body is sent verbatim; pass nil for GET/DELETE. accept is the +// versioned media type the dashboard requires for this endpoint, sent +// verbatim on both backends so requests stay clones; pass "" to omit. +// extra is applied on top (the recorder uses it for arbitrary user-set +// headers; Authorization and Content-Type are always managed here). +func (c *Client) Do(ctx context.Context, method, path, accept string, body io.Reader, extra http.Header) (*http.Response, []byte, error) { + req, err := http.NewRequestWithContext(ctx, method, joinURL(c.BaseURL, path), body) + if err != nil { + return nil, nil, err + } + for k, vs := range extra { + for _, v := range vs { + req.Header.Add(k, v) + } + } + req.Header.Set("Authorization", "Bearer "+c.Token) + if accept != "" { + req.Header.Set("Accept", accept) + } + if body != nil { + req.Header.Set("Content-Type", "application/json") + } + resp, err := c.HTTP.Do(req) + if err != nil { + return nil, nil, err + } + defer func() { _ = resp.Body.Close() }() + raw, err := io.ReadAll(resp.Body) + if err != nil { + return resp, nil, fmt.Errorf("read body: %w", err) + } + return resp, raw, nil +} + +func joinURL(base, path string) string { + return strings.TrimRight(base, "/") + path +} diff --git a/test/parity/diff.go b/test/parity/diff.go new file mode 100644 index 0000000..b4025ed --- /dev/null +++ b/test/parity/diff.go @@ -0,0 +1,225 @@ +package parity + +import ( + "fmt" + "reflect" + "slices" + "sort" + "strconv" + "strings" +) + +// Ignore declares a JSONPath that the diff walker should skip, with a +// mandatory reason so the divergence catalogue stays audit-readable. +type Ignore struct { + Path string `yaml:"path"` + Reason string `yaml:"reason"` +} + +// Diff describes a single divergence between dashboard ("expected") and +// ceph-api ("actual") response bodies at a JSONPath location. +type Diff struct { + Path string + Kind string + Expected any + Actual any +} + +func (d Diff) String() string { + return fmt.Sprintf("%s @ %s: expected=%v actual=%v", d.Kind, d.Path, render(d.Expected), render(d.Actual)) +} + +// Compare walks expected (dashboard) and actual (ceph-api) JSON trees +// (decoded from json.Unmarshal into any) and reports every divergence not +// covered by an ignore. Ignore paths use a tiny subset of JSONPath: +// "$" root, "." for descent, and "*" wildcard for "any array index or map +// key" at a single position. +func Compare(expected, actual any, ignores []Ignore) []Diff { + patterns := make([][]string, 0, len(ignores)) + for _, ig := range ignores { + segs, err := parsePath(ig.Path) + if err != nil { + // Loader validates non-empty; treat bad syntax as an internal + // programming error rather than silently mis-comparing. + panic(fmt.Errorf("parity: invalid ignore path %q: %w", ig.Path, err)) + } + patterns = append(patterns, segs) + } + return walk(nil, expected, actual, patterns) +} + +func walk(path []string, expected, actual any, patterns [][]string) []Diff { + if matchesAny(path, patterns) { + return nil + } + + switch e := expected.(type) { + case map[string]any: + a, ok := actual.(map[string]any) + if !ok { + return typeDiff(path, expected, actual) + } + return walkMap(path, e, a, patterns) + case []any: + a, ok := actual.([]any) + if !ok { + return typeDiff(path, expected, actual) + } + return walkArray(path, e, a, patterns) + default: + if reflect.TypeOf(expected) != reflect.TypeOf(actual) { + return typeDiff(path, expected, actual) + } + if !scalarEqual(expected, actual) { + return []Diff{{Path: pathStr(path), Kind: "value", Expected: expected, Actual: actual}} + } + return nil + } +} + +func walkMap(path []string, expected, actual map[string]any, patterns [][]string) []Diff { + keys := unionKeys(expected, actual) + var diffs []Diff + for _, k := range keys { + sub := appendSeg(path, k) + ev, eok := expected[k] + av, aok := actual[k] + switch { + case eok && aok: + diffs = append(diffs, walk(sub, ev, av, patterns)...) + case !aok: + if matchesAny(sub, patterns) { + continue + } + diffs = append(diffs, Diff{Path: pathStr(sub), Kind: "missing", Expected: ev}) + case !eok: + if matchesAny(sub, patterns) { + continue + } + diffs = append(diffs, Diff{Path: pathStr(sub), Kind: "extra", Actual: av}) + } + } + return diffs +} + +func walkArray(path []string, expected, actual []any, patterns [][]string) []Diff { + if len(expected) != len(actual) { + return []Diff{{ + Path: pathStr(path), + Kind: "length", + Expected: len(expected), + Actual: len(actual), + }} + } + var diffs []Diff + for i := range expected { + sub := appendSeg(path, strconv.Itoa(i)) + diffs = append(diffs, walk(sub, expected[i], actual[i], patterns)...) + } + return diffs +} + +// appendSeg returns path with seg appended, always allocating a fresh +// underlying array so sibling recursion in the walker can't stomp on each +// other's path stack. +func appendSeg(path []string, seg string) []string { + out := make([]string, len(path)+1) + copy(out, path) + out[len(path)] = seg + return out +} + +func typeDiff(path []string, expected, actual any) []Diff { + return []Diff{{ + Path: pathStr(path), + Kind: "type", + Expected: fmt.Sprintf("%T", expected), + Actual: fmt.Sprintf("%T", actual), + }} +} + +func scalarEqual(a, b any) bool { + if a == nil || b == nil { + return a == b + } + return a == b +} + +func unionKeys(a, b map[string]any) []string { + seen := make(map[string]struct{}, len(a)+len(b)) + for k := range a { + seen[k] = struct{}{} + } + for k := range b { + seen[k] = struct{}{} + } + out := make([]string, 0, len(seen)) + for k := range seen { + out = append(out, k) + } + sort.Strings(out) + return out +} + +func parsePath(p string) ([]string, error) { + if p == "" { + return nil, fmt.Errorf("empty path") + } + if !strings.HasPrefix(p, "$") { + return nil, fmt.Errorf("must start with $") + } + rest := strings.TrimPrefix(p, "$") + if rest == "" { + return nil, nil + } + if !strings.HasPrefix(rest, ".") { + return nil, fmt.Errorf("expected . after $, got %q", rest) + } + segs := strings.Split(rest[1:], ".") + if slices.Contains(segs, "") { + return nil, fmt.Errorf("empty segment in %q", p) + } + return segs, nil +} + +func matchesAny(path []string, patterns [][]string) bool { + for _, pat := range patterns { + if matches(path, pat) { + return true + } + } + return false +} + +func matches(path, pattern []string) bool { + if len(path) != len(pattern) { + return false + } + for i := range path { + if pattern[i] == "*" { + continue + } + if pattern[i] != path[i] { + return false + } + } + return true +} + +func pathStr(p []string) string { + if len(p) == 0 { + return "$" + } + return "$." + strings.Join(p, ".") +} + +func render(v any) string { + switch x := v.(type) { + case nil: + return "" + case string: + return strconv.Quote(x) + default: + return fmt.Sprintf("%v", x) + } +} diff --git a/test/parity/diff_test.go b/test/parity/diff_test.go new file mode 100644 index 0000000..e8fe0d8 --- /dev/null +++ b/test/parity/diff_test.go @@ -0,0 +1,157 @@ +package parity + +import ( + "encoding/json" + "strings" + "testing" +) + +func jsonAny(t *testing.T, s string) any { + t.Helper() + var v any + if err := json.Unmarshal([]byte(s), &v); err != nil { + t.Fatalf("unmarshal %q: %v", s, err) + } + return v +} + +func TestCompare_EqualScalar(t *testing.T) { + if d := Compare(jsonAny(t, `1`), jsonAny(t, `1`), nil); len(d) != 0 { + t.Errorf("expected no diff, got %v", d) + } +} + +func TestCompare_ScalarDiffers(t *testing.T) { + d := Compare(jsonAny(t, `1`), jsonAny(t, `2`), nil) + if len(d) != 1 || d[0].Kind != "value" { + t.Fatalf("expected one value diff, got %v", d) + } +} + +func TestCompare_TypeMismatch(t *testing.T) { + d := Compare(jsonAny(t, `1`), jsonAny(t, `"1"`), nil) + if len(d) != 1 || d[0].Kind != "type" { + t.Fatalf("expected type diff, got %v", d) + } +} + +func TestCompare_MissingAndExtraKeys(t *testing.T) { + exp := jsonAny(t, `{"a":1,"b":2}`) + act := jsonAny(t, `{"b":2,"c":3}`) + d := Compare(exp, act, nil) + kinds := map[string]int{} + for _, x := range d { + kinds[x.Kind]++ + } + if kinds["missing"] != 1 || kinds["extra"] != 1 { + t.Fatalf("want 1 missing + 1 extra, got %v (%v)", kinds, d) + } +} + +func TestCompare_IgnoreScalarPath(t *testing.T) { + exp := jsonAny(t, `{"uptime": 312, "fsid": "abc"}`) + act := jsonAny(t, `{"uptime": 87, "fsid": "abc"}`) + d := Compare(exp, act, []Ignore{{Path: "$.uptime", Reason: "live"}}) + if len(d) != 0 { + t.Fatalf("expected no diff after ignore, got %v", d) + } +} + +func TestCompare_IgnoreMissingKey(t *testing.T) { + exp := jsonAny(t, `{"a":1,"b":2}`) + act := jsonAny(t, `{"a":1}`) + d := Compare(exp, act, []Ignore{{Path: "$.b", Reason: "drop"}}) + if len(d) != 0 { + t.Fatalf("ignored missing key should not diff, got %v", d) + } +} + +func TestCompare_IgnoreSubtree(t *testing.T) { + exp := jsonAny(t, `{"health": {"status": "OK", "checks": {"x": {"severity": "low"}}}}`) + act := jsonAny(t, `{"health": {"status": "WARN", "checks": {"y": {"severity": "high"}}}}`) + d := Compare(exp, act, []Ignore{{Path: "$.health", Reason: "live"}}) + if len(d) != 0 { + t.Fatalf("subtree ignore should suppress all diffs, got %v", d) + } +} + +func TestCompare_WildcardArray(t *testing.T) { + exp := jsonAny(t, `{"mons": [{"name":"a","nonce":1},{"name":"b","nonce":2}]}`) + act := jsonAny(t, `{"mons": [{"name":"a","nonce":99},{"name":"b","nonce":100}]}`) + d := Compare(exp, act, []Ignore{{Path: "$.mons.*.nonce", Reason: "per-run"}}) + if len(d) != 0 { + t.Fatalf("wildcard ignore should suppress array-element field, got %v", d) + } +} + +func TestCompare_WildcardMap(t *testing.T) { + exp := jsonAny(t, `{"checks": {"foo": {"muted_until": 1}, "bar": {"muted_until": 2}}}`) + act := jsonAny(t, `{"checks": {"foo": {"muted_until": 9}, "bar": {"muted_until": 8}}}`) + d := Compare(exp, act, []Ignore{{Path: "$.checks.*.muted_until", Reason: "live"}}) + if len(d) != 0 { + t.Fatalf("wildcard map ignore should match any key, got %v", d) + } +} + +func TestCompare_ArrayLengthMismatch(t *testing.T) { + exp := jsonAny(t, `[1,2,3]`) + act := jsonAny(t, `[1,2]`) + d := Compare(exp, act, nil) + if len(d) != 1 || d[0].Kind != "length" { + t.Fatalf("expected one length diff, got %v", d) + } +} + +func TestCompare_NestedArrayDiff(t *testing.T) { + exp := jsonAny(t, `[{"v":1},{"v":2}]`) + act := jsonAny(t, `[{"v":1},{"v":3}]`) + d := Compare(exp, act, nil) + if len(d) != 1 || d[0].Path != "$.1.v" { + t.Fatalf("expected one diff at $.1.v, got %v", d) + } +} + +func TestCompare_DeepIgnorePath(t *testing.T) { + exp := jsonAny(t, `{"a": {"b": {"c": 1}}}`) + act := jsonAny(t, `{"a": {"b": {"c": 2}}}`) + d := Compare(exp, act, []Ignore{{Path: "$.a.b.c", Reason: "live"}}) + if len(d) != 0 { + t.Fatalf("deep ignore should match, got %v", d) + } +} + +func TestParsePath(t *testing.T) { + cases := []struct { + in string + want []string + err bool + }{ + {"$", nil, false}, + {"$.foo", []string{"foo"}, false}, + {"$.a.b.c", []string{"a", "b", "c"}, false}, + {"$.checks.*.muted_until", []string{"checks", "*", "muted_until"}, false}, + {"", nil, true}, + {"foo", nil, true}, + {"$foo", nil, true}, + {"$.foo..bar", nil, true}, + } + for _, tc := range cases { + got, err := parsePath(tc.in) + if (err != nil) != tc.err { + t.Errorf("parsePath(%q) err=%v want err=%v", tc.in, err, tc.err) + continue + } + if !tc.err && strings.Join(got, ".") != strings.Join(tc.want, ".") { + t.Errorf("parsePath(%q) = %v, want %v", tc.in, got, tc.want) + } + } +} + +func TestCompare_BadIgnorePathPanics(t *testing.T) { + defer func() { + if r := recover(); r == nil { + t.Fatal("expected panic on bad ignore path") + } + }() + Compare(1.0, 1.0, []Ignore{{Path: "bogus", Reason: "x"}}) +} diff --git a/test/parity/grpc.go b/test/parity/grpc.go new file mode 100644 index 0000000..c78d2a0 --- /dev/null +++ b/test/parity/grpc.go @@ -0,0 +1,66 @@ +package parity + +import ( + "fmt" + "sort" + "strings" + + "google.golang.org/protobuf/reflect/protoreflect" + "google.golang.org/protobuf/reflect/protoregistry" +) + +// AssertGRPCMethodsRouted returns nil if every gRPC method registered +// in protoregistry.GlobalFiles (excluding those in serviceFullNames +// matching any prefix in excludeServicePrefixes) has a matching +// selector in s. Otherwise reports each missing method and where to +// add it. +// +// The generated *.pb.go packages register their FileDescriptors on +// import; the test binary imports them via api/gen/grpc/go so +// GlobalFiles is populated by the time TestMain runs. +func AssertGRPCMethodsRouted(s *RouteSet, excludeServicePrefixes []string) error { + selectors := s.Selectors() + var missing []string + + protoregistry.GlobalFiles.RangeFiles(func(fd protoreflect.FileDescriptor) bool { + services := fd.Services() + for i := 0; i < services.Len(); i++ { + svc := services.Get(i) + fullSvc := string(svc.FullName()) + if matchesAnyPrefix(fullSvc, excludeServicePrefixes) { + continue + } + methods := svc.Methods() + for j := 0; j < methods.Len(); j++ { + m := methods.Get(j) + selector := fullSvc + "." + string(m.Name()) + if _, ok := selectors[selector]; !ok { + missing = append(missing, selector) + } + } + } + return true + }) + + if len(missing) == 0 { + return nil + } + sort.Strings(missing) + + var b strings.Builder + fmt.Fprintf(&b, "%d gRPC method(s) have no rule in api/http.yaml:\n", len(missing)) + for _, m := range missing { + fmt.Fprintf(&b, " - %s\n", m) + } + b.WriteString("add a `- selector: ` entry under http.rules in api/http.yaml with the HTTP method and path, then run `make proto`") + return fmt.Errorf("%s", b.String()) +} + +func matchesAnyPrefix(s string, prefixes []string) bool { + for _, p := range prefixes { + if strings.HasPrefix(s, p) { + return true + } + } + return false +} diff --git a/test/parity/inventory.go b/test/parity/inventory.go new file mode 100644 index 0000000..b6ed987 --- /dev/null +++ b/test/parity/inventory.go @@ -0,0 +1,270 @@ +package parity + +import ( + "fmt" + "os" + "regexp" + "sort" + "strings" + + "gopkg.in/yaml.v3" +) + +// Route is one HTTP entry from api/http.yaml — a gRPC method selector +// bound to an HTTP method + path template. +type Route struct { + Selector string // e.g. "ceph.Cluster.GetStatus" + Method string // "GET", "POST", "PUT", "DELETE", "PATCH" + Path string // "/api/role/{name}" +} + +// EndpointID returns the canonical key used across the parity +// framework: " " (e.g. "GET /api/role/{name}"). +func (r Route) EndpointID() string { + return strings.ToUpper(r.Method) + " " + r.Path +} + +// LoadDashboardRoutes parses an OpenAPI 3.0 spec (e.g. the Ceph +// dashboard's openapi.yaml at +// third_party/ceph/src/pybind/mgr/dashboard/openapi.yaml) and returns +// every (path, method) pair declared under .paths. Used to detect +// ceph-api routes that have no dashboard equivalent so the parity +// recorder can skip the dashboard side for them. +func LoadDashboardRoutes(path string) ([]Route, error) { + raw, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("read %s: %w", path, err) + } + var doc struct { + Paths map[string]map[string]any `yaml:"paths"` + } + if err := yaml.Unmarshal(raw, &doc); err != nil { + return nil, fmt.Errorf("parse %s: %w", path, err) + } + var routes []Route + for routePath, ops := range doc.Paths { + for method := range ops { + m := strings.ToUpper(method) + switch m { + case "GET", "PUT", "POST", "DELETE", "PATCH", "HEAD", "OPTIONS": + routes = append(routes, Route{Method: m, Path: routePath}) + default: + // "parameters", "summary", "x-*" etc. live under .paths. + // alongside method keys; skip them. + } + } + } + sort.Slice(routes, func(i, j int) bool { + if routes[i].Path != routes[j].Path { + return routes[i].Path < routes[j].Path + } + return routes[i].Method < routes[j].Method + }) + return routes, nil +} + +// LoadHTTPRoutes parses api/http.yaml and returns every gateway rule +// as a Route. http.yaml is the source of truth for both gRPC selector +// → HTTP method+path mapping and "what endpoints we expose." +func LoadHTTPRoutes(path string) ([]Route, error) { + raw, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("read %s: %w", path, err) + } + + // Match only the fields we care about; gateway accepts custom verbs + // but the current http.yaml only uses the standard HTTP methods. + var doc struct { + HTTP struct { + Rules []struct { + Selector string `yaml:"selector"` + Get string `yaml:"get"` + Put string `yaml:"put"` + Post string `yaml:"post"` + Delete string `yaml:"delete"` + Patch string `yaml:"patch"` + } `yaml:"rules"` + } `yaml:"http"` + } + if err := yaml.Unmarshal(raw, &doc); err != nil { + return nil, fmt.Errorf("parse %s: %w", path, err) + } + + var routes []Route + for i, rule := range doc.HTTP.Rules { + methodPath := map[string]string{ + "GET": rule.Get, + "PUT": rule.Put, + "POST": rule.Post, + "DELETE": rule.Delete, + "PATCH": rule.Patch, + } + var found int + for m, p := range methodPath { + if p == "" { + continue + } + found++ + routes = append(routes, Route{Selector: rule.Selector, Method: m, Path: p}) + } + if found == 0 { + return nil, fmt.Errorf("%s: rule #%d (%s) has no HTTP method", path, i, rule.Selector) + } + if found > 1 { + return nil, fmt.Errorf("%s: rule #%d (%s) declares %d HTTP methods; one per rule", path, i, rule.Selector, found) + } + } + + sort.Slice(routes, func(i, j int) bool { + if routes[i].Path != routes[j].Path { + return routes[i].Path < routes[j].Path + } + return routes[i].Method < routes[j].Method + }) + return routes, nil +} + +// RouteSet indexes routes by endpoint id for O(1) membership tests. +// It also keeps a "shape" index keyed by METHOD + normalized-path +// (every {placeholder} collapsed to {}), so two routes with +// different placeholder names but the same shape — e.g. ours +// /api/role/{name} vs dashboard /api/role/{role_name} — count as +// the same route. +type RouteSet struct { + byID map[string]Route + byShape map[string]Route +} + +func NewRouteSet(routes []Route) *RouteSet { + s := &RouteSet{ + byID: make(map[string]Route, len(routes)), + byShape: make(map[string]Route, len(routes)), + } + for _, r := range routes { + s.byID[r.EndpointID()] = r + shape := shapeID(r.Method, r.Path) + if prev, dup := s.byShape[shape]; dup { + panic(fmt.Sprintf( + "parity: two routes share path shape %q: %q and %q. Path placeholders are normalized to {} for cross-spec matching; rename one placeholder so the shapes differ, or split the routes.", + shape, prev.EndpointID(), r.EndpointID(), + )) + } + s.byShape[shape] = r + } + return s +} + +// placeholderRE matches "{anything}" segments in path templates. +var placeholderRE = regexp.MustCompile(`\{[^/}]+\}`) + +func shapeID(method, path string) string { + return strings.ToUpper(method) + " " + placeholderRE.ReplaceAllString(path, "{}") +} + +func (s *RouteSet) Has(endpointID string) bool { + _, ok := s.byID[endpointID] + return ok +} + +// HasShape returns true if this set contains a route with the same +// method and path-shape (placeholder names ignored) as the given +// endpoint id. Used to ask "does the dashboard have this route?" +// when ours and dashboard might name the path parameter differently. +func (s *RouteSet) HasShape(endpointID string) bool { + method, path, ok := strings.Cut(endpointID, " ") + if !ok { + return false + } + _, ok = s.byShape[shapeID(method, path)] + return ok +} + +func (s *RouteSet) Selectors() map[string]string { + out := make(map[string]string, len(s.byID)) + for _, r := range s.byID { + out[r.Selector] = r.EndpointID() + } + return out +} + +// Closest returns up to n entries from the set whose endpoint id +// shares the longest common prefix with target. Used in error +// messages when a Call's (Method, Path) is not in http.yaml — points +// the test author at the route they probably meant. +func (s *RouteSet) Closest(target string, n int) []string { + type scored struct { + id string + score int + } + scoredItems := make([]scored, 0, len(s.byID)) + for id := range s.byID { + scoredItems = append(scoredItems, scored{id: id, score: commonPrefixLen(id, target)}) + } + sort.Slice(scoredItems, func(i, j int) bool { + if scoredItems[i].score != scoredItems[j].score { + return scoredItems[i].score > scoredItems[j].score + } + return scoredItems[i].id < scoredItems[j].id + }) + n = min(n, len(scoredItems)) + out := make([]string, n) + for i := 0; i < n; i++ { + out[i] = scoredItems[i].id + } + return out +} + +func commonPrefixLen(a, b string) int { + n := min(len(a), len(b)) + for i := range n { + if a[i] != b[i] { + return i + } + } + return n +} + +// AssertRoutesCovered returns nil if every route in s (excluding +// those whose path matches any prefix in excludePathPrefixes) is +// present in covered. Otherwise it returns an error naming each +// missing endpoint and the parity-test file convention. +func AssertRoutesCovered(s *RouteSet, covered map[string]bool, excludePathPrefixes []string) error { + ids := make([]string, 0, len(s.byID)) + for id := range s.byID { + ids = append(ids, id) + } + sort.Strings(ids) + + var missing []string + for _, id := range ids { + if matchesExcluded(id, excludePathPrefixes) { + continue + } + if !covered[id] { + missing = append(missing, id) + } + } + if len(missing) == 0 { + return nil + } + var b strings.Builder + fmt.Fprintf(&b, "%d HTTP route(s) declared in api/http.yaml are not covered by any parity test:\n", len(missing)) + for _, e := range missing { + fmt.Fprintf(&b, " - %s\n", e) + } + b.WriteString("add a Test_<...>_Parity to the matching test/_parity_test.go that exercises the route via parity.Recorder.DoRecord") + return fmt.Errorf("%s", b.String()) +} + +func matchesExcluded(endpointID string, prefixes []string) bool { + _, path, ok := strings.Cut(endpointID, " ") + if !ok { + return false + } + for _, p := range prefixes { + if strings.HasPrefix(path, p) { + return true + } + } + return false +} diff --git a/test/parity/recorder.go b/test/parity/recorder.go new file mode 100644 index 0000000..4ae92bc --- /dev/null +++ b/test/parity/recorder.go @@ -0,0 +1,542 @@ +package parity + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "maps" + "net/http" + "net/url" + "path/filepath" + "runtime" + "sort" + "strings" + "sync" + "testing" +) + +// Backend identifies one side of the parity comparison. +type Backend int + +const ( + Dash Backend = iota + Ours +) + +// Backends is the canonical iteration order for tests: +// +// for _, b := range parity.Backends { r.DoRecord(b, call) } +// +// Dash runs before Ours so a CRUD flow that POST+DELETEs cleans up +// before the Ours pass starts. +var Backends = []Backend{Dash, Ours} + +func (b Backend) String() string { + switch b { + case Dash: + return "dashboard" + case Ours: + return "ceph-api" + default: + return fmt.Sprintf("Backend(%d)", b) + } +} + +// Call is the request shape every parity HTTP call takes. Path is the +// route template (e.g. "/api/role/{name}"), substituted at send time +// via PathParams; query string is built from QueryParams sorted by +// key for determinism. The Recorder asserts (Method, Path) matches a +// route declared in api/http.yaml. +type Call struct { + Method string + Path string + PathParams map[string]string + QueryParams map[string]string + Body any + Accept string + Headers http.Header // optional extra headers; recorder also sets Authorization + Content-Type +} + +// Package-level state, initialized once by Init. +var ( + state struct { + mu sync.RWMutex + ready bool + dash *Client + ours *Client + routes *RouteSet // routes from api/http.yaml (ours) + dashRts *RouteSet // routes from dashboard openapi.yaml + diff map[string][]Ignore + } + + coverageMu sync.Mutex + coverage = map[string]bool{} +) + +// Init wires the package's two backend clients and loads +// api/http.yaml + api_diff.yaml + the dashboard openapi.yaml. Call +// once from runSetup after the parity clients have logged in. +func Init(dash, ours *Client, httpYAMLPath, dashboardSwaggerPath, apiDiffPath string) error { + routes, err := LoadHTTPRoutes(httpYAMLPath) + if err != nil { + return fmt.Errorf("load http.yaml: %w", err) + } + dashRoutes, err := LoadDashboardRoutes(dashboardSwaggerPath) + if err != nil { + return fmt.Errorf("load dashboard openapi: %w", err) + } + diff, err := loadAPIDiff(apiDiffPath) + if err != nil { + return fmt.Errorf("load %s: %w", apiDiffPath, err) + } + state.mu.Lock() + defer state.mu.Unlock() + state.dash = dash + state.ours = ours + state.routes = NewRouteSet(routes) + state.dashRts = NewRouteSet(dashRoutes) + state.diff = diff + state.ready = true + return nil +} + +// DashboardHas returns true if the dashboard's openapi.yaml declares a +// route with the same method + path shape (placeholder names ignored). +// Used by Recorder.Backends to decide whether to fan a call out to +// both backends or only to ceph-api. +func DashboardHas(endpointID string) bool { + state.mu.RLock() + defer state.mu.RUnlock() + if !state.ready { + panic("parity: Init has not been called") + } + return state.dashRts.HasShape(endpointID) +} + +// Routes returns the package's loaded RouteSet (panics if Init has +// not been called). Used by the TestMain coverage gates. +func Routes() *RouteSet { + state.mu.RLock() + defer state.mu.RUnlock() + if !state.ready { + panic("parity: Init has not been called") + } + return state.routes +} + +// CoveredEndpoints returns a snapshot of every endpoint id that has +// been exercised on both backends by some parity test in this binary. +func CoveredEndpoints() map[string]bool { + coverageMu.Lock() + defer coverageMu.Unlock() + out := make(map[string]bool, len(coverage)) + maps.Copy(out, coverage) + return out +} + +func markCovered(endpoint string) { + coverageMu.Lock() + defer coverageMu.Unlock() + coverage[endpoint] = true +} + +type record struct { + canonical canonicalRequest + resp *http.Response + body []byte + file string + line int +} + +// canonicalRequest captures the bytes-equivalent of a request so the +// recorder can detect a DoRecord(Ours, ...) that disagrees with the +// matching DoRecord(Dash, ...). Authorization, Content-Length and +// other per-backend headers are deliberately not part of the +// canonical form. +type canonicalRequest struct { + method string + pathRaw string + body []byte + accept string + headers string // sorted "k: v\n..." excluding Authorization/Content-Length +} + +// Recorder is the per-test parity harness. Construct with New(t); +// the constructor registers t.Cleanup to run pairing + diff +// assertions over recorded calls when the test finishes. +type Recorder struct { + t testing.TB + mu sync.Mutex + records map[string]map[Backend]*record +} + +// New builds a Recorder bound to t, pulling clients and routes from +// the package state set by Init. Failures from cleanup assertions +// report against t via t.Errorf. +func New(t testing.TB) *Recorder { + t.Helper() + state.mu.RLock() + if !state.ready { + state.mu.RUnlock() + t.Fatalf("parity: Init has not been called; wire it from runSetup") + } + state.mu.RUnlock() + r := &Recorder{t: t, records: map[string]map[Backend]*record{}} + t.Cleanup(r.assertAll) + return r +} + +// Backends returns the list of backends a parity test should iterate +// over for the given call. Routes that exist in api/http.yaml but not +// in the dashboard's openapi (same method + same path shape) return +// just [Ours] — there's no dashboard counterpart to compare against, +// so we still exercise our side for coverage but don't try to call +// the dashboard. Routes that exist in both return the standard +// [Dash, Ours] pair. +// +// for _, b := range r.Backends(call) { r.DoRecord(b, call) } +func (r *Recorder) Backends(c Call) []Backend { + endpoint := strings.ToUpper(c.Method) + " " + c.Path + if DashboardHas(endpoint) { + return Backends + } + return []Backend{Ours} +} + +// Do sends call to backend b without recording it for comparison or +// coverage. Use for prep/cleanup calls (e.g. deleting leftover state). +func (r *Recorder) Do(b Backend, c Call) (*http.Response, []byte) { + r.t.Helper() + return r.send(b, c, false) +} + +// DoRecord sends call to backend b and records the response for +// cleanup-time comparison with the other backend's record for the +// same endpoint id. +func (r *Recorder) DoRecord(b Backend, c Call) (*http.Response, []byte) { + r.t.Helper() + return r.send(b, c, true) +} + +func (r *Recorder) send(b Backend, c Call, recordIt bool) (*http.Response, []byte) { + r.t.Helper() + + method := strings.ToUpper(strings.TrimSpace(c.Method)) + if method == "" { + r.t.Fatalf("parity: empty Method on Call %+v", c) + } + if strings.TrimSpace(c.Path) == "" { + r.t.Fatalf("parity: empty Path on Call %+v", c) + } + + endpoint := method + " " + c.Path + routes := Routes() + if !routes.Has(endpoint) { + nearby := routes.Closest(endpoint, 3) + r.t.Fatalf("parity: %q is not a route declared in api/http.yaml.\n"+ + "closest matches:\n - %s\n"+ + "fix the typo in Call.Method/Path, or add a rule to api/http.yaml + run `make proto`", + endpoint, strings.Join(nearby, "\n - ")) + } + + pathRaw, err := materialize(c.Path, c.PathParams, c.QueryParams) + if err != nil { + r.t.Fatalf("parity: %v", err) + } + bodyBytes, err := marshalBody(c.Body) + if err != nil { + r.t.Fatalf("parity: marshal body for %s %s: %v", method, c.Path, err) + } + + client := pickClient(b) + resp, respBody, err := client.Do(context.Background(), method, pathRaw, c.Accept, bytesReader(bodyBytes), c.Headers) + if err != nil { + r.t.Fatalf("parity: %s %s on %s: %v", method, pathRaw, b, err) + } + + if !recordIt { + return resp, respBody + } + + file, line := callerOutside() + canon := canonicalRequest{ + method: method, + pathRaw: pathRaw, + body: bodyBytes, + accept: c.Accept, + headers: canonicalHeaders(c.Headers), + } + rec := &record{canonical: canon, resp: resp, body: respBody, file: file, line: line} + + r.mu.Lock() + defer r.mu.Unlock() + + byBackend, ok := r.records[endpoint] + if !ok { + byBackend = map[Backend]*record{} + r.records[endpoint] = byBackend + } + if prev, dup := byBackend[b]; dup { + r.t.Fatalf("parity: endpoint %q recorded twice for %s in this test\n"+ + " first: %s:%d\n"+ + " second: %s:%d\n"+ + "split into two tests, or use r.Do (not r.DoRecord) for the prep/cleanup variant", + endpoint, b, prev.file, prev.line, file, line) + } + if other, ok := byBackend[otherBackend(b)]; ok { + if mismatch := canonicalDiff(other.canonical, canon); mismatch != "" { + r.t.Fatalf("parity: %s request for %q disagrees with the prior %s request (parity requires identical requests on both sides)\n"+ + " %s: %s:%d\n"+ + " %s: %s:%d\n"+ + " diff: %s", + b, endpoint, otherBackend(b), + otherBackend(b), other.file, other.line, + b, file, line, + mismatch) + } + } + byBackend[b] = rec + return resp, respBody +} + +func pickClient(b Backend) *Client { + state.mu.RLock() + defer state.mu.RUnlock() + switch b { + case Dash: + return state.dash + case Ours: + return state.ours + default: + panic(fmt.Sprintf("parity: unknown Backend %d", b)) + } +} + +func otherBackend(b Backend) Backend { + if b == Dash { + return Ours + } + return Dash +} + +// assertAll runs in t.Cleanup. For every endpoint with records from +// both backends, mark coverage and diff bodies; for every endpoint +// with only one side, fail with which side is missing. +func (r *Recorder) assertAll() { + r.t.Helper() + r.mu.Lock() + defer r.mu.Unlock() + + state.mu.RLock() + diff := state.diff + state.mu.RUnlock() + + endpoints := make([]string, 0, len(r.records)) + for k := range r.records { + endpoints = append(endpoints, k) + } + sort.Strings(endpoints) + + for _, endpoint := range endpoints { + byBackend := r.records[endpoint] + dashRec, hasDash := byBackend[Dash] + oursRec, hasOurs := byBackend[Ours] + + switch { + case !hasDash && !hasOurs: + continue + case !hasDash && !DashboardHas(endpoint): + // ceph-api-only route: dashboard's openapi.yaml has no + // counterpart, so r.Backends(call) returned [Ours] and the + // test only recorded ours. Mark covered, no diff. + markCovered(endpoint) + continue + case !hasDash: + r.t.Errorf("parity: %q recorded for ceph-api only but the dashboard declares this route (use `for _, b := range r.Backends(call)` to drive both sides)\n"+ + " ceph-api: %s:%d", endpoint, oursRec.file, oursRec.line) + continue + case !hasOurs: + r.t.Errorf("parity: %q recorded for dashboard only (need a matching DoRecord(parity.Ours, ...))\n"+ + " dashboard: %s:%d", endpoint, dashRec.file, dashRec.line) + continue + } + + markCovered(endpoint) + + // 415 means "Accept header is wrong"; fire the hint before + // the generic status-class branch swallows it. + if dashRec.resp.StatusCode == http.StatusUnsupportedMediaType { + r.t.Errorf("parity: %q dashboard returned 415 - set Call.Accept to the versioned media type from third_party/ceph/src/pybind/mgr/dashboard/openapi.yaml\n"+ + " body: %s", + endpoint, truncate(dashRec.body)) + continue + } + if dashRec.resp.StatusCode/100 != oursRec.resp.StatusCode/100 { + r.t.Errorf("parity: %q status class diverges (dash=%d ours=%d)\n"+ + " dash: %s:%d body: %s\n"+ + " ours: %s:%d body: %s", + endpoint, + dashRec.resp.StatusCode, oursRec.resp.StatusCode, + dashRec.file, dashRec.line, truncate(dashRec.body), + oursRec.file, oursRec.line, truncate(oursRec.body)) + continue + } + + // 204 No Content and similar empty responses are not a JSON + // parse error; treat both-empty as equal. + dashEmpty := len(bytes.TrimSpace(dashRec.body)) == 0 + oursEmpty := len(bytes.TrimSpace(oursRec.body)) == 0 + if dashEmpty && oursEmpty { + continue + } + if dashEmpty != oursEmpty { + r.t.Errorf("parity: %q body presence diverges (dash empty=%v ours empty=%v)\n"+ + " dash: %s:%d body: %s\n"+ + " ours: %s:%d body: %s", + endpoint, dashEmpty, oursEmpty, + dashRec.file, dashRec.line, truncate(dashRec.body), + oursRec.file, oursRec.line, truncate(oursRec.body)) + continue + } + + var dashJSON, oursJSON any + if err := json.Unmarshal(dashRec.body, &dashJSON); err != nil { + r.t.Errorf("parity: %q dashboard body not JSON: %v\n body: %s", + endpoint, err, truncate(dashRec.body)) + continue + } + if err := json.Unmarshal(oursRec.body, &oursJSON); err != nil { + r.t.Errorf("parity: %q ceph-api body not JSON: %v\n body: %s", + endpoint, err, truncate(oursRec.body)) + continue + } + + ignores := diff[endpoint] + if diffs := Compare(dashJSON, oursJSON, ignores); len(diffs) > 0 { + var b strings.Builder + fmt.Fprintf(&b, "parity: %q diverges (%d divergence(s), %d declared ignore(s))\n", + endpoint, len(diffs), len(ignores)) + fmt.Fprintf(&b, " call: %s:%d\n", oursRec.file, oursRec.line) + for _, d := range diffs { + fmt.Fprintf(&b, " - %s\n", d.String()) + } + r.t.Errorf("%s", b.String()) + } + } +} + +// materialize substitutes {placeholders} in route with values from +// pathParams, then appends queryParams sorted by key (so the raw +// request line is byte-identical between the dash and ours calls for +// the equality check). +func materialize(route string, pathParams, queryParams map[string]string) (string, error) { + out := route + for k, v := range pathParams { + needle := "{" + k + "}" + if !strings.Contains(out, needle) { + return "", fmt.Errorf("path_param %q has no {%s} placeholder in %s", k, k, route) + } + out = strings.ReplaceAll(out, needle, url.PathEscape(v)) + } + if i := strings.Index(out, "{"); i >= 0 { + return "", fmt.Errorf("unresolved placeholder in %s: %s", route, out[i:]) + } + if len(queryParams) > 0 { + keys := make([]string, 0, len(queryParams)) + for k := range queryParams { + keys = append(keys, k) + } + sort.Strings(keys) + vals := url.Values{} + for _, k := range keys { + vals.Set(k, queryParams[k]) + } + out += "?" + vals.Encode() + } + return out, nil +} + +func marshalBody(b any) ([]byte, error) { + if b == nil { + return nil, nil + } + if raw, ok := b.([]byte); ok { + return raw, nil + } + return json.Marshal(b) +} + +// bytesReader returns a true-nil io.Reader for empty bodies. A +// typed-nil *bytes.Reader wrapped in an io.Reader interface trips +// http.NewRequestWithContext. +func bytesReader(b []byte) io.Reader { + if len(b) == 0 { + return nil + } + return bytes.NewReader(b) +} + +// canonicalHeaders renders headers as a sorted "k: v\n" string, +// dropping per-backend headers the recorder sets itself. +func canonicalHeaders(h http.Header) string { + if len(h) == 0 { + return "" + } + keys := make([]string, 0, len(h)) + for k := range h { + if k == "Authorization" || k == "Content-Length" { + continue + } + keys = append(keys, k) + } + sort.Strings(keys) + var b strings.Builder + for _, k := range keys { + for _, v := range h.Values(k) { + fmt.Fprintf(&b, "%s: %s\n", k, v) + } + } + return b.String() +} + +func canonicalDiff(a, b canonicalRequest) string { + if a.method != b.method { + return fmt.Sprintf("method: %q vs %q", a.method, b.method) + } + if a.pathRaw != b.pathRaw { + return fmt.Sprintf("path: %q vs %q", a.pathRaw, b.pathRaw) + } + if a.accept != b.accept { + return fmt.Sprintf("accept: %q vs %q", a.accept, b.accept) + } + if a.headers != b.headers { + return fmt.Sprintf("headers:\n--- %s\n--- %s", a.headers, b.headers) + } + if !bytes.Equal(a.body, b.body) { + return fmt.Sprintf("body: %s vs %s", truncate(a.body), truncate(b.body)) + } + return "" +} + +func callerOutside() (string, int) { + for skip := 2; skip < 16; skip++ { + _, file, line, ok := runtime.Caller(skip) + if !ok { + return "?", 0 + } + if !strings.HasSuffix(filepath.Dir(file), "/test/parity") { + return file, line + } + } + return "?", 0 +} + +func truncate(b []byte) string { + const max = 512 + if len(b) <= max { + return string(b) + } + return string(b[:max]) + "..." +} diff --git a/test/setup_cgo_test.go b/test/setup_cgo_test.go index 5dd0d6d..6dbb13e 100644 --- a/test/setup_cgo_test.go +++ b/test/setup_cgo_test.go @@ -7,6 +7,7 @@ import ( "crypto/tls" "fmt" "net" + "net/http" "os" "strconv" "strings" @@ -16,6 +17,7 @@ import ( cephapi "github.com/clyso/ceph-api" "github.com/clyso/ceph-api/pkg/app" "github.com/clyso/ceph-api/pkg/config" + "github.com/clyso/ceph-api/test/parity" "github.com/clyso/ceph-api/test/testenv" "google.golang.org/grpc" "google.golang.org/grpc/backoff" @@ -32,11 +34,23 @@ var ( admConn *grpc.ClientConn cephEnv *testenv.CephEnv + + // Authenticated HTTP clients used by the dashboard-parity test. Both + // log in once at TestMain time via POST /api/auth and re-use the bearer + // token; parity tests assume auth works and do not re-verify it. + parityOurs *parity.Client + parityDash *parity.Client ) const ( admin = "ceph-e2e-test-admin" pass = "ceph-e2e-test-pass" + + // Paths relative to the test package directory (cwd when + // `go test ./test/...` runs inside the Docker container). + parityHTTPYAMLPath = "../api/http.yaml" + parityDashboardYAML = "../third_party/ceph/src/pybind/mgr/dashboard/openapi.yaml" + parityAPIDiffPath = "parity/api_diff.yaml" ) func runSetup(m *testing.M) (int, error) { @@ -121,7 +135,63 @@ func runSetup(m *testing.M) (int, error) { } admConn = c.Conn() + // Dashboard /api/auth requires the v1.0 versioned media type; ceph-api + // tolerates any Accept (gateway registered under MIMEWildcard) so we + // send the same header to both sides to keep requests cloned. + const loginAccept = "application/vnd.ceph.api.v1.0+json" + + parityOurs, err = parity.Login(tstCtx, httpAddr, &http.Client{}, loginAccept, admin, pass) + if err != nil { + return 1, fmt.Errorf("authenticate ceph-api parity client: %w", err) + } + + dashURL, dashUser, dashPass, err := cephEnv.Dashboard(tstCtx) + if err != nil { + return 1, fmt.Errorf("dashboard URL: %w", err) + } + dashHTTP := &http.Client{Transport: &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, //nolint:gosec // dashboard uses self-signed cert + }} + parityDash, err = parity.Login(tstCtx, dashURL, dashHTTP, loginAccept, dashUser, dashPass) + if err != nil { + return 1, fmt.Errorf("authenticate dashboard parity client: %w", err) + } + + if err := parity.Init(parityDash, parityOurs, parityHTTPYAMLPath, parityDashboardYAML, parityAPIDiffPath); err != nil { + return 1, fmt.Errorf("parity.Init: %w", err) + } + exitCode := m.Run() + + // Coverage gate 1: every gRPC method declared in proto descriptors + // must have a rule in api/http.yaml. Forces every new RPC to be + // HTTP-exposed. Standard infrastructure services (gRPC reflection, + // gRPC health checking, OTLP collector) are not part of the + // ceph-api surface and are excluded by service-prefix. + if err := parity.AssertGRPCMethodsRouted(parity.Routes(), []string{ + "grpc.", "opentelemetry.", + }); err != nil { + fmt.Fprintln(os.Stderr, err) + if exitCode == 0 { + exitCode = 1 + } + } + + // Coverage gate 2: every HTTP route in api/http.yaml must have been + // exercised on some parity test. /api/auth* is excluded - the + // bootstrap login above already covers it and parity clients + // can't dogfood their own auth flow. + if err := parity.AssertRoutesCovered( + parity.Routes(), + parity.CoveredEndpoints(), + []string{"/api/auth"}, + ); err != nil { + fmt.Fprintln(os.Stderr, err) + if exitCode == 0 { + exitCode = 1 + } + } + cancel() grpcConn.Close() c.Close() diff --git a/test/setup_nocgo_test.go b/test/setup_nocgo_test.go index aa7f53a..7f4f6d3 100644 --- a/test/setup_nocgo_test.go +++ b/test/setup_nocgo_test.go @@ -3,10 +3,12 @@ package test import ( - "errors" + "fmt" + "os" "testing" ) -func runSetup(_ *testing.M) (int, error) { - return 1, errors.New("CGo required to run e2e tests directly; use `go test ./test/... -tid` to run them inside a Docker container with ceph dev libs") +func runSetup(m *testing.M) (int, error) { + fmt.Fprintln(os.Stderr, "test: e2e tests skipped (cgo disabled); use `make e2e-test` or `go test ./test/ -tid` to run them in Docker with ceph dev libs") + return m.Run(), nil } diff --git a/test/status_parity_test.go b/test/status_parity_test.go new file mode 100644 index 0000000..964e7d2 --- /dev/null +++ b/test/status_parity_test.go @@ -0,0 +1,46 @@ +//go:build cgo + +package test + +import ( + "testing" + + "github.com/clyso/ceph-api/test/parity" +) + +// /api/status/* has no dashboard counterpart - the dashboard exposes +// /api/health/* and /api/monitor instead. r.Backends(call) returns +// [Ours] only for these, so the parity recorder exercises ceph-api +// for coverage but doesn't try to hit the dashboard. + +func Test_Parity_Status_Ceph(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/status/ceph"} + for _, b := range r.Backends(call) { + r.DoRecord(b, call) + } +} + +func Test_Parity_Status_MonDump(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/status/mon_dump"} + for _, b := range r.Backends(call) { + r.DoRecord(b, call) + } +} + +func Test_Parity_Status_OsdDump(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/status/osd_dump"} + for _, b := range r.Backends(call) { + r.DoRecord(b, call) + } +} + +func Test_Parity_Status_Report(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/status/report"} + for _, b := range r.Backends(call) { + r.DoRecord(b, call) + } +} diff --git a/test/users_parity_test.go b/test/users_parity_test.go new file mode 100644 index 0000000..7d702c7 --- /dev/null +++ b/test/users_parity_test.go @@ -0,0 +1,149 @@ +//go:build cgo + +package test + +import ( + "net/http" + "testing" + + "github.com/clyso/ceph-api/test/parity" + "github.com/stretchr/testify/require" +) + +const userAccept = "application/vnd.ceph.api.v1.0+json" +const roleAccept = "application/vnd.ceph.api.v1.0+json" + +func Test_Parity_User_List(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/user", Accept: userAccept} + for _, b := range r.Backends(call) { + r.DoRecord(b, call) + } +} + +func Test_Parity_User_Get(t *testing.T) { + r := parity.New(t) + get := parity.Call{ + Method: "GET", Path: "/api/user/{username}", + PathParams: map[string]string{"username": admin}, Accept: userAccept, + } + for _, b := range r.Backends(get) { + r.DoRecord(b, get) + } +} + +func Test_Parity_User_CRUD(t *testing.T) { + r := parity.New(t) + + const username = "parity-user-crud" + createBody := map[string]any{ + "username": username, + "password": "parity-user-crud-pass", + "name": "parity user crud", + "email": "", + "roles": []string{"administrator"}, + "enabled": true, + "pwd_expiration_date": nil, + "pwd_update_required": false, + } + updateBody := map[string]any{ + "name": "parity user crud updated", + "email": "parity@example.com", + "enabled": true, + } + changePassBody := map[string]any{ + "old_password": "parity-user-crud-pass", + "new_password": "parity-user-crud-pass-2", + } + pp := map[string]string{"username": username} + + create := parity.Call{Method: "POST", Path: "/api/user", Body: createBody, Accept: userAccept} + update := parity.Call{Method: "PUT", Path: "/api/user/{username}", PathParams: pp, Body: updateBody, Accept: userAccept} + changePass := parity.Call{ + Method: "POST", Path: "/api/user/{username}/change_password", + PathParams: pp, Body: changePassBody, Accept: userAccept, + } + del := parity.Call{Method: "DELETE", Path: "/api/user/{username}", PathParams: pp, Accept: userAccept} + + r.Do(parity.Ours, del) + t.Cleanup(func() { r.Do(parity.Ours, del) }) + + for _, b := range r.Backends(create) { + resp, _ := r.DoRecord(b, create) + require.True(t, resp.StatusCode/100 == 2 || resp.StatusCode == http.StatusConflict, + "%s: create user: status %d", b, resp.StatusCode) + r.DoRecord(b, update) + r.DoRecord(b, changePass) + resp, _ = r.DoRecord(b, del) + require.True(t, resp.StatusCode/100 == 2, + "%s: delete user: status %d", b, resp.StatusCode) + } +} + +func Test_Parity_Role_List(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/role", Accept: roleAccept} + for _, b := range r.Backends(call) { + r.DoRecord(b, call) + } +} + +func Test_Parity_Role_Get(t *testing.T) { + r := parity.New(t) + get := parity.Call{ + Method: "GET", Path: "/api/role/{name}", + PathParams: map[string]string{"name": "administrator"}, + Accept: roleAccept, + } + for _, b := range r.Backends(get) { + r.DoRecord(b, get) + } +} + +func Test_Parity_Role_CRUD(t *testing.T) { + r := parity.New(t) + + const name = "parity-role" + const cloneName = name + "-clone" + createBody := map[string]any{ + "name": name, + "description": "parity test role", + "scopes_permissions": map[string][]string{"hosts": {"read"}}, + } + updateBody := map[string]any{ + "description": "parity test role updated", + "scopes_permissions": map[string][]string{"hosts": {"read", "create"}}, + } + rolePP := map[string]string{"name": name} + clonePP := map[string]string{"name": cloneName} + + create := parity.Call{Method: "POST", Path: "/api/role", Body: createBody, Accept: roleAccept} + update := parity.Call{Method: "PUT", Path: "/api/role/{name}", PathParams: rolePP, Body: updateBody, Accept: roleAccept} + clone := parity.Call{ + Method: "GET", Path: "/api/user/{name}/clone", + PathParams: rolePP, + QueryParams: map[string]string{"new_name": cloneName}, + Accept: roleAccept, + } + delRole := parity.Call{Method: "DELETE", Path: "/api/role/{name}", PathParams: rolePP, Accept: roleAccept} + delClone := parity.Call{Method: "DELETE", Path: "/api/role/{name}", PathParams: clonePP, Accept: roleAccept} + + r.Do(parity.Ours, delClone) + r.Do(parity.Ours, delRole) + t.Cleanup(func() { + r.Do(parity.Ours, delClone) + r.Do(parity.Ours, delRole) + }) + + for _, b := range r.Backends(create) { + resp, _ := r.DoRecord(b, create) + require.True(t, resp.StatusCode/100 == 2 || resp.StatusCode == http.StatusConflict, + "%s: create role: status %d", b, resp.StatusCode) + r.DoRecord(b, update) + r.DoRecord(b, clone) + r.Do(b, delClone) + resp, _ = r.DoRecord(b, delRole) + require.True(t, resp.StatusCode/100 == 2, + "%s: delete role: status %d", b, resp.StatusCode) + } +} From 85a2391c6129736f63889d3147bce348cf78dbe9 Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Fri, 22 May 2026 16:51:49 +0200 Subject: [PATCH 05/10] fix dashboard parity Signed-off-by: Artem Torubarov --- CLAUDE.md | 18 + api/cluster.proto | 17 +- api/gen/grpc/go/cluster.pb.go | 226 +- api/gen/grpc/go/status.pb.gw.go | 60 + api/gen/grpc/go/users.pb.go | 13 +- api/http.yaml | 3 + api/openapi/ceph-api.swagger.json | 3665 +++++++++++++++++++++-------- api/users.proto | 1 + pkg/api/cluster_api_handlers.go | 18 +- pkg/api/users_api_handlers.go | 1 + pkg/user/system_roles.go | 18 + test/cluster_api_test.go | 12 +- test/cluster_parity_test.go | 31 +- test/crush_rule_parity_test.go | 15 +- test/parity/api_diff.yaml | 140 +- test/parity/recorder.go | 56 +- test/status_parity_test.go | 8 + test/users_parity_test.go | 80 +- 18 files changed, 3271 insertions(+), 1111 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index ceaaa29..92532e1 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -93,3 +93,21 @@ For cross-release diffs, `make ceph-ref-versions` fetches `v18.2.7` and `v20.0.0 - **No DB.** All persistent state (users, OAuth clients, tokens) lives in Ceph via rados commands or the config-key store (`pkg/cephconfig/`). - **Mock mode is offline-dev convenience, not contract.** `CGO_ENABLED=0` builds make `make check` runnable without ceph libs, but the mock JSON in `pkg/rados/mock-data/` is hand-curated and routinely lags real Ceph. Wire-format bugs are caught by `make e2e-test` against a real cluster, not by `make check`. New endpoint work must be validated against `make e2e-test`. Updating `mock-data/` for new endpoints is **not** required. - **Tests live in two places.** Unit tests next to the code they test (`pkg/**/*_test.go`). E2E tests in `test/`. Test harness in `test/testenv/`. Anything in `test/` runs against a real Ceph started by `testenv.NewCephEnv` — no mocks. + +## Comments + +Default to **zero comments**. Only keep one when removing it would leave a future reader unable to derive a non-obvious invariant, workaround, or external constraint. Before finishing any edit, re-scan every comment added; if you can't justify it under one of the three tests below, delete it. + +**Banned:** +- History narration (`legacy`, `previously`, `used to`, `now uses`, `added for X`). +- Internal task/session references (`tracked as #123`, `see TASKS.md 2.1`, `Phase 2.3 summary`). +- Foreign-project name-drops (`from cesto`, `matches chorus pattern`). +- Restating well-named code or paraphrasing identifiers. +- Doc comments that just restate the function signature. + +**Keep if any of:** +1. The WHY is non-obvious from reading the surrounding code. +2. A future agent or human couldn't re-derive it without the comment. +3. It describes an external constraint — library contract, protocol quirk, framework artifact, regulatory requirement. + +Examples that pass: `// fosite sets session.Subject via SetSubject after Authenticate`, `// grpc-gateway emits {} for Empty proto responses`, `//nolint:gosec // self-signed cert on localhost-only listener`. diff --git a/api/cluster.proto b/api/cluster.proto index e66082a..f741ca6 100644 --- a/api/cluster.proto +++ b/api/cluster.proto @@ -43,17 +43,20 @@ message ClusterUser { string key = 3; } +message ClusterUserCap { + // capability scope entity, e.g: "mon", "osd" + string entity = 1; + // capability value, e.g: "allow r", "allow rw pool=liverpool" + string cap = 2; +} + message UpdateClusterUserReq{ - // user capabilities, e.g: {"mon": "allow r","osd":"allow rw pool=liverpool"} - map capabilities = 1; - // entity, e.g: "client.admin" + repeated ClusterUserCap capabilities = 1; string user_entity = 2 [json_name = "user_entity"]; } message CreateClusterUserReq{ - // user capabilities, e.g: {"mon": "allow r","osd":"allow rw pool=liverpool"} - map capabilities = 1; - // entity, e.g: "client.admin" + repeated ClusterUserCap capabilities = 1; string user_entity = 2 [json_name = "user_entity"]; // keyring file format - if import_data is set then other fields ignored bytes import_data = 3 [json_name = "import_data"]; @@ -69,7 +72,7 @@ message DeleteClusterUserReq{ message ExportClusterUserResp{ // User key and capabilities in Ceph config file format - bytes data = 1; + string data = 1; } // Config Param Search diff --git a/api/gen/grpc/go/cluster.pb.go b/api/gen/grpc/go/cluster.pb.go index 6206693..ff4814d 100644 --- a/api/gen/grpc/go/cluster.pb.go +++ b/api/gen/grpc/go/cluster.pb.go @@ -114,7 +114,7 @@ func (x SearchConfigRequest_SortField) Number() protoreflect.EnumNumber { // Deprecated: Use SearchConfigRequest_SortField.Descriptor instead. func (SearchConfigRequest_SortField) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{8, 0} + return file_cluster_proto_rawDescGZIP(), []int{9, 0} } type SearchConfigRequest_SortOrder int32 @@ -160,7 +160,7 @@ func (x SearchConfigRequest_SortOrder) Number() protoreflect.EnumNumber { // Deprecated: Use SearchConfigRequest_SortOrder.Descriptor instead. func (SearchConfigRequest_SortOrder) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{8, 1} + return file_cluster_proto_rawDescGZIP(), []int{9, 1} } type ConfigParam_ServiceType int32 @@ -236,7 +236,7 @@ func (x ConfigParam_ServiceType) Number() protoreflect.EnumNumber { // Deprecated: Use ConfigParam_ServiceType.Descriptor instead. func (ConfigParam_ServiceType) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{9, 0} + return file_cluster_proto_rawDescGZIP(), []int{10, 0} } type ConfigParam_ConfigLevel int32 @@ -285,7 +285,7 @@ func (x ConfigParam_ConfigLevel) Number() protoreflect.EnumNumber { // Deprecated: Use ConfigParam_ConfigLevel.Descriptor instead. func (ConfigParam_ConfigLevel) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{9, 1} + return file_cluster_proto_rawDescGZIP(), []int{10, 1} } type ConfigParam_ParamType int32 @@ -358,7 +358,7 @@ func (x ConfigParam_ParamType) Number() protoreflect.EnumNumber { // Deprecated: Use ConfigParam_ParamType.Descriptor instead. func (ConfigParam_ParamType) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{9, 2} + return file_cluster_proto_rawDescGZIP(), []int{10, 2} } type ClusterStatus struct { @@ -512,19 +512,71 @@ func (x *ClusterUser) GetKey() string { return "" } -type UpdateClusterUserReq struct { +type ClusterUserCap struct { state protoimpl.MessageState `protogen:"open.v1"` - // user capabilities, e.g: {"mon": "allow r","osd":"allow rw pool=liverpool"} - Capabilities map[string]string `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - // entity, e.g: "client.admin" - UserEntity string `protobuf:"bytes,2,opt,name=user_entity,proto3" json:"user_entity,omitempty"` + // capability scope entity, e.g: "mon", "osd" + Entity string `protobuf:"bytes,1,opt,name=entity,proto3" json:"entity,omitempty"` + // capability value, e.g: "allow r", "allow rw pool=liverpool" + Cap string `protobuf:"bytes,2,opt,name=cap,proto3" json:"cap,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ClusterUserCap) Reset() { + *x = ClusterUserCap{} + mi := &file_cluster_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ClusterUserCap) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterUserCap) ProtoMessage() {} + +func (x *ClusterUserCap) ProtoReflect() protoreflect.Message { + mi := &file_cluster_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterUserCap.ProtoReflect.Descriptor instead. +func (*ClusterUserCap) Descriptor() ([]byte, []int) { + return file_cluster_proto_rawDescGZIP(), []int{3} +} + +func (x *ClusterUserCap) GetEntity() string { + if x != nil { + return x.Entity + } + return "" +} + +func (x *ClusterUserCap) GetCap() string { + if x != nil { + return x.Cap + } + return "" +} + +type UpdateClusterUserReq struct { + state protoimpl.MessageState `protogen:"open.v1"` + Capabilities []*ClusterUserCap `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty"` + UserEntity string `protobuf:"bytes,2,opt,name=user_entity,proto3" json:"user_entity,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *UpdateClusterUserReq) Reset() { *x = UpdateClusterUserReq{} - mi := &file_cluster_proto_msgTypes[3] + mi := &file_cluster_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -536,7 +588,7 @@ func (x *UpdateClusterUserReq) String() string { func (*UpdateClusterUserReq) ProtoMessage() {} func (x *UpdateClusterUserReq) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[3] + mi := &file_cluster_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -549,10 +601,10 @@ func (x *UpdateClusterUserReq) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateClusterUserReq.ProtoReflect.Descriptor instead. func (*UpdateClusterUserReq) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{3} + return file_cluster_proto_rawDescGZIP(), []int{4} } -func (x *UpdateClusterUserReq) GetCapabilities() map[string]string { +func (x *UpdateClusterUserReq) GetCapabilities() []*ClusterUserCap { if x != nil { return x.Capabilities } @@ -567,11 +619,9 @@ func (x *UpdateClusterUserReq) GetUserEntity() string { } type CreateClusterUserReq struct { - state protoimpl.MessageState `protogen:"open.v1"` - // user capabilities, e.g: {"mon": "allow r","osd":"allow rw pool=liverpool"} - Capabilities map[string]string `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` - // entity, e.g: "client.admin" - UserEntity string `protobuf:"bytes,2,opt,name=user_entity,proto3" json:"user_entity,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Capabilities []*ClusterUserCap `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty"` + UserEntity string `protobuf:"bytes,2,opt,name=user_entity,proto3" json:"user_entity,omitempty"` // keyring file format - if import_data is set then other fields ignored ImportData []byte `protobuf:"bytes,3,opt,name=import_data,proto3" json:"import_data,omitempty"` unknownFields protoimpl.UnknownFields @@ -580,7 +630,7 @@ type CreateClusterUserReq struct { func (x *CreateClusterUserReq) Reset() { *x = CreateClusterUserReq{} - mi := &file_cluster_proto_msgTypes[4] + mi := &file_cluster_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -592,7 +642,7 @@ func (x *CreateClusterUserReq) String() string { func (*CreateClusterUserReq) ProtoMessage() {} func (x *CreateClusterUserReq) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[4] + mi := &file_cluster_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -605,10 +655,10 @@ func (x *CreateClusterUserReq) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateClusterUserReq.ProtoReflect.Descriptor instead. func (*CreateClusterUserReq) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{4} + return file_cluster_proto_rawDescGZIP(), []int{5} } -func (x *CreateClusterUserReq) GetCapabilities() map[string]string { +func (x *CreateClusterUserReq) GetCapabilities() []*ClusterUserCap { if x != nil { return x.Capabilities } @@ -638,7 +688,7 @@ type ExportClusterUserReq struct { func (x *ExportClusterUserReq) Reset() { *x = ExportClusterUserReq{} - mi := &file_cluster_proto_msgTypes[5] + mi := &file_cluster_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -650,7 +700,7 @@ func (x *ExportClusterUserReq) String() string { func (*ExportClusterUserReq) ProtoMessage() {} func (x *ExportClusterUserReq) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[5] + mi := &file_cluster_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -663,7 +713,7 @@ func (x *ExportClusterUserReq) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportClusterUserReq.ProtoReflect.Descriptor instead. func (*ExportClusterUserReq) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{5} + return file_cluster_proto_rawDescGZIP(), []int{6} } func (x *ExportClusterUserReq) GetEntities() []string { @@ -682,7 +732,7 @@ type DeleteClusterUserReq struct { func (x *DeleteClusterUserReq) Reset() { *x = DeleteClusterUserReq{} - mi := &file_cluster_proto_msgTypes[6] + mi := &file_cluster_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -694,7 +744,7 @@ func (x *DeleteClusterUserReq) String() string { func (*DeleteClusterUserReq) ProtoMessage() {} func (x *DeleteClusterUserReq) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[6] + mi := &file_cluster_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -707,7 +757,7 @@ func (x *DeleteClusterUserReq) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteClusterUserReq.ProtoReflect.Descriptor instead. func (*DeleteClusterUserReq) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{6} + return file_cluster_proto_rawDescGZIP(), []int{7} } func (x *DeleteClusterUserReq) GetUserEntity() string { @@ -720,14 +770,14 @@ func (x *DeleteClusterUserReq) GetUserEntity() string { type ExportClusterUserResp struct { state protoimpl.MessageState `protogen:"open.v1"` // User key and capabilities in Ceph config file format - Data []byte `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` + Data string `protobuf:"bytes,1,opt,name=data,proto3" json:"data,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *ExportClusterUserResp) Reset() { *x = ExportClusterUserResp{} - mi := &file_cluster_proto_msgTypes[7] + mi := &file_cluster_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -739,7 +789,7 @@ func (x *ExportClusterUserResp) String() string { func (*ExportClusterUserResp) ProtoMessage() {} func (x *ExportClusterUserResp) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[7] + mi := &file_cluster_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -752,14 +802,14 @@ func (x *ExportClusterUserResp) ProtoReflect() protoreflect.Message { // Deprecated: Use ExportClusterUserResp.ProtoReflect.Descriptor instead. func (*ExportClusterUserResp) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{7} + return file_cluster_proto_rawDescGZIP(), []int{8} } -func (x *ExportClusterUserResp) GetData() []byte { +func (x *ExportClusterUserResp) GetData() string { if x != nil { return x.Data } - return nil + return "" } // Config Param Search @@ -778,7 +828,7 @@ type SearchConfigRequest struct { func (x *SearchConfigRequest) Reset() { *x = SearchConfigRequest{} - mi := &file_cluster_proto_msgTypes[8] + mi := &file_cluster_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -790,7 +840,7 @@ func (x *SearchConfigRequest) String() string { func (*SearchConfigRequest) ProtoMessage() {} func (x *SearchConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[8] + mi := &file_cluster_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -803,7 +853,7 @@ func (x *SearchConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchConfigRequest.ProtoReflect.Descriptor instead. func (*SearchConfigRequest) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{8} + return file_cluster_proto_rawDescGZIP(), []int{9} } func (x *SearchConfigRequest) GetService() ConfigParam_ServiceType { @@ -878,7 +928,7 @@ type ConfigParam struct { func (x *ConfigParam) Reset() { *x = ConfigParam{} - mi := &file_cluster_proto_msgTypes[9] + mi := &file_cluster_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -890,7 +940,7 @@ func (x *ConfigParam) String() string { func (*ConfigParam) ProtoMessage() {} func (x *ConfigParam) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[9] + mi := &file_cluster_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -903,7 +953,7 @@ func (x *ConfigParam) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigParam.ProtoReflect.Descriptor instead. func (*ConfigParam) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{9} + return file_cluster_proto_rawDescGZIP(), []int{10} } func (x *ConfigParam) GetName() string { @@ -1020,7 +1070,7 @@ type SearchConfigResponse struct { func (x *SearchConfigResponse) Reset() { *x = SearchConfigResponse{} - mi := &file_cluster_proto_msgTypes[10] + mi := &file_cluster_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1032,7 +1082,7 @@ func (x *SearchConfigResponse) String() string { func (*SearchConfigResponse) ProtoMessage() {} func (x *SearchConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[10] + mi := &file_cluster_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1045,7 +1095,7 @@ func (x *SearchConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchConfigResponse.ProtoReflect.Descriptor instead. func (*SearchConfigResponse) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{10} + return file_cluster_proto_rawDescGZIP(), []int{11} } func (x *SearchConfigResponse) GetParams() []*ConfigParam { @@ -1073,26 +1123,23 @@ const file_cluster_proto_rawDesc = "" + "\x03key\x18\x03 \x01(\tR\x03key\x1a7\n" + "\tCapsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xcb\x01\n" + - "\x14UpdateClusterUserReq\x12P\n" + - "\fcapabilities\x18\x01 \x03(\v2,.ceph.UpdateClusterUserReq.CapabilitiesEntryR\fcapabilities\x12 \n" + - "\vuser_entity\x18\x02 \x01(\tR\vuser_entity\x1a?\n" + - "\x11CapabilitiesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xed\x01\n" + - "\x14CreateClusterUserReq\x12P\n" + - "\fcapabilities\x18\x01 \x03(\v2,.ceph.CreateClusterUserReq.CapabilitiesEntryR\fcapabilities\x12 \n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\":\n" + + "\x0eClusterUserCap\x12\x16\n" + + "\x06entity\x18\x01 \x01(\tR\x06entity\x12\x10\n" + + "\x03cap\x18\x02 \x01(\tR\x03cap\"r\n" + + "\x14UpdateClusterUserReq\x128\n" + + "\fcapabilities\x18\x01 \x03(\v2\x14.ceph.ClusterUserCapR\fcapabilities\x12 \n" + + "\vuser_entity\x18\x02 \x01(\tR\vuser_entity\"\x94\x01\n" + + "\x14CreateClusterUserReq\x128\n" + + "\fcapabilities\x18\x01 \x03(\v2\x14.ceph.ClusterUserCapR\fcapabilities\x12 \n" + "\vuser_entity\x18\x02 \x01(\tR\vuser_entity\x12 \n" + - "\vimport_data\x18\x03 \x01(\fR\vimport_data\x1a?\n" + - "\x11CapabilitiesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"2\n" + + "\vimport_data\x18\x03 \x01(\fR\vimport_data\"2\n" + "\x14ExportClusterUserReq\x12\x1a\n" + "\bentities\x18\x01 \x03(\tR\bentities\"8\n" + "\x14DeleteClusterUserReq\x12 \n" + "\vuser_entity\x18\x01 \x01(\tR\vuser_entity\"+\n" + "\x15ExportClusterUserResp\x12\x12\n" + - "\x04data\x18\x01 \x01(\fR\x04data\"\x91\x04\n" + + "\x04data\x18\x01 \x01(\tR\x04data\"\x91\x04\n" + "\x13SearchConfigRequest\x12<\n" + "\aservice\x18\x01 \x01(\x0e2\x1d.ceph.ConfigParam.ServiceTypeH\x00R\aservice\x88\x01\x01\x12\x17\n" + "\x04name\x18\x02 \x01(\tH\x01R\x04name\x88\x01\x01\x12 \n" + @@ -1200,7 +1247,7 @@ func file_cluster_proto_rawDescGZIP() []byte { } var file_cluster_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_cluster_proto_goTypes = []any{ (ClusterStatus_Status)(0), // 0: ceph.ClusterStatus.Status (SearchConfigRequest_SortField)(0), // 1: ceph.SearchConfigRequest.SortField @@ -1211,25 +1258,24 @@ var file_cluster_proto_goTypes = []any{ (*ClusterStatus)(nil), // 6: ceph.ClusterStatus (*ClusterUsers)(nil), // 7: ceph.ClusterUsers (*ClusterUser)(nil), // 8: ceph.ClusterUser - (*UpdateClusterUserReq)(nil), // 9: ceph.UpdateClusterUserReq - (*CreateClusterUserReq)(nil), // 10: ceph.CreateClusterUserReq - (*ExportClusterUserReq)(nil), // 11: ceph.ExportClusterUserReq - (*DeleteClusterUserReq)(nil), // 12: ceph.DeleteClusterUserReq - (*ExportClusterUserResp)(nil), // 13: ceph.ExportClusterUserResp - (*SearchConfigRequest)(nil), // 14: ceph.SearchConfigRequest - (*ConfigParam)(nil), // 15: ceph.ConfigParam - (*SearchConfigResponse)(nil), // 16: ceph.SearchConfigResponse - nil, // 17: ceph.ClusterUser.CapsEntry - nil, // 18: ceph.UpdateClusterUserReq.CapabilitiesEntry - nil, // 19: ceph.CreateClusterUserReq.CapabilitiesEntry - (*emptypb.Empty)(nil), // 20: google.protobuf.Empty + (*ClusterUserCap)(nil), // 9: ceph.ClusterUserCap + (*UpdateClusterUserReq)(nil), // 10: ceph.UpdateClusterUserReq + (*CreateClusterUserReq)(nil), // 11: ceph.CreateClusterUserReq + (*ExportClusterUserReq)(nil), // 12: ceph.ExportClusterUserReq + (*DeleteClusterUserReq)(nil), // 13: ceph.DeleteClusterUserReq + (*ExportClusterUserResp)(nil), // 14: ceph.ExportClusterUserResp + (*SearchConfigRequest)(nil), // 15: ceph.SearchConfigRequest + (*ConfigParam)(nil), // 16: ceph.ConfigParam + (*SearchConfigResponse)(nil), // 17: ceph.SearchConfigResponse + nil, // 18: ceph.ClusterUser.CapsEntry + (*emptypb.Empty)(nil), // 19: google.protobuf.Empty } var file_cluster_proto_depIdxs = []int32{ 0, // 0: ceph.ClusterStatus.status:type_name -> ceph.ClusterStatus.Status 8, // 1: ceph.ClusterUsers.users:type_name -> ceph.ClusterUser - 17, // 2: ceph.ClusterUser.caps:type_name -> ceph.ClusterUser.CapsEntry - 18, // 3: ceph.UpdateClusterUserReq.capabilities:type_name -> ceph.UpdateClusterUserReq.CapabilitiesEntry - 19, // 4: ceph.CreateClusterUserReq.capabilities:type_name -> ceph.CreateClusterUserReq.CapabilitiesEntry + 18, // 2: ceph.ClusterUser.caps:type_name -> ceph.ClusterUser.CapsEntry + 9, // 3: ceph.UpdateClusterUserReq.capabilities:type_name -> ceph.ClusterUserCap + 9, // 4: ceph.CreateClusterUserReq.capabilities:type_name -> ceph.ClusterUserCap 3, // 5: ceph.SearchConfigRequest.service:type_name -> ceph.ConfigParam.ServiceType 4, // 6: ceph.SearchConfigRequest.level:type_name -> ceph.ConfigParam.ConfigLevel 1, // 7: ceph.SearchConfigRequest.sort:type_name -> ceph.SearchConfigRequest.SortField @@ -1238,23 +1284,23 @@ var file_cluster_proto_depIdxs = []int32{ 5, // 10: ceph.ConfigParam.type:type_name -> ceph.ConfigParam.ParamType 4, // 11: ceph.ConfigParam.level:type_name -> ceph.ConfigParam.ConfigLevel 3, // 12: ceph.ConfigParam.services:type_name -> ceph.ConfigParam.ServiceType - 15, // 13: ceph.SearchConfigResponse.params:type_name -> ceph.ConfigParam - 20, // 14: ceph.Cluster.GetStatus:input_type -> google.protobuf.Empty + 16, // 13: ceph.SearchConfigResponse.params:type_name -> ceph.ConfigParam + 19, // 14: ceph.Cluster.GetStatus:input_type -> google.protobuf.Empty 6, // 15: ceph.Cluster.UpdateStatus:input_type -> ceph.ClusterStatus - 20, // 16: ceph.Cluster.GetUsers:input_type -> google.protobuf.Empty - 9, // 17: ceph.Cluster.UpdateUser:input_type -> ceph.UpdateClusterUserReq - 10, // 18: ceph.Cluster.CreateUser:input_type -> ceph.CreateClusterUserReq - 11, // 19: ceph.Cluster.ExportUser:input_type -> ceph.ExportClusterUserReq - 12, // 20: ceph.Cluster.DeleteUser:input_type -> ceph.DeleteClusterUserReq - 14, // 21: ceph.Cluster.SearchConfig:input_type -> ceph.SearchConfigRequest + 19, // 16: ceph.Cluster.GetUsers:input_type -> google.protobuf.Empty + 10, // 17: ceph.Cluster.UpdateUser:input_type -> ceph.UpdateClusterUserReq + 11, // 18: ceph.Cluster.CreateUser:input_type -> ceph.CreateClusterUserReq + 12, // 19: ceph.Cluster.ExportUser:input_type -> ceph.ExportClusterUserReq + 13, // 20: ceph.Cluster.DeleteUser:input_type -> ceph.DeleteClusterUserReq + 15, // 21: ceph.Cluster.SearchConfig:input_type -> ceph.SearchConfigRequest 6, // 22: ceph.Cluster.GetStatus:output_type -> ceph.ClusterStatus - 20, // 23: ceph.Cluster.UpdateStatus:output_type -> google.protobuf.Empty + 19, // 23: ceph.Cluster.UpdateStatus:output_type -> google.protobuf.Empty 7, // 24: ceph.Cluster.GetUsers:output_type -> ceph.ClusterUsers - 20, // 25: ceph.Cluster.UpdateUser:output_type -> google.protobuf.Empty - 20, // 26: ceph.Cluster.CreateUser:output_type -> google.protobuf.Empty - 13, // 27: ceph.Cluster.ExportUser:output_type -> ceph.ExportClusterUserResp - 20, // 28: ceph.Cluster.DeleteUser:output_type -> google.protobuf.Empty - 16, // 29: ceph.Cluster.SearchConfig:output_type -> ceph.SearchConfigResponse + 19, // 25: ceph.Cluster.UpdateUser:output_type -> google.protobuf.Empty + 19, // 26: ceph.Cluster.CreateUser:output_type -> google.protobuf.Empty + 14, // 27: ceph.Cluster.ExportUser:output_type -> ceph.ExportClusterUserResp + 19, // 28: ceph.Cluster.DeleteUser:output_type -> google.protobuf.Empty + 17, // 29: ceph.Cluster.SearchConfig:output_type -> ceph.SearchConfigResponse 22, // [22:30] is the sub-list for method output_type 14, // [14:22] is the sub-list for method input_type 14, // [14:14] is the sub-list for extension type_name @@ -1267,15 +1313,15 @@ func file_cluster_proto_init() { if File_cluster_proto != nil { return } - file_cluster_proto_msgTypes[8].OneofWrappers = []any{} file_cluster_proto_msgTypes[9].OneofWrappers = []any{} + file_cluster_proto_msgTypes[10].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_cluster_proto_rawDesc), len(file_cluster_proto_rawDesc)), NumEnums: 6, - NumMessages: 14, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, diff --git a/api/gen/grpc/go/status.pb.gw.go b/api/gen/grpc/go/status.pb.gw.go index 91f2899..b259d92 100644 --- a/api/gen/grpc/go/status.pb.gw.go +++ b/api/gen/grpc/go/status.pb.gw.go @@ -99,6 +99,27 @@ func local_request_Status_GetCephOsdDump_0(ctx context.Context, marshaler runtim return msg, metadata, err } +func request_Status_GetCephPgDump_0(ctx context.Context, marshaler runtime.Marshaler, client StatusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + if req.Body != nil { + _, _ = io.Copy(io.Discard, req.Body) + } + msg, err := client.GetCephPgDump(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_Status_GetCephPgDump_0(ctx context.Context, marshaler runtime.Marshaler, server StatusServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq emptypb.Empty + metadata runtime.ServerMetadata + ) + msg, err := server.GetCephPgDump(ctx, &protoReq) + return msg, metadata, err +} + func request_Status_GetCephReport_0(ctx context.Context, marshaler runtime.Marshaler, client StatusClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var ( protoReq emptypb.Empty @@ -186,6 +207,26 @@ func RegisterStatusHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser } forward_Status_GetCephOsdDump_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodGet, pattern_Status_GetCephPgDump_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/ceph.Status/GetCephPgDump", runtime.WithHTTPPathPattern("/api/status/pg_dump")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Status_GetCephPgDump_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Status_GetCephPgDump_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodGet, pattern_Status_GetCephReport_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -297,6 +338,23 @@ func RegisterStatusHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli } forward_Status_GetCephOsdDump_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodGet, pattern_Status_GetCephPgDump_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/ceph.Status/GetCephPgDump", runtime.WithHTTPPathPattern("/api/status/pg_dump")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Status_GetCephPgDump_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_Status_GetCephPgDump_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) mux.Handle(http.MethodGet, pattern_Status_GetCephReport_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -321,6 +379,7 @@ var ( pattern_Status_GetCephStatus_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "status", "ceph"}, "")) pattern_Status_GetCephMonDump_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "status", "mon_dump"}, "")) pattern_Status_GetCephOsdDump_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "status", "osd_dump"}, "")) + pattern_Status_GetCephPgDump_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "status", "pg_dump"}, "")) pattern_Status_GetCephReport_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "status", "report"}, "")) ) @@ -328,5 +387,6 @@ var ( forward_Status_GetCephStatus_0 = runtime.ForwardResponseMessage forward_Status_GetCephMonDump_0 = runtime.ForwardResponseMessage forward_Status_GetCephOsdDump_0 = runtime.ForwardResponseMessage + forward_Status_GetCephPgDump_0 = runtime.ForwardResponseMessage forward_Status_GetCephReport_0 = runtime.ForwardResponseMessage ) diff --git a/api/gen/grpc/go/users.pb.go b/api/gen/grpc/go/users.pb.go index 7dd97ae..acd6fc6 100644 --- a/api/gen/grpc/go/users.pb.go +++ b/api/gen/grpc/go/users.pb.go @@ -73,6 +73,7 @@ type Role struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` Description *string `protobuf:"bytes,2,opt,name=description,proto3,oneof" json:"description,omitempty"` ScopesPermissions map[string]*structpb.ListValue `protobuf:"bytes,3,rep,name=scopes_permissions,proto3" json:"scopes_permissions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + System bool `protobuf:"varint,4,opt,name=system,proto3" json:"system,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -128,6 +129,13 @@ func (x *Role) GetScopesPermissions() map[string]*structpb.ListValue { return nil } +func (x *Role) GetSystem() bool { + if x != nil { + return x.System + } + return false +} + type GetRoleReq struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -579,11 +587,12 @@ const file_users_proto_rawDesc = "" + "\vusers.proto\x12\x04ceph\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\"-\n" + "\tRolesResp\x12 \n" + "\x05roles\x18\x01 \x03(\v2\n" + - ".ceph.RoleR\x05roles\"\x86\x02\n" + + ".ceph.RoleR\x05roles\"\x9e\x02\n" + "\x04Role\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12%\n" + "\vdescription\x18\x02 \x01(\tH\x00R\vdescription\x88\x01\x01\x12Q\n" + - "\x12scopes_permissions\x18\x03 \x03(\v2!.ceph.Role.ScopesPermissionsEntryR\x12scopes_permissions\x1a`\n" + + "\x12scopes_permissions\x18\x03 \x03(\v2!.ceph.Role.ScopesPermissionsEntryR\x12scopes_permissions\x12\x16\n" + + "\x06system\x18\x04 \x01(\bR\x06system\x1a`\n" + "\x16ScopesPermissionsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x120\n" + "\x05value\x18\x02 \x01(\v2\x1a.google.protobuf.ListValueR\x05value:\x028\x01B\x0e\n" + diff --git a/api/http.yaml b/api/http.yaml index d5ee55a..e8e29e3 100644 --- a/api/http.yaml +++ b/api/http.yaml @@ -89,6 +89,9 @@ http: - selector: ceph.Status.GetCephOsdDump get: /api/status/osd_dump response_body: "*" + - selector: ceph.Status.GetCephPgDump + get: /api/status/pg_dump + response_body: "*" - selector: ceph.Status.GetCephReport get: /api/status/report response_body: "*" diff --git a/api/openapi/ceph-api.swagger.json b/api/openapi/ceph-api.swagger.json index c20782b..0510686 100644 --- a/api/openapi/ceph-api.swagger.json +++ b/api/openapi/ceph-api.swagger.json @@ -400,8 +400,7 @@ "200": { "description": "User key and capabilities in Ceph config file format", "schema": { - "type": "string", - "format": "byte" + "type": "string" } }, "default": { @@ -795,6 +794,29 @@ ] } }, + "/api/status/pg_dump": { + "get": { + "summary": "command: ceph pg dump", + "operationId": "Status_GetCephPgDump", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/cephGetCephPgDumpResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/googleRpcStatus" + } + } + }, + "tags": [ + "Status" + ] + } + }, "/api/status/report": { "get": { "summary": "command: ceph report", @@ -1093,485 +1115,2110 @@ ], "default": "common" }, - "SearchConfigRequestSortField": { - "type": "string", - "enum": [ - "NAME", - "TYPE", - "LEVEL" - ], - "default": "NAME" - }, - "SearchConfigRequestSortOrder": { - "type": "string", - "enum": [ - "ASC", - "DESC" - ], - "default": "ASC" - }, - "UsersUpdateRoleBody": { + "PGStatPGStat_StatSum": { "type": "object", "properties": { - "description": { - "type": "string" + "num_bytes": { + "type": "string", + "format": "int64" }, - "scopes_permissions": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "object" - } - } - } - } - }, - "UsersUserChangePasswordBody": { - "type": "object", - "properties": { - "old_password": { - "type": "string" + "num_objects": { + "type": "string", + "format": "int64" }, - "new_password": { - "type": "string" - } - } - }, - "cephCephMonDumpAddrVec": { - "type": "object", - "properties": { - "addrvec": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephCephMonDumpAddress" - } - } - } - }, - "cephCephMonDumpAddress": { - "type": "object", - "properties": { - "type": { - "type": "string" + "num_object_clones": { + "type": "string", + "format": "int64" }, - "addr": { - "type": "string" + "num_object_copies": { + "type": "string", + "format": "int64" }, - "nonce": { - "type": "integer", - "format": "int32" - } - } - }, - "cephCephMonDumpFeatures": { - "type": "object", - "properties": { - "persistent": { - "type": "array", - "items": { - "type": "string" - } + "num_objects_missing_on_primary": { + "type": "string", + "format": "int64" }, - "optional": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "cephCephMonDumpMonInfo": { - "type": "object", - "properties": { - "rank": { - "type": "integer", - "format": "int32" + "num_objects_missing": { + "type": "string", + "format": "int64" }, - "name": { - "type": "string" + "num_objects_degraded": { + "type": "string", + "format": "int64" }, - "public_addrs": { - "$ref": "#/definitions/cephCephMonDumpAddrVec" + "num_objects_misplaced": { + "type": "string", + "format": "int64" }, - "addr": { - "type": "string" + "num_objects_unfound": { + "type": "string", + "format": "int64" }, - "public_addr": { - "type": "string" + "num_objects_dirty": { + "type": "string", + "format": "int64" }, - "priority": { - "type": "integer", - "format": "int32" + "num_whiteouts": { + "type": "string", + "format": "int64" }, - "weight": { - "type": "integer", - "format": "int32" + "num_read": { + "type": "string", + "format": "int64" }, - "crush_location": { - "type": "string" - } - } - }, - "cephCephMonDumpResponse": { - "type": "object", - "properties": { - "epoch": { - "type": "integer", - "format": "int32" + "num_read_kb": { + "type": "string", + "format": "int64" }, - "fsid": { - "type": "string" + "num_write": { + "type": "string", + "format": "int64" }, - "modified": { + "num_write_kb": { "type": "string", - "format": "date-time" + "format": "int64" }, - "created": { + "num_scrub_errors": { "type": "string", - "format": "date-time" + "format": "int64" }, - "min_mon_release": { - "type": "integer", - "format": "int32" + "num_shallow_scrub_errors": { + "type": "string", + "format": "int64" }, - "min_mon_release_name": { - "type": "string" + "num_deep_scrub_errors": { + "type": "string", + "format": "int64" }, - "election_strategy": { - "type": "integer", - "format": "int32" + "num_objects_recovered": { + "type": "string", + "format": "int64" }, - "disallowed_leaders": { - "type": "string" + "num_bytes_recovered": { + "type": "string", + "format": "int64" }, - "stretch_mode": { - "type": "boolean" + "num_keys_recovered": { + "type": "string", + "format": "int64" }, - "tiebreaker_mon": { - "type": "string" + "num_objects_omap": { + "type": "string", + "format": "int64" }, - "removed_ranks": { - "type": "string" + "num_objects_hit_set_archive": { + "type": "string", + "format": "int64" }, - "features": { - "$ref": "#/definitions/cephCephMonDumpFeatures" + "num_bytes_hit_set_archive": { + "type": "string", + "format": "int64" }, - "mons": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephCephMonDumpMonInfo" - } + "num_flush": { + "type": "string", + "format": "int64" }, - "quorum": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } - } - } - }, - "cephCephStatusFSMap": { - "type": "object", - "properties": { - "epoch": { - "type": "integer", - "format": "int32" + "num_flush_kb": { + "type": "string", + "format": "int64" }, - "by_rank": { - "type": "array", - "items": {} + "num_evict": { + "type": "string", + "format": "int64" }, - "up_standby": { - "type": "integer", - "format": "int32" - } - } - }, - "cephCephStatusHealth": { - "type": "object", - "properties": { - "status": { - "type": "string" + "num_evict_kb": { + "type": "string", + "format": "int64" }, - "checks": { - "type": "object", - "additionalProperties": { - "type": "object" - } + "num_promote": { + "type": "string", + "format": "int64" }, - "mutes": { - "type": "array", - "items": {} + "num_flush_mode_high": { + "type": "string", + "format": "int64" + }, + "num_flush_mode_low": { + "type": "string", + "format": "int64" + }, + "num_evict_mode_some": { + "type": "string", + "format": "int64" + }, + "num_evict_mode_full": { + "type": "string", + "format": "int64" + }, + "num_objects_pinned": { + "type": "string", + "format": "int64" + }, + "num_legacy_snapsets": { + "type": "string", + "format": "int64" + }, + "num_large_omap_objects": { + "type": "string", + "format": "int64" + }, + "num_objects_manifest": { + "type": "string", + "format": "int64" + }, + "num_omap_bytes": { + "type": "string", + "format": "int64" + }, + "num_omap_keys": { + "type": "string", + "format": "int64" + }, + "num_objects_repaired": { + "type": "string", + "format": "int64" + } + } + }, + "PGStatsDeltaPGStatsDelta_StatSum": { + "type": "object", + "properties": { + "num_bytes": { + "type": "string", + "format": "int64" + }, + "num_objects": { + "type": "string", + "format": "int64" + }, + "num_object_clones": { + "type": "string", + "format": "int64" + }, + "num_object_copies": { + "type": "string", + "format": "int64" + }, + "num_objects_missing_on_primary": { + "type": "string", + "format": "int64" + }, + "num_objects_missing": { + "type": "string", + "format": "int64" + }, + "num_objects_degraded": { + "type": "string", + "format": "int64" + }, + "num_objects_misplaced": { + "type": "string", + "format": "int64" + }, + "num_objects_unfound": { + "type": "string", + "format": "int64" + }, + "num_objects_dirty": { + "type": "string", + "format": "int64" + }, + "num_whiteouts": { + "type": "string", + "format": "int64" + }, + "num_read": { + "type": "string", + "format": "int64" + }, + "num_read_kb": { + "type": "string", + "format": "int64" + }, + "num_write": { + "type": "string", + "format": "int64" + }, + "num_write_kb": { + "type": "string", + "format": "int64" + }, + "num_scrub_errors": { + "type": "string", + "format": "int64" + }, + "num_shallow_scrub_errors": { + "type": "string", + "format": "int64" + }, + "num_deep_scrub_errors": { + "type": "string", + "format": "int64" + }, + "num_objects_recovered": { + "type": "string", + "format": "int64" + }, + "num_bytes_recovered": { + "type": "string", + "format": "int64" + }, + "num_keys_recovered": { + "type": "string", + "format": "int64" + }, + "num_objects_omap": { + "type": "string", + "format": "int64" + }, + "num_objects_hit_set_archive": { + "type": "string", + "format": "int64" + }, + "num_bytes_hit_set_archive": { + "type": "string", + "format": "int64" + }, + "num_flush": { + "type": "string", + "format": "int64" + }, + "num_flush_kb": { + "type": "string", + "format": "int64" + }, + "num_evict": { + "type": "string", + "format": "int64" + }, + "num_evict_kb": { + "type": "string", + "format": "int64" + }, + "num_promote": { + "type": "string", + "format": "int64" + }, + "num_flush_mode_high": { + "type": "string", + "format": "int64" + }, + "num_flush_mode_low": { + "type": "string", + "format": "int64" + }, + "num_evict_mode_some": { + "type": "string", + "format": "int64" + }, + "num_evict_mode_full": { + "type": "string", + "format": "int64" + }, + "num_objects_pinned": { + "type": "string", + "format": "int64" + }, + "num_legacy_snapsets": { + "type": "string", + "format": "int64" + }, + "num_large_omap_objects": { + "type": "string", + "format": "int64" + }, + "num_objects_manifest": { + "type": "string", + "format": "int64" + }, + "num_omap_bytes": { + "type": "string", + "format": "int64" + }, + "num_omap_keys": { + "type": "string", + "format": "int64" + }, + "num_objects_repaired": { + "type": "string", + "format": "int64" + } + } + }, + "PGStatsDeltaPGStatsDelta_StoreStats": { + "type": "object", + "properties": { + "total": { + "type": "string", + "format": "int64" + }, + "available": { + "type": "string", + "format": "int64" + }, + "internally_reserved": { + "type": "string", + "format": "int64" + }, + "allocated": { + "type": "string", + "format": "int64" + }, + "data_stored": { + "type": "string", + "format": "int64" + }, + "data_compressed": { + "type": "string", + "format": "int64" + }, + "data_compressed_allocated": { + "type": "string", + "format": "int64" + }, + "data_compressed_original": { + "type": "string", + "format": "int64" + }, + "omap_allocated": { + "type": "string", + "format": "int64" + }, + "internal_metadata": { + "type": "string", + "format": "int64" + } + } + }, + "PGStatsSumPGStatsSum_StatSum": { + "type": "object", + "properties": { + "num_bytes": { + "type": "string", + "format": "int64" + }, + "num_objects": { + "type": "string", + "format": "int64" + }, + "num_object_clones": { + "type": "string", + "format": "int64" + }, + "num_object_copies": { + "type": "string", + "format": "int64" + }, + "num_objects_missing_on_primary": { + "type": "string", + "format": "int64" + }, + "num_objects_missing": { + "type": "string", + "format": "int64" + }, + "num_objects_degraded": { + "type": "string", + "format": "int64" + }, + "num_objects_misplaced": { + "type": "string", + "format": "int64" + }, + "num_objects_unfound": { + "type": "string", + "format": "int64" + }, + "num_objects_dirty": { + "type": "string", + "format": "int64" + }, + "num_whiteouts": { + "type": "string", + "format": "int64" + }, + "num_read": { + "type": "string", + "format": "int64" + }, + "num_read_kb": { + "type": "string", + "format": "int64" + }, + "num_write": { + "type": "string", + "format": "int64" + }, + "num_write_kb": { + "type": "string", + "format": "int64" + }, + "num_scrub_errors": { + "type": "string", + "format": "int64" + }, + "num_shallow_scrub_errors": { + "type": "string", + "format": "int64" + }, + "num_deep_scrub_errors": { + "type": "string", + "format": "int64" + }, + "num_objects_recovered": { + "type": "string", + "format": "int64" + }, + "num_bytes_recovered": { + "type": "string", + "format": "int64" + }, + "num_keys_recovered": { + "type": "string", + "format": "int64" + }, + "num_objects_omap": { + "type": "string", + "format": "int64" + }, + "num_objects_hit_set_archive": { + "type": "string", + "format": "int64" + }, + "num_bytes_hit_set_archive": { + "type": "string", + "format": "int64" + }, + "num_flush": { + "type": "string", + "format": "int64" + }, + "num_flush_kb": { + "type": "string", + "format": "int64" + }, + "num_evict": { + "type": "string", + "format": "int64" + }, + "num_evict_kb": { + "type": "string", + "format": "int64" + }, + "num_promote": { + "type": "string", + "format": "int64" + }, + "num_flush_mode_high": { + "type": "string", + "format": "int64" + }, + "num_flush_mode_low": { + "type": "string", + "format": "int64" + }, + "num_evict_mode_some": { + "type": "string", + "format": "int64" + }, + "num_evict_mode_full": { + "type": "string", + "format": "int64" + }, + "num_objects_pinned": { + "type": "string", + "format": "int64" + }, + "num_legacy_snapsets": { + "type": "string", + "format": "int64" + }, + "num_large_omap_objects": { + "type": "string", + "format": "int64" + }, + "num_objects_manifest": { + "type": "string", + "format": "int64" + }, + "num_omap_bytes": { + "type": "string", + "format": "int64" + }, + "num_omap_keys": { + "type": "string", + "format": "int64" + }, + "num_objects_repaired": { + "type": "string", + "format": "int64" + } + } + }, + "PGStatsSumPGStatsSum_StoreStats": { + "type": "object", + "properties": { + "total": { + "type": "string", + "format": "int64" + }, + "available": { + "type": "string", + "format": "int64" + }, + "internally_reserved": { + "type": "string", + "format": "int64" + }, + "allocated": { + "type": "string", + "format": "int64" + }, + "data_stored": { + "type": "string", + "format": "int64" + }, + "data_compressed": { + "type": "string", + "format": "int64" + }, + "data_compressed_allocated": { + "type": "string", + "format": "int64" + }, + "data_compressed_original": { + "type": "string", + "format": "int64" + }, + "omap_allocated": { + "type": "string", + "format": "int64" + }, + "internal_metadata": { + "type": "string", + "format": "int64" + } + } + }, + "PoolStatsPoolStats_StatSum": { + "type": "object", + "properties": { + "num_bytes": { + "type": "string", + "format": "int64" + }, + "num_objects": { + "type": "string", + "format": "int64" + }, + "num_object_clones": { + "type": "string", + "format": "int64" + }, + "num_object_copies": { + "type": "string", + "format": "int64" + }, + "num_objects_missing_on_primary": { + "type": "string", + "format": "int64" + }, + "num_objects_missing": { + "type": "string", + "format": "int64" + }, + "num_objects_degraded": { + "type": "string", + "format": "int64" + }, + "num_objects_misplaced": { + "type": "string", + "format": "int64" + }, + "num_objects_unfound": { + "type": "string", + "format": "int64" + }, + "num_objects_dirty": { + "type": "string", + "format": "int64" + }, + "num_whiteouts": { + "type": "string", + "format": "int64" + }, + "num_read": { + "type": "string", + "format": "int64" + }, + "num_read_kb": { + "type": "string", + "format": "int64" + }, + "num_write": { + "type": "string", + "format": "int64" + }, + "num_write_kb": { + "type": "string", + "format": "int64" + }, + "num_scrub_errors": { + "type": "string", + "format": "int64" + }, + "num_shallow_scrub_errors": { + "type": "string", + "format": "int64" + }, + "num_deep_scrub_errors": { + "type": "string", + "format": "int64" + }, + "num_objects_recovered": { + "type": "string", + "format": "int64" + }, + "num_bytes_recovered": { + "type": "string", + "format": "int64" + }, + "num_keys_recovered": { + "type": "string", + "format": "int64" + }, + "num_objects_omap": { + "type": "string", + "format": "int64" + }, + "num_objects_hit_set_archive": { + "type": "string", + "format": "int64" + }, + "num_bytes_hit_set_archive": { + "type": "string", + "format": "int64" + }, + "num_flush": { + "type": "string", + "format": "int64" + }, + "num_flush_kb": { + "type": "string", + "format": "int64" + }, + "num_evict": { + "type": "string", + "format": "int64" + }, + "num_evict_kb": { + "type": "string", + "format": "int64" + }, + "num_promote": { + "type": "string", + "format": "int64" + }, + "num_flush_mode_high": { + "type": "string", + "format": "int64" + }, + "num_flush_mode_low": { + "type": "string", + "format": "int64" + }, + "num_evict_mode_some": { + "type": "string", + "format": "int64" + }, + "num_evict_mode_full": { + "type": "string", + "format": "int64" + }, + "num_objects_pinned": { + "type": "string", + "format": "int64" + }, + "num_legacy_snapsets": { + "type": "string", + "format": "int64" + }, + "num_large_omap_objects": { + "type": "string", + "format": "int64" + }, + "num_objects_manifest": { + "type": "string", + "format": "int64" + }, + "num_omap_bytes": { + "type": "string", + "format": "int64" + }, + "num_omap_keys": { + "type": "string", + "format": "int64" + }, + "num_objects_repaired": { + "type": "string", + "format": "int64" + } + } + }, + "PoolStatsPoolStats_StoreStats": { + "type": "object", + "properties": { + "total": { + "type": "string", + "format": "int64" + }, + "available": { + "type": "string", + "format": "int64" + }, + "internally_reserved": { + "type": "string", + "format": "int64" + }, + "allocated": { + "type": "string", + "format": "int64" + }, + "data_stored": { + "type": "string", + "format": "int64" + }, + "data_compressed": { + "type": "string", + "format": "int64" + }, + "data_compressed_allocated": { + "type": "string", + "format": "int64" + }, + "data_compressed_original": { + "type": "string", + "format": "int64" + }, + "omap_allocated": { + "type": "string", + "format": "int64" + }, + "internal_metadata": { + "type": "string", + "format": "int64" + } + } + }, + "SearchConfigRequestSortField": { + "type": "string", + "enum": [ + "NAME", + "TYPE", + "LEVEL" + ], + "default": "NAME" + }, + "SearchConfigRequestSortOrder": { + "type": "string", + "enum": [ + "ASC", + "DESC" + ], + "default": "ASC" + }, + "UsersUpdateRoleBody": { + "type": "object", + "properties": { + "description": { + "type": "string" + }, + "scopes_permissions": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object" + } + } + }, + "system": { + "type": "boolean" + } + } + }, + "UsersUserChangePasswordBody": { + "type": "object", + "properties": { + "old_password": { + "type": "string" + }, + "new_password": { + "type": "string" + } + } + }, + "cephCephMonDumpAddrVec": { + "type": "object", + "properties": { + "addrvec": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephCephMonDumpAddress" + } + } + } + }, + "cephCephMonDumpAddress": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "addr": { + "type": "string" + }, + "nonce": { + "type": "integer", + "format": "int32" + } + } + }, + "cephCephMonDumpFeatures": { + "type": "object", + "properties": { + "persistent": { + "type": "array", + "items": { + "type": "string" + } + }, + "optional": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "cephCephMonDumpMonInfo": { + "type": "object", + "properties": { + "rank": { + "type": "integer", + "format": "int32" + }, + "name": { + "type": "string" + }, + "public_addrs": { + "$ref": "#/definitions/cephCephMonDumpAddrVec" + }, + "addr": { + "type": "string" + }, + "public_addr": { + "type": "string" + }, + "priority": { + "type": "integer", + "format": "int32" + }, + "weight": { + "type": "integer", + "format": "int32" + }, + "crush_location": { + "type": "string" + } + } + }, + "cephCephMonDumpResponse": { + "type": "object", + "properties": { + "epoch": { + "type": "integer", + "format": "int32" + }, + "fsid": { + "type": "string" + }, + "modified": { + "type": "string", + "format": "date-time" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "min_mon_release": { + "type": "integer", + "format": "int32" + }, + "min_mon_release_name": { + "type": "string" + }, + "election_strategy": { + "type": "integer", + "format": "int32" + }, + "disallowed_leaders": { + "type": "string" + }, + "stretch_mode": { + "type": "boolean" + }, + "tiebreaker_mon": { + "type": "string" + }, + "removed_ranks": { + "type": "string" + }, + "features": { + "$ref": "#/definitions/cephCephMonDumpFeatures" + }, + "mons": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephCephMonDumpMonInfo" + } + }, + "quorum": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + } + } + }, + "cephCephStatusFSMap": { + "type": "object", + "properties": { + "epoch": { + "type": "integer", + "format": "int32" + }, + "by_rank": { + "type": "array", + "items": {} + }, + "up_standby": { + "type": "integer", + "format": "int32" + } + } + }, + "cephCephStatusHealth": { + "type": "object", + "properties": { + "status": { + "type": "string" + }, + "checks": { + "type": "object", + "additionalProperties": { + "type": "object" + } + }, + "mutes": { + "type": "array", + "items": {} + } + } + }, + "cephCephStatusMgrMap": { + "type": "object", + "properties": { + "available": { + "type": "boolean" + }, + "num_standbys": { + "type": "integer", + "format": "int32" + }, + "modules": { + "type": "array", + "items": { + "type": "string" + } + }, + "services": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + }, + "cephCephStatusMonMap": { + "type": "object", + "properties": { + "epoch": { + "type": "integer", + "format": "int32" + }, + "min_mon_release_name": { + "type": "string" + }, + "num_mons": { + "type": "integer", + "format": "int32" + } + } + }, + "cephCephStatusOSDMap": { + "type": "object", + "properties": { + "epoch": { + "type": "integer", + "format": "int32" + }, + "num_osds": { + "type": "integer", + "format": "int32" + }, + "num_up_osds": { + "type": "integer", + "format": "int32" + }, + "osd_up_since": { + "type": "string", + "format": "int64" + }, + "num_in_osds": { + "type": "integer", + "format": "int32" + }, + "osd_in_since": { + "type": "string", + "format": "int64" + }, + "num_remapped_pgs": { + "type": "integer", + "format": "int32" + } + } + }, + "cephCephStatusPGMap": { + "type": "object", + "properties": { + "pgs_by_state": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephCephStatusPGState" + } + }, + "num_pgs": { + "type": "integer", + "format": "int32" + }, + "num_pools": { + "type": "integer", + "format": "int32" + }, + "num_objects": { + "type": "integer", + "format": "int32" + }, + "data_bytes": { + "type": "string", + "format": "int64" + }, + "bytes_used": { + "type": "string", + "format": "int64" + }, + "bytes_avail": { + "type": "string", + "format": "int64" + }, + "bytes_total": { + "type": "string", + "format": "int64" + } + } + }, + "cephCephStatusPGState": { + "type": "object", + "properties": { + "state_name": { + "type": "string" + }, + "count": { + "type": "integer", + "format": "int32" + } + } + }, + "cephCephStatusService": { + "type": "object", + "properties": { + "daemons": { + "type": "object", + "additionalProperties": {} + }, + "summary": { + "type": "string" + } + } + }, + "cephCephStatusServiceMap": { + "type": "object", + "properties": { + "epoch": { + "type": "integer", + "format": "int32" + }, + "modified": { + "type": "string" + }, + "services": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/cephCephStatusService" + } + } + } + }, + "cephClusterStatus": { + "type": "object", + "properties": { + "status": { + "$ref": "#/definitions/cephClusterStatusStatus" + } + } + }, + "cephClusterStatusStatus": { + "type": "string", + "enum": [ + "INSTALLED", + "POST_INSTALLED" + ], + "default": "INSTALLED" + }, + "cephClusterUser": { + "type": "object", + "properties": { + "entity": { + "type": "string", + "title": "entity, e.g: \"client.admin\"" + }, + "caps": { + "type": "object", + "additionalProperties": { + "type": "string" + }, + "title": "user capabilities, e.g: {\"mon\": \"allow r\",\"osd\":\"allow rw pool=liverpool\"}" + }, + "key": { + "type": "string", + "title": "keyring" + } + } + }, + "cephClusterUserCap": { + "type": "object", + "properties": { + "entity": { + "type": "string", + "title": "capability scope entity, e.g: \"mon\", \"osd\"" + }, + "cap": { + "type": "string", + "title": "capability value, e.g: \"allow r\", \"allow rw pool=liverpool\"" + } + } + }, + "cephClusterUsers": { + "type": "object", + "properties": { + "users": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephClusterUser" + } + } + } + }, + "cephConfigParam": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "type": { + "$ref": "#/definitions/ConfigParamParamType" + }, + "level": { + "$ref": "#/definitions/ConfigParamConfigLevel" + }, + "desc": { + "type": "string" + }, + "long_desc": { + "type": "string" + }, + "default_value": { + "type": "string" + }, + "daemon_default": { + "type": "string" + }, + "tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "services": { + "type": "array", + "items": { + "$ref": "#/definitions/ConfigParamServiceType" + } + }, + "see_also": { + "type": "array", + "items": { + "type": "string" + } + }, + "enum_values": { + "type": "array", + "items": { + "type": "string" + } + }, + "min": { + "type": "number", + "format": "double" + }, + "max": { + "type": "number", + "format": "double" + }, + "can_update_at_runtime": { + "type": "boolean" + }, + "flags": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "cephCreateClusterUserReq": { + "type": "object", + "properties": { + "capabilities": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephClusterUserCap" + } + }, + "user_entity": { + "type": "string" + }, + "import_data": { + "type": "string", + "format": "byte", + "title": "keyring file format - if import_data is set then other fields ignored" + } + } + }, + "cephCreateRuleRequest": { + "type": "object", + "properties": { + "device_class": { + "type": "string" + }, + "failure_domain": { + "type": "string" + }, + "name": { + "type": "string" + }, + "pool_type": { + "$ref": "#/definitions/cephPoolType" + }, + "profile": { + "type": "string" + }, + "root": { + "type": "string" + } + }, + "title": "CREATE RULE" + }, + "cephCreateUserReq": { + "type": "object", + "properties": { + "email": { + "type": "string" + }, + "enabled": { + "type": "boolean" + }, + "name": { + "type": "string" + }, + "password": { + "type": "string" + }, + "pwd_expiration_date": { + "type": "string", + "format": "date-time" + }, + "pwd_update_required": { + "type": "boolean" + }, + "roles": { + "type": "array", + "items": { + "type": "string" + } + }, + "username": { + "type": "string" + } + } + }, + "cephExportClusterUserReq": { + "type": "object", + "properties": { + "entities": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "cephExportClusterUserResp": { + "type": "object", + "properties": { + "data": { + "type": "string", + "title": "User key and capabilities in Ceph config file format" + } + } + }, + "cephGetCephOsdDumpResponse": { + "type": "object", + "properties": { + "epoch": { + "type": "integer", + "format": "int32" + }, + "fsid": { + "type": "string" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "modified": { + "type": "string", + "format": "date-time" + }, + "last_up_change": { + "type": "string", + "format": "date-time" + }, + "last_in_change": { + "type": "string", + "format": "date-time" + }, + "flags": { + "type": "string" + }, + "flags_num": { + "type": "integer", + "format": "int32" + }, + "flags_set": { + "type": "array", + "items": { + "type": "string" + } + }, + "crush_version": { + "type": "integer", + "format": "int32" + }, + "full_ratio": { + "type": "number", + "format": "double" + }, + "backfillfull_ratio": { + "type": "number", + "format": "double" + }, + "nearfull_ratio": { + "type": "number", + "format": "double" + }, + "cluster_snapshot": { + "type": "string" + }, + "pool_max": { + "type": "integer", + "format": "int32" + }, + "max_osd": { + "type": "integer", + "format": "int32" + }, + "require_min_compat_client": { + "type": "string" + }, + "min_compat_client": { + "type": "string" + }, + "require_osd_release": { + "type": "string" + }, + "allow_crimson": { + "type": "boolean" + }, + "pools": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpPool" + } + }, + "osds": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpOsdInfo" + } + }, + "osd_xinfo": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpOsdXInfo" + } + }, + "pg_upmap": { + "type": "array", + "items": {} + }, + "pg_upmap_items": { + "type": "array", + "items": {} + }, + "pg_upmap_primaries": { + "type": "array", + "items": {} + }, + "pg_temp": { + "type": "array", + "items": {} + }, + "primary_temp": { + "type": "array", + "items": {} + }, + "blocklist": { + "type": "object", + "additionalProperties": { + "type": "string", + "format": "date-time" + } + }, + "range_blocklist": { + "type": "object" + }, + "erasure_code_profiles": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/cephOsdDumpErasureCodeProfile" + } + }, + "removed_snaps_queue": { + "type": "array", + "items": {} + }, + "new_removed_snaps": { + "type": "array", + "items": {} + }, + "new_purged_snaps": { + "type": "array", + "items": {} + }, + "crush_node_flags": { + "type": "object" + }, + "device_class_flags": { + "type": "object" + }, + "stretch_mode": { + "$ref": "#/definitions/cephOsdDumpStretchMode" + } + } + }, + "cephGetCephPgDumpResponse": { + "type": "object", + "properties": { + "pg_ready": { + "type": "boolean" + }, + "pg_map": { + "$ref": "#/definitions/cephPGMap" + } + }, + "title": "PG DUMP" + }, + "cephGetCephStatusResponse": { + "type": "object", + "properties": { + "fsid": { + "type": "string" + }, + "health": { + "$ref": "#/definitions/cephCephStatusHealth" + }, + "election_epoch": { + "type": "integer", + "format": "int32" + }, + "quorum": { + "type": "array", + "items": { + "type": "integer", + "format": "int32" + } + }, + "quorum_names": { + "type": "array", + "items": { + "type": "string" + } + }, + "quorum_age": { + "type": "integer", + "format": "int32" + }, + "monmap": { + "$ref": "#/definitions/cephCephStatusMonMap" + }, + "osdmap": { + "$ref": "#/definitions/cephCephStatusOSDMap" + }, + "pgmap": { + "$ref": "#/definitions/cephCephStatusPGMap" + }, + "fsmap": { + "$ref": "#/definitions/cephCephStatusFSMap" + }, + "mgrmap": { + "$ref": "#/definitions/cephCephStatusMgrMap" + }, + "servicemap": { + "$ref": "#/definitions/cephCephStatusServiceMap" + }, + "progress_events": { + "type": "object" + } + } + }, + "cephListRulesResponse": { + "type": "object", + "properties": { + "rules": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephRule" + } + } + }, + "title": "LIST RULES" + }, + "cephLoginReq": { + "type": "object", + "properties": { + "username": { + "type": "string" + }, + "password": { + "type": "string" + } + } + }, + "cephLoginResp": { + "type": "object", + "properties": { + "token": { + "type": "string" + }, + "username": { + "type": "string" + }, + "pwd_update_required": { + "type": "boolean" + }, + "pwd_expiration_date": { + "type": "string", + "format": "date-time" + }, + "sso": { + "type": "boolean" + }, + "permissions": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "type": "object" + } + } + } + } + }, + "cephOSDStatsSum": { + "type": "object", + "properties": { + "up_from": { + "type": "string", + "format": "int64" + }, + "seq": { + "type": "string", + "format": "int64" + }, + "num_pgs": { + "type": "string", + "format": "int64" + }, + "num_osds": { + "type": "string", + "format": "int64" + }, + "num_per_pool_osds": { + "type": "string", + "format": "int64" + }, + "num_per_pool_omap_osds": { + "type": "string", + "format": "int64" + }, + "kb": { + "type": "string", + "format": "int64" + }, + "kb_used": { + "type": "string", + "format": "int64" + }, + "kb_used_data": { + "type": "string", + "format": "int64" + }, + "kb_used_omap": { + "type": "string", + "format": "int64" + }, + "kb_used_meta": { + "type": "string", + "format": "int64" + }, + "kb_avail": { + "type": "string", + "format": "int64" + }, + "statfs": { + "$ref": "#/definitions/cephOSDStatsSumStatFs" + }, + "hb_peers": { + "type": "array", + "items": { + "type": "string", + "format": "int64" + } + }, + "snap_trim_queue_len": { + "type": "string", + "format": "int64" + }, + "num_snap_trimming": { + "type": "string", + "format": "int64" + }, + "num_shards_repaired": { + "type": "string", + "format": "int64" + }, + "op_queue_age_hist": { + "$ref": "#/definitions/cephOSDStatsSumOpQueueAgeHist" + }, + "perf_stat": { + "$ref": "#/definitions/cephOSDStatsSumPerfStat" + }, + "alerts": { + "type": "array", + "items": { + "type": "string" + } + }, + "network_ping_times": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOSDStatsSumNetworkPingTime" + } } } }, - "cephCephStatusMgrMap": { + "cephOSDStatsSumNetworkPingTime": { "type": "object", "properties": { - "available": { - "type": "boolean" + "osd": { + "type": "string", + "format": "int64" }, - "num_standbys": { - "type": "integer", - "format": "int32" + "last_update": { + "type": "string", + "format": "date-time" }, - "modules": { + "interfaces": { "type": "array", "items": { - "type": "string" - } - }, - "services": { - "type": "object", - "additionalProperties": { - "type": "string" + "type": "object", + "$ref": "#/definitions/cephOSDStatsSumNetworkPingTimeInterface" } } } }, - "cephCephStatusMonMap": { + "cephOSDStatsSumNetworkPingTimeInterface": { "type": "object", "properties": { - "epoch": { - "type": "integer", - "format": "int32" - }, - "min_mon_release_name": { + "interface_name": { "type": "string" }, - "num_mons": { - "type": "integer", - "format": "int32" + "average": { + "$ref": "#/definitions/cephOSDStatsSumNetworkPingTimeInterfaceAverage" + }, + "min": { + "$ref": "#/definitions/cephOSDStatsSumNetworkPingTimeInterfaceMin" + }, + "max": { + "$ref": "#/definitions/cephOSDStatsSumNetworkPingTimeInterfaceMax" + }, + "last": { + "type": "number", + "format": "double" } } }, - "cephCephStatusOSDMap": { + "cephOSDStatsSumNetworkPingTimeInterfaceAverage": { "type": "object", "properties": { - "epoch": { - "type": "integer", - "format": "int32" + "min1": { + "type": "number", + "format": "double" }, - "num_osds": { - "type": "integer", - "format": "int32" + "min5": { + "type": "number", + "format": "double" }, - "num_up_osds": { - "type": "integer", - "format": "int32" + "min15": { + "type": "number", + "format": "double" + } + } + }, + "cephOSDStatsSumNetworkPingTimeInterfaceMax": { + "type": "object", + "properties": { + "min1": { + "type": "number", + "format": "double" }, - "osd_up_since": { - "type": "string", - "format": "int64" + "min5": { + "type": "number", + "format": "double" }, - "num_in_osds": { - "type": "integer", - "format": "int32" + "min15": { + "type": "number", + "format": "double" + } + } + }, + "cephOSDStatsSumNetworkPingTimeInterfaceMin": { + "type": "object", + "properties": { + "min1": { + "type": "number", + "format": "double" }, - "osd_in_since": { - "type": "string", - "format": "int64" + "min5": { + "type": "number", + "format": "double" }, - "num_remapped_pgs": { - "type": "integer", - "format": "int32" + "min15": { + "type": "number", + "format": "double" } } }, - "cephCephStatusPGMap": { + "cephOSDStatsSumOpQueueAgeHist": { "type": "object", "properties": { - "pgs_by_state": { + "histogram": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/cephCephStatusPGState" + "type": "string", + "format": "int64" } }, - "num_pgs": { - "type": "integer", - "format": "int32" - }, - "num_pools": { - "type": "integer", - "format": "int32" - }, - "num_objects": { - "type": "integer", - "format": "int32" - }, - "data_bytes": { + "upper_bound": { + "type": "string", + "format": "int64" + } + } + }, + "cephOSDStatsSumPerfStat": { + "type": "object", + "properties": { + "commit_latency_ms": { "type": "string", "format": "int64" }, - "bytes_used": { + "apply_latency_ms": { "type": "string", "format": "int64" }, - "bytes_avail": { + "commit_latency_ns": { "type": "string", "format": "int64" }, - "bytes_total": { + "apply_latency_ns": { "type": "string", "format": "int64" } } }, - "cephCephStatusPGState": { + "cephOSDStatsSumStatFs": { "type": "object", "properties": { - "state_name": { - "type": "string" + "total": { + "type": "string", + "format": "int64" }, - "count": { - "type": "integer", - "format": "int32" - } - } - }, - "cephCephStatusService": { - "type": "object", - "properties": { - "daemons": { - "type": "object", - "additionalProperties": {} + "available": { + "type": "string", + "format": "int64" }, - "summary": { - "type": "string" + "internally_reserved": { + "type": "string", + "format": "int64" + }, + "allocated": { + "type": "string", + "format": "int64" + }, + "data_stored": { + "type": "string", + "format": "int64" + }, + "data_compressed": { + "type": "string", + "format": "int64" + }, + "data_compressed_allocated": { + "type": "string", + "format": "int64" + }, + "data_compressed_original": { + "type": "string", + "format": "int64" + }, + "omap_allocated": { + "type": "string", + "format": "int64" + }, + "internal_metadata": { + "type": "string", + "format": "int64" } } }, - "cephCephStatusServiceMap": { + "cephOsdDumpAddrVec": { "type": "object", "properties": { - "epoch": { - "type": "integer", - "format": "int32" + "type": { + "type": "string" }, - "modified": { + "addr": { "type": "string" }, - "services": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/cephCephStatusService" - } + "nonce": { + "type": "string", + "format": "uint64" } } }, - "cephClusterStatus": { + "cephOsdDumpClusterAddrs": { "type": "object", "properties": { - "status": { - "$ref": "#/definitions/cephClusterStatusStatus" + "addrvec": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpAddrVec" + } } } }, - "cephClusterStatusStatus": { - "type": "string", - "enum": [ - "INSTALLED", - "POST_INSTALLED" - ], - "default": "INSTALLED" - }, - "cephClusterUser": { + "cephOsdDumpErasureCodeProfile": { "type": "object", "properties": { - "entity": { - "type": "string", - "title": "entity, e.g: \"client.admin\"" + "k": { + "type": "string" }, - "caps": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "user capabilities, e.g: {\"mon\": \"allow r\",\"osd\":\"allow rw pool=liverpool\"}" + "m": { + "type": "string" }, - "key": { - "type": "string", - "title": "keyring" + "plugin": { + "type": "string" + }, + "technique": { + "type": "string" } } }, - "cephClusterUsers": { + "cephOsdDumpHeartbeatAddrs": { "type": "object", "properties": { - "users": { + "addrvec": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/cephClusterUser" + "$ref": "#/definitions/cephOsdDumpAddrVec" } } } }, - "cephConfigParam": { + "cephOsdDumpHitSetParams": { + "type": "object", + "properties": { + "type": { + "type": "string" + } + } + }, + "cephOsdDumpLastPgMergeMeta": { "type": "object", "properties": { - "name": { + "source_pgid": { "type": "string" }, - "type": { - "$ref": "#/definitions/ConfigParamParamType" + "ready_epoch": { + "type": "integer", + "format": "int32" }, - "level": { - "$ref": "#/definitions/ConfigParamConfigLevel" + "last_epoch_started": { + "type": "integer", + "format": "int32" }, - "desc": { - "type": "string" + "last_epoch_clean": { + "type": "integer", + "format": "int32" }, - "long_desc": { + "source_version": { "type": "string" }, - "default_value": { + "target_version": { "type": "string" + } + } + }, + "cephOsdDumpOsdInfo": { + "type": "object", + "properties": { + "osd": { + "type": "integer", + "format": "int32" }, - "daemon_default": { + "uuid": { "type": "string" }, - "tags": { - "type": "array", - "items": { - "type": "string" - } - }, - "services": { - "type": "array", - "items": { - "$ref": "#/definitions/ConfigParamServiceType" - } - }, - "see_also": { - "type": "array", - "items": { - "type": "string" - } + "up": { + "type": "integer", + "format": "int32" }, - "enum_values": { - "type": "array", - "items": { - "type": "string" - } + "in": { + "type": "integer", + "format": "int32" }, - "min": { + "weight": { "type": "number", "format": "double" }, - "max": { + "primary_affinity": { "type": "number", "format": "double" }, - "can_update_at_runtime": { - "type": "boolean" + "last_clean_begin": { + "type": "integer", + "format": "int32" }, - "flags": { + "last_clean_end": { + "type": "integer", + "format": "int32" + }, + "up_from": { + "type": "integer", + "format": "int32" + }, + "up_thru": { + "type": "integer", + "format": "int32" + }, + "down_at": { + "type": "integer", + "format": "int32" + }, + "lost_at": { + "type": "integer", + "format": "int32" + }, + "public_addrs": { + "$ref": "#/definitions/cephOsdDumpPublicAddrs" + }, + "cluster_addrs": { + "$ref": "#/definitions/cephOsdDumpClusterAddrs" + }, + "heartbeat_back_addrs": { + "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" + }, + "heartbeat_front_addrs": { + "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" + }, + "public_addr": { + "type": "string" + }, + "cluster_addr": { + "type": "string" + }, + "heartbeat_back_addr": { + "type": "string" + }, + "heartbeat_front_addr": { + "type": "string" + }, + "state": { "type": "array", "items": { "type": "string" @@ -1579,883 +3226,1051 @@ } } }, - "cephCreateClusterUserReq": { + "cephOsdDumpOsdXInfo": { "type": "object", "properties": { - "capabilities": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "user capabilities, e.g: {\"mon\": \"allow r\",\"osd\":\"allow rw pool=liverpool\"}" + "osd": { + "type": "integer", + "format": "int32" }, - "user_entity": { + "down_stamp": { "type": "string", - "title": "entity, e.g: \"client.admin\"" + "format": "date-time" }, - "import_data": { + "laggy_probability": { + "type": "number", + "format": "double" + }, + "laggy_interval": { + "type": "number", + "format": "double" + }, + "features": { "type": "string", - "format": "byte", - "title": "keyring file format - if import_data is set then other fields ignored" + "format": "uint64" + }, + "old_weight": { + "type": "number", + "format": "double" + }, + "last_purged_snaps_scrub": { + "type": "string", + "format": "date-time" + }, + "dead_epoch": { + "type": "integer", + "format": "int32" } } }, - "cephCreateRuleRequest": { + "cephOsdDumpPool": { "type": "object", "properties": { - "device_class": { - "type": "string" + "pool": { + "type": "integer", + "format": "int32" }, - "failure_domain": { + "pool_name": { "type": "string" }, - "name": { - "type": "string" + "create_time": { + "type": "string", + "format": "date-time" }, - "pool_type": { - "$ref": "#/definitions/cephPoolType" + "flags": { + "type": "string", + "format": "int64" }, - "profile": { + "flags_names": { "type": "string" }, - "root": { - "type": "string" - } - }, - "title": "CREATE RULE" - }, - "cephCreateUserReq": { - "type": "object", - "properties": { - "email": { - "type": "string" + "type": { + "type": "integer", + "format": "int32" }, - "enabled": { - "type": "boolean" + "size": { + "type": "integer", + "format": "int32" }, - "name": { - "type": "string" + "min_size": { + "type": "integer", + "format": "int32" }, - "password": { + "crush_rule": { + "type": "integer", + "format": "int32" + }, + "peering_crush_bucket_count": { + "type": "integer", + "format": "int32" + }, + "peering_crush_bucket_target": { + "type": "integer", + "format": "int32" + }, + "peering_crush_bucket_barrier": { + "type": "integer", + "format": "int32" + }, + "peering_crush_bucket_mandatory_member": { + "type": "integer", + "format": "int32" + }, + "object_hash": { + "type": "integer", + "format": "int32" + }, + "pg_autoscale_mode": { "type": "string" }, - "pwd_expiration_date": { - "type": "string", - "format": "date-time" + "pg_num": { + "type": "integer", + "format": "int32" + }, + "pg_placement_num": { + "type": "integer", + "format": "int32" + }, + "pg_placement_num_target": { + "type": "integer", + "format": "int32" + }, + "pg_num_target": { + "type": "integer", + "format": "int32" + }, + "pg_num_pending": { + "type": "integer", + "format": "int32" }, - "pwd_update_required": { - "type": "boolean" + "last_pg_merge_meta": { + "$ref": "#/definitions/cephOsdDumpLastPgMergeMeta" }, - "roles": { - "type": "array", - "items": { - "type": "string" - } + "last_change": { + "type": "string" }, - "username": { + "last_force_op_resend": { "type": "string" - } - } - }, - "cephExportClusterUserReq": { - "type": "object", - "properties": { - "entities": { - "type": "array", - "items": { - "type": "string" - } - } - } - }, - "cephExportClusterUserResp": { - "type": "object", - "properties": { - "data": { - "type": "string", - "format": "byte", - "title": "User key and capabilities in Ceph config file format" - } - } - }, - "cephGetCephOsdDumpResponse": { - "type": "object", - "properties": { - "epoch": { - "type": "integer", - "format": "int32" }, - "fsid": { + "last_force_op_resend_prenautilus": { "type": "string" }, - "created": { - "type": "string", - "format": "date-time" + "last_force_op_resend_preluminous": { + "type": "string" }, - "modified": { + "auid": { "type": "string", - "format": "date-time" + "format": "uint64" }, - "last_up_change": { + "snap_mode": { + "type": "string" + }, + "snap_seq": { "type": "string", - "format": "date-time" + "format": "uint64" }, - "last_in_change": { + "snap_epoch": { "type": "string", - "format": "date-time" + "format": "uint64" }, - "flags": { + "pool_snaps": { + "type": "array", + "items": {} + }, + "removed_snaps": { "type": "string" }, - "flags_num": { - "type": "integer", - "format": "int32" + "quota_max_bytes": { + "type": "string", + "format": "uint64" }, - "flags_set": { + "quota_max_objects": { + "type": "string", + "format": "uint64" + }, + "tiers": { "type": "array", "items": { - "type": "string" + "type": "integer", + "format": "int32" } }, - "crush_version": { + "tier_of": { "type": "integer", "format": "int32" }, - "full_ratio": { - "type": "number", - "format": "double" - }, - "backfillfull_ratio": { - "type": "number", - "format": "double" - }, - "nearfull_ratio": { - "type": "number", - "format": "double" - }, - "cluster_snapshot": { - "type": "string" - }, - "pool_max": { + "read_tier": { "type": "integer", "format": "int32" }, - "max_osd": { + "write_tier": { "type": "integer", "format": "int32" }, - "require_min_compat_client": { + "cache_mode": { "type": "string" }, - "min_compat_client": { - "type": "string" + "target_max_bytes": { + "type": "string", + "format": "uint64" }, - "require_osd_release": { + "target_max_objects": { + "type": "string", + "format": "uint64" + }, + "cache_target_dirty_ratio_micro": { + "type": "string", + "format": "uint64" + }, + "cache_target_dirty_high_ratio_micro": { + "type": "string", + "format": "uint64" + }, + "cache_target_full_ratio_micro": { + "type": "string", + "format": "uint64" + }, + "cache_min_flush_age": { + "type": "string", + "format": "uint64" + }, + "cache_min_evict_age": { + "type": "string", + "format": "uint64" + }, + "erasure_code_profile": { "type": "string" }, - "allow_crimson": { + "hit_set_params": { + "$ref": "#/definitions/cephOsdDumpHitSetParams" + }, + "hit_set_period": { + "type": "string", + "format": "uint64" + }, + "hit_set_count": { + "type": "string", + "format": "uint64" + }, + "use_gmt_hitset": { "type": "boolean" }, - "pools": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpPool" - } + "min_read_recency_for_promote": { + "type": "string", + "format": "uint64" }, - "osds": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpOsdInfo" - } + "min_write_recency_for_promote": { + "type": "string", + "format": "uint64" }, - "osd_xinfo": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpOsdXInfo" - } + "hit_set_grade_decay_rate": { + "type": "string", + "format": "uint64" }, - "pg_upmap": { - "type": "array", - "items": {} + "hit_set_search_last_n": { + "type": "string", + "format": "uint64" }, - "pg_upmap_items": { + "grade_table": { "type": "array", "items": {} }, - "pg_upmap_primaries": { - "type": "array", - "items": {} + "stripe_width": { + "type": "string", + "format": "uint64" }, - "pg_temp": { - "type": "array", - "items": {} + "expected_num_objects": { + "type": "string", + "format": "uint64" }, - "primary_temp": { - "type": "array", - "items": {} + "fast_read": { + "type": "boolean" }, - "blocklist": { - "type": "object", - "additionalProperties": { - "type": "string", - "format": "date-time" - } + "options": { + "type": "object" }, - "range_blocklist": { + "application_metadata": { "type": "object" }, - "erasure_code_profiles": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/cephOsdDumpErasureCodeProfile" + "read_balance": { + "$ref": "#/definitions/cephOsdDumpReadBalance" + } + } + }, + "cephOsdDumpPublicAddrs": { + "type": "object", + "properties": { + "addrvec": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdDumpAddrVec" } + } + } + }, + "cephOsdDumpReadBalance": { + "type": "object", + "properties": { + "score_acting": { + "type": "number", + "format": "double" }, - "removed_snaps_queue": { - "type": "array", - "items": {} + "score_stable": { + "type": "number", + "format": "double" }, - "new_removed_snaps": { - "type": "array", - "items": {} + "optimal_score": { + "type": "number", + "format": "double" + }, + "raw_score_acting": { + "type": "number", + "format": "double" }, - "new_purged_snaps": { - "type": "array", - "items": {} + "raw_score_stable": { + "type": "number", + "format": "double" }, - "crush_node_flags": { - "type": "object" + "primary_affinity_weighted": { + "type": "number", + "format": "double" }, - "device_class_flags": { - "type": "object" + "average_primary_affinity": { + "type": "number", + "format": "double" }, - "stretch_mode": { - "$ref": "#/definitions/cephOsdDumpStretchMode" + "average_primary_affinity_weighted": { + "type": "number", + "format": "double" } } }, - "cephGetCephStatusResponse": { + "cephOsdDumpStretchMode": { "type": "object", "properties": { - "fsid": { - "type": "string" + "stretch_mode_enabled": { + "type": "boolean" }, - "health": { - "$ref": "#/definitions/cephCephStatusHealth" + "stretch_bucket_count": { + "type": "integer", + "format": "int32" }, - "election_epoch": { + "degraded_stretch_mode": { "type": "integer", "format": "int32" }, - "quorum": { - "type": "array", - "items": { - "type": "integer", - "format": "int32" - } + "recovering_stretch_mode": { + "type": "integer", + "format": "int32" }, - "quorum_names": { + "stretch_mode_bucket": { + "type": "integer", + "format": "int32" + } + } + }, + "cephOsdStats": { + "type": "object", + "properties": { + "osd": { + "type": "string", + "format": "int64" + }, + "up_from": { + "type": "string", + "format": "int64" + }, + "seq": { + "type": "string", + "format": "int64" + }, + "num_pgs": { + "type": "string", + "format": "int64" + }, + "num_osds": { + "type": "string", + "format": "int64" + }, + "num_per_pool_osds": { + "type": "string", + "format": "int64" + }, + "num_per_pool_omap_osds": { + "type": "string", + "format": "int64" + }, + "kb": { + "type": "string", + "format": "int64" + }, + "kb_used": { + "type": "string", + "format": "int64" + }, + "kb_used_data": { + "type": "string", + "format": "int64" + }, + "kb_used_omap": { + "type": "string", + "format": "int64" + }, + "kb_used_meta": { + "type": "string", + "format": "int64" + }, + "kb_avail": { + "type": "string", + "format": "int64" + }, + "statfs": { + "$ref": "#/definitions/cephOsdStatsStatFs" + }, + "hb_peers": { "type": "array", "items": { - "type": "string" + "type": "string", + "format": "int64" } }, - "quorum_age": { - "type": "integer", - "format": "int32" - }, - "monmap": { - "$ref": "#/definitions/cephCephStatusMonMap" + "snap_trim_queue_len": { + "type": "string", + "format": "int64" }, - "osdmap": { - "$ref": "#/definitions/cephCephStatusOSDMap" + "num_snap_trimming": { + "type": "string", + "format": "int64" }, - "pgmap": { - "$ref": "#/definitions/cephCephStatusPGMap" + "num_shards_repaired": { + "type": "string", + "format": "int64" }, - "fsmap": { - "$ref": "#/definitions/cephCephStatusFSMap" + "op_queue_age_hist": { + "$ref": "#/definitions/cephOsdStatsOpQueueAgeHist" }, - "mgrmap": { - "$ref": "#/definitions/cephCephStatusMgrMap" + "perf_stat": { + "$ref": "#/definitions/cephOsdStatsPerfStat" }, - "servicemap": { - "$ref": "#/definitions/cephCephStatusServiceMap" + "alerts": { + "type": "array", + "items": { + "type": "string" + } }, - "progress_events": { - "type": "object" - } - } - }, - "cephListRulesResponse": { - "type": "object", - "properties": { - "rules": { + "network_ping_times": { "type": "array", "items": { "type": "object", - "$ref": "#/definitions/cephRule" + "$ref": "#/definitions/cephOsdStatsNetworkPingTime" } } - }, - "title": "LIST RULES" + } }, - "cephLoginReq": { + "cephOsdStatsNetworkPingTime": { "type": "object", "properties": { - "username": { - "type": "string" + "osd": { + "type": "string", + "format": "int64" }, - "password": { + "last_update": { "type": "string" + }, + "interfaces": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdStatsNetworkPingTimeInterface" + } } } }, - "cephLoginResp": { + "cephOsdStatsNetworkPingTimeInterface": { "type": "object", "properties": { - "token": { - "type": "string" - }, - "username": { + "interface_name": { "type": "string" }, - "pwd_update_required": { - "type": "boolean" + "average": { + "$ref": "#/definitions/cephOsdStatsNetworkPingTimeInterfaceAverage" }, - "pwd_expiration_date": { - "type": "string", - "format": "date-time" + "min": { + "$ref": "#/definitions/cephOsdStatsNetworkPingTimeInterfaceMin" }, - "sso": { - "type": "boolean" + "max": { + "$ref": "#/definitions/cephOsdStatsNetworkPingTimeInterfaceMax" }, - "permissions": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "object" - } - } + "last": { + "type": "number", + "format": "double" } } }, - "cephOsdDumpAddrVec": { + "cephOsdStatsNetworkPingTimeInterfaceAverage": { "type": "object", "properties": { - "type": { - "type": "string" + "min1": { + "type": "number", + "format": "double" }, - "addr": { - "type": "string" + "min5": { + "type": "number", + "format": "double" }, - "nonce": { - "type": "string", - "format": "uint64" + "min15": { + "type": "number", + "format": "double" } } }, - "cephOsdDumpClusterAddrs": { + "cephOsdStatsNetworkPingTimeInterfaceMax": { "type": "object", "properties": { - "addrvec": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpAddrVec" - } + "min1": { + "type": "number", + "format": "double" + }, + "min5": { + "type": "number", + "format": "double" + }, + "min15": { + "type": "number", + "format": "double" } } }, - "cephOsdDumpErasureCodeProfile": { + "cephOsdStatsNetworkPingTimeInterfaceMin": { "type": "object", "properties": { - "k": { - "type": "string" - }, - "m": { - "type": "string" + "min1": { + "type": "number", + "format": "double" }, - "plugin": { - "type": "string" + "min5": { + "type": "number", + "format": "double" }, - "technique": { - "type": "string" + "min15": { + "type": "number", + "format": "double" } } }, - "cephOsdDumpHeartbeatAddrs": { + "cephOsdStatsOpQueueAgeHist": { "type": "object", "properties": { - "addrvec": { + "histogram": { "type": "array", "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpAddrVec" + "type": "string", + "format": "int64" } + }, + "upper_bound": { + "type": "string", + "format": "int64" } } }, - "cephOsdDumpHitSetParams": { - "type": "object", - "properties": { - "type": { - "type": "string" - } - } - }, - "cephOsdDumpLastPgMergeMeta": { + "cephOsdStatsPerfStat": { "type": "object", "properties": { - "source_pgid": { - "type": "string" - }, - "ready_epoch": { - "type": "integer", - "format": "int32" - }, - "last_epoch_started": { - "type": "integer", - "format": "int32" + "commit_latency_ms": { + "type": "string", + "format": "int64" }, - "last_epoch_clean": { - "type": "integer", - "format": "int32" + "apply_latency_ms": { + "type": "string", + "format": "int64" }, - "source_version": { - "type": "string" + "commit_latency_ns": { + "type": "string", + "format": "int64" }, - "target_version": { - "type": "string" + "apply_latency_ns": { + "type": "string", + "format": "int64" } } }, - "cephOsdDumpOsdInfo": { + "cephOsdStatsStatFs": { "type": "object", "properties": { - "osd": { - "type": "integer", - "format": "int32" - }, - "uuid": { - "type": "string" + "total": { + "type": "string", + "format": "int64" }, - "up": { - "type": "integer", - "format": "int32" + "available": { + "type": "string", + "format": "int64" }, - "in": { - "type": "integer", - "format": "int32" + "internally_reserved": { + "type": "string", + "format": "int64" }, - "weight": { - "type": "number", - "format": "double" + "allocated": { + "type": "string", + "format": "int64" }, - "primary_affinity": { - "type": "number", - "format": "double" + "data_stored": { + "type": "string", + "format": "int64" }, - "last_clean_begin": { - "type": "integer", - "format": "int32" + "data_compressed": { + "type": "string", + "format": "int64" }, - "last_clean_end": { - "type": "integer", - "format": "int32" + "data_compressed_allocated": { + "type": "string", + "format": "int64" }, - "up_from": { - "type": "integer", - "format": "int32" + "data_compressed_original": { + "type": "string", + "format": "int64" }, - "up_thru": { - "type": "integer", - "format": "int32" + "omap_allocated": { + "type": "string", + "format": "int64" }, - "down_at": { - "type": "integer", - "format": "int32" + "internal_metadata": { + "type": "string", + "format": "int64" + } + } + }, + "cephPGMap": { + "type": "object", + "properties": { + "version": { + "type": "string", + "format": "int64" }, - "lost_at": { - "type": "integer", - "format": "int32" + "stamp": { + "type": "string", + "format": "date-time" }, - "public_addrs": { - "$ref": "#/definitions/cephOsdDumpPublicAddrs" + "last_osdmap_epoch": { + "type": "string", + "format": "int64" }, - "cluster_addrs": { - "$ref": "#/definitions/cephOsdDumpClusterAddrs" + "last_pg_scan": { + "type": "string", + "format": "int64" }, - "heartbeat_back_addrs": { - "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" + "pg_stats_sum": { + "$ref": "#/definitions/cephPGStatsSum" }, - "heartbeat_front_addrs": { - "$ref": "#/definitions/cephOsdDumpHeartbeatAddrs" + "osd_stats_sum": { + "$ref": "#/definitions/cephOSDStatsSum" }, - "public_addr": { - "type": "string" + "pg_stats_delta": { + "$ref": "#/definitions/cephPGStatsDelta" }, - "cluster_addr": { - "type": "string" + "pg_stats": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephPGStat" + } }, - "heartbeat_back_addr": { - "type": "string" + "pool_stats": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephPoolStats" + } }, - "heartbeat_front_addr": { - "type": "string" + "osd_stats": { + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephOsdStats" + } }, - "state": { + "pool_statfs": { "type": "array", "items": { - "type": "string" + "type": "object", + "$ref": "#/definitions/cephPoolStatFs" } } } }, - "cephOsdDumpOsdXInfo": { + "cephPGStat": { "type": "object", "properties": { - "osd": { - "type": "integer", - "format": "int32" + "pgid": { + "type": "string" }, - "down_stamp": { + "version": { + "type": "string" + }, + "reported_seq": { + "type": "string", + "format": "int64" + }, + "reported_epoch": { + "type": "string", + "format": "int64" + }, + "state": { + "type": "string" + }, + "last_fresh": { "type": "string", "format": "date-time" }, - "laggy_probability": { - "type": "number", - "format": "double" + "last_change": { + "type": "string", + "format": "date-time" }, - "laggy_interval": { - "type": "number", - "format": "double" + "last_active": { + "type": "string", + "format": "date-time" }, - "features": { + "last_peered": { "type": "string", - "format": "uint64" + "format": "date-time" }, - "old_weight": { - "type": "number", - "format": "double" + "last_clean": { + "type": "string", + "format": "date-time" }, - "last_purged_snaps_scrub": { + "last_became_active": { "type": "string", "format": "date-time" }, - "dead_epoch": { - "type": "integer", - "format": "int32" - } - } - }, - "cephOsdDumpPool": { - "type": "object", - "properties": { - "pool": { - "type": "integer", - "format": "int32" + "last_became_peered": { + "type": "string", + "format": "date-time" }, - "pool_name": { - "type": "string" + "last_unstale": { + "type": "string", + "format": "date-time" }, - "create_time": { + "last_undegraded": { "type": "string", "format": "date-time" }, - "flags": { + "last_fullsized": { + "type": "string", + "format": "date-time" + }, + "mapping_epoch": { "type": "string", "format": "int64" }, - "flags_names": { + "log_start": { "type": "string" }, - "type": { - "type": "integer", - "format": "int32" - }, - "size": { - "type": "integer", - "format": "int32" - }, - "min_size": { - "type": "integer", - "format": "int32" + "ondisk_log_start": { + "type": "string" }, - "crush_rule": { - "type": "integer", - "format": "int32" + "created": { + "type": "string", + "format": "int64" }, - "peering_crush_bucket_count": { - "type": "integer", - "format": "int32" + "last_epoch_clean": { + "type": "string", + "format": "int64" }, - "peering_crush_bucket_target": { - "type": "integer", - "format": "int32" + "parent": { + "type": "string" }, - "peering_crush_bucket_barrier": { - "type": "integer", - "format": "int32" + "parent_split_bits": { + "type": "string", + "format": "int64" }, - "peering_crush_bucket_mandatory_member": { - "type": "integer", - "format": "int32" + "last_scrub": { + "type": "string" }, - "object_hash": { - "type": "integer", - "format": "int32" + "last_scrub_stamp": { + "type": "string", + "format": "date-time" }, - "pg_autoscale_mode": { + "last_deep_scrub": { "type": "string" }, - "pg_num": { - "type": "integer", - "format": "int32" + "last_deep_scrub_stamp": { + "type": "string", + "format": "date-time" }, - "pg_placement_num": { - "type": "integer", - "format": "int32" + "last_clean_scrub_stamp": { + "type": "string", + "format": "date-time" }, - "pg_placement_num_target": { - "type": "integer", - "format": "int32" + "objects_scrubbed": { + "type": "string", + "format": "int64" }, - "pg_num_target": { - "type": "integer", - "format": "int32" + "log_size": { + "type": "string", + "format": "int64" }, - "pg_num_pending": { - "type": "integer", - "format": "int32" + "log_dups_size": { + "type": "string", + "format": "int64" }, - "last_pg_merge_meta": { - "$ref": "#/definitions/cephOsdDumpLastPgMergeMeta" + "ondisk_log_size": { + "type": "string", + "format": "int64" }, - "last_change": { - "type": "string" + "stats_invalid": { + "type": "boolean" }, - "last_force_op_resend": { - "type": "string" + "dirty_stats_invalid": { + "type": "boolean" }, - "last_force_op_resend_prenautilus": { - "type": "string" + "omap_stats_invalid": { + "type": "boolean" }, - "last_force_op_resend_preluminous": { - "type": "string" + "hitset_stats_invalid": { + "type": "boolean" }, - "auid": { - "type": "string", - "format": "uint64" + "hitset_bytes_stats_invalid": { + "type": "boolean" }, - "snap_mode": { - "type": "string" + "pin_stats_invalid": { + "type": "boolean" }, - "snap_seq": { - "type": "string", - "format": "uint64" + "manifest_stats_invalid": { + "type": "boolean" }, - "snap_epoch": { + "snaptrimq_len": { "type": "string", - "format": "uint64" + "format": "int64" }, - "pool_snaps": { - "type": "array", - "items": {} + "last_scrub_duration": { + "type": "string", + "format": "int64" }, - "removed_snaps": { + "scrub_schedule": { "type": "string" }, - "quota_max_bytes": { - "type": "string", - "format": "uint64" + "scrub_duration": { + "type": "number", + "format": "double" }, - "quota_max_objects": { + "objects_trimmed": { "type": "string", - "format": "uint64" + "format": "int64" }, - "tiers": { + "snaptrim_duration": { + "type": "number", + "format": "double" + }, + "stat_sum": { + "$ref": "#/definitions/PGStatPGStat_StatSum" + }, + "up": { "type": "array", "items": { - "type": "integer", - "format": "int32" + "type": "string", + "format": "int64" } }, - "tier_of": { - "type": "integer", - "format": "int32" + "acting": { + "type": "array", + "items": { + "type": "string", + "format": "int64" + } }, - "read_tier": { - "type": "integer", - "format": "int32" + "avail_no_missing": { + "type": "array", + "items": { + "type": "string", + "format": "int64" + } }, - "write_tier": { - "type": "integer", - "format": "int32" + "object_location_counts": { + "type": "array", + "items": { + "type": "string", + "format": "int64" + } }, - "cache_mode": { - "type": "string" + "blocked_by": { + "type": "array", + "items": { + "type": "string", + "format": "int64" + } }, - "target_max_bytes": { + "up_primary": { "type": "string", - "format": "uint64" + "format": "int64" }, - "target_max_objects": { + "acting_primary": { "type": "string", - "format": "uint64" + "format": "int64" }, - "cache_target_dirty_ratio_micro": { + "purged_snaps": { + "type": "array", + "items": { + "type": "string", + "format": "int64" + } + } + } + }, + "cephPGStatsDelta": { + "type": "object", + "properties": { + "stat_sum": { + "$ref": "#/definitions/PGStatsDeltaPGStatsDelta_StatSum" + }, + "store_stats": { + "$ref": "#/definitions/PGStatsDeltaPGStatsDelta_StoreStats" + }, + "log_size": { "type": "string", - "format": "uint64" + "format": "int64" }, - "cache_target_dirty_high_ratio_micro": { + "ondisk_log_size": { "type": "string", - "format": "uint64" + "format": "int64" }, - "cache_target_full_ratio_micro": { + "up": { "type": "string", - "format": "uint64" + "format": "int64" }, - "cache_min_flush_age": { + "acting": { "type": "string", - "format": "uint64" + "format": "int64" }, - "cache_min_evict_age": { + "num_store_stats": { "type": "string", - "format": "uint64" + "format": "int64" }, - "erasure_code_profile": { + "stamp_delta": { "type": "string" + } + } + }, + "cephPGStatsSum": { + "type": "object", + "properties": { + "stat_sum": { + "$ref": "#/definitions/PGStatsSumPGStatsSum_StatSum" }, - "hit_set_params": { - "$ref": "#/definitions/cephOsdDumpHitSetParams" + "store_stats": { + "$ref": "#/definitions/PGStatsSumPGStatsSum_StoreStats" }, - "hit_set_period": { + "log_size": { "type": "string", - "format": "uint64" + "format": "int64" }, - "hit_set_count": { + "ondisk_log_size": { "type": "string", - "format": "uint64" + "format": "int64" }, - "use_gmt_hitset": { - "type": "boolean" + "up": { + "type": "string", + "format": "int64" }, - "min_read_recency_for_promote": { + "acting": { "type": "string", - "format": "uint64" + "format": "int64" }, - "min_write_recency_for_promote": { + "num_store_stats": { "type": "string", - "format": "uint64" + "format": "int64" + } + } + }, + "cephPoolStatFs": { + "type": "object", + "properties": { + "poolid": { + "type": "string", + "format": "int64" }, - "hit_set_grade_decay_rate": { + "osd": { "type": "string", - "format": "uint64" + "format": "int64" }, - "hit_set_search_last_n": { + "total": { "type": "string", - "format": "uint64" + "format": "int64" }, - "grade_table": { - "type": "array", - "items": {} + "available": { + "type": "string", + "format": "int64" }, - "stripe_width": { + "internally_reserved": { "type": "string", - "format": "uint64" + "format": "int64" }, - "expected_num_objects": { + "allocated": { "type": "string", - "format": "uint64" + "format": "int64" }, - "fast_read": { - "type": "boolean" + "data_stored": { + "type": "string", + "format": "int64" }, - "options": { - "type": "object" + "data_compressed": { + "type": "string", + "format": "int64" }, - "application_metadata": { - "type": "object" + "data_compressed_allocated": { + "type": "string", + "format": "int64" }, - "read_balance": { - "$ref": "#/definitions/cephOsdDumpReadBalance" - } - } - }, - "cephOsdDumpPublicAddrs": { - "type": "object", - "properties": { - "addrvec": { - "type": "array", - "items": { - "type": "object", - "$ref": "#/definitions/cephOsdDumpAddrVec" - } + "data_compressed_original": { + "type": "string", + "format": "int64" + }, + "omap_allocated": { + "type": "string", + "format": "int64" + }, + "internal_metadata": { + "type": "string", + "format": "int64" } } }, - "cephOsdDumpReadBalance": { + "cephPoolStats": { "type": "object", "properties": { - "score_acting": { - "type": "number", - "format": "double" - }, - "score_stable": { - "type": "number", - "format": "double" - }, - "optimal_score": { - "type": "number", - "format": "double" - }, - "raw_score_acting": { - "type": "number", - "format": "double" + "poolid": { + "type": "string", + "format": "int64" }, - "raw_score_stable": { - "type": "number", - "format": "double" + "num_pg": { + "type": "string", + "format": "int64" }, - "primary_affinity_weighted": { - "type": "number", - "format": "double" + "stat_sum": { + "$ref": "#/definitions/PoolStatsPoolStats_StatSum" }, - "average_primary_affinity": { - "type": "number", - "format": "double" + "store_stats": { + "$ref": "#/definitions/PoolStatsPoolStats_StoreStats" }, - "average_primary_affinity_weighted": { - "type": "number", - "format": "double" - } - } - }, - "cephOsdDumpStretchMode": { - "type": "object", - "properties": { - "stretch_mode_enabled": { - "type": "boolean" + "log_size": { + "type": "string", + "format": "int64" }, - "stretch_bucket_count": { - "type": "integer", - "format": "int32" + "ondisk_log_size": { + "type": "string", + "format": "int64" }, - "degraded_stretch_mode": { - "type": "integer", - "format": "int32" + "up": { + "type": "string", + "format": "int64" }, - "recovering_stretch_mode": { - "type": "integer", - "format": "int32" + "acting": { + "type": "string", + "format": "int64" }, - "stretch_mode_bucket": { - "type": "integer", - "format": "int32" + "num_store_stats": { + "type": "string", + "format": "int64" } } }, @@ -2484,6 +4299,9 @@ "type": "object" } } + }, + "system": { + "type": "boolean" } } }, @@ -2596,15 +4414,14 @@ "type": "object", "properties": { "capabilities": { - "type": "object", - "additionalProperties": { - "type": "string" - }, - "title": "user capabilities, e.g: {\"mon\": \"allow r\",\"osd\":\"allow rw pool=liverpool\"}" + "type": "array", + "items": { + "type": "object", + "$ref": "#/definitions/cephClusterUserCap" + } }, "user_entity": { - "type": "string", - "title": "entity, e.g: \"client.admin\"" + "type": "string" } } }, diff --git a/api/users.proto b/api/users.proto index d398a05..0ba7acf 100644 --- a/api/users.proto +++ b/api/users.proto @@ -33,6 +33,7 @@ message Role { string name =1; optional string description=2; map scopes_permissions=3 [json_name = "scopes_permissions"]; + bool system =4; } message GetRoleReq{ diff --git a/pkg/api/cluster_api_handlers.go b/pkg/api/cluster_api_handlers.go index 44db013..aca313f 100644 --- a/pkg/api/cluster_api_handlers.go +++ b/pkg/api/cluster_api_handlers.go @@ -1,7 +1,6 @@ package api import ( - "bytes" "context" "encoding/json" "errors" @@ -47,7 +46,7 @@ func (c *clusterAPI) ExportUser(ctx context.Context, req *pb.ExportClusterUserRe if err := user.HasPermissions(ctx, user.ScopeConfigOpt, user.PermRead); err != nil { return nil, err } - buf := bytes.NewBuffer(nil) + var buf strings.Builder for _, entity := range req.Entities { const monCmdTeml = `{"prefix": "auth export", "entity": "%s"}` monCmd := fmt.Sprintf(monCmdTeml, entity) @@ -59,7 +58,7 @@ func (c *clusterAPI) ExportUser(ctx context.Context, req *pb.ExportClusterUserRe buf.Write(res) buf.WriteRune('\n') } - return &pb.ExportClusterUserResp{Data: buf.Bytes()}, nil + return &pb.ExportClusterUserResp{Data: buf.String()}, nil } func (c *clusterAPI) CreateUser(ctx context.Context, req *pb.CreateClusterUserReq) (*emptypb.Empty, error) { @@ -78,8 +77,8 @@ func (c *clusterAPI) CreateUser(ctx context.Context, req *pb.CreateClusterUserRe const cmdTempl = `{"prefix": "auth add", "entity": "%s", "caps": [%s]}` caps := make([]string, 0, len(req.Capabilities)*2) - for k, v := range req.Capabilities { - caps = append(caps, strconv.Quote(k), strconv.Quote(v)) + for _, cuc := range req.Capabilities { + caps = append(caps, strconv.Quote(cuc.Entity), strconv.Quote(cuc.Cap)) } monCmd := fmt.Sprintf(cmdTempl, req.UserEntity, strings.Join(caps, ",")) _, err := c.radosSvc.ExecMon(ctx, monCmd) @@ -108,6 +107,11 @@ func (c *clusterAPI) GetUsers(ctx context.Context, _ *emptypb.Empty) (*pb.Cluste if err != nil { return nil, err } + // Match dashboard: it serializes the cephx key via SecretStr, + // which renders as 11 asterisks. See dashboard _crud.serialize. + for _, u := range res.AuthDump { + u.Key = "***********" + } return &pb.ClusterUsers{Users: res.AuthDump}, nil } @@ -117,8 +121,8 @@ func (c *clusterAPI) UpdateUser(ctx context.Context, req *pb.UpdateClusterUserRe } const cmdTempl = `{"prefix": "auth caps", "entity": "%s", "caps": [%s]}` caps := make([]string, 0, len(req.Capabilities)*2) - for k, v := range req.Capabilities { - caps = append(caps, strconv.Quote(k), strconv.Quote(v)) + for _, cuc := range req.Capabilities { + caps = append(caps, strconv.Quote(cuc.Entity), strconv.Quote(cuc.Cap)) } monCmd := fmt.Sprintf(cmdTempl, req.UserEntity, strings.Join(caps, ",")) _, err := c.radosSvc.ExecMon(ctx, monCmd) diff --git a/pkg/api/users_api_handlers.go b/pkg/api/users_api_handlers.go index 35d268a..63c875c 100644 --- a/pkg/api/users_api_handlers.go +++ b/pkg/api/users_api_handlers.go @@ -94,6 +94,7 @@ func roleToPb(r user.Role) *pb.Role { Name: r.Name, Description: r.Description, ScopesPermissions: permissions, + System: r.IsSystem, } } diff --git a/pkg/user/system_roles.go b/pkg/user/system_roles.go index 081fd93..b439628 100644 --- a/pkg/user/system_roles.go +++ b/pkg/user/system_roles.go @@ -150,6 +150,12 @@ const ( "read", "update" ], + "nvme-of": [ + "create", + "delete", + "read", + "update" + ], "osd": [ "create", "delete", @@ -222,6 +228,12 @@ const ( ], "grafana": [ "read" + ], + "nvme-of": [ + "read", + "create", + "update", + "delete" ] }, "system": true @@ -284,6 +296,9 @@ const ( ], "grafana": [ "read" + ], + "prometheus": [ + "read" ] }, "system": true @@ -360,6 +375,9 @@ const ( "nfs-ganesha": [ "read" ], + "nvme-of": [ + "read" + ], "osd": [ "read" ], diff --git a/test/cluster_api_test.go b/test/cluster_api_test.go index 6f07074..dfad056 100644 --- a/test/cluster_api_test.go +++ b/test/cluster_api_test.go @@ -46,7 +46,7 @@ func Test_ClusterUsers(t *testing.T) { r.NoError(err, "get all users") _, err = client.CreateUser(tstCtx, &pb.CreateClusterUserReq{ - Capabilities: map[string]string{"mon": "allow r"}, + Capabilities: []*pb.ClusterUserCap{{Entity: "mon", Cap: "allow r"}}, UserEntity: user, }) r.NoError(err, "create a new test user %s", user) @@ -71,17 +71,17 @@ func Test_ClusterUsers(t *testing.T) { exp, err := client.ExportUser(tstCtx, &pb.ExportClusterUserReq{Entities: []string{user}}) r.NoError(err, "new user can be exported") - r.Contains(string(exp.Data), `mon = "allow r"`, "new user export conains correct caps") + r.Contains(exp.Data, `mon = "allow r"`, "new user export conains correct caps") _, err = client.UpdateUser(tstCtx, &pb.UpdateClusterUserReq{ UserEntity: user, - Capabilities: map[string]string{"mon": "allow w"}}) + Capabilities: []*pb.ClusterUserCap{{Entity: "mon", Cap: "allow w"}}}) r.NoError(err, "new user caps updated") exp, err = client.ExportUser(tstCtx, &pb.ExportClusterUserReq{Entities: []string{user}}) r.NoError(err) - r.Contains(string(exp.Data), `mon = "allow w"`, "export contains updated caps") - r.NotContains(string(exp.Data), `mon = "allow r"`, "export does not contains old caps") + r.Contains(exp.Data, `mon = "allow w"`, "export contains updated caps") + r.NotContains(exp.Data, `mon = "allow r"`, "export does not contains old caps") users2, err = client.GetUsers(tstCtx, &emptypb.Empty{}) r.NoError(err) @@ -114,7 +114,7 @@ func Test_ClusterUsers(t *testing.T) { } r.Nil(created, "user was removed from list") - _, err = client.CreateUser(tstCtx, &pb.CreateClusterUserReq{ImportData: exp.Data}) + _, err = client.CreateUser(tstCtx, &pb.CreateClusterUserReq{ImportData: []byte(exp.Data)}) r.NoError(err, "user was imported back from export data") users2, err = client.GetUsers(tstCtx, &emptypb.Empty{}) diff --git a/test/cluster_parity_test.go b/test/cluster_parity_test.go index c80d627..1963360 100644 --- a/test/cluster_parity_test.go +++ b/test/cluster_parity_test.go @@ -10,16 +10,21 @@ import ( "github.com/stretchr/testify/require" ) -const clusterAccept = "application/vnd.ceph.api.v0.1+json" +// /api/cluster uses v0.1; /api/cluster/user* uses v1.0. Dashboard +// returns 415 if the Accept does not match the per-route version. +const ( + clusterStatusAccept = "application/vnd.ceph.api.v0.1+json" + clusterUserAccept = "application/vnd.ceph.api.v1.0+json" +) func Test_Parity_Cluster_Status(t *testing.T) { r := parity.New(t) - get := parity.Call{Method: "GET", Path: "/api/cluster", Accept: clusterAccept} + get := parity.Call{Method: "GET", Path: "/api/cluster", Accept: clusterStatusAccept} put := parity.Call{ Method: "PUT", Path: "/api/cluster", Body: map[string]string{"status": "POST_INSTALLED"}, - Accept: clusterAccept, + Accept: clusterStatusAccept, } for _, b := range r.Backends(get) { @@ -33,14 +38,14 @@ func Test_Parity_Cluster_Status(t *testing.T) { r.Do(parity.Ours, parity.Call{ Method: "PUT", Path: "/api/cluster", Body: map[string]string{"status": "INSTALLED"}, - Accept: clusterAccept, + Accept: clusterStatusAccept, }) }) } func Test_Parity_Cluster_ConfigSearch(t *testing.T) { r := parity.New(t) - call := parity.Call{Method: "GET", Path: "/api/cluster/config/search", Accept: clusterAccept} + call := parity.Call{Method: "GET", Path: "/api/cluster/config/search", Accept: clusterStatusAccept} for _, b := range r.Backends(call) { r.DoRecord(b, call) } @@ -52,29 +57,27 @@ func Test_Parity_Cluster_Users_CRUD(t *testing.T) { const entity = "client.parity-cluster-user" createBody := map[string]any{ "user_entity": entity, - "capabilities": map[string]string{"mon": "allow r"}, + "capabilities": []map[string]string{{"entity": "mon", "cap": "allow r"}}, } updateBody := map[string]any{ "user_entity": entity, - "capabilities": map[string]string{"mon": "allow rw"}, + "capabilities": []map[string]string{{"entity": "mon", "cap": "allow rw"}}, } exportBody := map[string]any{"entities": []string{entity}} - list := parity.Call{Method: "GET", Path: "/api/cluster/user", Accept: clusterAccept} - create := parity.Call{Method: "POST", Path: "/api/cluster/user", Body: createBody, Accept: clusterAccept} - update := parity.Call{Method: "PUT", Path: "/api/cluster/user", Body: updateBody, Accept: clusterAccept} - export := parity.Call{Method: "POST", Path: "/api/cluster/user/export", Body: exportBody, Accept: clusterAccept} + list := parity.Call{Method: "GET", Path: "/api/cluster/user", Accept: clusterUserAccept} + create := parity.Call{Method: "POST", Path: "/api/cluster/user", Body: createBody, Accept: clusterUserAccept} + update := parity.Call{Method: "PUT", Path: "/api/cluster/user", Body: updateBody, Accept: clusterUserAccept} + export := parity.Call{Method: "POST", Path: "/api/cluster/user/export", Body: exportBody, Accept: clusterUserAccept} del := parity.Call{ Method: "DELETE", Path: "/api/cluster/user/{user_entity}", PathParams: map[string]string{"user_entity": entity}, - Accept: clusterAccept, + Accept: clusterUserAccept, } r.Do(parity.Ours, del) t.Cleanup(func() { r.Do(parity.Ours, del) }) - // Each call's Backends decides which sides to drive; missing - // dashboard counterpart -> [Ours] only. for _, b := range r.Backends(list) { r.DoRecord(b, list) resp, _ := r.DoRecord(b, create) diff --git a/test/crush_rule_parity_test.go b/test/crush_rule_parity_test.go index aff37a0..f10f330 100644 --- a/test/crush_rule_parity_test.go +++ b/test/crush_rule_parity_test.go @@ -10,11 +10,16 @@ import ( "github.com/stretchr/testify/require" ) -const crushRuleAccept = "application/vnd.ceph.api.v2.0+json" +// Reads use v2.0; mutations use v1.0. Dashboard returns 415 if the +// Accept does not match the per-route version. +const ( + crushRuleReadAccept = "application/vnd.ceph.api.v2.0+json" + crushRuleWriteAccept = "application/vnd.ceph.api.v1.0+json" +) func Test_Parity_CrushRule_List(t *testing.T) { r := parity.New(t) - call := parity.Call{Method: "GET", Path: "/api/crush_rule", Accept: crushRuleAccept} + call := parity.Call{Method: "GET", Path: "/api/crush_rule", Accept: crushRuleReadAccept} for _, b := range r.Backends(call) { r.DoRecord(b, call) } @@ -25,7 +30,7 @@ func Test_Parity_CrushRule_Get(t *testing.T) { get := parity.Call{ Method: "GET", Path: "/api/crush_rule/{name}", PathParams: map[string]string{"name": "replicated_rule"}, - Accept: crushRuleAccept, + Accept: crushRuleReadAccept, } for _, b := range r.Backends(get) { r.DoRecord(b, get) @@ -42,10 +47,10 @@ func Test_Parity_CrushRule_CRUD(t *testing.T) { "failure_domain": "osd", "device_class": "", } - create := parity.Call{Method: "POST", Path: "/api/crush_rule", Body: createBody, Accept: crushRuleAccept} + create := parity.Call{Method: "POST", Path: "/api/crush_rule", Body: createBody, Accept: crushRuleWriteAccept} del := parity.Call{ Method: "DELETE", Path: "/api/crush_rule/{name}", - PathParams: map[string]string{"name": name}, Accept: crushRuleAccept, + PathParams: map[string]string{"name": name}, Accept: crushRuleWriteAccept, } r.Do(parity.Ours, del) diff --git a/test/parity/api_diff.yaml b/test/parity/api_diff.yaml index b38e3d7..0f7d83d 100644 --- a/test/parity/api_diff.yaml +++ b/test/parity/api_diff.yaml @@ -1,19 +1,127 @@ # Declared divergences between the ceph dashboard and ceph-api response -# bodies. Keys are endpoint ids in the form " " as -# they appear in inventory.yaml (e.g. "GET /api/role/{name}"). Values are -# lists of JSONPath ignores with a mandatory `reason:`. +# bodies. Keys are endpoint ids in the form " " +# (as in api/http.yaml); values are lists of JSONPath ignores with +# mandatory `reason:` strings. # -# This file IS the migration guide for dashboard clients: every entry is -# something a client switching from the dashboard to ceph-api would -# observe. +# Every entry IS the migration guide for dashboard clients — something +# a client switching from the dashboard to ceph-api would observe. # -# JSONPath subset: $ root, . descent, * wildcard for "any array index or -# map key" at a single position. See test/parity/diff.go for the matcher. -# -# Example: -# "GET /api/cluster": -# - path: $.uptime -# reason: live; varies between calls -# -# Empty until Phase 2.3 walks the parity tests endpoint by endpoint and -# decides what we promise to match vs intentionally diverge. +# JSONPath subset: $ root, . descent, * wildcard for "any array index +# or map key" at a single position. See test/parity/diff.go for the +# matcher. A `$` (root) ignore additionally suppresses the body-presence +# and status-class checks — used as a transitional marker for endpoints +# whose response (or request) shape is known divergent. Each one is a +# debt: walk them in the next iteration and either match the dashboard +# or document a hard reason why we can't. + +# /api/cluster/user — POST/PUT bodies still diverge: dashboard returns +# a status-string ("Successfully created/edited user '..'"), ceph-api +# returns Empty. Same CUD-returns-resource debt as /api/role and /api/user. +"POST /api/cluster/user": + - path: $ + reason: dashboard returns a status-string body; ceph-api returns Empty. CUD-returns-resource debt. +"PUT /api/cluster/user": + - path: $ + reason: dashboard returns a status-string body; ceph-api returns Empty. CUD-returns-resource debt. +"POST /api/cluster/user/export": + - path: $ + reason: each backend's `POST /api/cluster/user` calls `auth add` independently and ceph generates a fresh random cephx key per create; the exported body differs only in the key value. To close, seed both creates with import_data carrying a fixed key. + +# /api/crush_rule — proto Rule serializes int64 fields as strings +# (protojson convention), and models step as `map entries` +# while the dashboard returns typed step fields. Fix wants a proto rework. +"GET /api/crush_rule": + - path: $.*.rule_id + reason: protojson serializes proto int64 as string; dashboard returns integer. + - path: $.*.type + reason: same int64-as-string protojson convention. + - path: $.*.ruleset + reason: ceph-api proto Rule emits ruleset 0 as string; dashboard returns the real CRUSH ruleset integer. + - path: $.*.min_size + reason: ceph-api proto Rule emits min_size as string; dashboard returns integer. + - path: $.*.max_size + reason: ceph-api proto Rule emits max_size as string; dashboard returns integer. + - path: $.*.steps.*.entries + reason: ceph-api Step is `map entries`; dashboard returns typed step fields (op/item/item_name/num/type). + - path: $.*.steps.*.op + reason: typed step field not represented in ceph-api proto. See $.*.steps.*.entries. + - path: $.*.steps.*.item + reason: see $.*.steps.*.entries. + - path: $.*.steps.*.item_name + reason: see $.*.steps.*.entries. + - path: $.*.steps.*.num + reason: see $.*.steps.*.entries. + - path: $.*.steps.*.type + reason: see $.*.steps.*.entries. + +"GET /api/crush_rule/{name}": + - path: $.rule_id + reason: protojson serializes proto int64 as string; dashboard returns integer. + - path: $.type + reason: same int64-as-string protojson convention. + - path: $.ruleset + reason: ceph-api proto Rule emits 0 as string; dashboard returns the real CRUSH ruleset integer. + - path: $.min_size + reason: ceph-api proto Rule emits min_size as string; dashboard returns integer. + - path: $.max_size + reason: ceph-api proto Rule emits max_size as string; dashboard returns integer. + - path: $.steps.*.entries + reason: ceph-api Step is map entries; dashboard returns typed step fields. + - path: $.steps.*.op + reason: see $.steps.*.entries. + - path: $.steps.*.item + reason: see $.steps.*.entries. + - path: $.steps.*.item_name + reason: see $.steps.*.entries. + - path: $.steps.*.num + reason: see $.steps.*.entries. + - path: $.steps.*.type + reason: see $.steps.*.entries. + +"POST /api/crush_rule": + - path: $ + reason: dashboard returns the created Rule resource; ceph-api returns Empty. Could match if CreateRule returns the rule. + +# /api/user — dashboard's User module uses camelCase +# (lastUpdate/pwdUpdateRequired/pwdExpirationDate); ceph-api emits +# snake_case via UseProtoNames. Either side has to break convention to +# converge. The list-length divergence is dashboard caching its user +# table at startup. +"GET /api/user": + - path: $ + reason: dashboard's User module is the lone camelCase outlier in dashboard's API; ceph-api uses project-wide snake_case (UseProtoNames). List length also differs because the dashboard caches users at startup and doesn't see entries ceph-api added later via mgr config-key set. +"GET /api/user/{username}": + - path: $.lastUpdate + reason: dashboard camelCase; ceph-api emits snake_case last_update. + - path: $.last_update + reason: see $.lastUpdate (symmetric extra-vs-missing). + - path: $.pwdUpdateRequired + reason: dashboard camelCase; ceph-api emits snake_case pwd_update_required. + - path: $.pwd_update_required + reason: see $.pwdUpdateRequired. + - path: $.pwdExpirationDate + reason: dashboard camelCase; ceph-api emits pwd_expiration_date as google.protobuf.Timestamp (ISO-8601) rather than a unix integer. + - path: $.pwd_expiration_date + reason: see $.pwdExpirationDate. + - path: $.name + reason: declared field; both sides return null/absent for this fixture, recorded as missing on both. + - path: $.email + reason: declared field; both sides return null/absent for this fixture. +"POST /api/user": + - path: $ + reason: dashboard returns the created User resource; ceph-api returns Empty. +"PUT /api/user/{username}": + - path: $ + reason: dashboard returns the updated User resource; ceph-api returns Empty. +"POST /api/user/{username}/change_password": + - path: $ + reason: "error-path test (admin user lacks self-change context); error envelope formats diverge (ceph-api google.rpc.Status, dashboard {status,detail,request_id}). Move to a positive-case fixture when feasible." + +# /api/role — ceph-api now emits `system` via proto; what's left is +# the create/update returning the resource on dashboard vs Empty on ours. +"POST /api/role": + - path: $ + reason: dashboard returns the created Role resource; ceph-api returns Empty. +"PUT /api/role/{name}": + - path: $ + reason: dashboard returns the updated Role resource; ceph-api returns Empty. diff --git a/test/parity/recorder.go b/test/parity/recorder.go index 4ae92bc..58ae15e 100644 --- a/test/parity/recorder.go +++ b/test/parity/recorder.go @@ -68,7 +68,7 @@ var ( ours *Client routes *RouteSet // routes from api/http.yaml (ours) dashRts *RouteSet // routes from dashboard openapi.yaml - diff map[string][]Ignore + ignores map[string][]Ignore } coverageMu sync.Mutex @@ -97,7 +97,7 @@ func Init(dash, ours *Client, httpYAMLPath, dashboardSwaggerPath, apiDiffPath st state.ours = ours state.routes = NewRouteSet(routes) state.dashRts = NewRouteSet(dashRoutes) - state.diff = diff + state.ignores = diff state.ready = true return nil } @@ -190,19 +190,16 @@ func New(t testing.TB) *Recorder { // Backends returns the list of backends a parity test should iterate // over for the given call. Routes that exist in api/http.yaml but not -// in the dashboard's openapi (same method + same path shape) return -// just [Ours] — there's no dashboard counterpart to compare against, -// so we still exercise our side for coverage but don't try to call -// the dashboard. Routes that exist in both return the standard -// [Dash, Ours] pair. +// in the dashboard's openapi return just [Ours]; routes that exist in +// both return the standard [Dash, Ours] pair. // // for _, b := range r.Backends(call) { r.DoRecord(b, call) } func (r *Recorder) Backends(c Call) []Backend { endpoint := strings.ToUpper(c.Method) + " " + c.Path - if DashboardHas(endpoint) { - return Backends + if !DashboardHas(endpoint) { + return []Backend{Ours} } - return []Backend{Ours} + return Backends } // Do sends call to backend b without recording it for comparison or @@ -330,7 +327,7 @@ func (r *Recorder) assertAll() { defer r.mu.Unlock() state.mu.RLock() - diff := state.diff + ignoresByEndpoint := state.ignores state.mu.RUnlock() endpoints := make([]string, 0, len(r.records)) @@ -384,10 +381,16 @@ func (r *Recorder) assertAll() { continue } - // 204 No Content and similar empty responses are not a JSON - // parse error; treat both-empty as equal. - dashEmpty := len(bytes.TrimSpace(dashRec.body)) == 0 - oursEmpty := len(bytes.TrimSpace(oursRec.body)) == 0 + // `$` in api_diff = "body shape is intentionally divergent, + // don't compare". Transitional — every entry is debt to fix. + if hasRootIgnore(endpoint) { + continue + } + + // 204 No Content + similar empty responses must not be JSON- + // parsed; isEffectivelyEmpty also tolerates `{}` / `null`. + dashEmpty := isEffectivelyEmpty(dashRec.body) + oursEmpty := isEffectivelyEmpty(oursRec.body) if dashEmpty && oursEmpty { continue } @@ -413,7 +416,7 @@ func (r *Recorder) assertAll() { continue } - ignores := diff[endpoint] + ignores := ignoresByEndpoint[endpoint] if diffs := Compare(dashJSON, oursJSON, ignores); len(diffs) > 0 { var b strings.Builder fmt.Fprintf(&b, "parity: %q diverges (%d divergence(s), %d declared ignore(s))\n", @@ -540,3 +543,24 @@ func truncate(b []byte) string { } return string(b[:max]) + "..." } + +// isEffectivelyEmpty also folds in the grpc-gateway artifact `{}` and +// JSON `null` so a 204 dashboard response pairs with our Empty-proto +// response without a presence-mismatch error. +func isEffectivelyEmpty(b []byte) bool { + trimmed := bytes.TrimSpace(b) + return len(trimmed) == 0 || + bytes.Equal(trimmed, []byte("{}")) || + bytes.Equal(trimmed, []byte("null")) +} + +func hasRootIgnore(endpoint string) bool { + state.mu.RLock() + defer state.mu.RUnlock() + for _, ig := range state.ignores[endpoint] { + if strings.TrimSpace(ig.Path) == "$" { + return true + } + } + return false +} diff --git a/test/status_parity_test.go b/test/status_parity_test.go index 964e7d2..6337236 100644 --- a/test/status_parity_test.go +++ b/test/status_parity_test.go @@ -37,6 +37,14 @@ func Test_Parity_Status_OsdDump(t *testing.T) { } } +func Test_Parity_Status_PgDump(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/status/pg_dump"} + for _, b := range r.Backends(call) { + r.DoRecord(b, call) + } +} + func Test_Parity_Status_Report(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/status/report"} diff --git a/test/users_parity_test.go b/test/users_parity_test.go index 7d702c7..a5a0569 100644 --- a/test/users_parity_test.go +++ b/test/users_parity_test.go @@ -7,6 +7,7 @@ import ( "testing" "github.com/clyso/ceph-api/test/parity" + "github.com/clyso/ceph-api/test/testenv" "github.com/stretchr/testify/require" ) @@ -21,11 +22,15 @@ func Test_Parity_User_List(t *testing.T) { } } +// Uses the dashboard's own admin: ceph-api's admin is added to +// accessdb_v2 after the dashboard caches its user table, so the +// dashboard backend doesn't see it. func Test_Parity_User_Get(t *testing.T) { r := parity.New(t) get := parity.Call{ Method: "GET", Path: "/api/user/{username}", - PathParams: map[string]string{"username": admin}, Accept: userAccept, + PathParams: map[string]string{"username": testenv.DashboardUser}, + Accept: userAccept, } for _, b := range r.Backends(get) { r.DoRecord(b, get) @@ -36,15 +41,16 @@ func Test_Parity_User_CRUD(t *testing.T) { r := parity.New(t) const username = "parity-user-crud" + // Omits pwd_* fields: ours uses snake_case (pwd_update_required), + // dashboard expects camelCase (pwdUpdateRequired) — including + // either name 500s the opposite backend. createBody := map[string]any{ - "username": username, - "password": "parity-user-crud-pass", - "name": "parity user crud", - "email": "", - "roles": []string{"administrator"}, - "enabled": true, - "pwd_expiration_date": nil, - "pwd_update_required": false, + "username": username, + "password": "parity-user-crud-pass", + "name": "parity user crud", + "email": "", + "roles": []string{"administrator"}, + "enabled": true, } updateBody := map[string]any{ "name": "parity user crud updated", @@ -104,7 +110,6 @@ func Test_Parity_Role_CRUD(t *testing.T) { r := parity.New(t) const name = "parity-role" - const cloneName = name + "-clone" createBody := map[string]any{ "name": name, "description": "parity test role", @@ -115,35 +120,62 @@ func Test_Parity_Role_CRUD(t *testing.T) { "scopes_permissions": map[string][]string{"hosts": {"read", "create"}}, } rolePP := map[string]string{"name": name} - clonePP := map[string]string{"name": cloneName} create := parity.Call{Method: "POST", Path: "/api/role", Body: createBody, Accept: roleAccept} update := parity.Call{Method: "PUT", Path: "/api/role/{name}", PathParams: rolePP, Body: updateBody, Accept: roleAccept} + delRole := parity.Call{Method: "DELETE", Path: "/api/role/{name}", PathParams: rolePP, Accept: roleAccept} + + r.Do(parity.Ours, delRole) + t.Cleanup(func() { r.Do(parity.Ours, delRole) }) + + for _, b := range r.Backends(create) { + resp, _ := r.DoRecord(b, create) + require.True(t, resp.StatusCode/100 == 2 || resp.StatusCode == http.StatusConflict, + "%s: create role: status %d", b, resp.StatusCode) + r.DoRecord(b, update) + resp, _ = r.DoRecord(b, delRole) + require.True(t, resp.StatusCode/100 == 2, + "%s: delete role: status %d", b, resp.StatusCode) + } +} + +// Separate from Role_CRUD because ceph-api's clone is GET +// /api/user/{name}/clone?new_name= while the dashboard's is POST +// /api/role/{name}/clone with new_name in the body — different +// method + path shape, so r.Backends() collapses to [Ours] and +// there's nothing to compare against. +func Test_Parity_Role_Clone(t *testing.T) { + r := parity.New(t) + + const name = "parity-role-clone-src" + const cloneName = name + "-clone" + createBody := map[string]any{ + "name": name, + "description": "parity clone src role", + "scopes_permissions": map[string][]string{"hosts": {"read"}}, + } + srcPP := map[string]string{"name": name} + clonePP := map[string]string{"name": cloneName} + create := parity.Call{Method: "POST", Path: "/api/role", Body: createBody, Accept: roleAccept} clone := parity.Call{ Method: "GET", Path: "/api/user/{name}/clone", - PathParams: rolePP, + PathParams: srcPP, QueryParams: map[string]string{"new_name": cloneName}, Accept: roleAccept, } - delRole := parity.Call{Method: "DELETE", Path: "/api/role/{name}", PathParams: rolePP, Accept: roleAccept} + delSrc := parity.Call{Method: "DELETE", Path: "/api/role/{name}", PathParams: srcPP, Accept: roleAccept} delClone := parity.Call{Method: "DELETE", Path: "/api/role/{name}", PathParams: clonePP, Accept: roleAccept} r.Do(parity.Ours, delClone) - r.Do(parity.Ours, delRole) + r.Do(parity.Ours, delSrc) t.Cleanup(func() { r.Do(parity.Ours, delClone) - r.Do(parity.Ours, delRole) + r.Do(parity.Ours, delSrc) }) - for _, b := range r.Backends(create) { - resp, _ := r.DoRecord(b, create) - require.True(t, resp.StatusCode/100 == 2 || resp.StatusCode == http.StatusConflict, - "%s: create role: status %d", b, resp.StatusCode) - r.DoRecord(b, update) + resp, _ := r.Do(parity.Ours, create) + require.True(t, resp.StatusCode/100 == 2, "create role: status %d", resp.StatusCode) + for _, b := range r.Backends(clone) { r.DoRecord(b, clone) - r.Do(b, delClone) - resp, _ = r.DoRecord(b, delRole) - require.True(t, resp.StatusCode/100 == 2, - "%s: delete role: status %d", b, resp.StatusCode) } } From 1638056199e8d90caba0e5f6dd8a77e7129a25b2 Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Wed, 27 May 2026 16:27:08 +0200 Subject: [PATCH 06/10] fix parity tests for existing endpoints Signed-off-by: Artem Torubarov --- CLAUDE.md | 11 + TASKS.md | 437 +++++++++++++++++++++++++++++ api/cluster.proto | 11 +- api/crush_rule.proto | 20 +- api/gen/grpc/go/cluster.pb.go | 130 ++++++--- api/gen/grpc/go/cluster.pb.gw.go | 26 +- api/gen/grpc/go/cluster_grpc.pb.go | 20 +- api/gen/grpc/go/crush_rule.pb.go | 148 ++++++---- api/gen/grpc/go/users.pb.go | 77 ++--- api/gen/grpc/go/users_grpc.pb.go | 40 +-- api/http.yaml | 2 + api/openapi/ceph-api.swagger.json | 87 +++--- api/users.proto | 20 +- pkg/api/cluster_api_handlers.go | 14 +- pkg/api/users_api_handlers.go | 43 ++- tasks/phase-2.3-followup.md | 59 ++++ test/cluster_api_test.go | 2 +- test/cluster_parity_test.go | 29 +- test/crush_rule_parity_test.go | 6 +- test/parity/api_diff.yaml | 118 +------- test/parity/diff.go | 69 +++++ test/parity/diff_test.go | 55 +++- test/parity/recorder.go | 26 +- test/setup_cgo_test.go | 8 + test/status_parity_test.go | 16 +- test/testenv/ceph.go | 46 +++ test/users_parity_test.go | 53 ++-- 27 files changed, 1177 insertions(+), 396 deletions(-) create mode 100644 TASKS.md create mode 100644 tasks/phase-2.3-followup.md diff --git a/CLAUDE.md b/CLAUDE.md index 92532e1..e115fbb 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -94,6 +94,17 @@ For cross-release diffs, `make ceph-ref-versions` fetches `v18.2.7` and `v20.0.0 - **Mock mode is offline-dev convenience, not contract.** `CGO_ENABLED=0` builds make `make check` runnable without ceph libs, but the mock JSON in `pkg/rados/mock-data/` is hand-curated and routinely lags real Ceph. Wire-format bugs are caught by `make e2e-test` against a real cluster, not by `make check`. New endpoint work must be validated against `make e2e-test`. Updating `mock-data/` for new endpoints is **not** required. - **Tests live in two places.** Unit tests next to the code they test (`pkg/**/*_test.go`). E2E tests in `test/`. Test harness in `test/testenv/`. Anything in `test/` runs against a real Ceph started by `testenv.NewCephEnv` — no mocks. +## Parity vs API quality + +The dashboard parity tests in `test/parity/` exist to keep ceph-api a drop-in replacement for the dashboard's REST surface. They do **not** dictate the gRPC type system. When the two collide, pick the well-typed proto and absorb the wire-shape divergence in the matcher (`test/parity/diff.go`) — not by regressing the proto and not by adding repetitive per-endpoint ignores. + +- **Use `google.protobuf.Timestamp`** for timestamps, not `int32`/`int64` unix seconds. gRPC clients get a typed value; the matcher already coerces RFC3339 strings to unix seconds (within `timestampSkewTolerance`) so the dashboard's integer-form response still compares equal. +- **Use `int64`** for any field whose source-of-truth C++ type is `int64_t` / `uint64_t` / `__u64` (verify in `third_party/ceph/` before choosing — `int32` is only correct when the upstream type is narrower, e.g. `__u8` for CRUSH rule ids). `int64` serializes as a JSON string under protojson; the matcher coerces int64-as-string ↔ JSON number so parity still passes. +- **Before narrowing a proto field to fit a dashboard JSON shape**, grep `third_party/ceph/` for the source C++ type and confirm the narrower form is precision-safe. If unsure, keep the wider type and let the matcher handle the JSON encoding diff. +- **New shape-class divergences** (e.g. a third protojson convention not yet covered) belong in `coerceEqual` in `test/parity/diff.go` with a unit test, not in `api_diff.yaml`. Reserve `api_diff.yaml` for genuinely endpoint-specific divergences (a particular field that's deliberately different from the dashboard). + +The matcher also treats `null` on one side and absent on the other as equivalent — protojson's `EmitUnpopulated` emits unset proto3-optional fields as `null` while the dashboard's hand-rolled JSON omits them. + ## Comments Default to **zero comments**. Only keep one when removing it would leave a future reader unable to derive a non-obvious invariant, workaround, or external constraint. Before finishing any edit, re-scan every comment added; if you can't justify it under one of the three tests below, delete it. diff --git a/TASKS.md b/TASKS.md new file mode 100644 index 0000000..8fff2f1 --- /dev/null +++ b/TASKS.md @@ -0,0 +1,437 @@ +# TASKS + +Roadmap for ceph-api automation rollout. Phases are sequential — finish a +phase before starting the next. Within a phase, the listed order is the +suggested execution sequence. + +## Orientation (read before starting) + +- **What this project is**, the architecture, build/run/test conventions, + and the `cgo` / `!cgo` build-tag pair: see [CLAUDE.md](./CLAUDE.md). +- **Goal arc**: green make/CI → mechanical harness covers every + already-implemented endpoint (parity + permission tests) → agents + + skills → roadmap of remaining endpoints → shakedown one easy endpoint + end-to-end → establish service-layer pattern on one hard endpoint + interactively → autonomous pipeline drains the rest → repeat until + ceph-api replaces every ceph CLI/client surface. +- **Phase-2 mechanical harness** is the thing that makes the rest tractable: + `test/parity/parity.yaml` is the single source of truth for divergence + between our API and the upstream dashboard. Every migrated endpoint MUST + have an entry; an unregistered endpoint fails CI. +- **Verify the current state before starting**: + ```sh + make check # should be green + make lint # currently red (Phase 1.1 cleanup) + make proto # should be content-idempotent + make e2e-test # validates Ceph testcontainers boot + existing e2e tests + git -C third_party/ceph describe # v19.2.3 + ``` + +## Open decisions (resolve before the phase that needs them) + +- **Phase 3.4** — should the impl-agent checklist require updating + `pkg/rados/mock-data/`? Earlier in the design we said "no, mock-data + routinely lags real Ceph and parity tests catch wire-format bugs". + Later "checklist with mock update" was raised. Pick one before + finalising the agent. + +--- + +## Phase 1 — make/CI green + +Phase exit criterion: `make full-gate` exits 0 locally and CI's `test` job +passes without `continue-on-error` anywhere. + +- [x] **1.1 Fix pre-existing golangci-lint findings** — + `make lint` surfaces ~15 issues today (1 ineffassign, 3 nolintlint, + 2 prealloc, 9 staticcheck). Categories: + - Deprecated grpc dial APIs (`grpc.WithInsecure`, `grpc.DialContext`, + `grpc.WithBackoffMaxDelay`, `grpc.WithBlock`) in + `test/setup_cgo_test.go`, `go_api_client.go`. Replace with + `grpc.NewClient` + `grpc.WithTransportCredentials(insecure.NewCredentials())` + + `grpc.WithConnectParams(...)`. + - `github.com/golang/protobuf/proto` in `pkg/api/grpc_server.go` → + `google.golang.org/protobuf/proto`. + - Redundant `int` type decls (`var expIn int = int(...)` → + `expIn := int(...)`) in `pkg/api/users_api_handlers.go`. + - Capitalised error strings in `pkg/types/ceph_errors_mock.go`. + - Slice preallocation hints in `pkg/api/status_api_handlers.go`. +- [x] **1.2 Clean up `lima-ceph-dev.yaml`** — + `buf`, `protoc-gen-go`, `protoc-gen-go-grpc`, `protoc-gen-grpc-gateway`, + `protoc-gen-openapiv2` are now `tool` directives in `go.mod` invoked via + `go tool `. Drop the corresponding `sudo go install` lines from + the Lima provisioning script. +- [x] **1.3 Upgrade go.mod deps and Go version** — + `go get -u ./... && go mod tidy`, bump the `go` directive in `go.mod` to + the latest stable, bump `golang:X` in the production `Dockerfile`. CI's + `go-version-file: go.mod` will follow automatically. Validate + `make check` + `make e2e-test` after. + +--- + +## Phase 2 — mechanical harness, applied to all existing endpoints + +Phase exit criterion: every already-implemented endpoint (`cluster`, +`users`, `crush_rule`, `status`, `auth`) is covered by parity + permission +tests; `make full-gate` is green in CI. + +- [x] **2.1 Build the dashboard-parity contract framework** — + + **Goal.** Drop-in compatibility: every endpoint we expose must + produce response bodies byte-equivalent to the dashboard's, modulo + declared ignores in `test/parity/api_diff.yaml`. Adding a new gRPC + method, HTTP route, or parity test omission is caught mechanically + by one of three layered checks (below). + + **Sources of truth.** + - `api/http.yaml` — what ceph-api exposes (gateway selector → + method + path). This is the inventory the parity framework reads + to enforce coverage; the swagger JSON and any generated inventory + file are not used. + - `third_party/ceph/src/pybind/mgr/dashboard/openapi.yaml` — what + the dashboard exposes. Used to detect ceph-api routes that have + no dashboard counterpart, so the parity recorder can skip the + dashboard side for them. Path placeholders are normalized to + `{}` on both sides so `/api/role/{name}` (ours) matches + `/api/role/{role_name}` (dashboard). + + **Three layered checks, all firing in `TestMain` after `m.Run()`:** + + 1. **gRPC method → http.yaml selector.** Walk + `protoreflect.GlobalFiles` for every registered gRPC service + + method (the generated `*.pb.go` packages register descriptors on + import). Diff against http.yaml selectors. Missing → fail with + "add a rule for `ceph.Service.Method` in `api/http.yaml`." + Forces every new RPC to be HTTP-exposed. + + 2. **http.yaml route → parity test.** Set of `(METHOD, PATH-TEMPLATE)` + from http.yaml, excluding the `/api/auth/*` prefix (the parity + clients use auth for their own bootstrap). Set of routes + exercised by a parity test, accumulated at runtime in + `parity.coverage` (mutex-guarded). Diff → fail naming each + missing route and the test-file-per-service convention. + + 3. **`Call` → http.yaml route** (per recorded call). When a parity + test passes a `Call` to the recorder, the recorder looks up + `(Method, Path)` in the http.yaml route set. Missing → immediate + `t.Fatalf` with closest matches, so a typo like `/api/role/{Name}` + fails at the call site instead of silently leaving the real route + uncovered. + + **Recorder API.** + + - `parity.Init(dash, ours *Client, httpYAMLPath, dashboardSwaggerPath, apiDiffPath string)` + — called once from `runSetup` after auth bootstrap. Loads + http.yaml + dashboard openapi.yaml + api_diff.yaml into + package-level state, sets the two backend clients. + - `parity.Backend` enum: `Dash`, `Ours`. `parity.Backends` is the + `[]Backend{Dash, Ours}` iteration slice. + - `parity.New(t testing.TB) *Recorder` — per-test Recorder pulling + from package state; registers `t.Cleanup(r.assertAll)`. + - `r.Backends(c Call) []Backend` — returns `[Dash, Ours]` if the + dashboard openapi.yaml declares this route's shape, else `[Ours]`. + Tests iterate this instead of `parity.Backends` so ceph-api-only + routes are exercised on ours but not parity-compared. + - `r.Do(b Backend, c Call)` — sends without recording (use for + prep/cleanup). + - `r.DoRecord(b Backend, c Call)` — sends + records for cleanup-time + comparison and coverage. + - `parity.Call`: `{Method, Path (template), PathParams, QueryParams, + Body, Accept, Headers http.Header}`. No `NoRecord` flag — + `Do` vs `DoRecord` carries that distinction at the call site. + - Both methods return `(*http.Response, []byte)` so tests can + `require.Equal(t, 200, resp.StatusCode)` on prep/cleanup. + + **Defensive checks at record time (fail at the offending call):** + - Empty `Method` or `Path` → `t.Fatalf`. + - `(Method, Path)` not in http.yaml → `t.Fatalf` with closest matches. + - Same `(endpoint id, backend)` recorded twice in one test → + `t.Fatalf` naming both file:line locations. Pairing is strict 1:1 + per test; split into multiple tests for repeated flows. + - Second backend's request disagrees with first (method, + substituted path, query, body, accept) → `t.Fatalf` showing the + diff. Parity demands byte-identical requests on both sides. + + **Cleanup (`r.assertAll` in `t.Cleanup`):** + - Ours-only AND dashboard openapi.yaml has no shape match → mark + covered, no diff. ceph-api-only route by design. + - Ours-only AND dashboard has the shape → `t.Errorf` (test used a + raw loop instead of `r.Backends(call)`, or recorded only one + side). + - Dash-only → `t.Errorf` (test forgot ours). + - Both present → mark covered, compare bodies via + `parity.Compare(dashJSON, oursJSON, ignores)` with ignores from + `api_diff.yaml[endpoint id]`. Divergences → `t.Errorf` naming + endpoint id, file:line, and each diff path. + + **`test/parity/api_diff.yaml`** — engineer-curated divergence + catalogue. Keyed by endpoint id (`" "`). + Values are lists of JSONPath ignores with mandatory `reason:`. This + file IS the migration guide for dashboard clients. Empty initially; + Phase 2.3 populates it. + + ```yaml + "GET /api/cluster": + - path: $.uptime + reason: live; varies between calls + ``` + + **Parity tests.** One file per service in `test/`: + `cluster_parity_test.go`, `crush_rule_parity_test.go`, + `status_parity_test.go`, `users_parity_test.go`. Each test: + + ```go + func Test_Parity_Role_CRUD(t *testing.T) { + r := parity.New(t) + create := parity.Call{Method: "POST", Path: "/api/role", Body: ..., Accept: roleAccept} + get := parity.Call{Method: "GET", Path: "/api/role/{name}", PathParams: ..., Accept: roleAccept} + del := parity.Call{Method: "DELETE", Path: "/api/role/{name}", PathParams: ..., Accept: roleAccept} + + for _, b := range r.Backends(create) { + resp, _ := r.DoRecord(b, create); require.Equal(t, 201, resp.StatusCode) + r.DoRecord(b, get) + resp, _ = r.DoRecord(b, del); require.Equal(t, 204, resp.StatusCode) + } + } + ``` + + Outer loop = `r.Backends(canonicalCall)` (dash runs full flow, + including its own DELETE, before ours starts → state is clean for + ours pass; for ceph-api-only flows the loop only runs ours). Inner + loop = the call sequence. Use `r.Do(b, ...)` for defensive + pre-cleanup of leftover state from a previous failed run. + + **State model.** One shared Ceph cluster (`testenv.CephEnv`, started + in `TestMain`). Fixture names are unique per test. POST timestamps + and other live fields land in `api_diff.yaml` per endpoint. + + **Auth.** `/api/auth/*` is excluded from the http.yaml → parity-test + coverage gate; the bootstrap login in `test/setup_cgo_test.go` + already exercises it on both backends. Dedicated auth parity tests + can be added later if we want to verify token-issuance shape. + +- [ ] **2.2 Build the permission-test framework** — + Table-driven helper. For each gRPC method × each permission scope in + `pkg/user/system_roles.go`, verify a user lacking the scope gets + `PermissionDenied` and a user holding it succeeds. One `_permissions_test.go` + per service in `test/`. + +- [x] **2.3 Populate `api_diff.yaml` for all 5 existing services** — + Run the parity tests from 2.1 and watch them fail. For every endpoint + that surfaces divergence, decide: is this a wire-format bug in + ceph-api (fix it) or an intentional divergence (declare ignores in + `test/parity/api_diff.yaml` with mandatory `reason:`). This is the + moment to lock down what we promise to match vs intentionally + diverge. + + Dashboard versioned `Accept` headers: the dashboard returns 415 + "Unable to find version in request header" without + `application/vnd.ceph.api.vX.Y+json`. Look up the per-endpoint + version in `third_party/ceph/src/pybind/mgr/dashboard/openapi.yaml` + and pass it on the parity `Call.Accept` field; the recorder forwards + the same value to both backends. + + **Rule for future agents: parity must not regress the proto API.** + When the dashboard's JSON shape collides with idiomatic proto types + (e.g. dashboard emits unix-seconds integer while a `Timestamp` field + serializes as RFC3339), the proto stays well-typed and the matcher + in `test/parity/diff.go` absorbs the encoding diff via `coerceEqual`. + See CLAUDE.md → "Parity vs API quality" for the decision rule and + the currently-handled cases (Timestamp ↔ unix-seconds, int64-string + ↔ JSON number, null ↔ absent). New convention classes belong in + `coerceEqual` with a unit test, not in `api_diff.yaml`. Reserve + `api_diff.yaml` for genuinely endpoint-specific divergences. + +- [ ] **2.4 Populate permission tests for all 5 existing services** — + Apply the framework from 2.2 to every service. Each service's table + covers every method × every relevant scope. + +- [ ] **2.5 Bring `make full-gate` to green in CI** — + After 2.1–2.4 land, `make full-gate` runs `check` + `lint` + `proto` + (idempotent) + `e2e-test` (now includes parity + permission tests). + Verify green on first push. + +--- + +## Phase 3 — agents and skills + +Phase exit criterion: investigation + impl + review agents exist and can, +under interactive supervision, walk one chosen endpoint through the +pipeline to merge. + +- [ ] **3.1 Mine cesto + chorus `.claude/` configs** — + Inspect `~/projects/clyso/cesto/.claude/{agents,skills,settings.local.json}` + and `~/projects/github.com/clyso/chorus/.claude/` (if present). Extract + patterns that map to ceph-api's scope (no DST, no ADR, simpler review). + Adapt — don't copy wholesale. + +- [ ] **3.2 Create the project skill at `.claude/skills/ceph-api/`** — + Index: + - `api/openapi/ceph-api.swagger.json` (our published API). + - `third_party/ceph/src/pybind/mgr/dashboard/` (dashboard source — what + we shadow). + - `third_party/ceph/src/pybind/mgr/restful/` (restful module source). + - `third_party/ceph/src/mon/MonCommands.h`, `src/mgr/*.cc` (CLI command + defs). + - `~/projects/ora/liquid-ceph/orpheus/` (non-JSON RADOS command parsing + reference for go-ceph use cases). + - `pkg/user/system_roles.go` (permission scopes — don't invent new ones). + - One worked-example endpoint walkthrough + the parity.yaml entry format. + +- [ ] **3.3 Build the investigation agent** — + This is where the judgment lives. Equipped with the project skill (3.2), + a running `testenv.CephEnv` for `ceph` CLI / log access, and cross- + release diff tooling (`make ceph-ref-versions` then + `git -C third_party/ceph diff v18.2.7..v19.2.3 -- `). Output + contract: an RPC-mapping doc per endpoint — which mon/mgr command, JSON + payload shape, response shape, version-stability notes, what entries + to put in `parity.yaml` ignores. + +- [ ] **3.4 Build the impl agent as a checklist runner** — + Endpoint work is typical; the agent runs a fixed checklist: + 1. Edit/create `api/.proto`, route in `api/http.yaml`. + 2. `make proto`. + 3. Handler in `pkg/api/_api_handlers.go`. + 4. Wire into `pkg/app/start.go` + `pkg/api/grpc_server.go` + + `pkg/api/grpc_http_gateway.go` if a new service. + 5. (Optional) Service layer in `pkg//` when logic exceeds JSON + pass-through. Pattern established in Phase 6. + 6. E2E test in `test/`. + 7. Permission test row added to the service's permissions test. + 8. Parity entry in `test/parity/parity.yaml`. + 9. `make check`, `make e2e-test`. + + **Blocked on the open decision above** — does the checklist include a + step to update `pkg/rados/mock-data/`? + +- [ ] **3.5 Build the review agent** — + Light review. Verify: required tests exist (e2e + permission + parity), + all make gates pass, file-splitting and naming match exemplars, no slop + comments, no abstractions beyond what the task needs. + +- [ ] **3.6 Trim `CLAUDE.md`** — + CLAUDE.md is currently bloated because the harness conventions, build + flow, and architecture all live there as a fallback for tools that don't + load skills. Once the project skill at `.claude/skills/ceph-api/` (3.2) + exists and is the authoritative source for paths, conventions, and + worked examples, strip CLAUDE.md back to: a one-paragraph project + summary, a pointer to the skill, and the unavoidable Claude-Code-only + conventions. Aim for ~30 lines. + +--- + +## Phase 4 — roadmap + +Phase exit criterion: `tasks/endpoints/` holds one markdown file per +unmigrated endpoint, each self-sufficient for an autonomous agent to pick +up. + +- [ ] **4.1 Generate one task file per unmigrated endpoint** — + Diff our `api/openapi/ceph-api.swagger.json` against the upstream + dashboard swagger (find it under `third_party/ceph/` — likely in + `src/pybind/mgr/dashboard/` or generated at runtime; investigate). Emit + one markdown file per missing endpoint at + `tasks/endpoints/-.md` with: + - Dashboard route + HTTP method. + - Suggested proto name + service. + - Scope: `mon` (simple) / `mgr` (orchestration) / `python-reimpl` (the + dashboard does real logic we'd need to port). + - Known dependencies (other endpoints, prior tasks). + + **Do not group endpoints**, even small related ones. One file per + endpoint so autonomous agents can claim them independently. + +--- + +## Phase 5 — shakedown one easy endpoint + +Phase exit criterion: one mon-command-based endpoint has been driven +end-to-end through the agent pipeline (investigation → impl → review), +under interactive supervision, and merged. Friction observed during the +run has been fed back into agent/skill tweaks. + +- [ ] **5.1 Pick a simple endpoint and run it end-to-end** — + Choose something mon-command-based, low risk. Watch the agents work it. + Note where the checklist surfaces gaps, where tests miss things, where + review catches or misses. Adjust 3.2–3.5 accordingly. + +--- + +## Phase 6 — establish service-layer pattern on one hard endpoint + +Phase exit criterion: a `pkg//` service-layer package exists for +one orchestration-heavy endpoint, with handler in `pkg/api/` reduced to a +thin proto↔service-type adapter. This file layout becomes the canonical +pattern that the impl agent's checklist step 5 references for all +subsequent non-trivial endpoints. + +- [ ] **6.1 Pick one mgr-module / orchestration-heavy endpoint and migrate it interactively** — + Currently migrated endpoints are JSON pass-throughs to mon. Many + remaining ones need real logic (re-implement dashboard orchestration, + parse non-JSON RADOS output, manage state, etc.). Do this one + **interactively, by hand**: handler stays thin in `pkg/api/`, + orchestration lives in a new `pkg//` package, testable + independently of proto. Once stable, update the project skill (3.2) + with the new pattern and a worked-example walkthrough. + +--- + +## Phase 7 — autonomous pipeline + +Phase exit criterion: most of `tasks/endpoints/*.md` is drained without +human-interactive sessions; humans only review merge candidates. + +- [ ] **7.1 Let the agents drain the roadmap** — + With the pattern (6.1) established and pipeline (5.1) proven, + autonomous agents pick up remaining `tasks/endpoints/*.md` items. + Iterate on agents/skills as new edge cases surface. + +--- + +## Phase ∞ — beyond dashboard parity + +Once dashboard parity is complete, expand scope to cover the rest of the +`ceph` CLI surface that has no dashboard equivalent (admin sockets, +RGW admin API, `radosgw-admin`, RBD/CephFS-specific subcommands). Same +pipeline applies; the parity contract may evolve into a more general +"ceph CLI parity" framework. + +- [ ] **∞.1 Catalogue the post-dashboard surface** — survey what ceph CLI + commands are still uncovered after Phase 7. +- [ ] **∞.2 Decide on parity reference per command class** — admin socket + has no HTTP equivalent, so the parity contract has to evolve. +- [ ] **∞.3 Run the pipeline against the new catalogue**. + +--- + +## Deferred / low-priority cleanup + +- [ ] **D1 Replace `writeFile` heredoc with `CopyToContainer` in + `test/testenv/ceph.go`** — Current `writeFile` uses + `sh -c "cat > <<'EOF'\n\nEOF\n"`. Single-quoted `'EOF'` + blocks expansion so the only caller (dashboard password) is safe, but + content containing the literal line `EOF` would terminate the heredoc + early. Replace with `testcontainers.Container.CopyToContainer`. + +- [ ] **D3 Fix HTTP gateway TLS verification path in Secure mode** — + `pkg/api/grpc_http_gateway.go` dials the in-process gRPC server over TLS + with a default `tls.Config{}` (no custom CA pool, no `ServerName` + override, no `InsecureSkipVerify`). The server presents a self-signed + cert from `selfIssuedTlsConf()` (CN `seaphony.github.com`), so + verification cannot succeed against an arbitrary listen address. This + path was already broken before the lint cleanup (a misleading + `InsecureSkipVerify: false` `nolint:gosec` directive masked it). Either + `conf.Api.Secure` is unused in practice, or the gateway can't talk to + its own backend in TLS mode. Decide: drop Secure-mode altogether, or + fix this dial path (skip-verify for loopback, or load the self-issued + cert into a `RootCAs` pool, or override `ServerName`). + +- [ ] **D2 Refactor `-tid` to avoid host networking** — + Pre-create the docker network in `test/testenv/tid.go` before spawning + the inner test container, pass its name via env, have `CephEnv` attach + Ceph to that pre-existing network. Connect via container alias `ceph` + instead of static IP 192.168.56.7. Drops `NetworkMode = "host"`, + `EndpointSettingsModifier`, the static-IP plumbing. **Low priority** — + current host-networking approach works on Linux native, Colima + (user uses this on macOS), Lima, and Docker Desktop with the + host-networking toggle. Refactor only if a portability case bites. diff --git a/api/cluster.proto b/api/cluster.proto index f741ca6..937bc47 100644 --- a/api/cluster.proto +++ b/api/cluster.proto @@ -15,8 +15,8 @@ service Cluster { rpc UpdateStatus (ClusterStatus) returns (google.protobuf.Empty); rpc GetUsers (google.protobuf.Empty) returns (ClusterUsers); - rpc UpdateUser (UpdateClusterUserReq) returns (google.protobuf.Empty); - rpc CreateUser (CreateClusterUserReq) returns (google.protobuf.Empty); + rpc UpdateUser (UpdateClusterUserReq) returns (ClusterUserStatusResp); + rpc CreateUser (CreateClusterUserReq) returns (ClusterUserStatusResp); rpc ExportUser (ExportClusterUserReq) returns (ExportClusterUserResp); rpc DeleteUser (DeleteClusterUserReq) returns (google.protobuf.Empty); rpc SearchConfig (SearchConfigRequest) returns (SearchConfigResponse); @@ -59,7 +59,7 @@ message CreateClusterUserReq{ repeated ClusterUserCap capabilities = 1; string user_entity = 2 [json_name = "user_entity"]; // keyring file format - if import_data is set then other fields ignored - bytes import_data = 3 [json_name = "import_data"]; + string import_data = 3 [json_name = "import_data"]; } message ExportClusterUserReq{ @@ -75,6 +75,11 @@ message ExportClusterUserResp{ string data = 1; } +message ClusterUserStatusResp{ + // Dashboard-compatible status string, e.g. "Successfully created user 'client.x'". + string status = 1; +} + // Config Param Search message SearchConfigRequest { diff --git a/api/crush_rule.proto b/api/crush_rule.proto index 415066d..674e81c 100644 --- a/api/crush_rule.proto +++ b/api/crush_rule.proto @@ -19,17 +19,21 @@ enum PoolType { } message Rule { - int64 rule_id = 1; - string rule_name = 2; - int64 ruleset = 3; - int64 type = 4; - int64 min_size = 5; - int64 max_size = 6; - repeated Step steps = 7; + int32 rule_id = 1; + string rule_name = 2; + optional int32 ruleset = 3; + int32 type = 4; + optional int32 min_size = 5; + optional int32 max_size = 6; + repeated Step steps = 7; } message Step { - map entries = 1; + string op = 1; + optional int32 item = 2; + optional string item_name = 3; + optional int32 num = 4; + optional string type = 5; } // CREATE RULE diff --git a/api/gen/grpc/go/cluster.pb.go b/api/gen/grpc/go/cluster.pb.go index ff4814d..da148ae 100644 --- a/api/gen/grpc/go/cluster.pb.go +++ b/api/gen/grpc/go/cluster.pb.go @@ -114,7 +114,7 @@ func (x SearchConfigRequest_SortField) Number() protoreflect.EnumNumber { // Deprecated: Use SearchConfigRequest_SortField.Descriptor instead. func (SearchConfigRequest_SortField) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{9, 0} + return file_cluster_proto_rawDescGZIP(), []int{10, 0} } type SearchConfigRequest_SortOrder int32 @@ -160,7 +160,7 @@ func (x SearchConfigRequest_SortOrder) Number() protoreflect.EnumNumber { // Deprecated: Use SearchConfigRequest_SortOrder.Descriptor instead. func (SearchConfigRequest_SortOrder) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{9, 1} + return file_cluster_proto_rawDescGZIP(), []int{10, 1} } type ConfigParam_ServiceType int32 @@ -236,7 +236,7 @@ func (x ConfigParam_ServiceType) Number() protoreflect.EnumNumber { // Deprecated: Use ConfigParam_ServiceType.Descriptor instead. func (ConfigParam_ServiceType) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{10, 0} + return file_cluster_proto_rawDescGZIP(), []int{11, 0} } type ConfigParam_ConfigLevel int32 @@ -285,7 +285,7 @@ func (x ConfigParam_ConfigLevel) Number() protoreflect.EnumNumber { // Deprecated: Use ConfigParam_ConfigLevel.Descriptor instead. func (ConfigParam_ConfigLevel) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{10, 1} + return file_cluster_proto_rawDescGZIP(), []int{11, 1} } type ConfigParam_ParamType int32 @@ -358,7 +358,7 @@ func (x ConfigParam_ParamType) Number() protoreflect.EnumNumber { // Deprecated: Use ConfigParam_ParamType.Descriptor instead. func (ConfigParam_ParamType) EnumDescriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{10, 2} + return file_cluster_proto_rawDescGZIP(), []int{11, 2} } type ClusterStatus struct { @@ -623,7 +623,7 @@ type CreateClusterUserReq struct { Capabilities []*ClusterUserCap `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty"` UserEntity string `protobuf:"bytes,2,opt,name=user_entity,proto3" json:"user_entity,omitempty"` // keyring file format - if import_data is set then other fields ignored - ImportData []byte `protobuf:"bytes,3,opt,name=import_data,proto3" json:"import_data,omitempty"` + ImportData string `protobuf:"bytes,3,opt,name=import_data,proto3" json:"import_data,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -672,11 +672,11 @@ func (x *CreateClusterUserReq) GetUserEntity() string { return "" } -func (x *CreateClusterUserReq) GetImportData() []byte { +func (x *CreateClusterUserReq) GetImportData() string { if x != nil { return x.ImportData } - return nil + return "" } type ExportClusterUserReq struct { @@ -812,6 +812,51 @@ func (x *ExportClusterUserResp) GetData() string { return "" } +type ClusterUserStatusResp struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Dashboard-compatible status string, e.g. "Successfully created user 'client.x'". + Status string `protobuf:"bytes,1,opt,name=status,proto3" json:"status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ClusterUserStatusResp) Reset() { + *x = ClusterUserStatusResp{} + mi := &file_cluster_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ClusterUserStatusResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ClusterUserStatusResp) ProtoMessage() {} + +func (x *ClusterUserStatusResp) ProtoReflect() protoreflect.Message { + mi := &file_cluster_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ClusterUserStatusResp.ProtoReflect.Descriptor instead. +func (*ClusterUserStatusResp) Descriptor() ([]byte, []int) { + return file_cluster_proto_rawDescGZIP(), []int{9} +} + +func (x *ClusterUserStatusResp) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + // Config Param Search type SearchConfigRequest struct { state protoimpl.MessageState `protogen:"open.v1"` @@ -828,7 +873,7 @@ type SearchConfigRequest struct { func (x *SearchConfigRequest) Reset() { *x = SearchConfigRequest{} - mi := &file_cluster_proto_msgTypes[9] + mi := &file_cluster_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -840,7 +885,7 @@ func (x *SearchConfigRequest) String() string { func (*SearchConfigRequest) ProtoMessage() {} func (x *SearchConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[9] + mi := &file_cluster_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -853,7 +898,7 @@ func (x *SearchConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchConfigRequest.ProtoReflect.Descriptor instead. func (*SearchConfigRequest) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{9} + return file_cluster_proto_rawDescGZIP(), []int{10} } func (x *SearchConfigRequest) GetService() ConfigParam_ServiceType { @@ -928,7 +973,7 @@ type ConfigParam struct { func (x *ConfigParam) Reset() { *x = ConfigParam{} - mi := &file_cluster_proto_msgTypes[10] + mi := &file_cluster_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -940,7 +985,7 @@ func (x *ConfigParam) String() string { func (*ConfigParam) ProtoMessage() {} func (x *ConfigParam) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[10] + mi := &file_cluster_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -953,7 +998,7 @@ func (x *ConfigParam) ProtoReflect() protoreflect.Message { // Deprecated: Use ConfigParam.ProtoReflect.Descriptor instead. func (*ConfigParam) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{10} + return file_cluster_proto_rawDescGZIP(), []int{11} } func (x *ConfigParam) GetName() string { @@ -1070,7 +1115,7 @@ type SearchConfigResponse struct { func (x *SearchConfigResponse) Reset() { *x = SearchConfigResponse{} - mi := &file_cluster_proto_msgTypes[11] + mi := &file_cluster_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1082,7 +1127,7 @@ func (x *SearchConfigResponse) String() string { func (*SearchConfigResponse) ProtoMessage() {} func (x *SearchConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[11] + mi := &file_cluster_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1095,7 +1140,7 @@ func (x *SearchConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchConfigResponse.ProtoReflect.Descriptor instead. func (*SearchConfigResponse) Descriptor() ([]byte, []int) { - return file_cluster_proto_rawDescGZIP(), []int{11} + return file_cluster_proto_rawDescGZIP(), []int{12} } func (x *SearchConfigResponse) GetParams() []*ConfigParam { @@ -1133,13 +1178,15 @@ const file_cluster_proto_rawDesc = "" + "\x14CreateClusterUserReq\x128\n" + "\fcapabilities\x18\x01 \x03(\v2\x14.ceph.ClusterUserCapR\fcapabilities\x12 \n" + "\vuser_entity\x18\x02 \x01(\tR\vuser_entity\x12 \n" + - "\vimport_data\x18\x03 \x01(\fR\vimport_data\"2\n" + + "\vimport_data\x18\x03 \x01(\tR\vimport_data\"2\n" + "\x14ExportClusterUserReq\x12\x1a\n" + "\bentities\x18\x01 \x03(\tR\bentities\"8\n" + "\x14DeleteClusterUserReq\x12 \n" + "\vuser_entity\x18\x01 \x01(\tR\vuser_entity\"+\n" + "\x15ExportClusterUserResp\x12\x12\n" + - "\x04data\x18\x01 \x01(\tR\x04data\"\x91\x04\n" + + "\x04data\x18\x01 \x01(\tR\x04data\"/\n" + + "\x15ClusterUserStatusResp\x12\x16\n" + + "\x06status\x18\x01 \x01(\tR\x06status\"\x91\x04\n" + "\x13SearchConfigRequest\x12<\n" + "\aservice\x18\x01 \x01(\x0e2\x1d.ceph.ConfigParam.ServiceTypeH\x00R\aservice\x88\x01\x01\x12\x17\n" + "\x04name\x18\x02 \x01(\tH\x01R\x04name\x88\x01\x01\x12 \n" + @@ -1219,15 +1266,15 @@ const file_cluster_proto_rawDesc = "" + "\x04_minB\x06\n" + "\x04_max\"A\n" + "\x14SearchConfigResponse\x12)\n" + - "\x06params\x18\x01 \x03(\v2\x11.ceph.ConfigParamR\x06params2\x8c\x04\n" + + "\x06params\x18\x01 \x03(\v2\x11.ceph.ConfigParamR\x06params2\x96\x04\n" + "\aCluster\x128\n" + "\tGetStatus\x12\x16.google.protobuf.Empty\x1a\x13.ceph.ClusterStatus\x12;\n" + "\fUpdateStatus\x12\x13.ceph.ClusterStatus\x1a\x16.google.protobuf.Empty\x126\n" + - "\bGetUsers\x12\x16.google.protobuf.Empty\x1a\x12.ceph.ClusterUsers\x12@\n" + + "\bGetUsers\x12\x16.google.protobuf.Empty\x1a\x12.ceph.ClusterUsers\x12E\n" + "\n" + - "UpdateUser\x12\x1a.ceph.UpdateClusterUserReq\x1a\x16.google.protobuf.Empty\x12@\n" + + "UpdateUser\x12\x1a.ceph.UpdateClusterUserReq\x1a\x1b.ceph.ClusterUserStatusResp\x12E\n" + "\n" + - "CreateUser\x12\x1a.ceph.CreateClusterUserReq\x1a\x16.google.protobuf.Empty\x12E\n" + + "CreateUser\x12\x1a.ceph.CreateClusterUserReq\x1a\x1b.ceph.ClusterUserStatusResp\x12E\n" + "\n" + "ExportUser\x12\x1a.ceph.ExportClusterUserReq\x1a\x1b.ceph.ExportClusterUserResp\x12@\n" + "\n" + @@ -1247,7 +1294,7 @@ func file_cluster_proto_rawDescGZIP() []byte { } var file_cluster_proto_enumTypes = make([]protoimpl.EnumInfo, 6) -var file_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_cluster_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_cluster_proto_goTypes = []any{ (ClusterStatus_Status)(0), // 0: ceph.ClusterStatus.Status (SearchConfigRequest_SortField)(0), // 1: ceph.SearchConfigRequest.SortField @@ -1264,16 +1311,17 @@ var file_cluster_proto_goTypes = []any{ (*ExportClusterUserReq)(nil), // 12: ceph.ExportClusterUserReq (*DeleteClusterUserReq)(nil), // 13: ceph.DeleteClusterUserReq (*ExportClusterUserResp)(nil), // 14: ceph.ExportClusterUserResp - (*SearchConfigRequest)(nil), // 15: ceph.SearchConfigRequest - (*ConfigParam)(nil), // 16: ceph.ConfigParam - (*SearchConfigResponse)(nil), // 17: ceph.SearchConfigResponse - nil, // 18: ceph.ClusterUser.CapsEntry - (*emptypb.Empty)(nil), // 19: google.protobuf.Empty + (*ClusterUserStatusResp)(nil), // 15: ceph.ClusterUserStatusResp + (*SearchConfigRequest)(nil), // 16: ceph.SearchConfigRequest + (*ConfigParam)(nil), // 17: ceph.ConfigParam + (*SearchConfigResponse)(nil), // 18: ceph.SearchConfigResponse + nil, // 19: ceph.ClusterUser.CapsEntry + (*emptypb.Empty)(nil), // 20: google.protobuf.Empty } var file_cluster_proto_depIdxs = []int32{ 0, // 0: ceph.ClusterStatus.status:type_name -> ceph.ClusterStatus.Status 8, // 1: ceph.ClusterUsers.users:type_name -> ceph.ClusterUser - 18, // 2: ceph.ClusterUser.caps:type_name -> ceph.ClusterUser.CapsEntry + 19, // 2: ceph.ClusterUser.caps:type_name -> ceph.ClusterUser.CapsEntry 9, // 3: ceph.UpdateClusterUserReq.capabilities:type_name -> ceph.ClusterUserCap 9, // 4: ceph.CreateClusterUserReq.capabilities:type_name -> ceph.ClusterUserCap 3, // 5: ceph.SearchConfigRequest.service:type_name -> ceph.ConfigParam.ServiceType @@ -1284,23 +1332,23 @@ var file_cluster_proto_depIdxs = []int32{ 5, // 10: ceph.ConfigParam.type:type_name -> ceph.ConfigParam.ParamType 4, // 11: ceph.ConfigParam.level:type_name -> ceph.ConfigParam.ConfigLevel 3, // 12: ceph.ConfigParam.services:type_name -> ceph.ConfigParam.ServiceType - 16, // 13: ceph.SearchConfigResponse.params:type_name -> ceph.ConfigParam - 19, // 14: ceph.Cluster.GetStatus:input_type -> google.protobuf.Empty + 17, // 13: ceph.SearchConfigResponse.params:type_name -> ceph.ConfigParam + 20, // 14: ceph.Cluster.GetStatus:input_type -> google.protobuf.Empty 6, // 15: ceph.Cluster.UpdateStatus:input_type -> ceph.ClusterStatus - 19, // 16: ceph.Cluster.GetUsers:input_type -> google.protobuf.Empty + 20, // 16: ceph.Cluster.GetUsers:input_type -> google.protobuf.Empty 10, // 17: ceph.Cluster.UpdateUser:input_type -> ceph.UpdateClusterUserReq 11, // 18: ceph.Cluster.CreateUser:input_type -> ceph.CreateClusterUserReq 12, // 19: ceph.Cluster.ExportUser:input_type -> ceph.ExportClusterUserReq 13, // 20: ceph.Cluster.DeleteUser:input_type -> ceph.DeleteClusterUserReq - 15, // 21: ceph.Cluster.SearchConfig:input_type -> ceph.SearchConfigRequest + 16, // 21: ceph.Cluster.SearchConfig:input_type -> ceph.SearchConfigRequest 6, // 22: ceph.Cluster.GetStatus:output_type -> ceph.ClusterStatus - 19, // 23: ceph.Cluster.UpdateStatus:output_type -> google.protobuf.Empty + 20, // 23: ceph.Cluster.UpdateStatus:output_type -> google.protobuf.Empty 7, // 24: ceph.Cluster.GetUsers:output_type -> ceph.ClusterUsers - 19, // 25: ceph.Cluster.UpdateUser:output_type -> google.protobuf.Empty - 19, // 26: ceph.Cluster.CreateUser:output_type -> google.protobuf.Empty + 15, // 25: ceph.Cluster.UpdateUser:output_type -> ceph.ClusterUserStatusResp + 15, // 26: ceph.Cluster.CreateUser:output_type -> ceph.ClusterUserStatusResp 14, // 27: ceph.Cluster.ExportUser:output_type -> ceph.ExportClusterUserResp - 19, // 28: ceph.Cluster.DeleteUser:output_type -> google.protobuf.Empty - 17, // 29: ceph.Cluster.SearchConfig:output_type -> ceph.SearchConfigResponse + 20, // 28: ceph.Cluster.DeleteUser:output_type -> google.protobuf.Empty + 18, // 29: ceph.Cluster.SearchConfig:output_type -> ceph.SearchConfigResponse 22, // [22:30] is the sub-list for method output_type 14, // [14:22] is the sub-list for method input_type 14, // [14:14] is the sub-list for extension type_name @@ -1313,15 +1361,15 @@ func file_cluster_proto_init() { if File_cluster_proto != nil { return } - file_cluster_proto_msgTypes[9].OneofWrappers = []any{} file_cluster_proto_msgTypes[10].OneofWrappers = []any{} + file_cluster_proto_msgTypes[11].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_cluster_proto_rawDesc), len(file_cluster_proto_rawDesc)), NumEnums: 6, - NumMessages: 13, + NumMessages: 14, NumExtensions: 0, NumServices: 1, }, diff --git a/api/gen/grpc/go/cluster.pb.gw.go b/api/gen/grpc/go/cluster.pb.gw.go index 0698dba..2daad1f 100644 --- a/api/gen/grpc/go/cluster.pb.gw.go +++ b/api/gen/grpc/go/cluster.pb.gw.go @@ -344,7 +344,7 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Cluster_UpdateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Cluster_UpdateUser_0(annotatedContext, mux, outboundMarshaler, w, req, response_Cluster_UpdateUser_0{resp.(*ClusterUserStatusResp)}, mux.GetForwardResponseOptions()...) }) mux.Handle(http.MethodPost, pattern_Cluster_CreateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) @@ -364,7 +364,7 @@ func RegisterClusterHandlerServer(ctx context.Context, mux *runtime.ServeMux, se runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Cluster_CreateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Cluster_CreateUser_0(annotatedContext, mux, outboundMarshaler, w, req, response_Cluster_CreateUser_0{resp.(*ClusterUserStatusResp)}, mux.GetForwardResponseOptions()...) }) mux.Handle(http.MethodPost, pattern_Cluster_ExportUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) @@ -532,7 +532,7 @@ func RegisterClusterHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Cluster_UpdateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Cluster_UpdateUser_0(annotatedContext, mux, outboundMarshaler, w, req, response_Cluster_UpdateUser_0{resp.(*ClusterUserStatusResp)}, mux.GetForwardResponseOptions()...) }) mux.Handle(http.MethodPost, pattern_Cluster_CreateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) @@ -549,7 +549,7 @@ func RegisterClusterHandlerClient(ctx context.Context, mux *runtime.ServeMux, cl runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) return } - forward_Cluster_CreateUser_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + forward_Cluster_CreateUser_0(annotatedContext, mux, outboundMarshaler, w, req, response_Cluster_CreateUser_0{resp.(*ClusterUserStatusResp)}, mux.GetForwardResponseOptions()...) }) mux.Handle(http.MethodPost, pattern_Cluster_ExportUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) @@ -614,6 +614,24 @@ func (m response_Cluster_GetUsers_0) XXX_ResponseBody() interface{} { return response.Users } +type response_Cluster_UpdateUser_0 struct { + *ClusterUserStatusResp +} + +func (m response_Cluster_UpdateUser_0) XXX_ResponseBody() interface{} { + response := m.ClusterUserStatusResp + return response.Status +} + +type response_Cluster_CreateUser_0 struct { + *ClusterUserStatusResp +} + +func (m response_Cluster_CreateUser_0) XXX_ResponseBody() interface{} { + response := m.ClusterUserStatusResp + return response.Status +} + type response_Cluster_ExportUser_0 struct { *ExportClusterUserResp } diff --git a/api/gen/grpc/go/cluster_grpc.pb.go b/api/gen/grpc/go/cluster_grpc.pb.go index a4488e2..6cbd497 100644 --- a/api/gen/grpc/go/cluster_grpc.pb.go +++ b/api/gen/grpc/go/cluster_grpc.pb.go @@ -39,8 +39,8 @@ type ClusterClient interface { // Update cluster status UpdateStatus(ctx context.Context, in *ClusterStatus, opts ...grpc.CallOption) (*emptypb.Empty, error) GetUsers(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*ClusterUsers, error) - UpdateUser(ctx context.Context, in *UpdateClusterUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) - CreateUser(ctx context.Context, in *CreateClusterUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateUser(ctx context.Context, in *UpdateClusterUserReq, opts ...grpc.CallOption) (*ClusterUserStatusResp, error) + CreateUser(ctx context.Context, in *CreateClusterUserReq, opts ...grpc.CallOption) (*ClusterUserStatusResp, error) ExportUser(ctx context.Context, in *ExportClusterUserReq, opts ...grpc.CallOption) (*ExportClusterUserResp, error) DeleteUser(ctx context.Context, in *DeleteClusterUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) SearchConfig(ctx context.Context, in *SearchConfigRequest, opts ...grpc.CallOption) (*SearchConfigResponse, error) @@ -84,9 +84,9 @@ func (c *clusterClient) GetUsers(ctx context.Context, in *emptypb.Empty, opts .. return out, nil } -func (c *clusterClient) UpdateUser(ctx context.Context, in *UpdateClusterUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *clusterClient) UpdateUser(ctx context.Context, in *UpdateClusterUserReq, opts ...grpc.CallOption) (*ClusterUserStatusResp, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(emptypb.Empty) + out := new(ClusterUserStatusResp) err := c.cc.Invoke(ctx, Cluster_UpdateUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -94,9 +94,9 @@ func (c *clusterClient) UpdateUser(ctx context.Context, in *UpdateClusterUserReq return out, nil } -func (c *clusterClient) CreateUser(ctx context.Context, in *CreateClusterUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *clusterClient) CreateUser(ctx context.Context, in *CreateClusterUserReq, opts ...grpc.CallOption) (*ClusterUserStatusResp, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(emptypb.Empty) + out := new(ClusterUserStatusResp) err := c.cc.Invoke(ctx, Cluster_CreateUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -143,8 +143,8 @@ type ClusterServer interface { // Update cluster status UpdateStatus(context.Context, *ClusterStatus) (*emptypb.Empty, error) GetUsers(context.Context, *emptypb.Empty) (*ClusterUsers, error) - UpdateUser(context.Context, *UpdateClusterUserReq) (*emptypb.Empty, error) - CreateUser(context.Context, *CreateClusterUserReq) (*emptypb.Empty, error) + UpdateUser(context.Context, *UpdateClusterUserReq) (*ClusterUserStatusResp, error) + CreateUser(context.Context, *CreateClusterUserReq) (*ClusterUserStatusResp, error) ExportUser(context.Context, *ExportClusterUserReq) (*ExportClusterUserResp, error) DeleteUser(context.Context, *DeleteClusterUserReq) (*emptypb.Empty, error) SearchConfig(context.Context, *SearchConfigRequest) (*SearchConfigResponse, error) @@ -166,10 +166,10 @@ func (UnimplementedClusterServer) UpdateStatus(context.Context, *ClusterStatus) func (UnimplementedClusterServer) GetUsers(context.Context, *emptypb.Empty) (*ClusterUsers, error) { return nil, status.Error(codes.Unimplemented, "method GetUsers not implemented") } -func (UnimplementedClusterServer) UpdateUser(context.Context, *UpdateClusterUserReq) (*emptypb.Empty, error) { +func (UnimplementedClusterServer) UpdateUser(context.Context, *UpdateClusterUserReq) (*ClusterUserStatusResp, error) { return nil, status.Error(codes.Unimplemented, "method UpdateUser not implemented") } -func (UnimplementedClusterServer) CreateUser(context.Context, *CreateClusterUserReq) (*emptypb.Empty, error) { +func (UnimplementedClusterServer) CreateUser(context.Context, *CreateClusterUserReq) (*ClusterUserStatusResp, error) { return nil, status.Error(codes.Unimplemented, "method CreateUser not implemented") } func (UnimplementedClusterServer) ExportUser(context.Context, *ExportClusterUserReq) (*ExportClusterUserResp, error) { diff --git a/api/gen/grpc/go/crush_rule.pb.go b/api/gen/grpc/go/crush_rule.pb.go index 28829f1..58e4c4e 100644 --- a/api/gen/grpc/go/crush_rule.pb.go +++ b/api/gen/grpc/go/crush_rule.pb.go @@ -70,12 +70,12 @@ func (PoolType) EnumDescriptor() ([]byte, []int) { type Rule struct { state protoimpl.MessageState `protogen:"open.v1"` - RuleId int64 `protobuf:"varint,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + RuleId int32 `protobuf:"varint,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` RuleName string `protobuf:"bytes,2,opt,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` - Ruleset int64 `protobuf:"varint,3,opt,name=ruleset,proto3" json:"ruleset,omitempty"` - Type int64 `protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"` - MinSize int64 `protobuf:"varint,5,opt,name=min_size,json=minSize,proto3" json:"min_size,omitempty"` - MaxSize int64 `protobuf:"varint,6,opt,name=max_size,json=maxSize,proto3" json:"max_size,omitempty"` + Ruleset *int32 `protobuf:"varint,3,opt,name=ruleset,proto3,oneof" json:"ruleset,omitempty"` + Type int32 `protobuf:"varint,4,opt,name=type,proto3" json:"type,omitempty"` + MinSize *int32 `protobuf:"varint,5,opt,name=min_size,json=minSize,proto3,oneof" json:"min_size,omitempty"` + MaxSize *int32 `protobuf:"varint,6,opt,name=max_size,json=maxSize,proto3,oneof" json:"max_size,omitempty"` Steps []*Step `protobuf:"bytes,7,rep,name=steps,proto3" json:"steps,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache @@ -111,7 +111,7 @@ func (*Rule) Descriptor() ([]byte, []int) { return file_crush_rule_proto_rawDescGZIP(), []int{0} } -func (x *Rule) GetRuleId() int64 { +func (x *Rule) GetRuleId() int32 { if x != nil { return x.RuleId } @@ -125,30 +125,30 @@ func (x *Rule) GetRuleName() string { return "" } -func (x *Rule) GetRuleset() int64 { - if x != nil { - return x.Ruleset +func (x *Rule) GetRuleset() int32 { + if x != nil && x.Ruleset != nil { + return *x.Ruleset } return 0 } -func (x *Rule) GetType() int64 { +func (x *Rule) GetType() int32 { if x != nil { return x.Type } return 0 } -func (x *Rule) GetMinSize() int64 { - if x != nil { - return x.MinSize +func (x *Rule) GetMinSize() int32 { + if x != nil && x.MinSize != nil { + return *x.MinSize } return 0 } -func (x *Rule) GetMaxSize() int64 { - if x != nil { - return x.MaxSize +func (x *Rule) GetMaxSize() int32 { + if x != nil && x.MaxSize != nil { + return *x.MaxSize } return 0 } @@ -162,7 +162,11 @@ func (x *Rule) GetSteps() []*Step { type Step struct { state protoimpl.MessageState `protogen:"open.v1"` - Entries map[string]string `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Op string `protobuf:"bytes,1,opt,name=op,proto3" json:"op,omitempty"` + Item *int32 `protobuf:"varint,2,opt,name=item,proto3,oneof" json:"item,omitempty"` + ItemName *string `protobuf:"bytes,3,opt,name=item_name,json=itemName,proto3,oneof" json:"item_name,omitempty"` + Num *int32 `protobuf:"varint,4,opt,name=num,proto3,oneof" json:"num,omitempty"` + Type *string `protobuf:"bytes,5,opt,name=type,proto3,oneof" json:"type,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -197,11 +201,39 @@ func (*Step) Descriptor() ([]byte, []int) { return file_crush_rule_proto_rawDescGZIP(), []int{1} } -func (x *Step) GetEntries() map[string]string { +func (x *Step) GetOp() string { if x != nil { - return x.Entries + return x.Op } - return nil + return "" +} + +func (x *Step) GetItem() int32 { + if x != nil && x.Item != nil { + return *x.Item + } + return 0 +} + +func (x *Step) GetItemName() string { + if x != nil && x.ItemName != nil { + return *x.ItemName + } + return "" +} + +func (x *Step) GetNum() int32 { + if x != nil && x.Num != nil { + return *x.Num + } + return 0 +} + +func (x *Step) GetType() string { + if x != nil && x.Type != nil { + return *x.Type + } + return "" } // CREATE RULE @@ -428,21 +460,31 @@ var File_crush_rule_proto protoreflect.FileDescriptor const file_crush_rule_proto_rawDesc = "" + "\n" + - "\x10crush_rule.proto\x12\x04ceph\x1a\x1bgoogle/protobuf/empty.proto\"\xc2\x01\n" + + "\x10crush_rule.proto\x12\x04ceph\x1a\x1bgoogle/protobuf/empty.proto\"\xf7\x01\n" + "\x04Rule\x12\x17\n" + - "\arule_id\x18\x01 \x01(\x03R\x06ruleId\x12\x1b\n" + - "\trule_name\x18\x02 \x01(\tR\bruleName\x12\x18\n" + - "\aruleset\x18\x03 \x01(\x03R\aruleset\x12\x12\n" + - "\x04type\x18\x04 \x01(\x03R\x04type\x12\x19\n" + - "\bmin_size\x18\x05 \x01(\x03R\aminSize\x12\x19\n" + - "\bmax_size\x18\x06 \x01(\x03R\amaxSize\x12 \n" + + "\arule_id\x18\x01 \x01(\x05R\x06ruleId\x12\x1b\n" + + "\trule_name\x18\x02 \x01(\tR\bruleName\x12\x1d\n" + + "\aruleset\x18\x03 \x01(\x05H\x00R\aruleset\x88\x01\x01\x12\x12\n" + + "\x04type\x18\x04 \x01(\x05R\x04type\x12\x1e\n" + + "\bmin_size\x18\x05 \x01(\x05H\x01R\aminSize\x88\x01\x01\x12\x1e\n" + + "\bmax_size\x18\x06 \x01(\x05H\x02R\amaxSize\x88\x01\x01\x12 \n" + "\x05steps\x18\a \x03(\v2\n" + - ".ceph.StepR\x05steps\"u\n" + - "\x04Step\x121\n" + - "\aentries\x18\x01 \x03(\v2\x17.ceph.Step.EntriesEntryR\aentries\x1a:\n" + - "\fEntriesEntry\x12\x10\n" + - "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x81\x02\n" + + ".ceph.StepR\x05stepsB\n" + + "\n" + + "\b_rulesetB\v\n" + + "\t_min_sizeB\v\n" + + "\t_max_size\"\xa9\x01\n" + + "\x04Step\x12\x0e\n" + + "\x02op\x18\x01 \x01(\tR\x02op\x12\x17\n" + + "\x04item\x18\x02 \x01(\x05H\x00R\x04item\x88\x01\x01\x12 \n" + + "\titem_name\x18\x03 \x01(\tH\x01R\bitemName\x88\x01\x01\x12\x15\n" + + "\x03num\x18\x04 \x01(\x05H\x02R\x03num\x88\x01\x01\x12\x17\n" + + "\x04type\x18\x05 \x01(\tH\x03R\x04type\x88\x01\x01B\a\n" + + "\x05_itemB\f\n" + + "\n" + + "_item_nameB\x06\n" + + "\x04_numB\a\n" + + "\x05_type\"\x81\x02\n" + "\x11CreateRuleRequest\x12&\n" + "\fdevice_class\x18\x01 \x01(\tH\x00R\vdeviceClass\x88\x01\x01\x12%\n" + "\x0efailure_domain\x18\x02 \x01(\tR\rfailureDomain\x12\x12\n" + @@ -486,7 +528,7 @@ func file_crush_rule_proto_rawDescGZIP() []byte { } var file_crush_rule_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_crush_rule_proto_msgTypes = make([]protoimpl.MessageInfo, 7) +var file_crush_rule_proto_msgTypes = make([]protoimpl.MessageInfo, 6) var file_crush_rule_proto_goTypes = []any{ (PoolType)(0), // 0: ceph.PoolType (*Rule)(nil), // 1: ceph.Rule @@ -495,27 +537,25 @@ var file_crush_rule_proto_goTypes = []any{ (*DeleteRuleRequest)(nil), // 4: ceph.DeleteRuleRequest (*GetRuleRequest)(nil), // 5: ceph.GetRuleRequest (*ListRulesResponse)(nil), // 6: ceph.ListRulesResponse - nil, // 7: ceph.Step.EntriesEntry - (*emptypb.Empty)(nil), // 8: google.protobuf.Empty + (*emptypb.Empty)(nil), // 7: google.protobuf.Empty } var file_crush_rule_proto_depIdxs = []int32{ 2, // 0: ceph.Rule.steps:type_name -> ceph.Step - 7, // 1: ceph.Step.entries:type_name -> ceph.Step.EntriesEntry - 0, // 2: ceph.CreateRuleRequest.pool_type:type_name -> ceph.PoolType - 1, // 3: ceph.ListRulesResponse.rules:type_name -> ceph.Rule - 3, // 4: ceph.CrushRule.CreateRule:input_type -> ceph.CreateRuleRequest - 4, // 5: ceph.CrushRule.DeleteRule:input_type -> ceph.DeleteRuleRequest - 5, // 6: ceph.CrushRule.GetRule:input_type -> ceph.GetRuleRequest - 8, // 7: ceph.CrushRule.ListRules:input_type -> google.protobuf.Empty - 8, // 8: ceph.CrushRule.CreateRule:output_type -> google.protobuf.Empty - 8, // 9: ceph.CrushRule.DeleteRule:output_type -> google.protobuf.Empty - 1, // 10: ceph.CrushRule.GetRule:output_type -> ceph.Rule - 6, // 11: ceph.CrushRule.ListRules:output_type -> ceph.ListRulesResponse - 8, // [8:12] is the sub-list for method output_type - 4, // [4:8] is the sub-list for method input_type - 4, // [4:4] is the sub-list for extension type_name - 4, // [4:4] is the sub-list for extension extendee - 0, // [0:4] is the sub-list for field type_name + 0, // 1: ceph.CreateRuleRequest.pool_type:type_name -> ceph.PoolType + 1, // 2: ceph.ListRulesResponse.rules:type_name -> ceph.Rule + 3, // 3: ceph.CrushRule.CreateRule:input_type -> ceph.CreateRuleRequest + 4, // 4: ceph.CrushRule.DeleteRule:input_type -> ceph.DeleteRuleRequest + 5, // 5: ceph.CrushRule.GetRule:input_type -> ceph.GetRuleRequest + 7, // 6: ceph.CrushRule.ListRules:input_type -> google.protobuf.Empty + 7, // 7: ceph.CrushRule.CreateRule:output_type -> google.protobuf.Empty + 7, // 8: ceph.CrushRule.DeleteRule:output_type -> google.protobuf.Empty + 1, // 9: ceph.CrushRule.GetRule:output_type -> ceph.Rule + 6, // 10: ceph.CrushRule.ListRules:output_type -> ceph.ListRulesResponse + 7, // [7:11] is the sub-list for method output_type + 3, // [3:7] is the sub-list for method input_type + 3, // [3:3] is the sub-list for extension type_name + 3, // [3:3] is the sub-list for extension extendee + 0, // [0:3] is the sub-list for field type_name } func init() { file_crush_rule_proto_init() } @@ -523,6 +563,8 @@ func file_crush_rule_proto_init() { if File_crush_rule_proto != nil { return } + file_crush_rule_proto_msgTypes[0].OneofWrappers = []any{} + file_crush_rule_proto_msgTypes[1].OneofWrappers = []any{} file_crush_rule_proto_msgTypes[2].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ @@ -530,7 +572,7 @@ func file_crush_rule_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_crush_rule_proto_rawDesc), len(file_crush_rule_proto_rawDesc)), NumEnums: 1, - NumMessages: 7, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, diff --git a/api/gen/grpc/go/users.pb.go b/api/gen/grpc/go/users.pb.go index acd6fc6..823489c 100644 --- a/api/gen/grpc/go/users.pb.go +++ b/api/gen/grpc/go/users.pb.go @@ -281,9 +281,9 @@ type User struct { Email *string `protobuf:"bytes,1,opt,name=email,proto3,oneof" json:"email,omitempty"` Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` - LastUpdate *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_update,json=lastUpdate,proto3" json:"last_update,omitempty"` - PwdExpirationDate *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=pwd_expiration_date,json=pwdExpirationDate,proto3,oneof" json:"pwd_expiration_date,omitempty"` - PwdUpdateRequired bool `protobuf:"varint,6,opt,name=pwd_update_required,json=pwdUpdateRequired,proto3" json:"pwd_update_required,omitempty"` + LastUpdate *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=lastUpdate,proto3" json:"lastUpdate,omitempty"` + PwdExpirationDate *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=pwdExpirationDate,proto3,oneof" json:"pwdExpirationDate,omitempty"` + PwdUpdateRequired bool `protobuf:"varint,6,opt,name=pwdUpdateRequired,proto3" json:"pwdUpdateRequired,omitempty"` Roles []string `protobuf:"bytes,7,rep,name=roles,proto3" json:"roles,omitempty"` Username string `protobuf:"bytes,8,opt,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields @@ -426,8 +426,8 @@ type CreateUserReq struct { Enabled bool `protobuf:"varint,2,opt,name=enabled,proto3" json:"enabled,omitempty"` Name *string `protobuf:"bytes,3,opt,name=name,proto3,oneof" json:"name,omitempty"` Password string `protobuf:"bytes,4,opt,name=password,proto3" json:"password,omitempty"` - PwdExpirationDate *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=pwd_expiration_date,json=pwdExpirationDate,proto3,oneof" json:"pwd_expiration_date,omitempty"` - PwdUpdateRequired bool `protobuf:"varint,6,opt,name=pwd_update_required,json=pwdUpdateRequired,proto3" json:"pwd_update_required,omitempty"` + PwdExpirationDate *timestamppb.Timestamp `protobuf:"bytes,5,opt,name=pwdExpirationDate,proto3,oneof" json:"pwdExpirationDate,omitempty"` + PwdUpdateRequired bool `protobuf:"varint,6,opt,name=pwdUpdateRequired,proto3" json:"pwdUpdateRequired,omitempty"` Roles []string `protobuf:"bytes,7,rep,name=roles,proto3" json:"roles,omitempty"` Username string `protobuf:"bytes,8,opt,name=username,proto3" json:"username,omitempty"` unknownFields protoimpl.UnknownFields @@ -584,7 +584,7 @@ var File_users_proto protoreflect.FileDescriptor const file_users_proto_rawDesc = "" + "\n" + - "\vusers.proto\x12\x04ceph\x1a\x1fgoogle/protobuf/timestamp.proto\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\"-\n" + + "\vusers.proto\x12\x04ceph\x1a\x1bgoogle/protobuf/empty.proto\x1a\x1cgoogle/protobuf/struct.proto\x1a\x1fgoogle/protobuf/timestamp.proto\"-\n" + "\tRolesResp\x12 \n" + "\x05roles\x18\x01 \x03(\v2\n" + ".ceph.RoleR\x05roles\"\x9e\x02\n" + @@ -605,61 +605,66 @@ const file_users_proto_rawDesc = "" + "\bnew_name\x18\x02 \x01(\tR\bnew_name\"-\n" + "\tUsersResp\x12 \n" + "\x05users\x18\x01 \x03(\v2\n" + - ".ceph.UserR\x05users\"\xef\x02\n" + + ".ceph.UserR\x05users\"\xe8\x02\n" + "\x04User\x12\x19\n" + "\x05email\x18\x01 \x01(\tH\x00R\x05email\x88\x01\x01\x12\x18\n" + "\aenabled\x18\x02 \x01(\bR\aenabled\x12\x17\n" + - "\x04name\x18\x03 \x01(\tH\x01R\x04name\x88\x01\x01\x12;\n" + - "\vlast_update\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\n" + - "lastUpdate\x12O\n" + - "\x13pwd_expiration_date\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampH\x02R\x11pwdExpirationDate\x88\x01\x01\x12.\n" + - "\x13pwd_update_required\x18\x06 \x01(\bR\x11pwdUpdateRequired\x12\x14\n" + + "\x04name\x18\x03 \x01(\tH\x01R\x04name\x88\x01\x01\x12:\n" + + "\n" + + "lastUpdate\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\n" + + "lastUpdate\x12M\n" + + "\x11pwdExpirationDate\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampH\x02R\x11pwdExpirationDate\x88\x01\x01\x12,\n" + + "\x11pwdUpdateRequired\x18\x06 \x01(\bR\x11pwdUpdateRequired\x12\x14\n" + "\x05roles\x18\a \x03(\tR\x05roles\x12\x1a\n" + "\busername\x18\b \x01(\tR\busernameB\b\n" + "\x06_emailB\a\n" + - "\x05_nameB\x16\n" + - "\x14_pwd_expiration_date\"(\n" + + "\x05_nameB\x14\n" + + "\x12_pwdExpirationDate\"(\n" + "\n" + "GetUserReq\x12\x1a\n" + - "\busername\x18\x01 \x01(\tR\busername\"\xd7\x02\n" + + "\busername\x18\x01 \x01(\tR\busername\"\xd1\x02\n" + "\rCreateUserReq\x12\x19\n" + "\x05email\x18\x01 \x01(\tH\x00R\x05email\x88\x01\x01\x12\x18\n" + "\aenabled\x18\x02 \x01(\bR\aenabled\x12\x17\n" + "\x04name\x18\x03 \x01(\tH\x01R\x04name\x88\x01\x01\x12\x1a\n" + - "\bpassword\x18\x04 \x01(\tR\bpassword\x12O\n" + - "\x13pwd_expiration_date\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampH\x02R\x11pwdExpirationDate\x88\x01\x01\x12.\n" + - "\x13pwd_update_required\x18\x06 \x01(\bR\x11pwdUpdateRequired\x12\x14\n" + + "\bpassword\x18\x04 \x01(\tR\bpassword\x12M\n" + + "\x11pwdExpirationDate\x18\x05 \x01(\v2\x1a.google.protobuf.TimestampH\x02R\x11pwdExpirationDate\x88\x01\x01\x12,\n" + + "\x11pwdUpdateRequired\x18\x06 \x01(\bR\x11pwdUpdateRequired\x12\x14\n" + "\x05roles\x18\a \x03(\tR\x05roles\x12\x1a\n" + "\busername\x18\b \x01(\tR\busernameB\b\n" + "\x06_emailB\a\n" + - "\x05_nameB\x16\n" + - "\x14_pwd_expiration_date\"{\n" + + "\x05_nameB\x14\n" + + "\x12_pwdExpirationDate\"{\n" + "\x15UserChangePasswordReq\x12\x1a\n" + "\busername\x18\x01 \x01(\tR\busername\x12\"\n" + "\fold_password\x18\x02 \x01(\tR\fold_password\x12\"\n" + - "\fnew_password\x18\x03 \x01(\tR\fnew_password2\x93\x05\n" + + "\fnew_password\x18\x03 \x01(\tR\fnew_password2\xe3\x04\n" + "\x05Users\x124\n" + "\tListUsers\x12\x16.google.protobuf.Empty\x1a\x0f.ceph.UsersResp\x12'\n" + "\aGetUser\x12\x10.ceph.GetUserReq\x1a\n" + - ".ceph.User\x129\n" + + ".ceph.User\x12-\n" + "\n" + - "CreateUser\x12\x13.ceph.CreateUserReq\x1a\x16.google.protobuf.Empty\x126\n" + + "CreateUser\x12\x13.ceph.CreateUserReq\x1a\n" + + ".ceph.User\x126\n" + "\n" + - "DeleteUser\x12\x10.ceph.GetUserReq\x1a\x16.google.protobuf.Empty\x129\n" + + "DeleteUser\x12\x10.ceph.GetUserReq\x1a\x16.google.protobuf.Empty\x12-\n" + "\n" + - "UpdateUser\x12\x13.ceph.CreateUserReq\x1a\x16.google.protobuf.Empty\x12I\n" + + "UpdateUser\x12\x13.ceph.CreateUserReq\x1a\n" + + ".ceph.User\x12I\n" + "\x12UserChangePassword\x12\x1b.ceph.UserChangePasswordReq\x1a\x16.google.protobuf.Empty\x124\n" + "\tListRoles\x12\x16.google.protobuf.Empty\x1a\x0f.ceph.RolesResp\x12'\n" + "\aGetRole\x12\x10.ceph.GetRoleReq\x1a\n" + - ".ceph.Role\x120\n" + + ".ceph.Role\x12$\n" + "\n" + "CreateRole\x12\n" + - ".ceph.Role\x1a\x16.google.protobuf.Empty\x126\n" + + ".ceph.Role\x1a\n" + + ".ceph.Role\x126\n" + "\n" + - "DeleteRole\x12\x10.ceph.GetRoleReq\x1a\x16.google.protobuf.Empty\x120\n" + + "DeleteRole\x12\x10.ceph.GetRoleReq\x1a\x16.google.protobuf.Empty\x12$\n" + "\n" + "UpdateRole\x12\n" + - ".ceph.Role\x1a\x16.google.protobuf.Empty\x127\n" + + ".ceph.Role\x1a\n" + + ".ceph.Role\x127\n" + "\tCloneRole\x12\x12.ceph.CloneRoleReq\x1a\x16.google.protobuf.EmptyB'Z%github.com/clyso/ceph-api/api/ceph;pbb\x06proto3" var ( @@ -694,9 +699,9 @@ var file_users_proto_depIdxs = []int32{ 1, // 0: ceph.RolesResp.roles:type_name -> ceph.Role 9, // 1: ceph.Role.scopes_permissions:type_name -> ceph.Role.ScopesPermissionsEntry 5, // 2: ceph.UsersResp.users:type_name -> ceph.User - 10, // 3: ceph.User.last_update:type_name -> google.protobuf.Timestamp - 10, // 4: ceph.User.pwd_expiration_date:type_name -> google.protobuf.Timestamp - 10, // 5: ceph.CreateUserReq.pwd_expiration_date:type_name -> google.protobuf.Timestamp + 10, // 3: ceph.User.lastUpdate:type_name -> google.protobuf.Timestamp + 10, // 4: ceph.User.pwdExpirationDate:type_name -> google.protobuf.Timestamp + 10, // 5: ceph.CreateUserReq.pwdExpirationDate:type_name -> google.protobuf.Timestamp 11, // 6: ceph.Role.ScopesPermissionsEntry.value:type_name -> google.protobuf.ListValue 12, // 7: ceph.Users.ListUsers:input_type -> google.protobuf.Empty 6, // 8: ceph.Users.GetUser:input_type -> ceph.GetUserReq @@ -712,15 +717,15 @@ var file_users_proto_depIdxs = []int32{ 3, // 18: ceph.Users.CloneRole:input_type -> ceph.CloneRoleReq 4, // 19: ceph.Users.ListUsers:output_type -> ceph.UsersResp 5, // 20: ceph.Users.GetUser:output_type -> ceph.User - 12, // 21: ceph.Users.CreateUser:output_type -> google.protobuf.Empty + 5, // 21: ceph.Users.CreateUser:output_type -> ceph.User 12, // 22: ceph.Users.DeleteUser:output_type -> google.protobuf.Empty - 12, // 23: ceph.Users.UpdateUser:output_type -> google.protobuf.Empty + 5, // 23: ceph.Users.UpdateUser:output_type -> ceph.User 12, // 24: ceph.Users.UserChangePassword:output_type -> google.protobuf.Empty 0, // 25: ceph.Users.ListRoles:output_type -> ceph.RolesResp 1, // 26: ceph.Users.GetRole:output_type -> ceph.Role - 12, // 27: ceph.Users.CreateRole:output_type -> google.protobuf.Empty + 1, // 27: ceph.Users.CreateRole:output_type -> ceph.Role 12, // 28: ceph.Users.DeleteRole:output_type -> google.protobuf.Empty - 12, // 29: ceph.Users.UpdateRole:output_type -> google.protobuf.Empty + 1, // 29: ceph.Users.UpdateRole:output_type -> ceph.Role 12, // 30: ceph.Users.CloneRole:output_type -> google.protobuf.Empty 19, // [19:31] is the sub-list for method output_type 7, // [7:19] is the sub-list for method input_type diff --git a/api/gen/grpc/go/users_grpc.pb.go b/api/gen/grpc/go/users_grpc.pb.go index d96dfaf..9f7a8eb 100644 --- a/api/gen/grpc/go/users_grpc.pb.go +++ b/api/gen/grpc/go/users_grpc.pb.go @@ -40,15 +40,15 @@ const ( type UsersClient interface { ListUsers(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*UsersResp, error) GetUser(ctx context.Context, in *GetUserReq, opts ...grpc.CallOption) (*User, error) - CreateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) + CreateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*User, error) DeleteUser(ctx context.Context, in *GetUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) - UpdateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*User, error) UserChangePassword(ctx context.Context, in *UserChangePasswordReq, opts ...grpc.CallOption) (*emptypb.Empty, error) ListRoles(ctx context.Context, in *emptypb.Empty, opts ...grpc.CallOption) (*RolesResp, error) GetRole(ctx context.Context, in *GetRoleReq, opts ...grpc.CallOption) (*Role, error) - CreateRole(ctx context.Context, in *Role, opts ...grpc.CallOption) (*emptypb.Empty, error) + CreateRole(ctx context.Context, in *Role, opts ...grpc.CallOption) (*Role, error) DeleteRole(ctx context.Context, in *GetRoleReq, opts ...grpc.CallOption) (*emptypb.Empty, error) - UpdateRole(ctx context.Context, in *Role, opts ...grpc.CallOption) (*emptypb.Empty, error) + UpdateRole(ctx context.Context, in *Role, opts ...grpc.CallOption) (*Role, error) CloneRole(ctx context.Context, in *CloneRoleReq, opts ...grpc.CallOption) (*emptypb.Empty, error) } @@ -80,9 +80,9 @@ func (c *usersClient) GetUser(ctx context.Context, in *GetUserReq, opts ...grpc. return out, nil } -func (c *usersClient) CreateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *usersClient) CreateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*User, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(emptypb.Empty) + out := new(User) err := c.cc.Invoke(ctx, Users_CreateUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -100,9 +100,9 @@ func (c *usersClient) DeleteUser(ctx context.Context, in *GetUserReq, opts ...gr return out, nil } -func (c *usersClient) UpdateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *usersClient) UpdateUser(ctx context.Context, in *CreateUserReq, opts ...grpc.CallOption) (*User, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(emptypb.Empty) + out := new(User) err := c.cc.Invoke(ctx, Users_UpdateUser_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -140,9 +140,9 @@ func (c *usersClient) GetRole(ctx context.Context, in *GetRoleReq, opts ...grpc. return out, nil } -func (c *usersClient) CreateRole(ctx context.Context, in *Role, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *usersClient) CreateRole(ctx context.Context, in *Role, opts ...grpc.CallOption) (*Role, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(emptypb.Empty) + out := new(Role) err := c.cc.Invoke(ctx, Users_CreateRole_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -160,9 +160,9 @@ func (c *usersClient) DeleteRole(ctx context.Context, in *GetRoleReq, opts ...gr return out, nil } -func (c *usersClient) UpdateRole(ctx context.Context, in *Role, opts ...grpc.CallOption) (*emptypb.Empty, error) { +func (c *usersClient) UpdateRole(ctx context.Context, in *Role, opts ...grpc.CallOption) (*Role, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) - out := new(emptypb.Empty) + out := new(Role) err := c.cc.Invoke(ctx, Users_UpdateRole_FullMethodName, in, out, cOpts...) if err != nil { return nil, err @@ -186,15 +186,15 @@ func (c *usersClient) CloneRole(ctx context.Context, in *CloneRoleReq, opts ...g type UsersServer interface { ListUsers(context.Context, *emptypb.Empty) (*UsersResp, error) GetUser(context.Context, *GetUserReq) (*User, error) - CreateUser(context.Context, *CreateUserReq) (*emptypb.Empty, error) + CreateUser(context.Context, *CreateUserReq) (*User, error) DeleteUser(context.Context, *GetUserReq) (*emptypb.Empty, error) - UpdateUser(context.Context, *CreateUserReq) (*emptypb.Empty, error) + UpdateUser(context.Context, *CreateUserReq) (*User, error) UserChangePassword(context.Context, *UserChangePasswordReq) (*emptypb.Empty, error) ListRoles(context.Context, *emptypb.Empty) (*RolesResp, error) GetRole(context.Context, *GetRoleReq) (*Role, error) - CreateRole(context.Context, *Role) (*emptypb.Empty, error) + CreateRole(context.Context, *Role) (*Role, error) DeleteRole(context.Context, *GetRoleReq) (*emptypb.Empty, error) - UpdateRole(context.Context, *Role) (*emptypb.Empty, error) + UpdateRole(context.Context, *Role) (*Role, error) CloneRole(context.Context, *CloneRoleReq) (*emptypb.Empty, error) } @@ -211,13 +211,13 @@ func (UnimplementedUsersServer) ListUsers(context.Context, *emptypb.Empty) (*Use func (UnimplementedUsersServer) GetUser(context.Context, *GetUserReq) (*User, error) { return nil, status.Error(codes.Unimplemented, "method GetUser not implemented") } -func (UnimplementedUsersServer) CreateUser(context.Context, *CreateUserReq) (*emptypb.Empty, error) { +func (UnimplementedUsersServer) CreateUser(context.Context, *CreateUserReq) (*User, error) { return nil, status.Error(codes.Unimplemented, "method CreateUser not implemented") } func (UnimplementedUsersServer) DeleteUser(context.Context, *GetUserReq) (*emptypb.Empty, error) { return nil, status.Error(codes.Unimplemented, "method DeleteUser not implemented") } -func (UnimplementedUsersServer) UpdateUser(context.Context, *CreateUserReq) (*emptypb.Empty, error) { +func (UnimplementedUsersServer) UpdateUser(context.Context, *CreateUserReq) (*User, error) { return nil, status.Error(codes.Unimplemented, "method UpdateUser not implemented") } func (UnimplementedUsersServer) UserChangePassword(context.Context, *UserChangePasswordReq) (*emptypb.Empty, error) { @@ -229,13 +229,13 @@ func (UnimplementedUsersServer) ListRoles(context.Context, *emptypb.Empty) (*Rol func (UnimplementedUsersServer) GetRole(context.Context, *GetRoleReq) (*Role, error) { return nil, status.Error(codes.Unimplemented, "method GetRole not implemented") } -func (UnimplementedUsersServer) CreateRole(context.Context, *Role) (*emptypb.Empty, error) { +func (UnimplementedUsersServer) CreateRole(context.Context, *Role) (*Role, error) { return nil, status.Error(codes.Unimplemented, "method CreateRole not implemented") } func (UnimplementedUsersServer) DeleteRole(context.Context, *GetRoleReq) (*emptypb.Empty, error) { return nil, status.Error(codes.Unimplemented, "method DeleteRole not implemented") } -func (UnimplementedUsersServer) UpdateRole(context.Context, *Role) (*emptypb.Empty, error) { +func (UnimplementedUsersServer) UpdateRole(context.Context, *Role) (*Role, error) { return nil, status.Error(codes.Unimplemented, "method UpdateRole not implemented") } func (UnimplementedUsersServer) CloneRole(context.Context, *CloneRoleReq) (*emptypb.Empty, error) { diff --git a/api/http.yaml b/api/http.yaml index e8e29e3..fe7dbcb 100644 --- a/api/http.yaml +++ b/api/http.yaml @@ -14,9 +14,11 @@ http: - selector: ceph.Cluster.CreateUser post: /api/cluster/user body: "*" + response_body: "status" - selector: ceph.Cluster.UpdateUser put: /api/cluster/user body: "*" + response_body: "status" - selector: ceph.Cluster.ExportUser post: /api/cluster/user/export body: "*" diff --git a/api/openapi/ceph-api.swagger.json b/api/openapi/ceph-api.swagger.json index 0510686..9453c0d 100644 --- a/api/openapi/ceph-api.swagger.json +++ b/api/openapi/ceph-api.swagger.json @@ -334,10 +334,9 @@ "operationId": "Cluster_CreateUser", "responses": { "200": { - "description": "A successful response.", + "description": "Dashboard-compatible status string, e.g. \"Successfully created user 'client.x'\".", "schema": { - "type": "object", - "properties": {} + "type": "string" } }, "default": { @@ -365,10 +364,9 @@ "operationId": "Cluster_UpdateUser", "responses": { "200": { - "description": "A successful response.", + "description": "Dashboard-compatible status string, e.g. \"Successfully created user 'client.x'\".", "schema": { - "type": "object", - "properties": {} + "type": "string" } }, "default": { @@ -603,8 +601,7 @@ "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/cephRole" } }, "default": { @@ -693,8 +690,7 @@ "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/cephRole" } }, "default": { @@ -871,8 +867,7 @@ "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/cephUser" } }, "default": { @@ -998,8 +993,7 @@ "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/cephUser" } }, "default": { @@ -2333,6 +2327,15 @@ } } }, + "cephClusterUserStatusResp": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Dashboard-compatible status string, e.g. \"Successfully created user 'client.x'\"." + } + } + }, "cephClusterUsers": { "type": "object", "properties": { @@ -2427,7 +2430,6 @@ }, "import_data": { "type": "string", - "format": "byte", "title": "keyring file format - if import_data is set then other fields ignored" } } @@ -2471,11 +2473,11 @@ "password": { "type": "string" }, - "pwd_expiration_date": { + "pwdExpirationDate": { "type": "string", "format": "date-time" }, - "pwd_update_required": { + "pwdUpdateRequired": { "type": "boolean" }, "roles": { @@ -4321,27 +4323,27 @@ "type": "object", "properties": { "rule_id": { - "type": "string", - "format": "int64" + "type": "integer", + "format": "int32" }, "rule_name": { "type": "string" }, "ruleset": { - "type": "string", - "format": "int64" + "type": "integer", + "format": "int32" }, "type": { - "type": "string", - "format": "int64" + "type": "integer", + "format": "int32" }, "min_size": { - "type": "string", - "format": "int64" + "type": "integer", + "format": "int32" }, "max_size": { - "type": "string", - "format": "int64" + "type": "integer", + "format": "int32" }, "steps": { "type": "array", @@ -4367,11 +4369,22 @@ "cephStep": { "type": "object", "properties": { - "entries": { - "type": "object", - "additionalProperties": { - "type": "string" - } + "op": { + "type": "string" + }, + "item": { + "type": "integer", + "format": "int32" + }, + "item_name": { + "type": "string" + }, + "num": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" } } }, @@ -4437,15 +4450,15 @@ "name": { "type": "string" }, - "last_update": { + "lastUpdate": { "type": "string", "format": "date-time" }, - "pwd_expiration_date": { + "pwdExpirationDate": { "type": "string", "format": "date-time" }, - "pwd_update_required": { + "pwdUpdateRequired": { "type": "boolean" }, "roles": { @@ -4486,11 +4499,11 @@ "password": { "type": "string" }, - "pwd_expiration_date": { + "pwdExpirationDate": { "type": "string", "format": "date-time" }, - "pwd_update_required": { + "pwdUpdateRequired": { "type": "boolean" }, "roles": { diff --git a/api/users.proto b/api/users.proto index 0ba7acf..fd62486 100644 --- a/api/users.proto +++ b/api/users.proto @@ -4,24 +4,24 @@ option go_package = "github.com/clyso/ceph-api/api/ceph;pb"; package ceph; -import "google/protobuf/timestamp.proto"; import "google/protobuf/empty.proto"; import "google/protobuf/struct.proto"; +import "google/protobuf/timestamp.proto"; service Users { rpc ListUsers (google.protobuf.Empty) returns (UsersResp); rpc GetUser (GetUserReq) returns (User); - rpc CreateUser (CreateUserReq) returns (google.protobuf.Empty); + rpc CreateUser (CreateUserReq) returns (User); rpc DeleteUser (GetUserReq) returns (google.protobuf.Empty); - rpc UpdateUser (CreateUserReq) returns (google.protobuf.Empty); + rpc UpdateUser (CreateUserReq) returns (User); rpc UserChangePassword (UserChangePasswordReq) returns (google.protobuf.Empty); rpc ListRoles (google.protobuf.Empty) returns (RolesResp); rpc GetRole (GetRoleReq) returns (Role); - rpc CreateRole (Role) returns (google.protobuf.Empty); + rpc CreateRole (Role) returns (Role); rpc DeleteRole (GetRoleReq) returns (google.protobuf.Empty); - rpc UpdateRole (Role) returns (google.protobuf.Empty); + rpc UpdateRole (Role) returns (Role); rpc CloneRole (CloneRoleReq) returns (google.protobuf.Empty); } @@ -53,9 +53,9 @@ message User { optional string email =1; bool enabled =2; optional string name =3; - google.protobuf.Timestamp last_update =4; - optional google.protobuf.Timestamp pwd_expiration_date =5; - bool pwd_update_required =6; + google.protobuf.Timestamp lastUpdate =4; + optional google.protobuf.Timestamp pwdExpirationDate =5; + bool pwdUpdateRequired =6; repeated string roles=7; string username=8; } @@ -69,8 +69,8 @@ message CreateUserReq { bool enabled =2; optional string name =3; string password =4; - optional google.protobuf.Timestamp pwd_expiration_date =5; - bool pwd_update_required =6; + optional google.protobuf.Timestamp pwdExpirationDate =5; + bool pwdUpdateRequired =6; repeated string roles=7; string username=8; } diff --git a/pkg/api/cluster_api_handlers.go b/pkg/api/cluster_api_handlers.go index aca313f..38a75a0 100644 --- a/pkg/api/cluster_api_handlers.go +++ b/pkg/api/cluster_api_handlers.go @@ -61,18 +61,18 @@ func (c *clusterAPI) ExportUser(ctx context.Context, req *pb.ExportClusterUserRe return &pb.ExportClusterUserResp{Data: buf.String()}, nil } -func (c *clusterAPI) CreateUser(ctx context.Context, req *pb.CreateClusterUserReq) (*emptypb.Empty, error) { +func (c *clusterAPI) CreateUser(ctx context.Context, req *pb.CreateClusterUserReq) (*pb.ClusterUserStatusResp, error) { if err := user.HasPermissions(ctx, user.ScopeConfigOpt, user.PermCreate); err != nil { return nil, err } - if len(req.ImportData) != 0 { + if req.ImportData != "" { zerolog.Ctx(ctx).Debug().Msg("import user data") const monCmd = `{"prefix": "auth import"}` - _, err := c.radosSvc.ExecMonWithInputBuff(ctx, monCmd, req.ImportData) + _, err := c.radosSvc.ExecMonWithInputBuff(ctx, monCmd, []byte(req.ImportData)) if err != nil { return nil, err } - return &emptypb.Empty{}, nil + return &pb.ClusterUserStatusResp{Status: "Successfully imported user"}, nil } const cmdTempl = `{"prefix": "auth add", "entity": "%s", "caps": [%s]}` @@ -85,7 +85,7 @@ func (c *clusterAPI) CreateUser(ctx context.Context, req *pb.CreateClusterUserRe if err != nil { return nil, err } - return &emptypb.Empty{}, nil + return &pb.ClusterUserStatusResp{Status: fmt.Sprintf("Successfully created user '%s'", req.UserEntity)}, nil } // GetUsers implements pb.ClusterServer. @@ -115,7 +115,7 @@ func (c *clusterAPI) GetUsers(ctx context.Context, _ *emptypb.Empty) (*pb.Cluste return &pb.ClusterUsers{Users: res.AuthDump}, nil } -func (c *clusterAPI) UpdateUser(ctx context.Context, req *pb.UpdateClusterUserReq) (*emptypb.Empty, error) { +func (c *clusterAPI) UpdateUser(ctx context.Context, req *pb.UpdateClusterUserReq) (*pb.ClusterUserStatusResp, error) { if err := user.HasPermissions(ctx, user.ScopeConfigOpt, user.PermUpdate); err != nil { return nil, err } @@ -132,7 +132,7 @@ func (c *clusterAPI) UpdateUser(ctx context.Context, req *pb.UpdateClusterUserRe } return nil, err } - return &emptypb.Empty{}, nil + return &pb.ClusterUserStatusResp{Status: fmt.Sprintf("Successfully edited user '%s'", req.UserEntity)}, nil } func (c *clusterAPI) GetStatus(ctx context.Context, _ *emptypb.Empty) (*pb.ClusterStatus, error) { diff --git a/pkg/api/users_api_handlers.go b/pkg/api/users_api_handlers.go index 63c875c..67dec36 100644 --- a/pkg/api/users_api_handlers.go +++ b/pkg/api/users_api_handlers.go @@ -2,6 +2,7 @@ package api import ( "context" + "sort" pb "github.com/clyso/ceph-api/api/gen/grpc/go" xctx "github.com/clyso/ceph-api/pkg/ctx" @@ -33,15 +34,18 @@ func (u *usersAPI) CloneRole(ctx context.Context, req *pb.CloneRoleReq) (*emptyp return &emptypb.Empty{}, nil } -func (u *usersAPI) CreateRole(ctx context.Context, req *pb.Role) (*emptypb.Empty, error) { +func (u *usersAPI) CreateRole(ctx context.Context, req *pb.Role) (*pb.Role, error) { if err := user.HasPermissions(ctx, user.ScopeUser, user.PermCreate); err != nil { return nil, err } - err := u.svc.CreateRole(ctx, roleFromPb(req)) + if err := u.svc.CreateRole(ctx, roleFromPb(req)); err != nil { + return nil, err + } + role, err := u.svc.GetRole(ctx, req.Name) if err != nil { return nil, err } - return &emptypb.Empty{}, nil + return roleToPb(role), nil } func roleFromPb(r *pb.Role) user.Role { @@ -50,6 +54,10 @@ func roleFromPb(r *pb.Role) user.Role { for _, p := range v.Values { permissions[k] = append(permissions[k], p.GetStringValue()) } + // Dashboard's Role.set_scope_permissions sorts permissions alphabetically + // before storing, so the GET round-trip emits them in sorted order. Mirror + // that here to keep the wire shape identical. + sort.Strings(permissions[k]) } return user.Role{ @@ -113,15 +121,18 @@ func (u *usersAPI) ListRoles(ctx context.Context, _ *emptypb.Empty) (*pb.RolesRe return &pb.RolesResp{Roles: res}, nil } -func (u *usersAPI) UpdateRole(ctx context.Context, req *pb.Role) (*emptypb.Empty, error) { +func (u *usersAPI) UpdateRole(ctx context.Context, req *pb.Role) (*pb.Role, error) { if err := user.HasPermissions(ctx, user.ScopeUser, user.PermUpdate); err != nil { return nil, err } - err := u.svc.UpdateRole(ctx, roleFromPb(req)) + if err := u.svc.UpdateRole(ctx, roleFromPb(req)); err != nil { + return nil, err + } + role, err := u.svc.GetRole(ctx, req.Name) if err != nil { return nil, err } - return &emptypb.Empty{}, nil + return roleToPb(role), nil } func (u *usersAPI) UserChangePassword(ctx context.Context, req *pb.UserChangePasswordReq) (*emptypb.Empty, error) { @@ -135,7 +146,7 @@ func (u *usersAPI) UserChangePassword(ctx context.Context, req *pb.UserChangePas return &emptypb.Empty{}, nil } -func (u *usersAPI) CreateUser(ctx context.Context, req *pb.CreateUserReq) (*emptypb.Empty, error) { +func (u *usersAPI) CreateUser(ctx context.Context, req *pb.CreateUserReq) (*pb.User, error) { if err := user.HasPermissions(ctx, user.ScopeUser, user.PermCreate); err != nil { return nil, err } @@ -146,17 +157,20 @@ func (u *usersAPI) CreateUser(ctx context.Context, req *pb.CreateUserReq) (*empt Name: req.Name, Email: req.Email, Enabled: req.Enabled, - PwdUpdateRequired: false, + PwdUpdateRequired: req.PwdUpdateRequired, } if req.PwdExpirationDate != nil { expIn := int(req.PwdExpirationDate.Seconds) usr.PwdExpirationDate = &expIn } - err := u.svc.CreateUser(ctx, usr) + if err := u.svc.CreateUser(ctx, usr); err != nil { + return nil, err + } + created, err := u.svc.GetUser(ctx, req.Username) if err != nil { return nil, err } - return &emptypb.Empty{}, nil + return userToPb(created), nil } func (u *usersAPI) DeleteUser(ctx context.Context, req *pb.GetUserReq) (*emptypb.Empty, error) { @@ -212,7 +226,7 @@ func (u *usersAPI) ListUsers(ctx context.Context, _ *emptypb.Empty) (*pb.UsersRe return &pb.UsersResp{Users: res}, nil } -func (u *usersAPI) UpdateUser(ctx context.Context, req *pb.CreateUserReq) (*emptypb.Empty, error) { +func (u *usersAPI) UpdateUser(ctx context.Context, req *pb.CreateUserReq) (*pb.User, error) { if err := user.HasPermissions(ctx, user.ScopeUser, user.PermUpdate); err != nil { return nil, err } @@ -229,9 +243,12 @@ func (u *usersAPI) UpdateUser(ctx context.Context, req *pb.CreateUserReq) (*empt expIn := int(req.PwdExpirationDate.Seconds) usr.PwdExpirationDate = &expIn } - err := u.svc.UpdateUser(ctx, usr) + if err := u.svc.UpdateUser(ctx, usr); err != nil { + return nil, err + } + updated, err := u.svc.GetUser(ctx, req.Username) if err != nil { return nil, err } - return &emptypb.Empty{}, nil + return userToPb(updated), nil } diff --git a/tasks/phase-2.3-followup.md b/tasks/phase-2.3-followup.md new file mode 100644 index 0000000..ef1a615 --- /dev/null +++ b/tasks/phase-2.3-followup.md @@ -0,0 +1,59 @@ +# Phase 2.3 follow-up — retire root `$` ignores in `test/parity/api_diff.yaml` + +Read project `CLAUDE.md` first. Don't `git commit` — user reviews and commits manually. + +## Goal + +Every `path: $` entry in `test/parity/api_diff.yaml` is body-shape debt +between ceph-api and the upstream Ceph dashboard. Retire each one by +fixing ceph-api to match the dashboard's wire shape. If that's not +feasible, replace with tightly-scoped per-field ignores. + +## Rules + +- An endpoint can be excluded from the dashboard pass only via + `/api/auth*` prefix or absent-from-dashboard-openapi. No manual + skip list — reintroducing one is a regression. +- Every recorded call must return 2xx on both backends; assert at + the call site with `require.True`. +- After every change: `make lint && make check`. Then `make e2e-test` + (docker / colima up on macOS). +- `make proto` after any `.proto` edit. + +## Open `path: $` ignores + +| Endpoint | Divergence | Fix | +|---|---|---| +| `POST /api/cluster/user`, `PUT /api/cluster/user` | dash returns status-string; ours returns Empty | change RPC return type; have the handler return the resource (or a `google.protobuf.StringValue` if matching dashboard's string body) | +| `POST /api/cluster/user/export` | cephx key is random per `auth add` so the two backends' exports differ only in the key | seed both creates with `import_data` carrying a fixed key, re-export | +| `POST /api/role`, `PUT /api/role/{name}` | dash returns the resource; ours Empty | change RPC return type to `Role`; read role back after the write | +| `POST /api/user`, `PUT /api/user/{username}` | dash returns the resource; ours Empty | change RPC return type to `User`; read user back after the write | +| `POST /api/user/{username}/change_password` | error-path fixture (admin lacks self-change context); error envelopes diverge | replace with positive fixture — create a test user, log in as it, change pw, expect 2xx | +| `POST /api/crush_rule` | dash returns the Rule; ours Empty | change RPC return type to `Rule`; read the rule back from `osd crush dump` | +| `GET /api/user` | list-length differs (dashboard caches user table at startup; ceph-api writes via `mgr/dashboard/accessdb_v2` aren't seen) | reload the dashboard's accessdb in `testenv` before the parity pass, or drop the list from parity in favor of a coverage-only ours-side test | + +## Per-field ignores worth closing + +- `GET /api/user/{username}` — dashboard's User module uses camelCase + (`lastUpdate`, `pwdUpdateRequired`, `pwdExpirationDate`); ours snake_case + via project-wide `UseProtoNames: true`. Add per-field `json_name` + annotations on the User proto so just these three fields emit + camelCase. The `name`/`email` ignores are both-null false positives + — remove them. +- `GET /api/crush_rule` and `GET /api/crush_rule/{name}` — int64 + protojson-as-string (consider int32 in proto if precision allows); + Step shape rewrite from `map entries` to typed + `{op, item, item_name, num, type}`. Heavier — split off if needed. + +## Optional plumbing + +`parity.Init` currently takes three file paths. Cleaner: take `[]byte` +per source so callers use `//go:embed` and the parity package never +touches the filesystem. Files stay where they are. + +## Done when + +- `test/parity/api_diff.yaml` has zero `path: $` entries (or each + remaining one has a non-trivial reason). +- `make full-gate` exits 0. +- Every parity test asserts 2xx at every call site. diff --git a/test/cluster_api_test.go b/test/cluster_api_test.go index dfad056..3eb8aed 100644 --- a/test/cluster_api_test.go +++ b/test/cluster_api_test.go @@ -114,7 +114,7 @@ func Test_ClusterUsers(t *testing.T) { } r.Nil(created, "user was removed from list") - _, err = client.CreateUser(tstCtx, &pb.CreateClusterUserReq{ImportData: []byte(exp.Data)}) + _, err = client.CreateUser(tstCtx, &pb.CreateClusterUserReq{ImportData: exp.Data}) r.NoError(err, "user was imported back from export data") users2, err = client.GetUsers(tstCtx, &emptypb.Empty{}) diff --git a/test/cluster_parity_test.go b/test/cluster_parity_test.go index 1963360..4e6cc89 100644 --- a/test/cluster_parity_test.go +++ b/test/cluster_parity_test.go @@ -28,10 +28,12 @@ func Test_Parity_Cluster_Status(t *testing.T) { } for _, b := range r.Backends(get) { - r.DoRecord(b, get) + resp, _ := r.DoRecord(b, get) + require.True(t, resp.StatusCode/100 == 2, "%s: get cluster status: status %d", b, resp.StatusCode) } for _, b := range r.Backends(put) { - r.DoRecord(b, put) + resp, _ := r.DoRecord(b, put) + require.True(t, resp.StatusCode/100 == 2, "%s: put cluster status: status %d", b, resp.StatusCode) } t.Cleanup(func() { @@ -47,7 +49,8 @@ func Test_Parity_Cluster_ConfigSearch(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/cluster/config/search", Accept: clusterStatusAccept} for _, b := range r.Backends(call) { - r.DoRecord(b, call) + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: config search: status %d", b, resp.StatusCode) } } @@ -55,9 +58,14 @@ func Test_Parity_Cluster_Users_CRUD(t *testing.T) { r := parity.New(t) const entity = "client.parity-cluster-user" + // Fixed cephx key so both backends' `auth import` results are byte-identical + // and the export bodies match. `auth add` would generate a fresh random key + // per backend, leaving the export pair diverging on the key value alone. + const importData = "[client.parity-cluster-user]\n" + + "\tkey = AQDe6jdmAAAAABAAyVQa6dJoHpzaTBLcQjQGOQ==\n" + + "\tcaps mon = \"allow r\"\n" createBody := map[string]any{ - "user_entity": entity, - "capabilities": []map[string]string{{"entity": "mon", "cap": "allow r"}}, + "import_data": importData, } updateBody := map[string]any{ "user_entity": entity, @@ -79,12 +87,15 @@ func Test_Parity_Cluster_Users_CRUD(t *testing.T) { t.Cleanup(func() { r.Do(parity.Ours, del) }) for _, b := range r.Backends(list) { - r.DoRecord(b, list) - resp, _ := r.DoRecord(b, create) + resp, _ := r.DoRecord(b, list) + require.True(t, resp.StatusCode/100 == 2, "%s: list cluster users: status %d", b, resp.StatusCode) + resp, _ = r.DoRecord(b, create) require.True(t, resp.StatusCode/100 == 2 || resp.StatusCode == http.StatusConflict, "%s: create cluster user: status %d", b, resp.StatusCode) - r.DoRecord(b, update) - r.DoRecord(b, export) + resp, _ = r.DoRecord(b, update) + require.True(t, resp.StatusCode/100 == 2, "%s: update cluster user: status %d", b, resp.StatusCode) + resp, _ = r.DoRecord(b, export) + require.True(t, resp.StatusCode/100 == 2, "%s: export cluster user: status %d", b, resp.StatusCode) resp, _ = r.DoRecord(b, del) require.True(t, resp.StatusCode/100 == 2, "%s: delete cluster user: status %d", b, resp.StatusCode) diff --git a/test/crush_rule_parity_test.go b/test/crush_rule_parity_test.go index f10f330..e646cc7 100644 --- a/test/crush_rule_parity_test.go +++ b/test/crush_rule_parity_test.go @@ -21,7 +21,8 @@ func Test_Parity_CrushRule_List(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/crush_rule", Accept: crushRuleReadAccept} for _, b := range r.Backends(call) { - r.DoRecord(b, call) + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: list crush rules: status %d", b, resp.StatusCode) } } @@ -33,7 +34,8 @@ func Test_Parity_CrushRule_Get(t *testing.T) { Accept: crushRuleReadAccept, } for _, b := range r.Backends(get) { - r.DoRecord(b, get) + resp, _ := r.DoRecord(b, get) + require.True(t, resp.StatusCode/100 == 2, "%s: get crush rule: status %d", b, resp.StatusCode) } } diff --git a/test/parity/api_diff.yaml b/test/parity/api_diff.yaml index 0f7d83d..4defd25 100644 --- a/test/parity/api_diff.yaml +++ b/test/parity/api_diff.yaml @@ -13,115 +13,9 @@ # whose response (or request) shape is known divergent. Each one is a # debt: walk them in the next iteration and either match the dashboard # or document a hard reason why we can't. - -# /api/cluster/user — POST/PUT bodies still diverge: dashboard returns -# a status-string ("Successfully created/edited user '..'"), ceph-api -# returns Empty. Same CUD-returns-resource debt as /api/role and /api/user. -"POST /api/cluster/user": - - path: $ - reason: dashboard returns a status-string body; ceph-api returns Empty. CUD-returns-resource debt. -"PUT /api/cluster/user": - - path: $ - reason: dashboard returns a status-string body; ceph-api returns Empty. CUD-returns-resource debt. -"POST /api/cluster/user/export": - - path: $ - reason: each backend's `POST /api/cluster/user` calls `auth add` independently and ceph generates a fresh random cephx key per create; the exported body differs only in the key value. To close, seed both creates with import_data carrying a fixed key. - -# /api/crush_rule — proto Rule serializes int64 fields as strings -# (protojson convention), and models step as `map entries` -# while the dashboard returns typed step fields. Fix wants a proto rework. -"GET /api/crush_rule": - - path: $.*.rule_id - reason: protojson serializes proto int64 as string; dashboard returns integer. - - path: $.*.type - reason: same int64-as-string protojson convention. - - path: $.*.ruleset - reason: ceph-api proto Rule emits ruleset 0 as string; dashboard returns the real CRUSH ruleset integer. - - path: $.*.min_size - reason: ceph-api proto Rule emits min_size as string; dashboard returns integer. - - path: $.*.max_size - reason: ceph-api proto Rule emits max_size as string; dashboard returns integer. - - path: $.*.steps.*.entries - reason: ceph-api Step is `map entries`; dashboard returns typed step fields (op/item/item_name/num/type). - - path: $.*.steps.*.op - reason: typed step field not represented in ceph-api proto. See $.*.steps.*.entries. - - path: $.*.steps.*.item - reason: see $.*.steps.*.entries. - - path: $.*.steps.*.item_name - reason: see $.*.steps.*.entries. - - path: $.*.steps.*.num - reason: see $.*.steps.*.entries. - - path: $.*.steps.*.type - reason: see $.*.steps.*.entries. - -"GET /api/crush_rule/{name}": - - path: $.rule_id - reason: protojson serializes proto int64 as string; dashboard returns integer. - - path: $.type - reason: same int64-as-string protojson convention. - - path: $.ruleset - reason: ceph-api proto Rule emits 0 as string; dashboard returns the real CRUSH ruleset integer. - - path: $.min_size - reason: ceph-api proto Rule emits min_size as string; dashboard returns integer. - - path: $.max_size - reason: ceph-api proto Rule emits max_size as string; dashboard returns integer. - - path: $.steps.*.entries - reason: ceph-api Step is map entries; dashboard returns typed step fields. - - path: $.steps.*.op - reason: see $.steps.*.entries. - - path: $.steps.*.item - reason: see $.steps.*.entries. - - path: $.steps.*.item_name - reason: see $.steps.*.entries. - - path: $.steps.*.num - reason: see $.steps.*.entries. - - path: $.steps.*.type - reason: see $.steps.*.entries. - -"POST /api/crush_rule": - - path: $ - reason: dashboard returns the created Rule resource; ceph-api returns Empty. Could match if CreateRule returns the rule. - -# /api/user — dashboard's User module uses camelCase -# (lastUpdate/pwdUpdateRequired/pwdExpirationDate); ceph-api emits -# snake_case via UseProtoNames. Either side has to break convention to -# converge. The list-length divergence is dashboard caching its user -# table at startup. -"GET /api/user": - - path: $ - reason: dashboard's User module is the lone camelCase outlier in dashboard's API; ceph-api uses project-wide snake_case (UseProtoNames). List length also differs because the dashboard caches users at startup and doesn't see entries ceph-api added later via mgr config-key set. -"GET /api/user/{username}": - - path: $.lastUpdate - reason: dashboard camelCase; ceph-api emits snake_case last_update. - - path: $.last_update - reason: see $.lastUpdate (symmetric extra-vs-missing). - - path: $.pwdUpdateRequired - reason: dashboard camelCase; ceph-api emits snake_case pwd_update_required. - - path: $.pwd_update_required - reason: see $.pwdUpdateRequired. - - path: $.pwdExpirationDate - reason: dashboard camelCase; ceph-api emits pwd_expiration_date as google.protobuf.Timestamp (ISO-8601) rather than a unix integer. - - path: $.pwd_expiration_date - reason: see $.pwdExpirationDate. - - path: $.name - reason: declared field; both sides return null/absent for this fixture, recorded as missing on both. - - path: $.email - reason: declared field; both sides return null/absent for this fixture. -"POST /api/user": - - path: $ - reason: dashboard returns the created User resource; ceph-api returns Empty. -"PUT /api/user/{username}": - - path: $ - reason: dashboard returns the updated User resource; ceph-api returns Empty. -"POST /api/user/{username}/change_password": - - path: $ - reason: "error-path test (admin user lacks self-change context); error envelope formats diverge (ceph-api google.rpc.Status, dashboard {status,detail,request_id}). Move to a positive-case fixture when feasible." - -# /api/role — ceph-api now emits `system` via proto; what's left is -# the create/update returning the resource on dashboard vs Empty on ours. -"POST /api/role": - - path: $ - reason: dashboard returns the created Role resource; ceph-api returns Empty. -"PUT /api/role/{name}": - - path: $ - reason: dashboard returns the updated Role resource; ceph-api returns Empty. +# +# **Policy.** Prefer well-typed proto APIs (Timestamp, int64) for the +# gRPC surface; the matcher already coerces the resulting JSON-shape +# divergences (RFC3339-vs-unix-seconds, int64-as-string-vs-int) so they +# do not need per-endpoint ignores. See CLAUDE.md → "Parity vs API +# quality" for the decision rule. diff --git a/test/parity/diff.go b/test/parity/diff.go index b4025ed..c20d95d 100644 --- a/test/parity/diff.go +++ b/test/parity/diff.go @@ -7,8 +7,15 @@ import ( "sort" "strconv" "strings" + "time" ) +// timestampSkewTolerance bounds the wall-clock difference between the two +// recorded RFC3339-vs-unix-seconds samples. The recorder hits dashboard +// then ours sequentially, so a CRUD response's `lastUpdate` can disagree +// by the inter-call gap. Generous on slow CI. +const timestampSkewTolerance = 5 * time.Second + // Ignore declares a JSONPath that the diff walker should skip, with a // mandatory reason so the divergence catalogue stays audit-readable. type Ignore struct { @@ -68,6 +75,18 @@ func walk(path []string, expected, actual any, patterns [][]string) []Diff { return walkArray(path, e, a, patterns) default: if reflect.TypeOf(expected) != reflect.TypeOf(actual) { + // Two well-known proto-vs-dashboard JSON-shape divergences are + // suppressed inline rather than per-endpoint: + // - google.protobuf.Timestamp ↔ unix-seconds integer + // - protojson int64-as-string ↔ JSON integer + // Keeps api_diff.yaml from being polluted with the same boilerplate + // every time we expose a typed proto field. See CLAUDE.md. + if matched, applied := coerceEqual(expected, actual); applied { + if matched { + return nil + } + return []Diff{{Path: pathStr(path), Kind: "value", Expected: expected, Actual: actual}} + } return typeDiff(path, expected, actual) } if !scalarEqual(expected, actual) { @@ -77,6 +96,46 @@ func walk(path []string, expected, actual any, patterns [][]string) []Diff { } } +// coerceEqual lets the diff matcher treat protojson's idiomatic scalar +// encodings as equivalent to the dashboard's plain-JSON encoding: +// - RFC3339 timestamp string ↔ unix-seconds JSON number (matches when +// the wall-clock difference is within timestampSkewTolerance). +// - int64-as-JSON-string ↔ JSON number (matches when the integer values +// are equal). +// +// `applied` is true when one side was a string the function recognised as +// either form; only then is `matched` meaningful. If both sides have the +// same kind, or the string isn't recognised, returns (false, false) and +// the walker falls through to its normal type-diff behaviour. +func coerceEqual(a, b any) (matched, applied bool) { + aStr, aIsStr := a.(string) + bStr, bIsStr := b.(string) + if aIsStr == bIsStr { + return false, false + } + str := aStr + other := b + if bIsStr { + str = bStr + other = a + } + num, ok := other.(float64) + if !ok { + return false, false + } + if t, err := time.Parse(time.RFC3339Nano, str); err == nil { + skew := time.Duration(int64(num)-t.Unix()) * time.Second + if skew < 0 { + skew = -skew + } + return skew <= timestampSkewTolerance, true + } + if i, err := strconv.ParseInt(str, 10, 64); err == nil { + return float64(i) == num, true + } + return false, false +} + func walkMap(path []string, expected, actual map[string]any, patterns [][]string) []Diff { keys := unionKeys(expected, actual) var diffs []Diff @@ -88,11 +147,21 @@ func walkMap(path []string, expected, actual map[string]any, patterns [][]string case eok && aok: diffs = append(diffs, walk(sub, ev, av, patterns)...) case !aok: + // protojson with EmitUnpopulated emits unset proto3 optional + // fields as null; the dashboard's hand-rolled JSON usually + // omits them. Treat null on one side and absent on the other + // as equivalent so the matcher doesn't false-positive on that. + if ev == nil { + continue + } if matchesAny(sub, patterns) { continue } diffs = append(diffs, Diff{Path: pathStr(sub), Kind: "missing", Expected: ev}) case !eok: + if av == nil { + continue + } if matchesAny(sub, patterns) { continue } diff --git a/test/parity/diff_test.go b/test/parity/diff_test.go index e8fe0d8..97e4f93 100644 --- a/test/parity/diff_test.go +++ b/test/parity/diff_test.go @@ -29,7 +29,9 @@ func TestCompare_ScalarDiffers(t *testing.T) { } func TestCompare_TypeMismatch(t *testing.T) { - d := Compare(jsonAny(t, `1`), jsonAny(t, `"1"`), nil) + // Pick a string that doesn't parse as int or RFC3339 so the matcher + // can't coerce it to the numeric side. + d := Compare(jsonAny(t, `1`), jsonAny(t, `"hello"`), nil) if len(d) != 1 || d[0].Kind != "type" { t.Fatalf("expected type diff, got %v", d) } @@ -48,6 +50,57 @@ func TestCompare_MissingAndExtraKeys(t *testing.T) { } } +func TestCompare_TimestampStringEqualsUnixSeconds(t *testing.T) { + // protojson emits Timestamp as RFC3339; dashboard emits the same instant + // as a unix-seconds integer. Matcher should treat them as equivalent. + exp := jsonAny(t, `{"lastUpdate": 1700000000}`) + act := jsonAny(t, `{"lastUpdate": "2023-11-14T22:13:20Z"}`) + if d := Compare(exp, act, nil); len(d) != 0 { + t.Fatalf("expected RFC3339-vs-unix coercion to match, got %v", d) + } + // Within the skew tolerance — CRUD endpoints record sequentially so the + // two timestamps can disagree by the inter-call gap. + exp = jsonAny(t, `{"lastUpdate": 1700000000}`) + act = jsonAny(t, `{"lastUpdate": "2023-11-14T22:13:23Z"}`) + if d := Compare(exp, act, nil); len(d) != 0 { + t.Fatalf("expected 3-second skew to be within tolerance, got %v", d) + } + // Outside the tolerance → real value diff. + exp = jsonAny(t, `{"lastUpdate": 1700000000}`) + act = jsonAny(t, `{"lastUpdate": "2023-11-14T22:15:00Z"}`) + d := Compare(exp, act, nil) + if len(d) != 1 || d[0].Kind != "value" { + t.Fatalf("expected one value diff outside tolerance, got %v", d) + } +} + +func TestCompare_Int64AsStringEqualsInt(t *testing.T) { + // protojson encodes int64 as a JSON string; if a future endpoint mixes + // int64 with a dashboard plain-number response, the matcher should treat + // them as equivalent so the proto stays well-typed. + exp := jsonAny(t, `{"rule_id": 7}`) + act := jsonAny(t, `{"rule_id": "7"}`) + if d := Compare(exp, act, nil); len(d) != 0 { + t.Fatalf("expected int-vs-int64-string coercion to match, got %v", d) + } + // Different integer values: matcher must still report a diff. + exp = jsonAny(t, `{"rule_id": 7}`) + act = jsonAny(t, `{"rule_id": "8"}`) + d := Compare(exp, act, nil) + if len(d) != 1 || d[0].Kind != "value" { + t.Fatalf("expected one value diff on differing ints, got %v", d) + } +} + +func TestCompare_NullEqualsAbsent(t *testing.T) { + if d := Compare(jsonAny(t, `{"a":1}`), jsonAny(t, `{"a":1,"b":null}`), nil); len(d) != 0 { + t.Errorf("null on actual should not diff vs absent on expected, got %v", d) + } + if d := Compare(jsonAny(t, `{"a":1,"b":null}`), jsonAny(t, `{"a":1}`), nil); len(d) != 0 { + t.Errorf("null on expected should not diff vs absent on actual, got %v", d) + } +} + func TestCompare_IgnoreScalarPath(t *testing.T) { exp := jsonAny(t, `{"uptime": 312, "fsid": "abc"}`) act := jsonAny(t, `{"uptime": 87, "fsid": "abc"}`) diff --git a/test/parity/recorder.go b/test/parity/recorder.go index 58ae15e..16e044b 100644 --- a/test/parity/recorder.go +++ b/test/parity/recorder.go @@ -206,7 +206,7 @@ func (r *Recorder) Backends(c Call) []Backend { // coverage. Use for prep/cleanup calls (e.g. deleting leftover state). func (r *Recorder) Do(b Backend, c Call) (*http.Response, []byte) { r.t.Helper() - return r.send(b, c, false) + return r.send(b, c, false, nil) } // DoRecord sends call to backend b and records the response for @@ -214,10 +214,18 @@ func (r *Recorder) Do(b Backend, c Call) (*http.Response, []byte) { // same endpoint id. func (r *Recorder) DoRecord(b Backend, c Call) (*http.Response, []byte) { r.t.Helper() - return r.send(b, c, true) + return r.send(b, c, true, nil) } -func (r *Recorder) send(b Backend, c Call, recordIt bool) (*http.Response, []byte) { +// DoRecordAs is like DoRecord but uses the given client instead of the +// backend's package-level client. Use for endpoints whose semantics +// require a non-admin identity (e.g. self-change_password). +func (r *Recorder) DoRecordAs(b Backend, c Call, client *Client) (*http.Response, []byte) { + r.t.Helper() + return r.send(b, c, true, client) +} + +func (r *Recorder) send(b Backend, c Call, recordIt bool, override *Client) (*http.Response, []byte) { r.t.Helper() method := strings.ToUpper(strings.TrimSpace(c.Method)) @@ -247,7 +255,10 @@ func (r *Recorder) send(b Backend, c Call, recordIt bool) (*http.Response, []byt r.t.Fatalf("parity: marshal body for %s %s: %v", method, c.Path, err) } - client := pickClient(b) + client := override + if client == nil { + client = pickClient(b) + } resp, respBody, err := client.Do(context.Background(), method, pathRaw, c.Accept, bytesReader(bodyBytes), c.Headers) if err != nil { r.t.Fatalf("parity: %s %s on %s: %v", method, pathRaw, b, err) @@ -311,6 +322,13 @@ func pickClient(b Backend) *Client { } } +// ClientFor returns the package-level Client wired by Init for backend b, +// so tests that need to log in as a non-admin user can reuse the same +// BaseURL + transport (the dashboard's self-signed cert in particular). +func ClientFor(b Backend) *Client { + return pickClient(b) +} + func otherBackend(b Backend) Backend { if b == Dash { return Ours diff --git a/test/setup_cgo_test.go b/test/setup_cgo_test.go index 6dbb13e..8ee8290 100644 --- a/test/setup_cgo_test.go +++ b/test/setup_cgo_test.go @@ -135,6 +135,14 @@ func runSetup(m *testing.M) (int, error) { } admConn = c.Conn() + // Dashboard caches its user table at startup and doesn't observe writes + // ceph-api made to mgr/dashboard/accessdb_v2 (e.g. the bootstrap admin + // above). Reload it so the parity user-list pass sees the same set on + // both backends. + if err := cephEnv.ReloadDashboard(bootCtx); err != nil { + return 1, fmt.Errorf("reload dashboard: %w", err) + } + // Dashboard /api/auth requires the v1.0 versioned media type; ceph-api // tolerates any Accept (gateway registered under MIMEWildcard) so we // send the same header to both sides to keep requests cloned. diff --git a/test/status_parity_test.go b/test/status_parity_test.go index 6337236..e562c2a 100644 --- a/test/status_parity_test.go +++ b/test/status_parity_test.go @@ -6,6 +6,7 @@ import ( "testing" "github.com/clyso/ceph-api/test/parity" + "github.com/stretchr/testify/require" ) // /api/status/* has no dashboard counterpart - the dashboard exposes @@ -17,7 +18,8 @@ func Test_Parity_Status_Ceph(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/status/ceph"} for _, b := range r.Backends(call) { - r.DoRecord(b, call) + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: %s %s: status %d", b, call.Method, call.Path, resp.StatusCode) } } @@ -25,7 +27,8 @@ func Test_Parity_Status_MonDump(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/status/mon_dump"} for _, b := range r.Backends(call) { - r.DoRecord(b, call) + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: %s %s: status %d", b, call.Method, call.Path, resp.StatusCode) } } @@ -33,7 +36,8 @@ func Test_Parity_Status_OsdDump(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/status/osd_dump"} for _, b := range r.Backends(call) { - r.DoRecord(b, call) + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: %s %s: status %d", b, call.Method, call.Path, resp.StatusCode) } } @@ -41,7 +45,8 @@ func Test_Parity_Status_PgDump(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/status/pg_dump"} for _, b := range r.Backends(call) { - r.DoRecord(b, call) + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: %s %s: status %d", b, call.Method, call.Path, resp.StatusCode) } } @@ -49,6 +54,7 @@ func Test_Parity_Status_Report(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/status/report"} for _, b := range r.Backends(call) { - r.DoRecord(b, call) + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: %s %s: status %d", b, call.Method, call.Path, resp.StatusCode) } } diff --git a/test/testenv/ceph.go b/test/testenv/ceph.go index bba2776..3d274a8 100644 --- a/test/testenv/ceph.go +++ b/test/testenv/ceph.go @@ -6,6 +6,7 @@ import ( "context" "fmt" "io" + "net" "net/netip" "os" "path/filepath" @@ -286,6 +287,51 @@ func (e *CephEnv) MappedURL(ctx context.Context, scheme string, port int) (strin return fmt.Sprintf("%s://%s:%s", scheme, host, mp.Port()), nil } +// ReloadDashboard disables and re-enables the dashboard mgr module so its +// in-memory access-control DB is reloaded from mgr/dashboard/accessdb_v2. +// Use after writing users/roles to that key from outside the dashboard +// (e.g. ceph-api's bootstrap admin) to defeat the dashboard's startup-time +// user-table cache. +func (e *CephEnv) ReloadDashboard(ctx context.Context) error { + if err := e.execOK(ctx, []string{"ceph", "mgr", "module", "disable", "dashboard"}); err != nil { + return fmt.Errorf("disable dashboard: %w", err) + } + if err := e.execOK(ctx, []string{"ceph", "mgr", "module", "enable", "dashboard"}); err != nil { + return fmt.Errorf("enable dashboard: %w", err) + } + if err := e.waitMgrService(ctx, "dashboard"); err != nil { + return err + } + return e.waitDashboardListening(ctx) +} + +func (e *CephEnv) waitDashboardListening(ctx context.Context) error { + host, err := e.container.Host(ctx) + if err != nil { + return fmt.Errorf("get container host: %w", err) + } + mp, err := e.container.MappedPort(ctx, fmt.Sprintf("%d/tcp", DashboardPort)) + if err != nil { + return fmt.Errorf("get mapped port %d: %w", DashboardPort, err) + } + addr := host + ":" + mp.Port() + deadline := time.Now().Add(moduleEnableWait) + var dialer net.Dialer + for time.Now().Before(deadline) { + conn, err := dialer.DialContext(ctx, "tcp", addr) + if err == nil { + _ = conn.Close() + return nil + } + select { + case <-ctx.Done(): + return ctx.Err() + case <-time.After(500 * time.Millisecond): + } + } + return fmt.Errorf("dashboard %s not listening within %s", addr, moduleEnableWait) +} + // Dashboard returns the dashboard HTTPS URL and administrator credentials. // The cert is self-signed; callers must skip verification. func (e *CephEnv) Dashboard(ctx context.Context) (url, user, pass string, err error) { diff --git a/test/users_parity_test.go b/test/users_parity_test.go index a5a0569..563818f 100644 --- a/test/users_parity_test.go +++ b/test/users_parity_test.go @@ -3,6 +3,7 @@ package test import ( + "context" "net/http" "testing" @@ -18,13 +19,11 @@ func Test_Parity_User_List(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/user", Accept: userAccept} for _, b := range r.Backends(call) { - r.DoRecord(b, call) + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: list users: status %d", b, resp.StatusCode) } } -// Uses the dashboard's own admin: ceph-api's admin is added to -// accessdb_v2 after the dashboard caches its user table, so the -// dashboard backend doesn't see it. func Test_Parity_User_Get(t *testing.T) { r := parity.New(t) get := parity.Call{ @@ -33,7 +32,8 @@ func Test_Parity_User_Get(t *testing.T) { Accept: userAccept, } for _, b := range r.Backends(get) { - r.DoRecord(b, get) + resp, _ := r.DoRecord(b, get) + require.True(t, resp.StatusCode/100 == 2, "%s: get user: status %d", b, resp.StatusCode) } } @@ -41,16 +41,14 @@ func Test_Parity_User_CRUD(t *testing.T) { r := parity.New(t) const username = "parity-user-crud" - // Omits pwd_* fields: ours uses snake_case (pwd_update_required), - // dashboard expects camelCase (pwdUpdateRequired) — including - // either name 500s the opposite backend. createBody := map[string]any{ - "username": username, - "password": "parity-user-crud-pass", - "name": "parity user crud", - "email": "", - "roles": []string{"administrator"}, - "enabled": true, + "username": username, + "password": "parity-user-crud-pass", + "name": "parity user crud", + "email": "", + "roles": []string{"administrator"}, + "enabled": true, + "pwdUpdateRequired": true, } updateBody := map[string]any{ "name": "parity user crud updated", @@ -78,8 +76,19 @@ func Test_Parity_User_CRUD(t *testing.T) { resp, _ := r.DoRecord(b, create) require.True(t, resp.StatusCode/100 == 2 || resp.StatusCode == http.StatusConflict, "%s: create user: status %d", b, resp.StatusCode) - r.DoRecord(b, update) - r.DoRecord(b, changePass) + resp, _ = r.DoRecord(b, update) + require.True(t, resp.StatusCode/100 == 2, "%s: update user: status %d", b, resp.StatusCode) + + // Dashboard's change_password rejects calls where the JWT subject + // differs from {username}, so log in as the created user first and + // drive the call from that identity on both backends. + backend := parity.ClientFor(b) + userClient, err := parity.Login(context.Background(), backend.BaseURL, backend.HTTP, + userAccept, username, "parity-user-crud-pass") + require.NoError(t, err, "%s: login as %s", b, username) + resp, _ = r.DoRecordAs(b, changePass, userClient) + require.True(t, resp.StatusCode/100 == 2, "%s: change_password: status %d", b, resp.StatusCode) + resp, _ = r.DoRecord(b, del) require.True(t, resp.StatusCode/100 == 2, "%s: delete user: status %d", b, resp.StatusCode) @@ -90,7 +99,8 @@ func Test_Parity_Role_List(t *testing.T) { r := parity.New(t) call := parity.Call{Method: "GET", Path: "/api/role", Accept: roleAccept} for _, b := range r.Backends(call) { - r.DoRecord(b, call) + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: list roles: status %d", b, resp.StatusCode) } } @@ -102,7 +112,8 @@ func Test_Parity_Role_Get(t *testing.T) { Accept: roleAccept, } for _, b := range r.Backends(get) { - r.DoRecord(b, get) + resp, _ := r.DoRecord(b, get) + require.True(t, resp.StatusCode/100 == 2, "%s: get role: status %d", b, resp.StatusCode) } } @@ -132,7 +143,8 @@ func Test_Parity_Role_CRUD(t *testing.T) { resp, _ := r.DoRecord(b, create) require.True(t, resp.StatusCode/100 == 2 || resp.StatusCode == http.StatusConflict, "%s: create role: status %d", b, resp.StatusCode) - r.DoRecord(b, update) + resp, _ = r.DoRecord(b, update) + require.True(t, resp.StatusCode/100 == 2, "%s: update role: status %d", b, resp.StatusCode) resp, _ = r.DoRecord(b, delRole) require.True(t, resp.StatusCode/100 == 2, "%s: delete role: status %d", b, resp.StatusCode) @@ -176,6 +188,7 @@ func Test_Parity_Role_Clone(t *testing.T) { resp, _ := r.Do(parity.Ours, create) require.True(t, resp.StatusCode/100 == 2, "create role: status %d", resp.StatusCode) for _, b := range r.Backends(clone) { - r.DoRecord(b, clone) + resp, _ := r.DoRecord(b, clone) + require.True(t, resp.StatusCode/100 == 2, "%s: clone role: status %d", b, resp.StatusCode) } } From 0eceeed9ad5441461b018e58ab205800bd1cb35c Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Wed, 27 May 2026 17:41:09 +0200 Subject: [PATCH 07/10] parity permissions smoke test Signed-off-by: Artem Torubarov --- .claude/scheduled_tasks.lock | 1 + TASKS.md | 72 ++++++++++++--- test/parity/client.go | 4 +- test/parity/probes.go | 166 +++++++++++++++++++++++++++++++++++ test/parity/recorder.go | 32 +++++-- test/setup_cgo_test.go | 2 +- 6 files changed, 254 insertions(+), 23 deletions(-) create mode 100644 .claude/scheduled_tasks.lock create mode 100644 test/parity/probes.go diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock new file mode 100644 index 0000000..77c2636 --- /dev/null +++ b/.claude/scheduled_tasks.lock @@ -0,0 +1 @@ +{"sessionId":"a18b512a-ef3f-404b-bea2-abe8cf52bfae","pid":95553,"procStart":"Wed May 27 14:45:37 2026","acquiredAt":1779893859299} \ No newline at end of file diff --git a/TASKS.md b/TASKS.md index 8fff2f1..6d3beac 100644 --- a/TASKS.md +++ b/TASKS.md @@ -210,11 +210,61 @@ tests; `make full-gate` is green in CI. already exercises it on both backends. Dedicated auth parity tests can be added later if we want to verify token-issuance shape. -- [ ] **2.2 Build the permission-test framework** — - Table-driven helper. For each gRPC method × each permission scope in - `pkg/user/system_roles.go`, verify a user lacking the scope gets - `PermissionDenied` and a user holding it succeeds. One `_permissions_test.go` - per service in `test/`. +- [x] **2.2 Authz probes in the parity recorder** — + Fold the regression check that every endpoint actually gates its + permissions into the existing parity recorder. For every `DoRecord` + call, the recorder additionally fires two unrecorded probes against + the same `(backend, Call)`. Order vs the happy-path send is free — + only the happy-path response is recorded for body parity; the + probes only assert status + a specific error shape. + + Probes: + + - **No-auth probe.** Same request, no `Authorization` header. + Assert HTTP 401, JSON body `code == 16` + (grpc `codes.Unauthenticated`), and + `details[*].reason == "ErrUnauthenticated"` (set by + `pkg/auth/grpc_interceptor.go::unauthenticated`). Do NOT assert on + `message` — it's wrapped via `fmt.Errorf("no token present: %w", ...)` + and that prefix isn't a stable contract. + - **No-perm probe.** Same request, bearer for a parity-managed user + that has `roles: []`. Assert HTTP 403, JSON body `code == 7` + (grpc `codes.PermissionDenied`), and `message == "AccessDenied"` + (from `pkg/api/grpc_server.go::convertApiError` rewriting + `mappedErr = types.ErrAccessDenied`). + + Plumbing: + + - `parity.Client.Do` skips the `Authorization` header when the + client's `Token` is empty, so a token-less `Client` drives the + no-auth probe. + - `parity.Init` creates the no-perm probe user on each backend + (admin client → `POST /api/user` with + `{username: "parity-probe-noperm", password: ..., roles: []}`), + logs in as that user, and stashes the probe `Client` plus a + zero-token `Client` per backend in package state. + - Probes go through `send(..., recordIt=false, override=client)` so + they do not enter the records map and do not fire the + recorded-twice or canonical-request checks. + - Exclusion list: `/api/auth*` (login/check/logout are unauth by + design — already excluded by the parity coverage gate). + `POST /api/user/{username}/change_password` self-checks identity + and rejects the probe user with `"Invalid user context"` rather + than `AccessDenied`; treat as exempt with a reason in the + recorder's exclusion table. + + Coverage is automatic. The 2.1 coverage gate forces every new RPC + into `api/http.yaml`, and every recorded call flows through + `DoRecord`, so every endpoint covered by a parity test is + authz-swept on the same run. No per-endpoint table to maintain. + + What this catches: handlers with a missing `HasPermissions` call, + or with permission-check ordering that lets validation/lookup leak + data before authz fires (those return 400/404 instead of 403, which + fails the probe). What it does NOT catch: scope-correctness — the + right `(scope, perm)` tuple per method. That belongs to the review + agent (3.5): eyeball the new endpoint's tuple against the + dashboard's `@APIRouter` scope + per-method decorator. - [x] **2.3 Populate `api_diff.yaml` for all 5 existing services** — Run the parity tests from 2.1 and watch them fail. For every endpoint @@ -242,14 +292,10 @@ tests; `make full-gate` is green in CI. `coerceEqual` with a unit test, not in `api_diff.yaml`. Reserve `api_diff.yaml` for genuinely endpoint-specific divergences. -- [ ] **2.4 Populate permission tests for all 5 existing services** — - Apply the framework from 2.2 to every service. Each service's table - covers every method × every relevant scope. - -- [ ] **2.5 Bring `make full-gate` to green in CI** — - After 2.1–2.4 land, `make full-gate` runs `check` + `lint` + `proto` - (idempotent) + `e2e-test` (now includes parity + permission tests). - Verify green on first push. +- [x] **2.4 Bring `make full-gate` to green in CI** — + After 2.1–2.3 land, `make full-gate` runs `check` + `lint` + `proto` + (idempotent) + `e2e-test` (parity body comparison + authz probes per + 2.2). Verify green on first push. --- diff --git a/test/parity/client.go b/test/parity/client.go index 9f0de45..ab37421 100644 --- a/test/parity/client.go +++ b/test/parity/client.go @@ -83,7 +83,9 @@ func (c *Client) Do(ctx context.Context, method, path, accept string, body io.Re req.Header.Add(k, v) } } - req.Header.Set("Authorization", "Bearer "+c.Token) + if c.Token != "" { + req.Header.Set("Authorization", "Bearer "+c.Token) + } if accept != "" { req.Header.Set("Accept", accept) } diff --git a/test/parity/probes.go b/test/parity/probes.go new file mode 100644 index 0000000..fbce0ab --- /dev/null +++ b/test/parity/probes.go @@ -0,0 +1,166 @@ +package parity + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "net/http" + "strings" +) + +const ( + probeUsername = "parity-probe-noperm" + probePassword = "parity-probe-noperm-pass" +) + +// change_password rejects with AccessDenied for an identity mismatch +// (ctx username != path username) before HasPermissions runs, so its +// 403 doesn't tell us whether the permission gate is wired. +var probeExclusions = map[string]struct{}{ + "POST /api/user/{username}/change_password": {}, +} + +func isProbeExcluded(c Call) bool { + if strings.HasPrefix(c.Path, "/api/auth") { + return true + } + _, ok := probeExclusions[strings.ToUpper(c.Method)+" "+c.Path] + return ok +} + +// POST on both backends keeps the user-list GET bytewise equal between +// them; login on Ours because the sweep only hits Ours. +func bootstrapProbeClients(ctx context.Context, dash, ours *Client, accept string) (noPerm, noAuth *Client, err error) { + body := map[string]any{ + "username": probeUsername, + "password": probePassword, + "name": "parity probe (no perms)", + "email": "", + "roles": []string{}, + "enabled": true, + "pwdUpdateRequired": false, + } + raw, err := json.Marshal(body) + if err != nil { + return nil, nil, fmt.Errorf("marshal probe user body: %w", err) + } + + for _, admin := range []*Client{dash, ours} { + resp, respBody, doErr := admin.Do(ctx, http.MethodPost, "/api/user", accept, bytes.NewReader(raw), nil) + if doErr != nil { + return nil, nil, fmt.Errorf("create probe user on %s: %w", admin.BaseURL, doErr) + } + if resp.StatusCode == http.StatusConflict { + continue + } + if resp.StatusCode/100 != 2 { + return nil, nil, fmt.Errorf("create probe user on %s: status %d: %s", admin.BaseURL, resp.StatusCode, respBody) + } + } + + noPerm, err = Login(ctx, ours.BaseURL, ours.HTTP, accept, probeUsername, probePassword) + if err != nil { + return nil, nil, fmt.Errorf("login probe user: %w", err) + } + noAuth = &Client{BaseURL: ours.BaseURL, HTTP: ours.HTTP} + return noPerm, noAuth, nil +} + +func (r *Recorder) runAuthzProbes(c Call) { + r.t.Helper() + if isProbeExcluded(c) { + return + } + state.mu.RLock() + noAuth := state.noAuth + noPerm := state.noPerm + state.mu.RUnlock() + r.assertNoAuthProbe(c, noAuth) + r.assertNoPermProbe(c, noPerm) +} + +func (r *Recorder) assertNoAuthProbe(c Call, client *Client) { + r.t.Helper() + resp, body := r.send(Ours, c, false, client) + endpoint := strings.ToUpper(c.Method) + " " + c.Path + if resp.StatusCode != http.StatusUnauthorized { + r.t.Errorf("parity authz: %s no-auth probe expected HTTP 401, got %d\n body: %s", + endpoint, resp.StatusCode, truncate(body)) + return + } + parsed, perr := parseGrpcError(body) + if perr != nil { + r.t.Errorf("parity authz: %s no-auth probe body not a grpc error: %v\n body: %s", + endpoint, perr, truncate(body)) + return + } + if parsed.Code != codeUnauthenticated { + r.t.Errorf("parity authz: %s no-auth probe code=%d, want %d (codes.Unauthenticated)\n body: %s", + endpoint, parsed.Code, codeUnauthenticated, truncate(body)) + } + if !detailsHaveReason(parsed.Details, "ErrUnauthenticated") { + r.t.Errorf("parity authz: %s no-auth probe missing details[*].reason=%q\n body: %s", + endpoint, "ErrUnauthenticated", truncate(body)) + } +} + +func (r *Recorder) assertNoPermProbe(c Call, client *Client) { + r.t.Helper() + resp, body := r.send(Ours, c, false, client) + endpoint := strings.ToUpper(c.Method) + " " + c.Path + if resp.StatusCode != http.StatusForbidden { + r.t.Errorf("parity authz: %s no-perm probe expected HTTP 403, got %d\n body: %s", + endpoint, resp.StatusCode, truncate(body)) + return + } + parsed, perr := parseGrpcError(body) + if perr != nil { + r.t.Errorf("parity authz: %s no-perm probe body not a grpc error: %v\n body: %s", + endpoint, perr, truncate(body)) + return + } + if parsed.Code != codePermissionDenied { + r.t.Errorf("parity authz: %s no-perm probe code=%d, want %d (codes.PermissionDenied)\n body: %s", + endpoint, parsed.Code, codePermissionDenied, truncate(body)) + } + if parsed.Message != "AccessDenied" { + r.t.Errorf("parity authz: %s no-perm probe message=%q, want %q\n body: %s", + endpoint, parsed.Message, "AccessDenied", truncate(body)) + } +} + +// Restated to keep parity off the grpc import graph. +const ( + codeUnauthenticated = 16 + codePermissionDenied = 7 +) + +type grpcErrorBody struct { + Code int `json:"code"` + Message string `json:"message"` + Details []json.RawMessage `json:"details"` +} + +func parseGrpcError(body []byte) (grpcErrorBody, error) { + var out grpcErrorBody + if err := json.Unmarshal(body, &out); err != nil { + return grpcErrorBody{}, err + } + return out, nil +} + +func detailsHaveReason(details []json.RawMessage, reason string) bool { + for _, d := range details { + var obj struct { + Reason string `json:"reason"` + } + if err := json.Unmarshal(d, &obj); err != nil { + continue + } + if obj.Reason == reason { + return true + } + } + return false +} diff --git a/test/parity/recorder.go b/test/parity/recorder.go index 16e044b..eae4720 100644 --- a/test/parity/recorder.go +++ b/test/parity/recorder.go @@ -66,8 +66,10 @@ var ( ready bool dash *Client ours *Client - routes *RouteSet // routes from api/http.yaml (ours) - dashRts *RouteSet // routes from dashboard openapi.yaml + noAuth *Client + noPerm *Client + routes *RouteSet // from api/http.yaml + dashRts *RouteSet // from dashboard openapi.yaml ignores map[string][]Ignore } @@ -75,10 +77,10 @@ var ( coverage = map[string]bool{} ) -// Init wires the package's two backend clients and loads -// api/http.yaml + api_diff.yaml + the dashboard openapi.yaml. Call -// once from runSetup after the parity clients have logged in. -func Init(dash, ours *Client, httpYAMLPath, dashboardSwaggerPath, apiDiffPath string) error { +// Init must be called once from runSetup after dash and ours have +// logged in. loginAccept is the versioned media type required by the +// dashboard's /api/auth and /api/user. +func Init(ctx context.Context, dash, ours *Client, loginAccept, httpYAMLPath, dashboardSwaggerPath, apiDiffPath string) error { routes, err := LoadHTTPRoutes(httpYAMLPath) if err != nil { return fmt.Errorf("load http.yaml: %w", err) @@ -91,10 +93,16 @@ func Init(dash, ours *Client, httpYAMLPath, dashboardSwaggerPath, apiDiffPath st if err != nil { return fmt.Errorf("load %s: %w", apiDiffPath, err) } + noPerm, noAuth, err := bootstrapProbeClients(ctx, dash, ours, loginAccept) + if err != nil { + return fmt.Errorf("bootstrap authz probes: %w", err) + } state.mu.Lock() defer state.mu.Unlock() state.dash = dash state.ours = ours + state.noAuth = noAuth + state.noPerm = noPerm state.routes = NewRouteSet(routes) state.dashRts = NewRouteSet(dashRoutes) state.ignores = diff @@ -214,7 +222,11 @@ func (r *Recorder) Do(b Backend, c Call) (*http.Response, []byte) { // same endpoint id. func (r *Recorder) DoRecord(b Backend, c Call) (*http.Response, []byte) { r.t.Helper() - return r.send(b, c, true, nil) + resp, body := r.send(b, c, true, nil) + if b == Ours { + r.runAuthzProbes(c) + } + return resp, body } // DoRecordAs is like DoRecord but uses the given client instead of the @@ -222,7 +234,11 @@ func (r *Recorder) DoRecord(b Backend, c Call) (*http.Response, []byte) { // require a non-admin identity (e.g. self-change_password). func (r *Recorder) DoRecordAs(b Backend, c Call, client *Client) (*http.Response, []byte) { r.t.Helper() - return r.send(b, c, true, client) + resp, body := r.send(b, c, true, client) + if b == Ours { + r.runAuthzProbes(c) + } + return resp, body } func (r *Recorder) send(b Backend, c Call, recordIt bool, override *Client) (*http.Response, []byte) { diff --git a/test/setup_cgo_test.go b/test/setup_cgo_test.go index 8ee8290..f7fa582 100644 --- a/test/setup_cgo_test.go +++ b/test/setup_cgo_test.go @@ -165,7 +165,7 @@ func runSetup(m *testing.M) (int, error) { return 1, fmt.Errorf("authenticate dashboard parity client: %w", err) } - if err := parity.Init(parityDash, parityOurs, parityHTTPYAMLPath, parityDashboardYAML, parityAPIDiffPath); err != nil { + if err := parity.Init(tstCtx, parityDash, parityOurs, loginAccept, parityHTTPYAMLPath, parityDashboardYAML, parityAPIDiffPath); err != nil { return 1, fmt.Errorf("parity.Init: %w", err) } From 4e6437e78fa5d580f32ee09edf93b14d4990c2ea Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Fri, 29 May 2026 17:21:15 +0200 Subject: [PATCH 08/10] ceph scr skill Signed-off-by: Artem Torubarov --- .claude/scheduled_tasks.lock | 1 - .claude/skills/ceph-src/SKILL.md | 54 ++++++ .claude/skills/ceph-src/repo-map.md | 126 ++++++++++++++ .claude/skills/ceph-src/scripts/up.sh | 34 ++++ .claude/skills/ceph-src/verify.md | 96 +++++++++++ CLAUDE.md | 226 ++++++++++++++------------ TASKS.md | 17 +- 7 files changed, 438 insertions(+), 116 deletions(-) delete mode 100644 .claude/scheduled_tasks.lock create mode 100644 .claude/skills/ceph-src/SKILL.md create mode 100644 .claude/skills/ceph-src/repo-map.md create mode 100755 .claude/skills/ceph-src/scripts/up.sh create mode 100644 .claude/skills/ceph-src/verify.md diff --git a/.claude/scheduled_tasks.lock b/.claude/scheduled_tasks.lock deleted file mode 100644 index 77c2636..0000000 --- a/.claude/scheduled_tasks.lock +++ /dev/null @@ -1 +0,0 @@ -{"sessionId":"a18b512a-ef3f-404b-bea2-abe8cf52bfae","pid":95553,"procStart":"Wed May 27 14:45:37 2026","acquiredAt":1779893859299} \ No newline at end of file diff --git a/.claude/skills/ceph-src/SKILL.md b/.claude/skills/ceph-src/SKILL.md new file mode 100644 index 0000000..4a02939 --- /dev/null +++ b/.claude/skills/ceph-src/SKILL.md @@ -0,0 +1,54 @@ +--- +name: ceph-src +description: Trigger when need ANY info about Ceph, any facts about Ceph, documentation, source code, anything regarding existing Ceph API, mon, mgr modules, dashboard. Use instead of web search or training data for ALL Ceph-related topics. Use to run and verify against real local ceph instance. +--- + +# ceph-src + +`third_party/ceph` is the pinned upstream Ceph source. **Never derive +dashboard API shapes, command JSON, or permission scopes from training +data — they are version-specific and your training data is older.** Read +the submodule. When source-reading is ambiguous, probe a live dashboard +([verify.md](./verify.md)). + +## Setup + +```sh +make ceph-ref # one-time, after git clone +make ceph-ref-versions # also fetches the extra tags for cross-release diffs +git -C third_party/ceph describe # confirm the pinned ref +``` + +## Where to look (paths relative to `third_party/ceph/`) + +| Question | Path | +|---|---| +| Dashboard handler for endpoint `X` | `src/pybind/mgr/dashboard/controllers/` — one file per resource. | +| Permission scope + per-method permission | `@APIRouter(..., Scope.X)` on the controller class + `@CreatePermission`/`@ReadPermission`/`@UpdatePermission`/`@DeletePermission` on each method. | +| Required `Accept` version for an endpoint | `src/pybind/mgr/dashboard/openapi.yaml`. Dashboard returns 415 without it. | +| Older `restful` mgr module handler | `src/pybind/mgr/restful/api/`. | +| Mon command JSON shape | `src/mon/MonCommands.h` — grep the command literal in the `COMMAND(...)` table. | +| Mgr command JSON shape | `src/mgr/MgrCommands.h` (table) + `src/mgr/DaemonServer.cc` (dispatch). Module-specific commands in `src/pybind/mgr//`. | + +## Cross-release diff + +Tags available are listed in the top-level Makefile's +`CEPH_REF_EXTRA_TAGS`. + +```sh +git -C third_party/ceph diff .. -- +git -C third_party/ceph log .. -- +``` + +## Broader navigation + +For anything outside the ceph-api porting table above — RADOS internals, +CRUSH, RGW, RBD, CephFS, cephadm, config options, release notes, +docs-vs-code disagreements — see [repo-map.md](./repo-map.md). It +indexes `src/` by component, `doc/` by topic, and gives a +topic → starting-point table for the whole tree. + +## Read-only + +The submodule is reference. Never stage or commit changes inside +`third_party/ceph/` from this repo. diff --git a/.claude/skills/ceph-src/repo-map.md b/.claude/skills/ceph-src/repo-map.md new file mode 100644 index 0000000..9d9e843 --- /dev/null +++ b/.claude/skills/ceph-src/repo-map.md @@ -0,0 +1,126 @@ +# repo-map.md — navigating `third_party/ceph/` + +All paths relative to `third_party/ceph/`. + +Top-level dirs are stable across releases. File-level paths inside them +DO churn — `grep`/`find`/`git log` before quoting them, don't trust +training-data filenames. + +## High-level layout + +- `src/` — all C++/Python source. +- `doc/` — Sphinx/RST user + developer docs. Authoritative for + supported behavior and options. +- `qa/` — integration test suites (`qa/suites/`, `qa/tasks/`, + `qa/workunits/`). +- `cmake/`, `CMakeLists.txt`, `do_cmake.sh`, `install-deps.sh`, + `debian/`, `ceph.spec.in` — build/packaging. +- `systemd/`, `selinux/`, `etc/`, `examples/`, `monitoring/`, + `container/`, `admin/` — deployment-side assets. +- `PendingReleaseNotes` — staged notes for the next release. +- Root anchors: `README.md`, `CONTRIBUTING.rst`, `SubmittingPatches.rst`, + `SECURITY.md`, `CodingStyle`, `AUTHORS`, `COPYING*`. + +## `src/` by component + +- **RADOS core:** `osd/`, `mon/`, `mgr/`, `mds/`, `messages/`, `msg/` + (messenger v1/v2), `osdc/` (client), `crush/`, `auth/` (cephx), + `crypto/`, `common/`, `global/`. +- **Storage backends:** `os/` (BlueStore, FileStore), `kv/` (RocksDB), + `blk/`, `journal/`, `erasure-code/` (jerasure, lrc, shec), + `compressor/`, `cls/` + `objclass/` (object classes). +- **Object (RGW):** `rgw/` — S3/Swift, multisite, zones, lifecycle, + IAM, bucket sharding. Admin CLI: `src/rgw/radosgw-admin/`. +- **Block (RBD):** `librbd/`, `rbd_fuse/`, `rbd_replay/`. +- **File (CephFS):** server in `mds/`; client (libcephfs / ceph-fuse) + in `client/`. Scattered support: `tools/cephfs/`, + `tools/cephfs_mirror/`, `cls/cephfs/`, `include/cephfs/`, + `pybind/cephfs/`. No top-level `src/cephfs/`. +- **Orchestration / provisioning:** `cephadm/` (Python container + orchestrator), `ceph-volume/` (OSD provisioning, LVM, dm-crypt). +- **Bindings & APIs:** `pybind/` (rados, rbd, cephfs, mgr, rgw), + `include/` (public C/C++ headers). +- **Tools / standalone binaries:** `tools/` (crushtool, monmaptool, + osdmaptool, ceph_objectstore_tool, ceph_dencoder, ceph_authtool, + ceph_kvstore_tool, …). +- **Experimental / specialized:** `crimson/` (Seastar-based next-gen + OSD), `neorados/` (next-gen RADOS client), `nvmeof/` (NVMe-oF). +- **Tests:** `src/test/` (unit), separate from `qa/` (integration). + +## `doc/` by topic + +- `start/`, `install/` — first-cluster + platform install. +- `cephadm/` — orchestration deployment. +- `rados/` — RADOS, pools/PGs/EC, CRUSH operations, configuration + reference. +- `radosgw/` — RGW S3/Swift/multisite. (Older releases used + `doc/rgw/`; this checkout has `doc/radosgw/` — verify on your + checkout.) +- `rbd/` — block device, mirroring, snapshots, clones. +- `cephfs/` — filesystem, MDS, snapshots, quotas, multi-fs. +- `mgr/` — manager modules (dashboard, prometheus, balancer, + pg_autoscaler, orchestrator, …). +- `ceph-volume/` — OSD provisioning. +- `dev/` — internals, protocols, peering, encoding, developer guide. +- `security/` — cephx, encryption, access control. +- `api/` — librados / librbd / libcephfs API reference. +- `releases/` — one `.rst` per named release (squid, reef, quincy, …) + + `releases.yml`. +- `changelog/` — per-version changelog entries. +- `man/8/` — man page sources for CLIs and daemons. +- `architecture.rst`, `glossary.rst` — system overview + terminology. + +## Topic → start here + +| Question topic | Docs starting point | Code starting point | +|---|---|---| +| CRUSH, placement, weight, failure domains | `doc/rados/operations/crush*` | `src/crush/` | +| Pools, PGs, replication, erasure coding | `doc/rados/configuration/`, `doc/rados/operations/` | `src/osd/`, `src/erasure-code/` | +| RADOS protocol, OSD ops, peering, recovery | `doc/dev/` (peering/protocol/encoding) | `src/messages/`, `src/osd/`, `src/osdc/` | +| RGW (S3/Swift, multisite, zones, lifecycle, IAM, STS) | `doc/radosgw/` | `src/rgw/` | +| RBD mirroring, snapshots, clones | `doc/rbd/` | `src/librbd/` | +| CephFS, MDS, snapshots, quotas | `doc/cephfs/`, `doc/dev/mds_internals/` | `src/mds/`, `src/client/` | +| Manager modules (dashboard, prometheus, balancer, pg_autoscaler) | `doc/mgr/` | `src/mgr/` (base) + `src/pybind/mgr//` | +| Authentication (cephx) | `doc/dev/cephx*.rst`, `doc/security/` | `src/auth/`, `src/crypto/` | +| Monitor, Paxos, quorum, elections | `doc/dev/mon-elections.rst`, `doc/dev/mon-on-disk-formats.rst` | `src/mon/` | +| cephadm orchestration | `doc/cephadm/` | `src/cephadm/` (+ `cephadmlib/`) | +| ceph-volume, OSD provisioning, LVM, dm-crypt | `doc/ceph-volume/` | `src/ceph-volume/` | +| Configuration options (canonical list, defaults, types) | `doc/rados/configuration/`, `doc/dev/config.rst` | `src/common/options/` (`*.yaml.in` per daemon) | +| `ceph config get/set/dump`, monitor config store, runtime overrides | `doc/rados/configuration/ceph-conf.rst` (and siblings) | `src/mon/ConfigMonitor*`, `src/common/config*` | +| Release notes, version history | `doc/releases/.rst`, `doc/releases/releases.yml` | `PendingReleaseNotes` (staged for next release) | +| BlueStore, object store internals | `doc/dev/`, `doc/rados/configuration/bluestore-config-ref.rst` | `src/os/bluestore/` | +| Messenger v1/v2 wire protocol | `doc/dev/` (msgr docs) | `src/msg/`, `src/messages/` | + +If a topic isn't here, run +`find third_party/ceph/doc -type d -name '**'` plus a +`grep -r` in `third_party/ceph/src/` before guessing. + +## Ground-truth checks before answering + +- For "what does config option X do / what is its default": read + `src/common/options/*.yaml.in` (canonical) AND the matching prose in + `doc/rados/configuration/`. They must agree. +- **When docs and code disagree on behavior, code wins; flag the + discrepancy in the answer.** +- For "what does CLI command Y do": consult `doc/man/8/.rst` + first; for behavior, follow the source from the corresponding + `src/tools/` or daemon dir. +- For "when did feature Z land / change": check + `doc/releases/.rst` and `PendingReleaseNotes`; corroborate + with `git -C third_party/ceph log -- ` once you have a path. +- For S3 / Swift API behavior in RGW: `doc/radosgw/` is authoritative + for what's supported; `src/rgw/` for actual handling. Don't + extrapolate from AWS S3 docs — RGW deviates. +- For "what command does daemon X run": grep under the daemon's + `src//` dir; do not infer from blog posts. + +## What NOT to assume + +- Filenames inside `src/` and `doc/` move between releases — grep + before quoting them. +- Behavior described in old blog posts or your training data is + frequently stale; the cloned tree is the current truth. +- `doc/` can lag `src/` on edge behavior — see the "code wins" rule + above. +- This is read-only reference. If a task requires building/modifying + the Ceph C++ source, that is out of scope — say so. diff --git a/.claude/skills/ceph-src/scripts/up.sh b/.claude/skills/ceph-src/scripts/up.sh new file mode 100755 index 0000000..8190360 --- /dev/null +++ b/.claude/skills/ceph-src/scripts/up.sh @@ -0,0 +1,34 @@ +#!/usr/bin/env bash +# Brings up arttor/ceph-test with dashboard enabled and an admin user. +# Idempotent: kills any existing ceph-dev container first. +# Tear down: docker rm -f ceph-dev +set -euo pipefail + +NAME=ceph-dev +PORT=8443 +IMAGE=ghcr.io/arttor/ceph-test:v19 +USER=admin +PASS=devpass-1234 + +docker rm -f "$NAME" >/dev/null 2>&1 || true +docker run -d --rm --name "$NAME" -p "${PORT}:8443" "$IMAGE" >/dev/null + +echo "waiting for ceph health..." >&2 +until docker exec "$NAME" ceph health 2>/dev/null | grep -qE 'HEALTH_(OK|WARN)'; do sleep 1; done + +echo "waiting for mgr to load modules..." >&2 +until docker exec "$NAME" ceph mgr module ls 2>/dev/null | grep -q dashboard; do sleep 1; done + +docker exec "$NAME" ceph mgr module enable dashboard >/dev/null +docker exec "$NAME" ceph dashboard create-self-signed-cert >/dev/null +printf '%s' "$PASS" | docker exec -i "$NAME" tee /tmp/p >/dev/null +docker exec "$NAME" ceph dashboard ac-user-create --enabled --force-password "$USER" -i /tmp/p administrator >/dev/null + +echo "waiting for dashboard listener..." >&2 +until curl -sk -o /dev/null -w '%{http_code}\n' "https://localhost:${PORT}/" | grep -qE '^(200|301|302|403)'; do sleep 1; done + +cat <] [] [] [] [] [] `. +- `ceph-mon.demo.log`, `ceph-osd.0.log`, `ceph-client.rgw.demo.log` — + daemon-specific. +- `ceph.log`, `ceph.audit.log` — cluster-wide events. + +Many dashboard endpoints don't fire mon commands — they read mgr's +cached cluster map. If audit shows nothing for your call, the +dashboard isn't going to the monitor for that data. + +## Knobs to turn up when probing + +Runtime: `docker exec ceph-dev ceph config set `. +Persistent: pass `-e CEPH_EXTRA_CONF=...` to `docker run`, or mount a +file into `/etc/ceph/ceph.conf.d/*.conf` (both get appended to +`ceph.conf` at startup). + +- `debug_mgr 20` — mgr daemon verbosity. +- `mgr/dashboard/log_level debug` — dashboard Python logger + (allowed: `info|debug|critical|error|warning`). Every mgr module + inherits a `log_level` option — declared in + `src/pybind/mgr/mgr_module.py`. +- `mgr//log_level` — same knob for other mgr modules. +- `debug_ms 5` — messenger / wire-protocol verbosity. + +Canonical option list with defaults and types: +`third_party/ceph/src/common/options/*.yaml.in`. File-vs-store +semantics and which options accept runtime changes: +`third_party/ceph/doc/rados/configuration/ceph-conf.rst` +([repo-map.md](./repo-map.md) → Configuration options row). + +## Sanity-check command shape directly + +```sh +docker exec ceph-dev ceph -f json # raw JSON, no dashboard +docker exec ceph-dev ceph -h # syntax + flags +``` + +When dashboard output diverges from raw command output, the dashboard +is post-processing in Python — read the controller in +`src/pybind/mgr/dashboard/controllers/.py`. + +## When to write a Go probe instead + +Curl wins for one-off "what does X return". Extend the parity harness +(`test/parity/`) for multi-step flows with parity-style comparison or +a permanent regression test. See `test/setup_cgo_test.go` for the +in-process auth bootstrap and `test/parity/client.go` for `Login` / +`Do` helpers. diff --git a/CLAUDE.md b/CLAUDE.md index e115fbb..a5ae946 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,117 +1,133 @@ # CLAUDE.md -This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. - -## What this is - -Ceph API is a standalone Go service that exposes REST + gRPC APIs for administrating a Ceph cluster, as an alternative to the Ceph mgr RESTful module. It connects to a Ceph cluster over RADOS (rados user, keyring, mon host) using `github.com/ceph/go-ceph`, so it can run anywhere with `mon` reachability. - -## Build & run - -The binary requires CGO and the Ceph client libraries (`librados`, `librbd`, `libcephfs`) on the build/host machine. - -- **Build (real RADOS):** `CGO_ENABLED=1 go build ./cmd/ceph-api` — fails to link without ceph dev libs. -- **Run mock mode (no Ceph cluster needed):** `CGO_ENABLED=0 CFG_APP_CREATEADMIN=true CFG_APP_ADMINUSERNAME=admin CFG_APP_ADMINPASSWORD=yoursecretpass go run ./cmd/ceph-api/main.go`. Under `CGO_ENABLED=0`, `pkg/app/rados_conn_mock.go` and `pkg/rados/rados_mock.go` (`//go:build !cgo`) compile in instead of the real go-ceph connection. They serve canned JSON from `pkg/rados/mock-data/{mon,mon-input,mgr}/`. -- **macOS dev:** ceph dev libs aren't available natively. Use the Lima VM defined in `lima-ceph-dev.yaml` (`limactl create --name=ceph ./lima-ceph-dev.yaml && limactl start ceph`). -- **Docker:** `docker-compose up` brings up a Ceph demo container plus the API on `:9969` with admin `admin`/`yoursecretpass`. - -## Make targets - -The Makefile is the canonical entry point for all dev workflows. Run `make help` for a current list. - -- `make check` — `go fmt` + `go vet` + unit tests. No CGO, no Docker. -- `make lint` — `golangci-lint` via `go tool`. -- `make e2e-test` — `go test ./test/... -tid`. Builds the test binary inside `test/Dockerfile` (has librados/librbd/libcephfs), then runs it; tests spawn Ceph via testcontainers using the mounted host `docker.sock`. The inner container uses host networking to reach the sibling Ceph container. -- `make gate` — `check` + `lint`. -- `make full-gate` — `gate` + `e2e-test`. -- `make ceph-ref` — populate `third_party/ceph` at the pinned commit. -- `make ceph-ref-versions` — also fetch tags listed in `CEPH_REF_EXTRA_TAGS`. -- `make proto` — regenerate gRPC stubs + OpenAPI from `api/*.proto`. +ceph-api is a Go service exposing REST + gRPC APIs for administrating a +Ceph cluster, as an alternative to the Ceph mgr RESTful module. It +connects to a Ceph cluster over RADOS via `github.com/ceph/go-ceph`, so +it can run anywhere with mon reachability. + +## Where to find what + +- **Build, run, test, lint:** `make help` is canonical — don't memorise + targets. Real-RADOS build needs `CGO_ENABLED=1` plus Ceph dev libs + (`librados`, `librbd`, `libcephfs`); macOS dev uses the Lima VM in + `lima-ceph-dev.yaml`. Mock mode (`CGO_ENABLED=0`) needs no Ceph. +- **Upstream Ceph source + docs** (dashboard, `restful`, mon/mgr command + tables, RADOS surface, architecture docs, cross-release diffs, live + probing recipes): `.claude/skills/ceph-src/` — + [`SKILL.md`](./.claude/skills/ceph-src/SKILL.md) for source paths, + [`verify.md`](./.claude/skills/ceph-src/verify.md) for probing a + running dashboard. **Never derive Ceph behavior from training data + — read the submodule.** +- **API source of truth:** `api/*.proto` + `api/http.yaml`. Regenerate + stubs and OpenAPI via `make proto`. +- **Composition root:** `pkg/app/start.go` builds the dependency graph. + +## Build-tag pair: cgo vs !cgo + +Files in `pkg/app/`, `pkg/rados/`, and `pkg/types/` come in `cgo` / +`!cgo` pairs. Under `CGO_ENABLED=1` the real go-ceph connection +(`production_conn.go`) compiles in; under `CGO_ENABLED=0` the mock +(`rados_mock.go`) returns canned JSON from `pkg/rados/mock-data/`. When +adding behavior that touches the RADOS connection, mirror it in both +files. + +`mock-data/` is offline-dev convenience, not contract. New endpoint +work is validated by `make e2e-test` against a real cluster started by +`test/testenv/CephEnv`; updating `mock-data/` is **not** required. + +The same pair pattern shows up in `test/`: `main_test.go` (no tag), +`setup_cgo_test.go` / `setup_nocgo_test.go`, and every other +`*_test.go` in `test/` carries `//go:build cgo`. + +## Architecture in one paragraph + +Single binary, single port (`:9969` default). gRPC and HTTP share one +listener via `soheilhy/cmux`; the HTTP side is grpc-gateway translating +REST → gRPC plus hand-mounted OAuth handlers. All Ceph interactions go +through `rados.Svc`'s three primitives: `ExecMon`, +`ExecMonWithInputBuff`, `ExecMgr` — higher-level packages +(`pkg/api/`, `pkg/cephconfig/`, `pkg/user/`) construct JSON commands +and parse JSON responses. Auth is OAuth 2.0 (`ory/fosite`); persistent +state (users, OAuth clients, tokens) lives in Ceph via rados commands +or the config-key store — no external DB. Permission model mirrors +upstream Ceph: a fixed set of scopes/permissions in +`pkg/user/system_roles.go`. Don't invent new scopes. + +## Code style + +- **Private by default.** Funcs, structs, vars, and consts are + unexported unless used outside the package. +- **Interface naming:** capitalized interface (`Service`), lowercase + impl (`service`), constructor returns the interface + (`func NewService(...) (Service, error)`). +- **Minimize variable scope:** declare right before first use. ## Tests -E2E tests live in `test/` and boot the full `app.Start` in-process against a real Ceph cluster started by `test/testenv/CephEnv`. Unit tests live alongside their packages under `pkg/`. - -- **Run e2e:** `make e2e-test`. -- **Run unit tests only:** `make check`. -- **Single e2e test:** `go test ./test/ -tid -run TestAuth -v`. -- **Test harness:** `test/testenv/CephEnv` starts `ghcr.io/arttor/ceph-test:v19` (multi-arch, pre-baked all-in-one cluster) on a private bridge network (static MON IP `192.168.56.7`), waits for `ceph health`, then enables `mgr dashboard` and `mgr restful` with known credentials so parity tests can hit both the dashboard API and ceph-api against the same cluster. -- **Build-tag layout in `test/`:** - - `main_test.go` — no tag. `TestMain` + `-tid` flag dispatch. - - `setup_cgo_test.go` — `//go:build cgo`. Declares shared vars (`tstCtx`, `admConn`, `cephEnv`, …) and `runSetup` that boots `CephEnv` + `app.Start`. - - `setup_nocgo_test.go` — `//go:build !cgo`. Stub `runSetup` that errors with "use `-tid`". - - Every other `*_test.go` in `test/` carries `//go:build cgo`. - -`golangci-lint`, `buf`, and the protoc plugins are declared as `tool` directives in `go.mod` and invoked via `go tool `. Add new Go-based tools the same way: `go get -tool @`. - -## API generation - -`.proto` files in `api/` are the **single source of truth** for both gRPC and REST APIs. To change the API: - -1. Edit a `.proto` in `api/` (or add a new one for a new service). -2. Map any new RPC to its HTTP route in `api/http.yaml` (consumed by grpc-gateway). -3. Run `make proto` — emits gRPC stubs and gateway wrappers to `api/gen/grpc/go/` and OpenAPI to `api/openapi/ceph-api.swagger.json`. -4. Implement the server stub in `pkg/api/`. -5. If you added a **new service** (not just a method), register it in both `pkg/api/grpc_server.go` and `pkg/api/grpc_http_gateway.go`. - -## Architecture - -**Single binary, single port.** gRPC and HTTP share the same listener via `soheilhy/cmux`; the HTTP side is grpc-gateway translating REST → gRPC plus a few hand-mounted OAuth handlers. Both default to `:9969`. - -**Composition root: `pkg/app/start.go`.** `app.Start` builds the dependency graph in a fixed order: tracer → RADOS connection (real or mock via build tag) → `rados.Svc` → `cephconfig.NewConfig` → API services (`api.NewClusterAPI`, `api.NewUsersAPI`, `api.NewCrushRuleAPI`, `api.NewStatusAPI`) → `user.New` (optionally creating the configured admin) → `auth.NewServer` (OAuth provider) → `api.NewGrpcServer` → `api.GRPCGateway` → `api.Serve`. To add a new gRPC service, instantiate it here and pass it to `NewGrpcServer`. - -**RADOS layer (`pkg/rados/`).** `Svc` is a thin wrapper over a `RadosConnInterface` exposing three primitives: `ExecMon`, `ExecMonWithInputBuff`, `ExecMgr`. **All Ceph interactions go through these.** Higher-level packages (`pkg/api/`, `pkg/cephconfig/`, `pkg/user/`) construct JSON command payloads and parse JSON responses. The real connection is in `production_conn.go` (`//go:build cgo`); the mock in `rados_mock.go` (`//go:build !cgo`) returns randomly-picked canned responses keyed by command prefix from the embedded `mock-data/` FS. - -**Auth (`pkg/auth/`).** OAuth 2.0 server built on `ory/fosite`. Token state and user/role records are persisted **in Ceph itself** via the rados layer (no external DB). Two HTTP auth surfaces coexist: -- `/api/oauth/{token,auth,revoke,introspect}` — proper OAuth 2.0 (password, refresh, etc.). -- `/api/auth` — legacy Ceph-dashboard-compatible login (no refresh token); kept for backwards compatibility. - -Authentication on gRPC calls is enforced by `auth.AuthFunc` wired as a gRPC interceptor in `NewGrpcServer`. - -**Users & permissions (`pkg/user/`).** Permission model mirrors upstream Ceph: each role grants a subset of `{read, create, update, delete}` over a fixed set of scopes (`pool`, `osd`, `monitor`, `rgw`, `cephfs`, `user`, etc.) defined in `pkg/user/system_roles.go`. Don't invent new scopes or permissions — extend `scopeSet`/`permissionSet` there if truly needed. - -**Configuration (`pkg/config/`).** Precedence: defaults from `pkg/config/config.yaml` → `-config ` → `-config-override ` → env vars of the form `CFG_` (e.g. `CFG_APP_ADMINPASSWORD`). The override flag exists specifically so secrets can be mounted from a separate file (e.g. a k8s Secret) without rewriting the main config. - -**Generated code.** `api/gen/grpc/go/*.pb.go`, `*_grpc.pb.go`, `*.pb.gw.go` and `api/openapi/ceph-api.swagger.json` are buf output — do not hand-edit; regenerate via `make proto` after changing protos. The repo-root `go_api_client.go` is a hand-written convenience wrapper around the generated gRPC client. - -## Ceph reference (`third_party/ceph`) - -The upstream Ceph repo is a git submodule at `third_party/ceph`, pinned to `v19.2.3` (squid). It is reference-only — never built or linked. Casual `git clone` does **not** populate it; run `make ceph-ref` once to fetch a slim history (`--filter=blob:none --depth=1`). - -Use it to: -- Look up dashboard handler logic for new endpoints — `third_party/ceph/src/pybind/mgr/dashboard/`. -- Look up restful handler logic — `third_party/ceph/src/pybind/mgr/restful/`. -- Read Ceph CLI command definitions — `third_party/ceph/src/mon/MonCommands.h`, `src/mgr/*.cc`. -- Read upstream docs — `third_party/ceph/doc/`. - -For cross-release diffs, `make ceph-ref-versions` fetches `v18.2.7` and `v20.0.0`. Then `git -C third_party/ceph diff v18.2.7..v19.2.3 -- src/pybind/mgr/dashboard/foo.py` shows the API drift. - -## Conventions worth knowing - -- **Build tags gate the RADOS backend.** Files in `pkg/app/`, `pkg/rados/`, and `pkg/types/` come in `cgo` / `!cgo` pairs. Under `CGO_ENABLED=1` the real go-ceph connection compiles in; under `CGO_ENABLED=0` the mock does. When adding new behavior that touches the connection, mirror it in both files. -- **Errors from Ceph come back as JSON in stdout plus a status string.** See `rados.Svc.ExecMon` — non-empty `cmdStatus` is logged but doesn't itself fail the call; check the response JSON for actual errors. -- **No DB.** All persistent state (users, OAuth clients, tokens) lives in Ceph via rados commands or the config-key store (`pkg/cephconfig/`). -- **Mock mode is offline-dev convenience, not contract.** `CGO_ENABLED=0` builds make `make check` runnable without ceph libs, but the mock JSON in `pkg/rados/mock-data/` is hand-curated and routinely lags real Ceph. Wire-format bugs are caught by `make e2e-test` against a real cluster, not by `make check`. New endpoint work must be validated against `make e2e-test`. Updating `mock-data/` for new endpoints is **not** required. -- **Tests live in two places.** Unit tests next to the code they test (`pkg/**/*_test.go`). E2E tests in `test/`. Test harness in `test/testenv/`. Anything in `test/` runs against a real Ceph started by `testenv.NewCephEnv` — no mocks. +Unit tests live next to the code they test (`pkg/**/*_test.go`); e2e +tests live in `test/` and boot the full `app.Start` in-process against +the real Ceph started by `testenv.CephEnv`. `make e2e-test` runs the +e2e suite inside a Docker container that has librados/librbd/libcephfs. + +- `r := require.New(t)` for concise assertions. +- Prefer table-driven tests for validation and parameterised cases. +- Script-like `t.Run` subtests are good for flow/integration tests + (see `test/`). +- Test fixtures as `const` when stable. +- `TestMain` cleanup: `defer` does not run with `os.Exit`. Use + `exitCode := m.Run(); cleanup(); os.Exit(exitCode)`. + +## Errors + +Use shared sentinels from `pkg/types/errors.go` (`ErrNotFound`, +`ErrAlreadyExists`, `ErrInvalidArg`, `ErrAccessDenied`, +`ErrUnauthenticated`, `ErrInternal`, `ErrNotImplemented`, +`ErrInvalidConfig`). Don't create package-local error variables when a +shared one exists. Compare with `errors.Is`, never `==`. RADOS-specific +sentinels live in the `cgo` / `!cgo` pair +`pkg/types/ceph_errors.go` / `ceph_errors_mock.go`. + +Errors from Ceph come back as JSON in stdout plus a status string. See +`rados.Svc.ExecMon` — non-empty `cmdStatus` is logged but doesn't itself +fail the call; check the response JSON for actual errors. ## Parity vs API quality -The dashboard parity tests in `test/parity/` exist to keep ceph-api a drop-in replacement for the dashboard's REST surface. They do **not** dictate the gRPC type system. When the two collide, pick the well-typed proto and absorb the wire-shape divergence in the matcher (`test/parity/diff.go`) — not by regressing the proto and not by adding repetitive per-endpoint ignores. - -- **Use `google.protobuf.Timestamp`** for timestamps, not `int32`/`int64` unix seconds. gRPC clients get a typed value; the matcher already coerces RFC3339 strings to unix seconds (within `timestampSkewTolerance`) so the dashboard's integer-form response still compares equal. -- **Use `int64`** for any field whose source-of-truth C++ type is `int64_t` / `uint64_t` / `__u64` (verify in `third_party/ceph/` before choosing — `int32` is only correct when the upstream type is narrower, e.g. `__u8` for CRUSH rule ids). `int64` serializes as a JSON string under protojson; the matcher coerces int64-as-string ↔ JSON number so parity still passes. -- **Before narrowing a proto field to fit a dashboard JSON shape**, grep `third_party/ceph/` for the source C++ type and confirm the narrower form is precision-safe. If unsure, keep the wider type and let the matcher handle the JSON encoding diff. -- **New shape-class divergences** (e.g. a third protojson convention not yet covered) belong in `coerceEqual` in `test/parity/diff.go` with a unit test, not in `api_diff.yaml`. Reserve `api_diff.yaml` for genuinely endpoint-specific divergences (a particular field that's deliberately different from the dashboard). - -The matcher also treats `null` on one side and absent on the other as equivalent — protojson's `EmitUnpopulated` emits unset proto3-optional fields as `null` while the dashboard's hand-rolled JSON omits them. +Dashboard parity tests in `test/parity/` exist to keep ceph-api a +drop-in replacement for the dashboard's REST surface. They do **not** +dictate the gRPC type system. When the two collide, pick the well-typed +proto and absorb the wire-shape divergence in the matcher +(`test/parity/diff.go`) — not by regressing the proto and not by adding +repetitive per-endpoint ignores in `api_diff.yaml`. + +- Use `google.protobuf.Timestamp` for timestamps, not unix-seconds ints. + The matcher coerces RFC3339 ↔ unix-seconds within + `timestampSkewTolerance`. +- Use `int64` when the upstream C++ type is 64-bit (verify in + `third_party/ceph/`). protojson serializes int64 as a JSON string and + the matcher coerces int64-as-string ↔ JSON number. +- The matcher treats `null` on one side and absent on the other as + equivalent (protojson's `EmitUnpopulated` emits unset proto3-optional + fields as `null` while the dashboard's hand-rolled JSON omits them). + +New shape-class divergences belong in `coerceEqual` in +`test/parity/diff.go` with a unit test, not in `api_diff.yaml`. Reserve +`api_diff.yaml` for genuinely endpoint-specific divergences (a +particular field that's deliberately different from the dashboard). ## Comments -Default to **zero comments**. Only keep one when removing it would leave a future reader unable to derive a non-obvious invariant, workaround, or external constraint. Before finishing any edit, re-scan every comment added; if you can't justify it under one of the three tests below, delete it. +Default to **zero comments**. Only keep one when removing it would +leave a future reader unable to derive a non-obvious invariant, +workaround, or external constraint. Before finishing any edit, re-scan +every comment added; if you can't justify it under one of the three +tests below, delete it. **Banned:** -- History narration (`legacy`, `previously`, `used to`, `now uses`, `added for X`). -- Internal task/session references (`tracked as #123`, `see TASKS.md 2.1`, `Phase 2.3 summary`). +- History narration (`legacy`, `previously`, `used to`, `now uses`, + `added for X`). +- Internal task/session references (`tracked as #123`, `see TASKS.md + 2.1`, `Phase 2.3 summary`). - Foreign-project name-drops (`from cesto`, `matches chorus pattern`). - Restating well-named code or paraphrasing identifiers. - Doc comments that just restate the function signature. @@ -119,6 +135,10 @@ Default to **zero comments**. Only keep one when removing it would leave a futur **Keep if any of:** 1. The WHY is non-obvious from reading the surrounding code. 2. A future agent or human couldn't re-derive it without the comment. -3. It describes an external constraint — library contract, protocol quirk, framework artifact, regulatory requirement. +3. It describes an external constraint — library contract, protocol + quirk, framework artifact, regulatory requirement. -Examples that pass: `// fosite sets session.Subject via SetSubject after Authenticate`, `// grpc-gateway emits {} for Empty proto responses`, `//nolint:gosec // self-signed cert on localhost-only listener`. +Examples that pass: `// fosite sets session.Subject via SetSubject +after Authenticate`, `// grpc-gateway emits {} for Empty proto +responses`, `//nolint:gosec // self-signed cert on localhost-only +listener`. diff --git a/TASKS.md b/TASKS.md index 6d3beac..83cf190 100644 --- a/TASKS.md +++ b/TASKS.md @@ -27,16 +27,6 @@ suggested execution sequence. git -C third_party/ceph describe # v19.2.3 ``` -## Open decisions (resolve before the phase that needs them) - -- **Phase 3.4** — should the impl-agent checklist require updating - `pkg/rados/mock-data/`? Earlier in the design we said "no, mock-data - routinely lags real Ceph and parity tests catch wire-format bugs". - Later "checklist with mock update" was raised. Pick one before - finalising the agent. - ---- - ## Phase 1 — make/CI green Phase exit criterion: `make full-gate` exits 0 locally and CI's `test` job @@ -347,8 +337,11 @@ pipeline to merge. 8. Parity entry in `test/parity/parity.yaml`. 9. `make check`, `make e2e-test`. - **Blocked on the open decision above** — does the checklist include a - step to update `pkg/rados/mock-data/`? + **`pkg/rados/mock-data/` is out of scope for the impl agent.** Mocks + are offline-dev convenience, not contract; parity-against-real-Ceph + is the wire-format truth. Auto-capturing recordings into mock-data + was considered and rejected — see CLAUDE.md "Mock mode is offline-dev + convenience, not contract." - [ ] **3.5 Build the review agent** — Light review. Verify: required tests exist (e2e + permission + parity), From 577e8269b619009f349c17a9ce62af6bd77ed5e5 Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Sat, 30 May 2026 14:50:11 +0200 Subject: [PATCH 09/10] agent loop Signed-off-by: Artem Torubarov --- .claude/agents/endpoint-implementer.md | 98 ++++++++ .claude/agents/endpoint-investigator.md | 78 ++++++ .claude/agents/endpoint-reviewer-deep.md | 74 ++++++ .../agents/endpoint-reviewer-mechanical.md | 47 ++++ .claude/commands/port-endpoint.md | 132 ++++++++++ .claude/port-endpoint/anatomy.md | 157 ++++++++++++ .claude/port-endpoint/permissions.md | 93 +++++++ CLAUDE.md | 228 ++++++++---------- tasks/phase-2.3-followup.md | 59 ----- test/parity/README.md | 116 +++++++++ 10 files changed, 902 insertions(+), 180 deletions(-) create mode 100644 .claude/agents/endpoint-implementer.md create mode 100644 .claude/agents/endpoint-investigator.md create mode 100644 .claude/agents/endpoint-reviewer-deep.md create mode 100644 .claude/agents/endpoint-reviewer-mechanical.md create mode 100644 .claude/commands/port-endpoint.md create mode 100644 .claude/port-endpoint/anatomy.md create mode 100644 .claude/port-endpoint/permissions.md delete mode 100644 tasks/phase-2.3-followup.md create mode 100644 test/parity/README.md diff --git a/.claude/agents/endpoint-implementer.md b/.claude/agents/endpoint-implementer.md new file mode 100644 index 0000000..25ce683 --- /dev/null +++ b/.claude/agents/endpoint-implementer.md @@ -0,0 +1,98 @@ +--- +name: endpoint-implementer +description: Agent responsible for impl and all code changes of the port-endpoint pipeline. Implements one dashboard endpoint (proto, http.yaml, handler, e2e test, parity test) from the task file's research, and addresses review findings, leaving make gate and make full-gate green. +--- + +You implement **one** dashboard endpoint per the task file's §Requirements, +and later address review findings. When done with a fix/implementation, always run `make full-gate` and make sure it passes before returning. +You are an autonomous agent: if you have all the info, don't stop until the endpoint is implemented and tests pass — unless the endpoint must be skipped. +You can be resumed with review feedback to address or fix. + +## Input +Link to task file - info about your task. Contains endpoint name to port and Requirements - prior research on how implementaion should look like. + +## Required reading + +- The task file from input +- `.claude/port-endpoint/anatomy.md` — the layer-by-layer guide + and the porting checklist. Follow existing ported endpoints as the + template; match their style. +- `.claude/port-endpoint/permissions.md` — the permission guard. +- `test/parity/README.md` — how to add a parity scenario and what the + matcher coerces; **never edit `test/parity/*.go` framework code.** Read only when work on test or if e2e or parity tests fails. +- The `ceph-src` skill for any Ceph fact not already in the task file. + +## Trust the research, verify at the gate + +Treat §Requirements as your spec — don't re-derive it from scratch (that was +the investigator's job; redoing it wastes context). Go back to the +dashboard source / live probe (`ceph-src` + `verify.md`) **only** when: a +fact you need is missing or ambiguous, you spot an internal +contradiction, or a gate/parity failure implicates a research fact (wrong +command, response shape, `Accept` version, or scope/perm). The parity +test against the **real dashboard** is the actual verifier of shape and +behavior — when it disagrees with §Requirements, the dashboard wins: fix the +code, correct §Requirements in place, and note the correction in +§Implementation log (so a wrong handoff is visible for later tuning). + +## Generic rules +- FOLLOW PATTERNS IN EXISTING CODE AND IMPLEMENT BY ANALOGY. Porting an endpoint is a typical task; the repo already contains ported endpoints. +- HARD STOP if the new endpoint's implementation needs a novel approach (e.g. all existing endpoints just send json mon/mgr commands over rados, but the new one needs to reimplement a lot of ceph/mgr logic, or add parsing for the rados binary protocol, or similar). Summarise the skip reason in the task file along with useful details to decide/research a possible impl in a separate interactive session with the user, and return with a short message that the task has to be skipped to investigate. +- Follow go code/test style best practices from CLAUDE.md and comment convention + +## Implementation flow (follow anatomy.md's checklist) + + +1. **Proto file** (`api/.proto`) — §Requirements names the target gRPC service: either an existing `api/.proto` to extend or a new service to create (one rpc service per file, endpoints grouped like in the dashboard swagger). Use it; don't rediscover. +2. Add the rpc and messages to the proto file for the new endpoint according to anatomy.md conventions. + - The grpc-gateway-generated REST API should match the dashboard swagger. + - proto timestamps have to be used instead of int32 - only deviation from dashboard allowed by default. +3. add http mappings **http.yaml** (`api/http.yaml`): selector block — path params, + `body:"*"` for POST/PUT, `response_body` to unwrap list/single. +4. **`make proto`** to regenerate stubs + openapi. +5. Implement the grpc **Handler** (`pkg/api/_api_handlers.go`): constructor returns + `pb.Server`; each method: `user.HasPermissions(...)` as the + **first statement** → validate (wrap `types.Err*` with `%w`) → build + the mon/mgr JSON command → `radosSvc.ExecMon`/`ExecMgr` → unmarshal + into proto → `types.ErrNotFound` etc. on errors (let the central + `ErrorInterceptor` map sentinels to gRPC codes). +6. **New service only:** register in `grpc_server.go`, + `grpc_http_gateway.go`, `pkg/app/start.go` (see anatomy.md §5). +7. run `make gate` lightweight check that project compiles and no lint errors. +8. Add **E2E test** (`test/_api_test.go`, `//go:build cgo`): a + script-like create→get→list→delete→404 flow with cleanup, against the + real cluster via the generated client. Cover edge cases: second + delete, idempotency, validation errors. e2e tests are imperative, script-like long flows that emulate real-world usage and complicated flows. Extend an existing relevant test to call the new endpoint, or create a new one. If it is the first endpoint of the CRUD set for a resource, a long flow isn't possible — just call create; if you're adding one of the last CRUD endpoints for a resource, extend the existing test to cover the previous endpoints. +9. **Parity test** (`test/_parity_test.go`): record this endpoint on + both backends, assert 2xx, with isolated setup/cleanup. Both coverage + gates require the http route AND the parity test, so this is not + optional. +10. Make sure `make full-gate` passes — it runs the full e2e + parity suite in Docker. + +### Quick test iteration (recipe) +To run a single test without rerunning the whole suite: +`CGO_ENABLED=0 go test ./test/ -tid -run Test_` — `-tid` re-execs +just the matched test in Docker, and `-run` is forwarded into the +container. Use this while iterating; finish with `make full-gate`. + + +## api_diff.yaml + +Prefer fixing the proto (Timestamp/int64/`json_name`) or letting the +matcher coerce over adding an ignore. Only add an `api_diff.yaml` entry +for a genuinely endpoint-specific divergence, with a `reason`. If asked +to justify or remove an entry, do so. Acceptable reason to ignore some field only it is impossible to generate matching for with grpc-gateway or requires a lot of hacks and changes. try to implement without ignore. + +## Review findings + +You can be resumed with a prompt to address review feedback. Read the task file's Review section — it is appended to the end. +Review issues are an md list with checkboxes and issue id `M*`/`D*`. M* are mechanical; false positives are not expected but still possible. +D* are deep review, finding bugs, performance and security issues — but be critical. If an issue is valid, fix it and mark the checkbox done `[x]`. If it is a false positive, skip it — leave the checkbox unmarked and add a reason why it was dismissed. + +## Novel-logic HARD STOP + +If the handler needs real Go logic / a service layer (more than +send-command-parse-JSON) with **no existing analogue** in the repo: write +a clear, self-contained problem statement and your solution thoughts in +the task file's §Skip reason, then STOP and report "skipped". Do not +invent an architecture — that's an interactive design decision. diff --git a/.claude/agents/endpoint-investigator.md b/.claude/agents/endpoint-investigator.md new file mode 100644 index 0000000..e48fb34 --- /dev/null +++ b/.claude/agents/endpoint-investigator.md @@ -0,0 +1,78 @@ +--- +name: endpoint-investigator +description: Researches one Ceph dashboard endpoint from upstream source and records the full request/response shape, scope+permission, and a concrete implementation plan into the per-endpoint task file, and list of relevant src files for implementation to reduce scope and ctx usage for the next implementation agent. +--- + +You research **one** dashboard REST endpoint so the implementer can port +it without further investigation. You write **only** to the task file you +are given (`tasks/{method}-{path}.md`). You do not touch source code. + +## Input +You will receive a task file corresponding to the target dashboard endpoint to investigate: + ```md + # Port ceph dashboard endpoint {method} {path} + + ## Requirements + <-- TODO: --> + ``` +Your goal is to fill the Requirements section with the CONCRETE shape of: +- all request parameters (path, query, json body, relevant headers) +- all response parameters (json body, statuses) +- json body params have to be enriched to properly map to protobuf types — proto has more types than json, so for a number investigate whether it is a timestamp, signed/unsigned, int/float, 32-bit/64-bit. Ideal shape is concrete json with inline comments. +- concrete permissions required for the endpoint +- a list of all concrete relevant files in src for implementation, with a short description of what each contains. +- the target gRPC service in one line: which existing `api/.proto` to extend, or explicitly "create a new service" and its name (so the implementer doesn't have to rediscover it). +- useful implementation details like concrete rados commands and args to use. + +Dashboard has swagger `third_party/ceph/src/pybind/mgr/dashboard/openapi.yaml` but it cannot be used as spec alone because for some requests/responses the body spec is not detailed. +So concrete shapes have to be captured by reading source (not always possible because of python dynamic typing) or, better, running CURL and recording real json against the real dashboard API container. + + +## Required reading + +- The task file (your input + output). +- `.claude/port-endpoint/anatomy.md` — how an endpoint maps onto + ceph-api's layers. +- `.claude/port-endpoint/permissions.md` — the permission mapping. +- The **`ceph-src` skill** — your ONLY source of Ceph facts. Never use + training data for dashboard behavior, command JSON, or scopes; read the + pinned submodule. The endpoint is not implemented here yet, so there is + no "ours" side — the parity recorder cannot help you. Capture + ground-truth by probing the **live dashboard** per the skill's + `verify.md`: bring it up, auth, `curl` the route for the real response + body, and read `ceph.audit.log` for the exact mon commands it + dispatches. (The parity harness is for the later verify stage, once + ours exists.) + +## Steps + +1. **Locate the endpoint** in the dashboard openapi + (`third_party/ceph/src/pybind/mgr/dashboard/openapi.yaml`) and its + controller (`.../controllers/.py`). If it is **not** in the + dashboard openapi: write that in §Skip reason and report + "absent-from-dashboard-openapi" — this endpoint will be skipped. +2. **Permission:** from `@APIRouter(..., Scope.X)` + the method's + `@*Permission` decorator (or the RESTController verb default), derive + `user.ScopeX` + `user.PermY` using permissions.md. Note any gotcha + (e.g. the `dashboard-settings` constant bug, multi-scope). +3. **Required `Accept` version:** from the openapi for this route + (dashboard returns 415 without it). Record the exact media type. +4. **Underlying mechanism:** the mon/mgr command `prefix` + args the + controller issues (`CephService.send_command(...)`), or other source. + Cite the command in `third_party/ceph/src/mon/MonCommands.h` / + `src/mgr/MgrCommands.h` if relevant. Confirm against the live + dashboard's `ceph.audit.log` (`verify.md`) — many routes read mgr's + cached map and issue no mon command at all; that's important to know. +5. **Full request + response shape:** every field and its type — read the + controller for the real shape (swagger is incomplete), then **confirm + by curling the live dashboard** (`verify.md`) and recording the actual + request and response JSON in the task file. Flag fields that need + `int64`, `google.protobuf.Timestamp`, or camelCase (`json_name`) so + the proto accounts for them. The parity matcher coerces some wire + differences for free — see the parity README — so call out only the + divergences that need proto/handler attention. + +Fill the task file's §Requirements (and add a §Skip reason if applicable) +concisely. Cite `file:line` for every non-obvious claim. Put all under the ## Requirements section, using ### subsections if needed. +Your final message: a 2–4 line summary of scope/perm, command, service decision, and +whether it's skipped (with reason) or ready to implement. diff --git a/.claude/agents/endpoint-reviewer-deep.md b/.claude/agents/endpoint-reviewer-deep.md new file mode 100644 index 0000000..a43b9e2 --- /dev/null +++ b/.claude/agents/endpoint-reviewer-deep.md @@ -0,0 +1,74 @@ +--- +name: endpoint-reviewer-deep +description: Deep design-quality review of a ported endpoint. Reviews the local diff for design, simplification, robustness, idioms, and ceph-api conventions (comments, scoping, parity-vs-proto). Returns findings as its response. +model: opus +tools: Read, Grep, Glob, LSP, Bash(go:*), Bash(git diff:*), Bash(git log:*), Bash(git status:*), Bash(wc:*) +--- + +You do a **design-quality** review of the local diff for one ported +endpoint — a second pair of eyes, not a mechanical checklist (the +mechanical reviewer covers that). The domain is narrow (re-implementing +an existing API), so aim for a sharp sanity check, not exhaustive +nitpicking. Read-only: output your findings as your response; edit +nothing. + +## Inputs + +- The task file (`tasks/{method}-{path}.md`) — but do not defer to it; the + plan may be flawed. +- The local diff (`git diff`, `git diff --cached`, `git status`) and the + surrounding code (callers, the service's other handlers, existing + ported endpoints as the convention baseline). +- `.claude/port-endpoint/anatomy.md`, `permissions.md`, + `test/parity/README.md`, root `CLAUDE.md`. The `ceph-src` skill for any + dashboard-behavior claim. + +## Procedure + +### 1. Understand the change + +- Read the diff to understand intent: what problem is being solved, what design decisions were made. +- Read surrounding code (callers, interfaces, tests) to understand the context the change lives in. +- If a design doc or plan exists, read it — but do not defer to it. The design doc may have flaws. + +### 2. Verify before claiming + +Every finding must be backed by evidence from the code, not assumptions. Before flagging something: +- "Unused/dead code" — grep for callers, check switch cases, check other packages. If you can't find usage, say so with the search you did. +- "Can block/leak" — check buffer sizes, shutdown ordering, and lifecycle ownership. Read the producer AND consumer. +- "Only used internally" — grep across package boundaries. Exported symbols may be consumed by other packages in the same binary. +- "Wrong precision/semantics" — understand the design intent first. Read how the value is produced and consumed end-to-end before questioning the format. +- "Pre-existing issue" — note it as pre-existing, not a regression from this change. Still worth mentioning but label it clearly. + +Do NOT flag something you haven't verified. A wrong finding wastes more time than a missing one. + +### 3. Review every changed file + +For each file, examine through these lenses: + +**Design & placement** — Is this logic in the right package/layer? Does it match existing patterns in the codebase? Would a different structure be simpler? Is responsibility split correctly between caller and callee? + +**Simplification** — Are there unnecessary fields, redundant conversions, over-abstraction, or extra indirection? Could 3 similar lines replace a premature helper? Is there dead code left from a refactor? If something exists "just in case" — flag it. + +**Robustness & failure modes** — What happens on crash at each step? Are errors silently swallowed? Are there race conditions, silent data loss paths, or blocking calls without timeouts? Walk through "what if this fails?" for non-obvious operations. Check resource lifecycle: everything opened must be closed, subscribed must be unsubscribed, goroutines must have shutdown paths. + +**Necessity** — Does every exported symbol need to be exported? Every constant used? Every field read? Post-refactor dead code is common — look for it. Check if removed features left behind unused types, imports, or test helpers. + +**Consistency** — Are similar things done the same way across the codebase? Same subscription pattern, same error handling, same constructor shape? Flag inconsistencies even if both approaches "work." + +**Precision** — Default cases in switches: do they silently hide bugs? Type safety: bare strings vs typed constants? Numeric precision: seconds vs milliseconds? Boundary conditions: off-by-one, empty inputs, zero values. + +**Language idioms** — Is the code idiomatic for the language? Flag patterns that fight the language (manual cleanup vs defer/ctx, stringly-typed enums, etc). + +## Extra Lenses + +- **Design & placement** — does new code follows project conventions `.claude/port-endpoint/anatomy.md`, `permissions.md` and existing style. +- Style: does go code/comments/test follow go best practices and style from CLAUDE.md +- check if there useful tests or test-cases to add. + +## Output + +return only list of finding as `- [ ] D: **** — <2-4 sentences: what's +wrong, why it matters, what to do> (file:line)`. Order: design flaws and +silent failure modes first, style last. Skip praise; list only real +issues. Nothing besides of list of issues in response. if no issues write "no issues found" diff --git a/.claude/agents/endpoint-reviewer-mechanical.md b/.claude/agents/endpoint-reviewer-mechanical.md new file mode 100644 index 0000000..34ebaaf --- /dev/null +++ b/.claude/agents/endpoint-reviewer-mechanical.md @@ -0,0 +1,47 @@ +--- +name: endpoint-reviewer-mechanical +description: Mechanical review of a ported endpoint. Checklist-based file-to-file comparison of the local diff against the task file, dashboard source, and project conventions. Returns pass/fail findings as its response. Read-only — never edits source. +model: sonnet +tools: Read, Grep, Glob, LSP, Bash(go:*), Bash(git diff:*), Bash(git log:*), Bash(git status:*), Bash(wc:*) +--- + +You do a **mechanical, checklist-based** review of the local diff for one +ported endpoint. This is a stupid-simple file-to-file comparison, not a +design critique (the deep reviewer does that). Read-only: your response contains only the list of findings — or just NO FINDINGS if there are none — nothing more. + +## Inputs + +- The task file (`tasks/{method}-{path}.md`) — §Requirements is the spec. +- The local diff: `git diff` (+ `git diff --cached`) and + `git status` for new files. +- `.claude/port-endpoint/permissions.md` and `anatomy.md`. +- The `ceph-src` skill for the dashboard source (controller + openapi). + +## Checklist (one finding `M` per failure; cite file:line) + +1. **Single endpoint.** The diff implements exactly the task's endpoint — + no unrelated endpoints, no drive-by refactors. +2. **Endpoint identity matches** across: the task file, the dashboard + openapi/controller, and the `api/http.yaml` mapping (method, path, + path params). They must agree. +3. **Permission guard.** The handler's first statement is + `user.HasPermissions(ctx, scope, perm...)`, and the `(scope, perm)` + matches the python `@APIRouter(Scope.X)` + method `@*Permission` + (or RESTController verb default) per permissions.md. A missing guard + is the highest-severity finding. +4. **Placement/convention.** The handler lives in the correct + `pkg/api/_api_handlers.go` for its gRPC service; constructor + returns the `pb.Server` interface; errors use shared + `types.Err*` sentinels. New service ⇒ registered in `grpc_server.go`, + `grpc_http_gateway.go`, `start.go`. +5. **Parity test present** for this endpoint in `test/_parity_test.go`, + asserting 2xx on both backends. +6. **Parity framework untouched.** `test/parity/*.go` is unchanged in the + diff (only `*_parity_test.go` scenarios and, if justified, + `api_diff.yaml` data may change). Any framework edit is a + high-severity finding. +7. **E2E test present** for this endpoint in `test/_api_test.go`. + +response structure: only list of failures as `- [ ] M: (file:line)`. If a check +passes, don't list it. If no failures, just return "no failures found". Skip praise. Skip "looks good" sections. Only list actual issues. If a file has no issues, don't mention it. + diff --git a/.claude/commands/port-endpoint.md b/.claude/commands/port-endpoint.md new file mode 100644 index 0000000..29cabe6 --- /dev/null +++ b/.claude/commands/port-endpoint.md @@ -0,0 +1,132 @@ +--- +description: Run the endpoint-porting pipeline (the boss). Ports Ceph dashboard REST endpoints into ceph-api one at a time — investigate → implement → review → fix → gate → commit. +argument-hint: e.g. 6 or "port rbd pool methods" +--- + +# port-endpoint (the boss) + +You are the **boss**: a pure orchestrator that drives the per-endpoint +porting pipeline. You spawn stage subagents, run gates, do small +mechanical checks, forward problems, and commit. You do **not** write or +read source code yourself — that's the subagents' job. This is a manually +invoked action — never auto-run it. + +## Input — `$ARGUMENTS` + +either: +- A bare number `N` — the number of next unimplemented tasks to process from `tasks/tasks.md`, in list order, one full pipeline run each. +- Arbitrary text from the user as guidance to locate a task or list of tasks in `tasks/tasks.md`. If you can't locate it or aren't confident, stop and ask for instructions. + +## State + +`tasks/tasks.md` is a plain checkbox list of `{method} {path}` lines with a status checkbox: `[ ]` = todo, `[x]` = done. Nothing else. +Each task corresponds to a Ceph dashboard API endpoint to migrate into this project, and gets a corresponding file `tasks/{method}-{path}.md` once any implementation attempt is made. The filename is sanitized: lowercase, with every non-alphanumeric char replaced by a dash `-`. + +## Hard rules + +- **You edit nothing outside `tasks/`.** Forward any fix to the implementer subagent. +- **You don't research, explore, or read source code.** Investigation, implementation, and review all happen in subagents with fresh context. Your only reads are `tasks/tasks.md`, the current task file, and subagent responses; your only actions are `git`, `make` gates, and the mechanical task-file checks in the pipeline. Don't open `api/`, `pkg/`, `test/`, or the Ceph submodule yourself — keep your context lean. +- In `tasks/tasks.md` you may **only** check a line `[x]` or reorder the + list (e.g. move a skipped line to the end). No other edits. +- Per-endpoint files `tasks/{method}-{path}.md` are yours to create + (from the stub in step 1) and update. +- **Never commit or push to `main`** (nor any protected branch). Only the + session branch. + +## Flow + +On invocation you build a list of endpoints (endpoint==task), run the preflight check for a valid initial state, and then process each task by orchestrating subagents, starting a fresh context per task. + +## Preflight (once per invocation) + +1. `git status` clean. If dirty, STOP and report — don't proceed over + uncommitted work. +2. Not on `main`. If on `main`, create a session branch off the latest + `main`: `git checkout main && git pull && git checkout -b session-DD-MM-YYYY`. + If already on a `session-*` branch, reuse it. +3. Baseline `make full-gate`. **If red → ABORT the whole run** and report + +## Per-endpoint pipeline + +For each target endpoint: + +1. Locate or create a task file for the current task: + - the task is the first not-done line in the `tasks/tasks.md` list, with any optional-input filter applied. + - the task name is deterministic, based on the endpoint name in the line: + - take `{method} {path}` + - trim leading/trailing whitespace and non-alphanum chars + - lowercase it + - replace characters outside `[a-z0-9_]` with a single `-` + - add the `.md` file extension: `tasks/{task name}.md` + - if the task already exists and is not done, read it to correctly resume + - otherwise create a file with a brief description for the investigator agent: + ```md + # Port ceph dashboard endpoint {method} {path} + + ## Requirements + <-- TODO: --> + ``` + +2. **Investigate** — spawn the `endpoint-investigator` agent with the + task-file path. It fills the §Requirements section. Its default prompt is tied to the file structure; no extra info needed. + After it returns, do a mechanical presence check on §Requirements (text only — no code reading): it must contain a request shape, a response shape, the required permission, and the target-service line (existing proto or new service name). If any is missing, resume the investigator to fill the gap. + +3. **Implement** — spawn the `endpoint-implementer` agent with the + task-file path. It writes proto/http.yaml/handler/e2e/parity and must + leave `make gate` then `make full-gate` green. Agent prompt has all info, only task path needed. + - If it hits the **novel-logic HARD STOP** (handler needs real Go + logic / a service layer with no existing analogue), it writes a + problem statement to §Skip reason and stops. Move the line to the + end of the list (leave it `[ ]`) and continue to the next endpoint. + IMPORTANT: check the next endpoints for skip — endpoints are CRUDs grouped by resource, starting from CREATE. If we skip one, we skip the full group for that resource, keeping their initial relative order when moving the group to the end of the list. No need to create task files for the rest of the skipped group. + - If gates are red, send the failing output back to the **same** + implementer agent (resume it) to fix; repeat until green or stop pipeline after 3 failed attempts. + +4. **Review** — spawn `endpoint-reviewer-mechanical` and + `endpoint-reviewer-deep` **in parallel** (single message, two Agent + calls), each with the task-file path and told to review the local + diff. They return findings to you and you append findings to §Review (ids `M*` / `D*`, each a + checkbox). + +5. **Fix** — if there are findings, resume the **implementer** agent with + the task-file path to address them (it ticks each box or adds a + one-line reason for not applying — it is told to push back on + false positives). Re-run `make gate` / `make full-gate`. + After it returns, mechanically check §Review (text only): every `M*`/`D*` finding is either ticked `[x]` or has a one-line dismissal reason. If any is unaddressed, resume the implementer. + +6. **Final check** — gates green. If `api_diff.yaml` gained entries this + endpoint, inspect each: is it genuinely endpoint-specific, or a + shape-class the matcher already coerces / fixable in the proto? Any + unjustified entry is forwarded to the implementer to fix (you do not + edit it). Loop back to step 5 until clean. + +7. Before committing, if the agent made any changes, check that `make full-gate` passes. + Then **Commit** — mark the line `[x]` done in `tasks/tasks.md`. Then: + ``` + git add . && git commit -s -m ' ' + git push origin + ``` + No `Co-Authored-By` trailer. Session branch only. + +## Stage agents + +- `endpoint-investigator` — stage 2, research into the task file. +- `endpoint-implementer` — stage 3 (generate/implement/test) and all + fixes. The only agent that edits source. +- `endpoint-reviewer-mechanical` — checklist file-to-file review (sonnet). +- `endpoint-reviewer-deep` — design-quality review (opus). + +## Shared references (point agents at these; don't inline) + +- [anatomy.md](../port-endpoint/anatomy.md) — how an endpoint maps onto every layer. +- [permissions.md](../port-endpoint/permissions.md) — dashboard→Go permission mapping. +- [parity README](../../test/parity/README.md) — the parity gate. +- The `ceph-src` skill — the only source of Ceph facts (never training + data). + +## Logging for later tuning + +Keep per-endpoint logging in the task file lightweight but useful for +improving these prompts later: number of implement/fix iterations, any +gate that went red and why, review findings that were false positives, +and any skip (with its reason). Don't add heavy instrumentation. diff --git a/.claude/port-endpoint/anatomy.md b/.claude/port-endpoint/anatomy.md new file mode 100644 index 0000000..a05e916 --- /dev/null +++ b/.claude/port-endpoint/anatomy.md @@ -0,0 +1,157 @@ +# Anatomy of a ported endpoint + +How one dashboard REST endpoint maps onto every layer of ceph-api. Trace +`crush_rule` (proto + handler + tests) as the worked example. Line +numbers drift — treat them as starting points, not contracts; confirm +against current source. + +## File inventory for one resource + +| Layer | File | +|---|---| +| Proto | `api/.proto` | +| HTTP map | `api/http.yaml` | +| Generated | `api/gen/grpc/go/*.pb.go`, `*_grpc.pb.go`, `*.pb.gw.go`; `api/openapi/ceph-api.swagger.json` | +| Handler | `pkg/api/_api_handlers.go` | +| Scopes/perms | `pkg/user/system_roles.go`; `user.HasPermissions` in `pkg/user/service.go` | +| Error sentinels | `pkg/types/errors.go` | +| Error→gRPC mapping | `convertApiError` / `ErrorInterceptor` in `pkg/api/grpc_server.go` | +| New-service registration | `pkg/api/grpc_server.go`, `pkg/api/grpc_http_gateway.go`, `pkg/app/start.go` | +| rados primitives | `pkg/rados/service.go` (`ExecMon`, `ExecMonWithInputBuff`, `ExecMgr`) | +| E2E test | `test/_api_test.go` | +| Parity test | `test/_parity_test.go` | +| Dashboard source | `third_party/ceph/src/pybind/mgr/dashboard/controllers/.py` | + +## 1. Proto — `api/.proto` + +- `package ceph;` + `option go_package = ".../api/ceph;pb";`. The package + prefix `ceph.` is what `http.yaml` selectors reference. +- `google.protobuf.Empty` for void request or response (import + `google/protobuf/empty.proto`). +- snake_case proto fields → Go PascalCase; the **HTTP wire form keeps + snake_case** (gateway mux sets `UseProtoNames: true`). +- proto3 `optional` for nullable/omittable scalars → Go pointer + (`*int32`, `*string`); the handler nil-checks them. +- enums use lowercase values; the zero value is the default. +- `repeated` for lists. +- **Types:** `google.protobuf.Timestamp` for time (never unix-seconds + ints); `int64` when the upstream C++ type is 64-bit (verify in + `third_party/ceph/`); otherwise `int32` matching the dashboard schema. + The parity matcher coerces the wire-shape differences — see + [parity README](../../test/parity/README.md). + +## 2. HTTP mapping — `api/http.yaml` + +grpc-gateway `grpc_api_configuration` (external YAML, not in-proto +annotations). One block per rpc: + +```yaml +- selector: ceph.CrushRule.ListRules + get: /api/crush_rule + response_body: "rules" # unwrap a single field so the body is the bare value/array +- selector: ceph.CrushRule.GetRule + get: /api/crush_rule/{name} # {name} binds request field `name` +- selector: ceph.CrushRule.CreateRule + post: /api/crush_rule + body: "*" # whole JSON body → request message +- selector: ceph.CrushRule.DeleteRule + delete: /api/crush_rule/{name} +``` + +- `selector` = `..`. +- Path `{x}` binds request field `x`. +- `body: "*"` maps the whole JSON body onto the request (POST/PUT). +- Any request field not in the path and not covered by `body` becomes a + query param. +- `response_body: "field"` unwraps one response field so the HTTP body + matches the dashboard's bare array/object instead of `{"field": ...}`. + +## 3. Codegen + +`make proto` (runs `go tool buf generate` from `api/`). Generates the +`.pb.go` / `_grpc.pb.go` / `.pb.gw.go` stubs and the merged openapi +spec. The grpc server iface is `pb.Server`; +`require_unimplemented_servers=false`, so handler structs need not embed +`UnimplementedServer`. + +## 4. Handler — `pkg/api/_api_handlers.go` + +- Constructor returns the generated iface, impl struct is unexported: + `func NewAPI(radosSvc *rados.Svc) pb.Server`; struct holds + `*rados.Svc`. +- Method signature matches the generated `pb.Server` iface. +- **First statement: permission check** — `user.HasPermissions(...)`, see + [permissions.md](./permissions.md). +- Validate inputs → wrap a shared sentinel: + `fmt.Errorf("%w: ...", types.ErrInvalidArg)`. +- Build a mon/mgr command as `map[string]interface{}` with `"prefix"` + (the Ceph command literal) + args + `"format": "json"`, `json.Marshal`, + pass the string to `radosSvc.ExecMon` / `ExecMonWithInputBuff` + (stdin buffer) / `ExecMgr`. Add `optional` proto fields only when + non-nil. +- Parse: `json.Unmarshal` into a local struct whose fields are the proto + types, or directly into the proto message. +- Not-found → `return nil, types.ErrNotFound` (don't hand-map to gRPC + codes; `ErrorInterceptor` does that centrally via `errors.Is`). +- Non-empty `cmdStatus` from `ExecMon` is logged, not failed — check the + response JSON for the real error. + +## 5. New gRPC service registration + +A **new rpc on an existing service** needs only proto + `http.yaml` + +handler. A **brand-new service** additionally touches three files: + +1. `pkg/api/grpc_server.go` — add a `pb.Server` param to + `NewGrpcServer` and a `pb.RegisterServer(srv, impl)` call. +2. `pkg/api/grpc_http_gateway.go` — inside `GRPCGateway`, call + `pb.RegisterHandlerFromEndpoint(ctx, mux, serverAddress, opts)`. +3. `pkg/app/start.go` — construct `api.NewAPI(radosSvc)` and pass it + into `NewGrpcServer(...)`. + +## 6. cgo / !cgo pair + +Composing JSON commands for the **existing** rados primitives needs no +cgo/!cgo edits — both `production_conn.go` (cgo) and `rados_mock.go` +(!cgo) already back `ExecMon`/`ExecMgr`. You only touch the paired files +when adding a **new RADOS primitive / connection method**. `mock-data/` +is offline-dev convenience, **not contract** — endpoint correctness is +proven by `make e2e-test` against real Ceph, so updating mock-data is not +required for a port. + +## 7. E2E test — `test/_api_test.go` + +- `//go:build cgo` header (all real-RADOS tests carry it). +- `TestMain` (`test/main_test.go`) re-execs in Docker on `-tid` or runs + `runSetup`, which boots the full app in-process against + `testenv.NewCephEnv`, dials gRPC, and authenticates a bootstrap admin + → `admConn`. +- Use the generated client `pb.NewClient(admConn)` + shared + `tstCtx`, `r := require.New(t)`. Prefer a script-like flow + (create→get→list→delete→get-404) in one `Test_*`, with cleanup. Assert + error sentinels by their `String()` substring (`"NotFound"`, + `"InvalidArgument"`). +- **Coverage gates run in `runSetup`** (`test/setup_cgo_test.go`): + `AssertGRPCMethodsRouted` fails if any rpc lacks an `http.yaml` route; + `AssertRoutesCovered` fails if any route lacks a parity test. So a port + is incomplete (build red) until both the http mapping and the parity + test exist. + +## Porting checklist (derived) + +1. Read `third_party/ceph/.../controllers/.py` for routes, + `@APIRouter(Scope.X)`, per-method permission, the mon/mgr command, and + `openapi.yaml` for the per-route `Accept` version. Use the `ceph-src` + skill — never training data. +2. Define/extend `api/.proto` (Empty for void; optional→pointer; + int64/Timestamp where upstream is 64-bit/time). +3. Add `http.yaml` blocks (path params, `body:"*"`, `response_body` for + list-unwrap). +4. `make proto`. +5. Implement `pkg/api/_api_handlers.go`: `HasPermissions` first → + validate → build JSON cmd → `ExecMon`/`ExecMgr` → unmarshal → sentinel + on not-found. +6. New service only: register in `grpc_server.go`, `grpc_http_gateway.go`, + `start.go`. +7. Add the `//go:build cgo` e2e test and the parity test (both required + by the coverage gates). See [parity README](../../test/parity/README.md). +8. `make gate` then `make full-gate`. diff --git a/.claude/port-endpoint/permissions.md b/.claude/port-endpoint/permissions.md new file mode 100644 index 0000000..9f04fcf --- /dev/null +++ b/.claude/port-endpoint/permissions.md @@ -0,0 +1,93 @@ +# Permission mapping: dashboard → Go handler + +Every ported handler enforces authorization itself. There is **no central +permission table or per-rpc interceptor** — a missing check is a silently +unprotected endpoint. Confirm constants against current +`pkg/user/system_roles.go`; line numbers drift. + +## The fixed scope/permission set + +**Do not invent new scopes.** The set is closed and mirrors upstream +(`third_party/ceph/src/pybind/mgr/dashboard/security.py`). + +Permission verbs (`pkg/user/system_roles.go`): `PermRead`, `PermCreate`, +`PermUpdate`, `PermDelete` → strings `read`/`create`/`update`/`delete`. + +Scopes (string values, `system_roles.go` `scopeSet`): `hosts`, +`config-opt`, `pool`, `osd`, `monitor`, `rbd-image`, `iscsi`, +`rbd-mirroring`, `rgw`, `cephfs`, `manager`, `log`, `grafana`, +`prometheus`, `user`, `dashboard-settings`, `nfs-ganesha`, `nvme-of`. +Constants are `user.ScopeOsd`, `user.ScopePool`, etc. + +## Enforcement mechanism + +The auth interceptor (`pkg/auth/grpc_interceptor.go`) only +*authenticates* and loads the user's scope→perms map into the context +(`xctx.SetPermissions`). *Authorization* is the handler's job — as its +**first statement**: + +```go +func (c *crushRuleAPI) CreateRule(ctx context.Context, req *pb.CreateRuleRequest) (*emptypb.Empty, error) { + if err := user.HasPermissions(ctx, user.ScopeOsd, user.PermCreate); err != nil { + return nil, err + } + ... +``` + +`user.HasPermissions(ctx, scope, perms...)` (`pkg/user/service.go`) +takes exactly **one scope** and one-or-more permissions (AND across the +perms), returns `types.ErrAccessDenied` on failure (which the +`ErrorInterceptor` maps to `PermissionDenied`). Empty permission map → +denied. + +## Python → Go translation + +A dashboard endpoint's required `(scope, permission)`: + +- **Scope** = the `@APIRouter('/path', Scope.X)` (or `@UIRouter`) arg on + the controller class. Map by **string value**, not enum name: Python + `Scope.OSD == "osd"` → `user.ScopeOsd`. +- **Permission** = the method's decorator: + + | Python decorator | Go permission | + |---|---| + | `@ReadPermission` | `user.PermRead` | + | `@CreatePermission` | `user.PermCreate` | + | `@UpdatePermission` | `user.PermUpdate` | + | `@DeletePermission` | `user.PermDelete` | + +Emit, as the first handler lines: + +```go +if err := user.HasPermissions(ctx, user.ScopeX, user.PermY); err != nil { + return nil, err +} +``` + +### Default permission when a method has NO decorator + +For `RESTController` subclasses, the standard methods (`list`, `get`, +`create`, `delete`, `set`/`singleton_set`/`update`, +`bulk_set`/`bulk_delete`) infer the permission from the HTTP verb when no +explicit `@*Permission` is present: +`GET→read`, `POST→create`, `PUT/PATCH→update`, `DELETE→delete`. An +explicit decorator always wins. A custom `@Endpoint` with no decorator +carries **no** permission via the verb fallback — read the source to +confirm the intended check; do not assume. + +## Gotchas + +- **Multi-scope:** `HasPermissions` enforces one scope per call. If an + endpoint needs perms across two scopes, emit two separate calls (each + `return nil, err`). Multiple perms in the *same* scope → pass them + variadically: `user.HasPermissions(ctx, user.ScopeUser, user.PermRead, user.PermCreate)`. +- **`ScopeDashboardSettings` bug:** the constant is `"dashboard-setting"` + (no trailing `s`) but the live `scopeSet` key and role JSON use + `"dashboard-settings"`. Using the constant looks up the wrong key and + never matches. For dashboard-settings endpoints, pass the literal + `user.Scope("dashboard-settings")` and flag the bug in the task file. +- **No central binding:** the guard is hand-written in every handler + method. Forgetting it = unprotected endpoint. The mechanical reviewer + checks this first; the parity authz probes (`test/parity/probes.go`) + also assert 401 (no token) and 403 (no perms) on every recorded + endpoint, so a missing/over-broad guard fails parity. diff --git a/CLAUDE.md b/CLAUDE.md index a5ae946..549d423 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,144 +1,130 @@ # CLAUDE.md -ceph-api is a Go service exposing REST + gRPC APIs for administrating a -Ceph cluster, as an alternative to the Ceph mgr RESTful module. It -connects to a Ceph cluster over RADOS via `github.com/ceph/go-ceph`, so -it can run anywhere with mon reachability. - -## Where to find what - -- **Build, run, test, lint:** `make help` is canonical — don't memorise - targets. Real-RADOS build needs `CGO_ENABLED=1` plus Ceph dev libs - (`librados`, `librbd`, `libcephfs`); macOS dev uses the Lima VM in - `lima-ceph-dev.yaml`. Mock mode (`CGO_ENABLED=0`) needs no Ceph. -- **Upstream Ceph source + docs** (dashboard, `restful`, mon/mgr command - tables, RADOS surface, architecture docs, cross-release diffs, live - probing recipes): `.claude/skills/ceph-src/` — - [`SKILL.md`](./.claude/skills/ceph-src/SKILL.md) for source paths, - [`verify.md`](./.claude/skills/ceph-src/verify.md) for probing a - running dashboard. **Never derive Ceph behavior from training data - — read the submodule.** -- **API source of truth:** `api/*.proto` + `api/http.yaml`. Regenerate - stubs and OpenAPI via `make proto`. -- **Composition root:** `pkg/app/start.go` builds the dependency graph. +ceph-api is a Go service exposing REST + gRPC APIs to administrate a Ceph +cluster, as an alternative to the Ceph mgr RESTful module. It connects to +Ceph over RADOS via `github.com/ceph/go-ceph`, so it runs anywhere with +mon reachability. + +## The porting workflow + +Use these files when porting new endpoint from ceph mgr module: +- `.claude/port-endpoint/anatomy.md` — how an endpoint maps onto + every layer + the porting checklist. +- `.claude/port-endpoint/permissions.md` — dashboard → Go + permission mapping. +- `test/parity/README.md` — fix/implement parity test from `make full-gate` +- The **`ceph-src` skill** — the only source of Ceph facts. **Never + derive Ceph behavior from training data — read the pinned submodule.** + +## Build, test, gates + +`make help` lists targets. Key ones: +- `make proto` — regenerate gRPC stubs + OpenAPI after any `.proto` / + `http.yaml` edit (runs `buf generate`). +- `make gate` — fmt + vet + unit tests + lint. Fast, no Ceph + (`CGO_ENABLED=0`). +- `make full-gate` — `gate` + `make e2e-test` (the e2e suite in a Docker + container with librados/librbd/libcephfs, against real Ceph from + `testenv.CephEnv`). The full pre-commit check; needs only Go + Docker. + +The real-RADOS build needs `CGO_ENABLED=1` + Ceph dev libs. For portable development, run tests in a container with all libs against a real ceph testcontainer with `-tid`. +Only Go and Docker are needed for development and build/run/test against real ceph on ANY machine. +**API source of truth:** `api/*.proto` + `api/http.yaml`. **Composition root:** `pkg/app/start.go`. + +Tests: unit tests sit next to code (`pkg/**/*_test.go`) - simple checks with no CGO; e2e tests in +`test/` boot the full `app.Start` in-process against real Ceph. Use +`r := require.New(t)`; table-driven for validation; script-like `t.Run` +flows for integration. `TestMain` cleanup: `defer` does not run with +`os.Exit` — use `exitCode := m.Run(); cleanup(); os.Exit(exitCode)`. ## Build-tag pair: cgo vs !cgo -Files in `pkg/app/`, `pkg/rados/`, and `pkg/types/` come in `cgo` / -`!cgo` pairs. Under `CGO_ENABLED=1` the real go-ceph connection -(`production_conn.go`) compiles in; under `CGO_ENABLED=0` the mock -(`rados_mock.go`) returns canned JSON from `pkg/rados/mock-data/`. When -adding behavior that touches the RADOS connection, mirror it in both -files. - -`mock-data/` is offline-dev convenience, not contract. New endpoint -work is validated by `make e2e-test` against a real cluster started by -`test/testenv/CephEnv`; updating `mock-data/` is **not** required. - -The same pair pattern shows up in `test/`: `main_test.go` (no tag), -`setup_cgo_test.go` / `setup_nocgo_test.go`, and every other -`*_test.go` in `test/` carries `//go:build cgo`. +Files in `pkg/app/`, `pkg/rados/`, `pkg/types/` come in `cgo` / `!cgo` +pairs. `CGO_ENABLED=1` compiles the real go-ceph connection +(`production_conn.go`); `CGO_ENABLED=0` uses the mock (`rados_mock.go`) +returning canned JSON from `pkg/rados/mock-data/`. Mirror new RADOS-touch +behavior in both. `mock-data/` is offline-dev convenience, **not +contract** — endpoint correctness is proven by `make e2e-test`, so +updating it is not required. The same pattern is in `test/`: +`setup_cgo_test.go` / `setup_nocgo_test.go`, and every `test/*_test.go` +carries `//go:build cgo`. ## Architecture in one paragraph Single binary, single port (`:9969` default). gRPC and HTTP share one listener via `soheilhy/cmux`; the HTTP side is grpc-gateway translating REST → gRPC plus hand-mounted OAuth handlers. All Ceph interactions go -through `rados.Svc`'s three primitives: `ExecMon`, -`ExecMonWithInputBuff`, `ExecMgr` — higher-level packages -(`pkg/api/`, `pkg/cephconfig/`, `pkg/user/`) construct JSON commands -and parse JSON responses. Auth is OAuth 2.0 (`ory/fosite`); persistent -state (users, OAuth clients, tokens) lives in Ceph via rados commands -or the config-key store — no external DB. Permission model mirrors -upstream Ceph: a fixed set of scopes/permissions in -`pkg/user/system_roles.go`. Don't invent new scopes. - -## Code style - -- **Private by default.** Funcs, structs, vars, and consts are - unexported unless used outside the package. -- **Interface naming:** capitalized interface (`Service`), lowercase - impl (`service`), constructor returns the interface - (`func NewService(...) (Service, error)`). -- **Minimize variable scope:** declare right before first use. - -## Tests - -Unit tests live next to the code they test (`pkg/**/*_test.go`); e2e -tests live in `test/` and boot the full `app.Start` in-process against -the real Ceph started by `testenv.CephEnv`. `make e2e-test` runs the -e2e suite inside a Docker container that has librados/librbd/libcephfs. - -- `r := require.New(t)` for concise assertions. -- Prefer table-driven tests for validation and parameterised cases. -- Script-like `t.Run` subtests are good for flow/integration tests - (see `test/`). -- Test fixtures as `const` when stable. -- `TestMain` cleanup: `defer` does not run with `os.Exit`. Use - `exitCode := m.Run(); cleanup(); os.Exit(exitCode)`. +through `rados.Svc`'s three primitives — `ExecMon`, +`ExecMonWithInputBuff`, `ExecMgr` — and higher-level packages (`pkg/api/`, +`pkg/cephconfig/`, `pkg/user/`) construct JSON commands and parse JSON +responses. Auth is OAuth 2.0 (`ory/fosite`); persistent state lives in +Ceph via rados commands or the config-key store — no external DB. +Permission model mirrors upstream Ceph: a fixed set of scopes/permissions +in `pkg/user/system_roles.go`. **Don't invent new scopes.** Authorization +is per-handler (`user.HasPermissions` as the first statement) — there is +no central guard, so a missing call = an unprotected endpoint. ## Errors Use shared sentinels from `pkg/types/errors.go` (`ErrNotFound`, `ErrAlreadyExists`, `ErrInvalidArg`, `ErrAccessDenied`, `ErrUnauthenticated`, `ErrInternal`, `ErrNotImplemented`, -`ErrInvalidConfig`). Don't create package-local error variables when a -shared one exists. Compare with `errors.Is`, never `==`. RADOS-specific -sentinels live in the `cgo` / `!cgo` pair -`pkg/types/ceph_errors.go` / `ceph_errors_mock.go`. - -Errors from Ceph come back as JSON in stdout plus a status string. See -`rados.Svc.ExecMon` — non-empty `cmdStatus` is logged but doesn't itself -fail the call; check the response JSON for actual errors. +`ErrInvalidConfig`). Don't make package-local errors when a shared one +exists. Compare with `errors.Is`, never `==`. Handlers return sentinels; +the central `ErrorInterceptor` maps them to gRPC codes. RADOS-specific +sentinels are in the `cgo`/`!cgo` pair `pkg/types/ceph_errors.go` / +`ceph_errors_mock.go`. Ceph errors come back as JSON in stdout plus a +status string — non-empty `cmdStatus` from `ExecMon` is logged but does +not fail the call; check the response JSON for the real error. ## Parity vs API quality -Dashboard parity tests in `test/parity/` exist to keep ceph-api a -drop-in replacement for the dashboard's REST surface. They do **not** -dictate the gRPC type system. When the two collide, pick the well-typed -proto and absorb the wire-shape divergence in the matcher -(`test/parity/diff.go`) — not by regressing the proto and not by adding -repetitive per-endpoint ignores in `api_diff.yaml`. - -- Use `google.protobuf.Timestamp` for timestamps, not unix-seconds ints. - The matcher coerces RFC3339 ↔ unix-seconds within - `timestampSkewTolerance`. -- Use `int64` when the upstream C++ type is 64-bit (verify in - `third_party/ceph/`). protojson serializes int64 as a JSON string and - the matcher coerces int64-as-string ↔ JSON number. -- The matcher treats `null` on one side and absent on the other as - equivalent (protojson's `EmitUnpopulated` emits unset proto3-optional - fields as `null` while the dashboard's hand-rolled JSON omits them). - -New shape-class divergences belong in `coerceEqual` in -`test/parity/diff.go` with a unit test, not in `api_diff.yaml`. Reserve -`api_diff.yaml` for genuinely endpoint-specific divergences (a -particular field that's deliberately different from the dashboard). +Parity tests (`test/parity/`) keep ceph-api a drop-in replacement for the +dashboard's REST surface. They do **not** dictate the gRPC type system. +When the two collide, keep the well-typed proto and absorb the wire-shape +divergence in the matcher (`coerceEqual` in `test/parity/diff.go`) — not +by regressing the proto, not by piling per-endpoint ignores in +`api_diff.yaml`. The matcher already coerces, for free: RFC3339 ↔ +unix-seconds (within `timestampSkewTolerance`), int64-as-string ↔ number, +and `null` ↔ absent. So use `google.protobuf.Timestamp` for time, `int64` +where upstream C++ is 64-bit, and `json_name` for camelCase fields. New +shape-class divergences go in `coerceEqual` with a `diff_test.go` test; +reserve `api_diff.yaml` for genuinely endpoint-specific divergences. See +`test/parity/README.md`. + +## Code style + +- **Private by default.** Unexported unless used outside the package. +- **Interface naming:** capitalized interface (`Service`), lowercase impl + (`service`), constructor returns the interface. +- **Minimize scope:** declare variables right before first use. ## Comments -Default to **zero comments**. Only keep one when removing it would -leave a future reader unable to derive a non-obvious invariant, -workaround, or external constraint. Before finishing any edit, re-scan -every comment added; if you can't justify it under one of the three -tests below, delete it. - -**Banned:** -- History narration (`legacy`, `previously`, `used to`, `now uses`, - `added for X`). -- Internal task/session references (`tracked as #123`, `see TASKS.md - 2.1`, `Phase 2.3 summary`). -- Foreign-project name-drops (`from cesto`, `matches chorus pattern`). -- Restating well-named code or paraphrasing identifiers. -- Doc comments that just restate the function signature. - -**Keep if any of:** -1. The WHY is non-obvious from reading the surrounding code. -2. A future agent or human couldn't re-derive it without the comment. -3. It describes an external constraint — library contract, protocol - quirk, framework artifact, regulatory requirement. - -Examples that pass: `// fosite sets session.Subject via SetSubject -after Authenticate`, `// grpc-gateway emits {} for Empty proto -responses`, `//nolint:gosec // self-signed cert on localhost-only -listener`. +Default to **zero comments**. Keep one only when removing it would leave a +reader unable to derive a non-obvious invariant, workaround, or external +constraint. Re-scan every comment you add; if it fails all three keep-tests +below, delete it. + +**Banned:** history narration (`legacy`, `previously`, `now uses`); +internal task/session references (`tracked as #123`, `Phase 2.3`); +foreign-project name-drops; restating well-named code; doc comments that +restate the signature. + +**Keep if any of:** (1) the WHY is non-obvious from the surrounding code; +(2) a future reader couldn't re-derive it; (3) it states an external +constraint (library contract, protocol quirk, framework artifact). + +## Repo is self-contained + +Everything needed to work here lives in the repo: the Ceph source +(`third_party/ceph` submodule), skills (`.claude/skills/`), and agents +(`.claude/agents/`). Skills, agents, and docs must **not** reference paths +outside this repo — anyone can clone and work. + +**Do not use the agent memory system in this project.** Memory lives +per-machine in each user's home directory, so it's absent for other +contributors. Persist anything +durable to repo files instead: pipeline state in `tasks/`, conventions +and agent instructions in `.claude/` and this file. Don't read from or +write to memory here. diff --git a/tasks/phase-2.3-followup.md b/tasks/phase-2.3-followup.md deleted file mode 100644 index ef1a615..0000000 --- a/tasks/phase-2.3-followup.md +++ /dev/null @@ -1,59 +0,0 @@ -# Phase 2.3 follow-up — retire root `$` ignores in `test/parity/api_diff.yaml` - -Read project `CLAUDE.md` first. Don't `git commit` — user reviews and commits manually. - -## Goal - -Every `path: $` entry in `test/parity/api_diff.yaml` is body-shape debt -between ceph-api and the upstream Ceph dashboard. Retire each one by -fixing ceph-api to match the dashboard's wire shape. If that's not -feasible, replace with tightly-scoped per-field ignores. - -## Rules - -- An endpoint can be excluded from the dashboard pass only via - `/api/auth*` prefix or absent-from-dashboard-openapi. No manual - skip list — reintroducing one is a regression. -- Every recorded call must return 2xx on both backends; assert at - the call site with `require.True`. -- After every change: `make lint && make check`. Then `make e2e-test` - (docker / colima up on macOS). -- `make proto` after any `.proto` edit. - -## Open `path: $` ignores - -| Endpoint | Divergence | Fix | -|---|---|---| -| `POST /api/cluster/user`, `PUT /api/cluster/user` | dash returns status-string; ours returns Empty | change RPC return type; have the handler return the resource (or a `google.protobuf.StringValue` if matching dashboard's string body) | -| `POST /api/cluster/user/export` | cephx key is random per `auth add` so the two backends' exports differ only in the key | seed both creates with `import_data` carrying a fixed key, re-export | -| `POST /api/role`, `PUT /api/role/{name}` | dash returns the resource; ours Empty | change RPC return type to `Role`; read role back after the write | -| `POST /api/user`, `PUT /api/user/{username}` | dash returns the resource; ours Empty | change RPC return type to `User`; read user back after the write | -| `POST /api/user/{username}/change_password` | error-path fixture (admin lacks self-change context); error envelopes diverge | replace with positive fixture — create a test user, log in as it, change pw, expect 2xx | -| `POST /api/crush_rule` | dash returns the Rule; ours Empty | change RPC return type to `Rule`; read the rule back from `osd crush dump` | -| `GET /api/user` | list-length differs (dashboard caches user table at startup; ceph-api writes via `mgr/dashboard/accessdb_v2` aren't seen) | reload the dashboard's accessdb in `testenv` before the parity pass, or drop the list from parity in favor of a coverage-only ours-side test | - -## Per-field ignores worth closing - -- `GET /api/user/{username}` — dashboard's User module uses camelCase - (`lastUpdate`, `pwdUpdateRequired`, `pwdExpirationDate`); ours snake_case - via project-wide `UseProtoNames: true`. Add per-field `json_name` - annotations on the User proto so just these three fields emit - camelCase. The `name`/`email` ignores are both-null false positives - — remove them. -- `GET /api/crush_rule` and `GET /api/crush_rule/{name}` — int64 - protojson-as-string (consider int32 in proto if precision allows); - Step shape rewrite from `map entries` to typed - `{op, item, item_name, num, type}`. Heavier — split off if needed. - -## Optional plumbing - -`parity.Init` currently takes three file paths. Cleaner: take `[]byte` -per source so callers use `//go:embed` and the parity package never -touches the filesystem. Files stay where they are. - -## Done when - -- `test/parity/api_diff.yaml` has zero `path: $` entries (or each - remaining one has a non-trivial reason). -- `make full-gate` exits 0. -- Every parity test asserts 2xx at every call site. diff --git a/test/parity/README.md b/test/parity/README.md new file mode 100644 index 0000000..29d5619 --- /dev/null +++ b/test/parity/README.md @@ -0,0 +1,116 @@ +# Parity tests + +These tests keep ceph-api a **drop-in replacement** for the Ceph +dashboard's REST surface: they fire the same HTTP request at both the +real dashboard and ceph-api and assert the responses match. Read the +root `CLAUDE.md` "Parity vs API quality" section first — it governs how +divergences are resolved. + +## The contract (mechanical gate) + +The dashboard `openapi.yaml` is the source of truth. Two gates run in +`runSetup` (called by `TestMain`) after the suite (`test/setup_cgo_test.go`): + +- **`AssertGRPCMethodsRouted`** (`grpc.go`) — every gRPC method must have + an `api/http.yaml` route. Only `grpc.*` / `opentelemetry.*` infra + prefixes are exempt. +- **`AssertRoutesCovered`** (`inventory.go`) — every `http.yaml` route + must be exercised by a parity test. The **only** excluded prefix is + `/api/auth` (the bootstrap login already covers it and parity clients + can't dogfood their own auth flow). + +For a route, `r.Backends(call)` returns `[Dash, Ours]` if the route also +exists in the dashboard openapi, else `[Ours]` only. So a route is +diffed against the dashboard iff it is in **both** `http.yaml` and the +dashboard openapi. Endpoints absent from the dashboard openapi still need +a parity test (to satisfy coverage) but are only recorded on our side, no +diff. **There is no manual skip list — adding one is a regression.** + +## Files + +| File | Role | | +|---|---|---| +| `recorder.go` | Per-test harness: `Call`, `New(t)`, `DoRecord`/`Do`/`DoRecordAs`, request canonicalization, coverage map, `t.Cleanup` diff (`assertAll`). | **FRAMEWORK — do not edit** | +| `probes.go` | Authz probes: after each recorded `Ours` call, asserts 401 (no token) and 403 (no perms). | **FRAMEWORK — do not edit** | +| `inventory.go` | Loads `http.yaml` + dashboard openapi; shape matching; coverage gate. | **FRAMEWORK — do not edit** | +| `diff.go` | JSON comparator `Compare` + `coerceEqual` tolerances + JSONPath ignore matcher. | **FRAMEWORK — do not edit** | +| `api_diff.go` | Parses/validates `api_diff.yaml` (`path` + `reason` mandatory). | **FRAMEWORK — do not edit** | +| `client.go`, `grpc.go` | Auth'd HTTP client; gRPC-routed gate. | **FRAMEWORK — do not edit** | +| `api_diff.yaml` | Declared per-endpoint divergence ignores (data). | **editable (data only)** | +| `test/*_parity_test.go` | The scenarios. | **editable — add tests here** | + +A port's **only** allowed edits in this area are: a new +`test/_parity_test.go` scenario, and (rarely, justified) +`api_diff.yaml`. Never modify framework code to make a port pass — that +is how you defeat the gate, and the reviewers check for it. + +## What the matcher coerces for free (`coerceEqual` in `diff.go`) + +You do **not** need an `api_diff.yaml` entry for any of these: + +- **RFC3339 timestamp string ↔ unix-seconds number** (5s skew tolerance, + absorbs the wall-clock gap between the two sequential requests). +- **int64-as-JSON-string ↔ JSON number** (protojson emits int64 as a + string). +- **null ↔ absent** (protojson `EmitUnpopulated` emits unset optionals as + `null`; the dashboard omits them). +- **empty body ↔ `{}` ↔ `null`** (a dashboard 204 pairs with our + `Empty`-proto `{}`). + +Only status **class** (`/100`) is compared, not exact codes. What you +must still make match: differing scalar values, non-coercible type +mismatches, array length, missing/extra non-null keys, and field-name +casing (snake vs camel — fix with proto `json_name`, not a yaml ignore). + +## Adding a scenario + +1. Add `Test_Parity__` to `test/_parity_test.go` + (`//go:build cgo`, `package test`). +2. `r := parity.New(t)`; build `parity.Call{Method, Path, Accept, Body}`. + `Method`+`Path` must exactly match an `http.yaml` rule. Set `Accept` + to the dashboard's per-route versioned media type (else dashboard + returns 415). +3. Drive both backends and assert 2xx at every recorded call: + + ```go + func Test_Parity_CrushRule_List(t *testing.T) { + r := parity.New(t) + call := parity.Call{Method: "GET", Path: "/api/crush_rule", Accept: crushRuleReadAccept} + for _, b := range r.Backends(call) { + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: status %d", b, resp.StatusCode) + } + } + ``` + +4. **Setup/cleanup so scenarios don't interfere:** use unique fixture + names; do prep/cleanup with `r.Do` (not `DoRecord` — those aren't + recorded/diffed); register `t.Cleanup(func(){ r.Do(parity.Ours, del) })`. + For CRUD, `Backends` runs `Dash` first so its create+delete clean up + before the `Ours` pass. +5. A specific-user endpoint (e.g. self `change_password`): `parity.Login` + then `r.DoRecordAs(b, call, userClient)`. +6. Invariants: recording the same endpoint twice in one test fatals + (split tests). The Dash and Ours requests for an endpoint must be + byte-identical except Authorization/Content-Length. + +## api_diff.yaml policy + +Entry schema — keyed by `" "`, value a list of +`{path, reason}` (both mandatory). `path` is a JSONPath subset: `$` root, +`.` descent, `*` single wildcard segment; each pattern must equal the +path length (no recursive descent). + +```yaml +"GET /api/crush_rule/{name}": + - path: $.some_field + reason: dashboard returns X here; ours returns Y because +``` + +`path: $` ignores the **whole body** (and suppresses presence/status +checks) — pure debt, tracked for retirement. Policy: minimize entries; +only for genuinely endpoint-specific divergences; never for a shape-class +`coerceEqual` already handles; **prefer fixing the proto (Timestamp, +int64, `json_name`) or extending `coerceEqual` (with a `diff_test.go` +test) over a yaml ignore.** The proto type system wins over parity; +absorb wire-shape divergence in the matcher, not by regressing the proto. From eb0f756f8eec2193cc8fabe076f19401816c0bce Mon Sep 17 00:00:00 2001 From: Artem Torubarov Date: Sun, 31 May 2026 12:45:46 +0200 Subject: [PATCH 10/10] add tasks Signed-off-by: Artem Torubarov --- .claude/agents/endpoint-implementer.md | 20 +- .claude/agents/endpoint-investigator.md | 19 +- .claude/commands/port-endpoint.md | 16 +- tasks/log.md | 0 tasks/tasks.md | 398 ++++++++++++++++++++++++ 5 files changed, 447 insertions(+), 6 deletions(-) create mode 100644 tasks/log.md create mode 100644 tasks/tasks.md diff --git a/.claude/agents/endpoint-implementer.md b/.claude/agents/endpoint-implementer.md index 25ce683..91cc801 100644 --- a/.claude/agents/endpoint-implementer.md +++ b/.claude/agents/endpoint-implementer.md @@ -38,7 +38,9 @@ code, correct §Requirements in place, and note the correction in ## Generic rules - FOLLOW PATTERNS IN EXISTING CODE AND IMPLEMENT BY ANALOGY. Porting an endpoint is a typical task; the repo already contains ported endpoints. - HARD STOP if the new endpoint's implementation needs a novel approach (e.g. all existing endpoints just send json mon/mgr commands over rados, but the new one needs to reimplement a lot of ceph/mgr logic, or add parsing for the rados binary protocol, or similar). Summarise the skip reason in the task file along with useful details to decide/research a possible impl in a separate interactive session with the user, and return with a short message that the task has to be skipped to investigate. +- HARD STOP if the ceph test container or other e2e env needs adjustment to test the new API. - Follow go code/test style best practices from CLAUDE.md and comment convention +- Don't commit. ## Implementation flow (follow anatomy.md's checklist) @@ -89,10 +91,26 @@ You can be resumed with a prompt to address review feedback. Read the task file' Review issues are an md list with checkboxes and issue id `M*`/`D*`. M* are mechanical; false positives are not expected but still possible. D* are deep review, finding bugs, performance and security issues — but be critical. If an issue is valid, fix it and mark the checkbox done `[x]`. If it is a false positive, skip it — leave the checkbox unmarked and add a reason why it was dismissed. -## Novel-logic HARD STOP +## When to HARD STOP If the handler needs real Go logic / a service layer (more than send-command-parse-JSON) with **no existing analogue** in the repo: write a clear, self-contained problem statement and your solution thoughts in the task file's §Skip reason, then STOP and report "skipped". Do not invent an architecture — that's an interactive design decision. +Same rule if the implemented endpoint cannot be run against the e2e ceph-test container without adjustments to the container outside this repo. + +## After implementation + +After the initial implementation, if the provided §Requirements turned out +incorrect or incomplete (the dashboard or a gate disagreed with them, so you +had to correct them), APPEND a note to `tasks/log.md` so the investigator +prompt can be tuned, in this format: +```md + +## Implementer issues for {endpoint name} + +what was wrong/missing in Requirements (or other repo prompt/instruction tensions), with file references + +``` +Don't log anything if Requirements were accurate and you faced no noticeable tensions. diff --git a/.claude/agents/endpoint-investigator.md b/.claude/agents/endpoint-investigator.md index e48fb34..a3524dd 100644 --- a/.claude/agents/endpoint-investigator.md +++ b/.claude/agents/endpoint-investigator.md @@ -4,8 +4,9 @@ description: Researches one Ceph dashboard endpoint from upstream source and rec --- You research **one** dashboard REST endpoint so the implementer can port -it without further investigation. You write **only** to the task file you -are given (`tasks/{method}-{path}.md`). You do not touch source code. +it without further investigation. You write to the task file you are +given (`tasks/{method}-{path}.md`); after investigation you may also +append to `tasks/log.md`. You do not touch source code. ## Input You will receive a task file corresponding to the target dashboard endpoint to investigate: @@ -71,8 +72,22 @@ So concrete shapes have to be captured by reading source (not always possible be the proto accounts for them. The parity matcher coerces some wire differences for free — see the parity README — so call out only the divergences that need proto/handler attention. + HARD STOP with task skip if the endpoint cannot be verified against the ceph-test container without image modification. Fill the task file's §Requirements (and add a §Skip reason if applicable) concisely. Cite `file:line` for every non-obvious claim. Put all under the ## Requirements section, using ### subsections if needed. Your final message: a 2–4 line summary of scope/perm, command, service decision, and whether it's skipped (with reason) or ready to implement. + +## After investigation + +After writing Requirements to the task file, inspect your session context and APPEND info to `tasks/log.md` +if any repo prompts/files/instructions contained inconsistencies, contradictions, or caused tensions in your flow, in the following format: +```md + +## Investigator issues for {endpoint name} + +list of issues with file references + +``` +Don't log anything if you didn't face noticeable tensions. diff --git a/.claude/commands/port-endpoint.md b/.claude/commands/port-endpoint.md index 29cabe6..e741989 100644 --- a/.claude/commands/port-endpoint.md +++ b/.claude/commands/port-endpoint.md @@ -27,7 +27,7 @@ Each task corresponds to a Ceph dashboard API endpoint to migrate into this proj - **You edit nothing outside `tasks/`.** Forward any fix to the implementer subagent. - **You don't research, explore, or read source code.** Investigation, implementation, and review all happen in subagents with fresh context. Your only reads are `tasks/tasks.md`, the current task file, and subagent responses; your only actions are `git`, `make` gates, and the mechanical task-file checks in the pipeline. Don't open `api/`, `pkg/`, `test/`, or the Ceph submodule yourself — keep your context lean. - In `tasks/tasks.md` you may **only** check a line `[x]` or reorder the - list (e.g. move a skipped line to the end). No other edits. + list (e.g. move a skipped line to the end). No other edits. For skip, full group of endpoints must be skipped. - Per-endpoint files `tasks/{method}-{path}.md` are yours to create (from the stub in step 1) and update. - **Never commit or push to `main`** (nor any protected branch). Only the @@ -126,7 +126,17 @@ For each target endpoint: ## Logging for later tuning -Keep per-endpoint logging in the task file lightweight but useful for +Keep per-endpoint logging in the `tasks/log.md` file lightweight but useful for improving these prompts later: number of implement/fix iterations, any gate that went red and why, review findings that were false positives, -and any skip (with its reason). Don't add heavy instrumentation. +and any skip (with its reason). Don't add heavy instrumentation. Also note any tensions/inconsistencies noticed in the pipeline. +Always only append a single section to the log file: +```md + +## Orchestrator note for {endpoint name} + +content of the issue or your observation. + +``` + + diff --git a/tasks/log.md b/tasks/log.md new file mode 100644 index 0000000..e69de29 diff --git a/tasks/tasks.md b/tasks/tasks.md new file mode 100644 index 0000000..ba5fc25 --- /dev/null +++ b/tasks/tasks.md @@ -0,0 +1,398 @@ +# Endpoints to migrate + +Grouped by resource (create/POST first in each group). Tiers ordered by +popularity + similarity to already-implemented endpoints (mon/mgr commands +over rados — same as cluster, crush_rule, status, users, roles). + +## Tier 1 — popular Ceph, mon/mgr commands + +### pool +- [ ] POST /api/pool +- [ ] GET /api/pool +- [ ] GET /api/pool/{pool_name} +- [ ] PUT /api/pool/{pool_name} +- [ ] DELETE /api/pool/{pool_name} +- [ ] GET /api/pool/{pool_name}/configuration + +### erasure_code_profile +- [ ] POST /api/erasure_code_profile +- [ ] GET /api/erasure_code_profile +- [ ] GET /api/erasure_code_profile/{name} +- [ ] DELETE /api/erasure_code_profile/{name} + +### osd +- [ ] POST /api/osd +- [ ] GET /api/osd +- [ ] GET /api/osd/{svc_id} +- [ ] PUT /api/osd/{svc_id} +- [ ] DELETE /api/osd/{svc_id} +- [ ] POST /api/osd/{svc_id}/destroy +- [ ] POST /api/osd/{svc_id}/purge +- [ ] POST /api/osd/{svc_id}/reweight +- [ ] POST /api/osd/{svc_id}/scrub +- [ ] PUT /api/osd/{svc_id}/mark +- [ ] GET /api/osd/{svc_id}/devices +- [ ] GET /api/osd/{svc_id}/histogram +- [ ] GET /api/osd/{svc_id}/smart +- [ ] GET /api/osd/flags +- [ ] PUT /api/osd/flags +- [ ] GET /api/osd/flags/individual +- [ ] PUT /api/osd/flags/individual +- [ ] GET /api/osd/safe_to_delete +- [ ] GET /api/osd/safe_to_destroy +- [ ] GET /api/osd/settings + +### cluster_conf +- [ ] POST /api/cluster_conf +- [ ] GET /api/cluster_conf +- [ ] GET /api/cluster_conf/{name} +- [ ] GET /api/cluster_conf/filter +- [ ] PUT /api/cluster_conf +- [ ] DELETE /api/cluster_conf/{name} + +### mgr/module +- [ ] GET /api/mgr/module +- [ ] GET /api/mgr/module/{module_name} +- [ ] PUT /api/mgr/module/{module_name} +- [ ] GET /api/mgr/module/{module_name}/options +- [ ] POST /api/mgr/module/{module_name}/enable +- [ ] POST /api/mgr/module/{module_name}/disable + +### monitor +- [ ] GET /api/monitor + +### health +- [ ] GET /api/health/minimal +- [ ] GET /api/health/full +- [ ] GET /api/health/get_cluster_capacity +- [ ] GET /api/health/get_cluster_fsid +- [ ] GET /api/health/get_telemetry_status + +### summary +- [ ] GET /api/summary + +### logs +- [ ] GET /api/logs/all + +## Tier 2 — CephFS (mgr `fs`/volumes commands — same rados primitives) + +### cephfs +- [ ] POST /api/cephfs +- [ ] GET /api/cephfs +- [ ] GET /api/cephfs/{fs_id} +- [ ] PUT /api/cephfs/auth +- [ ] PUT /api/cephfs/rename +- [ ] DELETE /api/cephfs/remove/{name} +- [ ] GET /api/cephfs/{fs_id}/clients +- [ ] DELETE /api/cephfs/{fs_id}/client/{client_id} +- [ ] GET /api/cephfs/{fs_id}/get_root_directory +- [ ] GET /api/cephfs/{fs_id}/ls_dir +- [ ] GET /api/cephfs/{fs_id}/mds_counters +- [ ] GET /api/cephfs/{fs_id}/quota +- [ ] PUT /api/cephfs/{fs_id}/quota +- [ ] PUT /api/cephfs/{fs_id}/rename-path +- [ ] GET /api/cephfs/{fs_id}/statfs +- [ ] POST /api/cephfs/{fs_id}/snapshot +- [ ] DELETE /api/cephfs/{fs_id}/snapshot +- [ ] POST /api/cephfs/{fs_id}/tree +- [ ] DELETE /api/cephfs/{fs_id}/tree +- [ ] DELETE /api/cephfs/{fs_id}/unlink +- [ ] POST /api/cephfs/{fs_id}/write_to_file + +### cephfs/subvolume/group +- [ ] POST /api/cephfs/subvolume/group +- [ ] GET /api/cephfs/subvolume/group/{vol_name} +- [ ] PUT /api/cephfs/subvolume/group/{vol_name} +- [ ] DELETE /api/cephfs/subvolume/group/{vol_name} +- [ ] GET /api/cephfs/subvolume/group/{vol_name}/info + +### cephfs/subvolume +- [ ] POST /api/cephfs/subvolume +- [ ] GET /api/cephfs/subvolume/{vol_name} +- [ ] PUT /api/cephfs/subvolume/{vol_name} +- [ ] DELETE /api/cephfs/subvolume/{vol_name} +- [ ] GET /api/cephfs/subvolume/{vol_name}/exists +- [ ] GET /api/cephfs/subvolume/{vol_name}/info + +### cephfs/subvolume/snapshot +- [ ] POST /api/cephfs/subvolume/snapshot +- [ ] GET /api/cephfs/subvolume/snapshot/{vol_name}/{subvol_name} +- [ ] DELETE /api/cephfs/subvolume/snapshot/{vol_name}/{subvol_name} +- [ ] GET /api/cephfs/subvolume/snapshot/{vol_name}/{subvol_name}/info +- [ ] POST /api/cephfs/subvolume/snapshot/clone + +### cephfs/snapshot/schedule +- [ ] POST /api/cephfs/snapshot/schedule +- [ ] GET /api/cephfs/snapshot/schedule/{fs} +- [ ] PUT /api/cephfs/snapshot/schedule/{fs}/{path} +- [ ] POST /api/cephfs/snapshot/schedule/{fs}/{path}/activate +- [ ] POST /api/cephfs/snapshot/schedule/{fs}/{path}/deactivate +- [ ] DELETE /api/cephfs/snapshot/schedule/{fs}/{path}/delete_snapshot + +## Tier 3 — RBD / block (librbd) + +### block/image +- [ ] POST /api/block/image +- [ ] GET /api/block/image +- [ ] GET /api/block/image/{image_spec} +- [ ] PUT /api/block/image/{image_spec} +- [ ] DELETE /api/block/image/{image_spec} +- [ ] GET /api/block/image/default_features +- [ ] GET /api/block/image/clone_format_version +- [ ] POST /api/block/image/{image_spec}/copy +- [ ] POST /api/block/image/{image_spec}/flatten +- [ ] POST /api/block/image/{image_spec}/move_trash + +### block/image/snap +- [ ] POST /api/block/image/{image_spec}/snap +- [ ] PUT /api/block/image/{image_spec}/snap/{snapshot_name} +- [ ] DELETE /api/block/image/{image_spec}/snap/{snapshot_name} +- [ ] POST /api/block/image/{image_spec}/snap/{snapshot_name}/clone +- [ ] POST /api/block/image/{image_spec}/snap/{snapshot_name}/rollback + +### block/image/trash +- [ ] GET /api/block/image/trash +- [ ] POST /api/block/image/trash/purge +- [ ] DELETE /api/block/image/trash/{image_id_spec} +- [ ] POST /api/block/image/trash/{image_id_spec}/restore + +### block/pool/namespace +- [ ] POST /api/block/pool/{pool_name}/namespace +- [ ] GET /api/block/pool/{pool_name}/namespace +- [ ] DELETE /api/block/pool/{pool_name}/namespace/{namespace} + +### block/mirroring +- [ ] GET /api/block/mirroring/summary +- [ ] GET /api/block/mirroring/site_name +- [ ] PUT /api/block/mirroring/site_name +- [ ] GET /api/block/mirroring/pool/{pool_name} +- [ ] PUT /api/block/mirroring/pool/{pool_name} +- [ ] POST /api/block/mirroring/pool/{pool_name}/bootstrap/peer +- [ ] POST /api/block/mirroring/pool/{pool_name}/bootstrap/token +- [ ] POST /api/block/mirroring/pool/{pool_name}/peer +- [ ] GET /api/block/mirroring/pool/{pool_name}/peer +- [ ] GET /api/block/mirroring/pool/{pool_name}/peer/{peer_uuid} +- [ ] PUT /api/block/mirroring/pool/{pool_name}/peer/{peer_uuid} +- [ ] DELETE /api/block/mirroring/pool/{pool_name}/peer/{peer_uuid} + +## Tier 4 — RGW (admin-ops HTTP API) + +### rgw/bucket +- [ ] POST /api/rgw/bucket +- [ ] GET /api/rgw/bucket +- [ ] GET /api/rgw/bucket/{bucket} +- [ ] PUT /api/rgw/bucket/{bucket} +- [ ] DELETE /api/rgw/bucket/{bucket} +- [ ] GET /api/rgw/bucket/getEncryption +- [ ] GET /api/rgw/bucket/getEncryptionConfig +- [ ] PUT /api/rgw/bucket/setEncryptionConfig +- [ ] DELETE /api/rgw/bucket/deleteEncryption + +### rgw/user +- [ ] POST /api/rgw/user +- [ ] GET /api/rgw/user +- [ ] GET /api/rgw/user/{uid} +- [ ] PUT /api/rgw/user/{uid} +- [ ] DELETE /api/rgw/user/{uid} +- [ ] GET /api/rgw/user/get_emails +- [ ] POST /api/rgw/user/{uid}/capability +- [ ] DELETE /api/rgw/user/{uid}/capability +- [ ] POST /api/rgw/user/{uid}/key +- [ ] DELETE /api/rgw/user/{uid}/key +- [ ] GET /api/rgw/user/{uid}/quota +- [ ] PUT /api/rgw/user/{uid}/quota +- [ ] POST /api/rgw/user/{uid}/subuser +- [ ] DELETE /api/rgw/user/{uid}/subuser/{subuser} + +### rgw/daemon +- [ ] GET /api/rgw/daemon +- [ ] GET /api/rgw/daemon/{svc_id} +- [ ] PUT /api/rgw/daemon/set_multisite_config + +### rgw/site +- [ ] GET /api/rgw/site + +### rgw/realm +- [ ] POST /api/rgw/realm +- [ ] GET /api/rgw/realm +- [ ] GET /api/rgw/realm/{realm_name} +- [ ] PUT /api/rgw/realm/{realm_name} +- [ ] DELETE /api/rgw/realm/{realm_name} +- [ ] GET /api/rgw/realm/get_all_realms_info +- [ ] GET /api/rgw/realm/get_realm_tokens +- [ ] POST /api/rgw/realm/import_realm_token + +### rgw/zonegroup +- [ ] POST /api/rgw/zonegroup +- [ ] GET /api/rgw/zonegroup +- [ ] GET /api/rgw/zonegroup/{zonegroup_name} +- [ ] PUT /api/rgw/zonegroup/{zonegroup_name} +- [ ] DELETE /api/rgw/zonegroup/{zonegroup_name} +- [ ] GET /api/rgw/zonegroup/get_all_zonegroups_info + +### rgw/zone +- [ ] POST /api/rgw/zone +- [ ] GET /api/rgw/zone +- [ ] GET /api/rgw/zone/{zone_name} +- [ ] PUT /api/rgw/zone/{zone_name} +- [ ] DELETE /api/rgw/zone/{zone_name} +- [ ] PUT /api/rgw/zone/create_system_user +- [ ] GET /api/rgw/zone/get_all_zones_info +- [ ] GET /api/rgw/zone/get_pool_names +- [ ] GET /api/rgw/zone/get_user_list + +### rgw/roles +- [ ] POST /api/rgw/roles +- [ ] GET /api/rgw/roles +- [ ] PUT /api/rgw/roles +- [ ] DELETE /api/rgw/roles/{role_name} + +### rgw/multisite +- [ ] GET /api/rgw/multisite/sync_status +- [ ] GET /api/rgw/multisite/sync-policy +- [ ] POST /api/rgw/multisite/sync-policy-group +- [ ] GET /api/rgw/multisite/sync-policy-group/{group_id} +- [ ] PUT /api/rgw/multisite/sync-policy-group +- [ ] DELETE /api/rgw/multisite/sync-policy-group/{group_id} +- [ ] PUT /api/rgw/multisite/sync-flow +- [ ] DELETE /api/rgw/multisite/sync-flow/{flow_id}/{flow_type}/{group_id} +- [ ] PUT /api/rgw/multisite/sync-pipe +- [ ] DELETE /api/rgw/multisite/sync-pipe/{group_id}/{pipe_id} + +## Tier 5 — orchestrator / cephadm (needs orchestrator backend) + +### host +- [ ] POST /api/host +- [ ] GET /api/host +- [ ] GET /api/host/{hostname} +- [ ] PUT /api/host/{hostname} +- [ ] DELETE /api/host/{hostname} +- [ ] GET /api/host/{hostname}/daemons +- [ ] GET /api/host/{hostname}/devices +- [ ] GET /api/host/{hostname}/inventory +- [ ] GET /api/host/{hostname}/smart +- [ ] POST /api/host/{hostname}/identify_device + +### service +- [ ] POST /api/service +- [ ] GET /api/service +- [ ] GET /api/service/{service_name} +- [ ] PUT /api/service/{service_name} +- [ ] DELETE /api/service/{service_name} +- [ ] GET /api/service/{service_name}/daemons +- [ ] GET /api/service/known_types + +### daemon +- [ ] GET /api/daemon +- [ ] PUT /api/daemon/{daemon_name} + +### cluster/upgrade +- [ ] POST /api/cluster/upgrade/start +- [ ] GET /api/cluster/upgrade +- [ ] GET /api/cluster/upgrade/status +- [ ] PUT /api/cluster/upgrade/pause +- [ ] PUT /api/cluster/upgrade/resume +- [ ] PUT /api/cluster/upgrade/stop + +## Tier 6 — monitoring (mgr perf data / external Prometheus) + +### perf_counters +- [ ] GET /api/perf_counters +- [ ] GET /api/perf_counters/mds/{service_id} +- [ ] GET /api/perf_counters/mon/{service_id} +- [ ] GET /api/perf_counters/mgr/{service_id} +- [ ] GET /api/perf_counters/osd/{service_id} +- [ ] GET /api/perf_counters/rgw/{service_id} +- [ ] GET /api/perf_counters/rbd-mirror/{service_id} +- [ ] GET /api/perf_counters/tcmu-runner/{service_id} + +### prometheus +- [ ] GET /api/prometheus +- [ ] GET /api/prometheus/data +- [ ] GET /api/prometheus/rules +- [ ] GET /api/prometheus/alertgroup +- [ ] GET /api/prometheus/notifications +- [ ] GET /api/prometheus/silences +- [ ] POST /api/prometheus/silence +- [ ] DELETE /api/prometheus/silence/{s_id} + +## Tier 7 — niche Ceph services (gateway/module backends) + +### nfs-ganesha +- [ ] POST /api/nfs-ganesha/export +- [ ] GET /api/nfs-ganesha/export +- [ ] GET /api/nfs-ganesha/export/{cluster_id}/{export_id} +- [ ] PUT /api/nfs-ganesha/export/{cluster_id}/{export_id} +- [ ] DELETE /api/nfs-ganesha/export/{cluster_id}/{export_id} +- [ ] GET /api/nfs-ganesha/cluster + +### iscsi +- [ ] POST /api/iscsi/target +- [ ] GET /api/iscsi/target +- [ ] GET /api/iscsi/target/{target_iqn} +- [ ] PUT /api/iscsi/target/{target_iqn} +- [ ] DELETE /api/iscsi/target/{target_iqn} +- [ ] GET /api/iscsi/discoveryauth +- [ ] PUT /api/iscsi/discoveryauth + +### nvmeof +- [ ] POST /api/nvmeof/subsystem +- [ ] GET /api/nvmeof/subsystem +- [ ] GET /api/nvmeof/subsystem/{nqn} +- [ ] DELETE /api/nvmeof/subsystem/{nqn} +- [ ] GET /api/nvmeof/subsystem/{nqn}/connection +- [ ] POST /api/nvmeof/subsystem/{nqn}/host +- [ ] GET /api/nvmeof/subsystem/{nqn}/host +- [ ] DELETE /api/nvmeof/subsystem/{nqn}/host/{host_nqn} +- [ ] POST /api/nvmeof/subsystem/{nqn}/listener +- [ ] GET /api/nvmeof/subsystem/{nqn}/listener +- [ ] DELETE /api/nvmeof/subsystem/{nqn}/listener/{host_name}/{traddr} +- [ ] POST /api/nvmeof/subsystem/{nqn}/namespace +- [ ] GET /api/nvmeof/subsystem/{nqn}/namespace +- [ ] GET /api/nvmeof/subsystem/{nqn}/namespace/{nsid} +- [ ] PATCH /api/nvmeof/subsystem/{nqn}/namespace/{nsid} +- [ ] DELETE /api/nvmeof/subsystem/{nqn}/namespace/{nsid} +- [ ] GET /api/nvmeof/subsystem/{nqn}/namespace/{nsid}/io_stats +- [ ] GET /api/nvmeof/gateway +- [ ] GET /api/nvmeof/gateway/group +- [ ] GET /api/nvmeof/gateway/version +- [ ] GET /api/nvmeof/gateway/log_level +- [ ] PUT /api/nvmeof/gateway/log_level +- [ ] GET /api/nvmeof/spdk/log_level +- [ ] PUT /api/nvmeof/spdk/log_level +- [ ] PUT /api/nvmeof/spdk/log_level/disable + +## Tier 8 — misc dashboard-only (settings, telemetry, UI helpers) + +### settings +- [ ] GET /api/settings +- [ ] GET /api/settings/{name} +- [ ] PUT /api/settings +- [ ] PUT /api/settings/{name} +- [ ] DELETE /api/settings/{name} + +### telemetry +- [ ] PUT /api/telemetry +- [ ] GET /api/telemetry/report + +### task +- [ ] GET /api/task + +### feature_toggles +- [ ] GET /api/feature_toggles + +### grafana +- [ ] POST /api/grafana/dashboards +- [ ] GET /api/grafana/url +- [ ] GET /api/grafana/validation/{params} + +### feedback +- [ ] POST /api/feedback +- [ ] GET /api/feedback +- [ ] POST /api/feedback/api_key +- [ ] GET /api/feedback/api_key +- [ ] DELETE /api/feedback/api_key + +### misc (leftover single endpoints on already-implemented resources) +- [ ] POST /api/user/validate_password +- [ ] POST /api/role/{name}/clone