diff --git a/.claude/agents/endpoint-implementer.md b/.claude/agents/endpoint-implementer.md new file mode 100644 index 0000000..91cc801 --- /dev/null +++ b/.claude/agents/endpoint-implementer.md @@ -0,0 +1,116 @@ +--- +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. +- 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) + + +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. + +## 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 new file mode 100644 index 0000000..a3524dd --- /dev/null +++ b/.claude/agents/endpoint-investigator.md @@ -0,0 +1,93 @@ +--- +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 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: + ```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. + 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/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..e741989 --- /dev/null +++ b/.claude/commands/port-endpoint.md @@ -0,0 +1,142 @@ +--- +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. 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 + 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 `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. 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/.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/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/.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 0d22192..55617a7 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -14,9 +14,28 @@ jobs: test: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v4 - - uses: KengoTODA/actions-setup-docker-compose@v1 + - uses: actions/checkout@v6 + - name: Set up Go + uses: actions/setup-go@v6 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..39f3de1 --- /dev/null +++ b/.golangci.yml @@ -0,0 +1,53 @@ +version: "2" +run: + go: "1.26" + 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..549d423 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,130 @@ +# CLAUDE.md + +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/`, `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` — 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 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 + +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**. 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/Dockerfile b/Dockerfile index bf5ad6e..a1a81ee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Build the manager binary -FROM golang:1.21 AS builder +FROM golang:1.26 AS builder ARG TARGETOS ARG TARGETARCH ARG GIT_COMMIT='not set' diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a9573f4 --- /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 ./... + +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/TASKS.md b/TASKS.md new file mode 100644 index 0000000..83cf190 --- /dev/null +++ b/TASKS.md @@ -0,0 +1,476 @@ +# 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 + ``` + +## 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. + +- [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 + 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. + +- [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. + +--- + +## 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`. + + **`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), + 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/buf.gen.yaml b/api/buf.gen.yaml index 96ca4e3..b3046bc 100644 --- a/api/buf.gen.yaml +++ b/api/buf.gen.yaml @@ -1,21 +1,22 @@ -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 - allow_merge=true - merge_file_name=ceph-api + - json_names_for_fields=false diff --git a/api/cluster.proto b/api/cluster.proto index e66082a..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); @@ -43,20 +43,23 @@ 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"]; + string import_data = 3 [json_name = "import_data"]; } message ExportClusterUserReq{ @@ -69,7 +72,12 @@ message DeleteClusterUserReq{ message ExportClusterUserResp{ // User key and capabilities in Ceph config file format - bytes data = 1; + string data = 1; +} + +message ClusterUserStatusResp{ + // Dashboard-compatible status string, e.g. "Successfully created user 'client.x'". + string status = 1; } // Config Param Search 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/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..da148ae 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 ( @@ -113,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{10, 0} } type SearchConfigRequest_SortOrder int32 @@ -159,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{10, 1} } type ConfigParam_ServiceType int32 @@ -235,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{11, 0} } type ConfigParam_ConfigLevel int32 @@ -284,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{11, 1} } type ConfigParam_ParamType int32 @@ -357,24 +358,21 @@ 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{11, 2} } 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) @@ -520,24 +512,73 @@ func (x *ClusterUser) GetKey() string { return "" } -type UpdateClusterUserReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache +type ClusterUserCap struct { + state protoimpl.MessageState `protogen:"open.v1"` + // 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 +} - // 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"` - // entity, e.g: "client.admin" - UserEntity string `protobuf:"bytes,2,opt,name=user_entity,proto3" json:"user_entity,omitempty"` +func (x *ClusterUserCap) Reset() { + *x = ClusterUserCap{} + mi := &file_cluster_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } -func (x *UpdateClusterUserReq) Reset() { - *x = UpdateClusterUserReq{} - if protoimpl.UnsafeEnabled { - mi := &file_cluster_proto_msgTypes[3] +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)) - ms.StoreMessageInfo(mi) + 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[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *UpdateClusterUserReq) String() string { @@ -547,8 +588,8 @@ func (x *UpdateClusterUserReq) String() string { func (*UpdateClusterUserReq) ProtoMessage() {} func (x *UpdateClusterUserReq) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_cluster_proto_msgTypes[4] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -560,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 } @@ -578,25 +619,20 @@ func (x *UpdateClusterUserReq) GetUserEntity() string { } type CreateClusterUserReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // 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"` - // 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"` + ImportData string `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[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *CreateClusterUserReq) String() string { @@ -606,8 +642,8 @@ func (x *CreateClusterUserReq) String() string { func (*CreateClusterUserReq) ProtoMessage() {} func (x *CreateClusterUserReq) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_cluster_proto_msgTypes[5] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -619,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 } @@ -636,28 +672,25 @@ 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 { - 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[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExportClusterUserReq) String() string { @@ -667,8 +700,8 @@ func (x *ExportClusterUserReq) String() string { func (*ExportClusterUserReq) ProtoMessage() {} func (x *ExportClusterUserReq) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_cluster_proto_msgTypes[6] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -680,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 { @@ -691,20 +724,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[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *DeleteClusterUserReq) String() string { @@ -714,8 +744,8 @@ func (x *DeleteClusterUserReq) String() string { func (*DeleteClusterUserReq) ProtoMessage() {} func (x *DeleteClusterUserReq) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_cluster_proto_msgTypes[7] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -727,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 { @@ -738,21 +768,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 string `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[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ExportClusterUserResp) String() string { @@ -762,8 +789,8 @@ func (x *ExportClusterUserResp) String() string { func (*ExportClusterUserResp) ProtoMessage() {} func (x *ExportClusterUserResp) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_cluster_proto_msgTypes[8] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -775,38 +802,80 @@ 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 "" +} + +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 - 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[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SearchConfigRequest) String() string { @@ -816,8 +885,8 @@ func (x *SearchConfigRequest) String() string { func (*SearchConfigRequest) ProtoMessage() {} func (x *SearchConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_cluster_proto_msgTypes[10] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -829,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{8} + return file_cluster_proto_rawDescGZIP(), []int{10} } func (x *SearchConfigRequest) GetService() ConfigParam_ServiceType { @@ -882,10 +951,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 +967,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[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *ConfigParam) String() string { @@ -919,8 +985,8 @@ func (x *ConfigParam) String() string { func (*ConfigParam) ProtoMessage() {} func (x *ConfigParam) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_cluster_proto_msgTypes[11] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -932,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{9} + return file_cluster_proto_rawDescGZIP(), []int{11} } func (x *ConfigParam) GetName() string { @@ -1041,20 +1107,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[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) } func (x *SearchConfigResponse) String() string { @@ -1064,8 +1127,8 @@ func (x *SearchConfigResponse) String() string { func (*SearchConfigResponse) ProtoMessage() {} func (x *SearchConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_cluster_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { + mi := &file_cluster_proto_msgTypes[12] + if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { ms.StoreMessageInfo(mi) @@ -1077,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{10} + return file_cluster_proto_rawDescGZIP(), []int{12} } func (x *SearchConfigResponse) GetParams() []*ConfigParam { @@ -1089,216 +1152,150 @@ 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\":\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(\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\"/\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" + + "\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\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\x12E\n" + + "\n" + + "UpdateUser\x12\x1a.ceph.UpdateClusterUserReq\x1a\x1b.ceph.ClusterUserStatusResp\x12E\n" + + "\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" + + "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 @@ -1308,25 +1305,25 @@ var file_cluster_proto_goTypes = []interface{}{ (*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 + (*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 + (*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 - 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 + 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 4, // 6: ceph.SearchConfigRequest.level:type_name -> ceph.ConfigParam.ConfigLevel 1, // 7: ceph.SearchConfigRequest.sort:type_name -> ceph.SearchConfigRequest.SortField @@ -1335,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 - 15, // 13: ceph.SearchConfigResponse.params:type_name -> ceph.ConfigParam + 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 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 + 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 + 16, // 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 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 + 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 20, // 28: ceph.Cluster.DeleteUser:output_type -> google.protobuf.Empty - 16, // 29: ceph.Cluster.SearchConfig:output_type -> ceph.SearchConfigResponse + 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 @@ -1364,147 +1361,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[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: 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 +1379,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..2daad1f 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) } @@ -320,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()) @@ -340,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()) @@ -508,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()) @@ -525,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()) @@ -586,7 +610,26 @@ 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_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 { @@ -594,7 +637,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..6cbd497 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 @@ -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) @@ -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") +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) { - return nil, status.Errorf(codes.Unimplemented, "method CreateUser not implemented") +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) { - 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..58e4c4e 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 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 *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 - - 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) @@ -113,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 } @@ -127,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 } @@ -163,20 +161,21 @@ func (x *Rule) GetSteps() []*Step { } type Step struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + 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 - - 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 +186,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) @@ -202,34 +201,59 @@ 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 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 +264,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 +323,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 +344,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 +368,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 +389,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 +413,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 +434,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 +458,78 @@ 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\"\xf7\x01\n" + + "\x04Rule\x12\x17\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\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" + + "\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_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_crush_rule_proto_goTypes = []any{ (PoolType)(0), // 0: ceph.PoolType (*Rule)(nil), // 1: ceph.Rule (*Step)(nil), // 2: ceph.Step @@ -538,27 +537,25 @@ var file_crush_rule_proto_goTypes = []interface{}{ (*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() } @@ -566,88 +563,16 @@ 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[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{ 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, + NumMessages: 6, NumExtensions: 0, NumServices: 1, }, @@ -657,7 +582,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..b259d92 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 } @@ -90,11 +99,35 @@ 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 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 } @@ -174,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() @@ -285,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() @@ -309,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"}, "")) ) @@ -316,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/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..823489c 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,20 @@ 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"` + System bool `protobuf:"varint,4,opt,name=system,proto3" json:"system,omitempty"` + 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 +93,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) @@ -133,21 +129,25 @@ 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 - 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 +158,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 +181,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 +203,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 +233,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 +254,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,27 +277,24 @@ 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"` - 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 + 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 +305,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 +377,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 +398,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,27 +421,24 @@ 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"` 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 + 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 +449,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 +521,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 +544,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 +582,105 @@ 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\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" + + "\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\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" + + "\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\"\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" + + "\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\x14\n" + + "\x12_pwdExpirationDate\"(\n" + + "\n" + + "GetUserReq\x12\x1a\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\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\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\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\x12-\n" + + "\n" + + "CreateUser\x12\x13.ceph.CreateUserReq\x1a\n" + + ".ceph.User\x126\n" + + "\n" + + "DeleteUser\x12\x10.ceph.GetUserReq\x1a\x16.google.protobuf.Empty\x12-\n" + + "\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\x12$\n" + + "\n" + + "CreateRole\x12\n" + + ".ceph.Role\x1a\n" + + ".ceph.Role\x126\n" + + "\n" + + "DeleteRole\x12\x10.ceph.GetRoleReq\x1a\x16.google.protobuf.Empty\x12$\n" + + "\n" + + "UpdateRole\x12\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 ( 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 @@ -771,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 @@ -789,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 @@ -811,124 +739,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 +757,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..9f7a8eb 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 @@ -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) } @@ -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") +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.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") +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) { - 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") +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.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") +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) { - 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/http.yaml b/api/http.yaml index d5ee55a..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: "*" @@ -89,6 +91,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 005369c..9453c0d 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" } } }, @@ -239,7 +239,7 @@ "type": "string" }, { - "name": "fullText", + "name": "full_text", "in": "query", "required": false, "type": "string" @@ -322,7 +322,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -334,16 +334,15 @@ "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": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -365,16 +364,15 @@ "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": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -400,14 +398,13 @@ "200": { "description": "User key and capabilities in Ceph config file format", "schema": { - "type": "string", - "format": "byte" + "type": "string" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -440,7 +437,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -474,7 +471,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -495,7 +492,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -527,7 +524,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -556,7 +553,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -590,7 +587,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -604,14 +601,13 @@ "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/cephRole" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -643,7 +639,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -672,7 +668,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -694,14 +690,13 @@ "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/cephRole" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -740,7 +735,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -763,7 +758,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -786,7 +781,30 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" + } + } + }, + "tags": [ + "Status" + ] + } + }, + "/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" } } }, @@ -809,7 +827,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -835,7 +853,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -849,14 +867,13 @@ "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/cephUser" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -889,7 +906,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -925,7 +942,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -954,7 +971,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -976,14 +993,13 @@ "200": { "description": "A successful response.", "schema": { - "type": "object", - "properties": {} + "$ref": "#/definitions/cephUser" } }, "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -1022,7 +1038,7 @@ "default": { "description": "An unexpected error response.", "schema": { - "$ref": "#/definitions/googlerpcStatus" + "$ref": "#/definitions/googleRpcStatus" } } }, @@ -1096,163 +1112,163 @@ "PGStatPGStat_StatSum": { "type": "object", "properties": { - "numBytes": { + "num_bytes": { "type": "string", "format": "int64" }, - "numObjects": { + "num_objects": { "type": "string", "format": "int64" }, - "numObjectClones": { + "num_object_clones": { "type": "string", "format": "int64" }, - "numObjectCopies": { + "num_object_copies": { "type": "string", "format": "int64" }, - "numObjectsMissingOnPrimary": { + "num_objects_missing_on_primary": { "type": "string", "format": "int64" }, - "numObjectsMissing": { + "num_objects_missing": { "type": "string", "format": "int64" }, - "numObjectsDegraded": { + "num_objects_degraded": { "type": "string", "format": "int64" }, - "numObjectsMisplaced": { + "num_objects_misplaced": { "type": "string", "format": "int64" }, - "numObjectsUnfound": { + "num_objects_unfound": { "type": "string", "format": "int64" }, - "numObjectsDirty": { + "num_objects_dirty": { "type": "string", "format": "int64" }, - "numWhiteouts": { + "num_whiteouts": { "type": "string", "format": "int64" }, - "numRead": { + "num_read": { "type": "string", "format": "int64" }, - "numReadKb": { + "num_read_kb": { "type": "string", "format": "int64" }, - "numWrite": { + "num_write": { "type": "string", "format": "int64" }, - "numWriteKb": { + "num_write_kb": { "type": "string", "format": "int64" }, - "numScrubErrors": { + "num_scrub_errors": { "type": "string", "format": "int64" }, - "numShallowScrubErrors": { + "num_shallow_scrub_errors": { "type": "string", "format": "int64" }, - "numDeepScrubErrors": { + "num_deep_scrub_errors": { "type": "string", "format": "int64" }, - "numObjectsRecovered": { + "num_objects_recovered": { "type": "string", "format": "int64" }, - "numBytesRecovered": { + "num_bytes_recovered": { "type": "string", "format": "int64" }, - "numKeysRecovered": { + "num_keys_recovered": { "type": "string", "format": "int64" }, - "numObjectsOmap": { + "num_objects_omap": { "type": "string", "format": "int64" }, - "numObjectsHitSetArchive": { + "num_objects_hit_set_archive": { "type": "string", "format": "int64" }, - "numBytesHitSetArchive": { + "num_bytes_hit_set_archive": { "type": "string", "format": "int64" }, - "numFlush": { + "num_flush": { "type": "string", "format": "int64" }, - "numFlushKb": { + "num_flush_kb": { "type": "string", "format": "int64" }, - "numEvict": { + "num_evict": { "type": "string", "format": "int64" }, - "numEvictKb": { + "num_evict_kb": { "type": "string", "format": "int64" }, - "numPromote": { + "num_promote": { "type": "string", "format": "int64" }, - "numFlushModeHigh": { + "num_flush_mode_high": { "type": "string", "format": "int64" }, - "numFlushModeLow": { + "num_flush_mode_low": { "type": "string", "format": "int64" }, - "numEvictModeSome": { + "num_evict_mode_some": { "type": "string", "format": "int64" }, - "numEvictModeFull": { + "num_evict_mode_full": { "type": "string", "format": "int64" }, - "numObjectsPinned": { + "num_objects_pinned": { "type": "string", "format": "int64" }, - "numLegacySnapsets": { + "num_legacy_snapsets": { "type": "string", "format": "int64" }, - "numLargeOmapObjects": { + "num_large_omap_objects": { "type": "string", "format": "int64" }, - "numObjectsManifest": { + "num_objects_manifest": { "type": "string", "format": "int64" }, - "numOmapBytes": { + "num_omap_bytes": { "type": "string", "format": "int64" }, - "numOmapKeys": { + "num_omap_keys": { "type": "string", "format": "int64" }, - "numObjectsRepaired": { + "num_objects_repaired": { "type": "string", "format": "int64" } @@ -1261,163 +1277,163 @@ "PGStatsDeltaPGStatsDelta_StatSum": { "type": "object", "properties": { - "numBytes": { + "num_bytes": { "type": "string", "format": "int64" }, - "numObjects": { + "num_objects": { "type": "string", "format": "int64" }, - "numObjectClones": { + "num_object_clones": { "type": "string", "format": "int64" }, - "numObjectCopies": { + "num_object_copies": { "type": "string", "format": "int64" }, - "numObjectsMissingOnPrimary": { + "num_objects_missing_on_primary": { "type": "string", "format": "int64" }, - "numObjectsMissing": { + "num_objects_missing": { "type": "string", "format": "int64" }, - "numObjectsDegraded": { + "num_objects_degraded": { "type": "string", "format": "int64" }, - "numObjectsMisplaced": { + "num_objects_misplaced": { "type": "string", "format": "int64" }, - "numObjectsUnfound": { + "num_objects_unfound": { "type": "string", "format": "int64" }, - "numObjectsDirty": { + "num_objects_dirty": { "type": "string", "format": "int64" }, - "numWhiteouts": { + "num_whiteouts": { "type": "string", "format": "int64" }, - "numRead": { + "num_read": { "type": "string", "format": "int64" }, - "numReadKb": { + "num_read_kb": { "type": "string", "format": "int64" }, - "numWrite": { + "num_write": { "type": "string", "format": "int64" }, - "numWriteKb": { + "num_write_kb": { "type": "string", "format": "int64" }, - "numScrubErrors": { + "num_scrub_errors": { "type": "string", "format": "int64" }, - "numShallowScrubErrors": { + "num_shallow_scrub_errors": { "type": "string", "format": "int64" }, - "numDeepScrubErrors": { + "num_deep_scrub_errors": { "type": "string", "format": "int64" }, - "numObjectsRecovered": { + "num_objects_recovered": { "type": "string", "format": "int64" }, - "numBytesRecovered": { + "num_bytes_recovered": { "type": "string", "format": "int64" }, - "numKeysRecovered": { + "num_keys_recovered": { "type": "string", "format": "int64" }, - "numObjectsOmap": { + "num_objects_omap": { "type": "string", "format": "int64" }, - "numObjectsHitSetArchive": { + "num_objects_hit_set_archive": { "type": "string", "format": "int64" }, - "numBytesHitSetArchive": { + "num_bytes_hit_set_archive": { "type": "string", "format": "int64" }, - "numFlush": { + "num_flush": { "type": "string", "format": "int64" }, - "numFlushKb": { + "num_flush_kb": { "type": "string", "format": "int64" }, - "numEvict": { + "num_evict": { "type": "string", "format": "int64" }, - "numEvictKb": { + "num_evict_kb": { "type": "string", "format": "int64" }, - "numPromote": { + "num_promote": { "type": "string", "format": "int64" }, - "numFlushModeHigh": { + "num_flush_mode_high": { "type": "string", "format": "int64" }, - "numFlushModeLow": { + "num_flush_mode_low": { "type": "string", "format": "int64" }, - "numEvictModeSome": { + "num_evict_mode_some": { "type": "string", "format": "int64" }, - "numEvictModeFull": { + "num_evict_mode_full": { "type": "string", "format": "int64" }, - "numObjectsPinned": { + "num_objects_pinned": { "type": "string", "format": "int64" }, - "numLegacySnapsets": { + "num_legacy_snapsets": { "type": "string", "format": "int64" }, - "numLargeOmapObjects": { + "num_large_omap_objects": { "type": "string", "format": "int64" }, - "numObjectsManifest": { + "num_objects_manifest": { "type": "string", "format": "int64" }, - "numOmapBytes": { + "num_omap_bytes": { "type": "string", "format": "int64" }, - "numOmapKeys": { + "num_omap_keys": { "type": "string", "format": "int64" }, - "numObjectsRepaired": { + "num_objects_repaired": { "type": "string", "format": "int64" } @@ -1434,7 +1450,7 @@ "type": "string", "format": "int64" }, - "internallyReserved": { + "internally_reserved": { "type": "string", "format": "int64" }, @@ -1442,27 +1458,27 @@ "type": "string", "format": "int64" }, - "dataStored": { + "data_stored": { "type": "string", "format": "int64" }, - "dataCompressed": { + "data_compressed": { "type": "string", "format": "int64" }, - "dataCompressedAllocated": { + "data_compressed_allocated": { "type": "string", "format": "int64" }, - "dataCompressedOriginal": { + "data_compressed_original": { "type": "string", "format": "int64" }, - "omapAllocated": { + "omap_allocated": { "type": "string", "format": "int64" }, - "internalMetadata": { + "internal_metadata": { "type": "string", "format": "int64" } @@ -1471,163 +1487,163 @@ "PGStatsSumPGStatsSum_StatSum": { "type": "object", "properties": { - "numBytes": { + "num_bytes": { "type": "string", "format": "int64" }, - "numObjects": { + "num_objects": { "type": "string", "format": "int64" }, - "numObjectClones": { + "num_object_clones": { "type": "string", "format": "int64" }, - "numObjectCopies": { + "num_object_copies": { "type": "string", "format": "int64" }, - "numObjectsMissingOnPrimary": { + "num_objects_missing_on_primary": { "type": "string", "format": "int64" }, - "numObjectsMissing": { + "num_objects_missing": { "type": "string", "format": "int64" }, - "numObjectsDegraded": { + "num_objects_degraded": { "type": "string", "format": "int64" }, - "numObjectsMisplaced": { + "num_objects_misplaced": { "type": "string", "format": "int64" }, - "numObjectsUnfound": { + "num_objects_unfound": { "type": "string", "format": "int64" }, - "numObjectsDirty": { + "num_objects_dirty": { "type": "string", "format": "int64" }, - "numWhiteouts": { + "num_whiteouts": { "type": "string", "format": "int64" }, - "numRead": { + "num_read": { "type": "string", "format": "int64" }, - "numReadKb": { + "num_read_kb": { "type": "string", "format": "int64" }, - "numWrite": { + "num_write": { "type": "string", "format": "int64" }, - "numWriteKb": { + "num_write_kb": { "type": "string", "format": "int64" }, - "numScrubErrors": { + "num_scrub_errors": { "type": "string", "format": "int64" }, - "numShallowScrubErrors": { + "num_shallow_scrub_errors": { "type": "string", "format": "int64" }, - "numDeepScrubErrors": { + "num_deep_scrub_errors": { "type": "string", "format": "int64" }, - "numObjectsRecovered": { + "num_objects_recovered": { "type": "string", "format": "int64" }, - "numBytesRecovered": { + "num_bytes_recovered": { "type": "string", "format": "int64" }, - "numKeysRecovered": { + "num_keys_recovered": { "type": "string", "format": "int64" }, - "numObjectsOmap": { + "num_objects_omap": { "type": "string", "format": "int64" }, - "numObjectsHitSetArchive": { + "num_objects_hit_set_archive": { "type": "string", "format": "int64" }, - "numBytesHitSetArchive": { + "num_bytes_hit_set_archive": { "type": "string", "format": "int64" }, - "numFlush": { + "num_flush": { "type": "string", "format": "int64" }, - "numFlushKb": { + "num_flush_kb": { "type": "string", "format": "int64" }, - "numEvict": { + "num_evict": { "type": "string", "format": "int64" }, - "numEvictKb": { + "num_evict_kb": { "type": "string", "format": "int64" }, - "numPromote": { + "num_promote": { "type": "string", "format": "int64" }, - "numFlushModeHigh": { + "num_flush_mode_high": { "type": "string", "format": "int64" }, - "numFlushModeLow": { + "num_flush_mode_low": { "type": "string", "format": "int64" }, - "numEvictModeSome": { + "num_evict_mode_some": { "type": "string", "format": "int64" }, - "numEvictModeFull": { + "num_evict_mode_full": { "type": "string", "format": "int64" }, - "numObjectsPinned": { + "num_objects_pinned": { "type": "string", "format": "int64" }, - "numLegacySnapsets": { + "num_legacy_snapsets": { "type": "string", "format": "int64" }, - "numLargeOmapObjects": { + "num_large_omap_objects": { "type": "string", "format": "int64" }, - "numObjectsManifest": { + "num_objects_manifest": { "type": "string", "format": "int64" }, - "numOmapBytes": { + "num_omap_bytes": { "type": "string", "format": "int64" }, - "numOmapKeys": { + "num_omap_keys": { "type": "string", "format": "int64" }, - "numObjectsRepaired": { + "num_objects_repaired": { "type": "string", "format": "int64" } @@ -1644,7 +1660,7 @@ "type": "string", "format": "int64" }, - "internallyReserved": { + "internally_reserved": { "type": "string", "format": "int64" }, @@ -1652,27 +1668,27 @@ "type": "string", "format": "int64" }, - "dataStored": { + "data_stored": { "type": "string", "format": "int64" }, - "dataCompressed": { + "data_compressed": { "type": "string", "format": "int64" }, - "dataCompressedAllocated": { + "data_compressed_allocated": { "type": "string", "format": "int64" }, - "dataCompressedOriginal": { + "data_compressed_original": { "type": "string", "format": "int64" }, - "omapAllocated": { + "omap_allocated": { "type": "string", "format": "int64" }, - "internalMetadata": { + "internal_metadata": { "type": "string", "format": "int64" } @@ -1681,163 +1697,163 @@ "PoolStatsPoolStats_StatSum": { "type": "object", "properties": { - "numBytes": { + "num_bytes": { "type": "string", "format": "int64" }, - "numObjects": { + "num_objects": { "type": "string", "format": "int64" }, - "numObjectClones": { + "num_object_clones": { "type": "string", "format": "int64" }, - "numObjectCopies": { + "num_object_copies": { "type": "string", "format": "int64" }, - "numObjectsMissingOnPrimary": { + "num_objects_missing_on_primary": { "type": "string", "format": "int64" }, - "numObjectsMissing": { + "num_objects_missing": { "type": "string", "format": "int64" }, - "numObjectsDegraded": { + "num_objects_degraded": { "type": "string", "format": "int64" }, - "numObjectsMisplaced": { + "num_objects_misplaced": { "type": "string", "format": "int64" }, - "numObjectsUnfound": { + "num_objects_unfound": { "type": "string", "format": "int64" }, - "numObjectsDirty": { + "num_objects_dirty": { "type": "string", "format": "int64" }, - "numWhiteouts": { + "num_whiteouts": { "type": "string", "format": "int64" }, - "numRead": { + "num_read": { "type": "string", "format": "int64" }, - "numReadKb": { + "num_read_kb": { "type": "string", "format": "int64" }, - "numWrite": { + "num_write": { "type": "string", "format": "int64" }, - "numWriteKb": { + "num_write_kb": { "type": "string", "format": "int64" }, - "numScrubErrors": { + "num_scrub_errors": { "type": "string", "format": "int64" }, - "numShallowScrubErrors": { + "num_shallow_scrub_errors": { "type": "string", "format": "int64" }, - "numDeepScrubErrors": { + "num_deep_scrub_errors": { "type": "string", "format": "int64" }, - "numObjectsRecovered": { + "num_objects_recovered": { "type": "string", "format": "int64" }, - "numBytesRecovered": { + "num_bytes_recovered": { "type": "string", "format": "int64" }, - "numKeysRecovered": { + "num_keys_recovered": { "type": "string", "format": "int64" }, - "numObjectsOmap": { + "num_objects_omap": { "type": "string", "format": "int64" }, - "numObjectsHitSetArchive": { + "num_objects_hit_set_archive": { "type": "string", "format": "int64" }, - "numBytesHitSetArchive": { + "num_bytes_hit_set_archive": { "type": "string", "format": "int64" }, - "numFlush": { + "num_flush": { "type": "string", "format": "int64" }, - "numFlushKb": { + "num_flush_kb": { "type": "string", "format": "int64" }, - "numEvict": { + "num_evict": { "type": "string", "format": "int64" }, - "numEvictKb": { + "num_evict_kb": { "type": "string", "format": "int64" }, - "numPromote": { + "num_promote": { "type": "string", "format": "int64" }, - "numFlushModeHigh": { + "num_flush_mode_high": { "type": "string", "format": "int64" }, - "numFlushModeLow": { + "num_flush_mode_low": { "type": "string", "format": "int64" }, - "numEvictModeSome": { + "num_evict_mode_some": { "type": "string", "format": "int64" }, - "numEvictModeFull": { + "num_evict_mode_full": { "type": "string", "format": "int64" }, - "numObjectsPinned": { + "num_objects_pinned": { "type": "string", "format": "int64" }, - "numLegacySnapsets": { + "num_legacy_snapsets": { "type": "string", "format": "int64" }, - "numLargeOmapObjects": { + "num_large_omap_objects": { "type": "string", "format": "int64" }, - "numObjectsManifest": { + "num_objects_manifest": { "type": "string", "format": "int64" }, - "numOmapBytes": { + "num_omap_bytes": { "type": "string", "format": "int64" }, - "numOmapKeys": { + "num_omap_keys": { "type": "string", "format": "int64" }, - "numObjectsRepaired": { + "num_objects_repaired": { "type": "string", "format": "int64" } @@ -1854,7 +1870,7 @@ "type": "string", "format": "int64" }, - "internallyReserved": { + "internally_reserved": { "type": "string", "format": "int64" }, @@ -1862,27 +1878,27 @@ "type": "string", "format": "int64" }, - "dataStored": { + "data_stored": { "type": "string", "format": "int64" }, - "dataCompressed": { + "data_compressed": { "type": "string", "format": "int64" }, - "dataCompressedAllocated": { + "data_compressed_allocated": { "type": "string", "format": "int64" }, - "dataCompressedOriginal": { + "data_compressed_original": { "type": "string", "format": "int64" }, - "omapAllocated": { + "omap_allocated": { "type": "string", "format": "int64" }, - "internalMetadata": { + "internal_metadata": { "type": "string", "format": "int64" } @@ -1919,6 +1935,9 @@ "type": "object" } } + }, + "system": { + "type": "boolean" } } }, @@ -1987,13 +2006,13 @@ "name": { "type": "string" }, - "publicAddrs": { + "public_addrs": { "$ref": "#/definitions/cephCephMonDumpAddrVec" }, "addr": { "type": "string" }, - "publicAddr": { + "public_addr": { "type": "string" }, "priority": { @@ -2004,7 +2023,7 @@ "type": "integer", "format": "int32" }, - "crushLocation": { + "crush_location": { "type": "string" } } @@ -2027,27 +2046,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": { @@ -2076,11 +2095,11 @@ "type": "integer", "format": "int32" }, - "byRank": { + "by_rank": { "type": "array", "items": {} }, - "upStandby": { + "up_standby": { "type": "integer", "format": "int32" } @@ -2110,7 +2129,7 @@ "available": { "type": "boolean" }, - "numStandbys": { + "num_standbys": { "type": "integer", "format": "int32" }, @@ -2135,10 +2154,10 @@ "type": "integer", "format": "int32" }, - "minMonReleaseName": { + "min_mon_release_name": { "type": "string" }, - "numMons": { + "num_mons": { "type": "integer", "format": "int32" } @@ -2151,27 +2170,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" } @@ -2180,38 +2199,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" } @@ -2220,7 +2239,7 @@ "cephCephStatusPGState": { "type": "object", "properties": { - "stateName": { + "state_name": { "type": "string" }, "count": { @@ -2295,6 +2314,28 @@ } } }, + "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\"" + } + } + }, + "cephClusterUserStatusResp": { + "type": "object", + "properties": { + "status": { + "type": "string", + "description": "Dashboard-compatible status string, e.g. \"Successfully created user 'client.x'\"." + } + } + }, "cephClusterUsers": { "type": "object", "properties": { @@ -2322,13 +2363,13 @@ "desc": { "type": "string" }, - "longDesc": { + "long_desc": { "type": "string" }, - "defaultValue": { + "default_value": { "type": "string" }, - "daemonDefault": { + "daemon_default": { "type": "string" }, "tags": { @@ -2343,13 +2384,13 @@ "$ref": "#/definitions/ConfigParamServiceType" } }, - "seeAlso": { + "see_also": { "type": "array", "items": { "type": "string" } }, - "enumValues": { + "enum_values": { "type": "array", "items": { "type": "string" @@ -2363,7 +2404,7 @@ "type": "number", "format": "double" }, - "canUpdateAtRuntime": { + "can_update_at_runtime": { "type": "boolean" }, "flags": { @@ -2378,19 +2419,17 @@ "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" }, "import_data": { "type": "string", - "format": "byte", "title": "keyring file format - if import_data is set then other fields ignored" } } @@ -2398,16 +2437,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": { @@ -2468,7 +2507,6 @@ "properties": { "data": { "type": "string", - "format": "byte", "title": "User key and capabilities in Ceph config file format" } } @@ -2491,64 +2529,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": { @@ -2565,30 +2603,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": {} }, @@ -2599,34 +2637,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" } } @@ -2634,10 +2672,10 @@ "cephGetCephPgDumpResponse": { "type": "object", "properties": { - "pgReady": { + "pg_ready": { "type": "boolean" }, - "pgMap": { + "pg_map": { "$ref": "#/definitions/cephPGMap" } }, @@ -2652,7 +2690,7 @@ "health": { "$ref": "#/definitions/cephCephStatusHealth" }, - "electionEpoch": { + "election_epoch": { "type": "integer", "format": "int32" }, @@ -2663,13 +2701,13 @@ "format": "int32" } }, - "quorumNames": { + "quorum_names": { "type": "array", "items": { "type": "string" } }, - "quorumAge": { + "quorum_age": { "type": "integer", "format": "int32" }, @@ -2691,7 +2729,7 @@ "servicemap": { "$ref": "#/definitions/cephCephStatusServiceMap" }, - "progressEvents": { + "progress_events": { "type": "object" } } @@ -2729,10 +2767,10 @@ "username": { "type": "string" }, - "pwdUpdateRequired": { + "pwd_update_required": { "type": "boolean" }, - "pwdExpirationDate": { + "pwd_expiration_date": { "type": "string", "format": "date-time" }, @@ -2753,7 +2791,7 @@ "cephOSDStatsSum": { "type": "object", "properties": { - "upFrom": { + "up_from": { "type": "string", "format": "int64" }, @@ -2761,19 +2799,19 @@ "type": "string", "format": "int64" }, - "numPgs": { + "num_pgs": { "type": "string", "format": "int64" }, - "numOsds": { + "num_osds": { "type": "string", "format": "int64" }, - "numPerPoolOsds": { + "num_per_pool_osds": { "type": "string", "format": "int64" }, - "numPerPoolOmapOsds": { + "num_per_pool_omap_osds": { "type": "string", "format": "int64" }, @@ -2781,52 +2819,52 @@ "type": "string", "format": "int64" }, - "kbUsed": { + "kb_used": { "type": "string", "format": "int64" }, - "kbUsedData": { + "kb_used_data": { "type": "string", "format": "int64" }, - "kbUsedOmap": { + "kb_used_omap": { "type": "string", "format": "int64" }, - "kbUsedMeta": { + "kb_used_meta": { "type": "string", "format": "int64" }, - "kbAvail": { + "kb_avail": { "type": "string", "format": "int64" }, "statfs": { "$ref": "#/definitions/cephOSDStatsSumStatFs" }, - "hbPeers": { + "hb_peers": { "type": "array", "items": { "type": "string", "format": "int64" } }, - "snapTrimQueueLen": { + "snap_trim_queue_len": { "type": "string", "format": "int64" }, - "numSnapTrimming": { + "num_snap_trimming": { "type": "string", "format": "int64" }, - "numShardsRepaired": { + "num_shards_repaired": { "type": "string", "format": "int64" }, - "opQueueAgeHist": { + "op_queue_age_hist": { "$ref": "#/definitions/cephOSDStatsSumOpQueueAgeHist" }, - "perfStat": { + "perf_stat": { "$ref": "#/definitions/cephOSDStatsSumPerfStat" }, "alerts": { @@ -2835,7 +2873,7 @@ "type": "string" } }, - "networkPingTimes": { + "network_ping_times": { "type": "array", "items": { "type": "object", @@ -2851,7 +2889,7 @@ "type": "string", "format": "int64" }, - "lastUpdate": { + "last_update": { "type": "string", "format": "date-time" }, @@ -2867,7 +2905,7 @@ "cephOSDStatsSumNetworkPingTimeInterface": { "type": "object", "properties": { - "interfaceName": { + "interface_name": { "type": "string" }, "average": { @@ -2946,7 +2984,7 @@ "format": "int64" } }, - "upperBound": { + "upper_bound": { "type": "string", "format": "int64" } @@ -2955,19 +2993,19 @@ "cephOSDStatsSumPerfStat": { "type": "object", "properties": { - "commitLatencyMs": { + "commit_latency_ms": { "type": "string", "format": "int64" }, - "applyLatencyMs": { + "apply_latency_ms": { "type": "string", "format": "int64" }, - "commitLatencyNs": { + "commit_latency_ns": { "type": "string", "format": "int64" }, - "applyLatencyNs": { + "apply_latency_ns": { "type": "string", "format": "int64" } @@ -2984,7 +3022,7 @@ "type": "string", "format": "int64" }, - "internallyReserved": { + "internally_reserved": { "type": "string", "format": "int64" }, @@ -2992,27 +3030,27 @@ "type": "string", "format": "int64" }, - "dataStored": { + "data_stored": { "type": "string", "format": "int64" }, - "dataCompressed": { + "data_compressed": { "type": "string", "format": "int64" }, - "dataCompressedAllocated": { + "data_compressed_allocated": { "type": "string", "format": "int64" }, - "dataCompressedOriginal": { + "data_compressed_original": { "type": "string", "format": "int64" }, - "omapAllocated": { + "omap_allocated": { "type": "string", "format": "int64" }, - "internalMetadata": { + "internal_metadata": { "type": "string", "format": "int64" } @@ -3085,25 +3123,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" } } @@ -3130,56 +3168,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": { @@ -3197,15 +3235,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" }, @@ -3213,15 +3251,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" } @@ -3234,10 +3272,10 @@ "type": "integer", "format": "int32" }, - "poolName": { + "pool_name": { "type": "string" }, - "createTime": { + "create_time": { "type": "string", "format": "date-time" }, @@ -3245,7 +3283,7 @@ "type": "string", "format": "int64" }, - "flagsNames": { + "flags_names": { "type": "string" }, "type": { @@ -3256,99 +3294,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" }, @@ -3359,104 +3397,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" } } @@ -3476,35 +3514,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" } @@ -3513,22 +3551,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" } @@ -3541,7 +3579,7 @@ "type": "string", "format": "int64" }, - "upFrom": { + "up_from": { "type": "string", "format": "int64" }, @@ -3549,19 +3587,19 @@ "type": "string", "format": "int64" }, - "numPgs": { + "num_pgs": { "type": "string", "format": "int64" }, - "numOsds": { + "num_osds": { "type": "string", "format": "int64" }, - "numPerPoolOsds": { + "num_per_pool_osds": { "type": "string", "format": "int64" }, - "numPerPoolOmapOsds": { + "num_per_pool_omap_osds": { "type": "string", "format": "int64" }, @@ -3569,52 +3607,52 @@ "type": "string", "format": "int64" }, - "kbUsed": { + "kb_used": { "type": "string", "format": "int64" }, - "kbUsedData": { + "kb_used_data": { "type": "string", "format": "int64" }, - "kbUsedOmap": { + "kb_used_omap": { "type": "string", "format": "int64" }, - "kbUsedMeta": { + "kb_used_meta": { "type": "string", "format": "int64" }, - "kbAvail": { + "kb_avail": { "type": "string", "format": "int64" }, "statfs": { "$ref": "#/definitions/cephOsdStatsStatFs" }, - "hbPeers": { + "hb_peers": { "type": "array", "items": { "type": "string", "format": "int64" } }, - "snapTrimQueueLen": { + "snap_trim_queue_len": { "type": "string", "format": "int64" }, - "numSnapTrimming": { + "num_snap_trimming": { "type": "string", "format": "int64" }, - "numShardsRepaired": { + "num_shards_repaired": { "type": "string", "format": "int64" }, - "opQueueAgeHist": { + "op_queue_age_hist": { "$ref": "#/definitions/cephOsdStatsOpQueueAgeHist" }, - "perfStat": { + "perf_stat": { "$ref": "#/definitions/cephOsdStatsPerfStat" }, "alerts": { @@ -3623,7 +3661,7 @@ "type": "string" } }, - "networkPingTimes": { + "network_ping_times": { "type": "array", "items": { "type": "object", @@ -3639,7 +3677,7 @@ "type": "string", "format": "int64" }, - "lastUpdate": { + "last_update": { "type": "string" }, "interfaces": { @@ -3654,7 +3692,7 @@ "cephOsdStatsNetworkPingTimeInterface": { "type": "object", "properties": { - "interfaceName": { + "interface_name": { "type": "string" }, "average": { @@ -3733,7 +3771,7 @@ "format": "int64" } }, - "upperBound": { + "upper_bound": { "type": "string", "format": "int64" } @@ -3742,19 +3780,19 @@ "cephOsdStatsPerfStat": { "type": "object", "properties": { - "commitLatencyMs": { + "commit_latency_ms": { "type": "string", "format": "int64" }, - "applyLatencyMs": { + "apply_latency_ms": { "type": "string", "format": "int64" }, - "commitLatencyNs": { + "commit_latency_ns": { "type": "string", "format": "int64" }, - "applyLatencyNs": { + "apply_latency_ns": { "type": "string", "format": "int64" } @@ -3771,7 +3809,7 @@ "type": "string", "format": "int64" }, - "internallyReserved": { + "internally_reserved": { "type": "string", "format": "int64" }, @@ -3779,27 +3817,27 @@ "type": "string", "format": "int64" }, - "dataStored": { + "data_stored": { "type": "string", "format": "int64" }, - "dataCompressed": { + "data_compressed": { "type": "string", "format": "int64" }, - "dataCompressedAllocated": { + "data_compressed_allocated": { "type": "string", "format": "int64" }, - "dataCompressedOriginal": { + "data_compressed_original": { "type": "string", "format": "int64" }, - "omapAllocated": { + "omap_allocated": { "type": "string", "format": "int64" }, - "internalMetadata": { + "internal_metadata": { "type": "string", "format": "int64" } @@ -3816,45 +3854,45 @@ "type": "string", "format": "date-time" }, - "lastOsdmapEpoch": { + "last_osdmap_epoch": { "type": "string", "format": "int64" }, - "lastPgScan": { + "last_pg_scan": { "type": "string", "format": "int64" }, - "pgStatsSum": { + "pg_stats_sum": { "$ref": "#/definitions/cephPGStatsSum" }, - "osdStatsSum": { + "osd_stats_sum": { "$ref": "#/definitions/cephOSDStatsSum" }, - "pgStatsDelta": { + "pg_stats_delta": { "$ref": "#/definitions/cephPGStatsDelta" }, - "pgStats": { + "pg_stats": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/cephPGStat" } }, - "poolStats": { + "pool_stats": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/cephPoolStats" } }, - "osdStats": { + "osd_stats": { "type": "array", "items": { "type": "object", "$ref": "#/definitions/cephOsdStats" } }, - "poolStatfs": { + "pool_statfs": { "type": "array", "items": { "type": "object", @@ -3872,161 +3910,161 @@ "version": { "type": "string" }, - "reportedSeq": { + "reported_seq": { "type": "string", "format": "int64" }, - "reportedEpoch": { + "reported_epoch": { "type": "string", "format": "int64" }, "state": { "type": "string" }, - "lastFresh": { + "last_fresh": { "type": "string", "format": "date-time" }, - "lastChange": { + "last_change": { "type": "string", "format": "date-time" }, - "lastActive": { + "last_active": { "type": "string", "format": "date-time" }, - "lastPeered": { + "last_peered": { "type": "string", "format": "date-time" }, - "lastClean": { + "last_clean": { "type": "string", "format": "date-time" }, - "lastBecameActive": { + "last_became_active": { "type": "string", "format": "date-time" }, - "lastBecamePeered": { + "last_became_peered": { "type": "string", "format": "date-time" }, - "lastUnstale": { + "last_unstale": { "type": "string", "format": "date-time" }, - "lastUndegraded": { + "last_undegraded": { "type": "string", "format": "date-time" }, - "lastFullsized": { + "last_fullsized": { "type": "string", "format": "date-time" }, - "mappingEpoch": { + "mapping_epoch": { "type": "string", "format": "int64" }, - "logStart": { + "log_start": { "type": "string" }, - "ondiskLogStart": { + "ondisk_log_start": { "type": "string" }, "created": { "type": "string", "format": "int64" }, - "lastEpochClean": { + "last_epoch_clean": { "type": "string", "format": "int64" }, "parent": { "type": "string" }, - "parentSplitBits": { + "parent_split_bits": { "type": "string", "format": "int64" }, - "lastScrub": { + "last_scrub": { "type": "string" }, - "lastScrubStamp": { + "last_scrub_stamp": { "type": "string", "format": "date-time" }, - "lastDeepScrub": { + "last_deep_scrub": { "type": "string" }, - "lastDeepScrubStamp": { + "last_deep_scrub_stamp": { "type": "string", "format": "date-time" }, - "lastCleanScrubStamp": { + "last_clean_scrub_stamp": { "type": "string", "format": "date-time" }, - "objectsScrubbed": { + "objects_scrubbed": { "type": "string", "format": "int64" }, - "logSize": { + "log_size": { "type": "string", "format": "int64" }, - "logDupsSize": { + "log_dups_size": { "type": "string", "format": "int64" }, - "ondiskLogSize": { + "ondisk_log_size": { "type": "string", "format": "int64" }, - "statsInvalid": { + "stats_invalid": { "type": "boolean" }, - "dirtyStatsInvalid": { + "dirty_stats_invalid": { "type": "boolean" }, - "omapStatsInvalid": { + "omap_stats_invalid": { "type": "boolean" }, - "hitsetStatsInvalid": { + "hitset_stats_invalid": { "type": "boolean" }, - "hitsetBytesStatsInvalid": { + "hitset_bytes_stats_invalid": { "type": "boolean" }, - "pinStatsInvalid": { + "pin_stats_invalid": { "type": "boolean" }, - "manifestStatsInvalid": { + "manifest_stats_invalid": { "type": "boolean" }, - "snaptrimqLen": { + "snaptrimq_len": { "type": "string", "format": "int64" }, - "lastScrubDuration": { + "last_scrub_duration": { "type": "string", "format": "int64" }, - "scrubSchedule": { + "scrub_schedule": { "type": "string" }, - "scrubDuration": { + "scrub_duration": { "type": "number", "format": "double" }, - "objectsTrimmed": { + "objects_trimmed": { "type": "string", "format": "int64" }, - "snaptrimDuration": { + "snaptrim_duration": { "type": "number", "format": "double" }, - "statSum": { + "stat_sum": { "$ref": "#/definitions/PGStatPGStat_StatSum" }, "up": { @@ -4043,36 +4081,36 @@ "format": "int64" } }, - "availNoMissing": { + "avail_no_missing": { "type": "array", "items": { "type": "string", "format": "int64" } }, - "objectLocationCounts": { + "object_location_counts": { "type": "array", "items": { "type": "string", "format": "int64" } }, - "blockedBy": { + "blocked_by": { "type": "array", "items": { "type": "string", "format": "int64" } }, - "upPrimary": { + "up_primary": { "type": "string", "format": "int64" }, - "actingPrimary": { + "acting_primary": { "type": "string", "format": "int64" }, - "purgedSnaps": { + "purged_snaps": { "type": "array", "items": { "type": "string", @@ -4084,17 +4122,17 @@ "cephPGStatsDelta": { "type": "object", "properties": { - "statSum": { + "stat_sum": { "$ref": "#/definitions/PGStatsDeltaPGStatsDelta_StatSum" }, - "storeStats": { + "store_stats": { "$ref": "#/definitions/PGStatsDeltaPGStatsDelta_StoreStats" }, - "logSize": { + "log_size": { "type": "string", "format": "int64" }, - "ondiskLogSize": { + "ondisk_log_size": { "type": "string", "format": "int64" }, @@ -4106,11 +4144,11 @@ "type": "string", "format": "int64" }, - "numStoreStats": { + "num_store_stats": { "type": "string", "format": "int64" }, - "stampDelta": { + "stamp_delta": { "type": "string" } } @@ -4118,17 +4156,17 @@ "cephPGStatsSum": { "type": "object", "properties": { - "statSum": { + "stat_sum": { "$ref": "#/definitions/PGStatsSumPGStatsSum_StatSum" }, - "storeStats": { + "store_stats": { "$ref": "#/definitions/PGStatsSumPGStatsSum_StoreStats" }, - "logSize": { + "log_size": { "type": "string", "format": "int64" }, - "ondiskLogSize": { + "ondisk_log_size": { "type": "string", "format": "int64" }, @@ -4140,7 +4178,7 @@ "type": "string", "format": "int64" }, - "numStoreStats": { + "num_store_stats": { "type": "string", "format": "int64" } @@ -4165,7 +4203,7 @@ "type": "string", "format": "int64" }, - "internallyReserved": { + "internally_reserved": { "type": "string", "format": "int64" }, @@ -4173,27 +4211,27 @@ "type": "string", "format": "int64" }, - "dataStored": { + "data_stored": { "type": "string", "format": "int64" }, - "dataCompressed": { + "data_compressed": { "type": "string", "format": "int64" }, - "dataCompressedAllocated": { + "data_compressed_allocated": { "type": "string", "format": "int64" }, - "dataCompressedOriginal": { + "data_compressed_original": { "type": "string", "format": "int64" }, - "omapAllocated": { + "omap_allocated": { "type": "string", "format": "int64" }, - "internalMetadata": { + "internal_metadata": { "type": "string", "format": "int64" } @@ -4206,21 +4244,21 @@ "type": "string", "format": "int64" }, - "numPg": { + "num_pg": { "type": "string", "format": "int64" }, - "statSum": { + "stat_sum": { "$ref": "#/definitions/PoolStatsPoolStats_StatSum" }, - "storeStats": { + "store_stats": { "$ref": "#/definitions/PoolStatsPoolStats_StoreStats" }, - "logSize": { + "log_size": { "type": "string", "format": "int64" }, - "ondiskLogSize": { + "ondisk_log_size": { "type": "string", "format": "int64" }, @@ -4232,7 +4270,7 @@ "type": "string", "format": "int64" }, - "numStoreStats": { + "num_store_stats": { "type": "string", "format": "int64" } @@ -4263,6 +4301,9 @@ "type": "object" } } + }, + "system": { + "type": "boolean" } } }, @@ -4281,28 +4322,28 @@ "cephRule": { "type": "object", "properties": { - "ruleId": { - "type": "string", - "format": "int64" + "rule_id": { + "type": "integer", + "format": "int32" }, - "ruleName": { + "rule_name": { "type": "string" }, "ruleset": { - "type": "string", - "format": "int64" + "type": "integer", + "format": "int32" }, "type": { - "type": "string", - "format": "int64" + "type": "integer", + "format": "int32" }, - "minSize": { - "type": "string", - "format": "int64" + "min_size": { + "type": "integer", + "format": "int32" }, - "maxSize": { - "type": "string", - "format": "int64" + "max_size": { + "type": "integer", + "format": "int32" }, "steps": { "type": "array", @@ -4328,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" } } }, @@ -4350,10 +4402,10 @@ "username": { "type": "string" }, - "pwdUpdateRequired": { + "pwd_update_required": { "type": "boolean" }, - "pwdExpirationDate": { + "pwd_expiration_date": { "type": "string", "format": "date-time" }, @@ -4375,15 +4427,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" } } }, @@ -4463,7 +4514,7 @@ } } }, - "googlerpcStatus": { + "googleRpcStatus": { "type": "object", "properties": { "code": { diff --git a/api/users.proto b/api/users.proto index d398a05..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); } @@ -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{ @@ -52,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; } @@ -68,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/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..4bbec7d 100644 --- a/go.mod +++ b/go.mod @@ -1,110 +1,374 @@ module github.com/clyso/ceph-api -go 1.21 +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/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/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/grpc-ecosystem/grpc-gateway/v2 v2.29.0 + github.com/mattn/go-colorable v0.1.14 // indirect + 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.49.0 - go.opentelemetry.io/otel v1.24.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.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.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 + 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.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 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.24.0 - golang.org/x/oauth2 v0.20.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 + gopkg.in/yaml.v3 v3.0.1 ) 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/creasty/defaults v1.7.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/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/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect - github.com/dgraph-io/ristretto v0.1.1 // indirect + github.com/denis-tingaikin/go-header v0.5.0 // 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/ecordell/optgen v0.0.9 // indirect + github.com/ebitengine/purego v0.10.0 // 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/fsnotify/fsnotify v1.7.0 // indirect - github.com/go-jose/go-jose/v3 v3.0.3 // indirect - github.com/go-logr/logr v1.4.1 // indirect + github.com/firefart/nonamedreturns v1.0.6 // 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.5 // indirect + github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/gobuffalo/pop/v6 v6.1.1 // 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 + 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/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.1 // 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-retryablehttp v0.7.5 // indirect - github.com/hashicorp/hcl v1.0.0 // indirect + github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // 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/hexops/gotextdiff v1.0.3 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect - github.com/magiconair/properties v1.8.7 // 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 + 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.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 + 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-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 + 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/mitchellh/mapstructure v1.5.0 // indirect + github.com/mgechev/revive v1.15.0 // indirect + github.com/mitchellh/go-homedir v1.1.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/openzipkin/zipkin-go v0.4.2 // 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/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.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/pelletier/go-toml/v2 v2.1.1 // 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/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/sagikazarmark/locafero v0.4.0 // indirect - github.com/sagikazarmark/slog-shim v0.1.0 // indirect + github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // 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 + 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.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 + 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/sourcegraph/conc v0.3.0 // indirect - github.com/spf13/afero v1.11.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/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/go-diff v0.8.0 // indirect + github.com/spf13/afero v1.15.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.3 // indirect github.com/subosito/gotenv v1.6.0 // 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/zipkin v1.24.0 // indirect - go.opentelemetry.io/otel/metric v1.24.0 // indirect - go.opentelemetry.io/proto/otlp v1.1.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.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 + 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.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 - 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 - gopkg.in/ini.v1 v1.67.0 // indirect - gopkg.in/yaml.v3 v3.0.1 // 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-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/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 + 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..bfe69d1 100644 --- a/go.sum +++ b/go.sum @@ -1,108 +1,321 @@ +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/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= +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/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs= +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.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/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= +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.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= -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/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= +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/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= +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/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= +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/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/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/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY= -github.com/creasty/defaults v1.7.0 h1:eNdqZvc5B509z18lD8yc212CAqJNvfT1Jq6L8WowdBA= -github.com/creasty/defaults v1.7.0/go.mod h1:iGzKe6pbEHnpMPtfDXZEr0NVxWnPTjb1bbDy08fPzYM= +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/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.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.24 h1:bJrF4RRfyJnbTJqzRLHzcGaZK1NeM5kTC9jGgovnR1s= +github.com/creack/pty v1.1.24/go.mod h1:08sCNb52WyoAwi2QDyzUCTgcvVFhUzewun7wtTfvcwE= 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/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/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk= +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 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= +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.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.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY= github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto= -github.com/ecordell/optgen v0.0.9 h1:kmRMqOkbNsWayOnZSk2m5SeGaOTOc7amfi+MAnaMOeI= -github.com/ecordell/optgen v0.0.9/go.mod h1:+YZ4tk5pNGMoeH+Y4F4HeDDj0SLOlIgMMNae7az4h5g= +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/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/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/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= +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.19.0 h1:Zp3PiM21/9Ld6FzSKyL5c/BULoe/ONr9KlbYVOfG8+w= +github.com/fatih/color v1.19.0/go.mod h1:zNk67I0ZUT1bEGsSGyCZYZNrHuTkJJB+r6Q9VuMi0LE= 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/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/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.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= -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-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-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-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= -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/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= -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/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/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= +github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= +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.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.1 h1:OptwRhECazUx5ix5TTWC3EZhsZEHWcYWY4FQHTIubm4= -github.com/golang/glog v1.2.1/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,479 +324,705 @@ 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.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/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI= +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/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/css v1.0.0/go.mod h1:Dn721qIggHpt4+EFCcTLTU/vk5ySda2ReITrtgBl60c= +github.com/gordonklaus/ineffassign v0.2.0 h1:Uths4KnmwxNJNzq87fwQQDDnbNb7De00VOk9Nu0TySs= +github.com/gordonklaus/ineffassign v0.2.0/go.mod h1:TIpymnagPSexySzs7F9FnO1XFTy8IT3a59vmZp5Y9Lw= 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.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-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/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= -github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +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.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= +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/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.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/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ= -github.com/joho/godotenv v1.4.0/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4= -github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8= +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= +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= +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/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/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.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= github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI= github.com/knadh/koanf/parsers/json v0.1.0 h1:dzSZl5pf5bBcW0Acnu20Djleto19T0CfHcvZ14NJ6fU= 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= -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/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/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-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-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/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= +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/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-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= +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.14 h1:9A9LHSqF/7dyVVX6g0U9cwm9pG3kP9gSzcuIPHPsaIE= +github.com/mattn/go-colorable v0.1.14/go.mod h1:6LmQG8QLFO4G5z1gPvYEzlUgJ2wF+stgPZH1UqBm1s8= +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/goveralls v0.0.12 h1:PEEeF0k1SsTjOBQ8FOmrOAoCu4ytuMaWCnWe94zxbCg= github.com/mattn/goveralls v0.0.12/go.mod h1:44ImGEUfmqH8bBtaMrYKsM65LXfNLWmwaxFGjZwgMSQ= -github.com/microcosm-cc/bluemonday v1.0.20/go.mod h1:yfBmMi8mxvaZut3Yytv+jTXRY8mxyjJ0/kQBTElld50= +github.com/mgechev/revive v1.15.0 h1:vJ0HzSBzfNyPbHKolgiFjHxLek9KUijhqh42yGoqZ8Q= +github.com/mgechev/revive v1.15.0/go.mod h1:LlAKO3QQe9OJ0pVZzI2GPa8CbXGZ/9lNpCGvK4T/a8A= 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/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= -github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +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/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= +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/nyaruka/phonenumbers v1.1.1 h1:fyoZmpLN2VCmAnc51XcrNOUVP2wT1ZzQl348ggIaXII= -github.com/nyaruka/phonenumbers v1.1.1/go.mod h1:cGaEsOrLjIL0iKGqJR5Rfywy86dSkbApEpXuM9KySNA= +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.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= +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.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= +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= -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/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI= -github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= -github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +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= +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/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= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/prometheus/client_golang v1.19.0 h1:ygXvpU1AoN1MhdzckN+PyD9QJOSD4x7kmXYlnfbA6JU= -github.com/prometheus/client_golang v1.19.0/go.mod h1:ZRM9uEAypZakd+q/x7+gmsvXdURP+DABIEIjnmDdp+k= +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.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/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/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/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= +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/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.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/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/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/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +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.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= +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/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/sergi/go-diff v1.2.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -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/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.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/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/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/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/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/sonatard/noctx v0.5.1 h1:wklWg9c9ZYugOAk7qG4yP4PBrlQsmSLPTvW1K4PRQMs= +github.com/sonatard/noctx v0.5.1/go.mod h1:64XdbzFb18XL4LporKXp8poqZtPKbCrqQ402CV+kJas= +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/spf13/afero v1.15.0 h1:b/YBCLWAJdFWJTN9cLhiXXcD7mzKn9Dm86dNnfyQw1I= +github.com/spf13/afero v1.15.0/go.mod h1:NC2ByUVxtQs4b3sIUphxK0NioZnmxgyCrfzeuq8lxMg= +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/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ= -github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk= +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.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.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.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= +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.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= +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/zenazn/goji v0.9.0/go.mod h1:7S9M489iMyHBNxwZnk9/EHS098H4/F6TATF2mIxtB1Q= -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/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= +github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0= +github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +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.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.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/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.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/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/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.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.24.0 h1:mnl8DM0o513X8fdIkmyFE/5hTYxbwYOjDS/+rK6qpRI= -golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5DM= +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-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= +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= 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= 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.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= 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= 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-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/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.26.0 h1:soB7SVo0PWrY4vPW/+ay0jKDNScG2X9wFeYlXIvJsOQ= -golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= +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.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= 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= -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= +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-20210630005230-0f9fa26af87c/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-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.21.0 h1:rF+pYz3DAGSQAxAu1CbC7catZg4ebC4UIeIhKxBZvws= -golang.org/x/sys v0.21.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= +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-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= golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +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= -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= 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.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= 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= 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/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/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-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.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-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-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.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.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= 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= +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/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/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/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..38a75a0 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,34 +58,34 @@ 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) { +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]}` 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) 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. @@ -108,27 +107,32 @@ 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 } -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 } 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) if err != nil { - if errors.Is(err, types.RadosErrorNotFound) { + if errors.Is(err, types.ErrRadosNotFound) { return nil, types.ErrNotFound } 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) { @@ -138,7 +142,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..8494c20 100644 --- a/pkg/api/grpc_http_gateway.go +++ b/pkg/api/grpc_http_gateway.go @@ -14,14 +14,27 @@ 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 { - 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..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{ @@ -94,6 +102,7 @@ func roleToPb(r user.Role) *pb.Role { Name: r.Name, Description: r.Description, ScopesPermissions: permissions, + System: r.IsSystem, } } @@ -112,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) { @@ -134,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 } @@ -145,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 { - var expIn int = int(req.PwdExpirationDate.Seconds) + 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) { @@ -211,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 } @@ -225,12 +240,15 @@ 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) + 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/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.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/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/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..925a7bb 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, @@ -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/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/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..2ce11b9 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 @@ -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/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..b985610 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 @@ -6,7 +6,6 @@ import ( "github.com/ceph/go-ceph/rados" ) -const ( - // ErrNotFound is returned when an object is not found. - RadosErrorNotFound = rados.ErrNotFound +var ( + ErrRadosNotFound = rados.ErrNotFound ) diff --git a/pkg/types/ceph_errors_mock.go b/pkg/types/ceph_errors_mock.go index 719af25..5d3598f 100644 --- a/pkg/types/ceph_errors_mock.go +++ b/pkg/types/ceph_errors_mock.go @@ -1,10 +1,9 @@ -//go:build mock +//go:build !cgo 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/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/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 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..471dfbf 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.26-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..3eb8aed 100644 --- a/test/cluster_api_test.go +++ b/test/cluster_api_test.go @@ -1,3 +1,5 @@ +//go:build cgo + package test import ( @@ -44,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) @@ -69,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) diff --git a/test/cluster_parity_test.go b/test/cluster_parity_test.go new file mode 100644 index 0000000..4e6cc89 --- /dev/null +++ b/test/cluster_parity_test.go @@ -0,0 +1,103 @@ +//go:build cgo + +package test + +import ( + "net/http" + "testing" + + "github.com/clyso/ceph-api/test/parity" + "github.com/stretchr/testify/require" +) + +// /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: clusterStatusAccept} + put := parity.Call{ + Method: "PUT", Path: "/api/cluster", + Body: map[string]string{"status": "POST_INSTALLED"}, + Accept: clusterStatusAccept, + } + + for _, b := range r.Backends(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) { + resp, _ := r.DoRecord(b, put) + require.True(t, resp.StatusCode/100 == 2, "%s: put cluster status: status %d", b, resp.StatusCode) + } + + t.Cleanup(func() { + r.Do(parity.Ours, parity.Call{ + Method: "PUT", Path: "/api/cluster", + Body: map[string]string{"status": "INSTALLED"}, + 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: clusterStatusAccept} + for _, b := range r.Backends(call) { + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: config search: status %d", b, resp.StatusCode) + } +} + +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{ + "import_data": importData, + } + updateBody := map[string]any{ + "user_entity": entity, + "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: 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: clusterUserAccept, + } + + r.Do(parity.Ours, del) + t.Cleanup(func() { r.Do(parity.Ours, del) }) + + for _, b := range r.Backends(list) { + 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) + 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_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/crush_rule_parity_test.go b/test/crush_rule_parity_test.go new file mode 100644 index 0000000..e646cc7 --- /dev/null +++ b/test/crush_rule_parity_test.go @@ -0,0 +1,69 @@ +//go:build cgo + +package test + +import ( + "net/http" + "testing" + + "github.com/clyso/ceph-api/test/parity" + "github.com/stretchr/testify/require" +) + +// 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: crushRuleReadAccept} + for _, b := range r.Backends(call) { + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: list crush rules: status %d", b, resp.StatusCode) + } +} + +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: crushRuleReadAccept, + } + for _, b := range r.Backends(get) { + resp, _ := r.DoRecord(b, get) + require.True(t, resp.StatusCode/100 == 2, "%s: get crush rule: status %d", b, resp.StatusCode) + } +} + +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: crushRuleWriteAccept} + del := parity.Call{ + Method: "DELETE", Path: "/api/crush_rule/{name}", + PathParams: map[string]string{"name": name}, Accept: crushRuleWriteAccept, + } + + 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/init_test.go b/test/init_test.go deleted file mode 100644 index 7d4545c..0000000 --- a/test/init_test.go +++ /dev/null @@ -1,119 +0,0 @@ -package test - -import ( - "context" - "crypto/tls" - "fmt" - "net" - "os" - "strconv" - "strings" - "testing" - "time" - - cephapi "github.com/clyso/ceph-api" - "github.com/clyso/ceph-api/pkg/app" - "github.com/clyso/ceph-api/pkg/config" - "google.golang.org/grpc" - "google.golang.org/grpc/credentials" -) - -var ( - conf config.Config - grpcAddr string - httpAddr string - tstCtx context.Context - grpcConn *grpc.ClientConn - admConn *grpc.ClientConn -) - -const ( - admin = "ceph-e2e-test-admin" - pass = "ceph-e2e-test-pass" -) - -func TestMain(m *testing.M) { - err := config.Get(&conf) - if err != nil { - panic(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 - conf.App.BcryptPwdCost = 4 - - ctx, cancel := context.WithCancel(context.Background()) - defer cancel() - tstCtx = ctx - go func() { - appCtx, cancelFn := context.WithCancel(ctx) - defer cancelFn() - err = app.Start(appCtx, conf, config.Build{Version: "test"}) - if err != nil { - panic(err) - } - }() - grpcAddr = fmt.Sprintf("localhost:%d", conf.Api.GrpcPort) - if conf.Api.Secure { - httpAddr = fmt.Sprintf("https://localhost:%d", conf.Api.HttpPort) - } else { - httpAddr = fmt.Sprintf("http://localhost:%d", conf.Api.HttpPort) - } - fmt.Println("http", httpAddr) - fmt.Println("grpc", grpcAddr) - - tlsOpt := grpc.WithInsecure() - if conf.Api.Secure { - tlsOpt = grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{InsecureSkipVerify: true})) - } - grpcConn, err = grpc.DialContext(ctx, grpcAddr, - tlsOpt, - grpc.WithBackoffMaxDelay(time.Second), - grpc.WithBlock(), - ) - if err != nil { - panic(err) - } - - c, err := cephapi.New(tstCtx, cephapi.ClientConfig{ - GrpcUrl: grpcAddr, - HttpUrl: httpAddr, - Login: admin, - Password: pass, - }) - if err != nil { - panic(err) - } - admConn = c.Conn() - exitCode := m.Run() - cancel() - grpcConn.Close() - c.Close() - // exit - os.Exit(exitCode) -} - -func getRandomPort() (int, string) { - l, err := net.Listen("tcp", "localhost:0") - if err != nil { - panic(err) - } - addr := l.Addr().String() - addrs := strings.Split(addr, ":") - err = l.Close() - if err != nil { - panic(err) - } - - port, err := strconv.Atoi(addrs[len(addrs)-1]) - if err != nil { - panic(err) - } - return port, addr -} 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/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. 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..4defd25 --- /dev/null +++ b/test/parity/api_diff.yaml @@ -0,0 +1,21 @@ +# Declared divergences between the ceph dashboard and ceph-api response +# bodies. Keys are endpoint ids in the form " " +# (as in api/http.yaml); values are lists of JSONPath ignores with +# mandatory `reason:` strings. +# +# 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. 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. +# +# **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/client.go b/test/parity/client.go new file mode 100644 index 0000000..ab37421 --- /dev/null +++ b/test/parity/client.go @@ -0,0 +1,109 @@ +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) + } + } + if c.Token != "" { + 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..c20d95d --- /dev/null +++ b/test/parity/diff.go @@ -0,0 +1,294 @@ +package parity + +import ( + "fmt" + "reflect" + "slices" + "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 { + 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) { + // 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) { + return []Diff{{Path: pathStr(path), Kind: "value", Expected: expected, Actual: actual}} + } + return nil + } +} + +// 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 + 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: + // 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 + } + 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..97e4f93 --- /dev/null +++ b/test/parity/diff_test.go @@ -0,0 +1,210 @@ +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) { + // 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) + } +} + +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_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"}`) + 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/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 new file mode 100644 index 0000000..eae4720 --- /dev/null +++ b/test/parity/recorder.go @@ -0,0 +1,600 @@ +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 + noAuth *Client + noPerm *Client + routes *RouteSet // from api/http.yaml + dashRts *RouteSet // from dashboard openapi.yaml + ignores map[string][]Ignore + } + + coverageMu sync.Mutex + coverage = map[string]bool{} +) + +// 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) + } + 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) + } + 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 + 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 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 []Backend{Ours} + } + return Backends +} + +// 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, nil) +} + +// 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() + 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 +// 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() + 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) { + 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 := 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) + } + + 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)) + } +} + +// 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 + } + 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() + ignoresByEndpoint := state.ignores + 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 + } + + // `$` 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 + } + 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 := 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", + 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]) + "..." +} + +// 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/setup_cgo_test.go b/test/setup_cgo_test.go new file mode 100644 index 0000000..f7fa582 --- /dev/null +++ b/test/setup_cgo_test.go @@ -0,0 +1,250 @@ +//go:build cgo + +package test + +import ( + "context" + "crypto/tls" + "fmt" + "net" + "net/http" + "os" + "strconv" + "strings" + "testing" + "time" + + 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" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" +) + +var ( + conf config.Config + grpcAddr string + httpAddr string + tstCtx context.Context + grpcConn *grpc.ClientConn + 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) { + bootCtx, bootCancel := context.WithTimeout(context.Background(), 5*time.Minute) + defer bootCancel() + + env, err := testenv.NewCephEnv(bootCtx) + if err != nil { + 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 + conf.App.BcryptPwdCost = 4 + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + tstCtx = ctx + + appReady := make(chan error, 1) + go func() { + appCtx, cancelFn := context.WithCancel(ctx) + defer cancelFn() + 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) + } else { + httpAddr = fmt.Sprintf("http://localhost:%d", conf.Api.HttpPort) + } + fmt.Println("http", httpAddr) + fmt.Println("grpc", grpcAddr) + + 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.NewClient(grpcAddr, + tlsOpt, + grpc.WithConnectParams(grpc.ConnectParams{Backoff: backoff.DefaultConfig, MinConnectTimeout: time.Second}), + ) + if err != nil { + return 1, fmt.Errorf("dial grpc: %w", err) + } + + c, err := cephapi.New(tstCtx, cephapi.ClientConfig{ + GrpcUrl: grpcAddr, + HttpUrl: httpAddr, + Login: admin, + Password: pass, + }) + if err != nil { + return 1, fmt.Errorf("authenticate admin: %w", err) + } + 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. + 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(tstCtx, parityDash, parityOurs, loginAccept, 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() + + 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 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 { + panic(err) + } + addr := l.Addr().String() + addrs := strings.Split(addr, ":") + if err := l.Close(); err != nil { + panic(err) + } + port, err := strconv.Atoi(addrs[len(addrs)-1]) + if err != nil { + panic(err) + } + return port, addr +} diff --git a/test/setup_nocgo_test.go b/test/setup_nocgo_test.go new file mode 100644 index 0000000..7f4f6d3 --- /dev/null +++ b/test/setup_nocgo_test.go @@ -0,0 +1,14 @@ +//go:build !cgo + +package test + +import ( + "fmt" + "os" + "testing" +) + +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..e562c2a --- /dev/null +++ b/test/status_parity_test.go @@ -0,0 +1,60 @@ +//go:build cgo + +package test + +import ( + "testing" + + "github.com/clyso/ceph-api/test/parity" + "github.com/stretchr/testify/require" +) + +// /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) { + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: %s %s: status %d", b, call.Method, call.Path, resp.StatusCode) + } +} + +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) { + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: %s %s: status %d", b, call.Method, call.Path, resp.StatusCode) + } +} + +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) { + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: %s %s: status %d", b, call.Method, call.Path, resp.StatusCode) + } +} + +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) { + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: %s %s: status %d", b, call.Method, call.Path, resp.StatusCode) + } +} + +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) { + 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/status_test.go b/test/status_test.go index 639475f..829edb7 100644 --- a/test/status_test.go +++ b/test/status_test.go @@ -1,3 +1,5 @@ +//go:build cgo + package test import ( @@ -121,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) } @@ -175,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.") @@ -222,7 +221,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..3d274a8 --- /dev/null +++ b/test/testenv/ceph.go @@ -0,0 +1,443 @@ +// Package testenv brings up a real Ceph cluster in Docker for e2e tests. +package testenv + +import ( + "bytes" + "context" + "fmt" + "io" + "net" + "net/netip" + "os" + "path/filepath" + "strings" + "time" + + 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" +) + +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" +) + +var ( + networkSubnetPrefix = netip.MustParsePrefix(networkSubnet) + networkGatewayAddr = netip.MustParseAddr(networkGateway) + monIPAddr = netip.MustParseAddr(MonIP) +) + +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: networkSubnetPrefix, Gateway: networkGatewayAddr}, + }, + }), + ) + 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: monIPAddr}, + Aliases: []string{"ceph"}, + } + }, + HostConfigModifier: func(hc *mobycontainer.HostConfig) { + hc.Privileged = true + }, + ConfigModifier: func(cfg *mobycontainer.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(): + 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 { + 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, 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 +} + +// 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) { + 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..2b4cba5 --- /dev/null +++ b/test/testenv/tid.go @@ -0,0 +1,203 @@ +package testenv + +import ( + "context" + "flag" + "fmt" + "os" + "os/exec" + "path/filepath" + "strings" + + "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" +) + +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 *mobycontainer.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.New(client.FromEnv) + 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.ExecCreate(ctx, containerID, client.ExecCreateOptions{ + 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.ExecAttach(ctx, execResp.ID, client.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.ExecInspect(ctx, execResp.ID, client.ExecInspectOptions{}) + 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/test/users_parity_test.go b/test/users_parity_test.go new file mode 100644 index 0000000..563818f --- /dev/null +++ b/test/users_parity_test.go @@ -0,0 +1,194 @@ +//go:build cgo + +package test + +import ( + "context" + "net/http" + "testing" + + "github.com/clyso/ceph-api/test/parity" + "github.com/clyso/ceph-api/test/testenv" + "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) { + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: list users: status %d", b, resp.StatusCode) + } +} + +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": testenv.DashboardUser}, + Accept: userAccept, + } + for _, b := range r.Backends(get) { + resp, _ := r.DoRecord(b, get) + require.True(t, resp.StatusCode/100 == 2, "%s: get user: status %d", b, resp.StatusCode) + } +} + +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, + "pwdUpdateRequired": true, + } + 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) + 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) + } +} + +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) { + resp, _ := r.DoRecord(b, call) + require.True(t, resp.StatusCode/100 == 2, "%s: list roles: status %d", b, resp.StatusCode) + } +} + +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) { + resp, _ := r.DoRecord(b, get) + require.True(t, resp.StatusCode/100 == 2, "%s: get role: status %d", b, resp.StatusCode) + } +} + +func Test_Parity_Role_CRUD(t *testing.T) { + r := parity.New(t) + + const name = "parity-role" + 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} + + 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) + 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) + } +} + +// 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: srcPP, + QueryParams: map[string]string{"new_name": cloneName}, + 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, delSrc) + t.Cleanup(func() { + r.Do(parity.Ours, delClone) + r.Do(parity.Ours, delSrc) + }) + + 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) { + resp, _ := r.DoRecord(b, clone) + require.True(t, resp.StatusCode/100 == 2, "%s: clone role: status %d", b, resp.StatusCode) + } +} 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