From 311b115349b56b322899f88e2637feeb4af19905 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Sun, 20 Sep 2026 16:05:39 -0500 Subject: [PATCH 1/5] feat: add September monitoring and automation SDK APIs --- README.md | 4 + docs/API_SURFACE.md | 23 + docs/OBSERVABILITY.md | 113 + gen/go/aes/iam/v1/automation.pb.go | 3065 ++++ gen/go/aes/iam/v1/iam.pb.go | 1174 +- .../iam/v1/iamv1connect/automation.connect.go | 664 + gen/go/aes/monitoring/v1/alerts.pb.go | 3536 +++++ gen/go/aes/monitoring/v1/monitoring.pb.go | 1428 ++ .../v1/monitoringv1connect/alerts.connect.go | 575 + .../monitoringv1connect/monitoring.connect.go | 254 + gen/go/aes/support/v1/support.pb.go | 169 +- .../v1/supportv1connect/support.connect.go | 6 +- gen/go/aes/webhooks/v1/webhooks.pb.go | 335 +- .../v1/webhooksv1connect/webhooks.connect.go | 41 +- gen/openapi/metalhost.openapi.yaml | 13158 ++++++++++------ metalhost/monitoring.go | 40 + metalhost/monitoring_test.go | 27 + metalhost/webhook.go | 84 + metalhost/webhook_test.go | 61 + proto/aes/iam/v1/automation.proto | 230 + proto/aes/iam/v1/iam.proto | 31 + proto/aes/monitoring/v1/alerts.proto | 298 + proto/aes/monitoring/v1/monitoring.proto | 118 + proto/aes/support/v1/support.proto | 26 +- proto/aes/webhooks/v1/webhooks.proto | 20 + scripts/sync-api-snapshot.sh | 1 + 26 files changed, 20051 insertions(+), 5430 deletions(-) create mode 100644 docs/OBSERVABILITY.md create mode 100644 gen/go/aes/iam/v1/automation.pb.go create mode 100644 gen/go/aes/iam/v1/iamv1connect/automation.connect.go create mode 100644 gen/go/aes/monitoring/v1/alerts.pb.go create mode 100644 gen/go/aes/monitoring/v1/monitoring.pb.go create mode 100644 gen/go/aes/monitoring/v1/monitoringv1connect/alerts.connect.go create mode 100644 gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go create mode 100644 metalhost/monitoring.go create mode 100644 metalhost/monitoring_test.go create mode 100644 metalhost/webhook.go create mode 100644 metalhost/webhook_test.go create mode 100644 proto/aes/iam/v1/automation.proto create mode 100644 proto/aes/monitoring/v1/alerts.proto create mode 100644 proto/aes/monitoring/v1/monitoring.proto diff --git a/README.md b/README.md index 5175dbf..895387f 100644 --- a/README.md +++ b/README.md @@ -54,6 +54,10 @@ func check(ctx context.Context) error { Generated service constructors and request/response types remain the primary SDK surface; the helper does not hide authorization, validation, pagination, operations, or billing behavior. +For the coordinated, unreleased September APIs, see [Observability](docs/OBSERVABILITY.md): +scoped automation/GitHub identity, monitoring endpoints, Grafana, alerts, and +timestamped webhook verification with overlapping rotation. + ## Keep the API snapshot synchronized Install pinned generation tools once: diff --git a/docs/API_SURFACE.md b/docs/API_SURFACE.md index 67422b1..97cb1b7 100644 --- a/docs/API_SURFACE.md +++ b/docs/API_SURFACE.md @@ -15,6 +15,8 @@ The released snapshot includes: - compute and SSH keys - health - IAM +- scoped automation credentials, project service accounts, and GitHub workload identity +- monitoring metrics, alert rules, verified destinations, incidents, and delivery tests - network - operations - projects and organizations @@ -67,3 +69,24 @@ Compute exposes whole-VM backup capture and restore, including captured disk manifests and consistency. Storage exposes single-disk backup CRUD, disk restore via `from_snapshot`, and automatic backup schedules with keep-N retention. See [Backups API](BACKUPS.md) for retry, billing, timing, and restore semantics. + +## September observability (unreleased) + +The new `AutomationService`, `MonitoringService`, and `AlertService` contracts +require the coordinated September backend release with automation and monitoring +enabled. Existing IAM keys and sessions are unchanged. + +Creation/rotation requests accept a client UUID `request_id`. Retain the exact +request on an ambiguous retry. Credential retries return the same credential's +current metadata with `secret_unavailable=true`; no secret is stored for replay. +Revoke a recovered key whose original secret was lost before creating another. + +Rule, destination, and incident mutations also carry a stable request ID and +optimistic revision where applicable. A successful save is not confirmation that +the native evaluator has applied it; inspect desired/applied revision and health. +Queued delivery is not provider acceptance, and provider acceptance is not proof +that a recipient read a notification. Missing data is never healthy zero usage. + +Hosted PromQL and Prometheus scrape endpoints are ordinary authenticated HTTP +interfaces, not Connect RPCs. Use a project-scoped `monitoring.read` credential; +the server derives immutable tenant identity and does not trust tenant headers. diff --git a/docs/OBSERVABILITY.md b/docs/OBSERVABILITY.md new file mode 100644 index 0000000..d4ca048 --- /dev/null +++ b/docs/OBSERVABILITY.md @@ -0,0 +1,113 @@ +# September observability (unreleased) + +These contracts require the coordinated September backend release, enabled +automation/monitoring features and provisioned telemetry storage. A generated +client or successful save does not prove the deployment has enabled a feature. +The APIs preserve existing browser sessions, legacy keys and billing behavior. + +## Credentials and GitHub Actions + +Use `aes.iam.v1.AutomationService` for project service accounts, explicit +capabilities, expiring keys and GitHub trusts. Shared automation should use a +service account; personal keys are appropriate for individual local tooling. +`monitoring.read` permits metric reads, not VM changes or alert management. +Trust permissions are intersected with the service account's current grants. + +Retain a UUID `request_id` and the exact request through ambiguous creation or +rotation failures. `secret_unavailable` means the request already committed; +the API returns metadata, never the original secret. Inspect/revoke that key +before creating another. Overlap rotation is explicit and bounded to 24 hours. +Legacy IAM rotation retains its original immediate-revocation semantics. + +For keyless GitHub Actions, use the customer portal's signed workflow-discovery +flow and approve the observed immutable repository/owner and workflow identity. +Do not trust a repository name alone. The workflow needs `id-token: write`; +assertions must match the deployment's configured audience and fixed GitHub +issuer. Pull-request events are not permitted. The exchanged token lasts 15 +minutes, has no refresh token, and can only use its configured project/grants. +Prefer the CLI's `auth github -- COMMAND`; it masks tokens and supplies the +short-lived credential only to the child environment, not a config file or +GitHub artifact. Long jobs need a fresh assertion/exchange. + +## Metrics, Grafana and Prometheus + +`Config.MonitoringEndpoints(project)` validates the API origin and canonical +project name and returns: + +- `Prometheus`: Grafana datasource base; append `/api/v1/query` or + `/api/v1/query_range` for direct PromQL requests. +- `ScrapeTargets`: authenticated Prometheus HTTP service discovery. +- `Metrics`: one scrape shard; prefer discovery for automatic project sizing. + +Use HTTPS with `Authorization: Bearer `. +Never supply `X-Scope-OrgID`; the gateway derives tenant identity from current +authorization. Endpoint construction itself does not authorize access. + +Grafana uses a Prometheus datasource (Mimir 3.2.1 compatibility), 30-second +minimum interval and 10-second query timeout. Store the key in +`secureJsonData.httpHeaderValue1`, not dashboard JSON. Download the Metalhost VM +dashboard from the portal's Monitoring → Integrations page. Data-source-managed +rule administration is not exposed; create managed alerts through Metalhost's +structured rule API. Customer Grafana-managed alerts query the read API and +remain subject to its budgets. + +Prometheus should use authenticated HTTP discovery and scraping, a 60-second +interval, 10-second timeout, and `honor_timestamps: true`. Both discovery and +scraping need `authorization.credentials_file`. Keep the credential file mode +0600. The exporter omits expired samples instead of refreshing old observations. + +The initial hosted limit is seven days, minimum 30-second query steps, 10,000 +points/series budget, four concurrent queries per project and a 4-MiB response +cap. Narrow queries on 422; back off on 429; show an unavailable state on service +failure. Empty, unsupported and stale metrics are not zero or proof of health. +Use `MonitoringService` for typed metric descriptors, VM summaries and curated +chart responses with per-family quality. Metric samples are never invoices. + +## Alerts and destinations + +`AlertService` manages structured rules, current/future VM selections, previews, +incidents, verified destinations and explicit test deliveries. Rules reconcile +asynchronously: check desired/applied version and evaluation health after save. +Current-sample preview is not a historical simulation or delivery guarantee. +Acknowledging or snoozing an incident does not resolve it. A missing metric or +collector outage must not manufacture recovery. + +Select existing project-member or webhook rows as destinations. Email needs +recipient verification; destination pause stops future sending without changing +incident history. `TestAlertDestination` is an explicit external send with a +stable request UUID; poll `GetDestinationTest`. The latest retained result is +also returned by `ListAlertDestinations`. `SENT` means provider/endpoint +acceptance, not that a person read it. + +## Verify and rotate webhook signatures + +The payload is at-least-once. Deduplicate its stable event IDs durably. Grouped +payloads contain at most 100 detailed events but enumerate every included event +ID; follow incident IDs for the full state rather than assuming details are +complete. The stable delivery ID is reused for identical group retries; a +different attempt UUID is generated on each HTTP request. + +Use `metalhost.VerifyWebhook(headers, rawBody, secret, time.Now())` before +decoding the JSON. Limit bodies to 1 MiB before reading them, reject invalid +signatures and keep a trustworthy clock. The verifier authenticates +`timestamp.deliveryID.attemptID.rawBody` with HMAC-SHA256 and checks a five-minute +clock/replay window. It does not implement durable deduplication for you. It +never falls back to the legacy untimestamped header. + +`WebhooksService.RotateSubscriptionSecret` requires the current secret version +and a stable request UUID. A successful original call returns one new secret; +retry recovery returns metadata plus `secret_unavailable`. Select immediate +rotation to invalidate both older keys if a secret was lost or compromised. + +With a nonzero overlap (maximum 24 hours), `X-Metalhost-Signature-V2` contains +`t=,v2=,v2=`. Either secret can verify it during that +window. The original `X-Metalhost-Signature: sha256=` header +continues using the old key until overlap expires, then uses the new key. +Upgrade receivers to V2 before rotating; a legacy receiver cannot validate the +new key through the original header until overlap ends. A second overlapping +rotation is rejected while the first is active; immediate rotation is always +available with the current version. Expired keys never sign new attempts. + +Webhook endpoints must be public HTTPS; redirects/private-address destinations +are rejected. Test receivers must be explicitly approved fixtures. Never log +the signing secret, credential response or raw support/customer payload. diff --git a/gen/go/aes/iam/v1/automation.pb.go b/gen/go/aes/iam/v1/automation.pb.go new file mode 100644 index 0000000..6cd8d9a --- /dev/null +++ b/gen/go/aes/iam/v1/automation.pb.go @@ -0,0 +1,3065 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc (unknown) +// source: aes/iam/v1/automation.proto + +package iamv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type Capability struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Description string `protobuf:"bytes,3,opt,name=description,proto3" json:"description,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Capability) Reset() { + *x = Capability{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Capability) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Capability) ProtoMessage() {} + +func (x *Capability) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[0] + 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 Capability.ProtoReflect.Descriptor instead. +func (*Capability) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{0} +} + +func (x *Capability) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Capability) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *Capability) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type ListCapabilitiesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListCapabilitiesRequest) Reset() { + *x = ListCapabilitiesRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListCapabilitiesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListCapabilitiesRequest) ProtoMessage() {} + +func (x *ListCapabilitiesRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[1] + 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 ListCapabilitiesRequest.ProtoReflect.Descriptor instead. +func (*ListCapabilitiesRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{1} +} + +type ListCapabilitiesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Capabilities []*Capability `protobuf:"bytes,1,rep,name=capabilities,proto3" json:"capabilities,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListCapabilitiesResponse) Reset() { + *x = ListCapabilitiesResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListCapabilitiesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListCapabilitiesResponse) ProtoMessage() {} + +func (x *ListCapabilitiesResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[2] + 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 ListCapabilitiesResponse.ProtoReflect.Descriptor instead. +func (*ListCapabilitiesResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{2} +} + +func (x *ListCapabilitiesResponse) GetCapabilities() []*Capability { + if x != nil { + return x.Capabilities + } + return nil +} + +type ServiceAccount struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProjectName string `protobuf:"bytes,2,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Permissions []string `protobuf:"bytes,4,rep,name=permissions,proto3" json:"permissions,omitempty"` + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` + Version int64 `protobuf:"varint,6,opt,name=version,proto3" json:"version,omitempty"` + CreateTimeUnix int64 `protobuf:"varint,7,opt,name=create_time_unix,json=createTimeUnix,proto3" json:"create_time_unix,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ServiceAccount) Reset() { + *x = ServiceAccount{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ServiceAccount) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ServiceAccount) ProtoMessage() {} + +func (x *ServiceAccount) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ServiceAccount.ProtoReflect.Descriptor instead. +func (*ServiceAccount) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{3} +} + +func (x *ServiceAccount) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *ServiceAccount) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *ServiceAccount) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *ServiceAccount) GetPermissions() []string { + if x != nil { + return x.Permissions + } + return nil +} + +func (x *ServiceAccount) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *ServiceAccount) GetVersion() int64 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *ServiceAccount) GetCreateTimeUnix() int64 { + if x != nil { + return x.CreateTimeUnix + } + return 0 +} + +type CreateServiceAccountRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Permissions []string `protobuf:"bytes,3,rep,name=permissions,proto3" json:"permissions,omitempty"` + RequestId string `protobuf:"bytes,4,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateServiceAccountRequest) Reset() { + *x = CreateServiceAccountRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateServiceAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateServiceAccountRequest) ProtoMessage() {} + +func (x *CreateServiceAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[4] + 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 CreateServiceAccountRequest.ProtoReflect.Descriptor instead. +func (*CreateServiceAccountRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{4} +} + +func (x *CreateServiceAccountRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *CreateServiceAccountRequest) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *CreateServiceAccountRequest) GetPermissions() []string { + if x != nil { + return x.Permissions + } + return nil +} + +func (x *CreateServiceAccountRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type CreateServiceAccountResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ServiceAccount *ServiceAccount `protobuf:"bytes,1,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateServiceAccountResponse) Reset() { + *x = CreateServiceAccountResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateServiceAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateServiceAccountResponse) ProtoMessage() {} + +func (x *CreateServiceAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[5] + 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 CreateServiceAccountResponse.ProtoReflect.Descriptor instead. +func (*CreateServiceAccountResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{5} +} + +func (x *CreateServiceAccountResponse) GetServiceAccount() *ServiceAccount { + if x != nil { + return x.ServiceAccount + } + return nil +} + +type GetServiceAccountRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetServiceAccountRequest) Reset() { + *x = GetServiceAccountRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetServiceAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetServiceAccountRequest) ProtoMessage() {} + +func (x *GetServiceAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[6] + 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 GetServiceAccountRequest.ProtoReflect.Descriptor instead. +func (*GetServiceAccountRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{6} +} + +func (x *GetServiceAccountRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetServiceAccountResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ServiceAccount *ServiceAccount `protobuf:"bytes,1,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetServiceAccountResponse) Reset() { + *x = GetServiceAccountResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetServiceAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetServiceAccountResponse) ProtoMessage() {} + +func (x *GetServiceAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[7] + 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 GetServiceAccountResponse.ProtoReflect.Descriptor instead. +func (*GetServiceAccountResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{7} +} + +func (x *GetServiceAccountResponse) GetServiceAccount() *ServiceAccount { + if x != nil { + return x.ServiceAccount + } + return nil +} + +type ListServiceAccountsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListServiceAccountsRequest) Reset() { + *x = ListServiceAccountsRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListServiceAccountsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListServiceAccountsRequest) ProtoMessage() {} + +func (x *ListServiceAccountsRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[8] + 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 ListServiceAccountsRequest.ProtoReflect.Descriptor instead. +func (*ListServiceAccountsRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{8} +} + +func (x *ListServiceAccountsRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *ListServiceAccountsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListServiceAccountsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type ListServiceAccountsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ServiceAccounts []*ServiceAccount `protobuf:"bytes,1,rep,name=service_accounts,json=serviceAccounts,proto3" json:"service_accounts,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListServiceAccountsResponse) Reset() { + *x = ListServiceAccountsResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListServiceAccountsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListServiceAccountsResponse) ProtoMessage() {} + +func (x *ListServiceAccountsResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_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 ListServiceAccountsResponse.ProtoReflect.Descriptor instead. +func (*ListServiceAccountsResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{9} +} + +func (x *ListServiceAccountsResponse) GetServiceAccounts() []*ServiceAccount { + if x != nil { + return x.ServiceAccounts + } + return nil +} + +func (x *ListServiceAccountsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +type UpdateServiceAccountRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Permissions []string `protobuf:"bytes,3,rep,name=permissions,proto3" json:"permissions,omitempty"` + ExpectedVersion int64 `protobuf:"varint,4,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateServiceAccountRequest) Reset() { + *x = UpdateServiceAccountRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateServiceAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateServiceAccountRequest) ProtoMessage() {} + +func (x *UpdateServiceAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[10] + 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 UpdateServiceAccountRequest.ProtoReflect.Descriptor instead. +func (*UpdateServiceAccountRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{10} +} + +func (x *UpdateServiceAccountRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateServiceAccountRequest) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *UpdateServiceAccountRequest) GetPermissions() []string { + if x != nil { + return x.Permissions + } + return nil +} + +func (x *UpdateServiceAccountRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +type UpdateServiceAccountResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ServiceAccount *ServiceAccount `protobuf:"bytes,1,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateServiceAccountResponse) Reset() { + *x = UpdateServiceAccountResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateServiceAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateServiceAccountResponse) ProtoMessage() {} + +func (x *UpdateServiceAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[11] + 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 UpdateServiceAccountResponse.ProtoReflect.Descriptor instead. +func (*UpdateServiceAccountResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{11} +} + +func (x *UpdateServiceAccountResponse) GetServiceAccount() *ServiceAccount { + if x != nil { + return x.ServiceAccount + } + return nil +} + +type SetServiceAccountStateRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // ACTIVE or DISABLED; a customer cannot clear a security LOCKED state. + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + ExpectedVersion int64 `protobuf:"varint,3,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SetServiceAccountStateRequest) Reset() { + *x = SetServiceAccountStateRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetServiceAccountStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetServiceAccountStateRequest) ProtoMessage() {} + +func (x *SetServiceAccountStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[12] + 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 SetServiceAccountStateRequest.ProtoReflect.Descriptor instead. +func (*SetServiceAccountStateRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{12} +} + +func (x *SetServiceAccountStateRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SetServiceAccountStateRequest) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *SetServiceAccountStateRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +type SetServiceAccountStateResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + ServiceAccount *ServiceAccount `protobuf:"bytes,1,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SetServiceAccountStateResponse) Reset() { + *x = SetServiceAccountStateResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetServiceAccountStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetServiceAccountStateResponse) ProtoMessage() {} + +func (x *SetServiceAccountStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[13] + 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 SetServiceAccountStateResponse.ProtoReflect.Descriptor instead. +func (*SetServiceAccountStateResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{13} +} + +func (x *SetServiceAccountStateResponse) GetServiceAccount() *ServiceAccount { + if x != nil { + return x.ServiceAccount + } + return nil +} + +type DeleteServiceAccountRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ExpectedVersion int64 `protobuf:"varint,2,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteServiceAccountRequest) Reset() { + *x = DeleteServiceAccountRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteServiceAccountRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteServiceAccountRequest) ProtoMessage() {} + +func (x *DeleteServiceAccountRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[14] + 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 DeleteServiceAccountRequest.ProtoReflect.Descriptor instead. +func (*DeleteServiceAccountRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{14} +} + +func (x *DeleteServiceAccountRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteServiceAccountRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +type DeleteServiceAccountResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteServiceAccountResponse) Reset() { + *x = DeleteServiceAccountResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteServiceAccountResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteServiceAccountResponse) ProtoMessage() {} + +func (x *DeleteServiceAccountResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[15] + 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 DeleteServiceAccountResponse.ProtoReflect.Descriptor instead. +func (*DeleteServiceAccountResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{15} +} + +type AutomationCredential struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Principal string `protobuf:"bytes,2,opt,name=principal,proto3" json:"principal,omitempty"` + ProjectName string `protobuf:"bytes,3,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + DisplayName string `protobuf:"bytes,4,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Permissions []string `protobuf:"bytes,5,rep,name=permissions,proto3" json:"permissions,omitempty"` + Kind string `protobuf:"bytes,6,opt,name=kind,proto3" json:"kind,omitempty"` + CreateTimeUnix int64 `protobuf:"varint,7,opt,name=create_time_unix,json=createTimeUnix,proto3" json:"create_time_unix,omitempty"` + ExpiresAtUnix int64 `protobuf:"varint,8,opt,name=expires_at_unix,json=expiresAtUnix,proto3" json:"expires_at_unix,omitempty"` + RevokedAtUnix int64 `protobuf:"varint,9,opt,name=revoked_at_unix,json=revokedAtUnix,proto3" json:"revoked_at_unix,omitempty"` + LastUsedAtUnix int64 `protobuf:"varint,10,opt,name=last_used_at_unix,json=lastUsedAtUnix,proto3" json:"last_used_at_unix,omitempty"` + RotatedAtUnix int64 `protobuf:"varint,11,opt,name=rotated_at_unix,json=rotatedAtUnix,proto3" json:"rotated_at_unix,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AutomationCredential) Reset() { + *x = AutomationCredential{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutomationCredential) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutomationCredential) ProtoMessage() {} + +func (x *AutomationCredential) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[16] + 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 AutomationCredential.ProtoReflect.Descriptor instead. +func (*AutomationCredential) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{16} +} + +func (x *AutomationCredential) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AutomationCredential) GetPrincipal() string { + if x != nil { + return x.Principal + } + return "" +} + +func (x *AutomationCredential) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *AutomationCredential) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *AutomationCredential) GetPermissions() []string { + if x != nil { + return x.Permissions + } + return nil +} + +func (x *AutomationCredential) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *AutomationCredential) GetCreateTimeUnix() int64 { + if x != nil { + return x.CreateTimeUnix + } + return 0 +} + +func (x *AutomationCredential) GetExpiresAtUnix() int64 { + if x != nil { + return x.ExpiresAtUnix + } + return 0 +} + +func (x *AutomationCredential) GetRevokedAtUnix() int64 { + if x != nil { + return x.RevokedAtUnix + } + return 0 +} + +func (x *AutomationCredential) GetLastUsedAtUnix() int64 { + if x != nil { + return x.LastUsedAtUnix + } + return 0 +} + +func (x *AutomationCredential) GetRotatedAtUnix() int64 { + if x != nil { + return x.RotatedAtUnix + } + return 0 +} + +type CreateCredentialRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + // Empty issues a personal credential; service accounts require project admin. + ServiceAccount string `protobuf:"bytes,2,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Permissions []string `protobuf:"bytes,4,rep,name=permissions,proto3" json:"permissions,omitempty"` + // Zero selects 90 days; otherwise between 15 minutes and one year from now. + ExpiresAtUnix int64 `protobuf:"varint,5,opt,name=expires_at_unix,json=expiresAtUnix,proto3" json:"expires_at_unix,omitempty"` + RequestId string `protobuf:"bytes,6,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateCredentialRequest) Reset() { + *x = CreateCredentialRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateCredentialRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateCredentialRequest) ProtoMessage() {} + +func (x *CreateCredentialRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[17] + 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 CreateCredentialRequest.ProtoReflect.Descriptor instead. +func (*CreateCredentialRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{17} +} + +func (x *CreateCredentialRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *CreateCredentialRequest) GetServiceAccount() string { + if x != nil { + return x.ServiceAccount + } + return "" +} + +func (x *CreateCredentialRequest) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *CreateCredentialRequest) GetPermissions() []string { + if x != nil { + return x.Permissions + } + return nil +} + +func (x *CreateCredentialRequest) GetExpiresAtUnix() int64 { + if x != nil { + return x.ExpiresAtUnix + } + return 0 +} + +func (x *CreateCredentialRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type CreateCredentialResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Credential *AutomationCredential `protobuf:"bytes,1,opt,name=credential,proto3" json:"credential,omitempty"` + // Returned once, never persisted in plaintext. + Secret string `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"` + // A repeated request returns current metadata, never the original secret. + SecretUnavailable bool `protobuf:"varint,3,opt,name=secret_unavailable,json=secretUnavailable,proto3" json:"secret_unavailable,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateCredentialResponse) Reset() { + *x = CreateCredentialResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateCredentialResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateCredentialResponse) ProtoMessage() {} + +func (x *CreateCredentialResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[18] + 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 CreateCredentialResponse.ProtoReflect.Descriptor instead. +func (*CreateCredentialResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{18} +} + +func (x *CreateCredentialResponse) GetCredential() *AutomationCredential { + if x != nil { + return x.Credential + } + return nil +} + +func (x *CreateCredentialResponse) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +func (x *CreateCredentialResponse) GetSecretUnavailable() bool { + if x != nil { + return x.SecretUnavailable + } + return false +} + +type ListCredentialsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + ServiceAccount string `protobuf:"bytes,2,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListCredentialsRequest) Reset() { + *x = ListCredentialsRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListCredentialsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListCredentialsRequest) ProtoMessage() {} + +func (x *ListCredentialsRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[19] + 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 ListCredentialsRequest.ProtoReflect.Descriptor instead. +func (*ListCredentialsRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{19} +} + +func (x *ListCredentialsRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *ListCredentialsRequest) GetServiceAccount() string { + if x != nil { + return x.ServiceAccount + } + return "" +} + +func (x *ListCredentialsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListCredentialsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type ListCredentialsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Credentials []*AutomationCredential `protobuf:"bytes,1,rep,name=credentials,proto3" json:"credentials,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListCredentialsResponse) Reset() { + *x = ListCredentialsResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListCredentialsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListCredentialsResponse) ProtoMessage() {} + +func (x *ListCredentialsResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[20] + 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 ListCredentialsResponse.ProtoReflect.Descriptor instead. +func (*ListCredentialsResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{20} +} + +func (x *ListCredentialsResponse) GetCredentials() []*AutomationCredential { + if x != nil { + return x.Credentials + } + return nil +} + +func (x *ListCredentialsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +type RotateCredentialRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Zero revokes immediately; otherwise overlap is capped at 24h and old expiry. + OverlapSeconds int32 `protobuf:"varint,2,opt,name=overlap_seconds,json=overlapSeconds,proto3" json:"overlap_seconds,omitempty"` + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotateCredentialRequest) Reset() { + *x = RotateCredentialRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotateCredentialRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateCredentialRequest) ProtoMessage() {} + +func (x *RotateCredentialRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[21] + 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 RotateCredentialRequest.ProtoReflect.Descriptor instead. +func (*RotateCredentialRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{21} +} + +func (x *RotateCredentialRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RotateCredentialRequest) GetOverlapSeconds() int32 { + if x != nil { + return x.OverlapSeconds + } + return 0 +} + +func (x *RotateCredentialRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type RotateCredentialResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Credential *AutomationCredential `protobuf:"bytes,1,opt,name=credential,proto3" json:"credential,omitempty"` + Secret string `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"` + PreviousExpiresAtUnix int64 `protobuf:"varint,3,opt,name=previous_expires_at_unix,json=previousExpiresAtUnix,proto3" json:"previous_expires_at_unix,omitempty"` + SecretUnavailable bool `protobuf:"varint,4,opt,name=secret_unavailable,json=secretUnavailable,proto3" json:"secret_unavailable,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotateCredentialResponse) Reset() { + *x = RotateCredentialResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotateCredentialResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateCredentialResponse) ProtoMessage() {} + +func (x *RotateCredentialResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[22] + 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 RotateCredentialResponse.ProtoReflect.Descriptor instead. +func (*RotateCredentialResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{22} +} + +func (x *RotateCredentialResponse) GetCredential() *AutomationCredential { + if x != nil { + return x.Credential + } + return nil +} + +func (x *RotateCredentialResponse) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +func (x *RotateCredentialResponse) GetPreviousExpiresAtUnix() int64 { + if x != nil { + return x.PreviousExpiresAtUnix + } + return 0 +} + +func (x *RotateCredentialResponse) GetSecretUnavailable() bool { + if x != nil { + return x.SecretUnavailable + } + return false +} + +type RevokeCredentialRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevokeCredentialRequest) Reset() { + *x = RevokeCredentialRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevokeCredentialRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokeCredentialRequest) ProtoMessage() {} + +func (x *RevokeCredentialRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[23] + 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 RevokeCredentialRequest.ProtoReflect.Descriptor instead. +func (*RevokeCredentialRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{23} +} + +func (x *RevokeCredentialRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type RevokeCredentialResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevokeCredentialResponse) Reset() { + *x = RevokeCredentialResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevokeCredentialResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokeCredentialResponse) ProtoMessage() {} + +func (x *RevokeCredentialResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[24] + 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 RevokeCredentialResponse.ProtoReflect.Descriptor instead. +func (*RevokeCredentialResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{24} +} + +type GitHubTrust struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProjectName string `protobuf:"bytes,2,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + ServiceAccount string `protobuf:"bytes,3,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` + DisplayName string `protobuf:"bytes,4,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Repository string `protobuf:"bytes,5,opt,name=repository,proto3" json:"repository,omitempty"` + RepositoryId string `protobuf:"bytes,6,opt,name=repository_id,json=repositoryId,proto3" json:"repository_id,omitempty"` + RepositoryOwnerId string `protobuf:"bytes,7,opt,name=repository_owner_id,json=repositoryOwnerId,proto3" json:"repository_owner_id,omitempty"` + Subject string `protobuf:"bytes,8,opt,name=subject,proto3" json:"subject,omitempty"` + Ref string `protobuf:"bytes,9,opt,name=ref,proto3" json:"ref,omitempty"` + Environment string `protobuf:"bytes,10,opt,name=environment,proto3" json:"environment,omitempty"` + WorkflowRef string `protobuf:"bytes,11,opt,name=workflow_ref,json=workflowRef,proto3" json:"workflow_ref,omitempty"` + JobWorkflowRef string `protobuf:"bytes,12,opt,name=job_workflow_ref,json=jobWorkflowRef,proto3" json:"job_workflow_ref,omitempty"` + Events []string `protobuf:"bytes,13,rep,name=events,proto3" json:"events,omitempty"` + Permissions []string `protobuf:"bytes,14,rep,name=permissions,proto3" json:"permissions,omitempty"` + State string `protobuf:"bytes,15,opt,name=state,proto3" json:"state,omitempty"` + Version int64 `protobuf:"varint,16,opt,name=version,proto3" json:"version,omitempty"` + CreateTimeUnix int64 `protobuf:"varint,17,opt,name=create_time_unix,json=createTimeUnix,proto3" json:"create_time_unix,omitempty"` + Audience string `protobuf:"bytes,18,opt,name=audience,proto3" json:"audience,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GitHubTrust) Reset() { + *x = GitHubTrust{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GitHubTrust) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GitHubTrust) ProtoMessage() {} + +func (x *GitHubTrust) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[25] + 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 GitHubTrust.ProtoReflect.Descriptor instead. +func (*GitHubTrust) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{25} +} + +func (x *GitHubTrust) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *GitHubTrust) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *GitHubTrust) GetServiceAccount() string { + if x != nil { + return x.ServiceAccount + } + return "" +} + +func (x *GitHubTrust) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *GitHubTrust) GetRepository() string { + if x != nil { + return x.Repository + } + return "" +} + +func (x *GitHubTrust) GetRepositoryId() string { + if x != nil { + return x.RepositoryId + } + return "" +} + +func (x *GitHubTrust) GetRepositoryOwnerId() string { + if x != nil { + return x.RepositoryOwnerId + } + return "" +} + +func (x *GitHubTrust) GetSubject() string { + if x != nil { + return x.Subject + } + return "" +} + +func (x *GitHubTrust) GetRef() string { + if x != nil { + return x.Ref + } + return "" +} + +func (x *GitHubTrust) GetEnvironment() string { + if x != nil { + return x.Environment + } + return "" +} + +func (x *GitHubTrust) GetWorkflowRef() string { + if x != nil { + return x.WorkflowRef + } + return "" +} + +func (x *GitHubTrust) GetJobWorkflowRef() string { + if x != nil { + return x.JobWorkflowRef + } + return "" +} + +func (x *GitHubTrust) GetEvents() []string { + if x != nil { + return x.Events + } + return nil +} + +func (x *GitHubTrust) GetPermissions() []string { + if x != nil { + return x.Permissions + } + return nil +} + +func (x *GitHubTrust) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *GitHubTrust) GetVersion() int64 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *GitHubTrust) GetCreateTimeUnix() int64 { + if x != nil { + return x.CreateTimeUnix + } + return 0 +} + +func (x *GitHubTrust) GetAudience() string { + if x != nil { + return x.Audience + } + return "" +} + +type CreateGitHubTrustRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Trust *GitHubTrust `protobuf:"bytes,1,opt,name=trust,proto3" json:"trust,omitempty"` + // Optional verified workflow discovery; confirmation is retry-safe by setup ID. + SetupId string `protobuf:"bytes,2,opt,name=setup_id,json=setupId,proto3" json:"setup_id,omitempty"` + // Optional for older callers; supply a stable UUID for direct-create recovery. + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateGitHubTrustRequest) Reset() { + *x = CreateGitHubTrustRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateGitHubTrustRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGitHubTrustRequest) ProtoMessage() {} + +func (x *CreateGitHubTrustRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[26] + 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 CreateGitHubTrustRequest.ProtoReflect.Descriptor instead. +func (*CreateGitHubTrustRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{26} +} + +func (x *CreateGitHubTrustRequest) GetTrust() *GitHubTrust { + if x != nil { + return x.Trust + } + return nil +} + +func (x *CreateGitHubTrustRequest) GetSetupId() string { + if x != nil { + return x.SetupId + } + return "" +} + +func (x *CreateGitHubTrustRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type CreateGitHubTrustResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Trust *GitHubTrust `protobuf:"bytes,1,opt,name=trust,proto3" json:"trust,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CreateGitHubTrustResponse) Reset() { + *x = CreateGitHubTrustResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateGitHubTrustResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateGitHubTrustResponse) ProtoMessage() {} + +func (x *CreateGitHubTrustResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[27] + 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 CreateGitHubTrustResponse.ProtoReflect.Descriptor instead. +func (*CreateGitHubTrustResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{27} +} + +func (x *CreateGitHubTrustResponse) GetTrust() *GitHubTrust { + if x != nil { + return x.Trust + } + return nil +} + +type UpdateGitHubTrustRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Permissions []string `protobuf:"bytes,3,rep,name=permissions,proto3" json:"permissions,omitempty"` + ExpectedVersion int64 `protobuf:"varint,4,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + RequestId string `protobuf:"bytes,5,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateGitHubTrustRequest) Reset() { + *x = UpdateGitHubTrustRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateGitHubTrustRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGitHubTrustRequest) ProtoMessage() {} + +func (x *UpdateGitHubTrustRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[28] + 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 UpdateGitHubTrustRequest.ProtoReflect.Descriptor instead. +func (*UpdateGitHubTrustRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{28} +} + +func (x *UpdateGitHubTrustRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *UpdateGitHubTrustRequest) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *UpdateGitHubTrustRequest) GetPermissions() []string { + if x != nil { + return x.Permissions + } + return nil +} + +func (x *UpdateGitHubTrustRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +func (x *UpdateGitHubTrustRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type UpdateGitHubTrustResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Trust *GitHubTrust `protobuf:"bytes,1,opt,name=trust,proto3" json:"trust,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateGitHubTrustResponse) Reset() { + *x = UpdateGitHubTrustResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateGitHubTrustResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateGitHubTrustResponse) ProtoMessage() {} + +func (x *UpdateGitHubTrustResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[29] + 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 UpdateGitHubTrustResponse.ProtoReflect.Descriptor instead. +func (*UpdateGitHubTrustResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{29} +} + +func (x *UpdateGitHubTrustResponse) GetTrust() *GitHubTrust { + if x != nil { + return x.Trust + } + return nil +} + +type ListGitHubTrustsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListGitHubTrustsRequest) Reset() { + *x = ListGitHubTrustsRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListGitHubTrustsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGitHubTrustsRequest) ProtoMessage() {} + +func (x *ListGitHubTrustsRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[30] + 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 ListGitHubTrustsRequest.ProtoReflect.Descriptor instead. +func (*ListGitHubTrustsRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{30} +} + +func (x *ListGitHubTrustsRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *ListGitHubTrustsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListGitHubTrustsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type ListGitHubTrustsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Trusts []*GitHubTrust `protobuf:"bytes,1,rep,name=trusts,proto3" json:"trusts,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListGitHubTrustsResponse) Reset() { + *x = ListGitHubTrustsResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListGitHubTrustsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListGitHubTrustsResponse) ProtoMessage() {} + +func (x *ListGitHubTrustsResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[31] + 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 ListGitHubTrustsResponse.ProtoReflect.Descriptor instead. +func (*ListGitHubTrustsResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{31} +} + +func (x *ListGitHubTrustsResponse) GetTrusts() []*GitHubTrust { + if x != nil { + return x.Trusts + } + return nil +} + +func (x *ListGitHubTrustsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +type SetGitHubTrustStateRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + ExpectedVersion int64 `protobuf:"varint,3,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SetGitHubTrustStateRequest) Reset() { + *x = SetGitHubTrustStateRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetGitHubTrustStateRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetGitHubTrustStateRequest) ProtoMessage() {} + +func (x *SetGitHubTrustStateRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[32] + 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 SetGitHubTrustStateRequest.ProtoReflect.Descriptor instead. +func (*SetGitHubTrustStateRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{32} +} + +func (x *SetGitHubTrustStateRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SetGitHubTrustStateRequest) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *SetGitHubTrustStateRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +type SetGitHubTrustStateResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Trust *GitHubTrust `protobuf:"bytes,1,opt,name=trust,proto3" json:"trust,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SetGitHubTrustStateResponse) Reset() { + *x = SetGitHubTrustStateResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetGitHubTrustStateResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetGitHubTrustStateResponse) ProtoMessage() {} + +func (x *SetGitHubTrustStateResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[33] + 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 SetGitHubTrustStateResponse.ProtoReflect.Descriptor instead. +func (*SetGitHubTrustStateResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{33} +} + +func (x *SetGitHubTrustStateResponse) GetTrust() *GitHubTrust { + if x != nil { + return x.Trust + } + return nil +} + +type DeleteGitHubTrustRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ExpectedVersion int64 `protobuf:"varint,2,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteGitHubTrustRequest) Reset() { + *x = DeleteGitHubTrustRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteGitHubTrustRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGitHubTrustRequest) ProtoMessage() {} + +func (x *DeleteGitHubTrustRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[34] + 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 DeleteGitHubTrustRequest.ProtoReflect.Descriptor instead. +func (*DeleteGitHubTrustRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{34} +} + +func (x *DeleteGitHubTrustRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteGitHubTrustRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +type DeleteGitHubTrustResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteGitHubTrustResponse) Reset() { + *x = DeleteGitHubTrustResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteGitHubTrustResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteGitHubTrustResponse) ProtoMessage() {} + +func (x *DeleteGitHubTrustResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[35] + 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 DeleteGitHubTrustResponse.ProtoReflect.Descriptor instead. +func (*DeleteGitHubTrustResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{35} +} + +type ExchangeGitHubTokenRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + TrustName string `protobuf:"bytes,1,opt,name=trust_name,json=trustName,proto3" json:"trust_name,omitempty"` + Assertion string `protobuf:"bytes,2,opt,name=assertion,proto3" json:"assertion,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExchangeGitHubTokenRequest) Reset() { + *x = ExchangeGitHubTokenRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExchangeGitHubTokenRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExchangeGitHubTokenRequest) ProtoMessage() {} + +func (x *ExchangeGitHubTokenRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[36] + 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 ExchangeGitHubTokenRequest.ProtoReflect.Descriptor instead. +func (*ExchangeGitHubTokenRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{36} +} + +func (x *ExchangeGitHubTokenRequest) GetTrustName() string { + if x != nil { + return x.TrustName + } + return "" +} + +func (x *ExchangeGitHubTokenRequest) GetAssertion() string { + if x != nil { + return x.Assertion + } + return "" +} + +type ExchangeGitHubTokenResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + AccessToken string `protobuf:"bytes,1,opt,name=access_token,json=accessToken,proto3" json:"access_token,omitempty"` + TokenType string `protobuf:"bytes,2,opt,name=token_type,json=tokenType,proto3" json:"token_type,omitempty"` + ExpiresAtUnix int64 `protobuf:"varint,3,opt,name=expires_at_unix,json=expiresAtUnix,proto3" json:"expires_at_unix,omitempty"` + ProjectName string `protobuf:"bytes,4,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Permissions []string `protobuf:"bytes,5,rep,name=permissions,proto3" json:"permissions,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ExchangeGitHubTokenResponse) Reset() { + *x = ExchangeGitHubTokenResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ExchangeGitHubTokenResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExchangeGitHubTokenResponse) ProtoMessage() {} + +func (x *ExchangeGitHubTokenResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[37] + 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 ExchangeGitHubTokenResponse.ProtoReflect.Descriptor instead. +func (*ExchangeGitHubTokenResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{37} +} + +func (x *ExchangeGitHubTokenResponse) GetAccessToken() string { + if x != nil { + return x.AccessToken + } + return "" +} + +func (x *ExchangeGitHubTokenResponse) GetTokenType() string { + if x != nil { + return x.TokenType + } + return "" +} + +func (x *ExchangeGitHubTokenResponse) GetExpiresAtUnix() int64 { + if x != nil { + return x.ExpiresAtUnix + } + return 0 +} + +func (x *ExchangeGitHubTokenResponse) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *ExchangeGitHubTokenResponse) GetPermissions() []string { + if x != nil { + return x.Permissions + } + return nil +} + +type BeginGitHubSetupRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + // Browser-generated 32-byte random base64url pairing code; stored only hashed. + PairingCode string `protobuf:"bytes,3,opt,name=pairing_code,json=pairingCode,proto3" json:"pairing_code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BeginGitHubSetupRequest) Reset() { + *x = BeginGitHubSetupRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BeginGitHubSetupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BeginGitHubSetupRequest) ProtoMessage() {} + +func (x *BeginGitHubSetupRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[38] + 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 BeginGitHubSetupRequest.ProtoReflect.Descriptor instead. +func (*BeginGitHubSetupRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{38} +} + +func (x *BeginGitHubSetupRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *BeginGitHubSetupRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *BeginGitHubSetupRequest) GetPairingCode() string { + if x != nil { + return x.PairingCode + } + return "" +} + +type GetGitHubSetupRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetGitHubSetupRequest) Reset() { + *x = GetGitHubSetupRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetGitHubSetupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGitHubSetupRequest) ProtoMessage() {} + +func (x *GetGitHubSetupRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[39] + 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 GetGitHubSetupRequest.ProtoReflect.Descriptor instead. +func (*GetGitHubSetupRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{39} +} + +func (x *GetGitHubSetupRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type BeginGitHubSetupResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Setup *GitHubSetup `protobuf:"bytes,1,opt,name=setup,proto3" json:"setup,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *BeginGitHubSetupResponse) Reset() { + *x = BeginGitHubSetupResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *BeginGitHubSetupResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*BeginGitHubSetupResponse) ProtoMessage() {} + +func (x *BeginGitHubSetupResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[40] + 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 BeginGitHubSetupResponse.ProtoReflect.Descriptor instead. +func (*BeginGitHubSetupResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{40} +} + +func (x *BeginGitHubSetupResponse) GetSetup() *GitHubSetup { + if x != nil { + return x.Setup + } + return nil +} + +type GetGitHubSetupResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Setup *GitHubSetup `protobuf:"bytes,1,opt,name=setup,proto3" json:"setup,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetGitHubSetupResponse) Reset() { + *x = GetGitHubSetupResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetGitHubSetupResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetGitHubSetupResponse) ProtoMessage() {} + +func (x *GetGitHubSetupResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[41] + 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 GetGitHubSetupResponse.ProtoReflect.Descriptor instead. +func (*GetGitHubSetupResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{41} +} + +func (x *GetGitHubSetupResponse) GetSetup() *GitHubSetup { + if x != nil { + return x.Setup + } + return nil +} + +type GitHubSetup struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ProjectName string `protobuf:"bytes,2,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Audience string `protobuf:"bytes,3,opt,name=audience,proto3" json:"audience,omitempty"` + ExpiresAtUnix int64 `protobuf:"varint,4,opt,name=expires_at_unix,json=expiresAtUnix,proto3" json:"expires_at_unix,omitempty"` + State string `protobuf:"bytes,5,opt,name=state,proto3" json:"state,omitempty"` + Identity *GitHubTrust `protobuf:"bytes,6,opt,name=identity,proto3" json:"identity,omitempty"` + ConfirmedTrustName string `protobuf:"bytes,7,opt,name=confirmed_trust_name,json=confirmedTrustName,proto3" json:"confirmed_trust_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GitHubSetup) Reset() { + *x = GitHubSetup{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GitHubSetup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GitHubSetup) ProtoMessage() {} + +func (x *GitHubSetup) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[42] + 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 GitHubSetup.ProtoReflect.Descriptor instead. +func (*GitHubSetup) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{42} +} + +func (x *GitHubSetup) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GitHubSetup) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *GitHubSetup) GetAudience() string { + if x != nil { + return x.Audience + } + return "" +} + +func (x *GitHubSetup) GetExpiresAtUnix() int64 { + if x != nil { + return x.ExpiresAtUnix + } + return 0 +} + +func (x *GitHubSetup) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *GitHubSetup) GetIdentity() *GitHubTrust { + if x != nil { + return x.Identity + } + return nil +} + +func (x *GitHubSetup) GetConfirmedTrustName() string { + if x != nil { + return x.ConfirmedTrustName + } + return "" +} + +type SubmitGitHubSetupRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + PairingCode string `protobuf:"bytes,2,opt,name=pairing_code,json=pairingCode,proto3" json:"pairing_code,omitempty"` + Assertion string `protobuf:"bytes,3,opt,name=assertion,proto3" json:"assertion,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SubmitGitHubSetupRequest) Reset() { + *x = SubmitGitHubSetupRequest{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SubmitGitHubSetupRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubmitGitHubSetupRequest) ProtoMessage() {} + +func (x *SubmitGitHubSetupRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[43] + 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 SubmitGitHubSetupRequest.ProtoReflect.Descriptor instead. +func (*SubmitGitHubSetupRequest) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{43} +} + +func (x *SubmitGitHubSetupRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SubmitGitHubSetupRequest) GetPairingCode() string { + if x != nil { + return x.PairingCode + } + return "" +} + +func (x *SubmitGitHubSetupRequest) GetAssertion() string { + if x != nil { + return x.Assertion + } + return "" +} + +type SubmitGitHubSetupResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SubmitGitHubSetupResponse) Reset() { + *x = SubmitGitHubSetupResponse{} + mi := &file_aes_iam_v1_automation_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SubmitGitHubSetupResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SubmitGitHubSetupResponse) ProtoMessage() {} + +func (x *SubmitGitHubSetupResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_automation_proto_msgTypes[44] + 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 SubmitGitHubSetupResponse.ProtoReflect.Descriptor instead. +func (*SubmitGitHubSetupResponse) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_automation_proto_rawDescGZIP(), []int{44} +} + +var File_aes_iam_v1_automation_proto protoreflect.FileDescriptor + +const file_aes_iam_v1_automation_proto_rawDesc = "" + + "\n" + + "\x1baes/iam/v1/automation.proto\x12\n" + + "aes.iam.v1\"e\n" + + "\n" + + "Capability\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12 \n" + + "\vdescription\x18\x03 \x01(\tR\vdescription\"\x19\n" + + "\x17ListCapabilitiesRequest\"V\n" + + "\x18ListCapabilitiesResponse\x12:\n" + + "\fcapabilities\x18\x01 \x03(\v2\x16.aes.iam.v1.CapabilityR\fcapabilities\"\xe6\x01\n" + + "\x0eServiceAccount\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x12!\n" + + "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12 \n" + + "\vpermissions\x18\x04 \x03(\tR\vpermissions\x12\x14\n" + + "\x05state\x18\x05 \x01(\tR\x05state\x12\x18\n" + + "\aversion\x18\x06 \x01(\x03R\aversion\x12(\n" + + "\x10create_time_unix\x18\a \x01(\x03R\x0ecreateTimeUnix\"\xa4\x01\n" + + "\x1bCreateServiceAccountRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12 \n" + + "\vpermissions\x18\x03 \x03(\tR\vpermissions\x12\x1d\n" + + "\n" + + "request_id\x18\x04 \x01(\tR\trequestId\"c\n" + + "\x1cCreateServiceAccountResponse\x12C\n" + + "\x0fservice_account\x18\x01 \x01(\v2\x1a.aes.iam.v1.ServiceAccountR\x0eserviceAccount\".\n" + + "\x18GetServiceAccountRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"`\n" + + "\x19GetServiceAccountResponse\x12C\n" + + "\x0fservice_account\x18\x01 \x01(\v2\x1a.aes.iam.v1.ServiceAccountR\x0eserviceAccount\"{\n" + + "\x1aListServiceAccountsRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x1b\n" + + "\tpage_size\x18\x02 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x03 \x01(\tR\tpageToken\"\x8c\x01\n" + + "\x1bListServiceAccountsResponse\x12E\n" + + "\x10service_accounts\x18\x01 \x03(\v2\x1a.aes.iam.v1.ServiceAccountR\x0fserviceAccounts\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"\xa1\x01\n" + + "\x1bUpdateServiceAccountRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12 \n" + + "\vpermissions\x18\x03 \x03(\tR\vpermissions\x12)\n" + + "\x10expected_version\x18\x04 \x01(\x03R\x0fexpectedVersion\"c\n" + + "\x1cUpdateServiceAccountResponse\x12C\n" + + "\x0fservice_account\x18\x01 \x01(\v2\x1a.aes.iam.v1.ServiceAccountR\x0eserviceAccount\"t\n" + + "\x1dSetServiceAccountStateRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x14\n" + + "\x05state\x18\x02 \x01(\tR\x05state\x12)\n" + + "\x10expected_version\x18\x03 \x01(\x03R\x0fexpectedVersion\"e\n" + + "\x1eSetServiceAccountStateResponse\x12C\n" + + "\x0fservice_account\x18\x01 \x01(\v2\x1a.aes.iam.v1.ServiceAccountR\x0eserviceAccount\"\\\n" + + "\x1bDeleteServiceAccountRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12)\n" + + "\x10expected_version\x18\x02 \x01(\x03R\x0fexpectedVersion\"\x1e\n" + + "\x1cDeleteServiceAccountResponse\"\x91\x03\n" + + "\x14AutomationCredential\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1c\n" + + "\tprincipal\x18\x02 \x01(\tR\tprincipal\x12!\n" + + "\fproject_name\x18\x03 \x01(\tR\vprojectName\x12!\n" + + "\fdisplay_name\x18\x04 \x01(\tR\vdisplayName\x12 \n" + + "\vpermissions\x18\x05 \x03(\tR\vpermissions\x12\x12\n" + + "\x04kind\x18\x06 \x01(\tR\x04kind\x12(\n" + + "\x10create_time_unix\x18\a \x01(\x03R\x0ecreateTimeUnix\x12&\n" + + "\x0fexpires_at_unix\x18\b \x01(\x03R\rexpiresAtUnix\x12&\n" + + "\x0frevoked_at_unix\x18\t \x01(\x03R\rrevokedAtUnix\x12)\n" + + "\x11last_used_at_unix\x18\n" + + " \x01(\x03R\x0elastUsedAtUnix\x12&\n" + + "\x0frotated_at_unix\x18\v \x01(\x03R\rrotatedAtUnix\"\xf1\x01\n" + + "\x17CreateCredentialRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12'\n" + + "\x0fservice_account\x18\x02 \x01(\tR\x0eserviceAccount\x12!\n" + + "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12 \n" + + "\vpermissions\x18\x04 \x03(\tR\vpermissions\x12&\n" + + "\x0fexpires_at_unix\x18\x05 \x01(\x03R\rexpiresAtUnix\x12\x1d\n" + + "\n" + + "request_id\x18\x06 \x01(\tR\trequestId\"\xa3\x01\n" + + "\x18CreateCredentialResponse\x12@\n" + + "\n" + + "credential\x18\x01 \x01(\v2 .aes.iam.v1.AutomationCredentialR\n" + + "credential\x12\x16\n" + + "\x06secret\x18\x02 \x01(\tR\x06secret\x12-\n" + + "\x12secret_unavailable\x18\x03 \x01(\bR\x11secretUnavailable\"\xa0\x01\n" + + "\x16ListCredentialsRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12'\n" + + "\x0fservice_account\x18\x02 \x01(\tR\x0eserviceAccount\x12\x1b\n" + + "\tpage_size\x18\x03 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x04 \x01(\tR\tpageToken\"\x85\x01\n" + + "\x17ListCredentialsResponse\x12B\n" + + "\vcredentials\x18\x01 \x03(\v2 .aes.iam.v1.AutomationCredentialR\vcredentials\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"u\n" + + "\x17RotateCredentialRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12'\n" + + "\x0foverlap_seconds\x18\x02 \x01(\x05R\x0eoverlapSeconds\x12\x1d\n" + + "\n" + + "request_id\x18\x03 \x01(\tR\trequestId\"\xdc\x01\n" + + "\x18RotateCredentialResponse\x12@\n" + + "\n" + + "credential\x18\x01 \x01(\v2 .aes.iam.v1.AutomationCredentialR\n" + + "credential\x12\x16\n" + + "\x06secret\x18\x02 \x01(\tR\x06secret\x127\n" + + "\x18previous_expires_at_unix\x18\x03 \x01(\x03R\x15previousExpiresAtUnix\x12-\n" + + "\x12secret_unavailable\x18\x04 \x01(\bR\x11secretUnavailable\"-\n" + + "\x17RevokeCredentialRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"\x1a\n" + + "\x18RevokeCredentialResponse\"\xd0\x04\n" + + "\vGitHubTrust\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x12'\n" + + "\x0fservice_account\x18\x03 \x01(\tR\x0eserviceAccount\x12!\n" + + "\fdisplay_name\x18\x04 \x01(\tR\vdisplayName\x12\x1e\n" + + "\n" + + "repository\x18\x05 \x01(\tR\n" + + "repository\x12#\n" + + "\rrepository_id\x18\x06 \x01(\tR\frepositoryId\x12.\n" + + "\x13repository_owner_id\x18\a \x01(\tR\x11repositoryOwnerId\x12\x18\n" + + "\asubject\x18\b \x01(\tR\asubject\x12\x10\n" + + "\x03ref\x18\t \x01(\tR\x03ref\x12 \n" + + "\venvironment\x18\n" + + " \x01(\tR\venvironment\x12!\n" + + "\fworkflow_ref\x18\v \x01(\tR\vworkflowRef\x12(\n" + + "\x10job_workflow_ref\x18\f \x01(\tR\x0ejobWorkflowRef\x12\x16\n" + + "\x06events\x18\r \x03(\tR\x06events\x12 \n" + + "\vpermissions\x18\x0e \x03(\tR\vpermissions\x12\x14\n" + + "\x05state\x18\x0f \x01(\tR\x05state\x12\x18\n" + + "\aversion\x18\x10 \x01(\x03R\aversion\x12(\n" + + "\x10create_time_unix\x18\x11 \x01(\x03R\x0ecreateTimeUnix\x12\x1a\n" + + "\baudience\x18\x12 \x01(\tR\baudience\"\x83\x01\n" + + "\x18CreateGitHubTrustRequest\x12-\n" + + "\x05trust\x18\x01 \x01(\v2\x17.aes.iam.v1.GitHubTrustR\x05trust\x12\x19\n" + + "\bsetup_id\x18\x02 \x01(\tR\asetupId\x12\x1d\n" + + "\n" + + "request_id\x18\x03 \x01(\tR\trequestId\"J\n" + + "\x19CreateGitHubTrustResponse\x12-\n" + + "\x05trust\x18\x01 \x01(\v2\x17.aes.iam.v1.GitHubTrustR\x05trust\"\xbd\x01\n" + + "\x18UpdateGitHubTrustRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12 \n" + + "\vpermissions\x18\x03 \x03(\tR\vpermissions\x12)\n" + + "\x10expected_version\x18\x04 \x01(\x03R\x0fexpectedVersion\x12\x1d\n" + + "\n" + + "request_id\x18\x05 \x01(\tR\trequestId\"J\n" + + "\x19UpdateGitHubTrustResponse\x12-\n" + + "\x05trust\x18\x01 \x01(\v2\x17.aes.iam.v1.GitHubTrustR\x05trust\"x\n" + + "\x17ListGitHubTrustsRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x1b\n" + + "\tpage_size\x18\x02 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x03 \x01(\tR\tpageToken\"s\n" + + "\x18ListGitHubTrustsResponse\x12/\n" + + "\x06trusts\x18\x01 \x03(\v2\x17.aes.iam.v1.GitHubTrustR\x06trusts\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"q\n" + + "\x1aSetGitHubTrustStateRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x14\n" + + "\x05state\x18\x02 \x01(\tR\x05state\x12)\n" + + "\x10expected_version\x18\x03 \x01(\x03R\x0fexpectedVersion\"L\n" + + "\x1bSetGitHubTrustStateResponse\x12-\n" + + "\x05trust\x18\x01 \x01(\v2\x17.aes.iam.v1.GitHubTrustR\x05trust\"Y\n" + + "\x18DeleteGitHubTrustRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12)\n" + + "\x10expected_version\x18\x02 \x01(\x03R\x0fexpectedVersion\"\x1b\n" + + "\x19DeleteGitHubTrustResponse\"Y\n" + + "\x1aExchangeGitHubTokenRequest\x12\x1d\n" + + "\n" + + "trust_name\x18\x01 \x01(\tR\ttrustName\x12\x1c\n" + + "\tassertion\x18\x02 \x01(\tR\tassertion\"\xcc\x01\n" + + "\x1bExchangeGitHubTokenResponse\x12!\n" + + "\faccess_token\x18\x01 \x01(\tR\vaccessToken\x12\x1d\n" + + "\n" + + "token_type\x18\x02 \x01(\tR\ttokenType\x12&\n" + + "\x0fexpires_at_unix\x18\x03 \x01(\x03R\rexpiresAtUnix\x12!\n" + + "\fproject_name\x18\x04 \x01(\tR\vprojectName\x12 \n" + + "\vpermissions\x18\x05 \x03(\tR\vpermissions\"o\n" + + "\x17BeginGitHubSetupRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x0e\n" + + "\x02id\x18\x02 \x01(\tR\x02id\x12!\n" + + "\fpairing_code\x18\x03 \x01(\tR\vpairingCode\"'\n" + + "\x15GetGitHubSetupRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\"I\n" + + "\x18BeginGitHubSetupResponse\x12-\n" + + "\x05setup\x18\x01 \x01(\v2\x17.aes.iam.v1.GitHubSetupR\x05setup\"G\n" + + "\x16GetGitHubSetupResponse\x12-\n" + + "\x05setup\x18\x01 \x01(\v2\x17.aes.iam.v1.GitHubSetupR\x05setup\"\x81\x02\n" + + "\vGitHubSetup\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12!\n" + + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x12\x1a\n" + + "\baudience\x18\x03 \x01(\tR\baudience\x12&\n" + + "\x0fexpires_at_unix\x18\x04 \x01(\x03R\rexpiresAtUnix\x12\x14\n" + + "\x05state\x18\x05 \x01(\tR\x05state\x123\n" + + "\bidentity\x18\x06 \x01(\v2\x17.aes.iam.v1.GitHubTrustR\bidentity\x120\n" + + "\x14confirmed_trust_name\x18\a \x01(\tR\x12confirmedTrustName\"k\n" + + "\x18SubmitGitHubSetupRequest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12!\n" + + "\fpairing_code\x18\x02 \x01(\tR\vpairingCode\x12\x1c\n" + + "\tassertion\x18\x03 \x01(\tR\tassertion\"\x1b\n" + + "\x19SubmitGitHubSetupResponse2\xd6\x0f\n" + + "\x11AutomationService\x12]\n" + + "\x10ListCapabilities\x12#.aes.iam.v1.ListCapabilitiesRequest\x1a$.aes.iam.v1.ListCapabilitiesResponse\x12i\n" + + "\x14CreateServiceAccount\x12'.aes.iam.v1.CreateServiceAccountRequest\x1a(.aes.iam.v1.CreateServiceAccountResponse\x12`\n" + + "\x11GetServiceAccount\x12$.aes.iam.v1.GetServiceAccountRequest\x1a%.aes.iam.v1.GetServiceAccountResponse\x12f\n" + + "\x13ListServiceAccounts\x12&.aes.iam.v1.ListServiceAccountsRequest\x1a'.aes.iam.v1.ListServiceAccountsResponse\x12i\n" + + "\x14UpdateServiceAccount\x12'.aes.iam.v1.UpdateServiceAccountRequest\x1a(.aes.iam.v1.UpdateServiceAccountResponse\x12o\n" + + "\x16SetServiceAccountState\x12).aes.iam.v1.SetServiceAccountStateRequest\x1a*.aes.iam.v1.SetServiceAccountStateResponse\x12i\n" + + "\x14DeleteServiceAccount\x12'.aes.iam.v1.DeleteServiceAccountRequest\x1a(.aes.iam.v1.DeleteServiceAccountResponse\x12]\n" + + "\x10CreateCredential\x12#.aes.iam.v1.CreateCredentialRequest\x1a$.aes.iam.v1.CreateCredentialResponse\x12Z\n" + + "\x0fListCredentials\x12\".aes.iam.v1.ListCredentialsRequest\x1a#.aes.iam.v1.ListCredentialsResponse\x12]\n" + + "\x10RotateCredential\x12#.aes.iam.v1.RotateCredentialRequest\x1a$.aes.iam.v1.RotateCredentialResponse\x12]\n" + + "\x10RevokeCredential\x12#.aes.iam.v1.RevokeCredentialRequest\x1a$.aes.iam.v1.RevokeCredentialResponse\x12`\n" + + "\x11CreateGitHubTrust\x12$.aes.iam.v1.CreateGitHubTrustRequest\x1a%.aes.iam.v1.CreateGitHubTrustResponse\x12`\n" + + "\x11UpdateGitHubTrust\x12$.aes.iam.v1.UpdateGitHubTrustRequest\x1a%.aes.iam.v1.UpdateGitHubTrustResponse\x12]\n" + + "\x10ListGitHubTrusts\x12#.aes.iam.v1.ListGitHubTrustsRequest\x1a$.aes.iam.v1.ListGitHubTrustsResponse\x12f\n" + + "\x13SetGitHubTrustState\x12&.aes.iam.v1.SetGitHubTrustStateRequest\x1a'.aes.iam.v1.SetGitHubTrustStateResponse\x12`\n" + + "\x11DeleteGitHubTrust\x12$.aes.iam.v1.DeleteGitHubTrustRequest\x1a%.aes.iam.v1.DeleteGitHubTrustResponse\x12]\n" + + "\x10BeginGitHubSetup\x12#.aes.iam.v1.BeginGitHubSetupRequest\x1a$.aes.iam.v1.BeginGitHubSetupResponse\x12W\n" + + "\x0eGetGitHubSetup\x12!.aes.iam.v1.GetGitHubSetupRequest\x1a\".aes.iam.v1.GetGitHubSetupResponse\x12`\n" + + "\x11SubmitGitHubSetup\x12$.aes.iam.v1.SubmitGitHubSetupRequest\x1a%.aes.iam.v1.SubmitGitHubSetupResponse\x12f\n" + + "\x13ExchangeGitHubToken\x12&.aes.iam.v1.ExchangeGitHubTokenRequest\x1a'.aes.iam.v1.ExchangeGitHubTokenResponseB\xaa\x01\n" + + "\x0ecom.aes.iam.v1B\x0fAutomationProtoP\x01Z=github.com/AES-Services/metalhost-sdk/gen/go/aes/iam/v1;iamv1\xa2\x02\x03AIX\xaa\x02\n" + + "Aes.Iam.V1\xca\x02\n" + + "Aes\\Iam\\V1\xe2\x02\x16Aes\\Iam\\V1\\GPBMetadata\xea\x02\fAes::Iam::V1b\x06proto3" + +var ( + file_aes_iam_v1_automation_proto_rawDescOnce sync.Once + file_aes_iam_v1_automation_proto_rawDescData []byte +) + +func file_aes_iam_v1_automation_proto_rawDescGZIP() []byte { + file_aes_iam_v1_automation_proto_rawDescOnce.Do(func() { + file_aes_iam_v1_automation_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_aes_iam_v1_automation_proto_rawDesc), len(file_aes_iam_v1_automation_proto_rawDesc))) + }) + return file_aes_iam_v1_automation_proto_rawDescData +} + +var file_aes_iam_v1_automation_proto_msgTypes = make([]protoimpl.MessageInfo, 45) +var file_aes_iam_v1_automation_proto_goTypes = []any{ + (*Capability)(nil), // 0: aes.iam.v1.Capability + (*ListCapabilitiesRequest)(nil), // 1: aes.iam.v1.ListCapabilitiesRequest + (*ListCapabilitiesResponse)(nil), // 2: aes.iam.v1.ListCapabilitiesResponse + (*ServiceAccount)(nil), // 3: aes.iam.v1.ServiceAccount + (*CreateServiceAccountRequest)(nil), // 4: aes.iam.v1.CreateServiceAccountRequest + (*CreateServiceAccountResponse)(nil), // 5: aes.iam.v1.CreateServiceAccountResponse + (*GetServiceAccountRequest)(nil), // 6: aes.iam.v1.GetServiceAccountRequest + (*GetServiceAccountResponse)(nil), // 7: aes.iam.v1.GetServiceAccountResponse + (*ListServiceAccountsRequest)(nil), // 8: aes.iam.v1.ListServiceAccountsRequest + (*ListServiceAccountsResponse)(nil), // 9: aes.iam.v1.ListServiceAccountsResponse + (*UpdateServiceAccountRequest)(nil), // 10: aes.iam.v1.UpdateServiceAccountRequest + (*UpdateServiceAccountResponse)(nil), // 11: aes.iam.v1.UpdateServiceAccountResponse + (*SetServiceAccountStateRequest)(nil), // 12: aes.iam.v1.SetServiceAccountStateRequest + (*SetServiceAccountStateResponse)(nil), // 13: aes.iam.v1.SetServiceAccountStateResponse + (*DeleteServiceAccountRequest)(nil), // 14: aes.iam.v1.DeleteServiceAccountRequest + (*DeleteServiceAccountResponse)(nil), // 15: aes.iam.v1.DeleteServiceAccountResponse + (*AutomationCredential)(nil), // 16: aes.iam.v1.AutomationCredential + (*CreateCredentialRequest)(nil), // 17: aes.iam.v1.CreateCredentialRequest + (*CreateCredentialResponse)(nil), // 18: aes.iam.v1.CreateCredentialResponse + (*ListCredentialsRequest)(nil), // 19: aes.iam.v1.ListCredentialsRequest + (*ListCredentialsResponse)(nil), // 20: aes.iam.v1.ListCredentialsResponse + (*RotateCredentialRequest)(nil), // 21: aes.iam.v1.RotateCredentialRequest + (*RotateCredentialResponse)(nil), // 22: aes.iam.v1.RotateCredentialResponse + (*RevokeCredentialRequest)(nil), // 23: aes.iam.v1.RevokeCredentialRequest + (*RevokeCredentialResponse)(nil), // 24: aes.iam.v1.RevokeCredentialResponse + (*GitHubTrust)(nil), // 25: aes.iam.v1.GitHubTrust + (*CreateGitHubTrustRequest)(nil), // 26: aes.iam.v1.CreateGitHubTrustRequest + (*CreateGitHubTrustResponse)(nil), // 27: aes.iam.v1.CreateGitHubTrustResponse + (*UpdateGitHubTrustRequest)(nil), // 28: aes.iam.v1.UpdateGitHubTrustRequest + (*UpdateGitHubTrustResponse)(nil), // 29: aes.iam.v1.UpdateGitHubTrustResponse + (*ListGitHubTrustsRequest)(nil), // 30: aes.iam.v1.ListGitHubTrustsRequest + (*ListGitHubTrustsResponse)(nil), // 31: aes.iam.v1.ListGitHubTrustsResponse + (*SetGitHubTrustStateRequest)(nil), // 32: aes.iam.v1.SetGitHubTrustStateRequest + (*SetGitHubTrustStateResponse)(nil), // 33: aes.iam.v1.SetGitHubTrustStateResponse + (*DeleteGitHubTrustRequest)(nil), // 34: aes.iam.v1.DeleteGitHubTrustRequest + (*DeleteGitHubTrustResponse)(nil), // 35: aes.iam.v1.DeleteGitHubTrustResponse + (*ExchangeGitHubTokenRequest)(nil), // 36: aes.iam.v1.ExchangeGitHubTokenRequest + (*ExchangeGitHubTokenResponse)(nil), // 37: aes.iam.v1.ExchangeGitHubTokenResponse + (*BeginGitHubSetupRequest)(nil), // 38: aes.iam.v1.BeginGitHubSetupRequest + (*GetGitHubSetupRequest)(nil), // 39: aes.iam.v1.GetGitHubSetupRequest + (*BeginGitHubSetupResponse)(nil), // 40: aes.iam.v1.BeginGitHubSetupResponse + (*GetGitHubSetupResponse)(nil), // 41: aes.iam.v1.GetGitHubSetupResponse + (*GitHubSetup)(nil), // 42: aes.iam.v1.GitHubSetup + (*SubmitGitHubSetupRequest)(nil), // 43: aes.iam.v1.SubmitGitHubSetupRequest + (*SubmitGitHubSetupResponse)(nil), // 44: aes.iam.v1.SubmitGitHubSetupResponse +} +var file_aes_iam_v1_automation_proto_depIdxs = []int32{ + 0, // 0: aes.iam.v1.ListCapabilitiesResponse.capabilities:type_name -> aes.iam.v1.Capability + 3, // 1: aes.iam.v1.CreateServiceAccountResponse.service_account:type_name -> aes.iam.v1.ServiceAccount + 3, // 2: aes.iam.v1.GetServiceAccountResponse.service_account:type_name -> aes.iam.v1.ServiceAccount + 3, // 3: aes.iam.v1.ListServiceAccountsResponse.service_accounts:type_name -> aes.iam.v1.ServiceAccount + 3, // 4: aes.iam.v1.UpdateServiceAccountResponse.service_account:type_name -> aes.iam.v1.ServiceAccount + 3, // 5: aes.iam.v1.SetServiceAccountStateResponse.service_account:type_name -> aes.iam.v1.ServiceAccount + 16, // 6: aes.iam.v1.CreateCredentialResponse.credential:type_name -> aes.iam.v1.AutomationCredential + 16, // 7: aes.iam.v1.ListCredentialsResponse.credentials:type_name -> aes.iam.v1.AutomationCredential + 16, // 8: aes.iam.v1.RotateCredentialResponse.credential:type_name -> aes.iam.v1.AutomationCredential + 25, // 9: aes.iam.v1.CreateGitHubTrustRequest.trust:type_name -> aes.iam.v1.GitHubTrust + 25, // 10: aes.iam.v1.CreateGitHubTrustResponse.trust:type_name -> aes.iam.v1.GitHubTrust + 25, // 11: aes.iam.v1.UpdateGitHubTrustResponse.trust:type_name -> aes.iam.v1.GitHubTrust + 25, // 12: aes.iam.v1.ListGitHubTrustsResponse.trusts:type_name -> aes.iam.v1.GitHubTrust + 25, // 13: aes.iam.v1.SetGitHubTrustStateResponse.trust:type_name -> aes.iam.v1.GitHubTrust + 42, // 14: aes.iam.v1.BeginGitHubSetupResponse.setup:type_name -> aes.iam.v1.GitHubSetup + 42, // 15: aes.iam.v1.GetGitHubSetupResponse.setup:type_name -> aes.iam.v1.GitHubSetup + 25, // 16: aes.iam.v1.GitHubSetup.identity:type_name -> aes.iam.v1.GitHubTrust + 1, // 17: aes.iam.v1.AutomationService.ListCapabilities:input_type -> aes.iam.v1.ListCapabilitiesRequest + 4, // 18: aes.iam.v1.AutomationService.CreateServiceAccount:input_type -> aes.iam.v1.CreateServiceAccountRequest + 6, // 19: aes.iam.v1.AutomationService.GetServiceAccount:input_type -> aes.iam.v1.GetServiceAccountRequest + 8, // 20: aes.iam.v1.AutomationService.ListServiceAccounts:input_type -> aes.iam.v1.ListServiceAccountsRequest + 10, // 21: aes.iam.v1.AutomationService.UpdateServiceAccount:input_type -> aes.iam.v1.UpdateServiceAccountRequest + 12, // 22: aes.iam.v1.AutomationService.SetServiceAccountState:input_type -> aes.iam.v1.SetServiceAccountStateRequest + 14, // 23: aes.iam.v1.AutomationService.DeleteServiceAccount:input_type -> aes.iam.v1.DeleteServiceAccountRequest + 17, // 24: aes.iam.v1.AutomationService.CreateCredential:input_type -> aes.iam.v1.CreateCredentialRequest + 19, // 25: aes.iam.v1.AutomationService.ListCredentials:input_type -> aes.iam.v1.ListCredentialsRequest + 21, // 26: aes.iam.v1.AutomationService.RotateCredential:input_type -> aes.iam.v1.RotateCredentialRequest + 23, // 27: aes.iam.v1.AutomationService.RevokeCredential:input_type -> aes.iam.v1.RevokeCredentialRequest + 26, // 28: aes.iam.v1.AutomationService.CreateGitHubTrust:input_type -> aes.iam.v1.CreateGitHubTrustRequest + 28, // 29: aes.iam.v1.AutomationService.UpdateGitHubTrust:input_type -> aes.iam.v1.UpdateGitHubTrustRequest + 30, // 30: aes.iam.v1.AutomationService.ListGitHubTrusts:input_type -> aes.iam.v1.ListGitHubTrustsRequest + 32, // 31: aes.iam.v1.AutomationService.SetGitHubTrustState:input_type -> aes.iam.v1.SetGitHubTrustStateRequest + 34, // 32: aes.iam.v1.AutomationService.DeleteGitHubTrust:input_type -> aes.iam.v1.DeleteGitHubTrustRequest + 38, // 33: aes.iam.v1.AutomationService.BeginGitHubSetup:input_type -> aes.iam.v1.BeginGitHubSetupRequest + 39, // 34: aes.iam.v1.AutomationService.GetGitHubSetup:input_type -> aes.iam.v1.GetGitHubSetupRequest + 43, // 35: aes.iam.v1.AutomationService.SubmitGitHubSetup:input_type -> aes.iam.v1.SubmitGitHubSetupRequest + 36, // 36: aes.iam.v1.AutomationService.ExchangeGitHubToken:input_type -> aes.iam.v1.ExchangeGitHubTokenRequest + 2, // 37: aes.iam.v1.AutomationService.ListCapabilities:output_type -> aes.iam.v1.ListCapabilitiesResponse + 5, // 38: aes.iam.v1.AutomationService.CreateServiceAccount:output_type -> aes.iam.v1.CreateServiceAccountResponse + 7, // 39: aes.iam.v1.AutomationService.GetServiceAccount:output_type -> aes.iam.v1.GetServiceAccountResponse + 9, // 40: aes.iam.v1.AutomationService.ListServiceAccounts:output_type -> aes.iam.v1.ListServiceAccountsResponse + 11, // 41: aes.iam.v1.AutomationService.UpdateServiceAccount:output_type -> aes.iam.v1.UpdateServiceAccountResponse + 13, // 42: aes.iam.v1.AutomationService.SetServiceAccountState:output_type -> aes.iam.v1.SetServiceAccountStateResponse + 15, // 43: aes.iam.v1.AutomationService.DeleteServiceAccount:output_type -> aes.iam.v1.DeleteServiceAccountResponse + 18, // 44: aes.iam.v1.AutomationService.CreateCredential:output_type -> aes.iam.v1.CreateCredentialResponse + 20, // 45: aes.iam.v1.AutomationService.ListCredentials:output_type -> aes.iam.v1.ListCredentialsResponse + 22, // 46: aes.iam.v1.AutomationService.RotateCredential:output_type -> aes.iam.v1.RotateCredentialResponse + 24, // 47: aes.iam.v1.AutomationService.RevokeCredential:output_type -> aes.iam.v1.RevokeCredentialResponse + 27, // 48: aes.iam.v1.AutomationService.CreateGitHubTrust:output_type -> aes.iam.v1.CreateGitHubTrustResponse + 29, // 49: aes.iam.v1.AutomationService.UpdateGitHubTrust:output_type -> aes.iam.v1.UpdateGitHubTrustResponse + 31, // 50: aes.iam.v1.AutomationService.ListGitHubTrusts:output_type -> aes.iam.v1.ListGitHubTrustsResponse + 33, // 51: aes.iam.v1.AutomationService.SetGitHubTrustState:output_type -> aes.iam.v1.SetGitHubTrustStateResponse + 35, // 52: aes.iam.v1.AutomationService.DeleteGitHubTrust:output_type -> aes.iam.v1.DeleteGitHubTrustResponse + 40, // 53: aes.iam.v1.AutomationService.BeginGitHubSetup:output_type -> aes.iam.v1.BeginGitHubSetupResponse + 41, // 54: aes.iam.v1.AutomationService.GetGitHubSetup:output_type -> aes.iam.v1.GetGitHubSetupResponse + 44, // 55: aes.iam.v1.AutomationService.SubmitGitHubSetup:output_type -> aes.iam.v1.SubmitGitHubSetupResponse + 37, // 56: aes.iam.v1.AutomationService.ExchangeGitHubToken:output_type -> aes.iam.v1.ExchangeGitHubTokenResponse + 37, // [37:57] is the sub-list for method output_type + 17, // [17:37] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name +} + +func init() { file_aes_iam_v1_automation_proto_init() } +func file_aes_iam_v1_automation_proto_init() { + if File_aes_iam_v1_automation_proto != nil { + return + } + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_aes_iam_v1_automation_proto_rawDesc), len(file_aes_iam_v1_automation_proto_rawDesc)), + NumEnums: 0, + NumMessages: 45, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_aes_iam_v1_automation_proto_goTypes, + DependencyIndexes: file_aes_iam_v1_automation_proto_depIdxs, + MessageInfos: file_aes_iam_v1_automation_proto_msgTypes, + }.Build() + File_aes_iam_v1_automation_proto = out.File + file_aes_iam_v1_automation_proto_goTypes = nil + file_aes_iam_v1_automation_proto_depIdxs = nil +} diff --git a/gen/go/aes/iam/v1/iam.pb.go b/gen/go/aes/iam/v1/iam.pb.go index 31d1126..b874046 100644 --- a/gen/go/aes/iam/v1/iam.pb.go +++ b/gen/go/aes/iam/v1/iam.pb.go @@ -21,6 +21,70 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// Why the customer is signing up. Captured on the website; values match the sign-up form copy. +type SignupIntent int32 + +const ( + SignupIntent_SIGNUP_INTENT_UNSPECIFIED SignupIntent = 0 + // Moving an existing workload from another provider. + SignupIntent_SIGNUP_INTENT_MOVING_WORKLOAD SignupIntent = 1 + // Starting something new. + SignupIntent_SIGNUP_INTENT_STARTING_NEW SignupIntent = 2 + // Adding capacity next to my current setup. + SignupIntent_SIGNUP_INTENT_ADDING_CAPACITY SignupIntent = 3 + // Comparing providers, nothing to deploy yet. + SignupIntent_SIGNUP_INTENT_COMPARING_PROVIDERS SignupIntent = 4 + // Something else — see SignupSurvey.something_else. + SignupIntent_SIGNUP_INTENT_SOMETHING_ELSE SignupIntent = 5 +) + +// Enum value maps for SignupIntent. +var ( + SignupIntent_name = map[int32]string{ + 0: "SIGNUP_INTENT_UNSPECIFIED", + 1: "SIGNUP_INTENT_MOVING_WORKLOAD", + 2: "SIGNUP_INTENT_STARTING_NEW", + 3: "SIGNUP_INTENT_ADDING_CAPACITY", + 4: "SIGNUP_INTENT_COMPARING_PROVIDERS", + 5: "SIGNUP_INTENT_SOMETHING_ELSE", + } + SignupIntent_value = map[string]int32{ + "SIGNUP_INTENT_UNSPECIFIED": 0, + "SIGNUP_INTENT_MOVING_WORKLOAD": 1, + "SIGNUP_INTENT_STARTING_NEW": 2, + "SIGNUP_INTENT_ADDING_CAPACITY": 3, + "SIGNUP_INTENT_COMPARING_PROVIDERS": 4, + "SIGNUP_INTENT_SOMETHING_ELSE": 5, + } +) + +func (x SignupIntent) Enum() *SignupIntent { + p := new(SignupIntent) + *p = x + return p +} + +func (x SignupIntent) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SignupIntent) Descriptor() protoreflect.EnumDescriptor { + return file_aes_iam_v1_iam_proto_enumTypes[0].Descriptor() +} + +func (SignupIntent) Type() protoreflect.EnumType { + return &file_aes_iam_v1_iam_proto_enumTypes[0] +} + +func (x SignupIntent) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SignupIntent.Descriptor instead. +func (SignupIntent) EnumDescriptor() ([]byte, []int) { + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{0} +} + type ValidateApiKeyRequest struct { state protoimpl.MessageState `protogen:"open.v1"` RawKey string `protobuf:"bytes,1,opt,name=raw_key,json=rawKey,proto3" json:"raw_key,omitempty"` @@ -1019,8 +1083,12 @@ type SignUpRequest struct { // Cloudflare Turnstile widget token. Required when the deployment has bot protection // enabled; safe to omit otherwise. TurnstileToken string `protobuf:"bytes,6,opt,name=turnstile_token,json=turnstileToken,proto3" json:"turnstile_token,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Optional "What brings you to Metal Host?" answer from the sign-up form. Stored on the + // account at creation; never updated afterwards. Rides email_verifications until + // VerifyEmail materializes the user (same path as attribution). + Survey *SignupSurvey `protobuf:"bytes,7,opt,name=survey,proto3" json:"survey,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SignUpRequest) Reset() { @@ -1095,6 +1163,68 @@ func (x *SignUpRequest) GetTurnstileToken() string { return "" } +func (x *SignUpRequest) GetSurvey() *SignupSurvey { + if x != nil { + return x.Survey + } + return nil +} + +// Single-question signup survey. Optional; empty/unspecified is stored as SQL NULL. +type SignupSurvey struct { + state protoimpl.MessageState `protogen:"open.v1"` + Intent SignupIntent `protobuf:"varint,1,opt,name=intent,proto3,enum=aes.iam.v1.SignupIntent" json:"intent,omitempty"` + // Free-text when intent is SIGNUP_INTENT_SOMETHING_ELSE. Server truncates to 100 + // characters. Ignored for any other intent. + SomethingElse string `protobuf:"bytes,2,opt,name=something_else,json=somethingElse,proto3" json:"something_else,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SignupSurvey) Reset() { + *x = SignupSurvey{} + mi := &file_aes_iam_v1_iam_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SignupSurvey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SignupSurvey) ProtoMessage() {} + +func (x *SignupSurvey) ProtoReflect() protoreflect.Message { + mi := &file_aes_iam_v1_iam_proto_msgTypes[18] + 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 SignupSurvey.ProtoReflect.Descriptor instead. +func (*SignupSurvey) Descriptor() ([]byte, []int) { + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{18} +} + +func (x *SignupSurvey) GetIntent() SignupIntent { + if x != nil { + return x.Intent + } + return SignupIntent_SIGNUP_INTENT_UNSPECIFIED +} + +func (x *SignupSurvey) GetSomethingElse() string { + if x != nil { + return x.SomethingElse + } + return "" +} + // Marketing attribution for a new account: UTM parameters and ad click IDs captured on the // website at first visit. All fields optional. type SignupAttribution struct { @@ -1120,7 +1250,7 @@ type SignupAttribution struct { func (x *SignupAttribution) Reset() { *x = SignupAttribution{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[18] + mi := &file_aes_iam_v1_iam_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1132,7 +1262,7 @@ func (x *SignupAttribution) String() string { func (*SignupAttribution) ProtoMessage() {} func (x *SignupAttribution) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[18] + mi := &file_aes_iam_v1_iam_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1145,7 +1275,7 @@ func (x *SignupAttribution) ProtoReflect() protoreflect.Message { // Deprecated: Use SignupAttribution.ProtoReflect.Descriptor instead. func (*SignupAttribution) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{18} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{19} } func (x *SignupAttribution) GetUtmSource() string { @@ -1239,7 +1369,7 @@ type SignUpResponse struct { func (x *SignUpResponse) Reset() { *x = SignUpResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[19] + mi := &file_aes_iam_v1_iam_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1251,7 +1381,7 @@ func (x *SignUpResponse) String() string { func (*SignUpResponse) ProtoMessage() {} func (x *SignUpResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[19] + mi := &file_aes_iam_v1_iam_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1264,7 +1394,7 @@ func (x *SignUpResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SignUpResponse.ProtoReflect.Descriptor instead. func (*SignUpResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{19} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{20} } func (x *SignUpResponse) GetOrganizationName() string { @@ -1319,7 +1449,7 @@ type VerifyEmailRequest struct { func (x *VerifyEmailRequest) Reset() { *x = VerifyEmailRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[20] + mi := &file_aes_iam_v1_iam_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1331,7 +1461,7 @@ func (x *VerifyEmailRequest) String() string { func (*VerifyEmailRequest) ProtoMessage() {} func (x *VerifyEmailRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[20] + mi := &file_aes_iam_v1_iam_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1344,7 +1474,7 @@ func (x *VerifyEmailRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyEmailRequest.ProtoReflect.Descriptor instead. func (*VerifyEmailRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{20} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{21} } func (x *VerifyEmailRequest) GetToken() string { @@ -1367,7 +1497,7 @@ type VerifyEmailResponse struct { func (x *VerifyEmailResponse) Reset() { *x = VerifyEmailResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[21] + mi := &file_aes_iam_v1_iam_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1379,7 +1509,7 @@ func (x *VerifyEmailResponse) String() string { func (*VerifyEmailResponse) ProtoMessage() {} func (x *VerifyEmailResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[21] + mi := &file_aes_iam_v1_iam_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1392,7 +1522,7 @@ func (x *VerifyEmailResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyEmailResponse.ProtoReflect.Descriptor instead. func (*VerifyEmailResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{21} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{22} } func (x *VerifyEmailResponse) GetOrganizationName() string { @@ -1440,7 +1570,7 @@ type LoginRequest struct { func (x *LoginRequest) Reset() { *x = LoginRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[22] + mi := &file_aes_iam_v1_iam_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1452,7 +1582,7 @@ func (x *LoginRequest) String() string { func (*LoginRequest) ProtoMessage() {} func (x *LoginRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[22] + mi := &file_aes_iam_v1_iam_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1465,7 +1595,7 @@ func (x *LoginRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginRequest.ProtoReflect.Descriptor instead. func (*LoginRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{22} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{23} } func (x *LoginRequest) GetEmail() string { @@ -1499,7 +1629,7 @@ type LoginResponse struct { func (x *LoginResponse) Reset() { *x = LoginResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[23] + mi := &file_aes_iam_v1_iam_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1511,7 +1641,7 @@ func (x *LoginResponse) String() string { func (*LoginResponse) ProtoMessage() {} func (x *LoginResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[23] + mi := &file_aes_iam_v1_iam_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1524,7 +1654,7 @@ func (x *LoginResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LoginResponse.ProtoReflect.Descriptor instead. func (*LoginResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{23} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{24} } func (x *LoginResponse) GetPrincipal() string { @@ -1571,7 +1701,7 @@ type SubmitMFAChallengeRequest struct { func (x *SubmitMFAChallengeRequest) Reset() { *x = SubmitMFAChallengeRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[24] + mi := &file_aes_iam_v1_iam_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1583,7 +1713,7 @@ func (x *SubmitMFAChallengeRequest) String() string { func (*SubmitMFAChallengeRequest) ProtoMessage() {} func (x *SubmitMFAChallengeRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[24] + mi := &file_aes_iam_v1_iam_proto_msgTypes[25] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1596,7 +1726,7 @@ func (x *SubmitMFAChallengeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitMFAChallengeRequest.ProtoReflect.Descriptor instead. func (*SubmitMFAChallengeRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{24} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{25} } func (x *SubmitMFAChallengeRequest) GetChallengeToken() string { @@ -1635,7 +1765,7 @@ type SubmitMFAChallengeResponse struct { func (x *SubmitMFAChallengeResponse) Reset() { *x = SubmitMFAChallengeResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[25] + mi := &file_aes_iam_v1_iam_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1647,7 +1777,7 @@ func (x *SubmitMFAChallengeResponse) String() string { func (*SubmitMFAChallengeResponse) ProtoMessage() {} func (x *SubmitMFAChallengeResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[25] + mi := &file_aes_iam_v1_iam_proto_msgTypes[26] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1660,7 +1790,7 @@ func (x *SubmitMFAChallengeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SubmitMFAChallengeResponse.ProtoReflect.Descriptor instead. func (*SubmitMFAChallengeResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{25} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{26} } func (x *SubmitMFAChallengeResponse) GetPrincipal() string { @@ -1703,7 +1833,7 @@ type LinkOidcProviderRequest struct { func (x *LinkOidcProviderRequest) Reset() { *x = LinkOidcProviderRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[26] + mi := &file_aes_iam_v1_iam_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1715,7 +1845,7 @@ func (x *LinkOidcProviderRequest) String() string { func (*LinkOidcProviderRequest) ProtoMessage() {} func (x *LinkOidcProviderRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[26] + mi := &file_aes_iam_v1_iam_proto_msgTypes[27] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1728,7 +1858,7 @@ func (x *LinkOidcProviderRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LinkOidcProviderRequest.ProtoReflect.Descriptor instead. func (*LinkOidcProviderRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{26} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{27} } func (x *LinkOidcProviderRequest) GetProviderName() string { @@ -1755,7 +1885,7 @@ type LinkOidcProviderResponse struct { func (x *LinkOidcProviderResponse) Reset() { *x = LinkOidcProviderResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[27] + mi := &file_aes_iam_v1_iam_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1767,7 +1897,7 @@ func (x *LinkOidcProviderResponse) String() string { func (*LinkOidcProviderResponse) ProtoMessage() {} func (x *LinkOidcProviderResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[27] + mi := &file_aes_iam_v1_iam_proto_msgTypes[28] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1780,7 +1910,7 @@ func (x *LinkOidcProviderResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LinkOidcProviderResponse.ProtoReflect.Descriptor instead. func (*LinkOidcProviderResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{27} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{28} } func (x *LinkOidcProviderResponse) GetAuthorizeUrl() string { @@ -1814,7 +1944,7 @@ type InviteOrgMemberRequest struct { func (x *InviteOrgMemberRequest) Reset() { *x = InviteOrgMemberRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[28] + mi := &file_aes_iam_v1_iam_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1826,7 +1956,7 @@ func (x *InviteOrgMemberRequest) String() string { func (*InviteOrgMemberRequest) ProtoMessage() {} func (x *InviteOrgMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[28] + mi := &file_aes_iam_v1_iam_proto_msgTypes[29] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1839,7 +1969,7 @@ func (x *InviteOrgMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InviteOrgMemberRequest.ProtoReflect.Descriptor instead. func (*InviteOrgMemberRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{28} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{29} } func (x *InviteOrgMemberRequest) GetOrganizationName() string { @@ -1882,7 +2012,7 @@ type InviteOrgMemberResponse struct { func (x *InviteOrgMemberResponse) Reset() { *x = InviteOrgMemberResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[29] + mi := &file_aes_iam_v1_iam_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1894,7 +2024,7 @@ func (x *InviteOrgMemberResponse) String() string { func (*InviteOrgMemberResponse) ProtoMessage() {} func (x *InviteOrgMemberResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[29] + mi := &file_aes_iam_v1_iam_proto_msgTypes[30] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1907,7 +2037,7 @@ func (x *InviteOrgMemberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InviteOrgMemberResponse.ProtoReflect.Descriptor instead. func (*InviteOrgMemberResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{29} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{30} } func (x *InviteOrgMemberResponse) GetAcceptToken() string { @@ -1933,7 +2063,7 @@ type AcceptInviteRequest struct { func (x *AcceptInviteRequest) Reset() { *x = AcceptInviteRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[30] + mi := &file_aes_iam_v1_iam_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1945,7 +2075,7 @@ func (x *AcceptInviteRequest) String() string { func (*AcceptInviteRequest) ProtoMessage() {} func (x *AcceptInviteRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[30] + mi := &file_aes_iam_v1_iam_proto_msgTypes[31] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1958,7 +2088,7 @@ func (x *AcceptInviteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AcceptInviteRequest.ProtoReflect.Descriptor instead. func (*AcceptInviteRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{30} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{31} } func (x *AcceptInviteRequest) GetAcceptToken() string { @@ -1978,7 +2108,7 @@ type SetInitialPasswordRequest struct { func (x *SetInitialPasswordRequest) Reset() { *x = SetInitialPasswordRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[31] + mi := &file_aes_iam_v1_iam_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1990,7 +2120,7 @@ func (x *SetInitialPasswordRequest) String() string { func (*SetInitialPasswordRequest) ProtoMessage() {} func (x *SetInitialPasswordRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[31] + mi := &file_aes_iam_v1_iam_proto_msgTypes[32] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2003,7 +2133,7 @@ func (x *SetInitialPasswordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetInitialPasswordRequest.ProtoReflect.Descriptor instead. func (*SetInitialPasswordRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{31} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{32} } func (x *SetInitialPasswordRequest) GetNewPassword() string { @@ -2021,7 +2151,7 @@ type SetInitialPasswordResponse struct { func (x *SetInitialPasswordResponse) Reset() { *x = SetInitialPasswordResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[32] + mi := &file_aes_iam_v1_iam_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2033,7 +2163,7 @@ func (x *SetInitialPasswordResponse) String() string { func (*SetInitialPasswordResponse) ProtoMessage() {} func (x *SetInitialPasswordResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[32] + mi := &file_aes_iam_v1_iam_proto_msgTypes[33] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2046,7 +2176,7 @@ func (x *SetInitialPasswordResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetInitialPasswordResponse.ProtoReflect.Descriptor instead. func (*SetInitialPasswordResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{32} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{33} } type AcceptInviteResponse struct { @@ -2066,7 +2196,7 @@ type AcceptInviteResponse struct { func (x *AcceptInviteResponse) Reset() { *x = AcceptInviteResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[33] + mi := &file_aes_iam_v1_iam_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2078,7 +2208,7 @@ func (x *AcceptInviteResponse) String() string { func (*AcceptInviteResponse) ProtoMessage() {} func (x *AcceptInviteResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[33] + mi := &file_aes_iam_v1_iam_proto_msgTypes[34] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2091,7 +2221,7 @@ func (x *AcceptInviteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AcceptInviteResponse.ProtoReflect.Descriptor instead. func (*AcceptInviteResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{33} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{34} } func (x *AcceptInviteResponse) GetOrganizationName() string { @@ -2140,7 +2270,7 @@ type ListOrgMembersRequest struct { func (x *ListOrgMembersRequest) Reset() { *x = ListOrgMembersRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[34] + mi := &file_aes_iam_v1_iam_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2152,7 +2282,7 @@ func (x *ListOrgMembersRequest) String() string { func (*ListOrgMembersRequest) ProtoMessage() {} func (x *ListOrgMembersRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[34] + mi := &file_aes_iam_v1_iam_proto_msgTypes[35] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2165,7 +2295,7 @@ func (x *ListOrgMembersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOrgMembersRequest.ProtoReflect.Descriptor instead. func (*ListOrgMembersRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{34} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{35} } func (x *ListOrgMembersRequest) GetOrganizationName() string { @@ -2209,7 +2339,7 @@ type OrgMember struct { func (x *OrgMember) Reset() { *x = OrgMember{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[35] + mi := &file_aes_iam_v1_iam_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2221,7 +2351,7 @@ func (x *OrgMember) String() string { func (*OrgMember) ProtoMessage() {} func (x *OrgMember) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[35] + mi := &file_aes_iam_v1_iam_proto_msgTypes[36] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2234,7 +2364,7 @@ func (x *OrgMember) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgMember.ProtoReflect.Descriptor instead. func (*OrgMember) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{35} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{36} } func (x *OrgMember) GetPrincipal() string { @@ -2296,7 +2426,7 @@ type ListOrgMembersResponse struct { func (x *ListOrgMembersResponse) Reset() { *x = ListOrgMembersResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[36] + mi := &file_aes_iam_v1_iam_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2308,7 +2438,7 @@ func (x *ListOrgMembersResponse) String() string { func (*ListOrgMembersResponse) ProtoMessage() {} func (x *ListOrgMembersResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[36] + mi := &file_aes_iam_v1_iam_proto_msgTypes[37] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2321,7 +2451,7 @@ func (x *ListOrgMembersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListOrgMembersResponse.ProtoReflect.Descriptor instead. func (*ListOrgMembersResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{36} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{37} } func (x *ListOrgMembersResponse) GetOrgMembers() []*OrgMember { @@ -2348,7 +2478,7 @@ type RemoveOrgMemberRequest struct { func (x *RemoveOrgMemberRequest) Reset() { *x = RemoveOrgMemberRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[37] + mi := &file_aes_iam_v1_iam_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2360,7 +2490,7 @@ func (x *RemoveOrgMemberRequest) String() string { func (*RemoveOrgMemberRequest) ProtoMessage() {} func (x *RemoveOrgMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[37] + mi := &file_aes_iam_v1_iam_proto_msgTypes[38] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2373,7 +2503,7 @@ func (x *RemoveOrgMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveOrgMemberRequest.ProtoReflect.Descriptor instead. func (*RemoveOrgMemberRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{37} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{38} } func (x *RemoveOrgMemberRequest) GetOrganizationName() string { @@ -2398,7 +2528,7 @@ type RemoveOrgMemberResponse struct { func (x *RemoveOrgMemberResponse) Reset() { *x = RemoveOrgMemberResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[38] + mi := &file_aes_iam_v1_iam_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2410,7 +2540,7 @@ func (x *RemoveOrgMemberResponse) String() string { func (*RemoveOrgMemberResponse) ProtoMessage() {} func (x *RemoveOrgMemberResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[38] + mi := &file_aes_iam_v1_iam_proto_msgTypes[39] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2423,7 +2553,7 @@ func (x *RemoveOrgMemberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RemoveOrgMemberResponse.ProtoReflect.Descriptor instead. func (*RemoveOrgMemberResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{38} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{39} } type UpdateOrgMemberRoleRequest struct { @@ -2440,7 +2570,7 @@ type UpdateOrgMemberRoleRequest struct { func (x *UpdateOrgMemberRoleRequest) Reset() { *x = UpdateOrgMemberRoleRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[39] + mi := &file_aes_iam_v1_iam_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2452,7 +2582,7 @@ func (x *UpdateOrgMemberRoleRequest) String() string { func (*UpdateOrgMemberRoleRequest) ProtoMessage() {} func (x *UpdateOrgMemberRoleRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[39] + mi := &file_aes_iam_v1_iam_proto_msgTypes[40] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2465,7 +2595,7 @@ func (x *UpdateOrgMemberRoleRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateOrgMemberRoleRequest.ProtoReflect.Descriptor instead. func (*UpdateOrgMemberRoleRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{39} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{40} } func (x *UpdateOrgMemberRoleRequest) GetOrganizationName() string { @@ -2498,7 +2628,7 @@ type UpdateOrgMemberRoleResponse struct { func (x *UpdateOrgMemberRoleResponse) Reset() { *x = UpdateOrgMemberRoleResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[40] + mi := &file_aes_iam_v1_iam_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2510,7 +2640,7 @@ func (x *UpdateOrgMemberRoleResponse) String() string { func (*UpdateOrgMemberRoleResponse) ProtoMessage() {} func (x *UpdateOrgMemberRoleResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[40] + mi := &file_aes_iam_v1_iam_proto_msgTypes[41] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2523,7 +2653,7 @@ func (x *UpdateOrgMemberRoleResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateOrgMemberRoleResponse.ProtoReflect.Descriptor instead. func (*UpdateOrgMemberRoleResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{40} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{41} } func (x *UpdateOrgMemberRoleResponse) GetMember() *OrgMember { @@ -2554,7 +2684,7 @@ type PendingInvite struct { func (x *PendingInvite) Reset() { *x = PendingInvite{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[41] + mi := &file_aes_iam_v1_iam_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2566,7 +2696,7 @@ func (x *PendingInvite) String() string { func (*PendingInvite) ProtoMessage() {} func (x *PendingInvite) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[41] + mi := &file_aes_iam_v1_iam_proto_msgTypes[42] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2579,7 +2709,7 @@ func (x *PendingInvite) ProtoReflect() protoreflect.Message { // Deprecated: Use PendingInvite.ProtoReflect.Descriptor instead. func (*PendingInvite) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{41} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{42} } func (x *PendingInvite) GetId() string { @@ -2649,7 +2779,7 @@ type ListPendingInvitesRequest struct { func (x *ListPendingInvitesRequest) Reset() { *x = ListPendingInvitesRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[42] + mi := &file_aes_iam_v1_iam_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2661,7 +2791,7 @@ func (x *ListPendingInvitesRequest) String() string { func (*ListPendingInvitesRequest) ProtoMessage() {} func (x *ListPendingInvitesRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[42] + mi := &file_aes_iam_v1_iam_proto_msgTypes[43] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2674,7 +2804,7 @@ func (x *ListPendingInvitesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPendingInvitesRequest.ProtoReflect.Descriptor instead. func (*ListPendingInvitesRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{42} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{43} } func (x *ListPendingInvitesRequest) GetOrganizationName() string { @@ -2708,7 +2838,7 @@ type ListPendingInvitesResponse struct { func (x *ListPendingInvitesResponse) Reset() { *x = ListPendingInvitesResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[43] + mi := &file_aes_iam_v1_iam_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2720,7 +2850,7 @@ func (x *ListPendingInvitesResponse) String() string { func (*ListPendingInvitesResponse) ProtoMessage() {} func (x *ListPendingInvitesResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[43] + mi := &file_aes_iam_v1_iam_proto_msgTypes[44] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2733,7 +2863,7 @@ func (x *ListPendingInvitesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListPendingInvitesResponse.ProtoReflect.Descriptor instead. func (*ListPendingInvitesResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{43} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{44} } func (x *ListPendingInvitesResponse) GetInvites() []*PendingInvite { @@ -2759,7 +2889,7 @@ type ListMyOrganizationsRequest struct { func (x *ListMyOrganizationsRequest) Reset() { *x = ListMyOrganizationsRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[44] + mi := &file_aes_iam_v1_iam_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2771,7 +2901,7 @@ func (x *ListMyOrganizationsRequest) String() string { func (*ListMyOrganizationsRequest) ProtoMessage() {} func (x *ListMyOrganizationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[44] + mi := &file_aes_iam_v1_iam_proto_msgTypes[45] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2784,7 +2914,7 @@ func (x *ListMyOrganizationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMyOrganizationsRequest.ProtoReflect.Descriptor instead. func (*ListMyOrganizationsRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{44} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{45} } type OrgMembership struct { @@ -2799,7 +2929,7 @@ type OrgMembership struct { func (x *OrgMembership) Reset() { *x = OrgMembership{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[45] + mi := &file_aes_iam_v1_iam_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2811,7 +2941,7 @@ func (x *OrgMembership) String() string { func (*OrgMembership) ProtoMessage() {} func (x *OrgMembership) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[45] + mi := &file_aes_iam_v1_iam_proto_msgTypes[46] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2824,7 +2954,7 @@ func (x *OrgMembership) ProtoReflect() protoreflect.Message { // Deprecated: Use OrgMembership.ProtoReflect.Descriptor instead. func (*OrgMembership) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{45} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{46} } func (x *OrgMembership) GetOrganizationName() string { @@ -2864,7 +2994,7 @@ type ListMyOrganizationsResponse struct { func (x *ListMyOrganizationsResponse) Reset() { *x = ListMyOrganizationsResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[46] + mi := &file_aes_iam_v1_iam_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2876,7 +3006,7 @@ func (x *ListMyOrganizationsResponse) String() string { func (*ListMyOrganizationsResponse) ProtoMessage() {} func (x *ListMyOrganizationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[46] + mi := &file_aes_iam_v1_iam_proto_msgTypes[47] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2889,7 +3019,7 @@ func (x *ListMyOrganizationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMyOrganizationsResponse.ProtoReflect.Descriptor instead. func (*ListMyOrganizationsResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{46} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{47} } func (x *ListMyOrganizationsResponse) GetOrganizations() []*OrgMembership { @@ -2907,7 +3037,7 @@ type ListMyInvitesRequest struct { func (x *ListMyInvitesRequest) Reset() { *x = ListMyInvitesRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[47] + mi := &file_aes_iam_v1_iam_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2919,7 +3049,7 @@ func (x *ListMyInvitesRequest) String() string { func (*ListMyInvitesRequest) ProtoMessage() {} func (x *ListMyInvitesRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[47] + mi := &file_aes_iam_v1_iam_proto_msgTypes[48] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2932,7 +3062,7 @@ func (x *ListMyInvitesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMyInvitesRequest.ProtoReflect.Descriptor instead. func (*ListMyInvitesRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{47} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{48} } type MyInvite struct { @@ -2949,7 +3079,7 @@ type MyInvite struct { func (x *MyInvite) Reset() { *x = MyInvite{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[48] + mi := &file_aes_iam_v1_iam_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2961,7 +3091,7 @@ func (x *MyInvite) String() string { func (*MyInvite) ProtoMessage() {} func (x *MyInvite) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[48] + mi := &file_aes_iam_v1_iam_proto_msgTypes[49] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2974,7 +3104,7 @@ func (x *MyInvite) ProtoReflect() protoreflect.Message { // Deprecated: Use MyInvite.ProtoReflect.Descriptor instead. func (*MyInvite) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{48} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{49} } func (x *MyInvite) GetInviteId() string { @@ -3028,7 +3158,7 @@ type ListMyInvitesResponse struct { func (x *ListMyInvitesResponse) Reset() { *x = ListMyInvitesResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[49] + mi := &file_aes_iam_v1_iam_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3040,7 +3170,7 @@ func (x *ListMyInvitesResponse) String() string { func (*ListMyInvitesResponse) ProtoMessage() {} func (x *ListMyInvitesResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[49] + mi := &file_aes_iam_v1_iam_proto_msgTypes[50] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3053,7 +3183,7 @@ func (x *ListMyInvitesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMyInvitesResponse.ProtoReflect.Descriptor instead. func (*ListMyInvitesResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{49} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{50} } func (x *ListMyInvitesResponse) GetInvites() []*MyInvite { @@ -3072,7 +3202,7 @@ type AcceptMyInviteRequest struct { func (x *AcceptMyInviteRequest) Reset() { *x = AcceptMyInviteRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[50] + mi := &file_aes_iam_v1_iam_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3084,7 +3214,7 @@ func (x *AcceptMyInviteRequest) String() string { func (*AcceptMyInviteRequest) ProtoMessage() {} func (x *AcceptMyInviteRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[50] + mi := &file_aes_iam_v1_iam_proto_msgTypes[51] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3097,7 +3227,7 @@ func (x *AcceptMyInviteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AcceptMyInviteRequest.ProtoReflect.Descriptor instead. func (*AcceptMyInviteRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{50} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{51} } func (x *AcceptMyInviteRequest) GetInviteId() string { @@ -3116,7 +3246,7 @@ type AcceptMyInviteResponse struct { func (x *AcceptMyInviteResponse) Reset() { *x = AcceptMyInviteResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[51] + mi := &file_aes_iam_v1_iam_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3128,7 +3258,7 @@ func (x *AcceptMyInviteResponse) String() string { func (*AcceptMyInviteResponse) ProtoMessage() {} func (x *AcceptMyInviteResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[51] + mi := &file_aes_iam_v1_iam_proto_msgTypes[52] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3141,7 +3271,7 @@ func (x *AcceptMyInviteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AcceptMyInviteResponse.ProtoReflect.Descriptor instead. func (*AcceptMyInviteResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{51} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{52} } func (x *AcceptMyInviteResponse) GetOrganizationName() string { @@ -3160,7 +3290,7 @@ type DeclineMyInviteRequest struct { func (x *DeclineMyInviteRequest) Reset() { *x = DeclineMyInviteRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[52] + mi := &file_aes_iam_v1_iam_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3172,7 +3302,7 @@ func (x *DeclineMyInviteRequest) String() string { func (*DeclineMyInviteRequest) ProtoMessage() {} func (x *DeclineMyInviteRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[52] + mi := &file_aes_iam_v1_iam_proto_msgTypes[53] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3185,7 +3315,7 @@ func (x *DeclineMyInviteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeclineMyInviteRequest.ProtoReflect.Descriptor instead. func (*DeclineMyInviteRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{52} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{53} } func (x *DeclineMyInviteRequest) GetInviteId() string { @@ -3203,7 +3333,7 @@ type DeclineMyInviteResponse struct { func (x *DeclineMyInviteResponse) Reset() { *x = DeclineMyInviteResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[53] + mi := &file_aes_iam_v1_iam_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3215,7 +3345,7 @@ func (x *DeclineMyInviteResponse) String() string { func (*DeclineMyInviteResponse) ProtoMessage() {} func (x *DeclineMyInviteResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[53] + mi := &file_aes_iam_v1_iam_proto_msgTypes[54] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3228,7 +3358,7 @@ func (x *DeclineMyInviteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeclineMyInviteResponse.ProtoReflect.Descriptor instead. func (*DeclineMyInviteResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{53} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{54} } type RevokeInviteRequest struct { @@ -3242,7 +3372,7 @@ type RevokeInviteRequest struct { func (x *RevokeInviteRequest) Reset() { *x = RevokeInviteRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[54] + mi := &file_aes_iam_v1_iam_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3254,7 +3384,7 @@ func (x *RevokeInviteRequest) String() string { func (*RevokeInviteRequest) ProtoMessage() {} func (x *RevokeInviteRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[54] + mi := &file_aes_iam_v1_iam_proto_msgTypes[55] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3267,7 +3397,7 @@ func (x *RevokeInviteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeInviteRequest.ProtoReflect.Descriptor instead. func (*RevokeInviteRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{54} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{55} } func (x *RevokeInviteRequest) GetOrganizationName() string { @@ -3292,7 +3422,7 @@ type RevokeInviteResponse struct { func (x *RevokeInviteResponse) Reset() { *x = RevokeInviteResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[55] + mi := &file_aes_iam_v1_iam_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3304,7 +3434,7 @@ func (x *RevokeInviteResponse) String() string { func (*RevokeInviteResponse) ProtoMessage() {} func (x *RevokeInviteResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[55] + mi := &file_aes_iam_v1_iam_proto_msgTypes[56] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3317,7 +3447,7 @@ func (x *RevokeInviteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeInviteResponse.ProtoReflect.Descriptor instead. func (*RevokeInviteResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{55} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{56} } type RotateApiKeyRequest struct { @@ -3332,7 +3462,7 @@ type RotateApiKeyRequest struct { func (x *RotateApiKeyRequest) Reset() { *x = RotateApiKeyRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[56] + mi := &file_aes_iam_v1_iam_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3344,7 +3474,7 @@ func (x *RotateApiKeyRequest) String() string { func (*RotateApiKeyRequest) ProtoMessage() {} func (x *RotateApiKeyRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[56] + mi := &file_aes_iam_v1_iam_proto_msgTypes[57] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3357,7 +3487,7 @@ func (x *RotateApiKeyRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RotateApiKeyRequest.ProtoReflect.Descriptor instead. func (*RotateApiKeyRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{56} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{57} } func (x *RotateApiKeyRequest) GetKeyPrefix() string { @@ -3386,7 +3516,7 @@ type RotateApiKeyResponse struct { func (x *RotateApiKeyResponse) Reset() { *x = RotateApiKeyResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[57] + mi := &file_aes_iam_v1_iam_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3398,7 +3528,7 @@ func (x *RotateApiKeyResponse) String() string { func (*RotateApiKeyResponse) ProtoMessage() {} func (x *RotateApiKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[57] + mi := &file_aes_iam_v1_iam_proto_msgTypes[58] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3411,7 +3541,7 @@ func (x *RotateApiKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RotateApiKeyResponse.ProtoReflect.Descriptor instead. func (*RotateApiKeyResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{57} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{58} } func (x *RotateApiKeyResponse) GetNewApiKey() *ApiKey { @@ -3443,14 +3573,18 @@ type StartOidcLoginRequest struct { RedirectUri string `protobuf:"bytes,2,opt,name=redirect_uri,json=redirectUri,proto3" json:"redirect_uri,omitempty"` // Optional marketing attribution captured on the website at first visit. Applied only when // this sign-in creates a brand-new account; ignored on sign-ins to existing accounts. - Attribution *SignupAttribution `protobuf:"bytes,3,opt,name=attribution,proto3" json:"attribution,omitempty"` + Attribution *SignupAttribution `protobuf:"bytes,3,opt,name=attribution,proto3" json:"attribution,omitempty"` + // Optional "What brings you to Metal Host?" answer. Applied only when this sign-in creates + // a brand-new account; ignored on sign-ins to existing accounts. Rides oidc_login_sessions + // because the OAuth redirect drops URL params. + Survey *SignupSurvey `protobuf:"bytes,4,opt,name=survey,proto3" json:"survey,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } func (x *StartOidcLoginRequest) Reset() { *x = StartOidcLoginRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[58] + mi := &file_aes_iam_v1_iam_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3462,7 +3596,7 @@ func (x *StartOidcLoginRequest) String() string { func (*StartOidcLoginRequest) ProtoMessage() {} func (x *StartOidcLoginRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[58] + mi := &file_aes_iam_v1_iam_proto_msgTypes[59] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3475,7 +3609,7 @@ func (x *StartOidcLoginRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StartOidcLoginRequest.ProtoReflect.Descriptor instead. func (*StartOidcLoginRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{58} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{59} } func (x *StartOidcLoginRequest) GetProviderName() string { @@ -3499,6 +3633,13 @@ func (x *StartOidcLoginRequest) GetAttribution() *SignupAttribution { return nil } +func (x *StartOidcLoginRequest) GetSurvey() *SignupSurvey { + if x != nil { + return x.Survey + } + return nil +} + type StartOidcLoginResponse struct { state protoimpl.MessageState `protogen:"open.v1"` // Browser navigates here. Metalhost-generated state token is embedded; gateway preserves it @@ -3511,7 +3652,7 @@ type StartOidcLoginResponse struct { func (x *StartOidcLoginResponse) Reset() { *x = StartOidcLoginResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[59] + mi := &file_aes_iam_v1_iam_proto_msgTypes[60] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3523,7 +3664,7 @@ func (x *StartOidcLoginResponse) String() string { func (*StartOidcLoginResponse) ProtoMessage() {} func (x *StartOidcLoginResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[59] + mi := &file_aes_iam_v1_iam_proto_msgTypes[60] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3536,7 +3677,7 @@ func (x *StartOidcLoginResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StartOidcLoginResponse.ProtoReflect.Descriptor instead. func (*StartOidcLoginResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{59} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{60} } func (x *StartOidcLoginResponse) GetAuthorizeUrl() string { @@ -3567,7 +3708,7 @@ type CompleteOidcLoginRequest struct { func (x *CompleteOidcLoginRequest) Reset() { *x = CompleteOidcLoginRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[60] + mi := &file_aes_iam_v1_iam_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3579,7 +3720,7 @@ func (x *CompleteOidcLoginRequest) String() string { func (*CompleteOidcLoginRequest) ProtoMessage() {} func (x *CompleteOidcLoginRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[60] + mi := &file_aes_iam_v1_iam_proto_msgTypes[61] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3592,7 +3733,7 @@ func (x *CompleteOidcLoginRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteOidcLoginRequest.ProtoReflect.Descriptor instead. func (*CompleteOidcLoginRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{60} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{61} } func (x *CompleteOidcLoginRequest) GetProviderName() string { @@ -3638,7 +3779,7 @@ type CompleteOidcLoginResponse struct { func (x *CompleteOidcLoginResponse) Reset() { *x = CompleteOidcLoginResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[61] + mi := &file_aes_iam_v1_iam_proto_msgTypes[62] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3650,7 +3791,7 @@ func (x *CompleteOidcLoginResponse) String() string { func (*CompleteOidcLoginResponse) ProtoMessage() {} func (x *CompleteOidcLoginResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[61] + mi := &file_aes_iam_v1_iam_proto_msgTypes[62] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3663,7 +3804,7 @@ func (x *CompleteOidcLoginResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CompleteOidcLoginResponse.ProtoReflect.Descriptor instead. func (*CompleteOidcLoginResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{61} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{62} } func (x *CompleteOidcLoginResponse) GetPrincipal() string { @@ -3708,7 +3849,7 @@ type CreateWorkspaceRequest struct { func (x *CreateWorkspaceRequest) Reset() { *x = CreateWorkspaceRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[62] + mi := &file_aes_iam_v1_iam_proto_msgTypes[63] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3720,7 +3861,7 @@ func (x *CreateWorkspaceRequest) String() string { func (*CreateWorkspaceRequest) ProtoMessage() {} func (x *CreateWorkspaceRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[62] + mi := &file_aes_iam_v1_iam_proto_msgTypes[63] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3733,7 +3874,7 @@ func (x *CreateWorkspaceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateWorkspaceRequest.ProtoReflect.Descriptor instead. func (*CreateWorkspaceRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{62} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{63} } func (x *CreateWorkspaceRequest) GetSlug() string { @@ -3760,7 +3901,7 @@ type CreateWorkspaceResponse struct { func (x *CreateWorkspaceResponse) Reset() { *x = CreateWorkspaceResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[63] + mi := &file_aes_iam_v1_iam_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3772,7 +3913,7 @@ func (x *CreateWorkspaceResponse) String() string { func (*CreateWorkspaceResponse) ProtoMessage() {} func (x *CreateWorkspaceResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[63] + mi := &file_aes_iam_v1_iam_proto_msgTypes[64] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3785,7 +3926,7 @@ func (x *CreateWorkspaceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateWorkspaceResponse.ProtoReflect.Descriptor instead. func (*CreateWorkspaceResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{63} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{64} } func (x *CreateWorkspaceResponse) GetOrganizationName() string { @@ -3811,7 +3952,7 @@ type MFADevice struct { func (x *MFADevice) Reset() { *x = MFADevice{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[64] + mi := &file_aes_iam_v1_iam_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3823,7 +3964,7 @@ func (x *MFADevice) String() string { func (*MFADevice) ProtoMessage() {} func (x *MFADevice) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[64] + mi := &file_aes_iam_v1_iam_proto_msgTypes[65] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3836,7 +3977,7 @@ func (x *MFADevice) ProtoReflect() protoreflect.Message { // Deprecated: Use MFADevice.ProtoReflect.Descriptor instead. func (*MFADevice) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{64} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{65} } func (x *MFADevice) GetName() string { @@ -3897,7 +4038,7 @@ type EnrollMFARequest struct { func (x *EnrollMFARequest) Reset() { *x = EnrollMFARequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[65] + mi := &file_aes_iam_v1_iam_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3909,7 +4050,7 @@ func (x *EnrollMFARequest) String() string { func (*EnrollMFARequest) ProtoMessage() {} func (x *EnrollMFARequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[65] + mi := &file_aes_iam_v1_iam_proto_msgTypes[66] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3922,7 +4063,7 @@ func (x *EnrollMFARequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EnrollMFARequest.ProtoReflect.Descriptor instead. func (*EnrollMFARequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{65} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{66} } func (x *EnrollMFARequest) GetDisplayName() string { @@ -3947,7 +4088,7 @@ type EnrollMFAResponse struct { func (x *EnrollMFAResponse) Reset() { *x = EnrollMFAResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[66] + mi := &file_aes_iam_v1_iam_proto_msgTypes[67] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3959,7 +4100,7 @@ func (x *EnrollMFAResponse) String() string { func (*EnrollMFAResponse) ProtoMessage() {} func (x *EnrollMFAResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[66] + mi := &file_aes_iam_v1_iam_proto_msgTypes[67] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3972,7 +4113,7 @@ func (x *EnrollMFAResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EnrollMFAResponse.ProtoReflect.Descriptor instead. func (*EnrollMFAResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{66} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{67} } func (x *EnrollMFAResponse) GetDevice() *MFADevice { @@ -4007,7 +4148,7 @@ type VerifyMFAEnrollmentRequest struct { func (x *VerifyMFAEnrollmentRequest) Reset() { *x = VerifyMFAEnrollmentRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[67] + mi := &file_aes_iam_v1_iam_proto_msgTypes[68] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4019,7 +4160,7 @@ func (x *VerifyMFAEnrollmentRequest) String() string { func (*VerifyMFAEnrollmentRequest) ProtoMessage() {} func (x *VerifyMFAEnrollmentRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[67] + mi := &file_aes_iam_v1_iam_proto_msgTypes[68] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4032,7 +4173,7 @@ func (x *VerifyMFAEnrollmentRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyMFAEnrollmentRequest.ProtoReflect.Descriptor instead. func (*VerifyMFAEnrollmentRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{67} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{68} } func (x *VerifyMFAEnrollmentRequest) GetName() string { @@ -4061,7 +4202,7 @@ type VerifyMFAEnrollmentResponse struct { func (x *VerifyMFAEnrollmentResponse) Reset() { *x = VerifyMFAEnrollmentResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[68] + mi := &file_aes_iam_v1_iam_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4073,7 +4214,7 @@ func (x *VerifyMFAEnrollmentResponse) String() string { func (*VerifyMFAEnrollmentResponse) ProtoMessage() {} func (x *VerifyMFAEnrollmentResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[68] + mi := &file_aes_iam_v1_iam_proto_msgTypes[69] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4086,7 +4227,7 @@ func (x *VerifyMFAEnrollmentResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use VerifyMFAEnrollmentResponse.ProtoReflect.Descriptor instead. func (*VerifyMFAEnrollmentResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{68} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{69} } func (x *VerifyMFAEnrollmentResponse) GetDevice() *MFADevice { @@ -4111,7 +4252,7 @@ type ListMFADevicesRequest struct { func (x *ListMFADevicesRequest) Reset() { *x = ListMFADevicesRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[69] + mi := &file_aes_iam_v1_iam_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4123,7 +4264,7 @@ func (x *ListMFADevicesRequest) String() string { func (*ListMFADevicesRequest) ProtoMessage() {} func (x *ListMFADevicesRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[69] + mi := &file_aes_iam_v1_iam_proto_msgTypes[70] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4136,7 +4277,7 @@ func (x *ListMFADevicesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMFADevicesRequest.ProtoReflect.Descriptor instead. func (*ListMFADevicesRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{69} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{70} } type ListMFADevicesResponse struct { @@ -4148,7 +4289,7 @@ type ListMFADevicesResponse struct { func (x *ListMFADevicesResponse) Reset() { *x = ListMFADevicesResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[70] + mi := &file_aes_iam_v1_iam_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4160,7 +4301,7 @@ func (x *ListMFADevicesResponse) String() string { func (*ListMFADevicesResponse) ProtoMessage() {} func (x *ListMFADevicesResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[70] + mi := &file_aes_iam_v1_iam_proto_msgTypes[71] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4173,7 +4314,7 @@ func (x *ListMFADevicesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListMFADevicesResponse.ProtoReflect.Descriptor instead. func (*ListMFADevicesResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{70} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{71} } func (x *ListMFADevicesResponse) GetMfaDevices() []*MFADevice { @@ -4192,7 +4333,7 @@ type RevokeMFADeviceRequest struct { func (x *RevokeMFADeviceRequest) Reset() { *x = RevokeMFADeviceRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[71] + mi := &file_aes_iam_v1_iam_proto_msgTypes[72] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4204,7 +4345,7 @@ func (x *RevokeMFADeviceRequest) String() string { func (*RevokeMFADeviceRequest) ProtoMessage() {} func (x *RevokeMFADeviceRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[71] + mi := &file_aes_iam_v1_iam_proto_msgTypes[72] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4217,7 +4358,7 @@ func (x *RevokeMFADeviceRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeMFADeviceRequest.ProtoReflect.Descriptor instead. func (*RevokeMFADeviceRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{71} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{72} } func (x *RevokeMFADeviceRequest) GetName() string { @@ -4235,7 +4376,7 @@ type RevokeMFADeviceResponse struct { func (x *RevokeMFADeviceResponse) Reset() { *x = RevokeMFADeviceResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[72] + mi := &file_aes_iam_v1_iam_proto_msgTypes[73] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4247,7 +4388,7 @@ func (x *RevokeMFADeviceResponse) String() string { func (*RevokeMFADeviceResponse) ProtoMessage() {} func (x *RevokeMFADeviceResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[72] + mi := &file_aes_iam_v1_iam_proto_msgTypes[73] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4260,7 +4401,7 @@ func (x *RevokeMFADeviceResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeMFADeviceResponse.ProtoReflect.Descriptor instead. func (*RevokeMFADeviceResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{72} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{73} } type Session struct { @@ -4285,7 +4426,7 @@ type Session struct { func (x *Session) Reset() { *x = Session{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[73] + mi := &file_aes_iam_v1_iam_proto_msgTypes[74] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4297,7 +4438,7 @@ func (x *Session) String() string { func (*Session) ProtoMessage() {} func (x *Session) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[73] + mi := &file_aes_iam_v1_iam_proto_msgTypes[74] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4310,7 +4451,7 @@ func (x *Session) ProtoReflect() protoreflect.Message { // Deprecated: Use Session.ProtoReflect.Descriptor instead. func (*Session) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{73} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{74} } func (x *Session) GetName() string { @@ -4391,7 +4532,7 @@ type ListSessionsRequest struct { func (x *ListSessionsRequest) Reset() { *x = ListSessionsRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[74] + mi := &file_aes_iam_v1_iam_proto_msgTypes[75] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4403,7 +4544,7 @@ func (x *ListSessionsRequest) String() string { func (*ListSessionsRequest) ProtoMessage() {} func (x *ListSessionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[74] + mi := &file_aes_iam_v1_iam_proto_msgTypes[75] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4416,7 +4557,7 @@ func (x *ListSessionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSessionsRequest.ProtoReflect.Descriptor instead. func (*ListSessionsRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{74} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{75} } type ListSessionsResponse struct { @@ -4428,7 +4569,7 @@ type ListSessionsResponse struct { func (x *ListSessionsResponse) Reset() { *x = ListSessionsResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[75] + mi := &file_aes_iam_v1_iam_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4440,7 +4581,7 @@ func (x *ListSessionsResponse) String() string { func (*ListSessionsResponse) ProtoMessage() {} func (x *ListSessionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[75] + mi := &file_aes_iam_v1_iam_proto_msgTypes[76] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4453,7 +4594,7 @@ func (x *ListSessionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSessionsResponse.ProtoReflect.Descriptor instead. func (*ListSessionsResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{75} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{76} } func (x *ListSessionsResponse) GetSessions() []*Session { @@ -4472,7 +4613,7 @@ type RevokeSessionRequest struct { func (x *RevokeSessionRequest) Reset() { *x = RevokeSessionRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[76] + mi := &file_aes_iam_v1_iam_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4484,7 +4625,7 @@ func (x *RevokeSessionRequest) String() string { func (*RevokeSessionRequest) ProtoMessage() {} func (x *RevokeSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[76] + mi := &file_aes_iam_v1_iam_proto_msgTypes[77] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4497,7 +4638,7 @@ func (x *RevokeSessionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeSessionRequest.ProtoReflect.Descriptor instead. func (*RevokeSessionRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{76} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{77} } func (x *RevokeSessionRequest) GetName() string { @@ -4515,7 +4656,7 @@ type RevokeSessionResponse struct { func (x *RevokeSessionResponse) Reset() { *x = RevokeSessionResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[77] + mi := &file_aes_iam_v1_iam_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4527,7 +4668,7 @@ func (x *RevokeSessionResponse) String() string { func (*RevokeSessionResponse) ProtoMessage() {} func (x *RevokeSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[77] + mi := &file_aes_iam_v1_iam_proto_msgTypes[78] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4540,7 +4681,7 @@ func (x *RevokeSessionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeSessionResponse.ProtoReflect.Descriptor instead. func (*RevokeSessionResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{77} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{78} } type RevokeAllOtherSessionsRequest struct { @@ -4551,7 +4692,7 @@ type RevokeAllOtherSessionsRequest struct { func (x *RevokeAllOtherSessionsRequest) Reset() { *x = RevokeAllOtherSessionsRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[78] + mi := &file_aes_iam_v1_iam_proto_msgTypes[79] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4563,7 +4704,7 @@ func (x *RevokeAllOtherSessionsRequest) String() string { func (*RevokeAllOtherSessionsRequest) ProtoMessage() {} func (x *RevokeAllOtherSessionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[78] + mi := &file_aes_iam_v1_iam_proto_msgTypes[79] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4576,7 +4717,7 @@ func (x *RevokeAllOtherSessionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeAllOtherSessionsRequest.ProtoReflect.Descriptor instead. func (*RevokeAllOtherSessionsRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{78} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{79} } type RevokeAllOtherSessionsResponse struct { @@ -4589,7 +4730,7 @@ type RevokeAllOtherSessionsResponse struct { func (x *RevokeAllOtherSessionsResponse) Reset() { *x = RevokeAllOtherSessionsResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[79] + mi := &file_aes_iam_v1_iam_proto_msgTypes[80] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4601,7 +4742,7 @@ func (x *RevokeAllOtherSessionsResponse) String() string { func (*RevokeAllOtherSessionsResponse) ProtoMessage() {} func (x *RevokeAllOtherSessionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[79] + mi := &file_aes_iam_v1_iam_proto_msgTypes[80] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4614,7 +4755,7 @@ func (x *RevokeAllOtherSessionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeAllOtherSessionsResponse.ProtoReflect.Descriptor instead. func (*RevokeAllOtherSessionsResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{79} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{80} } func (x *RevokeAllOtherSessionsResponse) GetRevokedCount() int32 { @@ -4646,7 +4787,7 @@ type User struct { func (x *User) Reset() { *x = User{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[80] + mi := &file_aes_iam_v1_iam_proto_msgTypes[81] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4658,7 +4799,7 @@ func (x *User) String() string { func (*User) ProtoMessage() {} func (x *User) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[80] + mi := &file_aes_iam_v1_iam_proto_msgTypes[81] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4671,7 +4812,7 @@ func (x *User) ProtoReflect() protoreflect.Message { // Deprecated: Use User.ProtoReflect.Descriptor instead. func (*User) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{80} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{81} } func (x *User) GetName() string { @@ -4732,7 +4873,7 @@ type RequestPasswordResetRequest struct { func (x *RequestPasswordResetRequest) Reset() { *x = RequestPasswordResetRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[81] + mi := &file_aes_iam_v1_iam_proto_msgTypes[82] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4744,7 +4885,7 @@ func (x *RequestPasswordResetRequest) String() string { func (*RequestPasswordResetRequest) ProtoMessage() {} func (x *RequestPasswordResetRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[81] + mi := &file_aes_iam_v1_iam_proto_msgTypes[82] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4757,7 +4898,7 @@ func (x *RequestPasswordResetRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestPasswordResetRequest.ProtoReflect.Descriptor instead. func (*RequestPasswordResetRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{81} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{82} } func (x *RequestPasswordResetRequest) GetEmail() string { @@ -4779,7 +4920,7 @@ type RequestPasswordResetResponse struct { func (x *RequestPasswordResetResponse) Reset() { *x = RequestPasswordResetResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[82] + mi := &file_aes_iam_v1_iam_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4791,7 +4932,7 @@ func (x *RequestPasswordResetResponse) String() string { func (*RequestPasswordResetResponse) ProtoMessage() {} func (x *RequestPasswordResetResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[82] + mi := &file_aes_iam_v1_iam_proto_msgTypes[83] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4804,7 +4945,7 @@ func (x *RequestPasswordResetResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestPasswordResetResponse.ProtoReflect.Descriptor instead. func (*RequestPasswordResetResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{82} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{83} } func (x *RequestPasswordResetResponse) GetOk() bool { @@ -4825,7 +4966,7 @@ type ResetPasswordRequest struct { func (x *ResetPasswordRequest) Reset() { *x = ResetPasswordRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[83] + mi := &file_aes_iam_v1_iam_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4837,7 +4978,7 @@ func (x *ResetPasswordRequest) String() string { func (*ResetPasswordRequest) ProtoMessage() {} func (x *ResetPasswordRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[83] + mi := &file_aes_iam_v1_iam_proto_msgTypes[84] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4850,7 +4991,7 @@ func (x *ResetPasswordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetPasswordRequest.ProtoReflect.Descriptor instead. func (*ResetPasswordRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{83} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{84} } func (x *ResetPasswordRequest) GetToken() string { @@ -4878,7 +5019,7 @@ type ResetPasswordResponse struct { func (x *ResetPasswordResponse) Reset() { *x = ResetPasswordResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[84] + mi := &file_aes_iam_v1_iam_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4890,7 +5031,7 @@ func (x *ResetPasswordResponse) String() string { func (*ResetPasswordResponse) ProtoMessage() {} func (x *ResetPasswordResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[84] + mi := &file_aes_iam_v1_iam_proto_msgTypes[85] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4903,7 +5044,7 @@ func (x *ResetPasswordResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetPasswordResponse.ProtoReflect.Descriptor instead. func (*ResetPasswordResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{84} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{85} } func (x *ResetPasswordResponse) GetPrincipal() string { @@ -4923,7 +5064,7 @@ type GetUserRequest struct { func (x *GetUserRequest) Reset() { *x = GetUserRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[85] + mi := &file_aes_iam_v1_iam_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4935,7 +5076,7 @@ func (x *GetUserRequest) String() string { func (*GetUserRequest) ProtoMessage() {} func (x *GetUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[85] + mi := &file_aes_iam_v1_iam_proto_msgTypes[86] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4948,7 +5089,7 @@ func (x *GetUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead. func (*GetUserRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{85} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{86} } func (x *GetUserRequest) GetName() string { @@ -4967,7 +5108,7 @@ type GetUserResponse struct { func (x *GetUserResponse) Reset() { *x = GetUserResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[86] + mi := &file_aes_iam_v1_iam_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4979,7 +5120,7 @@ func (x *GetUserResponse) String() string { func (*GetUserResponse) ProtoMessage() {} func (x *GetUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[86] + mi := &file_aes_iam_v1_iam_proto_msgTypes[87] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4992,7 +5133,7 @@ func (x *GetUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUserResponse.ProtoReflect.Descriptor instead. func (*GetUserResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{86} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{87} } func (x *GetUserResponse) GetUser() *User { @@ -5013,7 +5154,7 @@ type UpdateUserRequest struct { func (x *UpdateUserRequest) Reset() { *x = UpdateUserRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[87] + mi := &file_aes_iam_v1_iam_proto_msgTypes[88] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5025,7 +5166,7 @@ func (x *UpdateUserRequest) String() string { func (*UpdateUserRequest) ProtoMessage() {} func (x *UpdateUserRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[87] + mi := &file_aes_iam_v1_iam_proto_msgTypes[88] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5038,7 +5179,7 @@ func (x *UpdateUserRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserRequest.ProtoReflect.Descriptor instead. func (*UpdateUserRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{87} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{88} } func (x *UpdateUserRequest) GetName() string { @@ -5064,7 +5205,7 @@ type UpdateUserResponse struct { func (x *UpdateUserResponse) Reset() { *x = UpdateUserResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[88] + mi := &file_aes_iam_v1_iam_proto_msgTypes[89] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5076,7 +5217,7 @@ func (x *UpdateUserResponse) String() string { func (*UpdateUserResponse) ProtoMessage() {} func (x *UpdateUserResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[88] + mi := &file_aes_iam_v1_iam_proto_msgTypes[89] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5089,7 +5230,7 @@ func (x *UpdateUserResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateUserResponse.ProtoReflect.Descriptor instead. func (*UpdateUserResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{88} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{89} } func (x *UpdateUserResponse) GetUser() *User { @@ -5109,7 +5250,7 @@ type ChangePasswordRequest struct { func (x *ChangePasswordRequest) Reset() { *x = ChangePasswordRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[89] + mi := &file_aes_iam_v1_iam_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5121,7 +5262,7 @@ func (x *ChangePasswordRequest) String() string { func (*ChangePasswordRequest) ProtoMessage() {} func (x *ChangePasswordRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[89] + mi := &file_aes_iam_v1_iam_proto_msgTypes[90] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5134,7 +5275,7 @@ func (x *ChangePasswordRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePasswordRequest.ProtoReflect.Descriptor instead. func (*ChangePasswordRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{89} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{90} } func (x *ChangePasswordRequest) GetCurrentPassword() string { @@ -5159,7 +5300,7 @@ type ChangePasswordResponse struct { func (x *ChangePasswordResponse) Reset() { *x = ChangePasswordResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[90] + mi := &file_aes_iam_v1_iam_proto_msgTypes[91] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5171,7 +5312,7 @@ func (x *ChangePasswordResponse) String() string { func (*ChangePasswordResponse) ProtoMessage() {} func (x *ChangePasswordResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[90] + mi := &file_aes_iam_v1_iam_proto_msgTypes[91] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5184,7 +5325,7 @@ func (x *ChangePasswordResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ChangePasswordResponse.ProtoReflect.Descriptor instead. func (*ChangePasswordResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{90} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{91} } type RequestEmailChangeRequest struct { @@ -5197,7 +5338,7 @@ type RequestEmailChangeRequest struct { func (x *RequestEmailChangeRequest) Reset() { *x = RequestEmailChangeRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[91] + mi := &file_aes_iam_v1_iam_proto_msgTypes[92] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5209,7 +5350,7 @@ func (x *RequestEmailChangeRequest) String() string { func (*RequestEmailChangeRequest) ProtoMessage() {} func (x *RequestEmailChangeRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[91] + mi := &file_aes_iam_v1_iam_proto_msgTypes[92] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5222,7 +5363,7 @@ func (x *RequestEmailChangeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestEmailChangeRequest.ProtoReflect.Descriptor instead. func (*RequestEmailChangeRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{91} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{92} } func (x *RequestEmailChangeRequest) GetNewEmail() string { @@ -5240,7 +5381,7 @@ type RequestEmailChangeResponse struct { func (x *RequestEmailChangeResponse) Reset() { *x = RequestEmailChangeResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[92] + mi := &file_aes_iam_v1_iam_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5252,7 +5393,7 @@ func (x *RequestEmailChangeResponse) String() string { func (*RequestEmailChangeResponse) ProtoMessage() {} func (x *RequestEmailChangeResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[92] + mi := &file_aes_iam_v1_iam_proto_msgTypes[93] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5265,7 +5406,7 @@ func (x *RequestEmailChangeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RequestEmailChangeResponse.ProtoReflect.Descriptor instead. func (*RequestEmailChangeResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{92} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{93} } type LogoutRequest struct { @@ -5276,7 +5417,7 @@ type LogoutRequest struct { func (x *LogoutRequest) Reset() { *x = LogoutRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[93] + mi := &file_aes_iam_v1_iam_proto_msgTypes[94] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5288,7 +5429,7 @@ func (x *LogoutRequest) String() string { func (*LogoutRequest) ProtoMessage() {} func (x *LogoutRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[93] + mi := &file_aes_iam_v1_iam_proto_msgTypes[94] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5301,7 +5442,7 @@ func (x *LogoutRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use LogoutRequest.ProtoReflect.Descriptor instead. func (*LogoutRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{93} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{94} } type LogoutResponse struct { @@ -5312,7 +5453,7 @@ type LogoutResponse struct { func (x *LogoutResponse) Reset() { *x = LogoutResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[94] + mi := &file_aes_iam_v1_iam_proto_msgTypes[95] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5324,7 +5465,7 @@ func (x *LogoutResponse) String() string { func (*LogoutResponse) ProtoMessage() {} func (x *LogoutResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[94] + mi := &file_aes_iam_v1_iam_proto_msgTypes[95] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5337,7 +5478,7 @@ func (x *LogoutResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use LogoutResponse.ProtoReflect.Descriptor instead. func (*LogoutResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{94} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{95} } type GetOrgMemberRequest struct { @@ -5352,7 +5493,7 @@ type GetOrgMemberRequest struct { func (x *GetOrgMemberRequest) Reset() { *x = GetOrgMemberRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[95] + mi := &file_aes_iam_v1_iam_proto_msgTypes[96] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5364,7 +5505,7 @@ func (x *GetOrgMemberRequest) String() string { func (*GetOrgMemberRequest) ProtoMessage() {} func (x *GetOrgMemberRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[95] + mi := &file_aes_iam_v1_iam_proto_msgTypes[96] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5377,7 +5518,7 @@ func (x *GetOrgMemberRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOrgMemberRequest.ProtoReflect.Descriptor instead. func (*GetOrgMemberRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{95} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{96} } func (x *GetOrgMemberRequest) GetOrganizationName() string { @@ -5403,7 +5544,7 @@ type GetOrgMemberResponse struct { func (x *GetOrgMemberResponse) Reset() { *x = GetOrgMemberResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[96] + mi := &file_aes_iam_v1_iam_proto_msgTypes[97] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5415,7 +5556,7 @@ func (x *GetOrgMemberResponse) String() string { func (*GetOrgMemberResponse) ProtoMessage() {} func (x *GetOrgMemberResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[96] + mi := &file_aes_iam_v1_iam_proto_msgTypes[97] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5428,7 +5569,7 @@ func (x *GetOrgMemberResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetOrgMemberResponse.ProtoReflect.Descriptor instead. func (*GetOrgMemberResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{96} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{97} } func (x *GetOrgMemberResponse) GetMember() *OrgMember { @@ -5462,7 +5603,7 @@ type ImportGitHubSshKeysRequest struct { func (x *ImportGitHubSshKeysRequest) Reset() { *x = ImportGitHubSshKeysRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[97] + mi := &file_aes_iam_v1_iam_proto_msgTypes[98] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5474,7 +5615,7 @@ func (x *ImportGitHubSshKeysRequest) String() string { func (*ImportGitHubSshKeysRequest) ProtoMessage() {} func (x *ImportGitHubSshKeysRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[97] + mi := &file_aes_iam_v1_iam_proto_msgTypes[98] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5487,7 +5628,7 @@ func (x *ImportGitHubSshKeysRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ImportGitHubSshKeysRequest.ProtoReflect.Descriptor instead. func (*ImportGitHubSshKeysRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{97} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{98} } func (x *ImportGitHubSshKeysRequest) GetProjectName() string { @@ -5531,7 +5672,7 @@ type ImportGitHubSshKeysResponse struct { func (x *ImportGitHubSshKeysResponse) Reset() { *x = ImportGitHubSshKeysResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[98] + mi := &file_aes_iam_v1_iam_proto_msgTypes[99] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5543,7 +5684,7 @@ func (x *ImportGitHubSshKeysResponse) String() string { func (*ImportGitHubSshKeysResponse) ProtoMessage() {} func (x *ImportGitHubSshKeysResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[98] + mi := &file_aes_iam_v1_iam_proto_msgTypes[99] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5556,7 +5697,7 @@ func (x *ImportGitHubSshKeysResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ImportGitHubSshKeysResponse.ProtoReflect.Descriptor instead. func (*ImportGitHubSshKeysResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{98} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{99} } func (x *ImportGitHubSshKeysResponse) GetCreatedSshKeyNames() []string { @@ -5585,7 +5726,7 @@ type SetSessionDefaultProjectRequest struct { func (x *SetSessionDefaultProjectRequest) Reset() { *x = SetSessionDefaultProjectRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[99] + mi := &file_aes_iam_v1_iam_proto_msgTypes[100] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5597,7 +5738,7 @@ func (x *SetSessionDefaultProjectRequest) String() string { func (*SetSessionDefaultProjectRequest) ProtoMessage() {} func (x *SetSessionDefaultProjectRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[99] + mi := &file_aes_iam_v1_iam_proto_msgTypes[100] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5610,7 +5751,7 @@ func (x *SetSessionDefaultProjectRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetSessionDefaultProjectRequest.ProtoReflect.Descriptor instead. func (*SetSessionDefaultProjectRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{99} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{100} } func (x *SetSessionDefaultProjectRequest) GetProjectName() string { @@ -5631,7 +5772,7 @@ type SetSessionDefaultProjectResponse struct { func (x *SetSessionDefaultProjectResponse) Reset() { *x = SetSessionDefaultProjectResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[100] + mi := &file_aes_iam_v1_iam_proto_msgTypes[101] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5643,7 +5784,7 @@ func (x *SetSessionDefaultProjectResponse) String() string { func (*SetSessionDefaultProjectResponse) ProtoMessage() {} func (x *SetSessionDefaultProjectResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[100] + mi := &file_aes_iam_v1_iam_proto_msgTypes[101] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5656,7 +5797,7 @@ func (x *SetSessionDefaultProjectResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetSessionDefaultProjectResponse.ProtoReflect.Descriptor instead. func (*SetSessionDefaultProjectResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{100} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{101} } func (x *SetSessionDefaultProjectResponse) GetProjectName() string { @@ -5684,7 +5825,7 @@ type ListNotificationsRequest struct { func (x *ListNotificationsRequest) Reset() { *x = ListNotificationsRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[101] + mi := &file_aes_iam_v1_iam_proto_msgTypes[102] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5696,7 +5837,7 @@ func (x *ListNotificationsRequest) String() string { func (*ListNotificationsRequest) ProtoMessage() {} func (x *ListNotificationsRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[101] + mi := &file_aes_iam_v1_iam_proto_msgTypes[102] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5709,7 +5850,7 @@ func (x *ListNotificationsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNotificationsRequest.ProtoReflect.Descriptor instead. func (*ListNotificationsRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{101} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{102} } func (x *ListNotificationsRequest) GetOrganizationName() string { @@ -5761,7 +5902,7 @@ type Notification struct { func (x *Notification) Reset() { *x = Notification{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[102] + mi := &file_aes_iam_v1_iam_proto_msgTypes[103] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5773,7 +5914,7 @@ func (x *Notification) String() string { func (*Notification) ProtoMessage() {} func (x *Notification) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[102] + mi := &file_aes_iam_v1_iam_proto_msgTypes[103] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5786,7 +5927,7 @@ func (x *Notification) ProtoReflect() protoreflect.Message { // Deprecated: Use Notification.ProtoReflect.Descriptor instead. func (*Notification) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{102} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{103} } func (x *Notification) GetId() string { @@ -5857,7 +5998,7 @@ type ListNotificationsResponse struct { func (x *ListNotificationsResponse) Reset() { *x = ListNotificationsResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[103] + mi := &file_aes_iam_v1_iam_proto_msgTypes[104] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5869,7 +6010,7 @@ func (x *ListNotificationsResponse) String() string { func (*ListNotificationsResponse) ProtoMessage() {} func (x *ListNotificationsResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[103] + mi := &file_aes_iam_v1_iam_proto_msgTypes[104] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5882,7 +6023,7 @@ func (x *ListNotificationsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListNotificationsResponse.ProtoReflect.Descriptor instead. func (*ListNotificationsResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{103} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{104} } func (x *ListNotificationsResponse) GetNotifications() []*Notification { @@ -5922,7 +6063,7 @@ type MarkNotificationsReadRequest struct { func (x *MarkNotificationsReadRequest) Reset() { *x = MarkNotificationsReadRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[104] + mi := &file_aes_iam_v1_iam_proto_msgTypes[105] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5934,7 +6075,7 @@ func (x *MarkNotificationsReadRequest) String() string { func (*MarkNotificationsReadRequest) ProtoMessage() {} func (x *MarkNotificationsReadRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[104] + mi := &file_aes_iam_v1_iam_proto_msgTypes[105] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5947,7 +6088,7 @@ func (x *MarkNotificationsReadRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use MarkNotificationsReadRequest.ProtoReflect.Descriptor instead. func (*MarkNotificationsReadRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{104} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{105} } func (x *MarkNotificationsReadRequest) GetOrganizationName() string { @@ -5980,7 +6121,7 @@ type MarkNotificationsReadResponse struct { func (x *MarkNotificationsReadResponse) Reset() { *x = MarkNotificationsReadResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[105] + mi := &file_aes_iam_v1_iam_proto_msgTypes[106] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5992,7 +6133,7 @@ func (x *MarkNotificationsReadResponse) String() string { func (*MarkNotificationsReadResponse) ProtoMessage() {} func (x *MarkNotificationsReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[105] + mi := &file_aes_iam_v1_iam_proto_msgTypes[106] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6005,7 +6146,7 @@ func (x *MarkNotificationsReadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use MarkNotificationsReadResponse.ProtoReflect.Descriptor instead. func (*MarkNotificationsReadResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{105} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{106} } func (x *MarkNotificationsReadResponse) GetMarkedCount() int32 { @@ -6025,7 +6166,7 @@ type RegenerateRecoveryCodesRequest struct { func (x *RegenerateRecoveryCodesRequest) Reset() { *x = RegenerateRecoveryCodesRequest{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[106] + mi := &file_aes_iam_v1_iam_proto_msgTypes[107] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6037,7 +6178,7 @@ func (x *RegenerateRecoveryCodesRequest) String() string { func (*RegenerateRecoveryCodesRequest) ProtoMessage() {} func (x *RegenerateRecoveryCodesRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[106] + mi := &file_aes_iam_v1_iam_proto_msgTypes[107] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6050,7 +6191,7 @@ func (x *RegenerateRecoveryCodesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RegenerateRecoveryCodesRequest.ProtoReflect.Descriptor instead. func (*RegenerateRecoveryCodesRequest) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{106} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{107} } func (x *RegenerateRecoveryCodesRequest) GetTotpCode() string { @@ -6070,7 +6211,7 @@ type RegenerateRecoveryCodesResponse struct { func (x *RegenerateRecoveryCodesResponse) Reset() { *x = RegenerateRecoveryCodesResponse{} - mi := &file_aes_iam_v1_iam_proto_msgTypes[107] + mi := &file_aes_iam_v1_iam_proto_msgTypes[108] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6082,7 +6223,7 @@ func (x *RegenerateRecoveryCodesResponse) String() string { func (*RegenerateRecoveryCodesResponse) ProtoMessage() {} func (x *RegenerateRecoveryCodesResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_iam_v1_iam_proto_msgTypes[107] + mi := &file_aes_iam_v1_iam_proto_msgTypes[108] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6095,7 +6236,7 @@ func (x *RegenerateRecoveryCodesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RegenerateRecoveryCodesResponse.ProtoReflect.Descriptor instead. func (*RegenerateRecoveryCodesResponse) Descriptor() ([]byte, []int) { - return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{107} + return file_aes_iam_v1_iam_proto_rawDescGZIP(), []int{108} } func (x *RegenerateRecoveryCodesResponse) GetRecoveryCodes() []string { @@ -6174,14 +6315,18 @@ const file_aes_iam_v1_iam_proto_rawDesc = "" + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\")\n" + "\x13RevokeApiKeyRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\"\x16\n" + - "\x14RevokeApiKeyResponse\"\xeb\x01\n" + + "\x14RevokeApiKeyResponse\"\x9d\x02\n" + "\rSignUpRequest\x12!\n" + "\fdisplay_name\x18\x01 \x01(\tR\vdisplayName\x12\x14\n" + "\x05email\x18\x02 \x01(\tR\x05email\x12\x1a\n" + "\bpassword\x18\x03 \x01(\tR\bpassword\x12\x1b\n" + "\tfull_name\x18\x04 \x01(\tR\bfullName\x12?\n" + "\vattribution\x18\x05 \x01(\v2\x1d.aes.iam.v1.SignupAttributionR\vattribution\x12'\n" + - "\x0fturnstile_token\x18\x06 \x01(\tR\x0eturnstileToken\"\xcd\x02\n" + + "\x0fturnstile_token\x18\x06 \x01(\tR\x0eturnstileToken\x120\n" + + "\x06survey\x18\a \x01(\v2\x18.aes.iam.v1.SignupSurveyR\x06survey\"g\n" + + "\fSignupSurvey\x120\n" + + "\x06intent\x18\x01 \x01(\x0e2\x18.aes.iam.v1.SignupIntentR\x06intent\x12%\n" + + "\x0esomething_else\x18\x02 \x01(\tR\rsomethingElse\"\xcd\x02\n" + "\x11SignupAttribution\x12\x1d\n" + "\n" + "utm_source\x18\x01 \x01(\tR\tutmSource\x12\x1d\n" + @@ -6335,11 +6480,12 @@ const file_aes_iam_v1_iam_proto_rawDesc = "" + "\vnew_api_key\x18\x01 \x01(\v2\x12.aes.iam.v1.ApiKeyR\tnewApiKey\x12\x1d\n" + "\n" + "new_secret\x18\x02 \x01(\tR\tnewSecret\x12,\n" + - "\x12revoked_key_prefix\x18\x03 \x01(\tR\x10revokedKeyPrefix\"\xa0\x01\n" + + "\x12revoked_key_prefix\x18\x03 \x01(\tR\x10revokedKeyPrefix\"\xd2\x01\n" + "\x15StartOidcLoginRequest\x12#\n" + "\rprovider_name\x18\x01 \x01(\tR\fproviderName\x12!\n" + "\fredirect_uri\x18\x02 \x01(\tR\vredirectUri\x12?\n" + - "\vattribution\x18\x03 \x01(\v2\x1d.aes.iam.v1.SignupAttributionR\vattribution\"S\n" + + "\vattribution\x18\x03 \x01(\v2\x1d.aes.iam.v1.SignupAttributionR\vattribution\x120\n" + + "\x06survey\x18\x04 \x01(\v2\x18.aes.iam.v1.SignupSurveyR\x06survey\"S\n" + "\x16StartOidcLoginResponse\x12#\n" + "\rauthorize_url\x18\x01 \x01(\tR\fauthorizeUrl\x12\x14\n" + "\x05state\x18\x02 \x01(\tR\x05state\"\x8c\x01\n" + @@ -6492,7 +6638,14 @@ const file_aes_iam_v1_iam_proto_rawDesc = "" + "\x1eRegenerateRecoveryCodesRequest\x12\x1b\n" + "\ttotp_code\x18\x01 \x01(\tR\btotpCode\"H\n" + "\x1fRegenerateRecoveryCodesResponse\x12%\n" + - "\x0erecovery_codes\x18\x01 \x03(\tR\rrecoveryCodes2\xbb\x1e\n" + + "\x0erecovery_codes\x18\x01 \x03(\tR\rrecoveryCodes*\xdc\x01\n" + + "\fSignupIntent\x12\x1d\n" + + "\x19SIGNUP_INTENT_UNSPECIFIED\x10\x00\x12!\n" + + "\x1dSIGNUP_INTENT_MOVING_WORKLOAD\x10\x01\x12\x1e\n" + + "\x1aSIGNUP_INTENT_STARTING_NEW\x10\x02\x12!\n" + + "\x1dSIGNUP_INTENT_ADDING_CAPACITY\x10\x03\x12%\n" + + "!SIGNUP_INTENT_COMPARING_PROVIDERS\x10\x04\x12 \n" + + "\x1cSIGNUP_INTENT_SOMETHING_ELSE\x10\x052\xbb\x1e\n" + "\n" + "IamService\x12`\n" + "\x11GetCallerIdentity\x12$.aes.iam.v1.GetCallerIdentityRequest\x1a%.aes.iam.v1.GetCallerIdentityResponse\x12Q\n" + @@ -6555,235 +6708,241 @@ func file_aes_iam_v1_iam_proto_rawDescGZIP() []byte { return file_aes_iam_v1_iam_proto_rawDescData } -var file_aes_iam_v1_iam_proto_msgTypes = make([]protoimpl.MessageInfo, 109) +var file_aes_iam_v1_iam_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_aes_iam_v1_iam_proto_msgTypes = make([]protoimpl.MessageInfo, 110) var file_aes_iam_v1_iam_proto_goTypes = []any{ - (*ValidateApiKeyRequest)(nil), // 0: aes.iam.v1.ValidateApiKeyRequest - (*ValidateApiKeyResponse)(nil), // 1: aes.iam.v1.ValidateApiKeyResponse - (*GetAuthMetadataRequest)(nil), // 2: aes.iam.v1.GetAuthMetadataRequest - (*GetAuthMetadataResponse)(nil), // 3: aes.iam.v1.GetAuthMetadataResponse - (*GetCallerIdentityRequest)(nil), // 4: aes.iam.v1.GetCallerIdentityRequest - (*GetCallerIdentityResponse)(nil), // 5: aes.iam.v1.GetCallerIdentityResponse - (*CheckPermissionRequest)(nil), // 6: aes.iam.v1.CheckPermissionRequest - (*CheckPermissionResponse)(nil), // 7: aes.iam.v1.CheckPermissionResponse - (*ValidateOidcTokenRequest)(nil), // 8: aes.iam.v1.ValidateOidcTokenRequest - (*ValidateOidcTokenResponse)(nil), // 9: aes.iam.v1.ValidateOidcTokenResponse - (*ApiKey)(nil), // 10: aes.iam.v1.ApiKey - (*CreateApiKeyRequest)(nil), // 11: aes.iam.v1.CreateApiKeyRequest - (*CreateApiKeyResponse)(nil), // 12: aes.iam.v1.CreateApiKeyResponse - (*ListApiKeysRequest)(nil), // 13: aes.iam.v1.ListApiKeysRequest - (*ListApiKeysResponse)(nil), // 14: aes.iam.v1.ListApiKeysResponse - (*RevokeApiKeyRequest)(nil), // 15: aes.iam.v1.RevokeApiKeyRequest - (*RevokeApiKeyResponse)(nil), // 16: aes.iam.v1.RevokeApiKeyResponse - (*SignUpRequest)(nil), // 17: aes.iam.v1.SignUpRequest - (*SignupAttribution)(nil), // 18: aes.iam.v1.SignupAttribution - (*SignUpResponse)(nil), // 19: aes.iam.v1.SignUpResponse - (*VerifyEmailRequest)(nil), // 20: aes.iam.v1.VerifyEmailRequest - (*VerifyEmailResponse)(nil), // 21: aes.iam.v1.VerifyEmailResponse - (*LoginRequest)(nil), // 22: aes.iam.v1.LoginRequest - (*LoginResponse)(nil), // 23: aes.iam.v1.LoginResponse - (*SubmitMFAChallengeRequest)(nil), // 24: aes.iam.v1.SubmitMFAChallengeRequest - (*SubmitMFAChallengeResponse)(nil), // 25: aes.iam.v1.SubmitMFAChallengeResponse - (*LinkOidcProviderRequest)(nil), // 26: aes.iam.v1.LinkOidcProviderRequest - (*LinkOidcProviderResponse)(nil), // 27: aes.iam.v1.LinkOidcProviderResponse - (*InviteOrgMemberRequest)(nil), // 28: aes.iam.v1.InviteOrgMemberRequest - (*InviteOrgMemberResponse)(nil), // 29: aes.iam.v1.InviteOrgMemberResponse - (*AcceptInviteRequest)(nil), // 30: aes.iam.v1.AcceptInviteRequest - (*SetInitialPasswordRequest)(nil), // 31: aes.iam.v1.SetInitialPasswordRequest - (*SetInitialPasswordResponse)(nil), // 32: aes.iam.v1.SetInitialPasswordResponse - (*AcceptInviteResponse)(nil), // 33: aes.iam.v1.AcceptInviteResponse - (*ListOrgMembersRequest)(nil), // 34: aes.iam.v1.ListOrgMembersRequest - (*OrgMember)(nil), // 35: aes.iam.v1.OrgMember - (*ListOrgMembersResponse)(nil), // 36: aes.iam.v1.ListOrgMembersResponse - (*RemoveOrgMemberRequest)(nil), // 37: aes.iam.v1.RemoveOrgMemberRequest - (*RemoveOrgMemberResponse)(nil), // 38: aes.iam.v1.RemoveOrgMemberResponse - (*UpdateOrgMemberRoleRequest)(nil), // 39: aes.iam.v1.UpdateOrgMemberRoleRequest - (*UpdateOrgMemberRoleResponse)(nil), // 40: aes.iam.v1.UpdateOrgMemberRoleResponse - (*PendingInvite)(nil), // 41: aes.iam.v1.PendingInvite - (*ListPendingInvitesRequest)(nil), // 42: aes.iam.v1.ListPendingInvitesRequest - (*ListPendingInvitesResponse)(nil), // 43: aes.iam.v1.ListPendingInvitesResponse - (*ListMyOrganizationsRequest)(nil), // 44: aes.iam.v1.ListMyOrganizationsRequest - (*OrgMembership)(nil), // 45: aes.iam.v1.OrgMembership - (*ListMyOrganizationsResponse)(nil), // 46: aes.iam.v1.ListMyOrganizationsResponse - (*ListMyInvitesRequest)(nil), // 47: aes.iam.v1.ListMyInvitesRequest - (*MyInvite)(nil), // 48: aes.iam.v1.MyInvite - (*ListMyInvitesResponse)(nil), // 49: aes.iam.v1.ListMyInvitesResponse - (*AcceptMyInviteRequest)(nil), // 50: aes.iam.v1.AcceptMyInviteRequest - (*AcceptMyInviteResponse)(nil), // 51: aes.iam.v1.AcceptMyInviteResponse - (*DeclineMyInviteRequest)(nil), // 52: aes.iam.v1.DeclineMyInviteRequest - (*DeclineMyInviteResponse)(nil), // 53: aes.iam.v1.DeclineMyInviteResponse - (*RevokeInviteRequest)(nil), // 54: aes.iam.v1.RevokeInviteRequest - (*RevokeInviteResponse)(nil), // 55: aes.iam.v1.RevokeInviteResponse - (*RotateApiKeyRequest)(nil), // 56: aes.iam.v1.RotateApiKeyRequest - (*RotateApiKeyResponse)(nil), // 57: aes.iam.v1.RotateApiKeyResponse - (*StartOidcLoginRequest)(nil), // 58: aes.iam.v1.StartOidcLoginRequest - (*StartOidcLoginResponse)(nil), // 59: aes.iam.v1.StartOidcLoginResponse - (*CompleteOidcLoginRequest)(nil), // 60: aes.iam.v1.CompleteOidcLoginRequest - (*CompleteOidcLoginResponse)(nil), // 61: aes.iam.v1.CompleteOidcLoginResponse - (*CreateWorkspaceRequest)(nil), // 62: aes.iam.v1.CreateWorkspaceRequest - (*CreateWorkspaceResponse)(nil), // 63: aes.iam.v1.CreateWorkspaceResponse - (*MFADevice)(nil), // 64: aes.iam.v1.MFADevice - (*EnrollMFARequest)(nil), // 65: aes.iam.v1.EnrollMFARequest - (*EnrollMFAResponse)(nil), // 66: aes.iam.v1.EnrollMFAResponse - (*VerifyMFAEnrollmentRequest)(nil), // 67: aes.iam.v1.VerifyMFAEnrollmentRequest - (*VerifyMFAEnrollmentResponse)(nil), // 68: aes.iam.v1.VerifyMFAEnrollmentResponse - (*ListMFADevicesRequest)(nil), // 69: aes.iam.v1.ListMFADevicesRequest - (*ListMFADevicesResponse)(nil), // 70: aes.iam.v1.ListMFADevicesResponse - (*RevokeMFADeviceRequest)(nil), // 71: aes.iam.v1.RevokeMFADeviceRequest - (*RevokeMFADeviceResponse)(nil), // 72: aes.iam.v1.RevokeMFADeviceResponse - (*Session)(nil), // 73: aes.iam.v1.Session - (*ListSessionsRequest)(nil), // 74: aes.iam.v1.ListSessionsRequest - (*ListSessionsResponse)(nil), // 75: aes.iam.v1.ListSessionsResponse - (*RevokeSessionRequest)(nil), // 76: aes.iam.v1.RevokeSessionRequest - (*RevokeSessionResponse)(nil), // 77: aes.iam.v1.RevokeSessionResponse - (*RevokeAllOtherSessionsRequest)(nil), // 78: aes.iam.v1.RevokeAllOtherSessionsRequest - (*RevokeAllOtherSessionsResponse)(nil), // 79: aes.iam.v1.RevokeAllOtherSessionsResponse - (*User)(nil), // 80: aes.iam.v1.User - (*RequestPasswordResetRequest)(nil), // 81: aes.iam.v1.RequestPasswordResetRequest - (*RequestPasswordResetResponse)(nil), // 82: aes.iam.v1.RequestPasswordResetResponse - (*ResetPasswordRequest)(nil), // 83: aes.iam.v1.ResetPasswordRequest - (*ResetPasswordResponse)(nil), // 84: aes.iam.v1.ResetPasswordResponse - (*GetUserRequest)(nil), // 85: aes.iam.v1.GetUserRequest - (*GetUserResponse)(nil), // 86: aes.iam.v1.GetUserResponse - (*UpdateUserRequest)(nil), // 87: aes.iam.v1.UpdateUserRequest - (*UpdateUserResponse)(nil), // 88: aes.iam.v1.UpdateUserResponse - (*ChangePasswordRequest)(nil), // 89: aes.iam.v1.ChangePasswordRequest - (*ChangePasswordResponse)(nil), // 90: aes.iam.v1.ChangePasswordResponse - (*RequestEmailChangeRequest)(nil), // 91: aes.iam.v1.RequestEmailChangeRequest - (*RequestEmailChangeResponse)(nil), // 92: aes.iam.v1.RequestEmailChangeResponse - (*LogoutRequest)(nil), // 93: aes.iam.v1.LogoutRequest - (*LogoutResponse)(nil), // 94: aes.iam.v1.LogoutResponse - (*GetOrgMemberRequest)(nil), // 95: aes.iam.v1.GetOrgMemberRequest - (*GetOrgMemberResponse)(nil), // 96: aes.iam.v1.GetOrgMemberResponse - (*ImportGitHubSshKeysRequest)(nil), // 97: aes.iam.v1.ImportGitHubSshKeysRequest - (*ImportGitHubSshKeysResponse)(nil), // 98: aes.iam.v1.ImportGitHubSshKeysResponse - (*SetSessionDefaultProjectRequest)(nil), // 99: aes.iam.v1.SetSessionDefaultProjectRequest - (*SetSessionDefaultProjectResponse)(nil), // 100: aes.iam.v1.SetSessionDefaultProjectResponse - (*ListNotificationsRequest)(nil), // 101: aes.iam.v1.ListNotificationsRequest - (*Notification)(nil), // 102: aes.iam.v1.Notification - (*ListNotificationsResponse)(nil), // 103: aes.iam.v1.ListNotificationsResponse - (*MarkNotificationsReadRequest)(nil), // 104: aes.iam.v1.MarkNotificationsReadRequest - (*MarkNotificationsReadResponse)(nil), // 105: aes.iam.v1.MarkNotificationsReadResponse - (*RegenerateRecoveryCodesRequest)(nil), // 106: aes.iam.v1.RegenerateRecoveryCodesRequest - (*RegenerateRecoveryCodesResponse)(nil), // 107: aes.iam.v1.RegenerateRecoveryCodesResponse - nil, // 108: aes.iam.v1.ValidateOidcTokenResponse.ClaimsEntry + (SignupIntent)(0), // 0: aes.iam.v1.SignupIntent + (*ValidateApiKeyRequest)(nil), // 1: aes.iam.v1.ValidateApiKeyRequest + (*ValidateApiKeyResponse)(nil), // 2: aes.iam.v1.ValidateApiKeyResponse + (*GetAuthMetadataRequest)(nil), // 3: aes.iam.v1.GetAuthMetadataRequest + (*GetAuthMetadataResponse)(nil), // 4: aes.iam.v1.GetAuthMetadataResponse + (*GetCallerIdentityRequest)(nil), // 5: aes.iam.v1.GetCallerIdentityRequest + (*GetCallerIdentityResponse)(nil), // 6: aes.iam.v1.GetCallerIdentityResponse + (*CheckPermissionRequest)(nil), // 7: aes.iam.v1.CheckPermissionRequest + (*CheckPermissionResponse)(nil), // 8: aes.iam.v1.CheckPermissionResponse + (*ValidateOidcTokenRequest)(nil), // 9: aes.iam.v1.ValidateOidcTokenRequest + (*ValidateOidcTokenResponse)(nil), // 10: aes.iam.v1.ValidateOidcTokenResponse + (*ApiKey)(nil), // 11: aes.iam.v1.ApiKey + (*CreateApiKeyRequest)(nil), // 12: aes.iam.v1.CreateApiKeyRequest + (*CreateApiKeyResponse)(nil), // 13: aes.iam.v1.CreateApiKeyResponse + (*ListApiKeysRequest)(nil), // 14: aes.iam.v1.ListApiKeysRequest + (*ListApiKeysResponse)(nil), // 15: aes.iam.v1.ListApiKeysResponse + (*RevokeApiKeyRequest)(nil), // 16: aes.iam.v1.RevokeApiKeyRequest + (*RevokeApiKeyResponse)(nil), // 17: aes.iam.v1.RevokeApiKeyResponse + (*SignUpRequest)(nil), // 18: aes.iam.v1.SignUpRequest + (*SignupSurvey)(nil), // 19: aes.iam.v1.SignupSurvey + (*SignupAttribution)(nil), // 20: aes.iam.v1.SignupAttribution + (*SignUpResponse)(nil), // 21: aes.iam.v1.SignUpResponse + (*VerifyEmailRequest)(nil), // 22: aes.iam.v1.VerifyEmailRequest + (*VerifyEmailResponse)(nil), // 23: aes.iam.v1.VerifyEmailResponse + (*LoginRequest)(nil), // 24: aes.iam.v1.LoginRequest + (*LoginResponse)(nil), // 25: aes.iam.v1.LoginResponse + (*SubmitMFAChallengeRequest)(nil), // 26: aes.iam.v1.SubmitMFAChallengeRequest + (*SubmitMFAChallengeResponse)(nil), // 27: aes.iam.v1.SubmitMFAChallengeResponse + (*LinkOidcProviderRequest)(nil), // 28: aes.iam.v1.LinkOidcProviderRequest + (*LinkOidcProviderResponse)(nil), // 29: aes.iam.v1.LinkOidcProviderResponse + (*InviteOrgMemberRequest)(nil), // 30: aes.iam.v1.InviteOrgMemberRequest + (*InviteOrgMemberResponse)(nil), // 31: aes.iam.v1.InviteOrgMemberResponse + (*AcceptInviteRequest)(nil), // 32: aes.iam.v1.AcceptInviteRequest + (*SetInitialPasswordRequest)(nil), // 33: aes.iam.v1.SetInitialPasswordRequest + (*SetInitialPasswordResponse)(nil), // 34: aes.iam.v1.SetInitialPasswordResponse + (*AcceptInviteResponse)(nil), // 35: aes.iam.v1.AcceptInviteResponse + (*ListOrgMembersRequest)(nil), // 36: aes.iam.v1.ListOrgMembersRequest + (*OrgMember)(nil), // 37: aes.iam.v1.OrgMember + (*ListOrgMembersResponse)(nil), // 38: aes.iam.v1.ListOrgMembersResponse + (*RemoveOrgMemberRequest)(nil), // 39: aes.iam.v1.RemoveOrgMemberRequest + (*RemoveOrgMemberResponse)(nil), // 40: aes.iam.v1.RemoveOrgMemberResponse + (*UpdateOrgMemberRoleRequest)(nil), // 41: aes.iam.v1.UpdateOrgMemberRoleRequest + (*UpdateOrgMemberRoleResponse)(nil), // 42: aes.iam.v1.UpdateOrgMemberRoleResponse + (*PendingInvite)(nil), // 43: aes.iam.v1.PendingInvite + (*ListPendingInvitesRequest)(nil), // 44: aes.iam.v1.ListPendingInvitesRequest + (*ListPendingInvitesResponse)(nil), // 45: aes.iam.v1.ListPendingInvitesResponse + (*ListMyOrganizationsRequest)(nil), // 46: aes.iam.v1.ListMyOrganizationsRequest + (*OrgMembership)(nil), // 47: aes.iam.v1.OrgMembership + (*ListMyOrganizationsResponse)(nil), // 48: aes.iam.v1.ListMyOrganizationsResponse + (*ListMyInvitesRequest)(nil), // 49: aes.iam.v1.ListMyInvitesRequest + (*MyInvite)(nil), // 50: aes.iam.v1.MyInvite + (*ListMyInvitesResponse)(nil), // 51: aes.iam.v1.ListMyInvitesResponse + (*AcceptMyInviteRequest)(nil), // 52: aes.iam.v1.AcceptMyInviteRequest + (*AcceptMyInviteResponse)(nil), // 53: aes.iam.v1.AcceptMyInviteResponse + (*DeclineMyInviteRequest)(nil), // 54: aes.iam.v1.DeclineMyInviteRequest + (*DeclineMyInviteResponse)(nil), // 55: aes.iam.v1.DeclineMyInviteResponse + (*RevokeInviteRequest)(nil), // 56: aes.iam.v1.RevokeInviteRequest + (*RevokeInviteResponse)(nil), // 57: aes.iam.v1.RevokeInviteResponse + (*RotateApiKeyRequest)(nil), // 58: aes.iam.v1.RotateApiKeyRequest + (*RotateApiKeyResponse)(nil), // 59: aes.iam.v1.RotateApiKeyResponse + (*StartOidcLoginRequest)(nil), // 60: aes.iam.v1.StartOidcLoginRequest + (*StartOidcLoginResponse)(nil), // 61: aes.iam.v1.StartOidcLoginResponse + (*CompleteOidcLoginRequest)(nil), // 62: aes.iam.v1.CompleteOidcLoginRequest + (*CompleteOidcLoginResponse)(nil), // 63: aes.iam.v1.CompleteOidcLoginResponse + (*CreateWorkspaceRequest)(nil), // 64: aes.iam.v1.CreateWorkspaceRequest + (*CreateWorkspaceResponse)(nil), // 65: aes.iam.v1.CreateWorkspaceResponse + (*MFADevice)(nil), // 66: aes.iam.v1.MFADevice + (*EnrollMFARequest)(nil), // 67: aes.iam.v1.EnrollMFARequest + (*EnrollMFAResponse)(nil), // 68: aes.iam.v1.EnrollMFAResponse + (*VerifyMFAEnrollmentRequest)(nil), // 69: aes.iam.v1.VerifyMFAEnrollmentRequest + (*VerifyMFAEnrollmentResponse)(nil), // 70: aes.iam.v1.VerifyMFAEnrollmentResponse + (*ListMFADevicesRequest)(nil), // 71: aes.iam.v1.ListMFADevicesRequest + (*ListMFADevicesResponse)(nil), // 72: aes.iam.v1.ListMFADevicesResponse + (*RevokeMFADeviceRequest)(nil), // 73: aes.iam.v1.RevokeMFADeviceRequest + (*RevokeMFADeviceResponse)(nil), // 74: aes.iam.v1.RevokeMFADeviceResponse + (*Session)(nil), // 75: aes.iam.v1.Session + (*ListSessionsRequest)(nil), // 76: aes.iam.v1.ListSessionsRequest + (*ListSessionsResponse)(nil), // 77: aes.iam.v1.ListSessionsResponse + (*RevokeSessionRequest)(nil), // 78: aes.iam.v1.RevokeSessionRequest + (*RevokeSessionResponse)(nil), // 79: aes.iam.v1.RevokeSessionResponse + (*RevokeAllOtherSessionsRequest)(nil), // 80: aes.iam.v1.RevokeAllOtherSessionsRequest + (*RevokeAllOtherSessionsResponse)(nil), // 81: aes.iam.v1.RevokeAllOtherSessionsResponse + (*User)(nil), // 82: aes.iam.v1.User + (*RequestPasswordResetRequest)(nil), // 83: aes.iam.v1.RequestPasswordResetRequest + (*RequestPasswordResetResponse)(nil), // 84: aes.iam.v1.RequestPasswordResetResponse + (*ResetPasswordRequest)(nil), // 85: aes.iam.v1.ResetPasswordRequest + (*ResetPasswordResponse)(nil), // 86: aes.iam.v1.ResetPasswordResponse + (*GetUserRequest)(nil), // 87: aes.iam.v1.GetUserRequest + (*GetUserResponse)(nil), // 88: aes.iam.v1.GetUserResponse + (*UpdateUserRequest)(nil), // 89: aes.iam.v1.UpdateUserRequest + (*UpdateUserResponse)(nil), // 90: aes.iam.v1.UpdateUserResponse + (*ChangePasswordRequest)(nil), // 91: aes.iam.v1.ChangePasswordRequest + (*ChangePasswordResponse)(nil), // 92: aes.iam.v1.ChangePasswordResponse + (*RequestEmailChangeRequest)(nil), // 93: aes.iam.v1.RequestEmailChangeRequest + (*RequestEmailChangeResponse)(nil), // 94: aes.iam.v1.RequestEmailChangeResponse + (*LogoutRequest)(nil), // 95: aes.iam.v1.LogoutRequest + (*LogoutResponse)(nil), // 96: aes.iam.v1.LogoutResponse + (*GetOrgMemberRequest)(nil), // 97: aes.iam.v1.GetOrgMemberRequest + (*GetOrgMemberResponse)(nil), // 98: aes.iam.v1.GetOrgMemberResponse + (*ImportGitHubSshKeysRequest)(nil), // 99: aes.iam.v1.ImportGitHubSshKeysRequest + (*ImportGitHubSshKeysResponse)(nil), // 100: aes.iam.v1.ImportGitHubSshKeysResponse + (*SetSessionDefaultProjectRequest)(nil), // 101: aes.iam.v1.SetSessionDefaultProjectRequest + (*SetSessionDefaultProjectResponse)(nil), // 102: aes.iam.v1.SetSessionDefaultProjectResponse + (*ListNotificationsRequest)(nil), // 103: aes.iam.v1.ListNotificationsRequest + (*Notification)(nil), // 104: aes.iam.v1.Notification + (*ListNotificationsResponse)(nil), // 105: aes.iam.v1.ListNotificationsResponse + (*MarkNotificationsReadRequest)(nil), // 106: aes.iam.v1.MarkNotificationsReadRequest + (*MarkNotificationsReadResponse)(nil), // 107: aes.iam.v1.MarkNotificationsReadResponse + (*RegenerateRecoveryCodesRequest)(nil), // 108: aes.iam.v1.RegenerateRecoveryCodesRequest + (*RegenerateRecoveryCodesResponse)(nil), // 109: aes.iam.v1.RegenerateRecoveryCodesResponse + nil, // 110: aes.iam.v1.ValidateOidcTokenResponse.ClaimsEntry } var file_aes_iam_v1_iam_proto_depIdxs = []int32{ - 108, // 0: aes.iam.v1.ValidateOidcTokenResponse.claims:type_name -> aes.iam.v1.ValidateOidcTokenResponse.ClaimsEntry - 10, // 1: aes.iam.v1.CreateApiKeyResponse.api_key:type_name -> aes.iam.v1.ApiKey - 10, // 2: aes.iam.v1.ListApiKeysResponse.api_keys:type_name -> aes.iam.v1.ApiKey - 18, // 3: aes.iam.v1.SignUpRequest.attribution:type_name -> aes.iam.v1.SignupAttribution - 10, // 4: aes.iam.v1.SignUpResponse.api_key:type_name -> aes.iam.v1.ApiKey - 10, // 5: aes.iam.v1.VerifyEmailResponse.api_key:type_name -> aes.iam.v1.ApiKey - 10, // 6: aes.iam.v1.LoginResponse.api_key:type_name -> aes.iam.v1.ApiKey - 10, // 7: aes.iam.v1.SubmitMFAChallengeResponse.api_key:type_name -> aes.iam.v1.ApiKey - 10, // 8: aes.iam.v1.AcceptInviteResponse.api_key:type_name -> aes.iam.v1.ApiKey - 35, // 9: aes.iam.v1.ListOrgMembersResponse.org_members:type_name -> aes.iam.v1.OrgMember - 35, // 10: aes.iam.v1.UpdateOrgMemberRoleResponse.member:type_name -> aes.iam.v1.OrgMember - 41, // 11: aes.iam.v1.ListPendingInvitesResponse.invites:type_name -> aes.iam.v1.PendingInvite - 45, // 12: aes.iam.v1.ListMyOrganizationsResponse.organizations:type_name -> aes.iam.v1.OrgMembership - 48, // 13: aes.iam.v1.ListMyInvitesResponse.invites:type_name -> aes.iam.v1.MyInvite - 10, // 14: aes.iam.v1.RotateApiKeyResponse.new_api_key:type_name -> aes.iam.v1.ApiKey - 18, // 15: aes.iam.v1.StartOidcLoginRequest.attribution:type_name -> aes.iam.v1.SignupAttribution - 10, // 16: aes.iam.v1.CompleteOidcLoginResponse.api_key:type_name -> aes.iam.v1.ApiKey - 64, // 17: aes.iam.v1.EnrollMFAResponse.device:type_name -> aes.iam.v1.MFADevice - 64, // 18: aes.iam.v1.VerifyMFAEnrollmentResponse.device:type_name -> aes.iam.v1.MFADevice - 64, // 19: aes.iam.v1.ListMFADevicesResponse.mfa_devices:type_name -> aes.iam.v1.MFADevice - 73, // 20: aes.iam.v1.ListSessionsResponse.sessions:type_name -> aes.iam.v1.Session - 80, // 21: aes.iam.v1.GetUserResponse.user:type_name -> aes.iam.v1.User - 80, // 22: aes.iam.v1.UpdateUserResponse.user:type_name -> aes.iam.v1.User - 35, // 23: aes.iam.v1.GetOrgMemberResponse.member:type_name -> aes.iam.v1.OrgMember - 102, // 24: aes.iam.v1.ListNotificationsResponse.notifications:type_name -> aes.iam.v1.Notification - 4, // 25: aes.iam.v1.IamService.GetCallerIdentity:input_type -> aes.iam.v1.GetCallerIdentityRequest - 11, // 26: aes.iam.v1.IamService.CreateApiKey:input_type -> aes.iam.v1.CreateApiKeyRequest - 13, // 27: aes.iam.v1.IamService.ListApiKeys:input_type -> aes.iam.v1.ListApiKeysRequest - 15, // 28: aes.iam.v1.IamService.RevokeApiKey:input_type -> aes.iam.v1.RevokeApiKeyRequest - 17, // 29: aes.iam.v1.IamService.SignUp:input_type -> aes.iam.v1.SignUpRequest - 20, // 30: aes.iam.v1.IamService.VerifyEmail:input_type -> aes.iam.v1.VerifyEmailRequest - 22, // 31: aes.iam.v1.IamService.Login:input_type -> aes.iam.v1.LoginRequest - 24, // 32: aes.iam.v1.IamService.SubmitMFAChallenge:input_type -> aes.iam.v1.SubmitMFAChallengeRequest - 26, // 33: aes.iam.v1.IamService.LinkOidcProvider:input_type -> aes.iam.v1.LinkOidcProviderRequest - 28, // 34: aes.iam.v1.IamService.InviteOrgMember:input_type -> aes.iam.v1.InviteOrgMemberRequest - 30, // 35: aes.iam.v1.IamService.AcceptInvite:input_type -> aes.iam.v1.AcceptInviteRequest - 31, // 36: aes.iam.v1.IamService.SetInitialPassword:input_type -> aes.iam.v1.SetInitialPasswordRequest - 34, // 37: aes.iam.v1.IamService.ListOrgMembers:input_type -> aes.iam.v1.ListOrgMembersRequest - 37, // 38: aes.iam.v1.IamService.RemoveOrgMember:input_type -> aes.iam.v1.RemoveOrgMemberRequest - 39, // 39: aes.iam.v1.IamService.UpdateOrgMemberRole:input_type -> aes.iam.v1.UpdateOrgMemberRoleRequest - 42, // 40: aes.iam.v1.IamService.ListPendingInvites:input_type -> aes.iam.v1.ListPendingInvitesRequest - 54, // 41: aes.iam.v1.IamService.RevokeInvite:input_type -> aes.iam.v1.RevokeInviteRequest - 44, // 42: aes.iam.v1.IamService.ListMyOrganizations:input_type -> aes.iam.v1.ListMyOrganizationsRequest - 47, // 43: aes.iam.v1.IamService.ListMyInvites:input_type -> aes.iam.v1.ListMyInvitesRequest - 50, // 44: aes.iam.v1.IamService.AcceptMyInvite:input_type -> aes.iam.v1.AcceptMyInviteRequest - 52, // 45: aes.iam.v1.IamService.DeclineMyInvite:input_type -> aes.iam.v1.DeclineMyInviteRequest - 56, // 46: aes.iam.v1.IamService.RotateApiKey:input_type -> aes.iam.v1.RotateApiKeyRequest - 58, // 47: aes.iam.v1.IamService.StartOidcLogin:input_type -> aes.iam.v1.StartOidcLoginRequest - 60, // 48: aes.iam.v1.IamService.CompleteOidcLogin:input_type -> aes.iam.v1.CompleteOidcLoginRequest - 62, // 49: aes.iam.v1.IamService.CreateWorkspace:input_type -> aes.iam.v1.CreateWorkspaceRequest - 65, // 50: aes.iam.v1.IamService.EnrollMFA:input_type -> aes.iam.v1.EnrollMFARequest - 67, // 51: aes.iam.v1.IamService.VerifyMFAEnrollment:input_type -> aes.iam.v1.VerifyMFAEnrollmentRequest - 69, // 52: aes.iam.v1.IamService.ListMFADevices:input_type -> aes.iam.v1.ListMFADevicesRequest - 71, // 53: aes.iam.v1.IamService.RevokeMFADevice:input_type -> aes.iam.v1.RevokeMFADeviceRequest - 106, // 54: aes.iam.v1.IamService.RegenerateRecoveryCodes:input_type -> aes.iam.v1.RegenerateRecoveryCodesRequest - 74, // 55: aes.iam.v1.IamService.ListSessions:input_type -> aes.iam.v1.ListSessionsRequest - 76, // 56: aes.iam.v1.IamService.RevokeSession:input_type -> aes.iam.v1.RevokeSessionRequest - 78, // 57: aes.iam.v1.IamService.RevokeAllOtherSessions:input_type -> aes.iam.v1.RevokeAllOtherSessionsRequest - 93, // 58: aes.iam.v1.IamService.Logout:input_type -> aes.iam.v1.LogoutRequest - 81, // 59: aes.iam.v1.IamService.RequestPasswordReset:input_type -> aes.iam.v1.RequestPasswordResetRequest - 83, // 60: aes.iam.v1.IamService.ResetPassword:input_type -> aes.iam.v1.ResetPasswordRequest - 85, // 61: aes.iam.v1.IamService.GetUser:input_type -> aes.iam.v1.GetUserRequest - 87, // 62: aes.iam.v1.IamService.UpdateUser:input_type -> aes.iam.v1.UpdateUserRequest - 89, // 63: aes.iam.v1.IamService.ChangePassword:input_type -> aes.iam.v1.ChangePasswordRequest - 91, // 64: aes.iam.v1.IamService.RequestEmailChange:input_type -> aes.iam.v1.RequestEmailChangeRequest - 97, // 65: aes.iam.v1.IamService.ImportGitHubSshKeys:input_type -> aes.iam.v1.ImportGitHubSshKeysRequest - 101, // 66: aes.iam.v1.IamService.ListNotifications:input_type -> aes.iam.v1.ListNotificationsRequest - 104, // 67: aes.iam.v1.IamService.MarkNotificationsRead:input_type -> aes.iam.v1.MarkNotificationsReadRequest - 5, // 68: aes.iam.v1.IamService.GetCallerIdentity:output_type -> aes.iam.v1.GetCallerIdentityResponse - 12, // 69: aes.iam.v1.IamService.CreateApiKey:output_type -> aes.iam.v1.CreateApiKeyResponse - 14, // 70: aes.iam.v1.IamService.ListApiKeys:output_type -> aes.iam.v1.ListApiKeysResponse - 16, // 71: aes.iam.v1.IamService.RevokeApiKey:output_type -> aes.iam.v1.RevokeApiKeyResponse - 19, // 72: aes.iam.v1.IamService.SignUp:output_type -> aes.iam.v1.SignUpResponse - 21, // 73: aes.iam.v1.IamService.VerifyEmail:output_type -> aes.iam.v1.VerifyEmailResponse - 23, // 74: aes.iam.v1.IamService.Login:output_type -> aes.iam.v1.LoginResponse - 25, // 75: aes.iam.v1.IamService.SubmitMFAChallenge:output_type -> aes.iam.v1.SubmitMFAChallengeResponse - 27, // 76: aes.iam.v1.IamService.LinkOidcProvider:output_type -> aes.iam.v1.LinkOidcProviderResponse - 29, // 77: aes.iam.v1.IamService.InviteOrgMember:output_type -> aes.iam.v1.InviteOrgMemberResponse - 33, // 78: aes.iam.v1.IamService.AcceptInvite:output_type -> aes.iam.v1.AcceptInviteResponse - 32, // 79: aes.iam.v1.IamService.SetInitialPassword:output_type -> aes.iam.v1.SetInitialPasswordResponse - 36, // 80: aes.iam.v1.IamService.ListOrgMembers:output_type -> aes.iam.v1.ListOrgMembersResponse - 38, // 81: aes.iam.v1.IamService.RemoveOrgMember:output_type -> aes.iam.v1.RemoveOrgMemberResponse - 40, // 82: aes.iam.v1.IamService.UpdateOrgMemberRole:output_type -> aes.iam.v1.UpdateOrgMemberRoleResponse - 43, // 83: aes.iam.v1.IamService.ListPendingInvites:output_type -> aes.iam.v1.ListPendingInvitesResponse - 55, // 84: aes.iam.v1.IamService.RevokeInvite:output_type -> aes.iam.v1.RevokeInviteResponse - 46, // 85: aes.iam.v1.IamService.ListMyOrganizations:output_type -> aes.iam.v1.ListMyOrganizationsResponse - 49, // 86: aes.iam.v1.IamService.ListMyInvites:output_type -> aes.iam.v1.ListMyInvitesResponse - 51, // 87: aes.iam.v1.IamService.AcceptMyInvite:output_type -> aes.iam.v1.AcceptMyInviteResponse - 53, // 88: aes.iam.v1.IamService.DeclineMyInvite:output_type -> aes.iam.v1.DeclineMyInviteResponse - 57, // 89: aes.iam.v1.IamService.RotateApiKey:output_type -> aes.iam.v1.RotateApiKeyResponse - 59, // 90: aes.iam.v1.IamService.StartOidcLogin:output_type -> aes.iam.v1.StartOidcLoginResponse - 61, // 91: aes.iam.v1.IamService.CompleteOidcLogin:output_type -> aes.iam.v1.CompleteOidcLoginResponse - 63, // 92: aes.iam.v1.IamService.CreateWorkspace:output_type -> aes.iam.v1.CreateWorkspaceResponse - 66, // 93: aes.iam.v1.IamService.EnrollMFA:output_type -> aes.iam.v1.EnrollMFAResponse - 68, // 94: aes.iam.v1.IamService.VerifyMFAEnrollment:output_type -> aes.iam.v1.VerifyMFAEnrollmentResponse - 70, // 95: aes.iam.v1.IamService.ListMFADevices:output_type -> aes.iam.v1.ListMFADevicesResponse - 72, // 96: aes.iam.v1.IamService.RevokeMFADevice:output_type -> aes.iam.v1.RevokeMFADeviceResponse - 107, // 97: aes.iam.v1.IamService.RegenerateRecoveryCodes:output_type -> aes.iam.v1.RegenerateRecoveryCodesResponse - 75, // 98: aes.iam.v1.IamService.ListSessions:output_type -> aes.iam.v1.ListSessionsResponse - 77, // 99: aes.iam.v1.IamService.RevokeSession:output_type -> aes.iam.v1.RevokeSessionResponse - 79, // 100: aes.iam.v1.IamService.RevokeAllOtherSessions:output_type -> aes.iam.v1.RevokeAllOtherSessionsResponse - 94, // 101: aes.iam.v1.IamService.Logout:output_type -> aes.iam.v1.LogoutResponse - 82, // 102: aes.iam.v1.IamService.RequestPasswordReset:output_type -> aes.iam.v1.RequestPasswordResetResponse - 84, // 103: aes.iam.v1.IamService.ResetPassword:output_type -> aes.iam.v1.ResetPasswordResponse - 86, // 104: aes.iam.v1.IamService.GetUser:output_type -> aes.iam.v1.GetUserResponse - 88, // 105: aes.iam.v1.IamService.UpdateUser:output_type -> aes.iam.v1.UpdateUserResponse - 90, // 106: aes.iam.v1.IamService.ChangePassword:output_type -> aes.iam.v1.ChangePasswordResponse - 92, // 107: aes.iam.v1.IamService.RequestEmailChange:output_type -> aes.iam.v1.RequestEmailChangeResponse - 98, // 108: aes.iam.v1.IamService.ImportGitHubSshKeys:output_type -> aes.iam.v1.ImportGitHubSshKeysResponse - 103, // 109: aes.iam.v1.IamService.ListNotifications:output_type -> aes.iam.v1.ListNotificationsResponse - 105, // 110: aes.iam.v1.IamService.MarkNotificationsRead:output_type -> aes.iam.v1.MarkNotificationsReadResponse - 68, // [68:111] is the sub-list for method output_type - 25, // [25:68] is the sub-list for method input_type - 25, // [25:25] is the sub-list for extension type_name - 25, // [25:25] is the sub-list for extension extendee - 0, // [0:25] is the sub-list for field type_name + 110, // 0: aes.iam.v1.ValidateOidcTokenResponse.claims:type_name -> aes.iam.v1.ValidateOidcTokenResponse.ClaimsEntry + 11, // 1: aes.iam.v1.CreateApiKeyResponse.api_key:type_name -> aes.iam.v1.ApiKey + 11, // 2: aes.iam.v1.ListApiKeysResponse.api_keys:type_name -> aes.iam.v1.ApiKey + 20, // 3: aes.iam.v1.SignUpRequest.attribution:type_name -> aes.iam.v1.SignupAttribution + 19, // 4: aes.iam.v1.SignUpRequest.survey:type_name -> aes.iam.v1.SignupSurvey + 0, // 5: aes.iam.v1.SignupSurvey.intent:type_name -> aes.iam.v1.SignupIntent + 11, // 6: aes.iam.v1.SignUpResponse.api_key:type_name -> aes.iam.v1.ApiKey + 11, // 7: aes.iam.v1.VerifyEmailResponse.api_key:type_name -> aes.iam.v1.ApiKey + 11, // 8: aes.iam.v1.LoginResponse.api_key:type_name -> aes.iam.v1.ApiKey + 11, // 9: aes.iam.v1.SubmitMFAChallengeResponse.api_key:type_name -> aes.iam.v1.ApiKey + 11, // 10: aes.iam.v1.AcceptInviteResponse.api_key:type_name -> aes.iam.v1.ApiKey + 37, // 11: aes.iam.v1.ListOrgMembersResponse.org_members:type_name -> aes.iam.v1.OrgMember + 37, // 12: aes.iam.v1.UpdateOrgMemberRoleResponse.member:type_name -> aes.iam.v1.OrgMember + 43, // 13: aes.iam.v1.ListPendingInvitesResponse.invites:type_name -> aes.iam.v1.PendingInvite + 47, // 14: aes.iam.v1.ListMyOrganizationsResponse.organizations:type_name -> aes.iam.v1.OrgMembership + 50, // 15: aes.iam.v1.ListMyInvitesResponse.invites:type_name -> aes.iam.v1.MyInvite + 11, // 16: aes.iam.v1.RotateApiKeyResponse.new_api_key:type_name -> aes.iam.v1.ApiKey + 20, // 17: aes.iam.v1.StartOidcLoginRequest.attribution:type_name -> aes.iam.v1.SignupAttribution + 19, // 18: aes.iam.v1.StartOidcLoginRequest.survey:type_name -> aes.iam.v1.SignupSurvey + 11, // 19: aes.iam.v1.CompleteOidcLoginResponse.api_key:type_name -> aes.iam.v1.ApiKey + 66, // 20: aes.iam.v1.EnrollMFAResponse.device:type_name -> aes.iam.v1.MFADevice + 66, // 21: aes.iam.v1.VerifyMFAEnrollmentResponse.device:type_name -> aes.iam.v1.MFADevice + 66, // 22: aes.iam.v1.ListMFADevicesResponse.mfa_devices:type_name -> aes.iam.v1.MFADevice + 75, // 23: aes.iam.v1.ListSessionsResponse.sessions:type_name -> aes.iam.v1.Session + 82, // 24: aes.iam.v1.GetUserResponse.user:type_name -> aes.iam.v1.User + 82, // 25: aes.iam.v1.UpdateUserResponse.user:type_name -> aes.iam.v1.User + 37, // 26: aes.iam.v1.GetOrgMemberResponse.member:type_name -> aes.iam.v1.OrgMember + 104, // 27: aes.iam.v1.ListNotificationsResponse.notifications:type_name -> aes.iam.v1.Notification + 5, // 28: aes.iam.v1.IamService.GetCallerIdentity:input_type -> aes.iam.v1.GetCallerIdentityRequest + 12, // 29: aes.iam.v1.IamService.CreateApiKey:input_type -> aes.iam.v1.CreateApiKeyRequest + 14, // 30: aes.iam.v1.IamService.ListApiKeys:input_type -> aes.iam.v1.ListApiKeysRequest + 16, // 31: aes.iam.v1.IamService.RevokeApiKey:input_type -> aes.iam.v1.RevokeApiKeyRequest + 18, // 32: aes.iam.v1.IamService.SignUp:input_type -> aes.iam.v1.SignUpRequest + 22, // 33: aes.iam.v1.IamService.VerifyEmail:input_type -> aes.iam.v1.VerifyEmailRequest + 24, // 34: aes.iam.v1.IamService.Login:input_type -> aes.iam.v1.LoginRequest + 26, // 35: aes.iam.v1.IamService.SubmitMFAChallenge:input_type -> aes.iam.v1.SubmitMFAChallengeRequest + 28, // 36: aes.iam.v1.IamService.LinkOidcProvider:input_type -> aes.iam.v1.LinkOidcProviderRequest + 30, // 37: aes.iam.v1.IamService.InviteOrgMember:input_type -> aes.iam.v1.InviteOrgMemberRequest + 32, // 38: aes.iam.v1.IamService.AcceptInvite:input_type -> aes.iam.v1.AcceptInviteRequest + 33, // 39: aes.iam.v1.IamService.SetInitialPassword:input_type -> aes.iam.v1.SetInitialPasswordRequest + 36, // 40: aes.iam.v1.IamService.ListOrgMembers:input_type -> aes.iam.v1.ListOrgMembersRequest + 39, // 41: aes.iam.v1.IamService.RemoveOrgMember:input_type -> aes.iam.v1.RemoveOrgMemberRequest + 41, // 42: aes.iam.v1.IamService.UpdateOrgMemberRole:input_type -> aes.iam.v1.UpdateOrgMemberRoleRequest + 44, // 43: aes.iam.v1.IamService.ListPendingInvites:input_type -> aes.iam.v1.ListPendingInvitesRequest + 56, // 44: aes.iam.v1.IamService.RevokeInvite:input_type -> aes.iam.v1.RevokeInviteRequest + 46, // 45: aes.iam.v1.IamService.ListMyOrganizations:input_type -> aes.iam.v1.ListMyOrganizationsRequest + 49, // 46: aes.iam.v1.IamService.ListMyInvites:input_type -> aes.iam.v1.ListMyInvitesRequest + 52, // 47: aes.iam.v1.IamService.AcceptMyInvite:input_type -> aes.iam.v1.AcceptMyInviteRequest + 54, // 48: aes.iam.v1.IamService.DeclineMyInvite:input_type -> aes.iam.v1.DeclineMyInviteRequest + 58, // 49: aes.iam.v1.IamService.RotateApiKey:input_type -> aes.iam.v1.RotateApiKeyRequest + 60, // 50: aes.iam.v1.IamService.StartOidcLogin:input_type -> aes.iam.v1.StartOidcLoginRequest + 62, // 51: aes.iam.v1.IamService.CompleteOidcLogin:input_type -> aes.iam.v1.CompleteOidcLoginRequest + 64, // 52: aes.iam.v1.IamService.CreateWorkspace:input_type -> aes.iam.v1.CreateWorkspaceRequest + 67, // 53: aes.iam.v1.IamService.EnrollMFA:input_type -> aes.iam.v1.EnrollMFARequest + 69, // 54: aes.iam.v1.IamService.VerifyMFAEnrollment:input_type -> aes.iam.v1.VerifyMFAEnrollmentRequest + 71, // 55: aes.iam.v1.IamService.ListMFADevices:input_type -> aes.iam.v1.ListMFADevicesRequest + 73, // 56: aes.iam.v1.IamService.RevokeMFADevice:input_type -> aes.iam.v1.RevokeMFADeviceRequest + 108, // 57: aes.iam.v1.IamService.RegenerateRecoveryCodes:input_type -> aes.iam.v1.RegenerateRecoveryCodesRequest + 76, // 58: aes.iam.v1.IamService.ListSessions:input_type -> aes.iam.v1.ListSessionsRequest + 78, // 59: aes.iam.v1.IamService.RevokeSession:input_type -> aes.iam.v1.RevokeSessionRequest + 80, // 60: aes.iam.v1.IamService.RevokeAllOtherSessions:input_type -> aes.iam.v1.RevokeAllOtherSessionsRequest + 95, // 61: aes.iam.v1.IamService.Logout:input_type -> aes.iam.v1.LogoutRequest + 83, // 62: aes.iam.v1.IamService.RequestPasswordReset:input_type -> aes.iam.v1.RequestPasswordResetRequest + 85, // 63: aes.iam.v1.IamService.ResetPassword:input_type -> aes.iam.v1.ResetPasswordRequest + 87, // 64: aes.iam.v1.IamService.GetUser:input_type -> aes.iam.v1.GetUserRequest + 89, // 65: aes.iam.v1.IamService.UpdateUser:input_type -> aes.iam.v1.UpdateUserRequest + 91, // 66: aes.iam.v1.IamService.ChangePassword:input_type -> aes.iam.v1.ChangePasswordRequest + 93, // 67: aes.iam.v1.IamService.RequestEmailChange:input_type -> aes.iam.v1.RequestEmailChangeRequest + 99, // 68: aes.iam.v1.IamService.ImportGitHubSshKeys:input_type -> aes.iam.v1.ImportGitHubSshKeysRequest + 103, // 69: aes.iam.v1.IamService.ListNotifications:input_type -> aes.iam.v1.ListNotificationsRequest + 106, // 70: aes.iam.v1.IamService.MarkNotificationsRead:input_type -> aes.iam.v1.MarkNotificationsReadRequest + 6, // 71: aes.iam.v1.IamService.GetCallerIdentity:output_type -> aes.iam.v1.GetCallerIdentityResponse + 13, // 72: aes.iam.v1.IamService.CreateApiKey:output_type -> aes.iam.v1.CreateApiKeyResponse + 15, // 73: aes.iam.v1.IamService.ListApiKeys:output_type -> aes.iam.v1.ListApiKeysResponse + 17, // 74: aes.iam.v1.IamService.RevokeApiKey:output_type -> aes.iam.v1.RevokeApiKeyResponse + 21, // 75: aes.iam.v1.IamService.SignUp:output_type -> aes.iam.v1.SignUpResponse + 23, // 76: aes.iam.v1.IamService.VerifyEmail:output_type -> aes.iam.v1.VerifyEmailResponse + 25, // 77: aes.iam.v1.IamService.Login:output_type -> aes.iam.v1.LoginResponse + 27, // 78: aes.iam.v1.IamService.SubmitMFAChallenge:output_type -> aes.iam.v1.SubmitMFAChallengeResponse + 29, // 79: aes.iam.v1.IamService.LinkOidcProvider:output_type -> aes.iam.v1.LinkOidcProviderResponse + 31, // 80: aes.iam.v1.IamService.InviteOrgMember:output_type -> aes.iam.v1.InviteOrgMemberResponse + 35, // 81: aes.iam.v1.IamService.AcceptInvite:output_type -> aes.iam.v1.AcceptInviteResponse + 34, // 82: aes.iam.v1.IamService.SetInitialPassword:output_type -> aes.iam.v1.SetInitialPasswordResponse + 38, // 83: aes.iam.v1.IamService.ListOrgMembers:output_type -> aes.iam.v1.ListOrgMembersResponse + 40, // 84: aes.iam.v1.IamService.RemoveOrgMember:output_type -> aes.iam.v1.RemoveOrgMemberResponse + 42, // 85: aes.iam.v1.IamService.UpdateOrgMemberRole:output_type -> aes.iam.v1.UpdateOrgMemberRoleResponse + 45, // 86: aes.iam.v1.IamService.ListPendingInvites:output_type -> aes.iam.v1.ListPendingInvitesResponse + 57, // 87: aes.iam.v1.IamService.RevokeInvite:output_type -> aes.iam.v1.RevokeInviteResponse + 48, // 88: aes.iam.v1.IamService.ListMyOrganizations:output_type -> aes.iam.v1.ListMyOrganizationsResponse + 51, // 89: aes.iam.v1.IamService.ListMyInvites:output_type -> aes.iam.v1.ListMyInvitesResponse + 53, // 90: aes.iam.v1.IamService.AcceptMyInvite:output_type -> aes.iam.v1.AcceptMyInviteResponse + 55, // 91: aes.iam.v1.IamService.DeclineMyInvite:output_type -> aes.iam.v1.DeclineMyInviteResponse + 59, // 92: aes.iam.v1.IamService.RotateApiKey:output_type -> aes.iam.v1.RotateApiKeyResponse + 61, // 93: aes.iam.v1.IamService.StartOidcLogin:output_type -> aes.iam.v1.StartOidcLoginResponse + 63, // 94: aes.iam.v1.IamService.CompleteOidcLogin:output_type -> aes.iam.v1.CompleteOidcLoginResponse + 65, // 95: aes.iam.v1.IamService.CreateWorkspace:output_type -> aes.iam.v1.CreateWorkspaceResponse + 68, // 96: aes.iam.v1.IamService.EnrollMFA:output_type -> aes.iam.v1.EnrollMFAResponse + 70, // 97: aes.iam.v1.IamService.VerifyMFAEnrollment:output_type -> aes.iam.v1.VerifyMFAEnrollmentResponse + 72, // 98: aes.iam.v1.IamService.ListMFADevices:output_type -> aes.iam.v1.ListMFADevicesResponse + 74, // 99: aes.iam.v1.IamService.RevokeMFADevice:output_type -> aes.iam.v1.RevokeMFADeviceResponse + 109, // 100: aes.iam.v1.IamService.RegenerateRecoveryCodes:output_type -> aes.iam.v1.RegenerateRecoveryCodesResponse + 77, // 101: aes.iam.v1.IamService.ListSessions:output_type -> aes.iam.v1.ListSessionsResponse + 79, // 102: aes.iam.v1.IamService.RevokeSession:output_type -> aes.iam.v1.RevokeSessionResponse + 81, // 103: aes.iam.v1.IamService.RevokeAllOtherSessions:output_type -> aes.iam.v1.RevokeAllOtherSessionsResponse + 96, // 104: aes.iam.v1.IamService.Logout:output_type -> aes.iam.v1.LogoutResponse + 84, // 105: aes.iam.v1.IamService.RequestPasswordReset:output_type -> aes.iam.v1.RequestPasswordResetResponse + 86, // 106: aes.iam.v1.IamService.ResetPassword:output_type -> aes.iam.v1.ResetPasswordResponse + 88, // 107: aes.iam.v1.IamService.GetUser:output_type -> aes.iam.v1.GetUserResponse + 90, // 108: aes.iam.v1.IamService.UpdateUser:output_type -> aes.iam.v1.UpdateUserResponse + 92, // 109: aes.iam.v1.IamService.ChangePassword:output_type -> aes.iam.v1.ChangePasswordResponse + 94, // 110: aes.iam.v1.IamService.RequestEmailChange:output_type -> aes.iam.v1.RequestEmailChangeResponse + 100, // 111: aes.iam.v1.IamService.ImportGitHubSshKeys:output_type -> aes.iam.v1.ImportGitHubSshKeysResponse + 105, // 112: aes.iam.v1.IamService.ListNotifications:output_type -> aes.iam.v1.ListNotificationsResponse + 107, // 113: aes.iam.v1.IamService.MarkNotificationsRead:output_type -> aes.iam.v1.MarkNotificationsReadResponse + 71, // [71:114] is the sub-list for method output_type + 28, // [28:71] is the sub-list for method input_type + 28, // [28:28] is the sub-list for extension type_name + 28, // [28:28] is the sub-list for extension extendee + 0, // [0:28] is the sub-list for field type_name } func init() { file_aes_iam_v1_iam_proto_init() } @@ -6791,19 +6950,20 @@ func file_aes_iam_v1_iam_proto_init() { if File_aes_iam_v1_iam_proto != nil { return } - file_aes_iam_v1_iam_proto_msgTypes[87].OneofWrappers = []any{} + file_aes_iam_v1_iam_proto_msgTypes[88].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_aes_iam_v1_iam_proto_rawDesc), len(file_aes_iam_v1_iam_proto_rawDesc)), - NumEnums: 0, - NumMessages: 109, + NumEnums: 1, + NumMessages: 110, NumExtensions: 0, NumServices: 1, }, GoTypes: file_aes_iam_v1_iam_proto_goTypes, DependencyIndexes: file_aes_iam_v1_iam_proto_depIdxs, + EnumInfos: file_aes_iam_v1_iam_proto_enumTypes, MessageInfos: file_aes_iam_v1_iam_proto_msgTypes, }.Build() File_aes_iam_v1_iam_proto = out.File diff --git a/gen/go/aes/iam/v1/iamv1connect/automation.connect.go b/gen/go/aes/iam/v1/iamv1connect/automation.connect.go new file mode 100644 index 0000000..7bee87e --- /dev/null +++ b/gen/go/aes/iam/v1/iamv1connect/automation.connect.go @@ -0,0 +1,664 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: aes/iam/v1/automation.proto + +package iamv1connect + +import ( + connect "connectrpc.com/connect" + context "context" + errors "errors" + v1 "github.com/AES-Services/metalhost-sdk/gen/go/aes/iam/v1" + http "net/http" + strings "strings" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // AutomationServiceName is the fully-qualified name of the AutomationService service. + AutomationServiceName = "aes.iam.v1.AutomationService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // AutomationServiceListCapabilitiesProcedure is the fully-qualified name of the AutomationService's + // ListCapabilities RPC. + AutomationServiceListCapabilitiesProcedure = "/aes.iam.v1.AutomationService/ListCapabilities" + // AutomationServiceCreateServiceAccountProcedure is the fully-qualified name of the + // AutomationService's CreateServiceAccount RPC. + AutomationServiceCreateServiceAccountProcedure = "/aes.iam.v1.AutomationService/CreateServiceAccount" + // AutomationServiceGetServiceAccountProcedure is the fully-qualified name of the + // AutomationService's GetServiceAccount RPC. + AutomationServiceGetServiceAccountProcedure = "/aes.iam.v1.AutomationService/GetServiceAccount" + // AutomationServiceListServiceAccountsProcedure is the fully-qualified name of the + // AutomationService's ListServiceAccounts RPC. + AutomationServiceListServiceAccountsProcedure = "/aes.iam.v1.AutomationService/ListServiceAccounts" + // AutomationServiceUpdateServiceAccountProcedure is the fully-qualified name of the + // AutomationService's UpdateServiceAccount RPC. + AutomationServiceUpdateServiceAccountProcedure = "/aes.iam.v1.AutomationService/UpdateServiceAccount" + // AutomationServiceSetServiceAccountStateProcedure is the fully-qualified name of the + // AutomationService's SetServiceAccountState RPC. + AutomationServiceSetServiceAccountStateProcedure = "/aes.iam.v1.AutomationService/SetServiceAccountState" + // AutomationServiceDeleteServiceAccountProcedure is the fully-qualified name of the + // AutomationService's DeleteServiceAccount RPC. + AutomationServiceDeleteServiceAccountProcedure = "/aes.iam.v1.AutomationService/DeleteServiceAccount" + // AutomationServiceCreateCredentialProcedure is the fully-qualified name of the AutomationService's + // CreateCredential RPC. + AutomationServiceCreateCredentialProcedure = "/aes.iam.v1.AutomationService/CreateCredential" + // AutomationServiceListCredentialsProcedure is the fully-qualified name of the AutomationService's + // ListCredentials RPC. + AutomationServiceListCredentialsProcedure = "/aes.iam.v1.AutomationService/ListCredentials" + // AutomationServiceRotateCredentialProcedure is the fully-qualified name of the AutomationService's + // RotateCredential RPC. + AutomationServiceRotateCredentialProcedure = "/aes.iam.v1.AutomationService/RotateCredential" + // AutomationServiceRevokeCredentialProcedure is the fully-qualified name of the AutomationService's + // RevokeCredential RPC. + AutomationServiceRevokeCredentialProcedure = "/aes.iam.v1.AutomationService/RevokeCredential" + // AutomationServiceCreateGitHubTrustProcedure is the fully-qualified name of the + // AutomationService's CreateGitHubTrust RPC. + AutomationServiceCreateGitHubTrustProcedure = "/aes.iam.v1.AutomationService/CreateGitHubTrust" + // AutomationServiceUpdateGitHubTrustProcedure is the fully-qualified name of the + // AutomationService's UpdateGitHubTrust RPC. + AutomationServiceUpdateGitHubTrustProcedure = "/aes.iam.v1.AutomationService/UpdateGitHubTrust" + // AutomationServiceListGitHubTrustsProcedure is the fully-qualified name of the AutomationService's + // ListGitHubTrusts RPC. + AutomationServiceListGitHubTrustsProcedure = "/aes.iam.v1.AutomationService/ListGitHubTrusts" + // AutomationServiceSetGitHubTrustStateProcedure is the fully-qualified name of the + // AutomationService's SetGitHubTrustState RPC. + AutomationServiceSetGitHubTrustStateProcedure = "/aes.iam.v1.AutomationService/SetGitHubTrustState" + // AutomationServiceDeleteGitHubTrustProcedure is the fully-qualified name of the + // AutomationService's DeleteGitHubTrust RPC. + AutomationServiceDeleteGitHubTrustProcedure = "/aes.iam.v1.AutomationService/DeleteGitHubTrust" + // AutomationServiceBeginGitHubSetupProcedure is the fully-qualified name of the AutomationService's + // BeginGitHubSetup RPC. + AutomationServiceBeginGitHubSetupProcedure = "/aes.iam.v1.AutomationService/BeginGitHubSetup" + // AutomationServiceGetGitHubSetupProcedure is the fully-qualified name of the AutomationService's + // GetGitHubSetup RPC. + AutomationServiceGetGitHubSetupProcedure = "/aes.iam.v1.AutomationService/GetGitHubSetup" + // AutomationServiceSubmitGitHubSetupProcedure is the fully-qualified name of the + // AutomationService's SubmitGitHubSetup RPC. + AutomationServiceSubmitGitHubSetupProcedure = "/aes.iam.v1.AutomationService/SubmitGitHubSetup" + // AutomationServiceExchangeGitHubTokenProcedure is the fully-qualified name of the + // AutomationService's ExchangeGitHubToken RPC. + AutomationServiceExchangeGitHubTokenProcedure = "/aes.iam.v1.AutomationService/ExchangeGitHubToken" +) + +// AutomationServiceClient is a client for the aes.iam.v1.AutomationService service. +type AutomationServiceClient interface { + ListCapabilities(context.Context, *connect.Request[v1.ListCapabilitiesRequest]) (*connect.Response[v1.ListCapabilitiesResponse], error) + CreateServiceAccount(context.Context, *connect.Request[v1.CreateServiceAccountRequest]) (*connect.Response[v1.CreateServiceAccountResponse], error) + GetServiceAccount(context.Context, *connect.Request[v1.GetServiceAccountRequest]) (*connect.Response[v1.GetServiceAccountResponse], error) + ListServiceAccounts(context.Context, *connect.Request[v1.ListServiceAccountsRequest]) (*connect.Response[v1.ListServiceAccountsResponse], error) + UpdateServiceAccount(context.Context, *connect.Request[v1.UpdateServiceAccountRequest]) (*connect.Response[v1.UpdateServiceAccountResponse], error) + SetServiceAccountState(context.Context, *connect.Request[v1.SetServiceAccountStateRequest]) (*connect.Response[v1.SetServiceAccountStateResponse], error) + DeleteServiceAccount(context.Context, *connect.Request[v1.DeleteServiceAccountRequest]) (*connect.Response[v1.DeleteServiceAccountResponse], error) + CreateCredential(context.Context, *connect.Request[v1.CreateCredentialRequest]) (*connect.Response[v1.CreateCredentialResponse], error) + ListCredentials(context.Context, *connect.Request[v1.ListCredentialsRequest]) (*connect.Response[v1.ListCredentialsResponse], error) + RotateCredential(context.Context, *connect.Request[v1.RotateCredentialRequest]) (*connect.Response[v1.RotateCredentialResponse], error) + RevokeCredential(context.Context, *connect.Request[v1.RevokeCredentialRequest]) (*connect.Response[v1.RevokeCredentialResponse], error) + CreateGitHubTrust(context.Context, *connect.Request[v1.CreateGitHubTrustRequest]) (*connect.Response[v1.CreateGitHubTrustResponse], error) + UpdateGitHubTrust(context.Context, *connect.Request[v1.UpdateGitHubTrustRequest]) (*connect.Response[v1.UpdateGitHubTrustResponse], error) + ListGitHubTrusts(context.Context, *connect.Request[v1.ListGitHubTrustsRequest]) (*connect.Response[v1.ListGitHubTrustsResponse], error) + SetGitHubTrustState(context.Context, *connect.Request[v1.SetGitHubTrustStateRequest]) (*connect.Response[v1.SetGitHubTrustStateResponse], error) + DeleteGitHubTrust(context.Context, *connect.Request[v1.DeleteGitHubTrustRequest]) (*connect.Response[v1.DeleteGitHubTrustResponse], error) + BeginGitHubSetup(context.Context, *connect.Request[v1.BeginGitHubSetupRequest]) (*connect.Response[v1.BeginGitHubSetupResponse], error) + GetGitHubSetup(context.Context, *connect.Request[v1.GetGitHubSetupRequest]) (*connect.Response[v1.GetGitHubSetupResponse], error) + // Verifies claims for a pending setup; never issues a credential or creates trust. + SubmitGitHubSetup(context.Context, *connect.Request[v1.SubmitGitHubSetupRequest]) (*connect.Response[v1.SubmitGitHubSetupResponse], error) + // Authenticates the signed GitHub assertion, not a Metalhost session. + ExchangeGitHubToken(context.Context, *connect.Request[v1.ExchangeGitHubTokenRequest]) (*connect.Response[v1.ExchangeGitHubTokenResponse], error) +} + +// NewAutomationServiceClient constructs a client for the aes.iam.v1.AutomationService service. By +// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, +// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewAutomationServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) AutomationServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + automationServiceMethods := v1.File_aes_iam_v1_automation_proto.Services().ByName("AutomationService").Methods() + return &automationServiceClient{ + listCapabilities: connect.NewClient[v1.ListCapabilitiesRequest, v1.ListCapabilitiesResponse]( + httpClient, + baseURL+AutomationServiceListCapabilitiesProcedure, + connect.WithSchema(automationServiceMethods.ByName("ListCapabilities")), + connect.WithClientOptions(opts...), + ), + createServiceAccount: connect.NewClient[v1.CreateServiceAccountRequest, v1.CreateServiceAccountResponse]( + httpClient, + baseURL+AutomationServiceCreateServiceAccountProcedure, + connect.WithSchema(automationServiceMethods.ByName("CreateServiceAccount")), + connect.WithClientOptions(opts...), + ), + getServiceAccount: connect.NewClient[v1.GetServiceAccountRequest, v1.GetServiceAccountResponse]( + httpClient, + baseURL+AutomationServiceGetServiceAccountProcedure, + connect.WithSchema(automationServiceMethods.ByName("GetServiceAccount")), + connect.WithClientOptions(opts...), + ), + listServiceAccounts: connect.NewClient[v1.ListServiceAccountsRequest, v1.ListServiceAccountsResponse]( + httpClient, + baseURL+AutomationServiceListServiceAccountsProcedure, + connect.WithSchema(automationServiceMethods.ByName("ListServiceAccounts")), + connect.WithClientOptions(opts...), + ), + updateServiceAccount: connect.NewClient[v1.UpdateServiceAccountRequest, v1.UpdateServiceAccountResponse]( + httpClient, + baseURL+AutomationServiceUpdateServiceAccountProcedure, + connect.WithSchema(automationServiceMethods.ByName("UpdateServiceAccount")), + connect.WithClientOptions(opts...), + ), + setServiceAccountState: connect.NewClient[v1.SetServiceAccountStateRequest, v1.SetServiceAccountStateResponse]( + httpClient, + baseURL+AutomationServiceSetServiceAccountStateProcedure, + connect.WithSchema(automationServiceMethods.ByName("SetServiceAccountState")), + connect.WithClientOptions(opts...), + ), + deleteServiceAccount: connect.NewClient[v1.DeleteServiceAccountRequest, v1.DeleteServiceAccountResponse]( + httpClient, + baseURL+AutomationServiceDeleteServiceAccountProcedure, + connect.WithSchema(automationServiceMethods.ByName("DeleteServiceAccount")), + connect.WithClientOptions(opts...), + ), + createCredential: connect.NewClient[v1.CreateCredentialRequest, v1.CreateCredentialResponse]( + httpClient, + baseURL+AutomationServiceCreateCredentialProcedure, + connect.WithSchema(automationServiceMethods.ByName("CreateCredential")), + connect.WithClientOptions(opts...), + ), + listCredentials: connect.NewClient[v1.ListCredentialsRequest, v1.ListCredentialsResponse]( + httpClient, + baseURL+AutomationServiceListCredentialsProcedure, + connect.WithSchema(automationServiceMethods.ByName("ListCredentials")), + connect.WithClientOptions(opts...), + ), + rotateCredential: connect.NewClient[v1.RotateCredentialRequest, v1.RotateCredentialResponse]( + httpClient, + baseURL+AutomationServiceRotateCredentialProcedure, + connect.WithSchema(automationServiceMethods.ByName("RotateCredential")), + connect.WithClientOptions(opts...), + ), + revokeCredential: connect.NewClient[v1.RevokeCredentialRequest, v1.RevokeCredentialResponse]( + httpClient, + baseURL+AutomationServiceRevokeCredentialProcedure, + connect.WithSchema(automationServiceMethods.ByName("RevokeCredential")), + connect.WithClientOptions(opts...), + ), + createGitHubTrust: connect.NewClient[v1.CreateGitHubTrustRequest, v1.CreateGitHubTrustResponse]( + httpClient, + baseURL+AutomationServiceCreateGitHubTrustProcedure, + connect.WithSchema(automationServiceMethods.ByName("CreateGitHubTrust")), + connect.WithClientOptions(opts...), + ), + updateGitHubTrust: connect.NewClient[v1.UpdateGitHubTrustRequest, v1.UpdateGitHubTrustResponse]( + httpClient, + baseURL+AutomationServiceUpdateGitHubTrustProcedure, + connect.WithSchema(automationServiceMethods.ByName("UpdateGitHubTrust")), + connect.WithClientOptions(opts...), + ), + listGitHubTrusts: connect.NewClient[v1.ListGitHubTrustsRequest, v1.ListGitHubTrustsResponse]( + httpClient, + baseURL+AutomationServiceListGitHubTrustsProcedure, + connect.WithSchema(automationServiceMethods.ByName("ListGitHubTrusts")), + connect.WithClientOptions(opts...), + ), + setGitHubTrustState: connect.NewClient[v1.SetGitHubTrustStateRequest, v1.SetGitHubTrustStateResponse]( + httpClient, + baseURL+AutomationServiceSetGitHubTrustStateProcedure, + connect.WithSchema(automationServiceMethods.ByName("SetGitHubTrustState")), + connect.WithClientOptions(opts...), + ), + deleteGitHubTrust: connect.NewClient[v1.DeleteGitHubTrustRequest, v1.DeleteGitHubTrustResponse]( + httpClient, + baseURL+AutomationServiceDeleteGitHubTrustProcedure, + connect.WithSchema(automationServiceMethods.ByName("DeleteGitHubTrust")), + connect.WithClientOptions(opts...), + ), + beginGitHubSetup: connect.NewClient[v1.BeginGitHubSetupRequest, v1.BeginGitHubSetupResponse]( + httpClient, + baseURL+AutomationServiceBeginGitHubSetupProcedure, + connect.WithSchema(automationServiceMethods.ByName("BeginGitHubSetup")), + connect.WithClientOptions(opts...), + ), + getGitHubSetup: connect.NewClient[v1.GetGitHubSetupRequest, v1.GetGitHubSetupResponse]( + httpClient, + baseURL+AutomationServiceGetGitHubSetupProcedure, + connect.WithSchema(automationServiceMethods.ByName("GetGitHubSetup")), + connect.WithClientOptions(opts...), + ), + submitGitHubSetup: connect.NewClient[v1.SubmitGitHubSetupRequest, v1.SubmitGitHubSetupResponse]( + httpClient, + baseURL+AutomationServiceSubmitGitHubSetupProcedure, + connect.WithSchema(automationServiceMethods.ByName("SubmitGitHubSetup")), + connect.WithClientOptions(opts...), + ), + exchangeGitHubToken: connect.NewClient[v1.ExchangeGitHubTokenRequest, v1.ExchangeGitHubTokenResponse]( + httpClient, + baseURL+AutomationServiceExchangeGitHubTokenProcedure, + connect.WithSchema(automationServiceMethods.ByName("ExchangeGitHubToken")), + connect.WithClientOptions(opts...), + ), + } +} + +// automationServiceClient implements AutomationServiceClient. +type automationServiceClient struct { + listCapabilities *connect.Client[v1.ListCapabilitiesRequest, v1.ListCapabilitiesResponse] + createServiceAccount *connect.Client[v1.CreateServiceAccountRequest, v1.CreateServiceAccountResponse] + getServiceAccount *connect.Client[v1.GetServiceAccountRequest, v1.GetServiceAccountResponse] + listServiceAccounts *connect.Client[v1.ListServiceAccountsRequest, v1.ListServiceAccountsResponse] + updateServiceAccount *connect.Client[v1.UpdateServiceAccountRequest, v1.UpdateServiceAccountResponse] + setServiceAccountState *connect.Client[v1.SetServiceAccountStateRequest, v1.SetServiceAccountStateResponse] + deleteServiceAccount *connect.Client[v1.DeleteServiceAccountRequest, v1.DeleteServiceAccountResponse] + createCredential *connect.Client[v1.CreateCredentialRequest, v1.CreateCredentialResponse] + listCredentials *connect.Client[v1.ListCredentialsRequest, v1.ListCredentialsResponse] + rotateCredential *connect.Client[v1.RotateCredentialRequest, v1.RotateCredentialResponse] + revokeCredential *connect.Client[v1.RevokeCredentialRequest, v1.RevokeCredentialResponse] + createGitHubTrust *connect.Client[v1.CreateGitHubTrustRequest, v1.CreateGitHubTrustResponse] + updateGitHubTrust *connect.Client[v1.UpdateGitHubTrustRequest, v1.UpdateGitHubTrustResponse] + listGitHubTrusts *connect.Client[v1.ListGitHubTrustsRequest, v1.ListGitHubTrustsResponse] + setGitHubTrustState *connect.Client[v1.SetGitHubTrustStateRequest, v1.SetGitHubTrustStateResponse] + deleteGitHubTrust *connect.Client[v1.DeleteGitHubTrustRequest, v1.DeleteGitHubTrustResponse] + beginGitHubSetup *connect.Client[v1.BeginGitHubSetupRequest, v1.BeginGitHubSetupResponse] + getGitHubSetup *connect.Client[v1.GetGitHubSetupRequest, v1.GetGitHubSetupResponse] + submitGitHubSetup *connect.Client[v1.SubmitGitHubSetupRequest, v1.SubmitGitHubSetupResponse] + exchangeGitHubToken *connect.Client[v1.ExchangeGitHubTokenRequest, v1.ExchangeGitHubTokenResponse] +} + +// ListCapabilities calls aes.iam.v1.AutomationService.ListCapabilities. +func (c *automationServiceClient) ListCapabilities(ctx context.Context, req *connect.Request[v1.ListCapabilitiesRequest]) (*connect.Response[v1.ListCapabilitiesResponse], error) { + return c.listCapabilities.CallUnary(ctx, req) +} + +// CreateServiceAccount calls aes.iam.v1.AutomationService.CreateServiceAccount. +func (c *automationServiceClient) CreateServiceAccount(ctx context.Context, req *connect.Request[v1.CreateServiceAccountRequest]) (*connect.Response[v1.CreateServiceAccountResponse], error) { + return c.createServiceAccount.CallUnary(ctx, req) +} + +// GetServiceAccount calls aes.iam.v1.AutomationService.GetServiceAccount. +func (c *automationServiceClient) GetServiceAccount(ctx context.Context, req *connect.Request[v1.GetServiceAccountRequest]) (*connect.Response[v1.GetServiceAccountResponse], error) { + return c.getServiceAccount.CallUnary(ctx, req) +} + +// ListServiceAccounts calls aes.iam.v1.AutomationService.ListServiceAccounts. +func (c *automationServiceClient) ListServiceAccounts(ctx context.Context, req *connect.Request[v1.ListServiceAccountsRequest]) (*connect.Response[v1.ListServiceAccountsResponse], error) { + return c.listServiceAccounts.CallUnary(ctx, req) +} + +// UpdateServiceAccount calls aes.iam.v1.AutomationService.UpdateServiceAccount. +func (c *automationServiceClient) UpdateServiceAccount(ctx context.Context, req *connect.Request[v1.UpdateServiceAccountRequest]) (*connect.Response[v1.UpdateServiceAccountResponse], error) { + return c.updateServiceAccount.CallUnary(ctx, req) +} + +// SetServiceAccountState calls aes.iam.v1.AutomationService.SetServiceAccountState. +func (c *automationServiceClient) SetServiceAccountState(ctx context.Context, req *connect.Request[v1.SetServiceAccountStateRequest]) (*connect.Response[v1.SetServiceAccountStateResponse], error) { + return c.setServiceAccountState.CallUnary(ctx, req) +} + +// DeleteServiceAccount calls aes.iam.v1.AutomationService.DeleteServiceAccount. +func (c *automationServiceClient) DeleteServiceAccount(ctx context.Context, req *connect.Request[v1.DeleteServiceAccountRequest]) (*connect.Response[v1.DeleteServiceAccountResponse], error) { + return c.deleteServiceAccount.CallUnary(ctx, req) +} + +// CreateCredential calls aes.iam.v1.AutomationService.CreateCredential. +func (c *automationServiceClient) CreateCredential(ctx context.Context, req *connect.Request[v1.CreateCredentialRequest]) (*connect.Response[v1.CreateCredentialResponse], error) { + return c.createCredential.CallUnary(ctx, req) +} + +// ListCredentials calls aes.iam.v1.AutomationService.ListCredentials. +func (c *automationServiceClient) ListCredentials(ctx context.Context, req *connect.Request[v1.ListCredentialsRequest]) (*connect.Response[v1.ListCredentialsResponse], error) { + return c.listCredentials.CallUnary(ctx, req) +} + +// RotateCredential calls aes.iam.v1.AutomationService.RotateCredential. +func (c *automationServiceClient) RotateCredential(ctx context.Context, req *connect.Request[v1.RotateCredentialRequest]) (*connect.Response[v1.RotateCredentialResponse], error) { + return c.rotateCredential.CallUnary(ctx, req) +} + +// RevokeCredential calls aes.iam.v1.AutomationService.RevokeCredential. +func (c *automationServiceClient) RevokeCredential(ctx context.Context, req *connect.Request[v1.RevokeCredentialRequest]) (*connect.Response[v1.RevokeCredentialResponse], error) { + return c.revokeCredential.CallUnary(ctx, req) +} + +// CreateGitHubTrust calls aes.iam.v1.AutomationService.CreateGitHubTrust. +func (c *automationServiceClient) CreateGitHubTrust(ctx context.Context, req *connect.Request[v1.CreateGitHubTrustRequest]) (*connect.Response[v1.CreateGitHubTrustResponse], error) { + return c.createGitHubTrust.CallUnary(ctx, req) +} + +// UpdateGitHubTrust calls aes.iam.v1.AutomationService.UpdateGitHubTrust. +func (c *automationServiceClient) UpdateGitHubTrust(ctx context.Context, req *connect.Request[v1.UpdateGitHubTrustRequest]) (*connect.Response[v1.UpdateGitHubTrustResponse], error) { + return c.updateGitHubTrust.CallUnary(ctx, req) +} + +// ListGitHubTrusts calls aes.iam.v1.AutomationService.ListGitHubTrusts. +func (c *automationServiceClient) ListGitHubTrusts(ctx context.Context, req *connect.Request[v1.ListGitHubTrustsRequest]) (*connect.Response[v1.ListGitHubTrustsResponse], error) { + return c.listGitHubTrusts.CallUnary(ctx, req) +} + +// SetGitHubTrustState calls aes.iam.v1.AutomationService.SetGitHubTrustState. +func (c *automationServiceClient) SetGitHubTrustState(ctx context.Context, req *connect.Request[v1.SetGitHubTrustStateRequest]) (*connect.Response[v1.SetGitHubTrustStateResponse], error) { + return c.setGitHubTrustState.CallUnary(ctx, req) +} + +// DeleteGitHubTrust calls aes.iam.v1.AutomationService.DeleteGitHubTrust. +func (c *automationServiceClient) DeleteGitHubTrust(ctx context.Context, req *connect.Request[v1.DeleteGitHubTrustRequest]) (*connect.Response[v1.DeleteGitHubTrustResponse], error) { + return c.deleteGitHubTrust.CallUnary(ctx, req) +} + +// BeginGitHubSetup calls aes.iam.v1.AutomationService.BeginGitHubSetup. +func (c *automationServiceClient) BeginGitHubSetup(ctx context.Context, req *connect.Request[v1.BeginGitHubSetupRequest]) (*connect.Response[v1.BeginGitHubSetupResponse], error) { + return c.beginGitHubSetup.CallUnary(ctx, req) +} + +// GetGitHubSetup calls aes.iam.v1.AutomationService.GetGitHubSetup. +func (c *automationServiceClient) GetGitHubSetup(ctx context.Context, req *connect.Request[v1.GetGitHubSetupRequest]) (*connect.Response[v1.GetGitHubSetupResponse], error) { + return c.getGitHubSetup.CallUnary(ctx, req) +} + +// SubmitGitHubSetup calls aes.iam.v1.AutomationService.SubmitGitHubSetup. +func (c *automationServiceClient) SubmitGitHubSetup(ctx context.Context, req *connect.Request[v1.SubmitGitHubSetupRequest]) (*connect.Response[v1.SubmitGitHubSetupResponse], error) { + return c.submitGitHubSetup.CallUnary(ctx, req) +} + +// ExchangeGitHubToken calls aes.iam.v1.AutomationService.ExchangeGitHubToken. +func (c *automationServiceClient) ExchangeGitHubToken(ctx context.Context, req *connect.Request[v1.ExchangeGitHubTokenRequest]) (*connect.Response[v1.ExchangeGitHubTokenResponse], error) { + return c.exchangeGitHubToken.CallUnary(ctx, req) +} + +// AutomationServiceHandler is an implementation of the aes.iam.v1.AutomationService service. +type AutomationServiceHandler interface { + ListCapabilities(context.Context, *connect.Request[v1.ListCapabilitiesRequest]) (*connect.Response[v1.ListCapabilitiesResponse], error) + CreateServiceAccount(context.Context, *connect.Request[v1.CreateServiceAccountRequest]) (*connect.Response[v1.CreateServiceAccountResponse], error) + GetServiceAccount(context.Context, *connect.Request[v1.GetServiceAccountRequest]) (*connect.Response[v1.GetServiceAccountResponse], error) + ListServiceAccounts(context.Context, *connect.Request[v1.ListServiceAccountsRequest]) (*connect.Response[v1.ListServiceAccountsResponse], error) + UpdateServiceAccount(context.Context, *connect.Request[v1.UpdateServiceAccountRequest]) (*connect.Response[v1.UpdateServiceAccountResponse], error) + SetServiceAccountState(context.Context, *connect.Request[v1.SetServiceAccountStateRequest]) (*connect.Response[v1.SetServiceAccountStateResponse], error) + DeleteServiceAccount(context.Context, *connect.Request[v1.DeleteServiceAccountRequest]) (*connect.Response[v1.DeleteServiceAccountResponse], error) + CreateCredential(context.Context, *connect.Request[v1.CreateCredentialRequest]) (*connect.Response[v1.CreateCredentialResponse], error) + ListCredentials(context.Context, *connect.Request[v1.ListCredentialsRequest]) (*connect.Response[v1.ListCredentialsResponse], error) + RotateCredential(context.Context, *connect.Request[v1.RotateCredentialRequest]) (*connect.Response[v1.RotateCredentialResponse], error) + RevokeCredential(context.Context, *connect.Request[v1.RevokeCredentialRequest]) (*connect.Response[v1.RevokeCredentialResponse], error) + CreateGitHubTrust(context.Context, *connect.Request[v1.CreateGitHubTrustRequest]) (*connect.Response[v1.CreateGitHubTrustResponse], error) + UpdateGitHubTrust(context.Context, *connect.Request[v1.UpdateGitHubTrustRequest]) (*connect.Response[v1.UpdateGitHubTrustResponse], error) + ListGitHubTrusts(context.Context, *connect.Request[v1.ListGitHubTrustsRequest]) (*connect.Response[v1.ListGitHubTrustsResponse], error) + SetGitHubTrustState(context.Context, *connect.Request[v1.SetGitHubTrustStateRequest]) (*connect.Response[v1.SetGitHubTrustStateResponse], error) + DeleteGitHubTrust(context.Context, *connect.Request[v1.DeleteGitHubTrustRequest]) (*connect.Response[v1.DeleteGitHubTrustResponse], error) + BeginGitHubSetup(context.Context, *connect.Request[v1.BeginGitHubSetupRequest]) (*connect.Response[v1.BeginGitHubSetupResponse], error) + GetGitHubSetup(context.Context, *connect.Request[v1.GetGitHubSetupRequest]) (*connect.Response[v1.GetGitHubSetupResponse], error) + // Verifies claims for a pending setup; never issues a credential or creates trust. + SubmitGitHubSetup(context.Context, *connect.Request[v1.SubmitGitHubSetupRequest]) (*connect.Response[v1.SubmitGitHubSetupResponse], error) + // Authenticates the signed GitHub assertion, not a Metalhost session. + ExchangeGitHubToken(context.Context, *connect.Request[v1.ExchangeGitHubTokenRequest]) (*connect.Response[v1.ExchangeGitHubTokenResponse], error) +} + +// NewAutomationServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewAutomationServiceHandler(svc AutomationServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + automationServiceMethods := v1.File_aes_iam_v1_automation_proto.Services().ByName("AutomationService").Methods() + automationServiceListCapabilitiesHandler := connect.NewUnaryHandler( + AutomationServiceListCapabilitiesProcedure, + svc.ListCapabilities, + connect.WithSchema(automationServiceMethods.ByName("ListCapabilities")), + connect.WithHandlerOptions(opts...), + ) + automationServiceCreateServiceAccountHandler := connect.NewUnaryHandler( + AutomationServiceCreateServiceAccountProcedure, + svc.CreateServiceAccount, + connect.WithSchema(automationServiceMethods.ByName("CreateServiceAccount")), + connect.WithHandlerOptions(opts...), + ) + automationServiceGetServiceAccountHandler := connect.NewUnaryHandler( + AutomationServiceGetServiceAccountProcedure, + svc.GetServiceAccount, + connect.WithSchema(automationServiceMethods.ByName("GetServiceAccount")), + connect.WithHandlerOptions(opts...), + ) + automationServiceListServiceAccountsHandler := connect.NewUnaryHandler( + AutomationServiceListServiceAccountsProcedure, + svc.ListServiceAccounts, + connect.WithSchema(automationServiceMethods.ByName("ListServiceAccounts")), + connect.WithHandlerOptions(opts...), + ) + automationServiceUpdateServiceAccountHandler := connect.NewUnaryHandler( + AutomationServiceUpdateServiceAccountProcedure, + svc.UpdateServiceAccount, + connect.WithSchema(automationServiceMethods.ByName("UpdateServiceAccount")), + connect.WithHandlerOptions(opts...), + ) + automationServiceSetServiceAccountStateHandler := connect.NewUnaryHandler( + AutomationServiceSetServiceAccountStateProcedure, + svc.SetServiceAccountState, + connect.WithSchema(automationServiceMethods.ByName("SetServiceAccountState")), + connect.WithHandlerOptions(opts...), + ) + automationServiceDeleteServiceAccountHandler := connect.NewUnaryHandler( + AutomationServiceDeleteServiceAccountProcedure, + svc.DeleteServiceAccount, + connect.WithSchema(automationServiceMethods.ByName("DeleteServiceAccount")), + connect.WithHandlerOptions(opts...), + ) + automationServiceCreateCredentialHandler := connect.NewUnaryHandler( + AutomationServiceCreateCredentialProcedure, + svc.CreateCredential, + connect.WithSchema(automationServiceMethods.ByName("CreateCredential")), + connect.WithHandlerOptions(opts...), + ) + automationServiceListCredentialsHandler := connect.NewUnaryHandler( + AutomationServiceListCredentialsProcedure, + svc.ListCredentials, + connect.WithSchema(automationServiceMethods.ByName("ListCredentials")), + connect.WithHandlerOptions(opts...), + ) + automationServiceRotateCredentialHandler := connect.NewUnaryHandler( + AutomationServiceRotateCredentialProcedure, + svc.RotateCredential, + connect.WithSchema(automationServiceMethods.ByName("RotateCredential")), + connect.WithHandlerOptions(opts...), + ) + automationServiceRevokeCredentialHandler := connect.NewUnaryHandler( + AutomationServiceRevokeCredentialProcedure, + svc.RevokeCredential, + connect.WithSchema(automationServiceMethods.ByName("RevokeCredential")), + connect.WithHandlerOptions(opts...), + ) + automationServiceCreateGitHubTrustHandler := connect.NewUnaryHandler( + AutomationServiceCreateGitHubTrustProcedure, + svc.CreateGitHubTrust, + connect.WithSchema(automationServiceMethods.ByName("CreateGitHubTrust")), + connect.WithHandlerOptions(opts...), + ) + automationServiceUpdateGitHubTrustHandler := connect.NewUnaryHandler( + AutomationServiceUpdateGitHubTrustProcedure, + svc.UpdateGitHubTrust, + connect.WithSchema(automationServiceMethods.ByName("UpdateGitHubTrust")), + connect.WithHandlerOptions(opts...), + ) + automationServiceListGitHubTrustsHandler := connect.NewUnaryHandler( + AutomationServiceListGitHubTrustsProcedure, + svc.ListGitHubTrusts, + connect.WithSchema(automationServiceMethods.ByName("ListGitHubTrusts")), + connect.WithHandlerOptions(opts...), + ) + automationServiceSetGitHubTrustStateHandler := connect.NewUnaryHandler( + AutomationServiceSetGitHubTrustStateProcedure, + svc.SetGitHubTrustState, + connect.WithSchema(automationServiceMethods.ByName("SetGitHubTrustState")), + connect.WithHandlerOptions(opts...), + ) + automationServiceDeleteGitHubTrustHandler := connect.NewUnaryHandler( + AutomationServiceDeleteGitHubTrustProcedure, + svc.DeleteGitHubTrust, + connect.WithSchema(automationServiceMethods.ByName("DeleteGitHubTrust")), + connect.WithHandlerOptions(opts...), + ) + automationServiceBeginGitHubSetupHandler := connect.NewUnaryHandler( + AutomationServiceBeginGitHubSetupProcedure, + svc.BeginGitHubSetup, + connect.WithSchema(automationServiceMethods.ByName("BeginGitHubSetup")), + connect.WithHandlerOptions(opts...), + ) + automationServiceGetGitHubSetupHandler := connect.NewUnaryHandler( + AutomationServiceGetGitHubSetupProcedure, + svc.GetGitHubSetup, + connect.WithSchema(automationServiceMethods.ByName("GetGitHubSetup")), + connect.WithHandlerOptions(opts...), + ) + automationServiceSubmitGitHubSetupHandler := connect.NewUnaryHandler( + AutomationServiceSubmitGitHubSetupProcedure, + svc.SubmitGitHubSetup, + connect.WithSchema(automationServiceMethods.ByName("SubmitGitHubSetup")), + connect.WithHandlerOptions(opts...), + ) + automationServiceExchangeGitHubTokenHandler := connect.NewUnaryHandler( + AutomationServiceExchangeGitHubTokenProcedure, + svc.ExchangeGitHubToken, + connect.WithSchema(automationServiceMethods.ByName("ExchangeGitHubToken")), + connect.WithHandlerOptions(opts...), + ) + return "/aes.iam.v1.AutomationService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case AutomationServiceListCapabilitiesProcedure: + automationServiceListCapabilitiesHandler.ServeHTTP(w, r) + case AutomationServiceCreateServiceAccountProcedure: + automationServiceCreateServiceAccountHandler.ServeHTTP(w, r) + case AutomationServiceGetServiceAccountProcedure: + automationServiceGetServiceAccountHandler.ServeHTTP(w, r) + case AutomationServiceListServiceAccountsProcedure: + automationServiceListServiceAccountsHandler.ServeHTTP(w, r) + case AutomationServiceUpdateServiceAccountProcedure: + automationServiceUpdateServiceAccountHandler.ServeHTTP(w, r) + case AutomationServiceSetServiceAccountStateProcedure: + automationServiceSetServiceAccountStateHandler.ServeHTTP(w, r) + case AutomationServiceDeleteServiceAccountProcedure: + automationServiceDeleteServiceAccountHandler.ServeHTTP(w, r) + case AutomationServiceCreateCredentialProcedure: + automationServiceCreateCredentialHandler.ServeHTTP(w, r) + case AutomationServiceListCredentialsProcedure: + automationServiceListCredentialsHandler.ServeHTTP(w, r) + case AutomationServiceRotateCredentialProcedure: + automationServiceRotateCredentialHandler.ServeHTTP(w, r) + case AutomationServiceRevokeCredentialProcedure: + automationServiceRevokeCredentialHandler.ServeHTTP(w, r) + case AutomationServiceCreateGitHubTrustProcedure: + automationServiceCreateGitHubTrustHandler.ServeHTTP(w, r) + case AutomationServiceUpdateGitHubTrustProcedure: + automationServiceUpdateGitHubTrustHandler.ServeHTTP(w, r) + case AutomationServiceListGitHubTrustsProcedure: + automationServiceListGitHubTrustsHandler.ServeHTTP(w, r) + case AutomationServiceSetGitHubTrustStateProcedure: + automationServiceSetGitHubTrustStateHandler.ServeHTTP(w, r) + case AutomationServiceDeleteGitHubTrustProcedure: + automationServiceDeleteGitHubTrustHandler.ServeHTTP(w, r) + case AutomationServiceBeginGitHubSetupProcedure: + automationServiceBeginGitHubSetupHandler.ServeHTTP(w, r) + case AutomationServiceGetGitHubSetupProcedure: + automationServiceGetGitHubSetupHandler.ServeHTTP(w, r) + case AutomationServiceSubmitGitHubSetupProcedure: + automationServiceSubmitGitHubSetupHandler.ServeHTTP(w, r) + case AutomationServiceExchangeGitHubTokenProcedure: + automationServiceExchangeGitHubTokenHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedAutomationServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedAutomationServiceHandler struct{} + +func (UnimplementedAutomationServiceHandler) ListCapabilities(context.Context, *connect.Request[v1.ListCapabilitiesRequest]) (*connect.Response[v1.ListCapabilitiesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.ListCapabilities is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) CreateServiceAccount(context.Context, *connect.Request[v1.CreateServiceAccountRequest]) (*connect.Response[v1.CreateServiceAccountResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.CreateServiceAccount is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) GetServiceAccount(context.Context, *connect.Request[v1.GetServiceAccountRequest]) (*connect.Response[v1.GetServiceAccountResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.GetServiceAccount is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) ListServiceAccounts(context.Context, *connect.Request[v1.ListServiceAccountsRequest]) (*connect.Response[v1.ListServiceAccountsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.ListServiceAccounts is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) UpdateServiceAccount(context.Context, *connect.Request[v1.UpdateServiceAccountRequest]) (*connect.Response[v1.UpdateServiceAccountResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.UpdateServiceAccount is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) SetServiceAccountState(context.Context, *connect.Request[v1.SetServiceAccountStateRequest]) (*connect.Response[v1.SetServiceAccountStateResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.SetServiceAccountState is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) DeleteServiceAccount(context.Context, *connect.Request[v1.DeleteServiceAccountRequest]) (*connect.Response[v1.DeleteServiceAccountResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.DeleteServiceAccount is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) CreateCredential(context.Context, *connect.Request[v1.CreateCredentialRequest]) (*connect.Response[v1.CreateCredentialResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.CreateCredential is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) ListCredentials(context.Context, *connect.Request[v1.ListCredentialsRequest]) (*connect.Response[v1.ListCredentialsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.ListCredentials is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) RotateCredential(context.Context, *connect.Request[v1.RotateCredentialRequest]) (*connect.Response[v1.RotateCredentialResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.RotateCredential is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) RevokeCredential(context.Context, *connect.Request[v1.RevokeCredentialRequest]) (*connect.Response[v1.RevokeCredentialResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.RevokeCredential is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) CreateGitHubTrust(context.Context, *connect.Request[v1.CreateGitHubTrustRequest]) (*connect.Response[v1.CreateGitHubTrustResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.CreateGitHubTrust is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) UpdateGitHubTrust(context.Context, *connect.Request[v1.UpdateGitHubTrustRequest]) (*connect.Response[v1.UpdateGitHubTrustResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.UpdateGitHubTrust is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) ListGitHubTrusts(context.Context, *connect.Request[v1.ListGitHubTrustsRequest]) (*connect.Response[v1.ListGitHubTrustsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.ListGitHubTrusts is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) SetGitHubTrustState(context.Context, *connect.Request[v1.SetGitHubTrustStateRequest]) (*connect.Response[v1.SetGitHubTrustStateResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.SetGitHubTrustState is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) DeleteGitHubTrust(context.Context, *connect.Request[v1.DeleteGitHubTrustRequest]) (*connect.Response[v1.DeleteGitHubTrustResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.DeleteGitHubTrust is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) BeginGitHubSetup(context.Context, *connect.Request[v1.BeginGitHubSetupRequest]) (*connect.Response[v1.BeginGitHubSetupResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.BeginGitHubSetup is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) GetGitHubSetup(context.Context, *connect.Request[v1.GetGitHubSetupRequest]) (*connect.Response[v1.GetGitHubSetupResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.GetGitHubSetup is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) SubmitGitHubSetup(context.Context, *connect.Request[v1.SubmitGitHubSetupRequest]) (*connect.Response[v1.SubmitGitHubSetupResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.SubmitGitHubSetup is not implemented")) +} + +func (UnimplementedAutomationServiceHandler) ExchangeGitHubToken(context.Context, *connect.Request[v1.ExchangeGitHubTokenRequest]) (*connect.Response[v1.ExchangeGitHubTokenResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.iam.v1.AutomationService.ExchangeGitHubToken is not implemented")) +} diff --git a/gen/go/aes/monitoring/v1/alerts.pb.go b/gen/go/aes/monitoring/v1/alerts.pb.go new file mode 100644 index 0000000..b451c40 --- /dev/null +++ b/gen/go/aes/monitoring/v1/alerts.pb.go @@ -0,0 +1,3536 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc (unknown) +// source: aes/monitoring/v1/alerts.proto + +package monitoringv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type AlertRuleSpec struct { + state protoimpl.MessageState `protogen:"open.v1"` + DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // One of the metric IDs returned by the alert template catalog. + MetricId string `protobuf:"bytes,2,opt,name=metric_id,json=metricId,proto3" json:"metric_id,omitempty"` + // GREATER_THAN or LESS_THAN. Availability templates use GREATER_THAN 0. + Operator string `protobuf:"bytes,3,opt,name=operator,proto3" json:"operator,omitempty"` + Threshold float64 `protobuf:"fixed64,4,opt,name=threshold,proto3" json:"threshold,omitempty"` + SustainedSeconds int32 `protobuf:"varint,5,opt,name=sustained_seconds,json=sustainedSeconds,proto3" json:"sustained_seconds,omitempty"` + // WARNING or CRITICAL. + Severity string `protobuf:"bytes,6,opt,name=severity,proto3" json:"severity,omitempty"` + AllVms bool `protobuf:"varint,7,opt,name=all_vms,json=allVms,proto3" json:"all_vms,omitempty"` + VmNames []string `protobuf:"bytes,8,rep,name=vm_names,json=vmNames,proto3" json:"vm_names,omitempty"` + Enabled bool `protobuf:"varint,9,opt,name=enabled,proto3" json:"enabled,omitempty"` + RepeatIntervalSeconds int32 `protobuf:"varint,10,opt,name=repeat_interval_seconds,json=repeatIntervalSeconds,proto3" json:"repeat_interval_seconds,omitempty"` + DestinationNames []string `protobuf:"bytes,11,rep,name=destination_names,json=destinationNames,proto3" json:"destination_names,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AlertRuleSpec) Reset() { + *x = AlertRuleSpec{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AlertRuleSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AlertRuleSpec) ProtoMessage() {} + +func (x *AlertRuleSpec) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[0] + 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 AlertRuleSpec.ProtoReflect.Descriptor instead. +func (*AlertRuleSpec) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{0} +} + +func (x *AlertRuleSpec) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *AlertRuleSpec) GetMetricId() string { + if x != nil { + return x.MetricId + } + return "" +} + +func (x *AlertRuleSpec) GetOperator() string { + if x != nil { + return x.Operator + } + return "" +} + +func (x *AlertRuleSpec) GetThreshold() float64 { + if x != nil { + return x.Threshold + } + return 0 +} + +func (x *AlertRuleSpec) GetSustainedSeconds() int32 { + if x != nil { + return x.SustainedSeconds + } + return 0 +} + +func (x *AlertRuleSpec) GetSeverity() string { + if x != nil { + return x.Severity + } + return "" +} + +func (x *AlertRuleSpec) GetAllVms() bool { + if x != nil { + return x.AllVms + } + return false +} + +func (x *AlertRuleSpec) GetVmNames() []string { + if x != nil { + return x.VmNames + } + return nil +} + +func (x *AlertRuleSpec) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *AlertRuleSpec) GetRepeatIntervalSeconds() int32 { + if x != nil { + return x.RepeatIntervalSeconds + } + return 0 +} + +func (x *AlertRuleSpec) GetDestinationNames() []string { + if x != nil { + return x.DestinationNames + } + return nil +} + +type AlertRule struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ProjectName string `protobuf:"bytes,2,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Spec *AlertRuleSpec `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` + Version int64 `protobuf:"varint,4,opt,name=version,proto3" json:"version,omitempty"` + AppliedVersion int64 `protobuf:"varint,5,opt,name=applied_version,json=appliedVersion,proto3" json:"applied_version,omitempty"` + // PENDING, APPLIED, ERROR, LIMITED, or RETIRED. Saving is not engine acceptance. + SyncStatus string `protobuf:"bytes,6,opt,name=sync_status,json=syncStatus,proto3" json:"sync_status,omitempty"` + SyncError string `protobuf:"bytes,7,opt,name=sync_error,json=syncError,proto3" json:"sync_error,omitempty"` + CreateTimeUnix int64 `protobuf:"varint,8,opt,name=create_time_unix,json=createTimeUnix,proto3" json:"create_time_unix,omitempty"` + UpdateTimeUnix int64 `protobuf:"varint,9,opt,name=update_time_unix,json=updateTimeUnix,proto3" json:"update_time_unix,omitempty"` + LastEvaluatedAtUnix int64 `protobuf:"varint,10,opt,name=last_evaluated_at_unix,json=lastEvaluatedAtUnix,proto3" json:"last_evaluated_at_unix,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AlertRule) Reset() { + *x = AlertRule{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AlertRule) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AlertRule) ProtoMessage() {} + +func (x *AlertRule) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[1] + 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 AlertRule.ProtoReflect.Descriptor instead. +func (*AlertRule) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{1} +} + +func (x *AlertRule) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *AlertRule) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *AlertRule) GetSpec() *AlertRuleSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *AlertRule) GetVersion() int64 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *AlertRule) GetAppliedVersion() int64 { + if x != nil { + return x.AppliedVersion + } + return 0 +} + +func (x *AlertRule) GetSyncStatus() string { + if x != nil { + return x.SyncStatus + } + return "" +} + +func (x *AlertRule) GetSyncError() string { + if x != nil { + return x.SyncError + } + return "" +} + +func (x *AlertRule) GetCreateTimeUnix() int64 { + if x != nil { + return x.CreateTimeUnix + } + return 0 +} + +func (x *AlertRule) GetUpdateTimeUnix() int64 { + if x != nil { + return x.UpdateTimeUnix + } + return 0 +} + +func (x *AlertRule) GetLastEvaluatedAtUnix() int64 { + if x != nil { + return x.LastEvaluatedAtUnix + } + return 0 +} + +type ListAlertRulesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAlertRulesRequest) Reset() { + *x = ListAlertRulesRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAlertRulesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAlertRulesRequest) ProtoMessage() {} + +func (x *ListAlertRulesRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[2] + 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 ListAlertRulesRequest.ProtoReflect.Descriptor instead. +func (*ListAlertRulesRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{2} +} + +func (x *ListAlertRulesRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +type ListAlertRulesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Rules []*AlertRule `protobuf:"bytes,1,rep,name=rules,proto3" json:"rules,omitempty"` + RuleLimit int32 `protobuf:"varint,2,opt,name=rule_limit,json=ruleLimit,proto3" json:"rule_limit,omitempty"` + EvaluatedInstanceLimit int32 `protobuf:"varint,3,opt,name=evaluated_instance_limit,json=evaluatedInstanceLimit,proto3" json:"evaluated_instance_limit,omitempty"` + CanManage bool `protobuf:"varint,4,opt,name=can_manage,json=canManage,proto3" json:"can_manage,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAlertRulesResponse) Reset() { + *x = ListAlertRulesResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAlertRulesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAlertRulesResponse) ProtoMessage() {} + +func (x *ListAlertRulesResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListAlertRulesResponse.ProtoReflect.Descriptor instead. +func (*ListAlertRulesResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{3} +} + +func (x *ListAlertRulesResponse) GetRules() []*AlertRule { + if x != nil { + return x.Rules + } + return nil +} + +func (x *ListAlertRulesResponse) GetRuleLimit() int32 { + if x != nil { + return x.RuleLimit + } + return 0 +} + +func (x *ListAlertRulesResponse) GetEvaluatedInstanceLimit() int32 { + if x != nil { + return x.EvaluatedInstanceLimit + } + return 0 +} + +func (x *ListAlertRulesResponse) GetCanManage() bool { + if x != nil { + return x.CanManage + } + return false +} + +type SaveAlertRuleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + // Client-generated UUID, retained on retry. Never reused after deletion. + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + Spec *AlertRuleSpec `protobuf:"bytes,3,opt,name=spec,proto3" json:"spec,omitempty"` + // Zero for create; otherwise the last version read. + ExpectedVersion int64 `protobuf:"varint,4,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + // Client-generated UUID identifying this mutation; reuse on an ambiguous retry. + RequestId string `protobuf:"bytes,5,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SaveAlertRuleRequest) Reset() { + *x = SaveAlertRuleRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SaveAlertRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SaveAlertRuleRequest) ProtoMessage() {} + +func (x *SaveAlertRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[4] + 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 SaveAlertRuleRequest.ProtoReflect.Descriptor instead. +func (*SaveAlertRuleRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{4} +} + +func (x *SaveAlertRuleRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *SaveAlertRuleRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *SaveAlertRuleRequest) GetSpec() *AlertRuleSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *SaveAlertRuleRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +func (x *SaveAlertRuleRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type SaveAlertRuleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Rule *AlertRule `protobuf:"bytes,1,opt,name=rule,proto3" json:"rule,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SaveAlertRuleResponse) Reset() { + *x = SaveAlertRuleResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SaveAlertRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SaveAlertRuleResponse) ProtoMessage() {} + +func (x *SaveAlertRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[5] + 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 SaveAlertRuleResponse.ProtoReflect.Descriptor instead. +func (*SaveAlertRuleResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{5} +} + +func (x *SaveAlertRuleResponse) GetRule() *AlertRule { + if x != nil { + return x.Rule + } + return nil +} + +type DeleteAlertRuleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + ExpectedVersion int64 `protobuf:"varint,3,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + RequestId string `protobuf:"bytes,4,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteAlertRuleRequest) Reset() { + *x = DeleteAlertRuleRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAlertRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAlertRuleRequest) ProtoMessage() {} + +func (x *DeleteAlertRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[6] + 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 DeleteAlertRuleRequest.ProtoReflect.Descriptor instead. +func (*DeleteAlertRuleRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{6} +} + +func (x *DeleteAlertRuleRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *DeleteAlertRuleRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DeleteAlertRuleRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +func (x *DeleteAlertRuleRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type DeleteAlertRuleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteAlertRuleResponse) Reset() { + *x = DeleteAlertRuleResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAlertRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAlertRuleResponse) ProtoMessage() {} + +func (x *DeleteAlertRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[7] + 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 DeleteAlertRuleResponse.ProtoReflect.Descriptor instead. +func (*DeleteAlertRuleResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{7} +} + +type PreviewAlertRuleRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Spec *AlertRuleSpec `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PreviewAlertRuleRequest) Reset() { + *x = PreviewAlertRuleRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PreviewAlertRuleRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewAlertRuleRequest) ProtoMessage() {} + +func (x *PreviewAlertRuleRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[8] + 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 PreviewAlertRuleRequest.ProtoReflect.Descriptor instead. +func (*PreviewAlertRuleRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{8} +} + +func (x *PreviewAlertRuleRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *PreviewAlertRuleRequest) GetSpec() *AlertRuleSpec { + if x != nil { + return x.Spec + } + return nil +} + +type AlertPreviewResource struct { + state protoimpl.MessageState `protogen:"open.v1"` + VmName string `protobuf:"bytes,1,opt,name=vm_name,json=vmName,proto3" json:"vm_name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // AVAILABLE, AWAITING_DATA, SUPPRESSED, UNKNOWN intent/placement, or ERROR. + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Value *float64 `protobuf:"fixed64,4,opt,name=value,proto3,oneof" json:"value,omitempty"` + ConditionMet bool `protobuf:"varint,5,opt,name=condition_met,json=conditionMet,proto3" json:"condition_met,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AlertPreviewResource) Reset() { + *x = AlertPreviewResource{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AlertPreviewResource) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AlertPreviewResource) ProtoMessage() {} + +func (x *AlertPreviewResource) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_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 AlertPreviewResource.ProtoReflect.Descriptor instead. +func (*AlertPreviewResource) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{9} +} + +func (x *AlertPreviewResource) GetVmName() string { + if x != nil { + return x.VmName + } + return "" +} + +func (x *AlertPreviewResource) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *AlertPreviewResource) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *AlertPreviewResource) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value + } + return 0 +} + +func (x *AlertPreviewResource) GetConditionMet() bool { + if x != nil { + return x.ConditionMet + } + return false +} + +type PreviewAlertRuleResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + MatchedResourceCount int32 `protobuf:"varint,1,opt,name=matched_resource_count,json=matchedResourceCount,proto3" json:"matched_resource_count,omitempty"` + Resources []*AlertPreviewResource `protobuf:"bytes,2,rep,name=resources,proto3" json:"resources,omitempty"` + SampleOnly bool `protobuf:"varint,3,opt,name=sample_only,json=sampleOnly,proto3" json:"sample_only,omitempty"` + QueryStatus string `protobuf:"bytes,4,opt,name=query_status,json=queryStatus,proto3" json:"query_status,omitempty"` + Explanation string `protobuf:"bytes,5,opt,name=explanation,proto3" json:"explanation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *PreviewAlertRuleResponse) Reset() { + *x = PreviewAlertRuleResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PreviewAlertRuleResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PreviewAlertRuleResponse) ProtoMessage() {} + +func (x *PreviewAlertRuleResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[10] + 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 PreviewAlertRuleResponse.ProtoReflect.Descriptor instead. +func (*PreviewAlertRuleResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{10} +} + +func (x *PreviewAlertRuleResponse) GetMatchedResourceCount() int32 { + if x != nil { + return x.MatchedResourceCount + } + return 0 +} + +func (x *PreviewAlertRuleResponse) GetResources() []*AlertPreviewResource { + if x != nil { + return x.Resources + } + return nil +} + +func (x *PreviewAlertRuleResponse) GetSampleOnly() bool { + if x != nil { + return x.SampleOnly + } + return false +} + +func (x *PreviewAlertRuleResponse) GetQueryStatus() string { + if x != nil { + return x.QueryStatus + } + return "" +} + +func (x *PreviewAlertRuleResponse) GetExplanation() string { + if x != nil { + return x.Explanation + } + return "" +} + +type AlertDestination struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ProjectName string `protobuf:"bytes,2,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // EMAIL selects an existing verified project member; WEBHOOK an existing subscription. + Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` + Principal string `protobuf:"bytes,5,opt,name=principal,proto3" json:"principal,omitempty"` + SubscriptionName string `protobuf:"bytes,6,opt,name=subscription_name,json=subscriptionName,proto3" json:"subscription_name,omitempty"` + Enabled bool `protobuf:"varint,7,opt,name=enabled,proto3" json:"enabled,omitempty"` + Version int64 `protobuf:"varint,8,opt,name=version,proto3" json:"version,omitempty"` + // VERIFIED, PENDING, or NOT_REQUIRED for a webhook subscription. + VerificationStatus string `protobuf:"bytes,9,opt,name=verification_status,json=verificationStatus,proto3" json:"verification_status,omitempty"` + // Only populated for the current recipient's own unexpired verification. + PendingVerificationId string `protobuf:"bytes,10,opt,name=pending_verification_id,json=pendingVerificationId,proto3" json:"pending_verification_id,omitempty"` + // Most recent test within retained history; absence is not delivery success. + LastTest *DestinationTest `protobuf:"bytes,11,opt,name=last_test,json=lastTest,proto3" json:"last_test,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AlertDestination) Reset() { + *x = AlertDestination{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AlertDestination) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AlertDestination) ProtoMessage() {} + +func (x *AlertDestination) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[11] + 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 AlertDestination.ProtoReflect.Descriptor instead. +func (*AlertDestination) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{11} +} + +func (x *AlertDestination) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AlertDestination) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *AlertDestination) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *AlertDestination) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *AlertDestination) GetPrincipal() string { + if x != nil { + return x.Principal + } + return "" +} + +func (x *AlertDestination) GetSubscriptionName() string { + if x != nil { + return x.SubscriptionName + } + return "" +} + +func (x *AlertDestination) GetEnabled() bool { + if x != nil { + return x.Enabled + } + return false +} + +func (x *AlertDestination) GetVersion() int64 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *AlertDestination) GetVerificationStatus() string { + if x != nil { + return x.VerificationStatus + } + return "" +} + +func (x *AlertDestination) GetPendingVerificationId() string { + if x != nil { + return x.PendingVerificationId + } + return "" +} + +func (x *AlertDestination) GetLastTest() *DestinationTest { + if x != nil { + return x.LastTest + } + return nil +} + +type ListAlertDestinationsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAlertDestinationsRequest) Reset() { + *x = ListAlertDestinationsRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAlertDestinationsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAlertDestinationsRequest) ProtoMessage() {} + +func (x *ListAlertDestinationsRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[12] + 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 ListAlertDestinationsRequest.ProtoReflect.Descriptor instead. +func (*ListAlertDestinationsRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{12} +} + +func (x *ListAlertDestinationsRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +type ListAlertDestinationsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Destinations []*AlertDestination `protobuf:"bytes,1,rep,name=destinations,proto3" json:"destinations,omitempty"` + Limit int32 `protobuf:"varint,2,opt,name=limit,proto3" json:"limit,omitempty"` + CallerPrincipal string `protobuf:"bytes,3,opt,name=caller_principal,json=callerPrincipal,proto3" json:"caller_principal,omitempty"` + EmailAvailable bool `protobuf:"varint,4,opt,name=email_available,json=emailAvailable,proto3" json:"email_available,omitempty"` + WebhookAvailable bool `protobuf:"varint,5,opt,name=webhook_available,json=webhookAvailable,proto3" json:"webhook_available,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAlertDestinationsResponse) Reset() { + *x = ListAlertDestinationsResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAlertDestinationsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAlertDestinationsResponse) ProtoMessage() {} + +func (x *ListAlertDestinationsResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[13] + 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 ListAlertDestinationsResponse.ProtoReflect.Descriptor instead. +func (*ListAlertDestinationsResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{13} +} + +func (x *ListAlertDestinationsResponse) GetDestinations() []*AlertDestination { + if x != nil { + return x.Destinations + } + return nil +} + +func (x *ListAlertDestinationsResponse) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *ListAlertDestinationsResponse) GetCallerPrincipal() string { + if x != nil { + return x.CallerPrincipal + } + return "" +} + +func (x *ListAlertDestinationsResponse) GetEmailAvailable() bool { + if x != nil { + return x.EmailAvailable + } + return false +} + +func (x *ListAlertDestinationsResponse) GetWebhookAvailable() bool { + if x != nil { + return x.WebhookAvailable + } + return false +} + +type SaveAlertDestinationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Destination *AlertDestination `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"` + RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // Zero for create; otherwise the version last read. + ExpectedVersion int64 `protobuf:"varint,3,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SaveAlertDestinationRequest) Reset() { + *x = SaveAlertDestinationRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SaveAlertDestinationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SaveAlertDestinationRequest) ProtoMessage() {} + +func (x *SaveAlertDestinationRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[14] + 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 SaveAlertDestinationRequest.ProtoReflect.Descriptor instead. +func (*SaveAlertDestinationRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{14} +} + +func (x *SaveAlertDestinationRequest) GetDestination() *AlertDestination { + if x != nil { + return x.Destination + } + return nil +} + +func (x *SaveAlertDestinationRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *SaveAlertDestinationRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +type SaveAlertDestinationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Destination *AlertDestination `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SaveAlertDestinationResponse) Reset() { + *x = SaveAlertDestinationResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SaveAlertDestinationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SaveAlertDestinationResponse) ProtoMessage() {} + +func (x *SaveAlertDestinationResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[15] + 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 SaveAlertDestinationResponse.ProtoReflect.Descriptor instead. +func (*SaveAlertDestinationResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{15} +} + +func (x *SaveAlertDestinationResponse) GetDestination() *AlertDestination { + if x != nil { + return x.Destination + } + return nil +} + +type DeleteAlertDestinationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + ExpectedVersion int64 `protobuf:"varint,3,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + RequestId string `protobuf:"bytes,4,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteAlertDestinationRequest) Reset() { + *x = DeleteAlertDestinationRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAlertDestinationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAlertDestinationRequest) ProtoMessage() {} + +func (x *DeleteAlertDestinationRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[16] + 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 DeleteAlertDestinationRequest.ProtoReflect.Descriptor instead. +func (*DeleteAlertDestinationRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{16} +} + +func (x *DeleteAlertDestinationRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *DeleteAlertDestinationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *DeleteAlertDestinationRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +func (x *DeleteAlertDestinationRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type DeleteAlertDestinationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DeleteAlertDestinationResponse) Reset() { + *x = DeleteAlertDestinationResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAlertDestinationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAlertDestinationResponse) ProtoMessage() {} + +func (x *DeleteAlertDestinationResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[17] + 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 DeleteAlertDestinationResponse.ProtoReflect.Descriptor instead. +func (*DeleteAlertDestinationResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{17} +} + +type RequestDestinationVerificationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RequestDestinationVerificationRequest) Reset() { + *x = RequestDestinationVerificationRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RequestDestinationVerificationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestDestinationVerificationRequest) ProtoMessage() {} + +func (x *RequestDestinationVerificationRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[18] + 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 RequestDestinationVerificationRequest.ProtoReflect.Descriptor instead. +func (*RequestDestinationVerificationRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{18} +} + +func (x *RequestDestinationVerificationRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *RequestDestinationVerificationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RequestDestinationVerificationRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type RequestDestinationVerificationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + VerificationId string `protobuf:"bytes,1,opt,name=verification_id,json=verificationId,proto3" json:"verification_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RequestDestinationVerificationResponse) Reset() { + *x = RequestDestinationVerificationResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RequestDestinationVerificationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RequestDestinationVerificationResponse) ProtoMessage() {} + +func (x *RequestDestinationVerificationResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[19] + 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 RequestDestinationVerificationResponse.ProtoReflect.Descriptor instead. +func (*RequestDestinationVerificationResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{19} +} + +func (x *RequestDestinationVerificationResponse) GetVerificationId() string { + if x != nil { + return x.VerificationId + } + return "" +} + +type VerifyAlertDestinationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` + VerificationId string `protobuf:"bytes,3,opt,name=verification_id,json=verificationId,proto3" json:"verification_id,omitempty"` + Code string `protobuf:"bytes,4,opt,name=code,proto3" json:"code,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VerifyAlertDestinationRequest) Reset() { + *x = VerifyAlertDestinationRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VerifyAlertDestinationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifyAlertDestinationRequest) ProtoMessage() {} + +func (x *VerifyAlertDestinationRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[20] + 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 VerifyAlertDestinationRequest.ProtoReflect.Descriptor instead. +func (*VerifyAlertDestinationRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{20} +} + +func (x *VerifyAlertDestinationRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *VerifyAlertDestinationRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *VerifyAlertDestinationRequest) GetVerificationId() string { + if x != nil { + return x.VerificationId + } + return "" +} + +func (x *VerifyAlertDestinationRequest) GetCode() string { + if x != nil { + return x.Code + } + return "" +} + +type VerifyAlertDestinationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *VerifyAlertDestinationResponse) Reset() { + *x = VerifyAlertDestinationResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *VerifyAlertDestinationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VerifyAlertDestinationResponse) ProtoMessage() {} + +func (x *VerifyAlertDestinationResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[21] + 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 VerifyAlertDestinationResponse.ProtoReflect.Descriptor instead. +func (*VerifyAlertDestinationResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{21} +} + +type IncidentSnapshot struct { + state protoimpl.MessageState `protogen:"open.v1"` + RuleName string `protobuf:"bytes,1,opt,name=rule_name,json=ruleName,proto3" json:"rule_name,omitempty"` + MetricId string `protobuf:"bytes,2,opt,name=metric_id,json=metricId,proto3" json:"metric_id,omitempty"` + Operator string `protobuf:"bytes,3,opt,name=operator,proto3" json:"operator,omitempty"` + Threshold float64 `protobuf:"fixed64,4,opt,name=threshold,proto3" json:"threshold,omitempty"` + SustainedSeconds int32 `protobuf:"varint,5,opt,name=sustained_seconds,json=sustainedSeconds,proto3" json:"sustained_seconds,omitempty"` + Severity string `protobuf:"bytes,6,opt,name=severity,proto3" json:"severity,omitempty"` + Value *float64 `protobuf:"fixed64,7,opt,name=value,proto3,oneof" json:"value,omitempty"` + DatacenterName string `protobuf:"bytes,8,opt,name=datacenter_name,json=datacenterName,proto3" json:"datacenter_name,omitempty"` + ObservedAtUnix int64 `protobuf:"varint,9,opt,name=observed_at_unix,json=observedAtUnix,proto3" json:"observed_at_unix,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IncidentSnapshot) Reset() { + *x = IncidentSnapshot{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IncidentSnapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IncidentSnapshot) ProtoMessage() {} + +func (x *IncidentSnapshot) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[22] + 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 IncidentSnapshot.ProtoReflect.Descriptor instead. +func (*IncidentSnapshot) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{22} +} + +func (x *IncidentSnapshot) GetRuleName() string { + if x != nil { + return x.RuleName + } + return "" +} + +func (x *IncidentSnapshot) GetMetricId() string { + if x != nil { + return x.MetricId + } + return "" +} + +func (x *IncidentSnapshot) GetOperator() string { + if x != nil { + return x.Operator + } + return "" +} + +func (x *IncidentSnapshot) GetThreshold() float64 { + if x != nil { + return x.Threshold + } + return 0 +} + +func (x *IncidentSnapshot) GetSustainedSeconds() int32 { + if x != nil { + return x.SustainedSeconds + } + return 0 +} + +func (x *IncidentSnapshot) GetSeverity() string { + if x != nil { + return x.Severity + } + return "" +} + +func (x *IncidentSnapshot) GetValue() float64 { + if x != nil && x.Value != nil { + return *x.Value + } + return 0 +} + +func (x *IncidentSnapshot) GetDatacenterName() string { + if x != nil { + return x.DatacenterName + } + return "" +} + +func (x *IncidentSnapshot) GetObservedAtUnix() int64 { + if x != nil { + return x.ObservedAtUnix + } + return 0 +} + +type Incident struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + ProjectName string `protobuf:"bytes,2,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + RuleId string `protobuf:"bytes,3,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + RuleVersion int64 `protobuf:"varint,4,opt,name=rule_version,json=ruleVersion,proto3" json:"rule_version,omitempty"` + VmName string `protobuf:"bytes,5,opt,name=vm_name,json=vmName,proto3" json:"vm_name,omitempty"` + // OPEN, RECOVERED, or RETIRED. Acknowledgement does not resolve an incident. + State string `protobuf:"bytes,6,opt,name=state,proto3" json:"state,omitempty"` + OpenedAtUnix int64 `protobuf:"varint,7,opt,name=opened_at_unix,json=openedAtUnix,proto3" json:"opened_at_unix,omitempty"` + ClosedAtUnix int64 `protobuf:"varint,8,opt,name=closed_at_unix,json=closedAtUnix,proto3" json:"closed_at_unix,omitempty"` + CloseReason string `protobuf:"bytes,9,opt,name=close_reason,json=closeReason,proto3" json:"close_reason,omitempty"` + AcknowledgedBy string `protobuf:"bytes,10,opt,name=acknowledged_by,json=acknowledgedBy,proto3" json:"acknowledged_by,omitempty"` + AcknowledgedAtUnix int64 `protobuf:"varint,11,opt,name=acknowledged_at_unix,json=acknowledgedAtUnix,proto3" json:"acknowledged_at_unix,omitempty"` + SnoozedUntilUnix int64 `protobuf:"varint,12,opt,name=snoozed_until_unix,json=snoozedUntilUnix,proto3" json:"snoozed_until_unix,omitempty"` + Version int64 `protobuf:"varint,13,opt,name=version,proto3" json:"version,omitempty"` + Snapshot *IncidentSnapshot `protobuf:"bytes,14,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + // Current evaluation health, independent of the incident's lifecycle. + EvaluationHealth string `protobuf:"bytes,15,opt,name=evaluation_health,json=evaluationHealth,proto3" json:"evaluation_health,omitempty"` + // Current hostname only when the immutable resource still matches this incident. + VmDisplayName string `protobuf:"bytes,16,opt,name=vm_display_name,json=vmDisplayName,proto3" json:"vm_display_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Incident) Reset() { + *x = Incident{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Incident) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Incident) ProtoMessage() {} + +func (x *Incident) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[23] + 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 Incident.ProtoReflect.Descriptor instead. +func (*Incident) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{23} +} + +func (x *Incident) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *Incident) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *Incident) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +func (x *Incident) GetRuleVersion() int64 { + if x != nil { + return x.RuleVersion + } + return 0 +} + +func (x *Incident) GetVmName() string { + if x != nil { + return x.VmName + } + return "" +} + +func (x *Incident) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *Incident) GetOpenedAtUnix() int64 { + if x != nil { + return x.OpenedAtUnix + } + return 0 +} + +func (x *Incident) GetClosedAtUnix() int64 { + if x != nil { + return x.ClosedAtUnix + } + return 0 +} + +func (x *Incident) GetCloseReason() string { + if x != nil { + return x.CloseReason + } + return "" +} + +func (x *Incident) GetAcknowledgedBy() string { + if x != nil { + return x.AcknowledgedBy + } + return "" +} + +func (x *Incident) GetAcknowledgedAtUnix() int64 { + if x != nil { + return x.AcknowledgedAtUnix + } + return 0 +} + +func (x *Incident) GetSnoozedUntilUnix() int64 { + if x != nil { + return x.SnoozedUntilUnix + } + return 0 +} + +func (x *Incident) GetVersion() int64 { + if x != nil { + return x.Version + } + return 0 +} + +func (x *Incident) GetSnapshot() *IncidentSnapshot { + if x != nil { + return x.Snapshot + } + return nil +} + +func (x *Incident) GetEvaluationHealth() string { + if x != nil { + return x.EvaluationHealth + } + return "" +} + +func (x *Incident) GetVmDisplayName() string { + if x != nil { + return x.VmDisplayName + } + return "" +} + +type GetIncidentSummaryRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetIncidentSummaryRequest) Reset() { + *x = GetIncidentSummaryRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetIncidentSummaryRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetIncidentSummaryRequest) ProtoMessage() {} + +func (x *GetIncidentSummaryRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[24] + 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 GetIncidentSummaryRequest.ProtoReflect.Descriptor instead. +func (*GetIncidentSummaryRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{24} +} + +func (x *GetIncidentSummaryRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +type GetIncidentSummaryResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + OpenCount int32 `protobuf:"varint,1,opt,name=open_count,json=openCount,proto3" json:"open_count,omitempty"` + CriticalCount int32 `protobuf:"varint,2,opt,name=critical_count,json=criticalCount,proto3" json:"critical_count,omitempty"` + // At most five recent open incidents. Reading never acknowledges or resolves them. + Incidents []*Incident `protobuf:"bytes,3,rep,name=incidents,proto3" json:"incidents,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetIncidentSummaryResponse) Reset() { + *x = GetIncidentSummaryResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetIncidentSummaryResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetIncidentSummaryResponse) ProtoMessage() {} + +func (x *GetIncidentSummaryResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[25] + 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 GetIncidentSummaryResponse.ProtoReflect.Descriptor instead. +func (*GetIncidentSummaryResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{25} +} + +func (x *GetIncidentSummaryResponse) GetOpenCount() int32 { + if x != nil { + return x.OpenCount + } + return 0 +} + +func (x *GetIncidentSummaryResponse) GetCriticalCount() int32 { + if x != nil { + return x.CriticalCount + } + return 0 +} + +func (x *GetIncidentSummaryResponse) GetIncidents() []*Incident { + if x != nil { + return x.Incidents + } + return nil +} + +type IncidentTransition struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + CreateTimeUnix int64 `protobuf:"varint,3,opt,name=create_time_unix,json=createTimeUnix,proto3" json:"create_time_unix,omitempty"` + Principal string `protobuf:"bytes,4,opt,name=principal,proto3" json:"principal,omitempty"` + Snapshot *IncidentSnapshot `protobuf:"bytes,5,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IncidentTransition) Reset() { + *x = IncidentTransition{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IncidentTransition) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IncidentTransition) ProtoMessage() {} + +func (x *IncidentTransition) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[26] + 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 IncidentTransition.ProtoReflect.Descriptor instead. +func (*IncidentTransition) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{26} +} + +func (x *IncidentTransition) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *IncidentTransition) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *IncidentTransition) GetCreateTimeUnix() int64 { + if x != nil { + return x.CreateTimeUnix + } + return 0 +} + +func (x *IncidentTransition) GetPrincipal() string { + if x != nil { + return x.Principal + } + return "" +} + +func (x *IncidentTransition) GetSnapshot() *IncidentSnapshot { + if x != nil { + return x.Snapshot + } + return nil +} + +type IncidentDelivery struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + TransitionId string `protobuf:"bytes,2,opt,name=transition_id,json=transitionId,proto3" json:"transition_id,omitempty"` + DestinationName string `protobuf:"bytes,3,opt,name=destination_name,json=destinationName,proto3" json:"destination_name,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + AttemptCount int32 `protobuf:"varint,5,opt,name=attempt_count,json=attemptCount,proto3" json:"attempt_count,omitempty"` + CreateTimeUnix int64 `protobuf:"varint,6,opt,name=create_time_unix,json=createTimeUnix,proto3" json:"create_time_unix,omitempty"` + CompletedAtUnix int64 `protobuf:"varint,7,opt,name=completed_at_unix,json=completedAtUnix,proto3" json:"completed_at_unix,omitempty"` + LastError string `protobuf:"bytes,8,opt,name=last_error,json=lastError,proto3" json:"last_error,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *IncidentDelivery) Reset() { + *x = IncidentDelivery{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *IncidentDelivery) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*IncidentDelivery) ProtoMessage() {} + +func (x *IncidentDelivery) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[27] + 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 IncidentDelivery.ProtoReflect.Descriptor instead. +func (*IncidentDelivery) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{27} +} + +func (x *IncidentDelivery) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *IncidentDelivery) GetTransitionId() string { + if x != nil { + return x.TransitionId + } + return "" +} + +func (x *IncidentDelivery) GetDestinationName() string { + if x != nil { + return x.DestinationName + } + return "" +} + +func (x *IncidentDelivery) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *IncidentDelivery) GetAttemptCount() int32 { + if x != nil { + return x.AttemptCount + } + return 0 +} + +func (x *IncidentDelivery) GetCreateTimeUnix() int64 { + if x != nil { + return x.CreateTimeUnix + } + return 0 +} + +func (x *IncidentDelivery) GetCompletedAtUnix() int64 { + if x != nil { + return x.CompletedAtUnix + } + return 0 +} + +func (x *IncidentDelivery) GetLastError() string { + if x != nil { + return x.LastError + } + return "" +} + +type ListIncidentsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + // Empty for all; otherwise OPEN, RECOVERED, or RETIRED. + State string `protobuf:"bytes,2,opt,name=state,proto3" json:"state,omitempty"` + VmName string `protobuf:"bytes,3,opt,name=vm_name,json=vmName,proto3" json:"vm_name,omitempty"` + PageSize int32 `protobuf:"varint,4,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,5,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListIncidentsRequest) Reset() { + *x = ListIncidentsRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[28] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListIncidentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListIncidentsRequest) ProtoMessage() {} + +func (x *ListIncidentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[28] + 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 ListIncidentsRequest.ProtoReflect.Descriptor instead. +func (*ListIncidentsRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{28} +} + +func (x *ListIncidentsRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *ListIncidentsRequest) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *ListIncidentsRequest) GetVmName() string { + if x != nil { + return x.VmName + } + return "" +} + +func (x *ListIncidentsRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListIncidentsRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type ListIncidentsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Incidents []*Incident `protobuf:"bytes,1,rep,name=incidents,proto3" json:"incidents,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListIncidentsResponse) Reset() { + *x = ListIncidentsResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[29] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListIncidentsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListIncidentsResponse) ProtoMessage() {} + +func (x *ListIncidentsResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[29] + 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 ListIncidentsResponse.ProtoReflect.Descriptor instead. +func (*ListIncidentsResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{29} +} + +func (x *ListIncidentsResponse) GetIncidents() []*Incident { + if x != nil { + return x.Incidents + } + return nil +} + +func (x *ListIncidentsResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +type GetIncidentRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + // Cursor for older transitions; each page includes up to 50 transitions and their deliveries. + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetIncidentRequest) Reset() { + *x = GetIncidentRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[30] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetIncidentRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetIncidentRequest) ProtoMessage() {} + +func (x *GetIncidentRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[30] + 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 GetIncidentRequest.ProtoReflect.Descriptor instead. +func (*GetIncidentRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{30} +} + +func (x *GetIncidentRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *GetIncidentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *GetIncidentRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type GetIncidentResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Incident *Incident `protobuf:"bytes,1,opt,name=incident,proto3" json:"incident,omitempty"` + Transitions []*IncidentTransition `protobuf:"bytes,2,rep,name=transitions,proto3" json:"transitions,omitempty"` + Deliveries []*IncidentDelivery `protobuf:"bytes,3,rep,name=deliveries,proto3" json:"deliveries,omitempty"` + NextPageToken string `protobuf:"bytes,4,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetIncidentResponse) Reset() { + *x = GetIncidentResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[31] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetIncidentResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetIncidentResponse) ProtoMessage() {} + +func (x *GetIncidentResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[31] + 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 GetIncidentResponse.ProtoReflect.Descriptor instead. +func (*GetIncidentResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{31} +} + +func (x *GetIncidentResponse) GetIncident() *Incident { + if x != nil { + return x.Incident + } + return nil +} + +func (x *GetIncidentResponse) GetTransitions() []*IncidentTransition { + if x != nil { + return x.Transitions + } + return nil +} + +func (x *GetIncidentResponse) GetDeliveries() []*IncidentDelivery { + if x != nil { + return x.Deliveries + } + return nil +} + +func (x *GetIncidentResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +type UpdateIncidentRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + ExpectedVersion int64 `protobuf:"varint,3,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` + RequestId string `protobuf:"bytes,4,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // ACKNOWLEDGE, SNOOZE, or UNSNOOZE. These never change OPEN to RECOVERED. + Action string `protobuf:"bytes,5,opt,name=action,proto3" json:"action,omitempty"` + // SNOOZE only: 900, 3600, 14400, or 86400 seconds. + DurationSeconds int32 `protobuf:"varint,6,opt,name=duration_seconds,json=durationSeconds,proto3" json:"duration_seconds,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateIncidentRequest) Reset() { + *x = UpdateIncidentRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[32] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateIncidentRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateIncidentRequest) ProtoMessage() {} + +func (x *UpdateIncidentRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[32] + 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 UpdateIncidentRequest.ProtoReflect.Descriptor instead. +func (*UpdateIncidentRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{32} +} + +func (x *UpdateIncidentRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *UpdateIncidentRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *UpdateIncidentRequest) GetExpectedVersion() int64 { + if x != nil { + return x.ExpectedVersion + } + return 0 +} + +func (x *UpdateIncidentRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *UpdateIncidentRequest) GetAction() string { + if x != nil { + return x.Action + } + return "" +} + +func (x *UpdateIncidentRequest) GetDurationSeconds() int32 { + if x != nil { + return x.DurationSeconds + } + return 0 +} + +type UpdateIncidentResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Incident *Incident `protobuf:"bytes,1,opt,name=incident,proto3" json:"incident,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *UpdateIncidentResponse) Reset() { + *x = UpdateIncidentResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[33] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateIncidentResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateIncidentResponse) ProtoMessage() {} + +func (x *UpdateIncidentResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[33] + 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 UpdateIncidentResponse.ProtoReflect.Descriptor instead. +func (*UpdateIncidentResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{33} +} + +func (x *UpdateIncidentResponse) GetIncident() *Incident { + if x != nil { + return x.Incident + } + return nil +} + +type AlertInstance struct { + state protoimpl.MessageState `protogen:"open.v1"` + RuleId string `protobuf:"bytes,1,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + RuleVersion int64 `protobuf:"varint,2,opt,name=rule_version,json=ruleVersion,proto3" json:"rule_version,omitempty"` + VmName string `protobuf:"bytes,3,opt,name=vm_name,json=vmName,proto3" json:"vm_name,omitempty"` + Health string `protobuf:"bytes,4,opt,name=health,proto3" json:"health,omitempty"` + Condition string `protobuf:"bytes,5,opt,name=condition,proto3" json:"condition,omitempty"` + IncidentId string `protobuf:"bytes,6,opt,name=incident_id,json=incidentId,proto3" json:"incident_id,omitempty"` + TransitionTimeUnix int64 `protobuf:"varint,7,opt,name=transition_time_unix,json=transitionTimeUnix,proto3" json:"transition_time_unix,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AlertInstance) Reset() { + *x = AlertInstance{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[34] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AlertInstance) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AlertInstance) ProtoMessage() {} + +func (x *AlertInstance) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[34] + 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 AlertInstance.ProtoReflect.Descriptor instead. +func (*AlertInstance) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{34} +} + +func (x *AlertInstance) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +func (x *AlertInstance) GetRuleVersion() int64 { + if x != nil { + return x.RuleVersion + } + return 0 +} + +func (x *AlertInstance) GetVmName() string { + if x != nil { + return x.VmName + } + return "" +} + +func (x *AlertInstance) GetHealth() string { + if x != nil { + return x.Health + } + return "" +} + +func (x *AlertInstance) GetCondition() string { + if x != nil { + return x.Condition + } + return "" +} + +func (x *AlertInstance) GetIncidentId() string { + if x != nil { + return x.IncidentId + } + return "" +} + +func (x *AlertInstance) GetTransitionTimeUnix() int64 { + if x != nil { + return x.TransitionTimeUnix + } + return 0 +} + +type ListAlertInstancesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + RuleId string `protobuf:"bytes,2,opt,name=rule_id,json=ruleId,proto3" json:"rule_id,omitempty"` + PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAlertInstancesRequest) Reset() { + *x = ListAlertInstancesRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[35] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAlertInstancesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAlertInstancesRequest) ProtoMessage() {} + +func (x *ListAlertInstancesRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[35] + 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 ListAlertInstancesRequest.ProtoReflect.Descriptor instead. +func (*ListAlertInstancesRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{35} +} + +func (x *ListAlertInstancesRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *ListAlertInstancesRequest) GetRuleId() string { + if x != nil { + return x.RuleId + } + return "" +} + +func (x *ListAlertInstancesRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListAlertInstancesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type ListAlertInstancesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Instances []*AlertInstance `protobuf:"bytes,1,rep,name=instances,proto3" json:"instances,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAlertInstancesResponse) Reset() { + *x = ListAlertInstancesResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[36] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAlertInstancesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAlertInstancesResponse) ProtoMessage() {} + +func (x *ListAlertInstancesResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[36] + 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 ListAlertInstancesResponse.ProtoReflect.Descriptor instead. +func (*ListAlertInstancesResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{36} +} + +func (x *ListAlertInstancesResponse) GetInstances() []*AlertInstance { + if x != nil { + return x.Instances + } + return nil +} + +func (x *ListAlertInstancesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +type AlertDestinationCandidate struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + // EMAIL or WEBHOOK. The name is an existing user or subscription resource. + Kind string `protobuf:"bytes,3,opt,name=kind,proto3" json:"kind,omitempty"` + Address string `protobuf:"bytes,4,opt,name=address,proto3" json:"address,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *AlertDestinationCandidate) Reset() { + *x = AlertDestinationCandidate{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AlertDestinationCandidate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AlertDestinationCandidate) ProtoMessage() {} + +func (x *AlertDestinationCandidate) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[37] + 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 AlertDestinationCandidate.ProtoReflect.Descriptor instead. +func (*AlertDestinationCandidate) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{37} +} + +func (x *AlertDestinationCandidate) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AlertDestinationCandidate) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *AlertDestinationCandidate) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *AlertDestinationCandidate) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +type ListAlertDestinationCandidatesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Kind string `protobuf:"bytes,2,opt,name=kind,proto3" json:"kind,omitempty"` + Search string `protobuf:"bytes,3,opt,name=search,proto3" json:"search,omitempty"` + PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAlertDestinationCandidatesRequest) Reset() { + *x = ListAlertDestinationCandidatesRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAlertDestinationCandidatesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAlertDestinationCandidatesRequest) ProtoMessage() {} + +func (x *ListAlertDestinationCandidatesRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[38] + 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 ListAlertDestinationCandidatesRequest.ProtoReflect.Descriptor instead. +func (*ListAlertDestinationCandidatesRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{38} +} + +func (x *ListAlertDestinationCandidatesRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *ListAlertDestinationCandidatesRequest) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *ListAlertDestinationCandidatesRequest) GetSearch() string { + if x != nil { + return x.Search + } + return "" +} + +func (x *ListAlertDestinationCandidatesRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +type ListAlertDestinationCandidatesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Candidates []*AlertDestinationCandidate `protobuf:"bytes,1,rep,name=candidates,proto3" json:"candidates,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListAlertDestinationCandidatesResponse) Reset() { + *x = ListAlertDestinationCandidatesResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[39] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListAlertDestinationCandidatesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListAlertDestinationCandidatesResponse) ProtoMessage() {} + +func (x *ListAlertDestinationCandidatesResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[39] + 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 ListAlertDestinationCandidatesResponse.ProtoReflect.Descriptor instead. +func (*ListAlertDestinationCandidatesResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{39} +} + +func (x *ListAlertDestinationCandidatesResponse) GetCandidates() []*AlertDestinationCandidate { + if x != nil { + return x.Candidates + } + return nil +} + +func (x *ListAlertDestinationCandidatesResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +type DestinationTest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + DestinationName string `protobuf:"bytes,2,opt,name=destination_name,json=destinationName,proto3" json:"destination_name,omitempty"` + // PENDING, SENDING, SENT, FAILED, EXPIRED, or SKIPPED. SENT means provider acceptance. + State string `protobuf:"bytes,3,opt,name=state,proto3" json:"state,omitempty"` + AttemptCount int32 `protobuf:"varint,4,opt,name=attempt_count,json=attemptCount,proto3" json:"attempt_count,omitempty"` + LastError string `protobuf:"bytes,5,opt,name=last_error,json=lastError,proto3" json:"last_error,omitempty"` + CreateTimeUnix int64 `protobuf:"varint,6,opt,name=create_time_unix,json=createTimeUnix,proto3" json:"create_time_unix,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *DestinationTest) Reset() { + *x = DestinationTest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[40] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DestinationTest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DestinationTest) ProtoMessage() {} + +func (x *DestinationTest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[40] + 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 DestinationTest.ProtoReflect.Descriptor instead. +func (*DestinationTest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{40} +} + +func (x *DestinationTest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *DestinationTest) GetDestinationName() string { + if x != nil { + return x.DestinationName + } + return "" +} + +func (x *DestinationTest) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *DestinationTest) GetAttemptCount() int32 { + if x != nil { + return x.AttemptCount + } + return 0 +} + +func (x *DestinationTest) GetLastError() string { + if x != nil { + return x.LastError + } + return "" +} + +func (x *DestinationTest) GetCreateTimeUnix() int64 { + if x != nil { + return x.CreateTimeUnix + } + return 0 +} + +type TestAlertDestinationRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + DestinationName string `protobuf:"bytes,2,opt,name=destination_name,json=destinationName,proto3" json:"destination_name,omitempty"` + // Keep this UUID on retry; a new ID deliberately requests another test. + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TestAlertDestinationRequest) Reset() { + *x = TestAlertDestinationRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[41] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TestAlertDestinationRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestAlertDestinationRequest) ProtoMessage() {} + +func (x *TestAlertDestinationRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[41] + 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 TestAlertDestinationRequest.ProtoReflect.Descriptor instead. +func (*TestAlertDestinationRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{41} +} + +func (x *TestAlertDestinationRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *TestAlertDestinationRequest) GetDestinationName() string { + if x != nil { + return x.DestinationName + } + return "" +} + +func (x *TestAlertDestinationRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type TestAlertDestinationResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Test *DestinationTest `protobuf:"bytes,1,opt,name=test,proto3" json:"test,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *TestAlertDestinationResponse) Reset() { + *x = TestAlertDestinationResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[42] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *TestAlertDestinationResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TestAlertDestinationResponse) ProtoMessage() {} + +func (x *TestAlertDestinationResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[42] + 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 TestAlertDestinationResponse.ProtoReflect.Descriptor instead. +func (*TestAlertDestinationResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{42} +} + +func (x *TestAlertDestinationResponse) GetTest() *DestinationTest { + if x != nil { + return x.Test + } + return nil +} + +type GetDestinationTestRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Id string `protobuf:"bytes,2,opt,name=id,proto3" json:"id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetDestinationTestRequest) Reset() { + *x = GetDestinationTestRequest{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[43] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetDestinationTestRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetDestinationTestRequest) ProtoMessage() {} + +func (x *GetDestinationTestRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[43] + 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 GetDestinationTestRequest.ProtoReflect.Descriptor instead. +func (*GetDestinationTestRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{43} +} + +func (x *GetDestinationTestRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *GetDestinationTestRequest) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +type GetDestinationTestResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Test *DestinationTest `protobuf:"bytes,1,opt,name=test,proto3" json:"test,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetDestinationTestResponse) Reset() { + *x = GetDestinationTestResponse{} + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetDestinationTestResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetDestinationTestResponse) ProtoMessage() {} + +func (x *GetDestinationTestResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_alerts_proto_msgTypes[44] + 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 GetDestinationTestResponse.ProtoReflect.Descriptor instead. +func (*GetDestinationTestResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_alerts_proto_rawDescGZIP(), []int{44} +} + +func (x *GetDestinationTestResponse) GetTest() *DestinationTest { + if x != nil { + return x.Test + } + return nil +} + +var File_aes_monitoring_v1_alerts_proto protoreflect.FileDescriptor + +const file_aes_monitoring_v1_alerts_proto_rawDesc = "" + + "\n" + + "\x1eaes/monitoring/v1/alerts.proto\x12\x11aes.monitoring.v1\"\x85\x03\n" + + "\rAlertRuleSpec\x12!\n" + + "\fdisplay_name\x18\x01 \x01(\tR\vdisplayName\x12\x1b\n" + + "\tmetric_id\x18\x02 \x01(\tR\bmetricId\x12\x1a\n" + + "\boperator\x18\x03 \x01(\tR\boperator\x12\x1c\n" + + "\tthreshold\x18\x04 \x01(\x01R\tthreshold\x12+\n" + + "\x11sustained_seconds\x18\x05 \x01(\x05R\x10sustainedSeconds\x12\x1a\n" + + "\bseverity\x18\x06 \x01(\tR\bseverity\x12\x17\n" + + "\aall_vms\x18\a \x01(\bR\x06allVms\x12\x19\n" + + "\bvm_names\x18\b \x03(\tR\avmNames\x12\x18\n" + + "\aenabled\x18\t \x01(\bR\aenabled\x126\n" + + "\x17repeat_interval_seconds\x18\n" + + " \x01(\x05R\x15repeatIntervalSeconds\x12+\n" + + "\x11destination_names\x18\v \x03(\tR\x10destinationNames\"\x80\x03\n" + + "\tAlertRule\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12!\n" + + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x124\n" + + "\x04spec\x18\x03 \x01(\v2 .aes.monitoring.v1.AlertRuleSpecR\x04spec\x12\x18\n" + + "\aversion\x18\x04 \x01(\x03R\aversion\x12'\n" + + "\x0fapplied_version\x18\x05 \x01(\x03R\x0eappliedVersion\x12\x1f\n" + + "\vsync_status\x18\x06 \x01(\tR\n" + + "syncStatus\x12\x1d\n" + + "\n" + + "sync_error\x18\a \x01(\tR\tsyncError\x12(\n" + + "\x10create_time_unix\x18\b \x01(\x03R\x0ecreateTimeUnix\x12(\n" + + "\x10update_time_unix\x18\t \x01(\x03R\x0eupdateTimeUnix\x123\n" + + "\x16last_evaluated_at_unix\x18\n" + + " \x01(\x03R\x13lastEvaluatedAtUnix\":\n" + + "\x15ListAlertRulesRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\"\xc4\x01\n" + + "\x16ListAlertRulesResponse\x122\n" + + "\x05rules\x18\x01 \x03(\v2\x1c.aes.monitoring.v1.AlertRuleR\x05rules\x12\x1d\n" + + "\n" + + "rule_limit\x18\x02 \x01(\x05R\truleLimit\x128\n" + + "\x18evaluated_instance_limit\x18\x03 \x01(\x05R\x16evaluatedInstanceLimit\x12\x1d\n" + + "\n" + + "can_manage\x18\x04 \x01(\bR\tcanManage\"\xc9\x01\n" + + "\x14SaveAlertRuleRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x0e\n" + + "\x02id\x18\x02 \x01(\tR\x02id\x124\n" + + "\x04spec\x18\x03 \x01(\v2 .aes.monitoring.v1.AlertRuleSpecR\x04spec\x12)\n" + + "\x10expected_version\x18\x04 \x01(\x03R\x0fexpectedVersion\x12\x1d\n" + + "\n" + + "request_id\x18\x05 \x01(\tR\trequestId\"I\n" + + "\x15SaveAlertRuleResponse\x120\n" + + "\x04rule\x18\x01 \x01(\v2\x1c.aes.monitoring.v1.AlertRuleR\x04rule\"\x95\x01\n" + + "\x16DeleteAlertRuleRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x0e\n" + + "\x02id\x18\x02 \x01(\tR\x02id\x12)\n" + + "\x10expected_version\x18\x03 \x01(\x03R\x0fexpectedVersion\x12\x1d\n" + + "\n" + + "request_id\x18\x04 \x01(\tR\trequestId\"\x19\n" + + "\x17DeleteAlertRuleResponse\"r\n" + + "\x17PreviewAlertRuleRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x124\n" + + "\x04spec\x18\x02 \x01(\v2 .aes.monitoring.v1.AlertRuleSpecR\x04spec\"\xb4\x01\n" + + "\x14AlertPreviewResource\x12\x17\n" + + "\avm_name\x18\x01 \x01(\tR\x06vmName\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12\x16\n" + + "\x06status\x18\x03 \x01(\tR\x06status\x12\x19\n" + + "\x05value\x18\x04 \x01(\x01H\x00R\x05value\x88\x01\x01\x12#\n" + + "\rcondition_met\x18\x05 \x01(\bR\fconditionMetB\b\n" + + "\x06_value\"\xfd\x01\n" + + "\x18PreviewAlertRuleResponse\x124\n" + + "\x16matched_resource_count\x18\x01 \x01(\x05R\x14matchedResourceCount\x12E\n" + + "\tresources\x18\x02 \x03(\v2'.aes.monitoring.v1.AlertPreviewResourceR\tresources\x12\x1f\n" + + "\vsample_only\x18\x03 \x01(\bR\n" + + "sampleOnly\x12!\n" + + "\fquery_status\x18\x04 \x01(\tR\vqueryStatus\x12 \n" + + "\vexplanation\x18\x05 \x01(\tR\vexplanation\"\xa9\x03\n" + + "\x10AlertDestination\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x12!\n" + + "\fdisplay_name\x18\x03 \x01(\tR\vdisplayName\x12\x12\n" + + "\x04kind\x18\x04 \x01(\tR\x04kind\x12\x1c\n" + + "\tprincipal\x18\x05 \x01(\tR\tprincipal\x12+\n" + + "\x11subscription_name\x18\x06 \x01(\tR\x10subscriptionName\x12\x18\n" + + "\aenabled\x18\a \x01(\bR\aenabled\x12\x18\n" + + "\aversion\x18\b \x01(\x03R\aversion\x12/\n" + + "\x13verification_status\x18\t \x01(\tR\x12verificationStatus\x126\n" + + "\x17pending_verification_id\x18\n" + + " \x01(\tR\x15pendingVerificationId\x12?\n" + + "\tlast_test\x18\v \x01(\v2\".aes.monitoring.v1.DestinationTestR\blastTest\"A\n" + + "\x1cListAlertDestinationsRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\"\xff\x01\n" + + "\x1dListAlertDestinationsResponse\x12G\n" + + "\fdestinations\x18\x01 \x03(\v2#.aes.monitoring.v1.AlertDestinationR\fdestinations\x12\x14\n" + + "\x05limit\x18\x02 \x01(\x05R\x05limit\x12)\n" + + "\x10caller_principal\x18\x03 \x01(\tR\x0fcallerPrincipal\x12'\n" + + "\x0femail_available\x18\x04 \x01(\bR\x0eemailAvailable\x12+\n" + + "\x11webhook_available\x18\x05 \x01(\bR\x10webhookAvailable\"\xae\x01\n" + + "\x1bSaveAlertDestinationRequest\x12E\n" + + "\vdestination\x18\x01 \x01(\v2#.aes.monitoring.v1.AlertDestinationR\vdestination\x12\x1d\n" + + "\n" + + "request_id\x18\x02 \x01(\tR\trequestId\x12)\n" + + "\x10expected_version\x18\x03 \x01(\x03R\x0fexpectedVersion\"e\n" + + "\x1cSaveAlertDestinationResponse\x12E\n" + + "\vdestination\x18\x01 \x01(\v2#.aes.monitoring.v1.AlertDestinationR\vdestination\"\xa0\x01\n" + + "\x1dDeleteAlertDestinationRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12)\n" + + "\x10expected_version\x18\x03 \x01(\x03R\x0fexpectedVersion\x12\x1d\n" + + "\n" + + "request_id\x18\x04 \x01(\tR\trequestId\" \n" + + "\x1eDeleteAlertDestinationResponse\"}\n" + + "%RequestDestinationVerificationRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12\x1d\n" + + "\n" + + "request_id\x18\x03 \x01(\tR\trequestId\"Q\n" + + "&RequestDestinationVerificationResponse\x12'\n" + + "\x0fverification_id\x18\x01 \x01(\tR\x0everificationId\"\x93\x01\n" + + "\x1dVerifyAlertDestinationRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x12\n" + + "\x04name\x18\x02 \x01(\tR\x04name\x12'\n" + + "\x0fverification_id\x18\x03 \x01(\tR\x0everificationId\x12\x12\n" + + "\x04code\x18\x04 \x01(\tR\x04code\" \n" + + "\x1eVerifyAlertDestinationResponse\"\xc7\x02\n" + + "\x10IncidentSnapshot\x12\x1b\n" + + "\trule_name\x18\x01 \x01(\tR\bruleName\x12\x1b\n" + + "\tmetric_id\x18\x02 \x01(\tR\bmetricId\x12\x1a\n" + + "\boperator\x18\x03 \x01(\tR\boperator\x12\x1c\n" + + "\tthreshold\x18\x04 \x01(\x01R\tthreshold\x12+\n" + + "\x11sustained_seconds\x18\x05 \x01(\x05R\x10sustainedSeconds\x12\x1a\n" + + "\bseverity\x18\x06 \x01(\tR\bseverity\x12\x19\n" + + "\x05value\x18\a \x01(\x01H\x00R\x05value\x88\x01\x01\x12'\n" + + "\x0fdatacenter_name\x18\b \x01(\tR\x0edatacenterName\x12(\n" + + "\x10observed_at_unix\x18\t \x01(\x03R\x0eobservedAtUnixB\b\n" + + "\x06_value\"\xd0\x04\n" + + "\bIncident\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12!\n" + + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x12\x17\n" + + "\arule_id\x18\x03 \x01(\tR\x06ruleId\x12!\n" + + "\frule_version\x18\x04 \x01(\x03R\vruleVersion\x12\x17\n" + + "\avm_name\x18\x05 \x01(\tR\x06vmName\x12\x14\n" + + "\x05state\x18\x06 \x01(\tR\x05state\x12$\n" + + "\x0eopened_at_unix\x18\a \x01(\x03R\fopenedAtUnix\x12$\n" + + "\x0eclosed_at_unix\x18\b \x01(\x03R\fclosedAtUnix\x12!\n" + + "\fclose_reason\x18\t \x01(\tR\vcloseReason\x12'\n" + + "\x0facknowledged_by\x18\n" + + " \x01(\tR\x0eacknowledgedBy\x120\n" + + "\x14acknowledged_at_unix\x18\v \x01(\x03R\x12acknowledgedAtUnix\x12,\n" + + "\x12snoozed_until_unix\x18\f \x01(\x03R\x10snoozedUntilUnix\x12\x18\n" + + "\aversion\x18\r \x01(\x03R\aversion\x12?\n" + + "\bsnapshot\x18\x0e \x01(\v2#.aes.monitoring.v1.IncidentSnapshotR\bsnapshot\x12+\n" + + "\x11evaluation_health\x18\x0f \x01(\tR\x10evaluationHealth\x12&\n" + + "\x0fvm_display_name\x18\x10 \x01(\tR\rvmDisplayName\">\n" + + "\x19GetIncidentSummaryRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\"\x9d\x01\n" + + "\x1aGetIncidentSummaryResponse\x12\x1d\n" + + "\n" + + "open_count\x18\x01 \x01(\x05R\topenCount\x12%\n" + + "\x0ecritical_count\x18\x02 \x01(\x05R\rcriticalCount\x129\n" + + "\tincidents\x18\x03 \x03(\v2\x1b.aes.monitoring.v1.IncidentR\tincidents\"\xc1\x01\n" + + "\x12IncidentTransition\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12\x12\n" + + "\x04kind\x18\x02 \x01(\tR\x04kind\x12(\n" + + "\x10create_time_unix\x18\x03 \x01(\x03R\x0ecreateTimeUnix\x12\x1c\n" + + "\tprincipal\x18\x04 \x01(\tR\tprincipal\x12?\n" + + "\bsnapshot\x18\x05 \x01(\v2#.aes.monitoring.v1.IncidentSnapshotR\bsnapshot\"\xa2\x02\n" + + "\x10IncidentDelivery\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12#\n" + + "\rtransition_id\x18\x02 \x01(\tR\ftransitionId\x12)\n" + + "\x10destination_name\x18\x03 \x01(\tR\x0fdestinationName\x12\x14\n" + + "\x05state\x18\x04 \x01(\tR\x05state\x12#\n" + + "\rattempt_count\x18\x05 \x01(\x05R\fattemptCount\x12(\n" + + "\x10create_time_unix\x18\x06 \x01(\x03R\x0ecreateTimeUnix\x12*\n" + + "\x11completed_at_unix\x18\a \x01(\x03R\x0fcompletedAtUnix\x12\x1d\n" + + "\n" + + "last_error\x18\b \x01(\tR\tlastError\"\xa4\x01\n" + + "\x14ListIncidentsRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x14\n" + + "\x05state\x18\x02 \x01(\tR\x05state\x12\x17\n" + + "\avm_name\x18\x03 \x01(\tR\x06vmName\x12\x1b\n" + + "\tpage_size\x18\x04 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x05 \x01(\tR\tpageToken\"z\n" + + "\x15ListIncidentsResponse\x129\n" + + "\tincidents\x18\x01 \x03(\v2\x1b.aes.monitoring.v1.IncidentR\tincidents\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"f\n" + + "\x12GetIncidentRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x0e\n" + + "\x02id\x18\x02 \x01(\tR\x02id\x12\x1d\n" + + "\n" + + "page_token\x18\x03 \x01(\tR\tpageToken\"\x84\x02\n" + + "\x13GetIncidentResponse\x127\n" + + "\bincident\x18\x01 \x01(\v2\x1b.aes.monitoring.v1.IncidentR\bincident\x12G\n" + + "\vtransitions\x18\x02 \x03(\v2%.aes.monitoring.v1.IncidentTransitionR\vtransitions\x12C\n" + + "\n" + + "deliveries\x18\x03 \x03(\v2#.aes.monitoring.v1.IncidentDeliveryR\n" + + "deliveries\x12&\n" + + "\x0fnext_page_token\x18\x04 \x01(\tR\rnextPageToken\"\xd7\x01\n" + + "\x15UpdateIncidentRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x0e\n" + + "\x02id\x18\x02 \x01(\tR\x02id\x12)\n" + + "\x10expected_version\x18\x03 \x01(\x03R\x0fexpectedVersion\x12\x1d\n" + + "\n" + + "request_id\x18\x04 \x01(\tR\trequestId\x12\x16\n" + + "\x06action\x18\x05 \x01(\tR\x06action\x12)\n" + + "\x10duration_seconds\x18\x06 \x01(\x05R\x0fdurationSeconds\"Q\n" + + "\x16UpdateIncidentResponse\x127\n" + + "\bincident\x18\x01 \x01(\v2\x1b.aes.monitoring.v1.IncidentR\bincident\"\xed\x01\n" + + "\rAlertInstance\x12\x17\n" + + "\arule_id\x18\x01 \x01(\tR\x06ruleId\x12!\n" + + "\frule_version\x18\x02 \x01(\x03R\vruleVersion\x12\x17\n" + + "\avm_name\x18\x03 \x01(\tR\x06vmName\x12\x16\n" + + "\x06health\x18\x04 \x01(\tR\x06health\x12\x1c\n" + + "\tcondition\x18\x05 \x01(\tR\tcondition\x12\x1f\n" + + "\vincident_id\x18\x06 \x01(\tR\n" + + "incidentId\x120\n" + + "\x14transition_time_unix\x18\a \x01(\x03R\x12transitionTimeUnix\"\x93\x01\n" + + "\x19ListAlertInstancesRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x17\n" + + "\arule_id\x18\x02 \x01(\tR\x06ruleId\x12\x1b\n" + + "\tpage_size\x18\x03 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x04 \x01(\tR\tpageToken\"\x84\x01\n" + + "\x1aListAlertInstancesResponse\x12>\n" + + "\tinstances\x18\x01 \x03(\v2 .aes.monitoring.v1.AlertInstanceR\tinstances\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"\x80\x01\n" + + "\x19AlertDestinationCandidate\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12\x12\n" + + "\x04kind\x18\x03 \x01(\tR\x04kind\x12\x18\n" + + "\aaddress\x18\x04 \x01(\tR\aaddress\"\x95\x01\n" + + "%ListAlertDestinationCandidatesRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x12\n" + + "\x04kind\x18\x02 \x01(\tR\x04kind\x12\x16\n" + + "\x06search\x18\x03 \x01(\tR\x06search\x12\x1d\n" + + "\n" + + "page_token\x18\x04 \x01(\tR\tpageToken\"\x9e\x01\n" + + "&ListAlertDestinationCandidatesResponse\x12L\n" + + "\n" + + "candidates\x18\x01 \x03(\v2,.aes.monitoring.v1.AlertDestinationCandidateR\n" + + "candidates\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"\xd0\x01\n" + + "\x0fDestinationTest\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12)\n" + + "\x10destination_name\x18\x02 \x01(\tR\x0fdestinationName\x12\x14\n" + + "\x05state\x18\x03 \x01(\tR\x05state\x12#\n" + + "\rattempt_count\x18\x04 \x01(\x05R\fattemptCount\x12\x1d\n" + + "\n" + + "last_error\x18\x05 \x01(\tR\tlastError\x12(\n" + + "\x10create_time_unix\x18\x06 \x01(\x03R\x0ecreateTimeUnix\"\x8a\x01\n" + + "\x1bTestAlertDestinationRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12)\n" + + "\x10destination_name\x18\x02 \x01(\tR\x0fdestinationName\x12\x1d\n" + + "\n" + + "request_id\x18\x03 \x01(\tR\trequestId\"V\n" + + "\x1cTestAlertDestinationResponse\x126\n" + + "\x04test\x18\x01 \x01(\v2\".aes.monitoring.v1.DestinationTestR\x04test\"N\n" + + "\x19GetDestinationTestRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x0e\n" + + "\x02id\x18\x02 \x01(\tR\x02id\"T\n" + + "\x1aGetDestinationTestResponse\x126\n" + + "\x04test\x18\x01 \x01(\v2\".aes.monitoring.v1.DestinationTestR\x04test2\xce\x0f\n" + + "\fAlertService\x12e\n" + + "\x0eListAlertRules\x12(.aes.monitoring.v1.ListAlertRulesRequest\x1a).aes.monitoring.v1.ListAlertRulesResponse\x12b\n" + + "\rSaveAlertRule\x12'.aes.monitoring.v1.SaveAlertRuleRequest\x1a(.aes.monitoring.v1.SaveAlertRuleResponse\x12h\n" + + "\x0fDeleteAlertRule\x12).aes.monitoring.v1.DeleteAlertRuleRequest\x1a*.aes.monitoring.v1.DeleteAlertRuleResponse\x12k\n" + + "\x10PreviewAlertRule\x12*.aes.monitoring.v1.PreviewAlertRuleRequest\x1a+.aes.monitoring.v1.PreviewAlertRuleResponse\x12z\n" + + "\x15ListAlertDestinations\x12/.aes.monitoring.v1.ListAlertDestinationsRequest\x1a0.aes.monitoring.v1.ListAlertDestinationsResponse\x12w\n" + + "\x14SaveAlertDestination\x12..aes.monitoring.v1.SaveAlertDestinationRequest\x1a/.aes.monitoring.v1.SaveAlertDestinationResponse\x12}\n" + + "\x16DeleteAlertDestination\x120.aes.monitoring.v1.DeleteAlertDestinationRequest\x1a1.aes.monitoring.v1.DeleteAlertDestinationResponse\x12\x95\x01\n" + + "\x1eRequestDestinationVerification\x128.aes.monitoring.v1.RequestDestinationVerificationRequest\x1a9.aes.monitoring.v1.RequestDestinationVerificationResponse\x12}\n" + + "\x16VerifyAlertDestination\x120.aes.monitoring.v1.VerifyAlertDestinationRequest\x1a1.aes.monitoring.v1.VerifyAlertDestinationResponse\x12b\n" + + "\rListIncidents\x12'.aes.monitoring.v1.ListIncidentsRequest\x1a(.aes.monitoring.v1.ListIncidentsResponse\x12q\n" + + "\x12GetIncidentSummary\x12,.aes.monitoring.v1.GetIncidentSummaryRequest\x1a-.aes.monitoring.v1.GetIncidentSummaryResponse\x12\\\n" + + "\vGetIncident\x12%.aes.monitoring.v1.GetIncidentRequest\x1a&.aes.monitoring.v1.GetIncidentResponse\x12e\n" + + "\x0eUpdateIncident\x12(.aes.monitoring.v1.UpdateIncidentRequest\x1a).aes.monitoring.v1.UpdateIncidentResponse\x12q\n" + + "\x12ListAlertInstances\x12,.aes.monitoring.v1.ListAlertInstancesRequest\x1a-.aes.monitoring.v1.ListAlertInstancesResponse\x12\x95\x01\n" + + "\x1eListAlertDestinationCandidates\x128.aes.monitoring.v1.ListAlertDestinationCandidatesRequest\x1a9.aes.monitoring.v1.ListAlertDestinationCandidatesResponse\x12w\n" + + "\x14TestAlertDestination\x12..aes.monitoring.v1.TestAlertDestinationRequest\x1a/.aes.monitoring.v1.TestAlertDestinationResponse\x12q\n" + + "\x12GetDestinationTest\x12,.aes.monitoring.v1.GetDestinationTestRequest\x1a-.aes.monitoring.v1.GetDestinationTestResponseB\xd7\x01\n" + + "\x15com.aes.monitoring.v1B\vAlertsProtoP\x01ZKgithub.com/AES-Services/metalhost-sdk/gen/go/aes/monitoring/v1;monitoringv1\xa2\x02\x03AMX\xaa\x02\x11Aes.Monitoring.V1\xca\x02\x11Aes\\Monitoring\\V1\xe2\x02\x1dAes\\Monitoring\\V1\\GPBMetadata\xea\x02\x13Aes::Monitoring::V1b\x06proto3" + +var ( + file_aes_monitoring_v1_alerts_proto_rawDescOnce sync.Once + file_aes_monitoring_v1_alerts_proto_rawDescData []byte +) + +func file_aes_monitoring_v1_alerts_proto_rawDescGZIP() []byte { + file_aes_monitoring_v1_alerts_proto_rawDescOnce.Do(func() { + file_aes_monitoring_v1_alerts_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_aes_monitoring_v1_alerts_proto_rawDesc), len(file_aes_monitoring_v1_alerts_proto_rawDesc))) + }) + return file_aes_monitoring_v1_alerts_proto_rawDescData +} + +var file_aes_monitoring_v1_alerts_proto_msgTypes = make([]protoimpl.MessageInfo, 45) +var file_aes_monitoring_v1_alerts_proto_goTypes = []any{ + (*AlertRuleSpec)(nil), // 0: aes.monitoring.v1.AlertRuleSpec + (*AlertRule)(nil), // 1: aes.monitoring.v1.AlertRule + (*ListAlertRulesRequest)(nil), // 2: aes.monitoring.v1.ListAlertRulesRequest + (*ListAlertRulesResponse)(nil), // 3: aes.monitoring.v1.ListAlertRulesResponse + (*SaveAlertRuleRequest)(nil), // 4: aes.monitoring.v1.SaveAlertRuleRequest + (*SaveAlertRuleResponse)(nil), // 5: aes.monitoring.v1.SaveAlertRuleResponse + (*DeleteAlertRuleRequest)(nil), // 6: aes.monitoring.v1.DeleteAlertRuleRequest + (*DeleteAlertRuleResponse)(nil), // 7: aes.monitoring.v1.DeleteAlertRuleResponse + (*PreviewAlertRuleRequest)(nil), // 8: aes.monitoring.v1.PreviewAlertRuleRequest + (*AlertPreviewResource)(nil), // 9: aes.monitoring.v1.AlertPreviewResource + (*PreviewAlertRuleResponse)(nil), // 10: aes.monitoring.v1.PreviewAlertRuleResponse + (*AlertDestination)(nil), // 11: aes.monitoring.v1.AlertDestination + (*ListAlertDestinationsRequest)(nil), // 12: aes.monitoring.v1.ListAlertDestinationsRequest + (*ListAlertDestinationsResponse)(nil), // 13: aes.monitoring.v1.ListAlertDestinationsResponse + (*SaveAlertDestinationRequest)(nil), // 14: aes.monitoring.v1.SaveAlertDestinationRequest + (*SaveAlertDestinationResponse)(nil), // 15: aes.monitoring.v1.SaveAlertDestinationResponse + (*DeleteAlertDestinationRequest)(nil), // 16: aes.monitoring.v1.DeleteAlertDestinationRequest + (*DeleteAlertDestinationResponse)(nil), // 17: aes.monitoring.v1.DeleteAlertDestinationResponse + (*RequestDestinationVerificationRequest)(nil), // 18: aes.monitoring.v1.RequestDestinationVerificationRequest + (*RequestDestinationVerificationResponse)(nil), // 19: aes.monitoring.v1.RequestDestinationVerificationResponse + (*VerifyAlertDestinationRequest)(nil), // 20: aes.monitoring.v1.VerifyAlertDestinationRequest + (*VerifyAlertDestinationResponse)(nil), // 21: aes.monitoring.v1.VerifyAlertDestinationResponse + (*IncidentSnapshot)(nil), // 22: aes.monitoring.v1.IncidentSnapshot + (*Incident)(nil), // 23: aes.monitoring.v1.Incident + (*GetIncidentSummaryRequest)(nil), // 24: aes.monitoring.v1.GetIncidentSummaryRequest + (*GetIncidentSummaryResponse)(nil), // 25: aes.monitoring.v1.GetIncidentSummaryResponse + (*IncidentTransition)(nil), // 26: aes.monitoring.v1.IncidentTransition + (*IncidentDelivery)(nil), // 27: aes.monitoring.v1.IncidentDelivery + (*ListIncidentsRequest)(nil), // 28: aes.monitoring.v1.ListIncidentsRequest + (*ListIncidentsResponse)(nil), // 29: aes.monitoring.v1.ListIncidentsResponse + (*GetIncidentRequest)(nil), // 30: aes.monitoring.v1.GetIncidentRequest + (*GetIncidentResponse)(nil), // 31: aes.monitoring.v1.GetIncidentResponse + (*UpdateIncidentRequest)(nil), // 32: aes.monitoring.v1.UpdateIncidentRequest + (*UpdateIncidentResponse)(nil), // 33: aes.monitoring.v1.UpdateIncidentResponse + (*AlertInstance)(nil), // 34: aes.monitoring.v1.AlertInstance + (*ListAlertInstancesRequest)(nil), // 35: aes.monitoring.v1.ListAlertInstancesRequest + (*ListAlertInstancesResponse)(nil), // 36: aes.monitoring.v1.ListAlertInstancesResponse + (*AlertDestinationCandidate)(nil), // 37: aes.monitoring.v1.AlertDestinationCandidate + (*ListAlertDestinationCandidatesRequest)(nil), // 38: aes.monitoring.v1.ListAlertDestinationCandidatesRequest + (*ListAlertDestinationCandidatesResponse)(nil), // 39: aes.monitoring.v1.ListAlertDestinationCandidatesResponse + (*DestinationTest)(nil), // 40: aes.monitoring.v1.DestinationTest + (*TestAlertDestinationRequest)(nil), // 41: aes.monitoring.v1.TestAlertDestinationRequest + (*TestAlertDestinationResponse)(nil), // 42: aes.monitoring.v1.TestAlertDestinationResponse + (*GetDestinationTestRequest)(nil), // 43: aes.monitoring.v1.GetDestinationTestRequest + (*GetDestinationTestResponse)(nil), // 44: aes.monitoring.v1.GetDestinationTestResponse +} +var file_aes_monitoring_v1_alerts_proto_depIdxs = []int32{ + 0, // 0: aes.monitoring.v1.AlertRule.spec:type_name -> aes.monitoring.v1.AlertRuleSpec + 1, // 1: aes.monitoring.v1.ListAlertRulesResponse.rules:type_name -> aes.monitoring.v1.AlertRule + 0, // 2: aes.monitoring.v1.SaveAlertRuleRequest.spec:type_name -> aes.monitoring.v1.AlertRuleSpec + 1, // 3: aes.monitoring.v1.SaveAlertRuleResponse.rule:type_name -> aes.monitoring.v1.AlertRule + 0, // 4: aes.monitoring.v1.PreviewAlertRuleRequest.spec:type_name -> aes.monitoring.v1.AlertRuleSpec + 9, // 5: aes.monitoring.v1.PreviewAlertRuleResponse.resources:type_name -> aes.monitoring.v1.AlertPreviewResource + 40, // 6: aes.monitoring.v1.AlertDestination.last_test:type_name -> aes.monitoring.v1.DestinationTest + 11, // 7: aes.monitoring.v1.ListAlertDestinationsResponse.destinations:type_name -> aes.monitoring.v1.AlertDestination + 11, // 8: aes.monitoring.v1.SaveAlertDestinationRequest.destination:type_name -> aes.monitoring.v1.AlertDestination + 11, // 9: aes.monitoring.v1.SaveAlertDestinationResponse.destination:type_name -> aes.monitoring.v1.AlertDestination + 22, // 10: aes.monitoring.v1.Incident.snapshot:type_name -> aes.monitoring.v1.IncidentSnapshot + 23, // 11: aes.monitoring.v1.GetIncidentSummaryResponse.incidents:type_name -> aes.monitoring.v1.Incident + 22, // 12: aes.monitoring.v1.IncidentTransition.snapshot:type_name -> aes.monitoring.v1.IncidentSnapshot + 23, // 13: aes.monitoring.v1.ListIncidentsResponse.incidents:type_name -> aes.monitoring.v1.Incident + 23, // 14: aes.monitoring.v1.GetIncidentResponse.incident:type_name -> aes.monitoring.v1.Incident + 26, // 15: aes.monitoring.v1.GetIncidentResponse.transitions:type_name -> aes.monitoring.v1.IncidentTransition + 27, // 16: aes.monitoring.v1.GetIncidentResponse.deliveries:type_name -> aes.monitoring.v1.IncidentDelivery + 23, // 17: aes.monitoring.v1.UpdateIncidentResponse.incident:type_name -> aes.monitoring.v1.Incident + 34, // 18: aes.monitoring.v1.ListAlertInstancesResponse.instances:type_name -> aes.monitoring.v1.AlertInstance + 37, // 19: aes.monitoring.v1.ListAlertDestinationCandidatesResponse.candidates:type_name -> aes.monitoring.v1.AlertDestinationCandidate + 40, // 20: aes.monitoring.v1.TestAlertDestinationResponse.test:type_name -> aes.monitoring.v1.DestinationTest + 40, // 21: aes.monitoring.v1.GetDestinationTestResponse.test:type_name -> aes.monitoring.v1.DestinationTest + 2, // 22: aes.monitoring.v1.AlertService.ListAlertRules:input_type -> aes.monitoring.v1.ListAlertRulesRequest + 4, // 23: aes.monitoring.v1.AlertService.SaveAlertRule:input_type -> aes.monitoring.v1.SaveAlertRuleRequest + 6, // 24: aes.monitoring.v1.AlertService.DeleteAlertRule:input_type -> aes.monitoring.v1.DeleteAlertRuleRequest + 8, // 25: aes.monitoring.v1.AlertService.PreviewAlertRule:input_type -> aes.monitoring.v1.PreviewAlertRuleRequest + 12, // 26: aes.monitoring.v1.AlertService.ListAlertDestinations:input_type -> aes.monitoring.v1.ListAlertDestinationsRequest + 14, // 27: aes.monitoring.v1.AlertService.SaveAlertDestination:input_type -> aes.monitoring.v1.SaveAlertDestinationRequest + 16, // 28: aes.monitoring.v1.AlertService.DeleteAlertDestination:input_type -> aes.monitoring.v1.DeleteAlertDestinationRequest + 18, // 29: aes.monitoring.v1.AlertService.RequestDestinationVerification:input_type -> aes.monitoring.v1.RequestDestinationVerificationRequest + 20, // 30: aes.monitoring.v1.AlertService.VerifyAlertDestination:input_type -> aes.monitoring.v1.VerifyAlertDestinationRequest + 28, // 31: aes.monitoring.v1.AlertService.ListIncidents:input_type -> aes.monitoring.v1.ListIncidentsRequest + 24, // 32: aes.monitoring.v1.AlertService.GetIncidentSummary:input_type -> aes.monitoring.v1.GetIncidentSummaryRequest + 30, // 33: aes.monitoring.v1.AlertService.GetIncident:input_type -> aes.monitoring.v1.GetIncidentRequest + 32, // 34: aes.monitoring.v1.AlertService.UpdateIncident:input_type -> aes.monitoring.v1.UpdateIncidentRequest + 35, // 35: aes.monitoring.v1.AlertService.ListAlertInstances:input_type -> aes.monitoring.v1.ListAlertInstancesRequest + 38, // 36: aes.monitoring.v1.AlertService.ListAlertDestinationCandidates:input_type -> aes.monitoring.v1.ListAlertDestinationCandidatesRequest + 41, // 37: aes.monitoring.v1.AlertService.TestAlertDestination:input_type -> aes.monitoring.v1.TestAlertDestinationRequest + 43, // 38: aes.monitoring.v1.AlertService.GetDestinationTest:input_type -> aes.monitoring.v1.GetDestinationTestRequest + 3, // 39: aes.monitoring.v1.AlertService.ListAlertRules:output_type -> aes.monitoring.v1.ListAlertRulesResponse + 5, // 40: aes.monitoring.v1.AlertService.SaveAlertRule:output_type -> aes.monitoring.v1.SaveAlertRuleResponse + 7, // 41: aes.monitoring.v1.AlertService.DeleteAlertRule:output_type -> aes.monitoring.v1.DeleteAlertRuleResponse + 10, // 42: aes.monitoring.v1.AlertService.PreviewAlertRule:output_type -> aes.monitoring.v1.PreviewAlertRuleResponse + 13, // 43: aes.monitoring.v1.AlertService.ListAlertDestinations:output_type -> aes.monitoring.v1.ListAlertDestinationsResponse + 15, // 44: aes.monitoring.v1.AlertService.SaveAlertDestination:output_type -> aes.monitoring.v1.SaveAlertDestinationResponse + 17, // 45: aes.monitoring.v1.AlertService.DeleteAlertDestination:output_type -> aes.monitoring.v1.DeleteAlertDestinationResponse + 19, // 46: aes.monitoring.v1.AlertService.RequestDestinationVerification:output_type -> aes.monitoring.v1.RequestDestinationVerificationResponse + 21, // 47: aes.monitoring.v1.AlertService.VerifyAlertDestination:output_type -> aes.monitoring.v1.VerifyAlertDestinationResponse + 29, // 48: aes.monitoring.v1.AlertService.ListIncidents:output_type -> aes.monitoring.v1.ListIncidentsResponse + 25, // 49: aes.monitoring.v1.AlertService.GetIncidentSummary:output_type -> aes.monitoring.v1.GetIncidentSummaryResponse + 31, // 50: aes.monitoring.v1.AlertService.GetIncident:output_type -> aes.monitoring.v1.GetIncidentResponse + 33, // 51: aes.monitoring.v1.AlertService.UpdateIncident:output_type -> aes.monitoring.v1.UpdateIncidentResponse + 36, // 52: aes.monitoring.v1.AlertService.ListAlertInstances:output_type -> aes.monitoring.v1.ListAlertInstancesResponse + 39, // 53: aes.monitoring.v1.AlertService.ListAlertDestinationCandidates:output_type -> aes.monitoring.v1.ListAlertDestinationCandidatesResponse + 42, // 54: aes.monitoring.v1.AlertService.TestAlertDestination:output_type -> aes.monitoring.v1.TestAlertDestinationResponse + 44, // 55: aes.monitoring.v1.AlertService.GetDestinationTest:output_type -> aes.monitoring.v1.GetDestinationTestResponse + 39, // [39:56] is the sub-list for method output_type + 22, // [22:39] is the sub-list for method input_type + 22, // [22:22] is the sub-list for extension type_name + 22, // [22:22] is the sub-list for extension extendee + 0, // [0:22] is the sub-list for field type_name +} + +func init() { file_aes_monitoring_v1_alerts_proto_init() } +func file_aes_monitoring_v1_alerts_proto_init() { + if File_aes_monitoring_v1_alerts_proto != nil { + return + } + file_aes_monitoring_v1_alerts_proto_msgTypes[9].OneofWrappers = []any{} + file_aes_monitoring_v1_alerts_proto_msgTypes[22].OneofWrappers = []any{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_aes_monitoring_v1_alerts_proto_rawDesc), len(file_aes_monitoring_v1_alerts_proto_rawDesc)), + NumEnums: 0, + NumMessages: 45, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_aes_monitoring_v1_alerts_proto_goTypes, + DependencyIndexes: file_aes_monitoring_v1_alerts_proto_depIdxs, + MessageInfos: file_aes_monitoring_v1_alerts_proto_msgTypes, + }.Build() + File_aes_monitoring_v1_alerts_proto = out.File + file_aes_monitoring_v1_alerts_proto_goTypes = nil + file_aes_monitoring_v1_alerts_proto_depIdxs = nil +} diff --git a/gen/go/aes/monitoring/v1/monitoring.pb.go b/gen/go/aes/monitoring/v1/monitoring.pb.go new file mode 100644 index 0000000..7f9b6f7 --- /dev/null +++ b/gen/go/aes/monitoring/v1/monitoring.pb.go @@ -0,0 +1,1428 @@ +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.36.11 +// protoc (unknown) +// source: aes/monitoring/v1/monitoring.proto + +package monitoringv1 + +import ( + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + reflect "reflect" + sync "sync" + unsafe "unsafe" +) + +const ( + // Verify that this generated code is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) + // Verify that runtime/protoimpl is sufficiently up-to-date. + _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) +) + +type MetricDescriptor struct { + state protoimpl.MessageState `protogen:"open.v1"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + Unit string `protobuf:"bytes,3,opt,name=unit,proto3" json:"unit,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + Source string `protobuf:"bytes,5,opt,name=source,proto3" json:"source,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MetricDescriptor) Reset() { + *x = MetricDescriptor{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MetricDescriptor) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetricDescriptor) ProtoMessage() {} + +func (x *MetricDescriptor) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[0] + 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 MetricDescriptor.ProtoReflect.Descriptor instead. +func (*MetricDescriptor) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{0} +} + +func (x *MetricDescriptor) GetId() string { + if x != nil { + return x.Id + } + return "" +} + +func (x *MetricDescriptor) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *MetricDescriptor) GetUnit() string { + if x != nil { + return x.Unit + } + return "" +} + +func (x *MetricDescriptor) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +func (x *MetricDescriptor) GetSource() string { + if x != nil { + return x.Source + } + return "" +} + +type ListMetricDescriptorsRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListMetricDescriptorsRequest) Reset() { + *x = ListMetricDescriptorsRequest{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListMetricDescriptorsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListMetricDescriptorsRequest) ProtoMessage() {} + +func (x *ListMetricDescriptorsRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[1] + 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 ListMetricDescriptorsRequest.ProtoReflect.Descriptor instead. +func (*ListMetricDescriptorsRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{1} +} + +func (x *ListMetricDescriptorsRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +type ListMetricDescriptorsResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Metrics []*MetricDescriptor `protobuf:"bytes,1,rep,name=metrics,proto3" json:"metrics,omitempty"` + RetentionDays int32 `protobuf:"varint,2,opt,name=retention_days,json=retentionDays,proto3" json:"retention_days,omitempty"` + SampleIntervalSeconds int32 `protobuf:"varint,3,opt,name=sample_interval_seconds,json=sampleIntervalSeconds,proto3" json:"sample_interval_seconds,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListMetricDescriptorsResponse) Reset() { + *x = ListMetricDescriptorsResponse{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListMetricDescriptorsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListMetricDescriptorsResponse) ProtoMessage() {} + +func (x *ListMetricDescriptorsResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[2] + 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 ListMetricDescriptorsResponse.ProtoReflect.Descriptor instead. +func (*ListMetricDescriptorsResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{2} +} + +func (x *ListMetricDescriptorsResponse) GetMetrics() []*MetricDescriptor { + if x != nil { + return x.Metrics + } + return nil +} + +func (x *ListMetricDescriptorsResponse) GetRetentionDays() int32 { + if x != nil { + return x.RetentionDays + } + return 0 +} + +func (x *ListMetricDescriptorsResponse) GetSampleIntervalSeconds() int32 { + if x != nil { + return x.SampleIntervalSeconds + } + return 0 +} + +type ListVMMonitoringRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + PageSize int32 `protobuf:"varint,2,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` + PageToken string `protobuf:"bytes,3,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` + Search string `protobuf:"bytes,4,opt,name=search,proto3" json:"search,omitempty"` + DatacenterName string `protobuf:"bytes,5,opt,name=datacenter_name,json=datacenterName,proto3" json:"datacenter_name,omitempty"` + State string `protobuf:"bytes,6,opt,name=state,proto3" json:"state,omitempty"` + // Record pickers can skip time-series queries. Status is then NOT_REQUESTED. + InventoryOnly bool `protobuf:"varint,7,opt,name=inventory_only,json=inventoryOnly,proto3" json:"inventory_only,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListVMMonitoringRequest) Reset() { + *x = ListVMMonitoringRequest{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListVMMonitoringRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListVMMonitoringRequest) ProtoMessage() {} + +func (x *ListVMMonitoringRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ListVMMonitoringRequest.ProtoReflect.Descriptor instead. +func (*ListVMMonitoringRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{3} +} + +func (x *ListVMMonitoringRequest) GetProjectName() string { + if x != nil { + return x.ProjectName + } + return "" +} + +func (x *ListVMMonitoringRequest) GetPageSize() int32 { + if x != nil { + return x.PageSize + } + return 0 +} + +func (x *ListVMMonitoringRequest) GetPageToken() string { + if x != nil { + return x.PageToken + } + return "" +} + +func (x *ListVMMonitoringRequest) GetSearch() string { + if x != nil { + return x.Search + } + return "" +} + +func (x *ListVMMonitoringRequest) GetDatacenterName() string { + if x != nil { + return x.DatacenterName + } + return "" +} + +func (x *ListVMMonitoringRequest) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *ListVMMonitoringRequest) GetInventoryOnly() bool { + if x != nil { + return x.InventoryOnly + } + return false +} + +type MonitoredVM struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + DatacenterName string `protobuf:"bytes,3,opt,name=datacenter_name,json=datacenterName,proto3" json:"datacenter_name,omitempty"` + State string `protobuf:"bytes,4,opt,name=state,proto3" json:"state,omitempty"` + // AVAILABLE, STALE, AWAITING_DATA, or ERROR; never infer VM health from this. + CollectionStatus string `protobuf:"bytes,5,opt,name=collection_status,json=collectionStatus,proto3" json:"collection_status,omitempty"` + ObservedAtUnix int64 `protobuf:"varint,6,opt,name=observed_at_unix,json=observedAtUnix,proto3" json:"observed_at_unix,omitempty"` + EnhancedStatus string `protobuf:"bytes,7,opt,name=enhanced_status,json=enhancedStatus,proto3" json:"enhanced_status,omitempty"` + CpuUtilizationPercent *float64 `protobuf:"fixed64,8,opt,name=cpu_utilization_percent,json=cpuUtilizationPercent,proto3,oneof" json:"cpu_utilization_percent,omitempty"` + MemoryUsedBytes *float64 `protobuf:"fixed64,9,opt,name=memory_used_bytes,json=memoryUsedBytes,proto3,oneof" json:"memory_used_bytes,omitempty"` + FilesystemUsedPercent *float64 `protobuf:"fixed64,10,opt,name=filesystem_used_percent,json=filesystemUsedPercent,proto3,oneof" json:"filesystem_used_percent,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MonitoredVM) Reset() { + *x = MonitoredVM{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MonitoredVM) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MonitoredVM) ProtoMessage() {} + +func (x *MonitoredVM) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[4] + 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 MonitoredVM.ProtoReflect.Descriptor instead. +func (*MonitoredVM) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{4} +} + +func (x *MonitoredVM) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MonitoredVM) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *MonitoredVM) GetDatacenterName() string { + if x != nil { + return x.DatacenterName + } + return "" +} + +func (x *MonitoredVM) GetState() string { + if x != nil { + return x.State + } + return "" +} + +func (x *MonitoredVM) GetCollectionStatus() string { + if x != nil { + return x.CollectionStatus + } + return "" +} + +func (x *MonitoredVM) GetObservedAtUnix() int64 { + if x != nil { + return x.ObservedAtUnix + } + return 0 +} + +func (x *MonitoredVM) GetEnhancedStatus() string { + if x != nil { + return x.EnhancedStatus + } + return "" +} + +func (x *MonitoredVM) GetCpuUtilizationPercent() float64 { + if x != nil && x.CpuUtilizationPercent != nil { + return *x.CpuUtilizationPercent + } + return 0 +} + +func (x *MonitoredVM) GetMemoryUsedBytes() float64 { + if x != nil && x.MemoryUsedBytes != nil { + return *x.MemoryUsedBytes + } + return 0 +} + +func (x *MonitoredVM) GetFilesystemUsedPercent() float64 { + if x != nil && x.FilesystemUsedPercent != nil { + return *x.FilesystemUsedPercent + } + return 0 +} + +type ListVMMonitoringResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Vms []*MonitoredVM `protobuf:"bytes,1,rep,name=vms,proto3" json:"vms,omitempty"` + NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` + QueryStatus string `protobuf:"bytes,3,opt,name=query_status,json=queryStatus,proto3" json:"query_status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *ListVMMonitoringResponse) Reset() { + *x = ListVMMonitoringResponse{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ListVMMonitoringResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ListVMMonitoringResponse) ProtoMessage() {} + +func (x *ListVMMonitoringResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[5] + 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 ListVMMonitoringResponse.ProtoReflect.Descriptor instead. +func (*ListVMMonitoringResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{5} +} + +func (x *ListVMMonitoringResponse) GetVms() []*MonitoredVM { + if x != nil { + return x.Vms + } + return nil +} + +func (x *ListVMMonitoringResponse) GetNextPageToken() string { + if x != nil { + return x.NextPageToken + } + return "" +} + +func (x *ListVMMonitoringResponse) GetQueryStatus() string { + if x != nil { + return x.QueryStatus + } + return "" +} + +type QueryVMMonitoringRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + MetricIds []string `protobuf:"bytes,2,rep,name=metric_ids,json=metricIds,proto3" json:"metric_ids,omitempty"` + StartTimeUnix int64 `protobuf:"varint,3,opt,name=start_time_unix,json=startTimeUnix,proto3" json:"start_time_unix,omitempty"` + EndTimeUnix int64 `protobuf:"varint,4,opt,name=end_time_unix,json=endTimeUnix,proto3" json:"end_time_unix,omitempty"` + StepSeconds int32 `protobuf:"varint,5,opt,name=step_seconds,json=stepSeconds,proto3" json:"step_seconds,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *QueryVMMonitoringRequest) Reset() { + *x = QueryVMMonitoringRequest{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *QueryVMMonitoringRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryVMMonitoringRequest) ProtoMessage() {} + +func (x *QueryVMMonitoringRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[6] + 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 QueryVMMonitoringRequest.ProtoReflect.Descriptor instead. +func (*QueryVMMonitoringRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{6} +} + +func (x *QueryVMMonitoringRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *QueryVMMonitoringRequest) GetMetricIds() []string { + if x != nil { + return x.MetricIds + } + return nil +} + +func (x *QueryVMMonitoringRequest) GetStartTimeUnix() int64 { + if x != nil { + return x.StartTimeUnix + } + return 0 +} + +func (x *QueryVMMonitoringRequest) GetEndTimeUnix() int64 { + if x != nil { + return x.EndTimeUnix + } + return 0 +} + +func (x *QueryVMMonitoringRequest) GetStepSeconds() int32 { + if x != nil { + return x.StepSeconds + } + return 0 +} + +type Sample struct { + state protoimpl.MessageState `protogen:"open.v1"` + TimestampUnix int64 `protobuf:"varint,1,opt,name=timestamp_unix,json=timestampUnix,proto3" json:"timestamp_unix,omitempty"` + Value float64 `protobuf:"fixed64,2,opt,name=value,proto3" json:"value,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Sample) Reset() { + *x = Sample{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Sample) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Sample) ProtoMessage() {} + +func (x *Sample) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[7] + 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 Sample.ProtoReflect.Descriptor instead. +func (*Sample) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{7} +} + +func (x *Sample) GetTimestampUnix() int64 { + if x != nil { + return x.TimestampUnix + } + return 0 +} + +func (x *Sample) GetValue() float64 { + if x != nil { + return x.Value + } + return 0 +} + +type Series struct { + state protoimpl.MessageState `protogen:"open.v1"` + MetricId string `protobuf:"bytes,1,opt,name=metric_id,json=metricId,proto3" json:"metric_id,omitempty"` + Dimensions map[string]string `protobuf:"bytes,2,rep,name=dimensions,proto3" json:"dimensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + Samples []*Sample `protobuf:"bytes,3,rep,name=samples,proto3" json:"samples,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Series) Reset() { + *x = Series{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[8] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Series) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Series) ProtoMessage() {} + +func (x *Series) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[8] + 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 Series.ProtoReflect.Descriptor instead. +func (*Series) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{8} +} + +func (x *Series) GetMetricId() string { + if x != nil { + return x.MetricId + } + return "" +} + +func (x *Series) GetDimensions() map[string]string { + if x != nil { + return x.Dimensions + } + return nil +} + +func (x *Series) GetSamples() []*Sample { + if x != nil { + return x.Samples + } + return nil +} + +type MetricQuality struct { + state protoimpl.MessageState `protogen:"open.v1"` + MetricId string `protobuf:"bytes,1,opt,name=metric_id,json=metricId,proto3" json:"metric_id,omitempty"` + // AVAILABLE, STALE, AWAITING_DATA, UNSUPPORTED, or ERROR. + Status string `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + ObservedAtUnix int64 `protobuf:"varint,3,opt,name=observed_at_unix,json=observedAtUnix,proto3" json:"observed_at_unix,omitempty"` + Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MetricQuality) Reset() { + *x = MetricQuality{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MetricQuality) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MetricQuality) ProtoMessage() {} + +func (x *MetricQuality) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_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 MetricQuality.ProtoReflect.Descriptor instead. +func (*MetricQuality) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{9} +} + +func (x *MetricQuality) GetMetricId() string { + if x != nil { + return x.MetricId + } + return "" +} + +func (x *MetricQuality) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *MetricQuality) GetObservedAtUnix() int64 { + if x != nil { + return x.ObservedAtUnix + } + return 0 +} + +func (x *MetricQuality) GetDescription() string { + if x != nil { + return x.Description + } + return "" +} + +type QueryVMMonitoringResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Series []*Series `protobuf:"bytes,1,rep,name=series,proto3" json:"series,omitempty"` + Quality []*MetricQuality `protobuf:"bytes,2,rep,name=quality,proto3" json:"quality,omitempty"` + StartTimeUnix int64 `protobuf:"varint,3,opt,name=start_time_unix,json=startTimeUnix,proto3" json:"start_time_unix,omitempty"` + EndTimeUnix int64 `protobuf:"varint,4,opt,name=end_time_unix,json=endTimeUnix,proto3" json:"end_time_unix,omitempty"` + StepSeconds int32 `protobuf:"varint,5,opt,name=step_seconds,json=stepSeconds,proto3" json:"step_seconds,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *QueryVMMonitoringResponse) Reset() { + *x = QueryVMMonitoringResponse{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *QueryVMMonitoringResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryVMMonitoringResponse) ProtoMessage() {} + +func (x *QueryVMMonitoringResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[10] + 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 QueryVMMonitoringResponse.ProtoReflect.Descriptor instead. +func (*QueryVMMonitoringResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{10} +} + +func (x *QueryVMMonitoringResponse) GetSeries() []*Series { + if x != nil { + return x.Series + } + return nil +} + +func (x *QueryVMMonitoringResponse) GetQuality() []*MetricQuality { + if x != nil { + return x.Quality + } + return nil +} + +func (x *QueryVMMonitoringResponse) GetStartTimeUnix() int64 { + if x != nil { + return x.StartTimeUnix + } + return 0 +} + +func (x *QueryVMMonitoringResponse) GetEndTimeUnix() int64 { + if x != nil { + return x.EndTimeUnix + } + return 0 +} + +func (x *QueryVMMonitoringResponse) GetStepSeconds() int32 { + if x != nil { + return x.StepSeconds + } + return 0 +} + +type EnhancedMonitoring struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + InstallationId string `protobuf:"bytes,2,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"` + ResourceId string `protobuf:"bytes,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` + // DISABLED, AWAITING_INSTALLATION, CONNECTED, STALE, REVOKED, UNSUPPORTED. + Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` + DeviceReady bool `protobuf:"varint,5,opt,name=device_ready,json=deviceReady,proto3" json:"device_ready,omitempty"` + RestartRequired bool `protobuf:"varint,6,opt,name=restart_required,json=restartRequired,proto3" json:"restart_required,omitempty"` + CollectorVersion string `protobuf:"bytes,7,opt,name=collector_version,json=collectorVersion,proto3" json:"collector_version,omitempty"` + Capabilities []string `protobuf:"bytes,8,rep,name=capabilities,proto3" json:"capabilities,omitempty"` + LastSeenAtUnix int64 `protobuf:"varint,9,opt,name=last_seen_at_unix,json=lastSeenAtUnix,proto3" json:"last_seen_at_unix,omitempty"` + RevokedAtUnix int64 `protobuf:"varint,10,opt,name=revoked_at_unix,json=revokedAtUnix,proto3" json:"revoked_at_unix,omitempty"` + // Public installation identity, not a bearer credential. Requires the trusted + // VMI-bound collection path; copying this configuration grants no authority. + ConfigurationJson string `protobuf:"bytes,11,opt,name=configuration_json,json=configurationJson,proto3" json:"configuration_json,omitempty"` + RuntimeState string `protobuf:"bytes,12,opt,name=runtime_state,json=runtimeState,proto3" json:"runtime_state,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnhancedMonitoring) Reset() { + *x = EnhancedMonitoring{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnhancedMonitoring) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnhancedMonitoring) ProtoMessage() {} + +func (x *EnhancedMonitoring) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[11] + 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 EnhancedMonitoring.ProtoReflect.Descriptor instead. +func (*EnhancedMonitoring) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{11} +} + +func (x *EnhancedMonitoring) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *EnhancedMonitoring) GetInstallationId() string { + if x != nil { + return x.InstallationId + } + return "" +} + +func (x *EnhancedMonitoring) GetResourceId() string { + if x != nil { + return x.ResourceId + } + return "" +} + +func (x *EnhancedMonitoring) GetStatus() string { + if x != nil { + return x.Status + } + return "" +} + +func (x *EnhancedMonitoring) GetDeviceReady() bool { + if x != nil { + return x.DeviceReady + } + return false +} + +func (x *EnhancedMonitoring) GetRestartRequired() bool { + if x != nil { + return x.RestartRequired + } + return false +} + +func (x *EnhancedMonitoring) GetCollectorVersion() string { + if x != nil { + return x.CollectorVersion + } + return "" +} + +func (x *EnhancedMonitoring) GetCapabilities() []string { + if x != nil { + return x.Capabilities + } + return nil +} + +func (x *EnhancedMonitoring) GetLastSeenAtUnix() int64 { + if x != nil { + return x.LastSeenAtUnix + } + return 0 +} + +func (x *EnhancedMonitoring) GetRevokedAtUnix() int64 { + if x != nil { + return x.RevokedAtUnix + } + return 0 +} + +func (x *EnhancedMonitoring) GetConfigurationJson() string { + if x != nil { + return x.ConfigurationJson + } + return "" +} + +func (x *EnhancedMonitoring) GetRuntimeState() string { + if x != nil { + return x.RuntimeState + } + return "" +} + +type GetEnhancedMonitoringRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetEnhancedMonitoringRequest) Reset() { + *x = GetEnhancedMonitoringRequest{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetEnhancedMonitoringRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetEnhancedMonitoringRequest) ProtoMessage() {} + +func (x *GetEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[12] + 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 GetEnhancedMonitoringRequest.ProtoReflect.Descriptor instead. +func (*GetEnhancedMonitoringRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{12} +} + +func (x *GetEnhancedMonitoringRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +type GetEnhancedMonitoringResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Monitoring *EnhancedMonitoring `protobuf:"bytes,1,opt,name=monitoring,proto3" json:"monitoring,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetEnhancedMonitoringResponse) Reset() { + *x = GetEnhancedMonitoringResponse{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetEnhancedMonitoringResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetEnhancedMonitoringResponse) ProtoMessage() {} + +func (x *GetEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[13] + 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 GetEnhancedMonitoringResponse.ProtoReflect.Descriptor instead. +func (*GetEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{13} +} + +func (x *GetEnhancedMonitoringResponse) GetMonitoring() *EnhancedMonitoring { + if x != nil { + return x.Monitoring + } + return nil +} + +type EnableEnhancedMonitoringRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // When the device is absent, the VM must already have completed its normal + // stop operation. This RPC never stops, starts or restarts a VM itself. + ConfirmDeviceAttachment bool `protobuf:"varint,3,opt,name=confirm_device_attachment,json=confirmDeviceAttachment,proto3" json:"confirm_device_attachment,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnableEnhancedMonitoringRequest) Reset() { + *x = EnableEnhancedMonitoringRequest{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnableEnhancedMonitoringRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableEnhancedMonitoringRequest) ProtoMessage() {} + +func (x *EnableEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] + 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 EnableEnhancedMonitoringRequest.ProtoReflect.Descriptor instead. +func (*EnableEnhancedMonitoringRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{14} +} + +func (x *EnableEnhancedMonitoringRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *EnableEnhancedMonitoringRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *EnableEnhancedMonitoringRequest) GetConfirmDeviceAttachment() bool { + if x != nil { + return x.ConfirmDeviceAttachment + } + return false +} + +type EnableEnhancedMonitoringResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Monitoring *EnhancedMonitoring `protobuf:"bytes,1,opt,name=monitoring,proto3" json:"monitoring,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *EnableEnhancedMonitoringResponse) Reset() { + *x = EnableEnhancedMonitoringResponse{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *EnableEnhancedMonitoringResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*EnableEnhancedMonitoringResponse) ProtoMessage() {} + +func (x *EnableEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] + 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 EnableEnhancedMonitoringResponse.ProtoReflect.Descriptor instead. +func (*EnableEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{15} +} + +func (x *EnableEnhancedMonitoringResponse) GetMonitoring() *EnhancedMonitoring { + if x != nil { + return x.Monitoring + } + return nil +} + +type RevokeEnhancedMonitoringRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Compare-and-revoke prevents an old dialog revoking a replacement install. + InstallationId string `protobuf:"bytes,2,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevokeEnhancedMonitoringRequest) Reset() { + *x = RevokeEnhancedMonitoringRequest{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevokeEnhancedMonitoringRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokeEnhancedMonitoringRequest) ProtoMessage() {} + +func (x *RevokeEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] + 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 RevokeEnhancedMonitoringRequest.ProtoReflect.Descriptor instead. +func (*RevokeEnhancedMonitoringRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{16} +} + +func (x *RevokeEnhancedMonitoringRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RevokeEnhancedMonitoringRequest) GetInstallationId() string { + if x != nil { + return x.InstallationId + } + return "" +} + +type RevokeEnhancedMonitoringResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RevokeEnhancedMonitoringResponse) Reset() { + *x = RevokeEnhancedMonitoringResponse{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RevokeEnhancedMonitoringResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RevokeEnhancedMonitoringResponse) ProtoMessage() {} + +func (x *RevokeEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] + 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 RevokeEnhancedMonitoringResponse.ProtoReflect.Descriptor instead. +func (*RevokeEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{17} +} + +var File_aes_monitoring_v1_monitoring_proto protoreflect.FileDescriptor + +const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + + "\n" + + "\"aes/monitoring/v1/monitoring.proto\x12\x11aes.monitoring.v1\"\x93\x01\n" + + "\x10MetricDescriptor\x12\x0e\n" + + "\x02id\x18\x01 \x01(\tR\x02id\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12\x12\n" + + "\x04unit\x18\x03 \x01(\tR\x04unit\x12 \n" + + "\vdescription\x18\x04 \x01(\tR\vdescription\x12\x16\n" + + "\x06source\x18\x05 \x01(\tR\x06source\"A\n" + + "\x1cListMetricDescriptorsRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\"\xbd\x01\n" + + "\x1dListMetricDescriptorsResponse\x12=\n" + + "\ametrics\x18\x01 \x03(\v2#.aes.monitoring.v1.MetricDescriptorR\ametrics\x12%\n" + + "\x0eretention_days\x18\x02 \x01(\x05R\rretentionDays\x126\n" + + "\x17sample_interval_seconds\x18\x03 \x01(\x05R\x15sampleIntervalSeconds\"\xf6\x01\n" + + "\x17ListVMMonitoringRequest\x12!\n" + + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x1b\n" + + "\tpage_size\x18\x02 \x01(\x05R\bpageSize\x12\x1d\n" + + "\n" + + "page_token\x18\x03 \x01(\tR\tpageToken\x12\x16\n" + + "\x06search\x18\x04 \x01(\tR\x06search\x12'\n" + + "\x0fdatacenter_name\x18\x05 \x01(\tR\x0edatacenterName\x12\x14\n" + + "\x05state\x18\x06 \x01(\tR\x05state\x12%\n" + + "\x0einventory_only\x18\a \x01(\bR\rinventoryOnly\"\xfc\x03\n" + + "\vMonitoredVM\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12'\n" + + "\x0fdatacenter_name\x18\x03 \x01(\tR\x0edatacenterName\x12\x14\n" + + "\x05state\x18\x04 \x01(\tR\x05state\x12+\n" + + "\x11collection_status\x18\x05 \x01(\tR\x10collectionStatus\x12(\n" + + "\x10observed_at_unix\x18\x06 \x01(\x03R\x0eobservedAtUnix\x12'\n" + + "\x0fenhanced_status\x18\a \x01(\tR\x0eenhancedStatus\x12;\n" + + "\x17cpu_utilization_percent\x18\b \x01(\x01H\x00R\x15cpuUtilizationPercent\x88\x01\x01\x12/\n" + + "\x11memory_used_bytes\x18\t \x01(\x01H\x01R\x0fmemoryUsedBytes\x88\x01\x01\x12;\n" + + "\x17filesystem_used_percent\x18\n" + + " \x01(\x01H\x02R\x15filesystemUsedPercent\x88\x01\x01B\x1a\n" + + "\x18_cpu_utilization_percentB\x14\n" + + "\x12_memory_used_bytesB\x1a\n" + + "\x18_filesystem_used_percent\"\x97\x01\n" + + "\x18ListVMMonitoringResponse\x120\n" + + "\x03vms\x18\x01 \x03(\v2\x1e.aes.monitoring.v1.MonitoredVMR\x03vms\x12&\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x12!\n" + + "\fquery_status\x18\x03 \x01(\tR\vqueryStatus\"\xbc\x01\n" + + "\x18QueryVMMonitoringRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n" + + "\n" + + "metric_ids\x18\x02 \x03(\tR\tmetricIds\x12&\n" + + "\x0fstart_time_unix\x18\x03 \x01(\x03R\rstartTimeUnix\x12\"\n" + + "\rend_time_unix\x18\x04 \x01(\x03R\vendTimeUnix\x12!\n" + + "\fstep_seconds\x18\x05 \x01(\x05R\vstepSeconds\"E\n" + + "\x06Sample\x12%\n" + + "\x0etimestamp_unix\x18\x01 \x01(\x03R\rtimestampUnix\x12\x14\n" + + "\x05value\x18\x02 \x01(\x01R\x05value\"\xe4\x01\n" + + "\x06Series\x12\x1b\n" + + "\tmetric_id\x18\x01 \x01(\tR\bmetricId\x12I\n" + + "\n" + + "dimensions\x18\x02 \x03(\v2).aes.monitoring.v1.Series.DimensionsEntryR\n" + + "dimensions\x123\n" + + "\asamples\x18\x03 \x03(\v2\x19.aes.monitoring.v1.SampleR\asamples\x1a=\n" + + "\x0fDimensionsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x90\x01\n" + + "\rMetricQuality\x12\x1b\n" + + "\tmetric_id\x18\x01 \x01(\tR\bmetricId\x12\x16\n" + + "\x06status\x18\x02 \x01(\tR\x06status\x12(\n" + + "\x10observed_at_unix\x18\x03 \x01(\x03R\x0eobservedAtUnix\x12 \n" + + "\vdescription\x18\x04 \x01(\tR\vdescription\"\xf9\x01\n" + + "\x19QueryVMMonitoringResponse\x121\n" + + "\x06series\x18\x01 \x03(\v2\x19.aes.monitoring.v1.SeriesR\x06series\x12:\n" + + "\aquality\x18\x02 \x03(\v2 .aes.monitoring.v1.MetricQualityR\aquality\x12&\n" + + "\x0fstart_time_unix\x18\x03 \x01(\x03R\rstartTimeUnix\x12\"\n" + + "\rend_time_unix\x18\x04 \x01(\x03R\vendTimeUnix\x12!\n" + + "\fstep_seconds\x18\x05 \x01(\x05R\vstepSeconds\"\xd0\x03\n" + + "\x12EnhancedMonitoring\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12'\n" + + "\x0finstallation_id\x18\x02 \x01(\tR\x0einstallationId\x12\x1f\n" + + "\vresource_id\x18\x03 \x01(\tR\n" + + "resourceId\x12\x16\n" + + "\x06status\x18\x04 \x01(\tR\x06status\x12!\n" + + "\fdevice_ready\x18\x05 \x01(\bR\vdeviceReady\x12)\n" + + "\x10restart_required\x18\x06 \x01(\bR\x0frestartRequired\x12+\n" + + "\x11collector_version\x18\a \x01(\tR\x10collectorVersion\x12\"\n" + + "\fcapabilities\x18\b \x03(\tR\fcapabilities\x12)\n" + + "\x11last_seen_at_unix\x18\t \x01(\x03R\x0elastSeenAtUnix\x12&\n" + + "\x0frevoked_at_unix\x18\n" + + " \x01(\x03R\rrevokedAtUnix\x12-\n" + + "\x12configuration_json\x18\v \x01(\tR\x11configurationJson\x12#\n" + + "\rruntime_state\x18\f \x01(\tR\fruntimeState\"2\n" + + "\x1cGetEnhancedMonitoringRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\"f\n" + + "\x1dGetEnhancedMonitoringResponse\x12E\n" + + "\n" + + "monitoring\x18\x01 \x01(\v2%.aes.monitoring.v1.EnhancedMonitoringR\n" + + "monitoring\"\x90\x01\n" + + "\x1fEnableEnhancedMonitoringRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n" + + "\n" + + "request_id\x18\x02 \x01(\tR\trequestId\x12:\n" + + "\x19confirm_device_attachment\x18\x03 \x01(\bR\x17confirmDeviceAttachment\"i\n" + + " EnableEnhancedMonitoringResponse\x12E\n" + + "\n" + + "monitoring\x18\x01 \x01(\v2%.aes.monitoring.v1.EnhancedMonitoringR\n" + + "monitoring\"^\n" + + "\x1fRevokeEnhancedMonitoringRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12'\n" + + "\x0finstallation_id\x18\x02 \x01(\tR\x0einstallationId\"\"\n" + + " RevokeEnhancedMonitoringResponse2\xf4\x05\n" + + "\x11MonitoringService\x12z\n" + + "\x15ListMetricDescriptors\x12/.aes.monitoring.v1.ListMetricDescriptorsRequest\x1a0.aes.monitoring.v1.ListMetricDescriptorsResponse\x12k\n" + + "\x10ListVMMonitoring\x12*.aes.monitoring.v1.ListVMMonitoringRequest\x1a+.aes.monitoring.v1.ListVMMonitoringResponse\x12n\n" + + "\x11QueryVMMonitoring\x12+.aes.monitoring.v1.QueryVMMonitoringRequest\x1a,.aes.monitoring.v1.QueryVMMonitoringResponse\x12z\n" + + "\x15GetEnhancedMonitoring\x12/.aes.monitoring.v1.GetEnhancedMonitoringRequest\x1a0.aes.monitoring.v1.GetEnhancedMonitoringResponse\x12\x83\x01\n" + + "\x18EnableEnhancedMonitoring\x122.aes.monitoring.v1.EnableEnhancedMonitoringRequest\x1a3.aes.monitoring.v1.EnableEnhancedMonitoringResponse\x12\x83\x01\n" + + "\x18RevokeEnhancedMonitoring\x122.aes.monitoring.v1.RevokeEnhancedMonitoringRequest\x1a3.aes.monitoring.v1.RevokeEnhancedMonitoringResponseB\xdb\x01\n" + + "\x15com.aes.monitoring.v1B\x0fMonitoringProtoP\x01ZKgithub.com/AES-Services/metalhost-sdk/gen/go/aes/monitoring/v1;monitoringv1\xa2\x02\x03AMX\xaa\x02\x11Aes.Monitoring.V1\xca\x02\x11Aes\\Monitoring\\V1\xe2\x02\x1dAes\\Monitoring\\V1\\GPBMetadata\xea\x02\x13Aes::Monitoring::V1b\x06proto3" + +var ( + file_aes_monitoring_v1_monitoring_proto_rawDescOnce sync.Once + file_aes_monitoring_v1_monitoring_proto_rawDescData []byte +) + +func file_aes_monitoring_v1_monitoring_proto_rawDescGZIP() []byte { + file_aes_monitoring_v1_monitoring_proto_rawDescOnce.Do(func() { + file_aes_monitoring_v1_monitoring_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_aes_monitoring_v1_monitoring_proto_rawDesc), len(file_aes_monitoring_v1_monitoring_proto_rawDesc))) + }) + return file_aes_monitoring_v1_monitoring_proto_rawDescData +} + +var file_aes_monitoring_v1_monitoring_proto_msgTypes = make([]protoimpl.MessageInfo, 19) +var file_aes_monitoring_v1_monitoring_proto_goTypes = []any{ + (*MetricDescriptor)(nil), // 0: aes.monitoring.v1.MetricDescriptor + (*ListMetricDescriptorsRequest)(nil), // 1: aes.monitoring.v1.ListMetricDescriptorsRequest + (*ListMetricDescriptorsResponse)(nil), // 2: aes.monitoring.v1.ListMetricDescriptorsResponse + (*ListVMMonitoringRequest)(nil), // 3: aes.monitoring.v1.ListVMMonitoringRequest + (*MonitoredVM)(nil), // 4: aes.monitoring.v1.MonitoredVM + (*ListVMMonitoringResponse)(nil), // 5: aes.monitoring.v1.ListVMMonitoringResponse + (*QueryVMMonitoringRequest)(nil), // 6: aes.monitoring.v1.QueryVMMonitoringRequest + (*Sample)(nil), // 7: aes.monitoring.v1.Sample + (*Series)(nil), // 8: aes.monitoring.v1.Series + (*MetricQuality)(nil), // 9: aes.monitoring.v1.MetricQuality + (*QueryVMMonitoringResponse)(nil), // 10: aes.monitoring.v1.QueryVMMonitoringResponse + (*EnhancedMonitoring)(nil), // 11: aes.monitoring.v1.EnhancedMonitoring + (*GetEnhancedMonitoringRequest)(nil), // 12: aes.monitoring.v1.GetEnhancedMonitoringRequest + (*GetEnhancedMonitoringResponse)(nil), // 13: aes.monitoring.v1.GetEnhancedMonitoringResponse + (*EnableEnhancedMonitoringRequest)(nil), // 14: aes.monitoring.v1.EnableEnhancedMonitoringRequest + (*EnableEnhancedMonitoringResponse)(nil), // 15: aes.monitoring.v1.EnableEnhancedMonitoringResponse + (*RevokeEnhancedMonitoringRequest)(nil), // 16: aes.monitoring.v1.RevokeEnhancedMonitoringRequest + (*RevokeEnhancedMonitoringResponse)(nil), // 17: aes.monitoring.v1.RevokeEnhancedMonitoringResponse + nil, // 18: aes.monitoring.v1.Series.DimensionsEntry +} +var file_aes_monitoring_v1_monitoring_proto_depIdxs = []int32{ + 0, // 0: aes.monitoring.v1.ListMetricDescriptorsResponse.metrics:type_name -> aes.monitoring.v1.MetricDescriptor + 4, // 1: aes.monitoring.v1.ListVMMonitoringResponse.vms:type_name -> aes.monitoring.v1.MonitoredVM + 18, // 2: aes.monitoring.v1.Series.dimensions:type_name -> aes.monitoring.v1.Series.DimensionsEntry + 7, // 3: aes.monitoring.v1.Series.samples:type_name -> aes.monitoring.v1.Sample + 8, // 4: aes.monitoring.v1.QueryVMMonitoringResponse.series:type_name -> aes.monitoring.v1.Series + 9, // 5: aes.monitoring.v1.QueryVMMonitoringResponse.quality:type_name -> aes.monitoring.v1.MetricQuality + 11, // 6: aes.monitoring.v1.GetEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring + 11, // 7: aes.monitoring.v1.EnableEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring + 1, // 8: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:input_type -> aes.monitoring.v1.ListMetricDescriptorsRequest + 3, // 9: aes.monitoring.v1.MonitoringService.ListVMMonitoring:input_type -> aes.monitoring.v1.ListVMMonitoringRequest + 6, // 10: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:input_type -> aes.monitoring.v1.QueryVMMonitoringRequest + 12, // 11: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:input_type -> aes.monitoring.v1.GetEnhancedMonitoringRequest + 14, // 12: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:input_type -> aes.monitoring.v1.EnableEnhancedMonitoringRequest + 16, // 13: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:input_type -> aes.monitoring.v1.RevokeEnhancedMonitoringRequest + 2, // 14: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:output_type -> aes.monitoring.v1.ListMetricDescriptorsResponse + 5, // 15: aes.monitoring.v1.MonitoringService.ListVMMonitoring:output_type -> aes.monitoring.v1.ListVMMonitoringResponse + 10, // 16: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:output_type -> aes.monitoring.v1.QueryVMMonitoringResponse + 13, // 17: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:output_type -> aes.monitoring.v1.GetEnhancedMonitoringResponse + 15, // 18: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:output_type -> aes.monitoring.v1.EnableEnhancedMonitoringResponse + 17, // 19: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:output_type -> aes.monitoring.v1.RevokeEnhancedMonitoringResponse + 14, // [14:20] is the sub-list for method output_type + 8, // [8:14] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name +} + +func init() { file_aes_monitoring_v1_monitoring_proto_init() } +func file_aes_monitoring_v1_monitoring_proto_init() { + if File_aes_monitoring_v1_monitoring_proto != nil { + return + } + file_aes_monitoring_v1_monitoring_proto_msgTypes[4].OneofWrappers = []any{} + type x struct{} + out := protoimpl.TypeBuilder{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: unsafe.Slice(unsafe.StringData(file_aes_monitoring_v1_monitoring_proto_rawDesc), len(file_aes_monitoring_v1_monitoring_proto_rawDesc)), + NumEnums: 0, + NumMessages: 19, + NumExtensions: 0, + NumServices: 1, + }, + GoTypes: file_aes_monitoring_v1_monitoring_proto_goTypes, + DependencyIndexes: file_aes_monitoring_v1_monitoring_proto_depIdxs, + MessageInfos: file_aes_monitoring_v1_monitoring_proto_msgTypes, + }.Build() + File_aes_monitoring_v1_monitoring_proto = out.File + file_aes_monitoring_v1_monitoring_proto_goTypes = nil + file_aes_monitoring_v1_monitoring_proto_depIdxs = nil +} diff --git a/gen/go/aes/monitoring/v1/monitoringv1connect/alerts.connect.go b/gen/go/aes/monitoring/v1/monitoringv1connect/alerts.connect.go new file mode 100644 index 0000000..11f0d1d --- /dev/null +++ b/gen/go/aes/monitoring/v1/monitoringv1connect/alerts.connect.go @@ -0,0 +1,575 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: aes/monitoring/v1/alerts.proto + +package monitoringv1connect + +import ( + connect "connectrpc.com/connect" + context "context" + errors "errors" + v1 "github.com/AES-Services/metalhost-sdk/gen/go/aes/monitoring/v1" + http "net/http" + strings "strings" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // AlertServiceName is the fully-qualified name of the AlertService service. + AlertServiceName = "aes.monitoring.v1.AlertService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // AlertServiceListAlertRulesProcedure is the fully-qualified name of the AlertService's + // ListAlertRules RPC. + AlertServiceListAlertRulesProcedure = "/aes.monitoring.v1.AlertService/ListAlertRules" + // AlertServiceSaveAlertRuleProcedure is the fully-qualified name of the AlertService's + // SaveAlertRule RPC. + AlertServiceSaveAlertRuleProcedure = "/aes.monitoring.v1.AlertService/SaveAlertRule" + // AlertServiceDeleteAlertRuleProcedure is the fully-qualified name of the AlertService's + // DeleteAlertRule RPC. + AlertServiceDeleteAlertRuleProcedure = "/aes.monitoring.v1.AlertService/DeleteAlertRule" + // AlertServicePreviewAlertRuleProcedure is the fully-qualified name of the AlertService's + // PreviewAlertRule RPC. + AlertServicePreviewAlertRuleProcedure = "/aes.monitoring.v1.AlertService/PreviewAlertRule" + // AlertServiceListAlertDestinationsProcedure is the fully-qualified name of the AlertService's + // ListAlertDestinations RPC. + AlertServiceListAlertDestinationsProcedure = "/aes.monitoring.v1.AlertService/ListAlertDestinations" + // AlertServiceSaveAlertDestinationProcedure is the fully-qualified name of the AlertService's + // SaveAlertDestination RPC. + AlertServiceSaveAlertDestinationProcedure = "/aes.monitoring.v1.AlertService/SaveAlertDestination" + // AlertServiceDeleteAlertDestinationProcedure is the fully-qualified name of the AlertService's + // DeleteAlertDestination RPC. + AlertServiceDeleteAlertDestinationProcedure = "/aes.monitoring.v1.AlertService/DeleteAlertDestination" + // AlertServiceRequestDestinationVerificationProcedure is the fully-qualified name of the + // AlertService's RequestDestinationVerification RPC. + AlertServiceRequestDestinationVerificationProcedure = "/aes.monitoring.v1.AlertService/RequestDestinationVerification" + // AlertServiceVerifyAlertDestinationProcedure is the fully-qualified name of the AlertService's + // VerifyAlertDestination RPC. + AlertServiceVerifyAlertDestinationProcedure = "/aes.monitoring.v1.AlertService/VerifyAlertDestination" + // AlertServiceListIncidentsProcedure is the fully-qualified name of the AlertService's + // ListIncidents RPC. + AlertServiceListIncidentsProcedure = "/aes.monitoring.v1.AlertService/ListIncidents" + // AlertServiceGetIncidentSummaryProcedure is the fully-qualified name of the AlertService's + // GetIncidentSummary RPC. + AlertServiceGetIncidentSummaryProcedure = "/aes.monitoring.v1.AlertService/GetIncidentSummary" + // AlertServiceGetIncidentProcedure is the fully-qualified name of the AlertService's GetIncident + // RPC. + AlertServiceGetIncidentProcedure = "/aes.monitoring.v1.AlertService/GetIncident" + // AlertServiceUpdateIncidentProcedure is the fully-qualified name of the AlertService's + // UpdateIncident RPC. + AlertServiceUpdateIncidentProcedure = "/aes.monitoring.v1.AlertService/UpdateIncident" + // AlertServiceListAlertInstancesProcedure is the fully-qualified name of the AlertService's + // ListAlertInstances RPC. + AlertServiceListAlertInstancesProcedure = "/aes.monitoring.v1.AlertService/ListAlertInstances" + // AlertServiceListAlertDestinationCandidatesProcedure is the fully-qualified name of the + // AlertService's ListAlertDestinationCandidates RPC. + AlertServiceListAlertDestinationCandidatesProcedure = "/aes.monitoring.v1.AlertService/ListAlertDestinationCandidates" + // AlertServiceTestAlertDestinationProcedure is the fully-qualified name of the AlertService's + // TestAlertDestination RPC. + AlertServiceTestAlertDestinationProcedure = "/aes.monitoring.v1.AlertService/TestAlertDestination" + // AlertServiceGetDestinationTestProcedure is the fully-qualified name of the AlertService's + // GetDestinationTest RPC. + AlertServiceGetDestinationTestProcedure = "/aes.monitoring.v1.AlertService/GetDestinationTest" +) + +// AlertServiceClient is a client for the aes.monitoring.v1.AlertService service. +type AlertServiceClient interface { + ListAlertRules(context.Context, *connect.Request[v1.ListAlertRulesRequest]) (*connect.Response[v1.ListAlertRulesResponse], error) + SaveAlertRule(context.Context, *connect.Request[v1.SaveAlertRuleRequest]) (*connect.Response[v1.SaveAlertRuleResponse], error) + DeleteAlertRule(context.Context, *connect.Request[v1.DeleteAlertRuleRequest]) (*connect.Response[v1.DeleteAlertRuleResponse], error) + PreviewAlertRule(context.Context, *connect.Request[v1.PreviewAlertRuleRequest]) (*connect.Response[v1.PreviewAlertRuleResponse], error) + ListAlertDestinations(context.Context, *connect.Request[v1.ListAlertDestinationsRequest]) (*connect.Response[v1.ListAlertDestinationsResponse], error) + SaveAlertDestination(context.Context, *connect.Request[v1.SaveAlertDestinationRequest]) (*connect.Response[v1.SaveAlertDestinationResponse], error) + DeleteAlertDestination(context.Context, *connect.Request[v1.DeleteAlertDestinationRequest]) (*connect.Response[v1.DeleteAlertDestinationResponse], error) + RequestDestinationVerification(context.Context, *connect.Request[v1.RequestDestinationVerificationRequest]) (*connect.Response[v1.RequestDestinationVerificationResponse], error) + VerifyAlertDestination(context.Context, *connect.Request[v1.VerifyAlertDestinationRequest]) (*connect.Response[v1.VerifyAlertDestinationResponse], error) + ListIncidents(context.Context, *connect.Request[v1.ListIncidentsRequest]) (*connect.Response[v1.ListIncidentsResponse], error) + GetIncidentSummary(context.Context, *connect.Request[v1.GetIncidentSummaryRequest]) (*connect.Response[v1.GetIncidentSummaryResponse], error) + GetIncident(context.Context, *connect.Request[v1.GetIncidentRequest]) (*connect.Response[v1.GetIncidentResponse], error) + UpdateIncident(context.Context, *connect.Request[v1.UpdateIncidentRequest]) (*connect.Response[v1.UpdateIncidentResponse], error) + ListAlertInstances(context.Context, *connect.Request[v1.ListAlertInstancesRequest]) (*connect.Response[v1.ListAlertInstancesResponse], error) + ListAlertDestinationCandidates(context.Context, *connect.Request[v1.ListAlertDestinationCandidatesRequest]) (*connect.Response[v1.ListAlertDestinationCandidatesResponse], error) + TestAlertDestination(context.Context, *connect.Request[v1.TestAlertDestinationRequest]) (*connect.Response[v1.TestAlertDestinationResponse], error) + GetDestinationTest(context.Context, *connect.Request[v1.GetDestinationTestRequest]) (*connect.Response[v1.GetDestinationTestResponse], error) +} + +// NewAlertServiceClient constructs a client for the aes.monitoring.v1.AlertService service. By +// default, it uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, +// and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the +// connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewAlertServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) AlertServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + alertServiceMethods := v1.File_aes_monitoring_v1_alerts_proto.Services().ByName("AlertService").Methods() + return &alertServiceClient{ + listAlertRules: connect.NewClient[v1.ListAlertRulesRequest, v1.ListAlertRulesResponse]( + httpClient, + baseURL+AlertServiceListAlertRulesProcedure, + connect.WithSchema(alertServiceMethods.ByName("ListAlertRules")), + connect.WithClientOptions(opts...), + ), + saveAlertRule: connect.NewClient[v1.SaveAlertRuleRequest, v1.SaveAlertRuleResponse]( + httpClient, + baseURL+AlertServiceSaveAlertRuleProcedure, + connect.WithSchema(alertServiceMethods.ByName("SaveAlertRule")), + connect.WithClientOptions(opts...), + ), + deleteAlertRule: connect.NewClient[v1.DeleteAlertRuleRequest, v1.DeleteAlertRuleResponse]( + httpClient, + baseURL+AlertServiceDeleteAlertRuleProcedure, + connect.WithSchema(alertServiceMethods.ByName("DeleteAlertRule")), + connect.WithClientOptions(opts...), + ), + previewAlertRule: connect.NewClient[v1.PreviewAlertRuleRequest, v1.PreviewAlertRuleResponse]( + httpClient, + baseURL+AlertServicePreviewAlertRuleProcedure, + connect.WithSchema(alertServiceMethods.ByName("PreviewAlertRule")), + connect.WithClientOptions(opts...), + ), + listAlertDestinations: connect.NewClient[v1.ListAlertDestinationsRequest, v1.ListAlertDestinationsResponse]( + httpClient, + baseURL+AlertServiceListAlertDestinationsProcedure, + connect.WithSchema(alertServiceMethods.ByName("ListAlertDestinations")), + connect.WithClientOptions(opts...), + ), + saveAlertDestination: connect.NewClient[v1.SaveAlertDestinationRequest, v1.SaveAlertDestinationResponse]( + httpClient, + baseURL+AlertServiceSaveAlertDestinationProcedure, + connect.WithSchema(alertServiceMethods.ByName("SaveAlertDestination")), + connect.WithClientOptions(opts...), + ), + deleteAlertDestination: connect.NewClient[v1.DeleteAlertDestinationRequest, v1.DeleteAlertDestinationResponse]( + httpClient, + baseURL+AlertServiceDeleteAlertDestinationProcedure, + connect.WithSchema(alertServiceMethods.ByName("DeleteAlertDestination")), + connect.WithClientOptions(opts...), + ), + requestDestinationVerification: connect.NewClient[v1.RequestDestinationVerificationRequest, v1.RequestDestinationVerificationResponse]( + httpClient, + baseURL+AlertServiceRequestDestinationVerificationProcedure, + connect.WithSchema(alertServiceMethods.ByName("RequestDestinationVerification")), + connect.WithClientOptions(opts...), + ), + verifyAlertDestination: connect.NewClient[v1.VerifyAlertDestinationRequest, v1.VerifyAlertDestinationResponse]( + httpClient, + baseURL+AlertServiceVerifyAlertDestinationProcedure, + connect.WithSchema(alertServiceMethods.ByName("VerifyAlertDestination")), + connect.WithClientOptions(opts...), + ), + listIncidents: connect.NewClient[v1.ListIncidentsRequest, v1.ListIncidentsResponse]( + httpClient, + baseURL+AlertServiceListIncidentsProcedure, + connect.WithSchema(alertServiceMethods.ByName("ListIncidents")), + connect.WithClientOptions(opts...), + ), + getIncidentSummary: connect.NewClient[v1.GetIncidentSummaryRequest, v1.GetIncidentSummaryResponse]( + httpClient, + baseURL+AlertServiceGetIncidentSummaryProcedure, + connect.WithSchema(alertServiceMethods.ByName("GetIncidentSummary")), + connect.WithClientOptions(opts...), + ), + getIncident: connect.NewClient[v1.GetIncidentRequest, v1.GetIncidentResponse]( + httpClient, + baseURL+AlertServiceGetIncidentProcedure, + connect.WithSchema(alertServiceMethods.ByName("GetIncident")), + connect.WithClientOptions(opts...), + ), + updateIncident: connect.NewClient[v1.UpdateIncidentRequest, v1.UpdateIncidentResponse]( + httpClient, + baseURL+AlertServiceUpdateIncidentProcedure, + connect.WithSchema(alertServiceMethods.ByName("UpdateIncident")), + connect.WithClientOptions(opts...), + ), + listAlertInstances: connect.NewClient[v1.ListAlertInstancesRequest, v1.ListAlertInstancesResponse]( + httpClient, + baseURL+AlertServiceListAlertInstancesProcedure, + connect.WithSchema(alertServiceMethods.ByName("ListAlertInstances")), + connect.WithClientOptions(opts...), + ), + listAlertDestinationCandidates: connect.NewClient[v1.ListAlertDestinationCandidatesRequest, v1.ListAlertDestinationCandidatesResponse]( + httpClient, + baseURL+AlertServiceListAlertDestinationCandidatesProcedure, + connect.WithSchema(alertServiceMethods.ByName("ListAlertDestinationCandidates")), + connect.WithClientOptions(opts...), + ), + testAlertDestination: connect.NewClient[v1.TestAlertDestinationRequest, v1.TestAlertDestinationResponse]( + httpClient, + baseURL+AlertServiceTestAlertDestinationProcedure, + connect.WithSchema(alertServiceMethods.ByName("TestAlertDestination")), + connect.WithClientOptions(opts...), + ), + getDestinationTest: connect.NewClient[v1.GetDestinationTestRequest, v1.GetDestinationTestResponse]( + httpClient, + baseURL+AlertServiceGetDestinationTestProcedure, + connect.WithSchema(alertServiceMethods.ByName("GetDestinationTest")), + connect.WithClientOptions(opts...), + ), + } +} + +// alertServiceClient implements AlertServiceClient. +type alertServiceClient struct { + listAlertRules *connect.Client[v1.ListAlertRulesRequest, v1.ListAlertRulesResponse] + saveAlertRule *connect.Client[v1.SaveAlertRuleRequest, v1.SaveAlertRuleResponse] + deleteAlertRule *connect.Client[v1.DeleteAlertRuleRequest, v1.DeleteAlertRuleResponse] + previewAlertRule *connect.Client[v1.PreviewAlertRuleRequest, v1.PreviewAlertRuleResponse] + listAlertDestinations *connect.Client[v1.ListAlertDestinationsRequest, v1.ListAlertDestinationsResponse] + saveAlertDestination *connect.Client[v1.SaveAlertDestinationRequest, v1.SaveAlertDestinationResponse] + deleteAlertDestination *connect.Client[v1.DeleteAlertDestinationRequest, v1.DeleteAlertDestinationResponse] + requestDestinationVerification *connect.Client[v1.RequestDestinationVerificationRequest, v1.RequestDestinationVerificationResponse] + verifyAlertDestination *connect.Client[v1.VerifyAlertDestinationRequest, v1.VerifyAlertDestinationResponse] + listIncidents *connect.Client[v1.ListIncidentsRequest, v1.ListIncidentsResponse] + getIncidentSummary *connect.Client[v1.GetIncidentSummaryRequest, v1.GetIncidentSummaryResponse] + getIncident *connect.Client[v1.GetIncidentRequest, v1.GetIncidentResponse] + updateIncident *connect.Client[v1.UpdateIncidentRequest, v1.UpdateIncidentResponse] + listAlertInstances *connect.Client[v1.ListAlertInstancesRequest, v1.ListAlertInstancesResponse] + listAlertDestinationCandidates *connect.Client[v1.ListAlertDestinationCandidatesRequest, v1.ListAlertDestinationCandidatesResponse] + testAlertDestination *connect.Client[v1.TestAlertDestinationRequest, v1.TestAlertDestinationResponse] + getDestinationTest *connect.Client[v1.GetDestinationTestRequest, v1.GetDestinationTestResponse] +} + +// ListAlertRules calls aes.monitoring.v1.AlertService.ListAlertRules. +func (c *alertServiceClient) ListAlertRules(ctx context.Context, req *connect.Request[v1.ListAlertRulesRequest]) (*connect.Response[v1.ListAlertRulesResponse], error) { + return c.listAlertRules.CallUnary(ctx, req) +} + +// SaveAlertRule calls aes.monitoring.v1.AlertService.SaveAlertRule. +func (c *alertServiceClient) SaveAlertRule(ctx context.Context, req *connect.Request[v1.SaveAlertRuleRequest]) (*connect.Response[v1.SaveAlertRuleResponse], error) { + return c.saveAlertRule.CallUnary(ctx, req) +} + +// DeleteAlertRule calls aes.monitoring.v1.AlertService.DeleteAlertRule. +func (c *alertServiceClient) DeleteAlertRule(ctx context.Context, req *connect.Request[v1.DeleteAlertRuleRequest]) (*connect.Response[v1.DeleteAlertRuleResponse], error) { + return c.deleteAlertRule.CallUnary(ctx, req) +} + +// PreviewAlertRule calls aes.monitoring.v1.AlertService.PreviewAlertRule. +func (c *alertServiceClient) PreviewAlertRule(ctx context.Context, req *connect.Request[v1.PreviewAlertRuleRequest]) (*connect.Response[v1.PreviewAlertRuleResponse], error) { + return c.previewAlertRule.CallUnary(ctx, req) +} + +// ListAlertDestinations calls aes.monitoring.v1.AlertService.ListAlertDestinations. +func (c *alertServiceClient) ListAlertDestinations(ctx context.Context, req *connect.Request[v1.ListAlertDestinationsRequest]) (*connect.Response[v1.ListAlertDestinationsResponse], error) { + return c.listAlertDestinations.CallUnary(ctx, req) +} + +// SaveAlertDestination calls aes.monitoring.v1.AlertService.SaveAlertDestination. +func (c *alertServiceClient) SaveAlertDestination(ctx context.Context, req *connect.Request[v1.SaveAlertDestinationRequest]) (*connect.Response[v1.SaveAlertDestinationResponse], error) { + return c.saveAlertDestination.CallUnary(ctx, req) +} + +// DeleteAlertDestination calls aes.monitoring.v1.AlertService.DeleteAlertDestination. +func (c *alertServiceClient) DeleteAlertDestination(ctx context.Context, req *connect.Request[v1.DeleteAlertDestinationRequest]) (*connect.Response[v1.DeleteAlertDestinationResponse], error) { + return c.deleteAlertDestination.CallUnary(ctx, req) +} + +// RequestDestinationVerification calls +// aes.monitoring.v1.AlertService.RequestDestinationVerification. +func (c *alertServiceClient) RequestDestinationVerification(ctx context.Context, req *connect.Request[v1.RequestDestinationVerificationRequest]) (*connect.Response[v1.RequestDestinationVerificationResponse], error) { + return c.requestDestinationVerification.CallUnary(ctx, req) +} + +// VerifyAlertDestination calls aes.monitoring.v1.AlertService.VerifyAlertDestination. +func (c *alertServiceClient) VerifyAlertDestination(ctx context.Context, req *connect.Request[v1.VerifyAlertDestinationRequest]) (*connect.Response[v1.VerifyAlertDestinationResponse], error) { + return c.verifyAlertDestination.CallUnary(ctx, req) +} + +// ListIncidents calls aes.monitoring.v1.AlertService.ListIncidents. +func (c *alertServiceClient) ListIncidents(ctx context.Context, req *connect.Request[v1.ListIncidentsRequest]) (*connect.Response[v1.ListIncidentsResponse], error) { + return c.listIncidents.CallUnary(ctx, req) +} + +// GetIncidentSummary calls aes.monitoring.v1.AlertService.GetIncidentSummary. +func (c *alertServiceClient) GetIncidentSummary(ctx context.Context, req *connect.Request[v1.GetIncidentSummaryRequest]) (*connect.Response[v1.GetIncidentSummaryResponse], error) { + return c.getIncidentSummary.CallUnary(ctx, req) +} + +// GetIncident calls aes.monitoring.v1.AlertService.GetIncident. +func (c *alertServiceClient) GetIncident(ctx context.Context, req *connect.Request[v1.GetIncidentRequest]) (*connect.Response[v1.GetIncidentResponse], error) { + return c.getIncident.CallUnary(ctx, req) +} + +// UpdateIncident calls aes.monitoring.v1.AlertService.UpdateIncident. +func (c *alertServiceClient) UpdateIncident(ctx context.Context, req *connect.Request[v1.UpdateIncidentRequest]) (*connect.Response[v1.UpdateIncidentResponse], error) { + return c.updateIncident.CallUnary(ctx, req) +} + +// ListAlertInstances calls aes.monitoring.v1.AlertService.ListAlertInstances. +func (c *alertServiceClient) ListAlertInstances(ctx context.Context, req *connect.Request[v1.ListAlertInstancesRequest]) (*connect.Response[v1.ListAlertInstancesResponse], error) { + return c.listAlertInstances.CallUnary(ctx, req) +} + +// ListAlertDestinationCandidates calls +// aes.monitoring.v1.AlertService.ListAlertDestinationCandidates. +func (c *alertServiceClient) ListAlertDestinationCandidates(ctx context.Context, req *connect.Request[v1.ListAlertDestinationCandidatesRequest]) (*connect.Response[v1.ListAlertDestinationCandidatesResponse], error) { + return c.listAlertDestinationCandidates.CallUnary(ctx, req) +} + +// TestAlertDestination calls aes.monitoring.v1.AlertService.TestAlertDestination. +func (c *alertServiceClient) TestAlertDestination(ctx context.Context, req *connect.Request[v1.TestAlertDestinationRequest]) (*connect.Response[v1.TestAlertDestinationResponse], error) { + return c.testAlertDestination.CallUnary(ctx, req) +} + +// GetDestinationTest calls aes.monitoring.v1.AlertService.GetDestinationTest. +func (c *alertServiceClient) GetDestinationTest(ctx context.Context, req *connect.Request[v1.GetDestinationTestRequest]) (*connect.Response[v1.GetDestinationTestResponse], error) { + return c.getDestinationTest.CallUnary(ctx, req) +} + +// AlertServiceHandler is an implementation of the aes.monitoring.v1.AlertService service. +type AlertServiceHandler interface { + ListAlertRules(context.Context, *connect.Request[v1.ListAlertRulesRequest]) (*connect.Response[v1.ListAlertRulesResponse], error) + SaveAlertRule(context.Context, *connect.Request[v1.SaveAlertRuleRequest]) (*connect.Response[v1.SaveAlertRuleResponse], error) + DeleteAlertRule(context.Context, *connect.Request[v1.DeleteAlertRuleRequest]) (*connect.Response[v1.DeleteAlertRuleResponse], error) + PreviewAlertRule(context.Context, *connect.Request[v1.PreviewAlertRuleRequest]) (*connect.Response[v1.PreviewAlertRuleResponse], error) + ListAlertDestinations(context.Context, *connect.Request[v1.ListAlertDestinationsRequest]) (*connect.Response[v1.ListAlertDestinationsResponse], error) + SaveAlertDestination(context.Context, *connect.Request[v1.SaveAlertDestinationRequest]) (*connect.Response[v1.SaveAlertDestinationResponse], error) + DeleteAlertDestination(context.Context, *connect.Request[v1.DeleteAlertDestinationRequest]) (*connect.Response[v1.DeleteAlertDestinationResponse], error) + RequestDestinationVerification(context.Context, *connect.Request[v1.RequestDestinationVerificationRequest]) (*connect.Response[v1.RequestDestinationVerificationResponse], error) + VerifyAlertDestination(context.Context, *connect.Request[v1.VerifyAlertDestinationRequest]) (*connect.Response[v1.VerifyAlertDestinationResponse], error) + ListIncidents(context.Context, *connect.Request[v1.ListIncidentsRequest]) (*connect.Response[v1.ListIncidentsResponse], error) + GetIncidentSummary(context.Context, *connect.Request[v1.GetIncidentSummaryRequest]) (*connect.Response[v1.GetIncidentSummaryResponse], error) + GetIncident(context.Context, *connect.Request[v1.GetIncidentRequest]) (*connect.Response[v1.GetIncidentResponse], error) + UpdateIncident(context.Context, *connect.Request[v1.UpdateIncidentRequest]) (*connect.Response[v1.UpdateIncidentResponse], error) + ListAlertInstances(context.Context, *connect.Request[v1.ListAlertInstancesRequest]) (*connect.Response[v1.ListAlertInstancesResponse], error) + ListAlertDestinationCandidates(context.Context, *connect.Request[v1.ListAlertDestinationCandidatesRequest]) (*connect.Response[v1.ListAlertDestinationCandidatesResponse], error) + TestAlertDestination(context.Context, *connect.Request[v1.TestAlertDestinationRequest]) (*connect.Response[v1.TestAlertDestinationResponse], error) + GetDestinationTest(context.Context, *connect.Request[v1.GetDestinationTestRequest]) (*connect.Response[v1.GetDestinationTestResponse], error) +} + +// NewAlertServiceHandler builds an HTTP handler from the service implementation. It returns the +// path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewAlertServiceHandler(svc AlertServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + alertServiceMethods := v1.File_aes_monitoring_v1_alerts_proto.Services().ByName("AlertService").Methods() + alertServiceListAlertRulesHandler := connect.NewUnaryHandler( + AlertServiceListAlertRulesProcedure, + svc.ListAlertRules, + connect.WithSchema(alertServiceMethods.ByName("ListAlertRules")), + connect.WithHandlerOptions(opts...), + ) + alertServiceSaveAlertRuleHandler := connect.NewUnaryHandler( + AlertServiceSaveAlertRuleProcedure, + svc.SaveAlertRule, + connect.WithSchema(alertServiceMethods.ByName("SaveAlertRule")), + connect.WithHandlerOptions(opts...), + ) + alertServiceDeleteAlertRuleHandler := connect.NewUnaryHandler( + AlertServiceDeleteAlertRuleProcedure, + svc.DeleteAlertRule, + connect.WithSchema(alertServiceMethods.ByName("DeleteAlertRule")), + connect.WithHandlerOptions(opts...), + ) + alertServicePreviewAlertRuleHandler := connect.NewUnaryHandler( + AlertServicePreviewAlertRuleProcedure, + svc.PreviewAlertRule, + connect.WithSchema(alertServiceMethods.ByName("PreviewAlertRule")), + connect.WithHandlerOptions(opts...), + ) + alertServiceListAlertDestinationsHandler := connect.NewUnaryHandler( + AlertServiceListAlertDestinationsProcedure, + svc.ListAlertDestinations, + connect.WithSchema(alertServiceMethods.ByName("ListAlertDestinations")), + connect.WithHandlerOptions(opts...), + ) + alertServiceSaveAlertDestinationHandler := connect.NewUnaryHandler( + AlertServiceSaveAlertDestinationProcedure, + svc.SaveAlertDestination, + connect.WithSchema(alertServiceMethods.ByName("SaveAlertDestination")), + connect.WithHandlerOptions(opts...), + ) + alertServiceDeleteAlertDestinationHandler := connect.NewUnaryHandler( + AlertServiceDeleteAlertDestinationProcedure, + svc.DeleteAlertDestination, + connect.WithSchema(alertServiceMethods.ByName("DeleteAlertDestination")), + connect.WithHandlerOptions(opts...), + ) + alertServiceRequestDestinationVerificationHandler := connect.NewUnaryHandler( + AlertServiceRequestDestinationVerificationProcedure, + svc.RequestDestinationVerification, + connect.WithSchema(alertServiceMethods.ByName("RequestDestinationVerification")), + connect.WithHandlerOptions(opts...), + ) + alertServiceVerifyAlertDestinationHandler := connect.NewUnaryHandler( + AlertServiceVerifyAlertDestinationProcedure, + svc.VerifyAlertDestination, + connect.WithSchema(alertServiceMethods.ByName("VerifyAlertDestination")), + connect.WithHandlerOptions(opts...), + ) + alertServiceListIncidentsHandler := connect.NewUnaryHandler( + AlertServiceListIncidentsProcedure, + svc.ListIncidents, + connect.WithSchema(alertServiceMethods.ByName("ListIncidents")), + connect.WithHandlerOptions(opts...), + ) + alertServiceGetIncidentSummaryHandler := connect.NewUnaryHandler( + AlertServiceGetIncidentSummaryProcedure, + svc.GetIncidentSummary, + connect.WithSchema(alertServiceMethods.ByName("GetIncidentSummary")), + connect.WithHandlerOptions(opts...), + ) + alertServiceGetIncidentHandler := connect.NewUnaryHandler( + AlertServiceGetIncidentProcedure, + svc.GetIncident, + connect.WithSchema(alertServiceMethods.ByName("GetIncident")), + connect.WithHandlerOptions(opts...), + ) + alertServiceUpdateIncidentHandler := connect.NewUnaryHandler( + AlertServiceUpdateIncidentProcedure, + svc.UpdateIncident, + connect.WithSchema(alertServiceMethods.ByName("UpdateIncident")), + connect.WithHandlerOptions(opts...), + ) + alertServiceListAlertInstancesHandler := connect.NewUnaryHandler( + AlertServiceListAlertInstancesProcedure, + svc.ListAlertInstances, + connect.WithSchema(alertServiceMethods.ByName("ListAlertInstances")), + connect.WithHandlerOptions(opts...), + ) + alertServiceListAlertDestinationCandidatesHandler := connect.NewUnaryHandler( + AlertServiceListAlertDestinationCandidatesProcedure, + svc.ListAlertDestinationCandidates, + connect.WithSchema(alertServiceMethods.ByName("ListAlertDestinationCandidates")), + connect.WithHandlerOptions(opts...), + ) + alertServiceTestAlertDestinationHandler := connect.NewUnaryHandler( + AlertServiceTestAlertDestinationProcedure, + svc.TestAlertDestination, + connect.WithSchema(alertServiceMethods.ByName("TestAlertDestination")), + connect.WithHandlerOptions(opts...), + ) + alertServiceGetDestinationTestHandler := connect.NewUnaryHandler( + AlertServiceGetDestinationTestProcedure, + svc.GetDestinationTest, + connect.WithSchema(alertServiceMethods.ByName("GetDestinationTest")), + connect.WithHandlerOptions(opts...), + ) + return "/aes.monitoring.v1.AlertService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case AlertServiceListAlertRulesProcedure: + alertServiceListAlertRulesHandler.ServeHTTP(w, r) + case AlertServiceSaveAlertRuleProcedure: + alertServiceSaveAlertRuleHandler.ServeHTTP(w, r) + case AlertServiceDeleteAlertRuleProcedure: + alertServiceDeleteAlertRuleHandler.ServeHTTP(w, r) + case AlertServicePreviewAlertRuleProcedure: + alertServicePreviewAlertRuleHandler.ServeHTTP(w, r) + case AlertServiceListAlertDestinationsProcedure: + alertServiceListAlertDestinationsHandler.ServeHTTP(w, r) + case AlertServiceSaveAlertDestinationProcedure: + alertServiceSaveAlertDestinationHandler.ServeHTTP(w, r) + case AlertServiceDeleteAlertDestinationProcedure: + alertServiceDeleteAlertDestinationHandler.ServeHTTP(w, r) + case AlertServiceRequestDestinationVerificationProcedure: + alertServiceRequestDestinationVerificationHandler.ServeHTTP(w, r) + case AlertServiceVerifyAlertDestinationProcedure: + alertServiceVerifyAlertDestinationHandler.ServeHTTP(w, r) + case AlertServiceListIncidentsProcedure: + alertServiceListIncidentsHandler.ServeHTTP(w, r) + case AlertServiceGetIncidentSummaryProcedure: + alertServiceGetIncidentSummaryHandler.ServeHTTP(w, r) + case AlertServiceGetIncidentProcedure: + alertServiceGetIncidentHandler.ServeHTTP(w, r) + case AlertServiceUpdateIncidentProcedure: + alertServiceUpdateIncidentHandler.ServeHTTP(w, r) + case AlertServiceListAlertInstancesProcedure: + alertServiceListAlertInstancesHandler.ServeHTTP(w, r) + case AlertServiceListAlertDestinationCandidatesProcedure: + alertServiceListAlertDestinationCandidatesHandler.ServeHTTP(w, r) + case AlertServiceTestAlertDestinationProcedure: + alertServiceTestAlertDestinationHandler.ServeHTTP(w, r) + case AlertServiceGetDestinationTestProcedure: + alertServiceGetDestinationTestHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedAlertServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedAlertServiceHandler struct{} + +func (UnimplementedAlertServiceHandler) ListAlertRules(context.Context, *connect.Request[v1.ListAlertRulesRequest]) (*connect.Response[v1.ListAlertRulesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.ListAlertRules is not implemented")) +} + +func (UnimplementedAlertServiceHandler) SaveAlertRule(context.Context, *connect.Request[v1.SaveAlertRuleRequest]) (*connect.Response[v1.SaveAlertRuleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.SaveAlertRule is not implemented")) +} + +func (UnimplementedAlertServiceHandler) DeleteAlertRule(context.Context, *connect.Request[v1.DeleteAlertRuleRequest]) (*connect.Response[v1.DeleteAlertRuleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.DeleteAlertRule is not implemented")) +} + +func (UnimplementedAlertServiceHandler) PreviewAlertRule(context.Context, *connect.Request[v1.PreviewAlertRuleRequest]) (*connect.Response[v1.PreviewAlertRuleResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.PreviewAlertRule is not implemented")) +} + +func (UnimplementedAlertServiceHandler) ListAlertDestinations(context.Context, *connect.Request[v1.ListAlertDestinationsRequest]) (*connect.Response[v1.ListAlertDestinationsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.ListAlertDestinations is not implemented")) +} + +func (UnimplementedAlertServiceHandler) SaveAlertDestination(context.Context, *connect.Request[v1.SaveAlertDestinationRequest]) (*connect.Response[v1.SaveAlertDestinationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.SaveAlertDestination is not implemented")) +} + +func (UnimplementedAlertServiceHandler) DeleteAlertDestination(context.Context, *connect.Request[v1.DeleteAlertDestinationRequest]) (*connect.Response[v1.DeleteAlertDestinationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.DeleteAlertDestination is not implemented")) +} + +func (UnimplementedAlertServiceHandler) RequestDestinationVerification(context.Context, *connect.Request[v1.RequestDestinationVerificationRequest]) (*connect.Response[v1.RequestDestinationVerificationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.RequestDestinationVerification is not implemented")) +} + +func (UnimplementedAlertServiceHandler) VerifyAlertDestination(context.Context, *connect.Request[v1.VerifyAlertDestinationRequest]) (*connect.Response[v1.VerifyAlertDestinationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.VerifyAlertDestination is not implemented")) +} + +func (UnimplementedAlertServiceHandler) ListIncidents(context.Context, *connect.Request[v1.ListIncidentsRequest]) (*connect.Response[v1.ListIncidentsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.ListIncidents is not implemented")) +} + +func (UnimplementedAlertServiceHandler) GetIncidentSummary(context.Context, *connect.Request[v1.GetIncidentSummaryRequest]) (*connect.Response[v1.GetIncidentSummaryResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.GetIncidentSummary is not implemented")) +} + +func (UnimplementedAlertServiceHandler) GetIncident(context.Context, *connect.Request[v1.GetIncidentRequest]) (*connect.Response[v1.GetIncidentResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.GetIncident is not implemented")) +} + +func (UnimplementedAlertServiceHandler) UpdateIncident(context.Context, *connect.Request[v1.UpdateIncidentRequest]) (*connect.Response[v1.UpdateIncidentResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.UpdateIncident is not implemented")) +} + +func (UnimplementedAlertServiceHandler) ListAlertInstances(context.Context, *connect.Request[v1.ListAlertInstancesRequest]) (*connect.Response[v1.ListAlertInstancesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.ListAlertInstances is not implemented")) +} + +func (UnimplementedAlertServiceHandler) ListAlertDestinationCandidates(context.Context, *connect.Request[v1.ListAlertDestinationCandidatesRequest]) (*connect.Response[v1.ListAlertDestinationCandidatesResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.ListAlertDestinationCandidates is not implemented")) +} + +func (UnimplementedAlertServiceHandler) TestAlertDestination(context.Context, *connect.Request[v1.TestAlertDestinationRequest]) (*connect.Response[v1.TestAlertDestinationResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.TestAlertDestination is not implemented")) +} + +func (UnimplementedAlertServiceHandler) GetDestinationTest(context.Context, *connect.Request[v1.GetDestinationTestRequest]) (*connect.Response[v1.GetDestinationTestResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.AlertService.GetDestinationTest is not implemented")) +} diff --git a/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go b/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go new file mode 100644 index 0000000..a729edd --- /dev/null +++ b/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go @@ -0,0 +1,254 @@ +// Code generated by protoc-gen-connect-go. DO NOT EDIT. +// +// Source: aes/monitoring/v1/monitoring.proto + +package monitoringv1connect + +import ( + connect "connectrpc.com/connect" + context "context" + errors "errors" + v1 "github.com/AES-Services/metalhost-sdk/gen/go/aes/monitoring/v1" + http "net/http" + strings "strings" +) + +// This is a compile-time assertion to ensure that this generated file and the connect package are +// compatible. If you get a compiler error that this constant is not defined, this code was +// generated with a version of connect newer than the one compiled into your binary. You can fix the +// problem by either regenerating this code with an older version of connect or updating the connect +// version compiled into your binary. +const _ = connect.IsAtLeastVersion1_13_0 + +const ( + // MonitoringServiceName is the fully-qualified name of the MonitoringService service. + MonitoringServiceName = "aes.monitoring.v1.MonitoringService" +) + +// These constants are the fully-qualified names of the RPCs defined in this package. They're +// exposed at runtime as Spec.Procedure and as the final two segments of the HTTP route. +// +// Note that these are different from the fully-qualified method names used by +// google.golang.org/protobuf/reflect/protoreflect. To convert from these constants to +// reflection-formatted method names, remove the leading slash and convert the remaining slash to a +// period. +const ( + // MonitoringServiceListMetricDescriptorsProcedure is the fully-qualified name of the + // MonitoringService's ListMetricDescriptors RPC. + MonitoringServiceListMetricDescriptorsProcedure = "/aes.monitoring.v1.MonitoringService/ListMetricDescriptors" + // MonitoringServiceListVMMonitoringProcedure is the fully-qualified name of the MonitoringService's + // ListVMMonitoring RPC. + MonitoringServiceListVMMonitoringProcedure = "/aes.monitoring.v1.MonitoringService/ListVMMonitoring" + // MonitoringServiceQueryVMMonitoringProcedure is the fully-qualified name of the + // MonitoringService's QueryVMMonitoring RPC. + MonitoringServiceQueryVMMonitoringProcedure = "/aes.monitoring.v1.MonitoringService/QueryVMMonitoring" + // MonitoringServiceGetEnhancedMonitoringProcedure is the fully-qualified name of the + // MonitoringService's GetEnhancedMonitoring RPC. + MonitoringServiceGetEnhancedMonitoringProcedure = "/aes.monitoring.v1.MonitoringService/GetEnhancedMonitoring" + // MonitoringServiceEnableEnhancedMonitoringProcedure is the fully-qualified name of the + // MonitoringService's EnableEnhancedMonitoring RPC. + MonitoringServiceEnableEnhancedMonitoringProcedure = "/aes.monitoring.v1.MonitoringService/EnableEnhancedMonitoring" + // MonitoringServiceRevokeEnhancedMonitoringProcedure is the fully-qualified name of the + // MonitoringService's RevokeEnhancedMonitoring RPC. + MonitoringServiceRevokeEnhancedMonitoringProcedure = "/aes.monitoring.v1.MonitoringService/RevokeEnhancedMonitoring" +) + +// MonitoringServiceClient is a client for the aes.monitoring.v1.MonitoringService service. +type MonitoringServiceClient interface { + ListMetricDescriptors(context.Context, *connect.Request[v1.ListMetricDescriptorsRequest]) (*connect.Response[v1.ListMetricDescriptorsResponse], error) + ListVMMonitoring(context.Context, *connect.Request[v1.ListVMMonitoringRequest]) (*connect.Response[v1.ListVMMonitoringResponse], error) + QueryVMMonitoring(context.Context, *connect.Request[v1.QueryVMMonitoringRequest]) (*connect.Response[v1.QueryVMMonitoringResponse], error) + GetEnhancedMonitoring(context.Context, *connect.Request[v1.GetEnhancedMonitoringRequest]) (*connect.Response[v1.GetEnhancedMonitoringResponse], error) + EnableEnhancedMonitoring(context.Context, *connect.Request[v1.EnableEnhancedMonitoringRequest]) (*connect.Response[v1.EnableEnhancedMonitoringResponse], error) + RevokeEnhancedMonitoring(context.Context, *connect.Request[v1.RevokeEnhancedMonitoringRequest]) (*connect.Response[v1.RevokeEnhancedMonitoringResponse], error) +} + +// NewMonitoringServiceClient constructs a client for the aes.monitoring.v1.MonitoringService +// service. By default, it uses the Connect protocol with the binary Protobuf Codec, asks for +// gzipped responses, and sends uncompressed requests. To use the gRPC or gRPC-Web protocols, supply +// the connect.WithGRPC() or connect.WithGRPCWeb() options. +// +// The URL supplied here should be the base URL for the Connect or gRPC server (for example, +// http://api.acme.com or https://acme.com/grpc). +func NewMonitoringServiceClient(httpClient connect.HTTPClient, baseURL string, opts ...connect.ClientOption) MonitoringServiceClient { + baseURL = strings.TrimRight(baseURL, "/") + monitoringServiceMethods := v1.File_aes_monitoring_v1_monitoring_proto.Services().ByName("MonitoringService").Methods() + return &monitoringServiceClient{ + listMetricDescriptors: connect.NewClient[v1.ListMetricDescriptorsRequest, v1.ListMetricDescriptorsResponse]( + httpClient, + baseURL+MonitoringServiceListMetricDescriptorsProcedure, + connect.WithSchema(monitoringServiceMethods.ByName("ListMetricDescriptors")), + connect.WithClientOptions(opts...), + ), + listVMMonitoring: connect.NewClient[v1.ListVMMonitoringRequest, v1.ListVMMonitoringResponse]( + httpClient, + baseURL+MonitoringServiceListVMMonitoringProcedure, + connect.WithSchema(monitoringServiceMethods.ByName("ListVMMonitoring")), + connect.WithClientOptions(opts...), + ), + queryVMMonitoring: connect.NewClient[v1.QueryVMMonitoringRequest, v1.QueryVMMonitoringResponse]( + httpClient, + baseURL+MonitoringServiceQueryVMMonitoringProcedure, + connect.WithSchema(monitoringServiceMethods.ByName("QueryVMMonitoring")), + connect.WithClientOptions(opts...), + ), + getEnhancedMonitoring: connect.NewClient[v1.GetEnhancedMonitoringRequest, v1.GetEnhancedMonitoringResponse]( + httpClient, + baseURL+MonitoringServiceGetEnhancedMonitoringProcedure, + connect.WithSchema(monitoringServiceMethods.ByName("GetEnhancedMonitoring")), + connect.WithClientOptions(opts...), + ), + enableEnhancedMonitoring: connect.NewClient[v1.EnableEnhancedMonitoringRequest, v1.EnableEnhancedMonitoringResponse]( + httpClient, + baseURL+MonitoringServiceEnableEnhancedMonitoringProcedure, + connect.WithSchema(monitoringServiceMethods.ByName("EnableEnhancedMonitoring")), + connect.WithClientOptions(opts...), + ), + revokeEnhancedMonitoring: connect.NewClient[v1.RevokeEnhancedMonitoringRequest, v1.RevokeEnhancedMonitoringResponse]( + httpClient, + baseURL+MonitoringServiceRevokeEnhancedMonitoringProcedure, + connect.WithSchema(monitoringServiceMethods.ByName("RevokeEnhancedMonitoring")), + connect.WithClientOptions(opts...), + ), + } +} + +// monitoringServiceClient implements MonitoringServiceClient. +type monitoringServiceClient struct { + listMetricDescriptors *connect.Client[v1.ListMetricDescriptorsRequest, v1.ListMetricDescriptorsResponse] + listVMMonitoring *connect.Client[v1.ListVMMonitoringRequest, v1.ListVMMonitoringResponse] + queryVMMonitoring *connect.Client[v1.QueryVMMonitoringRequest, v1.QueryVMMonitoringResponse] + getEnhancedMonitoring *connect.Client[v1.GetEnhancedMonitoringRequest, v1.GetEnhancedMonitoringResponse] + enableEnhancedMonitoring *connect.Client[v1.EnableEnhancedMonitoringRequest, v1.EnableEnhancedMonitoringResponse] + revokeEnhancedMonitoring *connect.Client[v1.RevokeEnhancedMonitoringRequest, v1.RevokeEnhancedMonitoringResponse] +} + +// ListMetricDescriptors calls aes.monitoring.v1.MonitoringService.ListMetricDescriptors. +func (c *monitoringServiceClient) ListMetricDescriptors(ctx context.Context, req *connect.Request[v1.ListMetricDescriptorsRequest]) (*connect.Response[v1.ListMetricDescriptorsResponse], error) { + return c.listMetricDescriptors.CallUnary(ctx, req) +} + +// ListVMMonitoring calls aes.monitoring.v1.MonitoringService.ListVMMonitoring. +func (c *monitoringServiceClient) ListVMMonitoring(ctx context.Context, req *connect.Request[v1.ListVMMonitoringRequest]) (*connect.Response[v1.ListVMMonitoringResponse], error) { + return c.listVMMonitoring.CallUnary(ctx, req) +} + +// QueryVMMonitoring calls aes.monitoring.v1.MonitoringService.QueryVMMonitoring. +func (c *monitoringServiceClient) QueryVMMonitoring(ctx context.Context, req *connect.Request[v1.QueryVMMonitoringRequest]) (*connect.Response[v1.QueryVMMonitoringResponse], error) { + return c.queryVMMonitoring.CallUnary(ctx, req) +} + +// GetEnhancedMonitoring calls aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring. +func (c *monitoringServiceClient) GetEnhancedMonitoring(ctx context.Context, req *connect.Request[v1.GetEnhancedMonitoringRequest]) (*connect.Response[v1.GetEnhancedMonitoringResponse], error) { + return c.getEnhancedMonitoring.CallUnary(ctx, req) +} + +// EnableEnhancedMonitoring calls aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring. +func (c *monitoringServiceClient) EnableEnhancedMonitoring(ctx context.Context, req *connect.Request[v1.EnableEnhancedMonitoringRequest]) (*connect.Response[v1.EnableEnhancedMonitoringResponse], error) { + return c.enableEnhancedMonitoring.CallUnary(ctx, req) +} + +// RevokeEnhancedMonitoring calls aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring. +func (c *monitoringServiceClient) RevokeEnhancedMonitoring(ctx context.Context, req *connect.Request[v1.RevokeEnhancedMonitoringRequest]) (*connect.Response[v1.RevokeEnhancedMonitoringResponse], error) { + return c.revokeEnhancedMonitoring.CallUnary(ctx, req) +} + +// MonitoringServiceHandler is an implementation of the aes.monitoring.v1.MonitoringService service. +type MonitoringServiceHandler interface { + ListMetricDescriptors(context.Context, *connect.Request[v1.ListMetricDescriptorsRequest]) (*connect.Response[v1.ListMetricDescriptorsResponse], error) + ListVMMonitoring(context.Context, *connect.Request[v1.ListVMMonitoringRequest]) (*connect.Response[v1.ListVMMonitoringResponse], error) + QueryVMMonitoring(context.Context, *connect.Request[v1.QueryVMMonitoringRequest]) (*connect.Response[v1.QueryVMMonitoringResponse], error) + GetEnhancedMonitoring(context.Context, *connect.Request[v1.GetEnhancedMonitoringRequest]) (*connect.Response[v1.GetEnhancedMonitoringResponse], error) + EnableEnhancedMonitoring(context.Context, *connect.Request[v1.EnableEnhancedMonitoringRequest]) (*connect.Response[v1.EnableEnhancedMonitoringResponse], error) + RevokeEnhancedMonitoring(context.Context, *connect.Request[v1.RevokeEnhancedMonitoringRequest]) (*connect.Response[v1.RevokeEnhancedMonitoringResponse], error) +} + +// NewMonitoringServiceHandler builds an HTTP handler from the service implementation. It returns +// the path on which to mount the handler and the handler itself. +// +// By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf +// and JSON codecs. They also support gzip compression. +func NewMonitoringServiceHandler(svc MonitoringServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { + monitoringServiceMethods := v1.File_aes_monitoring_v1_monitoring_proto.Services().ByName("MonitoringService").Methods() + monitoringServiceListMetricDescriptorsHandler := connect.NewUnaryHandler( + MonitoringServiceListMetricDescriptorsProcedure, + svc.ListMetricDescriptors, + connect.WithSchema(monitoringServiceMethods.ByName("ListMetricDescriptors")), + connect.WithHandlerOptions(opts...), + ) + monitoringServiceListVMMonitoringHandler := connect.NewUnaryHandler( + MonitoringServiceListVMMonitoringProcedure, + svc.ListVMMonitoring, + connect.WithSchema(monitoringServiceMethods.ByName("ListVMMonitoring")), + connect.WithHandlerOptions(opts...), + ) + monitoringServiceQueryVMMonitoringHandler := connect.NewUnaryHandler( + MonitoringServiceQueryVMMonitoringProcedure, + svc.QueryVMMonitoring, + connect.WithSchema(monitoringServiceMethods.ByName("QueryVMMonitoring")), + connect.WithHandlerOptions(opts...), + ) + monitoringServiceGetEnhancedMonitoringHandler := connect.NewUnaryHandler( + MonitoringServiceGetEnhancedMonitoringProcedure, + svc.GetEnhancedMonitoring, + connect.WithSchema(monitoringServiceMethods.ByName("GetEnhancedMonitoring")), + connect.WithHandlerOptions(opts...), + ) + monitoringServiceEnableEnhancedMonitoringHandler := connect.NewUnaryHandler( + MonitoringServiceEnableEnhancedMonitoringProcedure, + svc.EnableEnhancedMonitoring, + connect.WithSchema(monitoringServiceMethods.ByName("EnableEnhancedMonitoring")), + connect.WithHandlerOptions(opts...), + ) + monitoringServiceRevokeEnhancedMonitoringHandler := connect.NewUnaryHandler( + MonitoringServiceRevokeEnhancedMonitoringProcedure, + svc.RevokeEnhancedMonitoring, + connect.WithSchema(monitoringServiceMethods.ByName("RevokeEnhancedMonitoring")), + connect.WithHandlerOptions(opts...), + ) + return "/aes.monitoring.v1.MonitoringService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + switch r.URL.Path { + case MonitoringServiceListMetricDescriptorsProcedure: + monitoringServiceListMetricDescriptorsHandler.ServeHTTP(w, r) + case MonitoringServiceListVMMonitoringProcedure: + monitoringServiceListVMMonitoringHandler.ServeHTTP(w, r) + case MonitoringServiceQueryVMMonitoringProcedure: + monitoringServiceQueryVMMonitoringHandler.ServeHTTP(w, r) + case MonitoringServiceGetEnhancedMonitoringProcedure: + monitoringServiceGetEnhancedMonitoringHandler.ServeHTTP(w, r) + case MonitoringServiceEnableEnhancedMonitoringProcedure: + monitoringServiceEnableEnhancedMonitoringHandler.ServeHTTP(w, r) + case MonitoringServiceRevokeEnhancedMonitoringProcedure: + monitoringServiceRevokeEnhancedMonitoringHandler.ServeHTTP(w, r) + default: + http.NotFound(w, r) + } + }) +} + +// UnimplementedMonitoringServiceHandler returns CodeUnimplemented from all methods. +type UnimplementedMonitoringServiceHandler struct{} + +func (UnimplementedMonitoringServiceHandler) ListMetricDescriptors(context.Context, *connect.Request[v1.ListMetricDescriptorsRequest]) (*connect.Response[v1.ListMetricDescriptorsResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.ListMetricDescriptors is not implemented")) +} + +func (UnimplementedMonitoringServiceHandler) ListVMMonitoring(context.Context, *connect.Request[v1.ListVMMonitoringRequest]) (*connect.Response[v1.ListVMMonitoringResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.ListVMMonitoring is not implemented")) +} + +func (UnimplementedMonitoringServiceHandler) QueryVMMonitoring(context.Context, *connect.Request[v1.QueryVMMonitoringRequest]) (*connect.Response[v1.QueryVMMonitoringResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.QueryVMMonitoring is not implemented")) +} + +func (UnimplementedMonitoringServiceHandler) GetEnhancedMonitoring(context.Context, *connect.Request[v1.GetEnhancedMonitoringRequest]) (*connect.Response[v1.GetEnhancedMonitoringResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring is not implemented")) +} + +func (UnimplementedMonitoringServiceHandler) EnableEnhancedMonitoring(context.Context, *connect.Request[v1.EnableEnhancedMonitoringRequest]) (*connect.Response[v1.EnableEnhancedMonitoringResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring is not implemented")) +} + +func (UnimplementedMonitoringServiceHandler) RevokeEnhancedMonitoring(context.Context, *connect.Request[v1.RevokeEnhancedMonitoringRequest]) (*connect.Response[v1.RevokeEnhancedMonitoringResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring is not implemented")) +} diff --git a/gen/go/aes/support/v1/support.pb.go b/gen/go/aes/support/v1/support.pb.go index eb6c1f8..383b90e 100644 --- a/gen/go/aes/support/v1/support.pb.go +++ b/gen/go/aes/support/v1/support.pb.go @@ -22,11 +22,7 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// Lifecycle states. PENDING_CUSTOMER means staff replied and we're waiting on the user; -// PENDING_STAFF means the user replied and we owe them a response. RESOLVED is set by staff; -// CLOSED is the terminal state — set when the customer -// confirms or auto-closes after an inactivity window. Customer-side CloseTicket goes -// directly to CLOSED. +// CLOSED is the only finished state. RESOLVED remains a deprecated wire-compatible alias. type TicketStatus int32 const ( @@ -34,8 +30,9 @@ const ( TicketStatus_TICKET_STATUS_OPEN TicketStatus = 1 TicketStatus_TICKET_STATUS_PENDING_CUSTOMER TicketStatus = 2 TicketStatus_TICKET_STATUS_PENDING_STAFF TicketStatus = 3 - TicketStatus_TICKET_STATUS_RESOLVED TicketStatus = 4 - TicketStatus_TICKET_STATUS_CLOSED TicketStatus = 5 + // Deprecated: Marked as deprecated in aes/support/v1/support.proto. + TicketStatus_TICKET_STATUS_RESOLVED TicketStatus = 4 + TicketStatus_TICKET_STATUS_CLOSED TicketStatus = 5 ) // Enum value maps for TicketStatus. @@ -397,8 +394,10 @@ type Ticket struct { // Message count in the thread. Populated on list responses; GetTicket returns the full thread. MessageCount int32 `protobuf:"varint,18,opt,name=message_count,json=messageCount,proto3" json:"message_count,omitempty"` // Set on creation per plan tier; null = no SLA. Breach monitoring is applied automatically. - SlaDueAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=sla_due_at,json=slaDueAt,proto3" json:"sla_due_at,omitempty"` - EscalatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=escalated_at,json=escalatedAt,proto3" json:"escalated_at,omitempty"` + SlaDueAt *timestamppb.Timestamp `protobuf:"bytes,15,opt,name=sla_due_at,json=slaDueAt,proto3" json:"sla_due_at,omitempty"` + EscalatedAt *timestamppb.Timestamp `protobuf:"bytes,16,opt,name=escalated_at,json=escalatedAt,proto3" json:"escalated_at,omitempty"` + // Last closure time, preserved when the conversation is reopened. + ClosedAt *timestamppb.Timestamp `protobuf:"bytes,19,opt,name=closed_at,json=closedAt,proto3" json:"closed_at,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -552,6 +551,13 @@ func (x *Ticket) GetEscalatedAt() *timestamppb.Timestamp { return nil } +func (x *Ticket) GetClosedAt() *timestamppb.Timestamp { + if x != nil { + return x.ClosedAt + } + return nil +} + type TicketMessage struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -666,6 +672,7 @@ type CreateTicketRequest struct { // Optional. Defaults to TICKET_PRIORITY_NORMAL when unspecified. Priority TicketPriority `protobuf:"varint,5,opt,name=priority,proto3,enum=aes.support.v1.TicketPriority" json:"priority,omitempty"` ResourceRefs []*ResourceRef `protobuf:"bytes,6,rep,name=resource_refs,json=resourceRefs,proto3" json:"resource_refs,omitempty"` + RequestId string `protobuf:"bytes,7,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -742,6 +749,13 @@ func (x *CreateTicketRequest) GetResourceRefs() []*ResourceRef { return nil } +func (x *CreateTicketRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + type CreateTicketResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Ticket *Ticket `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` @@ -1014,9 +1028,12 @@ func (x *GetTicketResponse) GetMessages() []*TicketMessage { } type ReplyTicketRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name tickets/ (renamed from ticket_id in proto audit) - Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name tickets/ (renamed from ticket_id in proto audit) + Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` + // Explicit consent to reopen a closed conversation. There is no expiry window. + Reopen bool `protobuf:"varint,3,opt,name=reopen,proto3" json:"reopen,omitempty"` + RequestId string `protobuf:"bytes,4,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -1065,6 +1082,20 @@ func (x *ReplyTicketRequest) GetBody() string { return "" } +func (x *ReplyTicketRequest) GetReopen() bool { + if x != nil { + return x.Reopen + } + return false +} + +func (x *ReplyTicketRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + type ReplyTicketResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Message *TicketMessage `protobuf:"bytes,1,opt,name=message,proto3" json:"message,omitempty"` @@ -1122,9 +1153,12 @@ type CloseTicketRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` // Resource name tickets/ (renamed from ticket_id in proto audit) // Optional final customer-side message recorded before close. - Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Body string `protobuf:"bytes,2,opt,name=body,proto3" json:"body,omitempty"` + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // Reject closing when another participant has changed the ticket since it was read. + ExpectedUpdatedAt *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=expected_updated_at,json=expectedUpdatedAt,proto3" json:"expected_updated_at,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CloseTicketRequest) Reset() { @@ -1171,6 +1205,20 @@ func (x *CloseTicketRequest) GetBody() string { return "" } +func (x *CloseTicketRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *CloseTicketRequest) GetExpectedUpdatedAt() *timestamppb.Timestamp { + if x != nil { + return x.ExpectedUpdatedAt + } + return nil +} + type CloseTicketResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Ticket *Ticket `protobuf:"bytes,1,opt,name=ticket,proto3" json:"ticket,omitempty"` @@ -1223,7 +1271,7 @@ const file_aes_support_v1_support_proto_rawDesc = "" + "\vResourceRef\x12\x12\n" + "\x04type\x18\x01 \x01(\tR\x04type\x12\x0e\n" + "\x02id\x18\x02 \x01(\tR\x02id\x12\x18\n" + - "\adisplay\x18\x03 \x01(\tR\adisplay\"\xe6\x06\n" + + "\adisplay\x18\x03 \x01(\tR\adisplay\"\x9f\a\n" + "\x06Ticket\x12\x12\n" + "\x04name\x18\x11 \x01(\tR\x04name\x12+\n" + "\x11organization_name\x18\x02 \x01(\tR\x10organizationName\x12\x1b\n" + @@ -1246,7 +1294,8 @@ const file_aes_support_v1_support_proto_rawDesc = "" + "\rmessage_count\x18\x12 \x01(\x05R\fmessageCount\x128\n" + "\n" + "sla_due_at\x18\x0f \x01(\v2\x1a.google.protobuf.TimestampR\bslaDueAt\x12=\n" + - "\fescalated_at\x18\x10 \x01(\v2\x1a.google.protobuf.TimestampR\vescalatedAtJ\x04\b\x01\x10\x02R\x02id\"\xab\x02\n" + + "\fescalated_at\x18\x10 \x01(\v2\x1a.google.protobuf.TimestampR\vescalatedAt\x127\n" + + "\tclosed_at\x18\x13 \x01(\v2\x1a.google.protobuf.TimestampR\bclosedAtJ\x04\b\x01\x10\x02R\x02id\"\xab\x02\n" + "\rTicketMessage\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12\x1b\n" + "\tticket_id\x18\x02 \x01(\tR\bticketId\x12\x1f\n" + @@ -1258,14 +1307,16 @@ const file_aes_support_v1_support_proto_rawDesc = "" + "\n" + "created_at\x18\a \x01(\v2\x1a.google.protobuf.TimestampR\tcreatedAt\x12;\n" + "\vauthor_kind\x18\b \x01(\x0e2\x1a.aes.support.v1.AuthorKindR\n" + - "authorKind\"\xaa\x02\n" + + "authorKind\"\xc9\x02\n" + "\x13CreateTicketRequest\x12+\n" + "\x11organization_name\x18\x01 \x01(\tR\x10organizationName\x12\x18\n" + "\asubject\x18\x02 \x01(\tR\asubject\x12\x12\n" + "\x04body\x18\x03 \x01(\tR\x04body\x12:\n" + "\bcategory\x18\x04 \x01(\x0e2\x1e.aes.support.v1.TicketCategoryR\bcategory\x12:\n" + "\bpriority\x18\x05 \x01(\x0e2\x1e.aes.support.v1.TicketPriorityR\bpriority\x12@\n" + - "\rresource_refs\x18\x06 \x03(\v2\x1b.aes.support.v1.ResourceRefR\fresourceRefs\"\x8e\x01\n" + + "\rresource_refs\x18\x06 \x03(\v2\x1b.aes.support.v1.ResourceRefR\fresourceRefs\x12\x1d\n" + + "\n" + + "request_id\x18\a \x01(\tR\trequestId\"\x8e\x01\n" + "\x14CreateTicketResponse\x12.\n" + "\x06ticket\x18\x01 \x01(\v2\x16.aes.support.v1.TicketR\x06ticket\x12F\n" + "\x0finitial_message\x18\x02 \x01(\v2\x1d.aes.support.v1.TicketMessageR\x0einitialMessage\"\xc0\x01\n" + @@ -1282,24 +1333,30 @@ const file_aes_support_v1_support_proto_rawDesc = "" + "\x04name\x18\x01 \x01(\tR\x04name\"~\n" + "\x11GetTicketResponse\x12.\n" + "\x06ticket\x18\x01 \x01(\v2\x16.aes.support.v1.TicketR\x06ticket\x129\n" + - "\bmessages\x18\x02 \x03(\v2\x1d.aes.support.v1.TicketMessageR\bmessages\"<\n" + + "\bmessages\x18\x02 \x03(\v2\x1d.aes.support.v1.TicketMessageR\bmessages\"s\n" + "\x12ReplyTicketRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + - "\x04body\x18\x02 \x01(\tR\x04body\"~\n" + + "\x04body\x18\x02 \x01(\tR\x04body\x12\x16\n" + + "\x06reopen\x18\x03 \x01(\bR\x06reopen\x12\x1d\n" + + "\n" + + "request_id\x18\x04 \x01(\tR\trequestId\"~\n" + "\x13ReplyTicketResponse\x127\n" + "\amessage\x18\x01 \x01(\v2\x1d.aes.support.v1.TicketMessageR\amessage\x12.\n" + - "\x06ticket\x18\x02 \x01(\v2\x16.aes.support.v1.TicketR\x06ticket\"<\n" + + "\x06ticket\x18\x02 \x01(\v2\x16.aes.support.v1.TicketR\x06ticket\"\xa7\x01\n" + "\x12CloseTicketRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x12\n" + - "\x04body\x18\x02 \x01(\tR\x04body\"E\n" + + "\x04body\x18\x02 \x01(\tR\x04body\x12\x1d\n" + + "\n" + + "request_id\x18\x03 \x01(\tR\trequestId\x12J\n" + + "\x13expected_updated_at\x18\x04 \x01(\v2\x1a.google.protobuf.TimestampR\x11expectedUpdatedAt\"E\n" + "\x13CloseTicketResponse\x12.\n" + - "\x06ticket\x18\x01 \x01(\v2\x16.aes.support.v1.TicketR\x06ticket*\xc0\x01\n" + + "\x06ticket\x18\x01 \x01(\v2\x16.aes.support.v1.TicketR\x06ticket*\xc4\x01\n" + "\fTicketStatus\x12\x1d\n" + "\x19TICKET_STATUS_UNSPECIFIED\x10\x00\x12\x16\n" + "\x12TICKET_STATUS_OPEN\x10\x01\x12\"\n" + "\x1eTICKET_STATUS_PENDING_CUSTOMER\x10\x02\x12\x1f\n" + - "\x1bTICKET_STATUS_PENDING_STAFF\x10\x03\x12\x1a\n" + - "\x16TICKET_STATUS_RESOLVED\x10\x04\x12\x18\n" + + "\x1bTICKET_STATUS_PENDING_STAFF\x10\x03\x12\x1e\n" + + "\x16TICKET_STATUS_RESOLVED\x10\x04\x1a\x02\b\x01\x12\x18\n" + "\x14TICKET_STATUS_CLOSED\x10\x05*\x9c\x01\n" + "\x0eTicketPriority\x12\x1f\n" + "\x1bTICKET_PRIORITY_UNSPECIFIED\x10\x00\x12\x17\n" + @@ -1381,35 +1438,37 @@ var file_aes_support_v1_support_proto_depIdxs = []int32{ 18, // 8: aes.support.v1.Ticket.resolved_at:type_name -> google.protobuf.Timestamp 18, // 9: aes.support.v1.Ticket.sla_due_at:type_name -> google.protobuf.Timestamp 18, // 10: aes.support.v1.Ticket.escalated_at:type_name -> google.protobuf.Timestamp - 18, // 11: aes.support.v1.TicketMessage.created_at:type_name -> google.protobuf.Timestamp - 4, // 12: aes.support.v1.TicketMessage.author_kind:type_name -> aes.support.v1.AuthorKind - 2, // 13: aes.support.v1.CreateTicketRequest.category:type_name -> aes.support.v1.TicketCategory - 1, // 14: aes.support.v1.CreateTicketRequest.priority:type_name -> aes.support.v1.TicketPriority - 5, // 15: aes.support.v1.CreateTicketRequest.resource_refs:type_name -> aes.support.v1.ResourceRef - 6, // 16: aes.support.v1.CreateTicketResponse.ticket:type_name -> aes.support.v1.Ticket - 7, // 17: aes.support.v1.CreateTicketResponse.initial_message:type_name -> aes.support.v1.TicketMessage - 0, // 18: aes.support.v1.ListTicketsRequest.status_filter:type_name -> aes.support.v1.TicketStatus - 6, // 19: aes.support.v1.ListTicketsResponse.tickets:type_name -> aes.support.v1.Ticket - 6, // 20: aes.support.v1.GetTicketResponse.ticket:type_name -> aes.support.v1.Ticket - 7, // 21: aes.support.v1.GetTicketResponse.messages:type_name -> aes.support.v1.TicketMessage - 7, // 22: aes.support.v1.ReplyTicketResponse.message:type_name -> aes.support.v1.TicketMessage - 6, // 23: aes.support.v1.ReplyTicketResponse.ticket:type_name -> aes.support.v1.Ticket - 6, // 24: aes.support.v1.CloseTicketResponse.ticket:type_name -> aes.support.v1.Ticket - 8, // 25: aes.support.v1.SupportService.CreateTicket:input_type -> aes.support.v1.CreateTicketRequest - 10, // 26: aes.support.v1.SupportService.ListTickets:input_type -> aes.support.v1.ListTicketsRequest - 12, // 27: aes.support.v1.SupportService.GetTicket:input_type -> aes.support.v1.GetTicketRequest - 14, // 28: aes.support.v1.SupportService.ReplyTicket:input_type -> aes.support.v1.ReplyTicketRequest - 16, // 29: aes.support.v1.SupportService.CloseTicket:input_type -> aes.support.v1.CloseTicketRequest - 9, // 30: aes.support.v1.SupportService.CreateTicket:output_type -> aes.support.v1.CreateTicketResponse - 11, // 31: aes.support.v1.SupportService.ListTickets:output_type -> aes.support.v1.ListTicketsResponse - 13, // 32: aes.support.v1.SupportService.GetTicket:output_type -> aes.support.v1.GetTicketResponse - 15, // 33: aes.support.v1.SupportService.ReplyTicket:output_type -> aes.support.v1.ReplyTicketResponse - 17, // 34: aes.support.v1.SupportService.CloseTicket:output_type -> aes.support.v1.CloseTicketResponse - 30, // [30:35] is the sub-list for method output_type - 25, // [25:30] is the sub-list for method input_type - 25, // [25:25] is the sub-list for extension type_name - 25, // [25:25] is the sub-list for extension extendee - 0, // [0:25] is the sub-list for field type_name + 18, // 11: aes.support.v1.Ticket.closed_at:type_name -> google.protobuf.Timestamp + 18, // 12: aes.support.v1.TicketMessage.created_at:type_name -> google.protobuf.Timestamp + 4, // 13: aes.support.v1.TicketMessage.author_kind:type_name -> aes.support.v1.AuthorKind + 2, // 14: aes.support.v1.CreateTicketRequest.category:type_name -> aes.support.v1.TicketCategory + 1, // 15: aes.support.v1.CreateTicketRequest.priority:type_name -> aes.support.v1.TicketPriority + 5, // 16: aes.support.v1.CreateTicketRequest.resource_refs:type_name -> aes.support.v1.ResourceRef + 6, // 17: aes.support.v1.CreateTicketResponse.ticket:type_name -> aes.support.v1.Ticket + 7, // 18: aes.support.v1.CreateTicketResponse.initial_message:type_name -> aes.support.v1.TicketMessage + 0, // 19: aes.support.v1.ListTicketsRequest.status_filter:type_name -> aes.support.v1.TicketStatus + 6, // 20: aes.support.v1.ListTicketsResponse.tickets:type_name -> aes.support.v1.Ticket + 6, // 21: aes.support.v1.GetTicketResponse.ticket:type_name -> aes.support.v1.Ticket + 7, // 22: aes.support.v1.GetTicketResponse.messages:type_name -> aes.support.v1.TicketMessage + 7, // 23: aes.support.v1.ReplyTicketResponse.message:type_name -> aes.support.v1.TicketMessage + 6, // 24: aes.support.v1.ReplyTicketResponse.ticket:type_name -> aes.support.v1.Ticket + 18, // 25: aes.support.v1.CloseTicketRequest.expected_updated_at:type_name -> google.protobuf.Timestamp + 6, // 26: aes.support.v1.CloseTicketResponse.ticket:type_name -> aes.support.v1.Ticket + 8, // 27: aes.support.v1.SupportService.CreateTicket:input_type -> aes.support.v1.CreateTicketRequest + 10, // 28: aes.support.v1.SupportService.ListTickets:input_type -> aes.support.v1.ListTicketsRequest + 12, // 29: aes.support.v1.SupportService.GetTicket:input_type -> aes.support.v1.GetTicketRequest + 14, // 30: aes.support.v1.SupportService.ReplyTicket:input_type -> aes.support.v1.ReplyTicketRequest + 16, // 31: aes.support.v1.SupportService.CloseTicket:input_type -> aes.support.v1.CloseTicketRequest + 9, // 32: aes.support.v1.SupportService.CreateTicket:output_type -> aes.support.v1.CreateTicketResponse + 11, // 33: aes.support.v1.SupportService.ListTickets:output_type -> aes.support.v1.ListTicketsResponse + 13, // 34: aes.support.v1.SupportService.GetTicket:output_type -> aes.support.v1.GetTicketResponse + 15, // 35: aes.support.v1.SupportService.ReplyTicket:output_type -> aes.support.v1.ReplyTicketResponse + 17, // 36: aes.support.v1.SupportService.CloseTicket:output_type -> aes.support.v1.CloseTicketResponse + 32, // [32:37] is the sub-list for method output_type + 27, // [27:32] is the sub-list for method input_type + 27, // [27:27] is the sub-list for extension type_name + 27, // [27:27] is the sub-list for extension extendee + 0, // [0:27] is the sub-list for field type_name } func init() { file_aes_support_v1_support_proto_init() } diff --git a/gen/go/aes/support/v1/supportv1connect/support.connect.go b/gen/go/aes/support/v1/supportv1connect/support.connect.go index 328f0bb..568305d 100644 --- a/gen/go/aes/support/v1/supportv1connect/support.connect.go +++ b/gen/go/aes/support/v1/supportv1connect/support.connect.go @@ -63,8 +63,7 @@ type SupportServiceClient interface { // ReplyTicket appends a customer message and transitions status to PENDING_STAFF when the // ticket was previously PENDING_CUSTOMER. No-op transition otherwise. ReplyTicket(context.Context, *connect.Request[v1.ReplyTicketRequest]) (*connect.Response[v1.ReplyTicketResponse], error) - // CloseTicket transitions the ticket to CLOSED. Customer can close from any non-CLOSED - // status. Staff may mark a ticket RESOLVED before the customer closes it. + // CloseTicket closes the conversation. ReplyTicket with reopen=true can reopen it at any time. CloseTicket(context.Context, *connect.Request[v1.CloseTicketRequest]) (*connect.Response[v1.CloseTicketResponse], error) } @@ -159,8 +158,7 @@ type SupportServiceHandler interface { // ReplyTicket appends a customer message and transitions status to PENDING_STAFF when the // ticket was previously PENDING_CUSTOMER. No-op transition otherwise. ReplyTicket(context.Context, *connect.Request[v1.ReplyTicketRequest]) (*connect.Response[v1.ReplyTicketResponse], error) - // CloseTicket transitions the ticket to CLOSED. Customer can close from any non-CLOSED - // status. Staff may mark a ticket RESOLVED before the customer closes it. + // CloseTicket closes the conversation. ReplyTicket with reopen=true can reopen it at any time. CloseTicket(context.Context, *connect.Request[v1.CloseTicketRequest]) (*connect.Response[v1.CloseTicketResponse], error) } diff --git a/gen/go/aes/webhooks/v1/webhooks.pb.go b/gen/go/aes/webhooks/v1/webhooks.pb.go index 35b2857..a711efd 100644 --- a/gen/go/aes/webhooks/v1/webhooks.pb.go +++ b/gen/go/aes/webhooks/v1/webhooks.pb.go @@ -38,8 +38,11 @@ type Subscription struct { UpdateTimeUnix int64 `protobuf:"varint,7,opt,name=update_time_unix,json=updateTimeUnix,proto3" json:"update_time_unix,omitempty"` // Per-subscription identifier returned via the X-Metalhost-Subscription header in deliveries. SecretPrefix string `protobuf:"bytes,8,opt,name=secret_prefix,json=secretPrefix,proto3" json:"secret_prefix,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + SecretVersion int64 `protobuf:"varint,9,opt,name=secret_version,json=secretVersion,proto3" json:"secret_version,omitempty"` + // Zero when no overlap exists. Expired previous secrets are never used to sign. + PreviousSecretExpiresAtUnix int64 `protobuf:"varint,10,opt,name=previous_secret_expires_at_unix,json=previousSecretExpiresAtUnix,proto3" json:"previous_secret_expires_at_unix,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *Subscription) Reset() { @@ -128,6 +131,151 @@ func (x *Subscription) GetSecretPrefix() string { return "" } +func (x *Subscription) GetSecretVersion() int64 { + if x != nil { + return x.SecretVersion + } + return 0 +} + +func (x *Subscription) GetPreviousSecretExpiresAtUnix() int64 { + if x != nil { + return x.PreviousSecretExpiresAtUnix + } + return 0 +} + +type RotateSubscriptionSecretRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + ExpectedSecretVersion int64 `protobuf:"varint,2,opt,name=expected_secret_version,json=expectedSecretVersion,proto3" json:"expected_secret_version,omitempty"` + // Stable UUID for recovery after a lost response. Retries never reveal secrets. + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // 0 immediately invalidates the old secret; maximum 86400 (24 hours). + OverlapSeconds int32 `protobuf:"varint,4,opt,name=overlap_seconds,json=overlapSeconds,proto3" json:"overlap_seconds,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotateSubscriptionSecretRequest) Reset() { + *x = RotateSubscriptionSecretRequest{} + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotateSubscriptionSecretRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateSubscriptionSecretRequest) ProtoMessage() {} + +func (x *RotateSubscriptionSecretRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[1] + 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 RotateSubscriptionSecretRequest.ProtoReflect.Descriptor instead. +func (*RotateSubscriptionSecretRequest) Descriptor() ([]byte, []int) { + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{1} +} + +func (x *RotateSubscriptionSecretRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RotateSubscriptionSecretRequest) GetExpectedSecretVersion() int64 { + if x != nil { + return x.ExpectedSecretVersion + } + return 0 +} + +func (x *RotateSubscriptionSecretRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *RotateSubscriptionSecretRequest) GetOverlapSeconds() int32 { + if x != nil { + return x.OverlapSeconds + } + return 0 +} + +type RotateSubscriptionSecretResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Subscription *Subscription `protobuf:"bytes,1,opt,name=subscription,proto3" json:"subscription,omitempty"` + Secret string `protobuf:"bytes,2,opt,name=secret,proto3" json:"secret,omitempty"` + // A committed request was retried. Recover by deliberately rotating again. + SecretUnavailable bool `protobuf:"varint,3,opt,name=secret_unavailable,json=secretUnavailable,proto3" json:"secret_unavailable,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *RotateSubscriptionSecretResponse) Reset() { + *x = RotateSubscriptionSecretResponse{} + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *RotateSubscriptionSecretResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RotateSubscriptionSecretResponse) ProtoMessage() {} + +func (x *RotateSubscriptionSecretResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[2] + 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 RotateSubscriptionSecretResponse.ProtoReflect.Descriptor instead. +func (*RotateSubscriptionSecretResponse) Descriptor() ([]byte, []int) { + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{2} +} + +func (x *RotateSubscriptionSecretResponse) GetSubscription() *Subscription { + if x != nil { + return x.Subscription + } + return nil +} + +func (x *RotateSubscriptionSecretResponse) GetSecret() string { + if x != nil { + return x.Secret + } + return "" +} + +func (x *RotateSubscriptionSecretResponse) GetSecretUnavailable() bool { + if x != nil { + return x.SecretUnavailable + } + return false +} + type CreateSubscriptionRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -140,7 +288,7 @@ type CreateSubscriptionRequest struct { func (x *CreateSubscriptionRequest) Reset() { *x = CreateSubscriptionRequest{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[1] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -152,7 +300,7 @@ func (x *CreateSubscriptionRequest) String() string { func (*CreateSubscriptionRequest) ProtoMessage() {} func (x *CreateSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[1] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -165,7 +313,7 @@ func (x *CreateSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateSubscriptionRequest.ProtoReflect.Descriptor instead. func (*CreateSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{1} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{3} } func (x *CreateSubscriptionRequest) GetName() string { @@ -207,7 +355,7 @@ type CreateSubscriptionResponse struct { func (x *CreateSubscriptionResponse) Reset() { *x = CreateSubscriptionResponse{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[2] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -219,7 +367,7 @@ func (x *CreateSubscriptionResponse) String() string { func (*CreateSubscriptionResponse) ProtoMessage() {} func (x *CreateSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[2] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -232,7 +380,7 @@ func (x *CreateSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateSubscriptionResponse.ProtoReflect.Descriptor instead. func (*CreateSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{2} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{4} } func (x *CreateSubscriptionResponse) GetSubscription() *Subscription { @@ -258,7 +406,7 @@ type GetSubscriptionRequest struct { func (x *GetSubscriptionRequest) Reset() { *x = GetSubscriptionRequest{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[3] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -270,7 +418,7 @@ func (x *GetSubscriptionRequest) String() string { func (*GetSubscriptionRequest) ProtoMessage() {} func (x *GetSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[3] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -283,7 +431,7 @@ func (x *GetSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSubscriptionRequest.ProtoReflect.Descriptor instead. func (*GetSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{3} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{5} } func (x *GetSubscriptionRequest) GetName() string { @@ -302,7 +450,7 @@ type GetSubscriptionResponse struct { func (x *GetSubscriptionResponse) Reset() { *x = GetSubscriptionResponse{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[4] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -314,7 +462,7 @@ func (x *GetSubscriptionResponse) String() string { func (*GetSubscriptionResponse) ProtoMessage() {} func (x *GetSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[4] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -327,7 +475,7 @@ func (x *GetSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetSubscriptionResponse.ProtoReflect.Descriptor instead. func (*GetSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{4} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{6} } func (x *GetSubscriptionResponse) GetSubscription() *Subscription { @@ -348,7 +496,7 @@ type ListSubscriptionsRequest struct { func (x *ListSubscriptionsRequest) Reset() { *x = ListSubscriptionsRequest{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[5] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -360,7 +508,7 @@ func (x *ListSubscriptionsRequest) String() string { func (*ListSubscriptionsRequest) ProtoMessage() {} func (x *ListSubscriptionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[5] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -373,7 +521,7 @@ func (x *ListSubscriptionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSubscriptionsRequest.ProtoReflect.Descriptor instead. func (*ListSubscriptionsRequest) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{5} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{7} } func (x *ListSubscriptionsRequest) GetProjectName() string { @@ -407,7 +555,7 @@ type ListSubscriptionsResponse struct { func (x *ListSubscriptionsResponse) Reset() { *x = ListSubscriptionsResponse{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[6] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -419,7 +567,7 @@ func (x *ListSubscriptionsResponse) String() string { func (*ListSubscriptionsResponse) ProtoMessage() {} func (x *ListSubscriptionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[6] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -432,7 +580,7 @@ func (x *ListSubscriptionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListSubscriptionsResponse.ProtoReflect.Descriptor instead. func (*ListSubscriptionsResponse) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{6} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{8} } func (x *ListSubscriptionsResponse) GetSubscriptions() []*Subscription { @@ -463,7 +611,7 @@ type UpdateSubscriptionRequest struct { func (x *UpdateSubscriptionRequest) Reset() { *x = UpdateSubscriptionRequest{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[7] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -475,7 +623,7 @@ func (x *UpdateSubscriptionRequest) String() string { func (*UpdateSubscriptionRequest) ProtoMessage() {} func (x *UpdateSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[7] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -488,7 +636,7 @@ func (x *UpdateSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateSubscriptionRequest.ProtoReflect.Descriptor instead. func (*UpdateSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{7} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{9} } func (x *UpdateSubscriptionRequest) GetName() string { @@ -535,7 +683,7 @@ type UpdateSubscriptionResponse struct { func (x *UpdateSubscriptionResponse) Reset() { *x = UpdateSubscriptionResponse{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[8] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -547,7 +695,7 @@ func (x *UpdateSubscriptionResponse) String() string { func (*UpdateSubscriptionResponse) ProtoMessage() {} func (x *UpdateSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[8] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -560,7 +708,7 @@ func (x *UpdateSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateSubscriptionResponse.ProtoReflect.Descriptor instead. func (*UpdateSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{8} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{10} } func (x *UpdateSubscriptionResponse) GetSubscription() *Subscription { @@ -579,7 +727,7 @@ type DeleteSubscriptionRequest struct { func (x *DeleteSubscriptionRequest) Reset() { *x = DeleteSubscriptionRequest{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[9] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -591,7 +739,7 @@ func (x *DeleteSubscriptionRequest) String() string { func (*DeleteSubscriptionRequest) ProtoMessage() {} func (x *DeleteSubscriptionRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[9] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -604,7 +752,7 @@ func (x *DeleteSubscriptionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSubscriptionRequest.ProtoReflect.Descriptor instead. func (*DeleteSubscriptionRequest) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{9} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{11} } func (x *DeleteSubscriptionRequest) GetName() string { @@ -622,7 +770,7 @@ type DeleteSubscriptionResponse struct { func (x *DeleteSubscriptionResponse) Reset() { *x = DeleteSubscriptionResponse{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[10] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -634,7 +782,7 @@ func (x *DeleteSubscriptionResponse) String() string { func (*DeleteSubscriptionResponse) ProtoMessage() {} func (x *DeleteSubscriptionResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[10] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -647,7 +795,7 @@ func (x *DeleteSubscriptionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteSubscriptionResponse.ProtoReflect.Descriptor instead. func (*DeleteSubscriptionResponse) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{10} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{12} } type Delivery struct { @@ -674,7 +822,7 @@ type Delivery struct { func (x *Delivery) Reset() { *x = Delivery{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[11] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -686,7 +834,7 @@ func (x *Delivery) String() string { func (*Delivery) ProtoMessage() {} func (x *Delivery) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[11] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -699,7 +847,7 @@ func (x *Delivery) ProtoReflect() protoreflect.Message { // Deprecated: Use Delivery.ProtoReflect.Descriptor instead. func (*Delivery) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{11} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{13} } func (x *Delivery) GetId() string { @@ -783,7 +931,7 @@ type ListDeliveriesRequest struct { func (x *ListDeliveriesRequest) Reset() { *x = ListDeliveriesRequest{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[12] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -795,7 +943,7 @@ func (x *ListDeliveriesRequest) String() string { func (*ListDeliveriesRequest) ProtoMessage() {} func (x *ListDeliveriesRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[12] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -808,7 +956,7 @@ func (x *ListDeliveriesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDeliveriesRequest.ProtoReflect.Descriptor instead. func (*ListDeliveriesRequest) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{12} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{14} } func (x *ListDeliveriesRequest) GetSubscriptionName() string { @@ -842,7 +990,7 @@ type ListDeliveriesResponse struct { func (x *ListDeliveriesResponse) Reset() { *x = ListDeliveriesResponse{} - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[13] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -854,7 +1002,7 @@ func (x *ListDeliveriesResponse) String() string { func (*ListDeliveriesResponse) ProtoMessage() {} func (x *ListDeliveriesResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[13] + mi := &file_aes_webhooks_v1_webhooks_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -867,7 +1015,7 @@ func (x *ListDeliveriesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListDeliveriesResponse.ProtoReflect.Descriptor instead. func (*ListDeliveriesResponse) Descriptor() ([]byte, []int) { - return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{13} + return file_aes_webhooks_v1_webhooks_proto_rawDescGZIP(), []int{15} } func (x *ListDeliveriesResponse) GetDeliveries() []*Delivery { @@ -888,7 +1036,7 @@ var File_aes_webhooks_v1_webhooks_proto protoreflect.FileDescriptor const file_aes_webhooks_v1_webhooks_proto_rawDesc = "" + "\n" + - "\x1eaes/webhooks/v1/webhooks.proto\x12\x0faes.webhooks.v1\"\x98\x02\n" + + "\x1eaes/webhooks/v1/webhooks.proto\x12\x0faes.webhooks.v1\"\x85\x03\n" + "\fSubscription\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x12!\n" + @@ -898,7 +1046,20 @@ const file_aes_webhooks_v1_webhooks_proto_rawDesc = "" + "\x05state\x18\x05 \x01(\tR\x05state\x12(\n" + "\x10create_time_unix\x18\x06 \x01(\x03R\x0ecreateTimeUnix\x12(\n" + "\x10update_time_unix\x18\a \x01(\x03R\x0eupdateTimeUnix\x12#\n" + - "\rsecret_prefix\x18\b \x01(\tR\fsecretPrefix\"\x96\x01\n" + + "\rsecret_prefix\x18\b \x01(\tR\fsecretPrefix\x12%\n" + + "\x0esecret_version\x18\t \x01(\x03R\rsecretVersion\x12D\n" + + "\x1fprevious_secret_expires_at_unix\x18\n" + + " \x01(\x03R\x1bpreviousSecretExpiresAtUnix\"\xb5\x01\n" + + "\x1fRotateSubscriptionSecretRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x126\n" + + "\x17expected_secret_version\x18\x02 \x01(\x03R\x15expectedSecretVersion\x12\x1d\n" + + "\n" + + "request_id\x18\x03 \x01(\tR\trequestId\x12'\n" + + "\x0foverlap_seconds\x18\x04 \x01(\x05R\x0eoverlapSeconds\"\xac\x01\n" + + " RotateSubscriptionSecretResponse\x12A\n" + + "\fsubscription\x18\x01 \x01(\v2\x1d.aes.webhooks.v1.SubscriptionR\fsubscription\x12\x16\n" + + "\x06secret\x18\x02 \x01(\tR\x06secret\x12-\n" + + "\x12secret_unavailable\x18\x03 \x01(\bR\x11secretUnavailable\"\x96\x01\n" + "\x19CreateSubscriptionRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x12!\n" + @@ -957,13 +1118,14 @@ const file_aes_webhooks_v1_webhooks_proto_rawDesc = "" + "\n" + "deliveries\x18\x01 \x03(\v2\x19.aes.webhooks.v1.DeliveryR\n" + "deliveries\x12&\n" + - "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken2\x93\x05\n" + + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken2\x94\x06\n" + "\x0fWebhooksService\x12m\n" + "\x12CreateSubscription\x12*.aes.webhooks.v1.CreateSubscriptionRequest\x1a+.aes.webhooks.v1.CreateSubscriptionResponse\x12d\n" + "\x0fGetSubscription\x12'.aes.webhooks.v1.GetSubscriptionRequest\x1a(.aes.webhooks.v1.GetSubscriptionResponse\x12j\n" + "\x11ListSubscriptions\x12).aes.webhooks.v1.ListSubscriptionsRequest\x1a*.aes.webhooks.v1.ListSubscriptionsResponse\x12m\n" + "\x12UpdateSubscription\x12*.aes.webhooks.v1.UpdateSubscriptionRequest\x1a+.aes.webhooks.v1.UpdateSubscriptionResponse\x12m\n" + - "\x12DeleteSubscription\x12*.aes.webhooks.v1.DeleteSubscriptionRequest\x1a+.aes.webhooks.v1.DeleteSubscriptionResponse\x12a\n" + + "\x12DeleteSubscription\x12*.aes.webhooks.v1.DeleteSubscriptionRequest\x1a+.aes.webhooks.v1.DeleteSubscriptionResponse\x12\x7f\n" + + "\x18RotateSubscriptionSecret\x120.aes.webhooks.v1.RotateSubscriptionSecretRequest\x1a1.aes.webhooks.v1.RotateSubscriptionSecretResponse\x12a\n" + "\x0eListDeliveries\x12&.aes.webhooks.v1.ListDeliveriesRequest\x1a'.aes.webhooks.v1.ListDeliveriesResponseB\xcb\x01\n" + "\x13com.aes.webhooks.v1B\rWebhooksProtoP\x01ZGgithub.com/AES-Services/metalhost-sdk/gen/go/aes/webhooks/v1;webhooksv1\xa2\x02\x03AWX\xaa\x02\x0fAes.Webhooks.V1\xca\x02\x0fAes\\Webhooks\\V1\xe2\x02\x1bAes\\Webhooks\\V1\\GPBMetadata\xea\x02\x11Aes::Webhooks::V1b\x06proto3" @@ -979,46 +1141,51 @@ func file_aes_webhooks_v1_webhooks_proto_rawDescGZIP() []byte { return file_aes_webhooks_v1_webhooks_proto_rawDescData } -var file_aes_webhooks_v1_webhooks_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_aes_webhooks_v1_webhooks_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_aes_webhooks_v1_webhooks_proto_goTypes = []any{ - (*Subscription)(nil), // 0: aes.webhooks.v1.Subscription - (*CreateSubscriptionRequest)(nil), // 1: aes.webhooks.v1.CreateSubscriptionRequest - (*CreateSubscriptionResponse)(nil), // 2: aes.webhooks.v1.CreateSubscriptionResponse - (*GetSubscriptionRequest)(nil), // 3: aes.webhooks.v1.GetSubscriptionRequest - (*GetSubscriptionResponse)(nil), // 4: aes.webhooks.v1.GetSubscriptionResponse - (*ListSubscriptionsRequest)(nil), // 5: aes.webhooks.v1.ListSubscriptionsRequest - (*ListSubscriptionsResponse)(nil), // 6: aes.webhooks.v1.ListSubscriptionsResponse - (*UpdateSubscriptionRequest)(nil), // 7: aes.webhooks.v1.UpdateSubscriptionRequest - (*UpdateSubscriptionResponse)(nil), // 8: aes.webhooks.v1.UpdateSubscriptionResponse - (*DeleteSubscriptionRequest)(nil), // 9: aes.webhooks.v1.DeleteSubscriptionRequest - (*DeleteSubscriptionResponse)(nil), // 10: aes.webhooks.v1.DeleteSubscriptionResponse - (*Delivery)(nil), // 11: aes.webhooks.v1.Delivery - (*ListDeliveriesRequest)(nil), // 12: aes.webhooks.v1.ListDeliveriesRequest - (*ListDeliveriesResponse)(nil), // 13: aes.webhooks.v1.ListDeliveriesResponse + (*Subscription)(nil), // 0: aes.webhooks.v1.Subscription + (*RotateSubscriptionSecretRequest)(nil), // 1: aes.webhooks.v1.RotateSubscriptionSecretRequest + (*RotateSubscriptionSecretResponse)(nil), // 2: aes.webhooks.v1.RotateSubscriptionSecretResponse + (*CreateSubscriptionRequest)(nil), // 3: aes.webhooks.v1.CreateSubscriptionRequest + (*CreateSubscriptionResponse)(nil), // 4: aes.webhooks.v1.CreateSubscriptionResponse + (*GetSubscriptionRequest)(nil), // 5: aes.webhooks.v1.GetSubscriptionRequest + (*GetSubscriptionResponse)(nil), // 6: aes.webhooks.v1.GetSubscriptionResponse + (*ListSubscriptionsRequest)(nil), // 7: aes.webhooks.v1.ListSubscriptionsRequest + (*ListSubscriptionsResponse)(nil), // 8: aes.webhooks.v1.ListSubscriptionsResponse + (*UpdateSubscriptionRequest)(nil), // 9: aes.webhooks.v1.UpdateSubscriptionRequest + (*UpdateSubscriptionResponse)(nil), // 10: aes.webhooks.v1.UpdateSubscriptionResponse + (*DeleteSubscriptionRequest)(nil), // 11: aes.webhooks.v1.DeleteSubscriptionRequest + (*DeleteSubscriptionResponse)(nil), // 12: aes.webhooks.v1.DeleteSubscriptionResponse + (*Delivery)(nil), // 13: aes.webhooks.v1.Delivery + (*ListDeliveriesRequest)(nil), // 14: aes.webhooks.v1.ListDeliveriesRequest + (*ListDeliveriesResponse)(nil), // 15: aes.webhooks.v1.ListDeliveriesResponse } var file_aes_webhooks_v1_webhooks_proto_depIdxs = []int32{ - 0, // 0: aes.webhooks.v1.CreateSubscriptionResponse.subscription:type_name -> aes.webhooks.v1.Subscription - 0, // 1: aes.webhooks.v1.GetSubscriptionResponse.subscription:type_name -> aes.webhooks.v1.Subscription - 0, // 2: aes.webhooks.v1.ListSubscriptionsResponse.subscriptions:type_name -> aes.webhooks.v1.Subscription - 0, // 3: aes.webhooks.v1.UpdateSubscriptionResponse.subscription:type_name -> aes.webhooks.v1.Subscription - 11, // 4: aes.webhooks.v1.ListDeliveriesResponse.deliveries:type_name -> aes.webhooks.v1.Delivery - 1, // 5: aes.webhooks.v1.WebhooksService.CreateSubscription:input_type -> aes.webhooks.v1.CreateSubscriptionRequest - 3, // 6: aes.webhooks.v1.WebhooksService.GetSubscription:input_type -> aes.webhooks.v1.GetSubscriptionRequest - 5, // 7: aes.webhooks.v1.WebhooksService.ListSubscriptions:input_type -> aes.webhooks.v1.ListSubscriptionsRequest - 7, // 8: aes.webhooks.v1.WebhooksService.UpdateSubscription:input_type -> aes.webhooks.v1.UpdateSubscriptionRequest - 9, // 9: aes.webhooks.v1.WebhooksService.DeleteSubscription:input_type -> aes.webhooks.v1.DeleteSubscriptionRequest - 12, // 10: aes.webhooks.v1.WebhooksService.ListDeliveries:input_type -> aes.webhooks.v1.ListDeliveriesRequest - 2, // 11: aes.webhooks.v1.WebhooksService.CreateSubscription:output_type -> aes.webhooks.v1.CreateSubscriptionResponse - 4, // 12: aes.webhooks.v1.WebhooksService.GetSubscription:output_type -> aes.webhooks.v1.GetSubscriptionResponse - 6, // 13: aes.webhooks.v1.WebhooksService.ListSubscriptions:output_type -> aes.webhooks.v1.ListSubscriptionsResponse - 8, // 14: aes.webhooks.v1.WebhooksService.UpdateSubscription:output_type -> aes.webhooks.v1.UpdateSubscriptionResponse - 10, // 15: aes.webhooks.v1.WebhooksService.DeleteSubscription:output_type -> aes.webhooks.v1.DeleteSubscriptionResponse - 13, // 16: aes.webhooks.v1.WebhooksService.ListDeliveries:output_type -> aes.webhooks.v1.ListDeliveriesResponse - 11, // [11:17] is the sub-list for method output_type - 5, // [5:11] is the sub-list for method input_type - 5, // [5:5] is the sub-list for extension type_name - 5, // [5:5] is the sub-list for extension extendee - 0, // [0:5] is the sub-list for field type_name + 0, // 0: aes.webhooks.v1.RotateSubscriptionSecretResponse.subscription:type_name -> aes.webhooks.v1.Subscription + 0, // 1: aes.webhooks.v1.CreateSubscriptionResponse.subscription:type_name -> aes.webhooks.v1.Subscription + 0, // 2: aes.webhooks.v1.GetSubscriptionResponse.subscription:type_name -> aes.webhooks.v1.Subscription + 0, // 3: aes.webhooks.v1.ListSubscriptionsResponse.subscriptions:type_name -> aes.webhooks.v1.Subscription + 0, // 4: aes.webhooks.v1.UpdateSubscriptionResponse.subscription:type_name -> aes.webhooks.v1.Subscription + 13, // 5: aes.webhooks.v1.ListDeliveriesResponse.deliveries:type_name -> aes.webhooks.v1.Delivery + 3, // 6: aes.webhooks.v1.WebhooksService.CreateSubscription:input_type -> aes.webhooks.v1.CreateSubscriptionRequest + 5, // 7: aes.webhooks.v1.WebhooksService.GetSubscription:input_type -> aes.webhooks.v1.GetSubscriptionRequest + 7, // 8: aes.webhooks.v1.WebhooksService.ListSubscriptions:input_type -> aes.webhooks.v1.ListSubscriptionsRequest + 9, // 9: aes.webhooks.v1.WebhooksService.UpdateSubscription:input_type -> aes.webhooks.v1.UpdateSubscriptionRequest + 11, // 10: aes.webhooks.v1.WebhooksService.DeleteSubscription:input_type -> aes.webhooks.v1.DeleteSubscriptionRequest + 1, // 11: aes.webhooks.v1.WebhooksService.RotateSubscriptionSecret:input_type -> aes.webhooks.v1.RotateSubscriptionSecretRequest + 14, // 12: aes.webhooks.v1.WebhooksService.ListDeliveries:input_type -> aes.webhooks.v1.ListDeliveriesRequest + 4, // 13: aes.webhooks.v1.WebhooksService.CreateSubscription:output_type -> aes.webhooks.v1.CreateSubscriptionResponse + 6, // 14: aes.webhooks.v1.WebhooksService.GetSubscription:output_type -> aes.webhooks.v1.GetSubscriptionResponse + 8, // 15: aes.webhooks.v1.WebhooksService.ListSubscriptions:output_type -> aes.webhooks.v1.ListSubscriptionsResponse + 10, // 16: aes.webhooks.v1.WebhooksService.UpdateSubscription:output_type -> aes.webhooks.v1.UpdateSubscriptionResponse + 12, // 17: aes.webhooks.v1.WebhooksService.DeleteSubscription:output_type -> aes.webhooks.v1.DeleteSubscriptionResponse + 2, // 18: aes.webhooks.v1.WebhooksService.RotateSubscriptionSecret:output_type -> aes.webhooks.v1.RotateSubscriptionSecretResponse + 15, // 19: aes.webhooks.v1.WebhooksService.ListDeliveries:output_type -> aes.webhooks.v1.ListDeliveriesResponse + 13, // [13:20] is the sub-list for method output_type + 6, // [6:13] is the sub-list for method input_type + 6, // [6:6] is the sub-list for extension type_name + 6, // [6:6] is the sub-list for extension extendee + 0, // [0:6] is the sub-list for field type_name } func init() { file_aes_webhooks_v1_webhooks_proto_init() } @@ -1026,14 +1193,14 @@ func file_aes_webhooks_v1_webhooks_proto_init() { if File_aes_webhooks_v1_webhooks_proto != nil { return } - file_aes_webhooks_v1_webhooks_proto_msgTypes[7].OneofWrappers = []any{} + file_aes_webhooks_v1_webhooks_proto_msgTypes[9].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_aes_webhooks_v1_webhooks_proto_rawDesc), len(file_aes_webhooks_v1_webhooks_proto_rawDesc)), NumEnums: 0, - NumMessages: 14, + NumMessages: 16, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/aes/webhooks/v1/webhooksv1connect/webhooks.connect.go b/gen/go/aes/webhooks/v1/webhooksv1connect/webhooks.connect.go index 04c90cb..93893ae 100644 --- a/gen/go/aes/webhooks/v1/webhooksv1connect/webhooks.connect.go +++ b/gen/go/aes/webhooks/v1/webhooksv1connect/webhooks.connect.go @@ -48,6 +48,9 @@ const ( // WebhooksServiceDeleteSubscriptionProcedure is the fully-qualified name of the WebhooksService's // DeleteSubscription RPC. WebhooksServiceDeleteSubscriptionProcedure = "/aes.webhooks.v1.WebhooksService/DeleteSubscription" + // WebhooksServiceRotateSubscriptionSecretProcedure is the fully-qualified name of the + // WebhooksService's RotateSubscriptionSecret RPC. + WebhooksServiceRotateSubscriptionSecretProcedure = "/aes.webhooks.v1.WebhooksService/RotateSubscriptionSecret" // WebhooksServiceListDeliveriesProcedure is the fully-qualified name of the WebhooksService's // ListDeliveries RPC. WebhooksServiceListDeliveriesProcedure = "/aes.webhooks.v1.WebhooksService/ListDeliveries" @@ -60,6 +63,7 @@ type WebhooksServiceClient interface { ListSubscriptions(context.Context, *connect.Request[v1.ListSubscriptionsRequest]) (*connect.Response[v1.ListSubscriptionsResponse], error) UpdateSubscription(context.Context, *connect.Request[v1.UpdateSubscriptionRequest]) (*connect.Response[v1.UpdateSubscriptionResponse], error) DeleteSubscription(context.Context, *connect.Request[v1.DeleteSubscriptionRequest]) (*connect.Response[v1.DeleteSubscriptionResponse], error) + RotateSubscriptionSecret(context.Context, *connect.Request[v1.RotateSubscriptionSecretRequest]) (*connect.Response[v1.RotateSubscriptionSecretResponse], error) // ListDeliveries shows recent attempts for a subscription — status code, response body // snippet, retry count. Bounded ring (last 100 per subscription). ListDeliveries(context.Context, *connect.Request[v1.ListDeliveriesRequest]) (*connect.Response[v1.ListDeliveriesResponse], error) @@ -106,6 +110,12 @@ func NewWebhooksServiceClient(httpClient connect.HTTPClient, baseURL string, opt connect.WithSchema(webhooksServiceMethods.ByName("DeleteSubscription")), connect.WithClientOptions(opts...), ), + rotateSubscriptionSecret: connect.NewClient[v1.RotateSubscriptionSecretRequest, v1.RotateSubscriptionSecretResponse]( + httpClient, + baseURL+WebhooksServiceRotateSubscriptionSecretProcedure, + connect.WithSchema(webhooksServiceMethods.ByName("RotateSubscriptionSecret")), + connect.WithClientOptions(opts...), + ), listDeliveries: connect.NewClient[v1.ListDeliveriesRequest, v1.ListDeliveriesResponse]( httpClient, baseURL+WebhooksServiceListDeliveriesProcedure, @@ -117,12 +127,13 @@ func NewWebhooksServiceClient(httpClient connect.HTTPClient, baseURL string, opt // webhooksServiceClient implements WebhooksServiceClient. type webhooksServiceClient struct { - createSubscription *connect.Client[v1.CreateSubscriptionRequest, v1.CreateSubscriptionResponse] - getSubscription *connect.Client[v1.GetSubscriptionRequest, v1.GetSubscriptionResponse] - listSubscriptions *connect.Client[v1.ListSubscriptionsRequest, v1.ListSubscriptionsResponse] - updateSubscription *connect.Client[v1.UpdateSubscriptionRequest, v1.UpdateSubscriptionResponse] - deleteSubscription *connect.Client[v1.DeleteSubscriptionRequest, v1.DeleteSubscriptionResponse] - listDeliveries *connect.Client[v1.ListDeliveriesRequest, v1.ListDeliveriesResponse] + createSubscription *connect.Client[v1.CreateSubscriptionRequest, v1.CreateSubscriptionResponse] + getSubscription *connect.Client[v1.GetSubscriptionRequest, v1.GetSubscriptionResponse] + listSubscriptions *connect.Client[v1.ListSubscriptionsRequest, v1.ListSubscriptionsResponse] + updateSubscription *connect.Client[v1.UpdateSubscriptionRequest, v1.UpdateSubscriptionResponse] + deleteSubscription *connect.Client[v1.DeleteSubscriptionRequest, v1.DeleteSubscriptionResponse] + rotateSubscriptionSecret *connect.Client[v1.RotateSubscriptionSecretRequest, v1.RotateSubscriptionSecretResponse] + listDeliveries *connect.Client[v1.ListDeliveriesRequest, v1.ListDeliveriesResponse] } // CreateSubscription calls aes.webhooks.v1.WebhooksService.CreateSubscription. @@ -150,6 +161,11 @@ func (c *webhooksServiceClient) DeleteSubscription(ctx context.Context, req *con return c.deleteSubscription.CallUnary(ctx, req) } +// RotateSubscriptionSecret calls aes.webhooks.v1.WebhooksService.RotateSubscriptionSecret. +func (c *webhooksServiceClient) RotateSubscriptionSecret(ctx context.Context, req *connect.Request[v1.RotateSubscriptionSecretRequest]) (*connect.Response[v1.RotateSubscriptionSecretResponse], error) { + return c.rotateSubscriptionSecret.CallUnary(ctx, req) +} + // ListDeliveries calls aes.webhooks.v1.WebhooksService.ListDeliveries. func (c *webhooksServiceClient) ListDeliveries(ctx context.Context, req *connect.Request[v1.ListDeliveriesRequest]) (*connect.Response[v1.ListDeliveriesResponse], error) { return c.listDeliveries.CallUnary(ctx, req) @@ -162,6 +178,7 @@ type WebhooksServiceHandler interface { ListSubscriptions(context.Context, *connect.Request[v1.ListSubscriptionsRequest]) (*connect.Response[v1.ListSubscriptionsResponse], error) UpdateSubscription(context.Context, *connect.Request[v1.UpdateSubscriptionRequest]) (*connect.Response[v1.UpdateSubscriptionResponse], error) DeleteSubscription(context.Context, *connect.Request[v1.DeleteSubscriptionRequest]) (*connect.Response[v1.DeleteSubscriptionResponse], error) + RotateSubscriptionSecret(context.Context, *connect.Request[v1.RotateSubscriptionSecretRequest]) (*connect.Response[v1.RotateSubscriptionSecretResponse], error) // ListDeliveries shows recent attempts for a subscription — status code, response body // snippet, retry count. Bounded ring (last 100 per subscription). ListDeliveries(context.Context, *connect.Request[v1.ListDeliveriesRequest]) (*connect.Response[v1.ListDeliveriesResponse], error) @@ -204,6 +221,12 @@ func NewWebhooksServiceHandler(svc WebhooksServiceHandler, opts ...connect.Handl connect.WithSchema(webhooksServiceMethods.ByName("DeleteSubscription")), connect.WithHandlerOptions(opts...), ) + webhooksServiceRotateSubscriptionSecretHandler := connect.NewUnaryHandler( + WebhooksServiceRotateSubscriptionSecretProcedure, + svc.RotateSubscriptionSecret, + connect.WithSchema(webhooksServiceMethods.ByName("RotateSubscriptionSecret")), + connect.WithHandlerOptions(opts...), + ) webhooksServiceListDeliveriesHandler := connect.NewUnaryHandler( WebhooksServiceListDeliveriesProcedure, svc.ListDeliveries, @@ -222,6 +245,8 @@ func NewWebhooksServiceHandler(svc WebhooksServiceHandler, opts ...connect.Handl webhooksServiceUpdateSubscriptionHandler.ServeHTTP(w, r) case WebhooksServiceDeleteSubscriptionProcedure: webhooksServiceDeleteSubscriptionHandler.ServeHTTP(w, r) + case WebhooksServiceRotateSubscriptionSecretProcedure: + webhooksServiceRotateSubscriptionSecretHandler.ServeHTTP(w, r) case WebhooksServiceListDeliveriesProcedure: webhooksServiceListDeliveriesHandler.ServeHTTP(w, r) default: @@ -253,6 +278,10 @@ func (UnimplementedWebhooksServiceHandler) DeleteSubscription(context.Context, * return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.webhooks.v1.WebhooksService.DeleteSubscription is not implemented")) } +func (UnimplementedWebhooksServiceHandler) RotateSubscriptionSecret(context.Context, *connect.Request[v1.RotateSubscriptionSecretRequest]) (*connect.Response[v1.RotateSubscriptionSecretResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.webhooks.v1.WebhooksService.RotateSubscriptionSecret is not implemented")) +} + func (UnimplementedWebhooksServiceHandler) ListDeliveries(context.Context, *connect.Request[v1.ListDeliveriesRequest]) (*connect.Response[v1.ListDeliveriesResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.webhooks.v1.WebhooksService.ListDeliveries is not implemented")) } diff --git a/gen/openapi/metalhost.openapi.yaml b/gen/openapi/metalhost.openapi.yaml index decaf69..1b197c0 100644 --- a/gen/openapi/metalhost.openapi.yaml +++ b/gen/openapi/metalhost.openapi.yaml @@ -1967,12 +1967,12 @@ paths: application/json: schema: $ref: '#/components/schemas/aes.health.v1.CheckResponse' - /aes.iam.v1.IamService/AcceptInvite: + /aes.iam.v1.AutomationService/BeginGitHubSetup: post: tags: - - aes.iam.v1.IamService - summary: AcceptInvite - operationId: aes.iam.v1.IamService.AcceptInvite + - aes.iam.v1.AutomationService + summary: BeginGitHubSetup + operationId: aes.iam.v1.AutomationService.BeginGitHubSetup parameters: - name: Connect-Protocol-Version in: header @@ -1987,7 +1987,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.AcceptInviteRequest' + $ref: '#/components/schemas/aes.iam.v1.BeginGitHubSetupRequest' required: true responses: default: @@ -2001,17 +2001,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.AcceptInviteResponse' - /aes.iam.v1.IamService/AcceptMyInvite: + $ref: '#/components/schemas/aes.iam.v1.BeginGitHubSetupResponse' + /aes.iam.v1.AutomationService/CreateCredential: post: tags: - - aes.iam.v1.IamService - summary: AcceptMyInvite - description: |- - AcceptMyInvite accepts a pending invite by id while authenticated. The invite's email must - resolve to the caller's principal; on success it adds the org role binding. No token needed - (the session is the proof) — distinct from the public token-bearer AcceptInvite. - operationId: aes.iam.v1.IamService.AcceptMyInvite + - aes.iam.v1.AutomationService + summary: CreateCredential + operationId: aes.iam.v1.AutomationService.CreateCredential parameters: - name: Connect-Protocol-Version in: header @@ -2026,7 +2022,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.AcceptMyInviteRequest' + $ref: '#/components/schemas/aes.iam.v1.CreateCredentialRequest' required: true responses: default: @@ -2040,13 +2036,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.AcceptMyInviteResponse' - /aes.iam.v1.IamService/ChangePassword: + $ref: '#/components/schemas/aes.iam.v1.CreateCredentialResponse' + /aes.iam.v1.AutomationService/CreateGitHubTrust: post: tags: - - aes.iam.v1.IamService - summary: ChangePassword - operationId: aes.iam.v1.IamService.ChangePassword + - aes.iam.v1.AutomationService + summary: CreateGitHubTrust + operationId: aes.iam.v1.AutomationService.CreateGitHubTrust parameters: - name: Connect-Protocol-Version in: header @@ -2061,7 +2057,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ChangePasswordRequest' + $ref: '#/components/schemas/aes.iam.v1.CreateGitHubTrustRequest' required: true responses: default: @@ -2075,13 +2071,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ChangePasswordResponse' - /aes.iam.v1.IamService/CompleteOidcLogin: + $ref: '#/components/schemas/aes.iam.v1.CreateGitHubTrustResponse' + /aes.iam.v1.AutomationService/CreateServiceAccount: post: tags: - - aes.iam.v1.IamService - summary: CompleteOidcLogin - operationId: aes.iam.v1.IamService.CompleteOidcLogin + - aes.iam.v1.AutomationService + summary: CreateServiceAccount + operationId: aes.iam.v1.AutomationService.CreateServiceAccount parameters: - name: Connect-Protocol-Version in: header @@ -2096,7 +2092,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.CompleteOidcLoginRequest' + $ref: '#/components/schemas/aes.iam.v1.CreateServiceAccountRequest' required: true responses: default: @@ -2110,17 +2106,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.CompleteOidcLoginResponse' - /aes.iam.v1.IamService/CreateApiKey: + $ref: '#/components/schemas/aes.iam.v1.CreateServiceAccountResponse' + /aes.iam.v1.AutomationService/DeleteGitHubTrust: post: tags: - - aes.iam.v1.IamService - summary: CreateApiKey - description: |- - CreateApiKey mints a new API key for the calling principal. The secret is returned ONCE and - never persisted in plaintext — store it immediately. The key inherits the caller's principal - and a chosen default_project (the caller must have access to it). - operationId: aes.iam.v1.IamService.CreateApiKey + - aes.iam.v1.AutomationService + summary: DeleteGitHubTrust + operationId: aes.iam.v1.AutomationService.DeleteGitHubTrust parameters: - name: Connect-Protocol-Version in: header @@ -2135,7 +2127,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.CreateApiKeyRequest' + $ref: '#/components/schemas/aes.iam.v1.DeleteGitHubTrustRequest' required: true responses: default: @@ -2149,21 +2141,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.CreateApiKeyResponse' - /aes.iam.v1.IamService/CreateWorkspace: + $ref: '#/components/schemas/aes.iam.v1.DeleteGitHubTrustResponse' + /aes.iam.v1.AutomationService/DeleteServiceAccount: post: tags: - - aes.iam.v1.IamService - summary: CreateWorkspace - description: |- - CreateWorkspace is the self-serve org bootstrap the onboarding wizard calls for an - authenticated-but-org-less user (the state an SSO/OIDC first-login lands in — the identity - is created at login, but the user names their workspace here). It creates the org chain - (organization + quota defaults + billing account + USD wallet + organization.admin binding - for the caller) under the caller's chosen slug, in one transaction. Idempotent-safe: a slug - already taken by a different account is refused (the takeover gate). The chosen slug is - validated against the same DNS-1035 + reserved rules CheckSlugAvailable reports on. - operationId: aes.iam.v1.IamService.CreateWorkspace + - aes.iam.v1.AutomationService + summary: DeleteServiceAccount + operationId: aes.iam.v1.AutomationService.DeleteServiceAccount parameters: - name: Connect-Protocol-Version in: header @@ -2178,7 +2162,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.CreateWorkspaceRequest' + $ref: '#/components/schemas/aes.iam.v1.DeleteServiceAccountRequest' required: true responses: default: @@ -2192,14 +2176,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.CreateWorkspaceResponse' - /aes.iam.v1.IamService/DeclineMyInvite: + $ref: '#/components/schemas/aes.iam.v1.DeleteServiceAccountResponse' + /aes.iam.v1.AutomationService/ExchangeGitHubToken: post: tags: - - aes.iam.v1.IamService - summary: DeclineMyInvite - description: DeclineMyInvite marks one of the caller's pending invites DECLINED. - operationId: aes.iam.v1.IamService.DeclineMyInvite + - aes.iam.v1.AutomationService + summary: ExchangeGitHubToken + description: Authenticates the signed GitHub assertion, not a Metalhost session. + operationId: aes.iam.v1.AutomationService.ExchangeGitHubToken parameters: - name: Connect-Protocol-Version in: header @@ -2214,7 +2198,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.DeclineMyInviteRequest' + $ref: '#/components/schemas/aes.iam.v1.ExchangeGitHubTokenRequest' required: true responses: default: @@ -2228,20 +2212,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.DeclineMyInviteResponse' - /aes.iam.v1.IamService/EnrollMFA: + $ref: '#/components/schemas/aes.iam.v1.ExchangeGitHubTokenResponse' + /aes.iam.v1.AutomationService/GetGitHubSetup: post: tags: - - aes.iam.v1.IamService - summary: EnrollMFA - description: |- - MFA / TOTP. EnrollMFA returns a fresh shared secret + provisioning URI (otpauth://) the - caller's authenticator app reads as a QR code; the credential starts in PENDING state and - does nothing until VerifyMFAEnrollment confirms a valid TOTP code. ListMFADevices reports - the principal's enrolled devices; RevokeMFADevice deactivates one. Recovery codes are - issued on first verification (one-shot, hashed at rest) so a lost authenticator doesn't - lock the user out — they're returned in VerifyMFAEnrollmentResponse.recovery_codes. - operationId: aes.iam.v1.IamService.EnrollMFA + - aes.iam.v1.AutomationService + summary: GetGitHubSetup + operationId: aes.iam.v1.AutomationService.GetGitHubSetup parameters: - name: Connect-Protocol-Version in: header @@ -2256,7 +2233,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.EnrollMFARequest' + $ref: '#/components/schemas/aes.iam.v1.GetGitHubSetupRequest' required: true responses: default: @@ -2270,17 +2247,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.EnrollMFAResponse' - /aes.iam.v1.IamService/GetCallerIdentity: + $ref: '#/components/schemas/aes.iam.v1.GetGitHubSetupResponse' + /aes.iam.v1.AutomationService/GetServiceAccount: post: tags: - - aes.iam.v1.IamService - summary: GetCallerIdentity - description: |- - GetCallerIdentity returns the principal, default project, and project scope (if any) of - the calling key/token. Useful for clients (CLI / web) that want to display "logged in as" - without re-deriving from the bearer token. - operationId: aes.iam.v1.IamService.GetCallerIdentity + - aes.iam.v1.AutomationService + summary: GetServiceAccount + operationId: aes.iam.v1.AutomationService.GetServiceAccount parameters: - name: Connect-Protocol-Version in: header @@ -2295,7 +2268,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.GetCallerIdentityRequest' + $ref: '#/components/schemas/aes.iam.v1.GetServiceAccountRequest' required: true responses: default: @@ -2309,19 +2282,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.GetCallerIdentityResponse' - /aes.iam.v1.IamService/GetUser: + $ref: '#/components/schemas/aes.iam.v1.GetServiceAccountResponse' + /aes.iam.v1.AutomationService/ListCapabilities: post: tags: - - aes.iam.v1.IamService - summary: GetUser - description: |- - Profile management. GetUser returns the user's display info (callable for any user the - caller can read; passing an empty name returns the caller's own profile). UpdateUser - changes mutable profile fields. ChangePassword rotates the bcrypt hash after verifying - the current one. RequestEmailChange swaps users.email immediately and fires a heads-up - to the previous address (the session itself is the auth — no second-leg confirmation). - operationId: aes.iam.v1.IamService.GetUser + - aes.iam.v1.AutomationService + summary: ListCapabilities + operationId: aes.iam.v1.AutomationService.ListCapabilities parameters: - name: Connect-Protocol-Version in: header @@ -2336,7 +2303,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.GetUserRequest' + $ref: '#/components/schemas/aes.iam.v1.ListCapabilitiesRequest' required: true responses: default: @@ -2350,20 +2317,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.GetUserResponse' - /aes.iam.v1.IamService/ImportGitHubSshKeys: + $ref: '#/components/schemas/aes.iam.v1.ListCapabilitiesResponse' + /aes.iam.v1.AutomationService/ListCredentials: post: tags: - - aes.iam.v1.IamService - summary: ImportGitHubSshKeys - description: |- - ImportGitHubSshKeys fetches the user's public SSH keys from GitHub's public endpoint - (https://github.com/.keys, no auth required) and bulk-creates SSHKey rows under - the target project. Onboarding shortcut: the wizard offers "Import from GitHub" so users - who signed up via the GitHub OAuth flow don't have to paste keys manually. Existing keys - with the same fingerprint are skipped; only new keys are created. Returns the list of - keys actually created (display_name, fingerprint) for UI feedback. - operationId: aes.iam.v1.IamService.ImportGitHubSshKeys + - aes.iam.v1.AutomationService + summary: ListCredentials + operationId: aes.iam.v1.AutomationService.ListCredentials parameters: - name: Connect-Protocol-Version in: header @@ -2378,7 +2338,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ImportGitHubSshKeysRequest' + $ref: '#/components/schemas/aes.iam.v1.ListCredentialsRequest' required: true responses: default: @@ -2392,17 +2352,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ImportGitHubSshKeysResponse' - /aes.iam.v1.IamService/InviteOrgMember: + $ref: '#/components/schemas/aes.iam.v1.ListCredentialsResponse' + /aes.iam.v1.AutomationService/ListGitHubTrusts: post: tags: - - aes.iam.v1.IamService - summary: InviteOrgMember - description: |- - Org membership management. InviteOrgMember issues a one-time accept token (caller is the - org admin); AcceptInvite is public (token-bearer) and creates the user + IAM binding when - redeemed. ListOrgMembers / RemoveOrgMember close the loop on the membership lifecycle. - operationId: aes.iam.v1.IamService.InviteOrgMember + - aes.iam.v1.AutomationService + summary: ListGitHubTrusts + operationId: aes.iam.v1.AutomationService.ListGitHubTrusts parameters: - name: Connect-Protocol-Version in: header @@ -2417,7 +2373,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.InviteOrgMemberRequest' + $ref: '#/components/schemas/aes.iam.v1.ListGitHubTrustsRequest' required: true responses: default: @@ -2431,18 +2387,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.InviteOrgMemberResponse' - /aes.iam.v1.IamService/LinkOidcProvider: + $ref: '#/components/schemas/aes.iam.v1.ListGitHubTrustsResponse' + /aes.iam.v1.AutomationService/ListServiceAccounts: post: tags: - - aes.iam.v1.IamService - summary: LinkOidcProvider - description: |- - LinkOidcProvider attaches an OIDC identity (Google / GitHub / etc.) to the calling user. - After a successful link, that identity's CompleteOidcLogin will resolve to the same user. - Returns the same authorize_url + state shape as StartOidcLogin; the linking is finalized - when the caller's browser comes back through the standard CompleteOidcLogin path. - operationId: aes.iam.v1.IamService.LinkOidcProvider + - aes.iam.v1.AutomationService + summary: ListServiceAccounts + operationId: aes.iam.v1.AutomationService.ListServiceAccounts parameters: - name: Connect-Protocol-Version in: header @@ -2457,7 +2408,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.LinkOidcProviderRequest' + $ref: '#/components/schemas/aes.iam.v1.ListServiceAccountsRequest' required: true responses: default: @@ -2471,16 +2422,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.LinkOidcProviderResponse' - /aes.iam.v1.IamService/ListApiKeys: + $ref: '#/components/schemas/aes.iam.v1.ListServiceAccountsResponse' + /aes.iam.v1.AutomationService/RevokeCredential: post: tags: - - aes.iam.v1.IamService - summary: ListApiKeys - description: |- - ListApiKeys lists keys owned by the calling principal. Returns metadata (display name, prefix, - create/expires/revoked timestamps) — never the secret. - operationId: aes.iam.v1.IamService.ListApiKeys + - aes.iam.v1.AutomationService + summary: RevokeCredential + operationId: aes.iam.v1.AutomationService.RevokeCredential parameters: - name: Connect-Protocol-Version in: header @@ -2495,7 +2443,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListApiKeysRequest' + $ref: '#/components/schemas/aes.iam.v1.RevokeCredentialRequest' required: true responses: default: @@ -2509,13 +2457,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListApiKeysResponse' - /aes.iam.v1.IamService/ListMFADevices: + $ref: '#/components/schemas/aes.iam.v1.RevokeCredentialResponse' + /aes.iam.v1.AutomationService/RotateCredential: post: tags: - - aes.iam.v1.IamService - summary: ListMFADevices - operationId: aes.iam.v1.IamService.ListMFADevices + - aes.iam.v1.AutomationService + summary: RotateCredential + operationId: aes.iam.v1.AutomationService.RotateCredential parameters: - name: Connect-Protocol-Version in: header @@ -2530,7 +2478,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListMFADevicesRequest' + $ref: '#/components/schemas/aes.iam.v1.RotateCredentialRequest' required: true responses: default: @@ -2544,16 +2492,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListMFADevicesResponse' - /aes.iam.v1.IamService/ListMyInvites: + $ref: '#/components/schemas/aes.iam.v1.RotateCredentialResponse' + /aes.iam.v1.AutomationService/SetGitHubTrustState: post: tags: - - aes.iam.v1.IamService - summary: ListMyInvites - description: |- - ListMyInvites returns PENDING, unexpired org invites addressed to the caller's email — the - in-app invitations inbox (no email round-trip needed to find/accept them). - operationId: aes.iam.v1.IamService.ListMyInvites + - aes.iam.v1.AutomationService + summary: SetGitHubTrustState + operationId: aes.iam.v1.AutomationService.SetGitHubTrustState parameters: - name: Connect-Protocol-Version in: header @@ -2568,7 +2513,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListMyInvitesRequest' + $ref: '#/components/schemas/aes.iam.v1.SetGitHubTrustStateRequest' required: true responses: default: @@ -2582,17 +2527,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListMyInvitesResponse' - /aes.iam.v1.IamService/ListMyOrganizations: + $ref: '#/components/schemas/aes.iam.v1.SetGitHubTrustStateResponse' + /aes.iam.v1.AutomationService/SetServiceAccountState: post: tags: - - aes.iam.v1.IamService - summary: ListMyOrganizations - description: |- - ── Self-service multi-org (the org switcher + in-app invites) ──────────────────────────── - ListMyOrganizations returns every org the caller is a member of, with the caller's role + - the org's state. Backs the org switcher (and the account page's memberships list). - operationId: aes.iam.v1.IamService.ListMyOrganizations + - aes.iam.v1.AutomationService + summary: SetServiceAccountState + operationId: aes.iam.v1.AutomationService.SetServiceAccountState parameters: - name: Connect-Protocol-Version in: header @@ -2607,7 +2548,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListMyOrganizationsRequest' + $ref: '#/components/schemas/aes.iam.v1.SetServiceAccountStateRequest' required: true responses: default: @@ -2621,20 +2562,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListMyOrganizationsResponse' - /aes.iam.v1.IamService/ListNotifications: + $ref: '#/components/schemas/aes.iam.v1.SetServiceAccountStateResponse' + /aes.iam.v1.AutomationService/SubmitGitHubSetup: post: tags: - - aes.iam.v1.IamService - summary: ListNotifications - description: |- - ListNotifications returns customer-notable events for the bell-icon feed (top-up - succeeded, VM op completed, spending alert triggered, etc.). Backed by audit_events - filtered through the same notify_in_app classifier used by ListOrgActivity, joined to - notification_reads so the caller knows what they've already seen. The 30-day window is - enforced server-side. Use ListOrgActivity for the full audit log; this is the curated - notification subset. - operationId: aes.iam.v1.IamService.ListNotifications + - aes.iam.v1.AutomationService + summary: SubmitGitHubSetup + description: Verifies claims for a pending setup; never issues a credential or creates trust. + operationId: aes.iam.v1.AutomationService.SubmitGitHubSetup parameters: - name: Connect-Protocol-Version in: header @@ -2649,7 +2584,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListNotificationsRequest' + $ref: '#/components/schemas/aes.iam.v1.SubmitGitHubSetupRequest' required: true responses: default: @@ -2663,13 +2598,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListNotificationsResponse' - /aes.iam.v1.IamService/ListOrgMembers: + $ref: '#/components/schemas/aes.iam.v1.SubmitGitHubSetupResponse' + /aes.iam.v1.AutomationService/UpdateGitHubTrust: post: tags: - - aes.iam.v1.IamService - summary: ListOrgMembers - operationId: aes.iam.v1.IamService.ListOrgMembers + - aes.iam.v1.AutomationService + summary: UpdateGitHubTrust + operationId: aes.iam.v1.AutomationService.UpdateGitHubTrust parameters: - name: Connect-Protocol-Version in: header @@ -2684,7 +2619,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListOrgMembersRequest' + $ref: '#/components/schemas/aes.iam.v1.UpdateGitHubTrustRequest' required: true responses: default: @@ -2698,16 +2633,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListOrgMembersResponse' - /aes.iam.v1.IamService/ListPendingInvites: + $ref: '#/components/schemas/aes.iam.v1.UpdateGitHubTrustResponse' + /aes.iam.v1.AutomationService/UpdateServiceAccount: post: tags: - - aes.iam.v1.IamService - summary: ListPendingInvites - description: |- - ListPendingInvites surfaces unaccepted invites for an org so admins can resend or revoke. - Filters to PENDING + not-yet-expired. Caller must hold admin.organization. - operationId: aes.iam.v1.IamService.ListPendingInvites + - aes.iam.v1.AutomationService + summary: UpdateServiceAccount + operationId: aes.iam.v1.AutomationService.UpdateServiceAccount parameters: - name: Connect-Protocol-Version in: header @@ -2722,7 +2654,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListPendingInvitesRequest' + $ref: '#/components/schemas/aes.iam.v1.UpdateServiceAccountRequest' required: true responses: default: @@ -2736,20 +2668,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListPendingInvitesResponse' - /aes.iam.v1.IamService/ListSessions: + $ref: '#/components/schemas/aes.iam.v1.UpdateServiceAccountResponse' + /aes.iam.v1.IamService/AcceptInvite: post: tags: - aes.iam.v1.IamService - summary: ListSessions - description: |- - Session management. Sessions are the metadata around interactive logins (OIDC, signup, - invite-accept) — each one is linked to an API key. ListSessions shows the caller their - active sessions; RevokeSession invalidates one (revokes the linked API key); RevokeAll - revokes every session except the one calling (so users can "log out everywhere else" - without locking themselves out). Programmatic API keys created via CreateApiKey are NOT - sessions and don't appear here — they're managed via ListApiKeys / RevokeApiKey. - operationId: aes.iam.v1.IamService.ListSessions + summary: AcceptInvite + operationId: aes.iam.v1.IamService.AcceptInvite parameters: - name: Connect-Protocol-Version in: header @@ -2764,7 +2689,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListSessionsRequest' + $ref: '#/components/schemas/aes.iam.v1.AcceptInviteRequest' required: true responses: default: @@ -2778,19 +2703,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ListSessionsResponse' - /aes.iam.v1.IamService/Login: + $ref: '#/components/schemas/aes.iam.v1.AcceptInviteResponse' + /aes.iam.v1.IamService/AcceptMyInvite: post: tags: - aes.iam.v1.IamService - summary: Login + summary: AcceptMyInvite description: |- - Login authenticates an email/password pair and returns a session API key. For OIDC users - (no password set), Login fails with FailedPrecondition; the caller should use the OIDC - flow instead. When the user's org has require_mfa=TRUE AND the user has an ACTIVE TOTP - device, the response contains only an mfa_challenge_token; the caller must finish via - SubmitMFAChallenge (P0-4). - operationId: aes.iam.v1.IamService.Login + AcceptMyInvite accepts a pending invite by id while authenticated. The invite's email must + resolve to the caller's principal; on success it adds the org role binding. No token needed + (the session is the proof) — distinct from the public token-bearer AcceptInvite. + operationId: aes.iam.v1.IamService.AcceptMyInvite parameters: - name: Connect-Protocol-Version in: header @@ -2805,7 +2728,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.LoginRequest' + $ref: '#/components/schemas/aes.iam.v1.AcceptMyInviteRequest' required: true responses: default: @@ -2819,18 +2742,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.LoginResponse' - /aes.iam.v1.IamService/Logout: + $ref: '#/components/schemas/aes.iam.v1.AcceptMyInviteResponse' + /aes.iam.v1.IamService/ChangePassword: post: tags: - aes.iam.v1.IamService - summary: Logout - description: |- - Logout revokes the calling session + its API key in one shot. Distinct from RevokeSession - (which takes a session id) because the SPA's session cookie is HttpOnly — JS can't read - the session id to pass into RevokeSession. The gateway clears the mh_session + - mh_signed_in cookies on a successful response. - operationId: aes.iam.v1.IamService.Logout + summary: ChangePassword + operationId: aes.iam.v1.IamService.ChangePassword parameters: - name: Connect-Protocol-Version in: header @@ -2845,7 +2763,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.LogoutRequest' + $ref: '#/components/schemas/aes.iam.v1.ChangePasswordRequest' required: true responses: default: @@ -2859,17 +2777,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.LogoutResponse' - /aes.iam.v1.IamService/MarkNotificationsRead: + $ref: '#/components/schemas/aes.iam.v1.ChangePasswordResponse' + /aes.iam.v1.IamService/CompleteOidcLogin: post: tags: - aes.iam.v1.IamService - summary: MarkNotificationsRead - description: |- - MarkNotificationsRead upserts notification_reads rows so the bell badge count clears. - Pass `mark_all=true` to mark every visible notification read; otherwise pass explicit - event ids. Idempotent — re-marking an already-read row is a no-op. - operationId: aes.iam.v1.IamService.MarkNotificationsRead + summary: CompleteOidcLogin + operationId: aes.iam.v1.IamService.CompleteOidcLogin parameters: - name: Connect-Protocol-Version in: header @@ -2884,7 +2798,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.MarkNotificationsReadRequest' + $ref: '#/components/schemas/aes.iam.v1.CompleteOidcLoginRequest' required: true responses: default: @@ -2898,16 +2812,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.MarkNotificationsReadResponse' - /aes.iam.v1.IamService/RegenerateRecoveryCodes: + $ref: '#/components/schemas/aes.iam.v1.CompleteOidcLoginResponse' + /aes.iam.v1.IamService/CreateApiKey: post: tags: - aes.iam.v1.IamService - summary: RegenerateRecoveryCodes + summary: CreateApiKey description: |- - RegenerateRecoveryCodes replaces the caller's recovery-code set with a fresh one. - Requires a current TOTP code. Returned ONCE — store immediately. - operationId: aes.iam.v1.IamService.RegenerateRecoveryCodes + CreateApiKey mints a new API key for the calling principal. The secret is returned ONCE and + never persisted in plaintext — store it immediately. The key inherits the caller's principal + and a chosen default_project (the caller must have access to it). + operationId: aes.iam.v1.IamService.CreateApiKey parameters: - name: Connect-Protocol-Version in: header @@ -2922,7 +2837,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RegenerateRecoveryCodesRequest' + $ref: '#/components/schemas/aes.iam.v1.CreateApiKeyRequest' required: true responses: default: @@ -2936,13 +2851,21 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RegenerateRecoveryCodesResponse' - /aes.iam.v1.IamService/RemoveOrgMember: + $ref: '#/components/schemas/aes.iam.v1.CreateApiKeyResponse' + /aes.iam.v1.IamService/CreateWorkspace: post: tags: - aes.iam.v1.IamService - summary: RemoveOrgMember - operationId: aes.iam.v1.IamService.RemoveOrgMember + summary: CreateWorkspace + description: |- + CreateWorkspace is the self-serve org bootstrap the onboarding wizard calls for an + authenticated-but-org-less user (the state an SSO/OIDC first-login lands in — the identity + is created at login, but the user names their workspace here). It creates the org chain + (organization + quota defaults + billing account + USD wallet + organization.admin binding + for the caller) under the caller's chosen slug, in one transaction. Idempotent-safe: a slug + already taken by a different account is refused (the takeover gate). The chosen slug is + validated against the same DNS-1035 + reserved rules CheckSlugAvailable reports on. + operationId: aes.iam.v1.IamService.CreateWorkspace parameters: - name: Connect-Protocol-Version in: header @@ -2957,7 +2880,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RemoveOrgMemberRequest' + $ref: '#/components/schemas/aes.iam.v1.CreateWorkspaceRequest' required: true responses: default: @@ -2971,13 +2894,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RemoveOrgMemberResponse' - /aes.iam.v1.IamService/RequestEmailChange: + $ref: '#/components/schemas/aes.iam.v1.CreateWorkspaceResponse' + /aes.iam.v1.IamService/DeclineMyInvite: post: tags: - aes.iam.v1.IamService - summary: RequestEmailChange - operationId: aes.iam.v1.IamService.RequestEmailChange + summary: DeclineMyInvite + description: DeclineMyInvite marks one of the caller's pending invites DECLINED. + operationId: aes.iam.v1.IamService.DeclineMyInvite parameters: - name: Connect-Protocol-Version in: header @@ -2992,7 +2916,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RequestEmailChangeRequest' + $ref: '#/components/schemas/aes.iam.v1.DeclineMyInviteRequest' required: true responses: default: @@ -3006,18 +2930,20 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RequestEmailChangeResponse' - /aes.iam.v1.IamService/RequestPasswordReset: + $ref: '#/components/schemas/aes.iam.v1.DeclineMyInviteResponse' + /aes.iam.v1.IamService/EnrollMFA: post: tags: - aes.iam.v1.IamService - summary: RequestPasswordReset + summary: EnrollMFA description: |- - Password reset. RequestPasswordReset is anonymous — emits a token to the email IF it - matches an active user, but always returns ok=true (no enumeration). ResetPassword - consumes the token + sets a new bcrypt'd password + invalidates all the user's sessions - (someone who triggered a reset should re-login from scratch on the trusted device). - operationId: aes.iam.v1.IamService.RequestPasswordReset + MFA / TOTP. EnrollMFA returns a fresh shared secret + provisioning URI (otpauth://) the + caller's authenticator app reads as a QR code; the credential starts in PENDING state and + does nothing until VerifyMFAEnrollment confirms a valid TOTP code. ListMFADevices reports + the principal's enrolled devices; RevokeMFADevice deactivates one. Recovery codes are + issued on first verification (one-shot, hashed at rest) so a lost authenticator doesn't + lock the user out — they're returned in VerifyMFAEnrollmentResponse.recovery_codes. + operationId: aes.iam.v1.IamService.EnrollMFA parameters: - name: Connect-Protocol-Version in: header @@ -3032,7 +2958,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RequestPasswordResetRequest' + $ref: '#/components/schemas/aes.iam.v1.EnrollMFARequest' required: true responses: default: @@ -3046,13 +2972,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RequestPasswordResetResponse' - /aes.iam.v1.IamService/ResetPassword: + $ref: '#/components/schemas/aes.iam.v1.EnrollMFAResponse' + /aes.iam.v1.IamService/GetCallerIdentity: post: tags: - aes.iam.v1.IamService - summary: ResetPassword - operationId: aes.iam.v1.IamService.ResetPassword + summary: GetCallerIdentity + description: |- + GetCallerIdentity returns the principal, default project, and project scope (if any) of + the calling key/token. Useful for clients (CLI / web) that want to display "logged in as" + without re-deriving from the bearer token. + operationId: aes.iam.v1.IamService.GetCallerIdentity parameters: - name: Connect-Protocol-Version in: header @@ -3067,7 +2997,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ResetPasswordRequest' + $ref: '#/components/schemas/aes.iam.v1.GetCallerIdentityRequest' required: true responses: default: @@ -3081,13 +3011,19 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.ResetPasswordResponse' - /aes.iam.v1.IamService/RevokeAllOtherSessions: + $ref: '#/components/schemas/aes.iam.v1.GetCallerIdentityResponse' + /aes.iam.v1.IamService/GetUser: post: tags: - aes.iam.v1.IamService - summary: RevokeAllOtherSessions - operationId: aes.iam.v1.IamService.RevokeAllOtherSessions + summary: GetUser + description: |- + Profile management. GetUser returns the user's display info (callable for any user the + caller can read; passing an empty name returns the caller's own profile). UpdateUser + changes mutable profile fields. ChangePassword rotates the bcrypt hash after verifying + the current one. RequestEmailChange swaps users.email immediately and fires a heads-up + to the previous address (the session itself is the auth — no second-leg confirmation). + operationId: aes.iam.v1.IamService.GetUser parameters: - name: Connect-Protocol-Version in: header @@ -3102,7 +3038,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeAllOtherSessionsRequest' + $ref: '#/components/schemas/aes.iam.v1.GetUserRequest' required: true responses: default: @@ -3116,14 +3052,20 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeAllOtherSessionsResponse' - /aes.iam.v1.IamService/RevokeApiKey: + $ref: '#/components/schemas/aes.iam.v1.GetUserResponse' + /aes.iam.v1.IamService/ImportGitHubSshKeys: post: tags: - aes.iam.v1.IamService - summary: RevokeApiKey - description: RevokeApiKey invalidates a key the caller owns. Idempotent on already-revoked keys. - operationId: aes.iam.v1.IamService.RevokeApiKey + summary: ImportGitHubSshKeys + description: |- + ImportGitHubSshKeys fetches the user's public SSH keys from GitHub's public endpoint + (https://github.com/.keys, no auth required) and bulk-creates SSHKey rows under + the target project. Onboarding shortcut: the wizard offers "Import from GitHub" so users + who signed up via the GitHub OAuth flow don't have to paste keys manually. Existing keys + with the same fingerprint are skipped; only new keys are created. Returns the list of + keys actually created (display_name, fingerprint) for UI feedback. + operationId: aes.iam.v1.IamService.ImportGitHubSshKeys parameters: - name: Connect-Protocol-Version in: header @@ -3138,7 +3080,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeApiKeyRequest' + $ref: '#/components/schemas/aes.iam.v1.ImportGitHubSshKeysRequest' required: true responses: default: @@ -3152,16 +3094,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeApiKeyResponse' - /aes.iam.v1.IamService/RevokeInvite: + $ref: '#/components/schemas/aes.iam.v1.ImportGitHubSshKeysResponse' + /aes.iam.v1.IamService/InviteOrgMember: post: tags: - aes.iam.v1.IamService - summary: RevokeInvite + summary: InviteOrgMember description: |- - RevokeInvite marks a pending invite REVOKED so the token can't be accepted later. - Idempotent on already-revoked rows. Caller must hold admin.organization. - operationId: aes.iam.v1.IamService.RevokeInvite + Org membership management. InviteOrgMember issues a one-time accept token (caller is the + org admin); AcceptInvite is public (token-bearer) and creates the user + IAM binding when + redeemed. ListOrgMembers / RemoveOrgMember close the loop on the membership lifecycle. + operationId: aes.iam.v1.IamService.InviteOrgMember parameters: - name: Connect-Protocol-Version in: header @@ -3176,7 +3119,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeInviteRequest' + $ref: '#/components/schemas/aes.iam.v1.InviteOrgMemberRequest' required: true responses: default: @@ -3190,13 +3133,18 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeInviteResponse' - /aes.iam.v1.IamService/RevokeMFADevice: + $ref: '#/components/schemas/aes.iam.v1.InviteOrgMemberResponse' + /aes.iam.v1.IamService/LinkOidcProvider: post: tags: - aes.iam.v1.IamService - summary: RevokeMFADevice - operationId: aes.iam.v1.IamService.RevokeMFADevice + summary: LinkOidcProvider + description: |- + LinkOidcProvider attaches an OIDC identity (Google / GitHub / etc.) to the calling user. + After a successful link, that identity's CompleteOidcLogin will resolve to the same user. + Returns the same authorize_url + state shape as StartOidcLogin; the linking is finalized + when the caller's browser comes back through the standard CompleteOidcLogin path. + operationId: aes.iam.v1.IamService.LinkOidcProvider parameters: - name: Connect-Protocol-Version in: header @@ -3211,7 +3159,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeMFADeviceRequest' + $ref: '#/components/schemas/aes.iam.v1.LinkOidcProviderRequest' required: true responses: default: @@ -3225,13 +3173,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeMFADeviceResponse' - /aes.iam.v1.IamService/RevokeSession: + $ref: '#/components/schemas/aes.iam.v1.LinkOidcProviderResponse' + /aes.iam.v1.IamService/ListApiKeys: post: tags: - aes.iam.v1.IamService - summary: RevokeSession - operationId: aes.iam.v1.IamService.RevokeSession + summary: ListApiKeys + description: |- + ListApiKeys lists keys owned by the calling principal. Returns metadata (display name, prefix, + create/expires/revoked timestamps) — never the secret. + operationId: aes.iam.v1.IamService.ListApiKeys parameters: - name: Connect-Protocol-Version in: header @@ -3246,7 +3197,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeSessionRequest' + $ref: '#/components/schemas/aes.iam.v1.ListApiKeysRequest' required: true responses: default: @@ -3260,16 +3211,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RevokeSessionResponse' - /aes.iam.v1.IamService/RotateApiKey: + $ref: '#/components/schemas/aes.iam.v1.ListApiKeysResponse' + /aes.iam.v1.IamService/ListMFADevices: post: tags: - aes.iam.v1.IamService - summary: RotateApiKey - description: |- - RotateApiKey atomically issues a new key + revokes the old one in a single call. Use - instead of revoke-then-create to avoid the window where neither key is valid. - operationId: aes.iam.v1.IamService.RotateApiKey + summary: ListMFADevices + operationId: aes.iam.v1.IamService.ListMFADevices parameters: - name: Connect-Protocol-Version in: header @@ -3284,7 +3232,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RotateApiKeyRequest' + $ref: '#/components/schemas/aes.iam.v1.ListMFADevicesRequest' required: true responses: default: @@ -3298,18 +3246,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.RotateApiKeyResponse' - /aes.iam.v1.IamService/SetInitialPassword: + $ref: '#/components/schemas/aes.iam.v1.ListMFADevicesResponse' + /aes.iam.v1.IamService/ListMyInvites: post: tags: - aes.iam.v1.IamService - summary: SetInitialPassword + summary: ListMyInvites description: |- - SetInitialPassword sets a password on an account that has none (typical: invite-accepted - user who hasn't linked GitHub yet). Only allowed when password_hash is empty AND the - caller has no OIDC identities — established accounts use ChangePassword instead. Caller - must be authenticated (the AcceptInvite session token works). - operationId: aes.iam.v1.IamService.SetInitialPassword + ListMyInvites returns PENDING, unexpired org invites addressed to the caller's email — the + in-app invitations inbox (no email round-trip needed to find/accept them). + operationId: aes.iam.v1.IamService.ListMyInvites parameters: - name: Connect-Protocol-Version in: header @@ -3324,7 +3270,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.SetInitialPasswordRequest' + $ref: '#/components/schemas/aes.iam.v1.ListMyInvitesRequest' required: true responses: default: @@ -3338,18 +3284,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.SetInitialPasswordResponse' - /aes.iam.v1.IamService/SignUp: + $ref: '#/components/schemas/aes.iam.v1.ListMyInvitesResponse' + /aes.iam.v1.IamService/ListMyOrganizations: post: tags: - aes.iam.v1.IamService - summary: SignUp + summary: ListMyOrganizations description: |- - SignUp self-provisions a new tenant: creates an organization, a default project, an IAM - binding marking the caller as admin of their org, and a fresh API key. Public (no auth) — - see docs/SIGNUP_PRODUCTION_HARDENING.md for the invite-gate / email-verification / OIDC - path that has to land before exposing this through a public gateway. - operationId: aes.iam.v1.IamService.SignUp + ── Self-service multi-org (the org switcher + in-app invites) ──────────────────────────── + ListMyOrganizations returns every org the caller is a member of, with the caller's role + + the org's state. Backs the org switcher (and the account page's memberships list). + operationId: aes.iam.v1.IamService.ListMyOrganizations parameters: - name: Connect-Protocol-Version in: header @@ -3364,7 +3309,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.SignUpRequest' + $ref: '#/components/schemas/aes.iam.v1.ListMyOrganizationsRequest' required: true responses: default: @@ -3378,19 +3323,20 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.SignUpResponse' - /aes.iam.v1.IamService/StartOidcLogin: + $ref: '#/components/schemas/aes.iam.v1.ListMyOrganizationsResponse' + /aes.iam.v1.IamService/ListNotifications: post: tags: - aes.iam.v1.IamService - summary: StartOidcLogin + summary: ListNotifications description: |- - OIDC customer login flow. StartOidcLogin returns the IdP authorize URL the customer's - browser redirects to (with state + nonce). After the IdP redirects back to Metalhost's - /oauth/callback, the gateway calls CompleteOidcLogin with the authorization code; we - exchange it with the IdP, validate the ID token, find-or-create the user, and mint an - API key for the session. - operationId: aes.iam.v1.IamService.StartOidcLogin + ListNotifications returns customer-notable events for the bell-icon feed (top-up + succeeded, VM op completed, spending alert triggered, etc.). Backed by audit_events + filtered through the same notify_in_app classifier used by ListOrgActivity, joined to + notification_reads so the caller knows what they've already seen. The 30-day window is + enforced server-side. Use ListOrgActivity for the full audit log; this is the curated + notification subset. + operationId: aes.iam.v1.IamService.ListNotifications parameters: - name: Connect-Protocol-Version in: header @@ -3405,7 +3351,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.StartOidcLoginRequest' + $ref: '#/components/schemas/aes.iam.v1.ListNotificationsRequest' required: true responses: default: @@ -3419,19 +3365,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.StartOidcLoginResponse' - /aes.iam.v1.IamService/SubmitMFAChallenge: + $ref: '#/components/schemas/aes.iam.v1.ListNotificationsResponse' + /aes.iam.v1.IamService/ListOrgMembers: post: tags: - aes.iam.v1.IamService - summary: SubmitMFAChallenge - description: |- - SubmitMFAChallenge completes a two-leg login by validating a TOTP code (or single-use - recovery code) against the principal's enrolled MFA devices. Consumes the challenge token - returned by Login or CompleteOidcLogin and mints the session API key. 5-minute TTL, - single-use on success, max 5 wrong attempts before the challenge is invalidated and the - caller must restart from Login (P0-4). - operationId: aes.iam.v1.IamService.SubmitMFAChallenge + summary: ListOrgMembers + operationId: aes.iam.v1.IamService.ListOrgMembers parameters: - name: Connect-Protocol-Version in: header @@ -3446,7 +3386,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.SubmitMFAChallengeRequest' + $ref: '#/components/schemas/aes.iam.v1.ListOrgMembersRequest' required: true responses: default: @@ -3460,16 +3400,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.SubmitMFAChallengeResponse' - /aes.iam.v1.IamService/UpdateOrgMemberRole: + $ref: '#/components/schemas/aes.iam.v1.ListOrgMembersResponse' + /aes.iam.v1.IamService/ListPendingInvites: post: tags: - aes.iam.v1.IamService - summary: UpdateOrgMemberRole + summary: ListPendingInvites description: |- - UpdateOrgMemberRole swaps a member's role binding without forcing a remove+re-invite. - Caller must hold admin.organization. Same role validation as InviteOrgMember. - operationId: aes.iam.v1.IamService.UpdateOrgMemberRole + ListPendingInvites surfaces unaccepted invites for an org so admins can resend or revoke. + Filters to PENDING + not-yet-expired. Caller must hold admin.organization. + operationId: aes.iam.v1.IamService.ListPendingInvites parameters: - name: Connect-Protocol-Version in: header @@ -3484,7 +3424,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.UpdateOrgMemberRoleRequest' + $ref: '#/components/schemas/aes.iam.v1.ListPendingInvitesRequest' required: true responses: default: @@ -3498,15 +3438,22 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.UpdateOrgMemberRoleResponse' - /aes.iam.v1.IamService/UpdateUser: + $ref: '#/components/schemas/aes.iam.v1.ListPendingInvitesResponse' + /aes.iam.v1.IamService/ListSessions: post: tags: - aes.iam.v1.IamService - summary: UpdateUser - operationId: aes.iam.v1.IamService.UpdateUser - parameters: - - name: Connect-Protocol-Version + summary: ListSessions + description: |- + Session management. Sessions are the metadata around interactive logins (OIDC, signup, + invite-accept) — each one is linked to an API key. ListSessions shows the caller their + active sessions; RevokeSession invalidates one (revokes the linked API key); RevokeAll + revokes every session except the one calling (so users can "log out everywhere else" + without locking themselves out). Programmatic API keys created via CreateApiKey are NOT + sessions and don't appear here — they're managed via ListApiKeys / RevokeApiKey. + operationId: aes.iam.v1.IamService.ListSessions + parameters: + - name: Connect-Protocol-Version in: header required: true schema: @@ -3519,7 +3466,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.UpdateUserRequest' + $ref: '#/components/schemas/aes.iam.v1.ListSessionsRequest' required: true responses: default: @@ -3533,17 +3480,19 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.UpdateUserResponse' - /aes.iam.v1.IamService/VerifyEmail: + $ref: '#/components/schemas/aes.iam.v1.ListSessionsResponse' + /aes.iam.v1.IamService/Login: post: tags: - aes.iam.v1.IamService - summary: VerifyEmail + summary: Login description: |- - VerifyEmail consumes the token sent in the verification email + creates the user, org, - default project, and initial API key. Returns the API key the CLI / web stores for - subsequent calls. - operationId: aes.iam.v1.IamService.VerifyEmail + Login authenticates an email/password pair and returns a session API key. For OIDC users + (no password set), Login fails with FailedPrecondition; the caller should use the OIDC + flow instead. When the user's org has require_mfa=TRUE AND the user has an ACTIVE TOTP + device, the response contains only an mfa_challenge_token; the caller must finish via + SubmitMFAChallenge (P0-4). + operationId: aes.iam.v1.IamService.Login parameters: - name: Connect-Protocol-Version in: header @@ -3558,7 +3507,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.VerifyEmailRequest' + $ref: '#/components/schemas/aes.iam.v1.LoginRequest' required: true responses: default: @@ -3572,13 +3521,18 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.VerifyEmailResponse' - /aes.iam.v1.IamService/VerifyMFAEnrollment: + $ref: '#/components/schemas/aes.iam.v1.LoginResponse' + /aes.iam.v1.IamService/Logout: post: tags: - aes.iam.v1.IamService - summary: VerifyMFAEnrollment - operationId: aes.iam.v1.IamService.VerifyMFAEnrollment + summary: Logout + description: |- + Logout revokes the calling session + its API key in one shot. Distinct from RevokeSession + (which takes a session id) because the SPA's session cookie is HttpOnly — JS can't read + the session id to pass into RevokeSession. The gateway clears the mh_session + + mh_signed_in cookies on a successful response. + operationId: aes.iam.v1.IamService.Logout parameters: - name: Connect-Protocol-Version in: header @@ -3593,7 +3547,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.VerifyMFAEnrollmentRequest' + $ref: '#/components/schemas/aes.iam.v1.LogoutRequest' required: true responses: default: @@ -3607,14 +3561,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.iam.v1.VerifyMFAEnrollmentResponse' - /aes.network.v1.NetworkService/AddVmToSecurityGroup: + $ref: '#/components/schemas/aes.iam.v1.LogoutResponse' + /aes.iam.v1.IamService/MarkNotificationsRead: post: tags: - - aes.network.v1.NetworkService - summary: AddVmToSecurityGroup - description: Membership is editable post-provision (no VM restart — only ACLs/address-sets change). - operationId: aes.network.v1.NetworkService.AddVmToSecurityGroup + - aes.iam.v1.IamService + summary: MarkNotificationsRead + description: |- + MarkNotificationsRead upserts notification_reads rows so the bell badge count clears. + Pass `mark_all=true` to mark every visible notification read; otherwise pass explicit + event ids. Idempotent — re-marking an already-read row is a no-op. + operationId: aes.iam.v1.IamService.MarkNotificationsRead parameters: - name: Connect-Protocol-Version in: header @@ -3629,7 +3586,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.AddVmToSecurityGroupRequest' + $ref: '#/components/schemas/aes.iam.v1.MarkNotificationsReadRequest' required: true responses: default: @@ -3643,16 +3600,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.AddVmToSecurityGroupResponse' - /aes.network.v1.NetworkService/CreateFirewallRule: + $ref: '#/components/schemas/aes.iam.v1.MarkNotificationsReadResponse' + /aes.iam.v1.IamService/RegenerateRecoveryCodes: post: tags: - - aes.network.v1.NetworkService - summary: CreateFirewallRule + - aes.iam.v1.IamService + summary: RegenerateRecoveryCodes description: |- - CreateFirewallRule opens the listed ingress ports on the VM's public IP from the listed - source CIDRs. Egress is unrestricted (blocking it breaks cloud-init / package installs / DNS). - operationId: aes.network.v1.NetworkService.CreateFirewallRule + RegenerateRecoveryCodes replaces the caller's recovery-code set with a fresh one. + Requires a current TOTP code. Returned ONCE — store immediately. + operationId: aes.iam.v1.IamService.RegenerateRecoveryCodes parameters: - name: Connect-Protocol-Version in: header @@ -3667,7 +3624,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.CreateFirewallRuleRequest' + $ref: '#/components/schemas/aes.iam.v1.RegenerateRecoveryCodesRequest' required: true responses: default: @@ -3681,13 +3638,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.CreateFirewallRuleResponse' - /aes.network.v1.NetworkService/CreateNetwork: + $ref: '#/components/schemas/aes.iam.v1.RegenerateRecoveryCodesResponse' + /aes.iam.v1.IamService/RemoveOrgMember: post: tags: - - aes.network.v1.NetworkService - summary: CreateNetwork - operationId: aes.network.v1.NetworkService.CreateNetwork + - aes.iam.v1.IamService + summary: RemoveOrgMember + operationId: aes.iam.v1.IamService.RemoveOrgMember parameters: - name: Connect-Protocol-Version in: header @@ -3702,7 +3659,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.CreateNetworkRequest' + $ref: '#/components/schemas/aes.iam.v1.RemoveOrgMemberRequest' required: true responses: default: @@ -3716,18 +3673,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.CreateNetworkResponse' - /aes.network.v1.NetworkService/CreateSecurityGroup: + $ref: '#/components/schemas/aes.iam.v1.RemoveOrgMemberResponse' + /aes.iam.v1.IamService/RequestEmailChange: post: tags: - - aes.network.v1.NetworkService - summary: CreateSecurityGroup - description: |- - Security groups — INTERNAL (east-west) network policy on the private NIC, distinct from - the public firewall above. A group is a reusable ruleset attached to >=0 VMs; rules allow - traffic from/to a CIDR or another security group. VMs talk freely by default — attaching - a group locks that VM down to its rules. - operationId: aes.network.v1.NetworkService.CreateSecurityGroup + - aes.iam.v1.IamService + summary: RequestEmailChange + operationId: aes.iam.v1.IamService.RequestEmailChange parameters: - name: Connect-Protocol-Version in: header @@ -3742,7 +3694,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.CreateSecurityGroupRequest' + $ref: '#/components/schemas/aes.iam.v1.RequestEmailChangeRequest' required: true responses: default: @@ -3756,13 +3708,18 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.CreateSecurityGroupResponse' - /aes.network.v1.NetworkService/DeleteFirewallRule: + $ref: '#/components/schemas/aes.iam.v1.RequestEmailChangeResponse' + /aes.iam.v1.IamService/RequestPasswordReset: post: tags: - - aes.network.v1.NetworkService - summary: DeleteFirewallRule - operationId: aes.network.v1.NetworkService.DeleteFirewallRule + - aes.iam.v1.IamService + summary: RequestPasswordReset + description: |- + Password reset. RequestPasswordReset is anonymous — emits a token to the email IF it + matches an active user, but always returns ok=true (no enumeration). ResetPassword + consumes the token + sets a new bcrypt'd password + invalidates all the user's sessions + (someone who triggered a reset should re-login from scratch on the trusted device). + operationId: aes.iam.v1.IamService.RequestPasswordReset parameters: - name: Connect-Protocol-Version in: header @@ -3777,7 +3734,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.DeleteFirewallRuleRequest' + $ref: '#/components/schemas/aes.iam.v1.RequestPasswordResetRequest' required: true responses: default: @@ -3791,13 +3748,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.DeleteFirewallRuleResponse' - /aes.network.v1.NetworkService/DeleteSecurityGroup: + $ref: '#/components/schemas/aes.iam.v1.RequestPasswordResetResponse' + /aes.iam.v1.IamService/ResetPassword: post: tags: - - aes.network.v1.NetworkService - summary: DeleteSecurityGroup - operationId: aes.network.v1.NetworkService.DeleteSecurityGroup + - aes.iam.v1.IamService + summary: ResetPassword + operationId: aes.iam.v1.IamService.ResetPassword parameters: - name: Connect-Protocol-Version in: header @@ -3812,7 +3769,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.DeleteSecurityGroupRequest' + $ref: '#/components/schemas/aes.iam.v1.ResetPasswordRequest' required: true responses: default: @@ -3826,13 +3783,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.DeleteSecurityGroupResponse' - /aes.network.v1.NetworkService/GetSecurityGroup: + $ref: '#/components/schemas/aes.iam.v1.ResetPasswordResponse' + /aes.iam.v1.IamService/RevokeAllOtherSessions: post: tags: - - aes.network.v1.NetworkService - summary: GetSecurityGroup - operationId: aes.network.v1.NetworkService.GetSecurityGroup + - aes.iam.v1.IamService + summary: RevokeAllOtherSessions + operationId: aes.iam.v1.IamService.RevokeAllOtherSessions parameters: - name: Connect-Protocol-Version in: header @@ -3847,7 +3804,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.GetSecurityGroupRequest' + $ref: '#/components/schemas/aes.iam.v1.RevokeAllOtherSessionsRequest' required: true responses: default: @@ -3861,13 +3818,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.GetSecurityGroupResponse' - /aes.network.v1.NetworkService/ListFirewallRules: + $ref: '#/components/schemas/aes.iam.v1.RevokeAllOtherSessionsResponse' + /aes.iam.v1.IamService/RevokeApiKey: post: tags: - - aes.network.v1.NetworkService - summary: ListFirewallRules - operationId: aes.network.v1.NetworkService.ListFirewallRules + - aes.iam.v1.IamService + summary: RevokeApiKey + description: RevokeApiKey invalidates a key the caller owns. Idempotent on already-revoked keys. + operationId: aes.iam.v1.IamService.RevokeApiKey parameters: - name: Connect-Protocol-Version in: header @@ -3882,7 +3840,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.ListFirewallRulesRequest' + $ref: '#/components/schemas/aes.iam.v1.RevokeApiKeyRequest' required: true responses: default: @@ -3896,13 +3854,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.ListFirewallRulesResponse' - /aes.network.v1.NetworkService/ListNetworks: + $ref: '#/components/schemas/aes.iam.v1.RevokeApiKeyResponse' + /aes.iam.v1.IamService/RevokeInvite: post: tags: - - aes.network.v1.NetworkService - summary: ListNetworks - operationId: aes.network.v1.NetworkService.ListNetworks + - aes.iam.v1.IamService + summary: RevokeInvite + description: |- + RevokeInvite marks a pending invite REVOKED so the token can't be accepted later. + Idempotent on already-revoked rows. Caller must hold admin.organization. + operationId: aes.iam.v1.IamService.RevokeInvite parameters: - name: Connect-Protocol-Version in: header @@ -3917,7 +3878,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.ListNetworksRequest' + $ref: '#/components/schemas/aes.iam.v1.RevokeInviteRequest' required: true responses: default: @@ -3931,13 +3892,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.ListNetworksResponse' - /aes.network.v1.NetworkService/ListSecurityGroups: + $ref: '#/components/schemas/aes.iam.v1.RevokeInviteResponse' + /aes.iam.v1.IamService/RevokeMFADevice: post: tags: - - aes.network.v1.NetworkService - summary: ListSecurityGroups - operationId: aes.network.v1.NetworkService.ListSecurityGroups + - aes.iam.v1.IamService + summary: RevokeMFADevice + operationId: aes.iam.v1.IamService.RevokeMFADevice parameters: - name: Connect-Protocol-Version in: header @@ -3952,7 +3913,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.ListSecurityGroupsRequest' + $ref: '#/components/schemas/aes.iam.v1.RevokeMFADeviceRequest' required: true responses: default: @@ -3966,13 +3927,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.ListSecurityGroupsResponse' - /aes.network.v1.NetworkService/RemoveVmFromSecurityGroup: + $ref: '#/components/schemas/aes.iam.v1.RevokeMFADeviceResponse' + /aes.iam.v1.IamService/RevokeSession: post: tags: - - aes.network.v1.NetworkService - summary: RemoveVmFromSecurityGroup - operationId: aes.network.v1.NetworkService.RemoveVmFromSecurityGroup + - aes.iam.v1.IamService + summary: RevokeSession + operationId: aes.iam.v1.IamService.RevokeSession parameters: - name: Connect-Protocol-Version in: header @@ -3987,7 +3948,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.RemoveVmFromSecurityGroupRequest' + $ref: '#/components/schemas/aes.iam.v1.RevokeSessionRequest' required: true responses: default: @@ -4001,13 +3962,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.RemoveVmFromSecurityGroupResponse' - /aes.network.v1.NetworkService/UpdateSecurityGroup: + $ref: '#/components/schemas/aes.iam.v1.RevokeSessionResponse' + /aes.iam.v1.IamService/RotateApiKey: post: tags: - - aes.network.v1.NetworkService - summary: UpdateSecurityGroup - operationId: aes.network.v1.NetworkService.UpdateSecurityGroup + - aes.iam.v1.IamService + summary: RotateApiKey + description: |- + RotateApiKey atomically issues a new key + revokes the old one in a single call. Use + instead of revoke-then-create to avoid the window where neither key is valid. + operationId: aes.iam.v1.IamService.RotateApiKey parameters: - name: Connect-Protocol-Version in: header @@ -4022,7 +3986,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.UpdateSecurityGroupRequest' + $ref: '#/components/schemas/aes.iam.v1.RotateApiKeyRequest' required: true responses: default: @@ -4036,13 +4000,18 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.network.v1.UpdateSecurityGroupResponse' - /aes.ops.v1.OperationsService/GetOperation: + $ref: '#/components/schemas/aes.iam.v1.RotateApiKeyResponse' + /aes.iam.v1.IamService/SetInitialPassword: post: tags: - - aes.ops.v1.OperationsService - summary: GetOperation - operationId: aes.ops.v1.OperationsService.GetOperation + - aes.iam.v1.IamService + summary: SetInitialPassword + description: |- + SetInitialPassword sets a password on an account that has none (typical: invite-accepted + user who hasn't linked GitHub yet). Only allowed when password_hash is empty AND the + caller has no OIDC identities — established accounts use ChangePassword instead. Caller + must be authenticated (the AcceptInvite session token works). + operationId: aes.iam.v1.IamService.SetInitialPassword parameters: - name: Connect-Protocol-Version in: header @@ -4057,7 +4026,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.ops.v1.GetOperationRequest' + $ref: '#/components/schemas/aes.iam.v1.SetInitialPasswordRequest' required: true responses: default: @@ -4071,14 +4040,18 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.ops.v1.GetOperationResponse' - /aes.ops.v1.OperationsService/ListOperations: + $ref: '#/components/schemas/aes.iam.v1.SetInitialPasswordResponse' + /aes.iam.v1.IamService/SignUp: post: tags: - - aes.ops.v1.OperationsService - summary: ListOperations - description: Lists operations newest-first (reverse name order; opaque page_token is the last-seen name). - operationId: aes.ops.v1.OperationsService.ListOperations + - aes.iam.v1.IamService + summary: SignUp + description: |- + SignUp self-provisions a new tenant: creates an organization, a default project, an IAM + binding marking the caller as admin of their org, and a fresh API key. Public (no auth) — + see docs/SIGNUP_PRODUCTION_HARDENING.md for the invite-gate / email-verification / OIDC + path that has to land before exposing this through a public gateway. + operationId: aes.iam.v1.IamService.SignUp parameters: - name: Connect-Protocol-Version in: header @@ -4093,7 +4066,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.ops.v1.ListOperationsRequest' + $ref: '#/components/schemas/aes.iam.v1.SignUpRequest' required: true responses: default: @@ -4107,19 +4080,19 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.ops.v1.ListOperationsResponse' - /aes.project.v1.ProjectService/CheckSlugAvailable: + $ref: '#/components/schemas/aes.iam.v1.SignUpResponse' + /aes.iam.v1.IamService/StartOidcLogin: post: tags: - - aes.project.v1.ProjectService - summary: CheckSlugAvailable + - aes.iam.v1.IamService + summary: StartOidcLogin description: |- - CheckSlugAvailable reports whether a workspace (org) or project slug can be claimed, for the - onboarding wizard's live availability check. ORG/user slugs are global; PROJECT slugs are - scoped to `parent` (an org resource name). The response carries the server-normalized slug - and a human reason ("taken" / "invalid" / "") — never API jargon. Authed; no resource is - created. Validation mirrors the create paths (DNS-1035, 3–30 chars, reserved-word blocklist). - operationId: aes.project.v1.ProjectService.CheckSlugAvailable + OIDC customer login flow. StartOidcLogin returns the IdP authorize URL the customer's + browser redirects to (with state + nonce). After the IdP redirects back to Metalhost's + /oauth/callback, the gateway calls CompleteOidcLogin with the authorization code; we + exchange it with the IdP, validate the ID token, find-or-create the user, and mint an + API key for the session. + operationId: aes.iam.v1.IamService.StartOidcLogin parameters: - name: Connect-Protocol-Version in: header @@ -4134,7 +4107,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.CheckSlugAvailableRequest' + $ref: '#/components/schemas/aes.iam.v1.StartOidcLoginRequest' required: true responses: default: @@ -4148,13 +4121,19 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.CheckSlugAvailableResponse' - /aes.project.v1.ProjectService/CreateOrganization: + $ref: '#/components/schemas/aes.iam.v1.StartOidcLoginResponse' + /aes.iam.v1.IamService/SubmitMFAChallenge: post: tags: - - aes.project.v1.ProjectService - summary: CreateOrganization - operationId: aes.project.v1.ProjectService.CreateOrganization + - aes.iam.v1.IamService + summary: SubmitMFAChallenge + description: |- + SubmitMFAChallenge completes a two-leg login by validating a TOTP code (or single-use + recovery code) against the principal's enrolled MFA devices. Consumes the challenge token + returned by Login or CompleteOidcLogin and mints the session API key. 5-minute TTL, + single-use on success, max 5 wrong attempts before the challenge is invalidated and the + caller must restart from Login (P0-4). + operationId: aes.iam.v1.IamService.SubmitMFAChallenge parameters: - name: Connect-Protocol-Version in: header @@ -4169,7 +4148,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.CreateOrganizationRequest' + $ref: '#/components/schemas/aes.iam.v1.SubmitMFAChallengeRequest' required: true responses: default: @@ -4183,13 +4162,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.CreateOrganizationResponse' - /aes.project.v1.ProjectService/CreateProject: + $ref: '#/components/schemas/aes.iam.v1.SubmitMFAChallengeResponse' + /aes.iam.v1.IamService/UpdateOrgMemberRole: post: tags: - - aes.project.v1.ProjectService - summary: CreateProject - operationId: aes.project.v1.ProjectService.CreateProject + - aes.iam.v1.IamService + summary: UpdateOrgMemberRole + description: |- + UpdateOrgMemberRole swaps a member's role binding without forcing a remove+re-invite. + Caller must hold admin.organization. Same role validation as InviteOrgMember. + operationId: aes.iam.v1.IamService.UpdateOrgMemberRole parameters: - name: Connect-Protocol-Version in: header @@ -4204,7 +4186,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.CreateProjectRequest' + $ref: '#/components/schemas/aes.iam.v1.UpdateOrgMemberRoleRequest' required: true responses: default: @@ -4218,16 +4200,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.CreateProjectResponse' - /aes.project.v1.ProjectService/DeleteOrganization: + $ref: '#/components/schemas/aes.iam.v1.UpdateOrgMemberRoleResponse' + /aes.iam.v1.IamService/UpdateUser: post: tags: - - aes.project.v1.ProjectService - summary: DeleteOrganization - description: |- - DeleteOrganization soft-deletes the org. Fails when the org still has projects/billing - accounts under it — clean those up first. - operationId: aes.project.v1.ProjectService.DeleteOrganization + - aes.iam.v1.IamService + summary: UpdateUser + operationId: aes.iam.v1.IamService.UpdateUser parameters: - name: Connect-Protocol-Version in: header @@ -4242,7 +4221,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.DeleteOrganizationRequest' + $ref: '#/components/schemas/aes.iam.v1.UpdateUserRequest' required: true responses: default: @@ -4256,17 +4235,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.DeleteOrganizationResponse' - /aes.project.v1.ProjectService/DeleteProject: + $ref: '#/components/schemas/aes.iam.v1.UpdateUserResponse' + /aes.iam.v1.IamService/VerifyEmail: post: tags: - - aes.project.v1.ProjectService - summary: DeleteProject + - aes.iam.v1.IamService + summary: VerifyEmail description: |- - DeleteProject soft-deletes the project. Cascading FKs on compute_instances / tenant_networks / - service_accounts wipe project resources via ON DELETE CASCADE; compact billing history keeps the project_name - as history (FK is ON DELETE SET NULL). - operationId: aes.project.v1.ProjectService.DeleteProject + VerifyEmail consumes the token sent in the verification email + creates the user, org, + default project, and initial API key. Returns the API key the CLI / web stores for + subsequent calls. + operationId: aes.iam.v1.IamService.VerifyEmail parameters: - name: Connect-Protocol-Version in: header @@ -4281,7 +4260,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.DeleteProjectRequest' + $ref: '#/components/schemas/aes.iam.v1.VerifyEmailRequest' required: true responses: default: @@ -4295,13 +4274,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.DeleteProjectResponse' - /aes.project.v1.ProjectService/GetOrganization: + $ref: '#/components/schemas/aes.iam.v1.VerifyEmailResponse' + /aes.iam.v1.IamService/VerifyMFAEnrollment: post: tags: - - aes.project.v1.ProjectService - summary: GetOrganization - operationId: aes.project.v1.ProjectService.GetOrganization + - aes.iam.v1.IamService + summary: VerifyMFAEnrollment + operationId: aes.iam.v1.IamService.VerifyMFAEnrollment parameters: - name: Connect-Protocol-Version in: header @@ -4316,7 +4295,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.GetOrganizationRequest' + $ref: '#/components/schemas/aes.iam.v1.VerifyMFAEnrollmentRequest' required: true responses: default: @@ -4330,13 +4309,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.GetOrganizationResponse' - /aes.project.v1.ProjectService/GetProject: + $ref: '#/components/schemas/aes.iam.v1.VerifyMFAEnrollmentResponse' + /aes.monitoring.v1.AlertService/DeleteAlertDestination: post: tags: - - aes.project.v1.ProjectService - summary: GetProject - operationId: aes.project.v1.ProjectService.GetProject + - aes.monitoring.v1.AlertService + summary: DeleteAlertDestination + operationId: aes.monitoring.v1.AlertService.DeleteAlertDestination parameters: - name: Connect-Protocol-Version in: header @@ -4351,7 +4330,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.GetProjectRequest' + $ref: '#/components/schemas/aes.monitoring.v1.DeleteAlertDestinationRequest' required: true responses: default: @@ -4365,18 +4344,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.GetProjectResponse' - /aes.project.v1.ProjectService/ListOrgActivity: + $ref: '#/components/schemas/aes.monitoring.v1.DeleteAlertDestinationResponse' + /aes.monitoring.v1.AlertService/DeleteAlertRule: post: tags: - - aes.project.v1.ProjectService - summary: ListOrgActivity - description: |- - ListOrgActivity returns a humanized stream of recent events across the org — VM created, - disk resized, payment processed, firewall rule added, etc. Backed by audit_events but - filtered + reshaped for end-user consumption (raw audit log is available via - AuditService.SearchEvents). Sorted newest-first. - operationId: aes.project.v1.ProjectService.ListOrgActivity + - aes.monitoring.v1.AlertService + summary: DeleteAlertRule + operationId: aes.monitoring.v1.AlertService.DeleteAlertRule parameters: - name: Connect-Protocol-Version in: header @@ -4391,7 +4365,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.ListOrgActivityRequest' + $ref: '#/components/schemas/aes.monitoring.v1.DeleteAlertRuleRequest' required: true responses: default: @@ -4405,17 +4379,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.ListOrgActivityResponse' - /aes.project.v1.ProjectService/ListProjectMembers: + $ref: '#/components/schemas/aes.monitoring.v1.DeleteAlertRuleResponse' + /aes.monitoring.v1.AlertService/GetDestinationTest: post: tags: - - aes.project.v1.ProjectService - summary: ListProjectMembers - description: |- - Per-member project access (#208). Org owners/admins reach every project implicitly; these - RPCs grant a specific org member access to a specific project with a project role - (owner/editor/viewer). Caller must be a project owner, an org owner/admin, or platform admin. - operationId: aes.project.v1.ProjectService.ListProjectMembers + - aes.monitoring.v1.AlertService + summary: GetDestinationTest + operationId: aes.monitoring.v1.AlertService.GetDestinationTest parameters: - name: Connect-Protocol-Version in: header @@ -4430,7 +4400,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.ListProjectMembersRequest' + $ref: '#/components/schemas/aes.monitoring.v1.GetDestinationTestRequest' required: true responses: default: @@ -4444,13 +4414,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.ListProjectMembersResponse' - /aes.project.v1.ProjectService/ListProjects: + $ref: '#/components/schemas/aes.monitoring.v1.GetDestinationTestResponse' + /aes.monitoring.v1.AlertService/GetIncident: post: tags: - - aes.project.v1.ProjectService - summary: ListProjects - operationId: aes.project.v1.ProjectService.ListProjects + - aes.monitoring.v1.AlertService + summary: GetIncident + operationId: aes.monitoring.v1.AlertService.GetIncident parameters: - name: Connect-Protocol-Version in: header @@ -4465,7 +4435,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.ListProjectsRequest' + $ref: '#/components/schemas/aes.monitoring.v1.GetIncidentRequest' required: true responses: default: @@ -4479,16 +4449,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.ListProjectsResponse' - /aes.project.v1.ProjectService/RemoveProjectMember: + $ref: '#/components/schemas/aes.monitoring.v1.GetIncidentResponse' + /aes.monitoring.v1.AlertService/GetIncidentSummary: post: tags: - - aes.project.v1.ProjectService - summary: RemoveProjectMember - description: |- - RemoveProjectMember revokes a member's project-scoped access (org owners/admins keep implicit - access regardless). - operationId: aes.project.v1.ProjectService.RemoveProjectMember + - aes.monitoring.v1.AlertService + summary: GetIncidentSummary + operationId: aes.monitoring.v1.AlertService.GetIncidentSummary parameters: - name: Connect-Protocol-Version in: header @@ -4503,7 +4470,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.RemoveProjectMemberRequest' + $ref: '#/components/schemas/aes.monitoring.v1.GetIncidentSummaryRequest' required: true responses: default: @@ -4517,14 +4484,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.RemoveProjectMemberResponse' - /aes.project.v1.ProjectService/SetProjectMember: + $ref: '#/components/schemas/aes.monitoring.v1.GetIncidentSummaryResponse' + /aes.monitoring.v1.AlertService/ListAlertDestinationCandidates: post: tags: - - aes.project.v1.ProjectService - summary: SetProjectMember - description: SetProjectMember grants or updates a member's role on the project (idempotent upsert). - operationId: aes.project.v1.ProjectService.SetProjectMember + - aes.monitoring.v1.AlertService + summary: ListAlertDestinationCandidates + operationId: aes.monitoring.v1.AlertService.ListAlertDestinationCandidates parameters: - name: Connect-Protocol-Version in: header @@ -4539,7 +4505,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.SetProjectMemberRequest' + $ref: '#/components/schemas/aes.monitoring.v1.ListAlertDestinationCandidatesRequest' required: true responses: default: @@ -4553,13 +4519,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.SetProjectMemberResponse' - /aes.project.v1.ProjectService/UpdateOrganization: + $ref: '#/components/schemas/aes.monitoring.v1.ListAlertDestinationCandidatesResponse' + /aes.monitoring.v1.AlertService/ListAlertDestinations: post: tags: - - aes.project.v1.ProjectService - summary: UpdateOrganization - operationId: aes.project.v1.ProjectService.UpdateOrganization + - aes.monitoring.v1.AlertService + summary: ListAlertDestinations + operationId: aes.monitoring.v1.AlertService.ListAlertDestinations parameters: - name: Connect-Protocol-Version in: header @@ -4574,7 +4540,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.UpdateOrganizationRequest' + $ref: '#/components/schemas/aes.monitoring.v1.ListAlertDestinationsRequest' required: true responses: default: @@ -4588,13 +4554,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.UpdateOrganizationResponse' - /aes.project.v1.ProjectService/UpdateProject: + $ref: '#/components/schemas/aes.monitoring.v1.ListAlertDestinationsResponse' + /aes.monitoring.v1.AlertService/ListAlertInstances: post: tags: - - aes.project.v1.ProjectService - summary: UpdateProject - operationId: aes.project.v1.ProjectService.UpdateProject + - aes.monitoring.v1.AlertService + summary: ListAlertInstances + operationId: aes.monitoring.v1.AlertService.ListAlertInstances parameters: - name: Connect-Protocol-Version in: header @@ -4609,7 +4575,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.UpdateProjectRequest' + $ref: '#/components/schemas/aes.monitoring.v1.ListAlertInstancesRequest' required: true responses: default: @@ -4623,13 +4589,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.project.v1.UpdateProjectResponse' - /aes.quota.v1.QuotaService/GetMyQuotas: + $ref: '#/components/schemas/aes.monitoring.v1.ListAlertInstancesResponse' + /aes.monitoring.v1.AlertService/ListAlertRules: post: tags: - - aes.quota.v1.QuotaService - summary: GetMyQuotas - operationId: aes.quota.v1.QuotaService.GetMyQuotas + - aes.monitoring.v1.AlertService + summary: ListAlertRules + operationId: aes.monitoring.v1.AlertService.ListAlertRules parameters: - name: Connect-Protocol-Version in: header @@ -4644,7 +4610,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.quota.v1.GetMyQuotasRequest' + $ref: '#/components/schemas/aes.monitoring.v1.ListAlertRulesRequest' required: true responses: default: @@ -4658,14 +4624,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.quota.v1.GetMyQuotasResponse' - /aes.quota.v1.QuotaService/ListMyQuotaRequests: + $ref: '#/components/schemas/aes.monitoring.v1.ListAlertRulesResponse' + /aes.monitoring.v1.AlertService/ListIncidents: post: tags: - - aes.quota.v1.QuotaService - summary: ListMyQuotaRequests - description: ListMyQuotaRequests returns the organization's quota requests, newest first. - operationId: aes.quota.v1.QuotaService.ListMyQuotaRequests + - aes.monitoring.v1.AlertService + summary: ListIncidents + operationId: aes.monitoring.v1.AlertService.ListIncidents parameters: - name: Connect-Protocol-Version in: header @@ -4680,7 +4645,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.quota.v1.ListMyQuotaRequestsRequest' + $ref: '#/components/schemas/aes.monitoring.v1.ListIncidentsRequest' required: true responses: default: @@ -4694,16 +4659,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.quota.v1.ListMyQuotaRequestsResponse' - /aes.quota.v1.QuotaService/RequestQuotaIncrease: + $ref: '#/components/schemas/aes.monitoring.v1.ListIncidentsResponse' + /aes.monitoring.v1.AlertService/PreviewAlertRule: post: tags: - - aes.quota.v1.QuotaService - summary: RequestQuotaIncrease - description: |- - RequestQuotaIncrease files a request to raise an organization-level quota. Requests are - reviewed by the platform team; track status via ListMyQuotaRequests. - operationId: aes.quota.v1.QuotaService.RequestQuotaIncrease + - aes.monitoring.v1.AlertService + summary: PreviewAlertRule + operationId: aes.monitoring.v1.AlertService.PreviewAlertRule parameters: - name: Connect-Protocol-Version in: header @@ -4718,7 +4680,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.quota.v1.RequestQuotaIncreaseRequest' + $ref: '#/components/schemas/aes.monitoring.v1.PreviewAlertRuleRequest' required: true responses: default: @@ -4732,16 +4694,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.quota.v1.RequestQuotaIncreaseResponse' - /aes.storage.v1.StorageService/AttachDisk: + $ref: '#/components/schemas/aes.monitoring.v1.PreviewAlertRuleResponse' + /aes.monitoring.v1.AlertService/RequestDestinationVerification: post: tags: - - aes.storage.v1.StorageService - summary: AttachDisk - description: |- - AttachDisk hot-plugs the disk into the named VM. The disk must be AVAILABLE (not already - attached); the VM must be RUNNING. - operationId: aes.storage.v1.StorageService.AttachDisk + - aes.monitoring.v1.AlertService + summary: RequestDestinationVerification + operationId: aes.monitoring.v1.AlertService.RequestDestinationVerification parameters: - name: Connect-Protocol-Version in: header @@ -4756,7 +4715,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.AttachDiskRequest' + $ref: '#/components/schemas/aes.monitoring.v1.RequestDestinationVerificationRequest' required: true responses: default: @@ -4770,13 +4729,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.AttachDiskResponse' - /aes.storage.v1.StorageService/CreateDisk: + $ref: '#/components/schemas/aes.monitoring.v1.RequestDestinationVerificationResponse' + /aes.monitoring.v1.AlertService/SaveAlertDestination: post: tags: - - aes.storage.v1.StorageService - summary: CreateDisk - operationId: aes.storage.v1.StorageService.CreateDisk + - aes.monitoring.v1.AlertService + summary: SaveAlertDestination + operationId: aes.monitoring.v1.AlertService.SaveAlertDestination parameters: - name: Connect-Protocol-Version in: header @@ -4791,7 +4750,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.CreateDiskRequest' + $ref: '#/components/schemas/aes.monitoring.v1.SaveAlertDestinationRequest' required: true responses: default: @@ -4805,18 +4764,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.CreateDiskResponse' - /aes.storage.v1.StorageService/CreateFileShare: + $ref: '#/components/schemas/aes.monitoring.v1.SaveAlertDestinationResponse' + /aes.monitoring.v1.AlertService/SaveAlertRule: post: tags: - - aes.storage.v1.StorageService - summary: CreateFileShare - description: |- - File shares — RWX NFS volumes that multiple VMs in the same tenant network can mount - concurrently. Access is restricted to the tenant network, so any VM on that network can - `mount -t nfs4` using the FileShare's `mount_command`. No attach/detach bookkeeping — - the customer mounts in-guest. - operationId: aes.storage.v1.StorageService.CreateFileShare + - aes.monitoring.v1.AlertService + summary: SaveAlertRule + operationId: aes.monitoring.v1.AlertService.SaveAlertRule parameters: - name: Connect-Protocol-Version in: header @@ -4831,7 +4785,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.CreateFileShareRequest' + $ref: '#/components/schemas/aes.monitoring.v1.SaveAlertRuleRequest' required: true responses: default: @@ -4845,13 +4799,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.CreateFileShareResponse' - /aes.storage.v1.StorageService/CreateSnapshot: + $ref: '#/components/schemas/aes.monitoring.v1.SaveAlertRuleResponse' + /aes.monitoring.v1.AlertService/TestAlertDestination: post: tags: - - aes.storage.v1.StorageService - summary: CreateSnapshot - operationId: aes.storage.v1.StorageService.CreateSnapshot + - aes.monitoring.v1.AlertService + summary: TestAlertDestination + operationId: aes.monitoring.v1.AlertService.TestAlertDestination parameters: - name: Connect-Protocol-Version in: header @@ -4866,7 +4820,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.CreateSnapshotRequest' + $ref: '#/components/schemas/aes.monitoring.v1.TestAlertDestinationRequest' required: true responses: default: @@ -4880,13 +4834,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.CreateSnapshotResponse' - /aes.storage.v1.StorageService/CreateSnapshotSchedule: + $ref: '#/components/schemas/aes.monitoring.v1.TestAlertDestinationResponse' + /aes.monitoring.v1.AlertService/UpdateIncident: post: tags: - - aes.storage.v1.StorageService - summary: CreateSnapshotSchedule - operationId: aes.storage.v1.StorageService.CreateSnapshotSchedule + - aes.monitoring.v1.AlertService + summary: UpdateIncident + operationId: aes.monitoring.v1.AlertService.UpdateIncident parameters: - name: Connect-Protocol-Version in: header @@ -4901,7 +4855,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.CreateSnapshotScheduleRequest' + $ref: '#/components/schemas/aes.monitoring.v1.UpdateIncidentRequest' required: true responses: default: @@ -4915,13 +4869,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.CreateSnapshotScheduleResponse' - /aes.storage.v1.StorageService/DeleteDisk: + $ref: '#/components/schemas/aes.monitoring.v1.UpdateIncidentResponse' + /aes.monitoring.v1.AlertService/VerifyAlertDestination: post: tags: - - aes.storage.v1.StorageService - summary: DeleteDisk - operationId: aes.storage.v1.StorageService.DeleteDisk + - aes.monitoring.v1.AlertService + summary: VerifyAlertDestination + operationId: aes.monitoring.v1.AlertService.VerifyAlertDestination parameters: - name: Connect-Protocol-Version in: header @@ -4936,7 +4890,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DeleteDiskRequest' + $ref: '#/components/schemas/aes.monitoring.v1.VerifyAlertDestinationRequest' required: true responses: default: @@ -4950,13 +4904,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DeleteDiskResponse' - /aes.storage.v1.StorageService/DeleteFileShare: + $ref: '#/components/schemas/aes.monitoring.v1.VerifyAlertDestinationResponse' + /aes.monitoring.v1.MonitoringService/EnableEnhancedMonitoring: post: tags: - - aes.storage.v1.StorageService - summary: DeleteFileShare - operationId: aes.storage.v1.StorageService.DeleteFileShare + - aes.monitoring.v1.MonitoringService + summary: EnableEnhancedMonitoring + operationId: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring parameters: - name: Connect-Protocol-Version in: header @@ -4971,7 +4925,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DeleteFileShareRequest' + $ref: '#/components/schemas/aes.monitoring.v1.EnableEnhancedMonitoringRequest' required: true responses: default: @@ -4985,13 +4939,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DeleteFileShareResponse' - /aes.storage.v1.StorageService/DeleteSnapshot: + $ref: '#/components/schemas/aes.monitoring.v1.EnableEnhancedMonitoringResponse' + /aes.monitoring.v1.MonitoringService/GetEnhancedMonitoring: post: tags: - - aes.storage.v1.StorageService - summary: DeleteSnapshot - operationId: aes.storage.v1.StorageService.DeleteSnapshot + - aes.monitoring.v1.MonitoringService + summary: GetEnhancedMonitoring + operationId: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring parameters: - name: Connect-Protocol-Version in: header @@ -5006,7 +4960,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DeleteSnapshotRequest' + $ref: '#/components/schemas/aes.monitoring.v1.GetEnhancedMonitoringRequest' required: true responses: default: @@ -5020,13 +4974,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DeleteSnapshotResponse' - /aes.storage.v1.StorageService/DeleteSnapshotSchedule: + $ref: '#/components/schemas/aes.monitoring.v1.GetEnhancedMonitoringResponse' + /aes.monitoring.v1.MonitoringService/ListMetricDescriptors: post: tags: - - aes.storage.v1.StorageService - summary: DeleteSnapshotSchedule - operationId: aes.storage.v1.StorageService.DeleteSnapshotSchedule + - aes.monitoring.v1.MonitoringService + summary: ListMetricDescriptors + operationId: aes.monitoring.v1.MonitoringService.ListMetricDescriptors parameters: - name: Connect-Protocol-Version in: header @@ -5041,7 +4995,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DeleteSnapshotScheduleRequest' + $ref: '#/components/schemas/aes.monitoring.v1.ListMetricDescriptorsRequest' required: true responses: default: @@ -5055,14 +5009,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DeleteSnapshotScheduleResponse' - /aes.storage.v1.StorageService/DetachDisk: + $ref: '#/components/schemas/aes.monitoring.v1.ListMetricDescriptorsResponse' + /aes.monitoring.v1.MonitoringService/ListVMMonitoring: post: tags: - - aes.storage.v1.StorageService - summary: DetachDisk - description: DetachDisk hot-unplugs the disk. The disk returns to AVAILABLE; the VM keeps running. - operationId: aes.storage.v1.StorageService.DetachDisk + - aes.monitoring.v1.MonitoringService + summary: ListVMMonitoring + operationId: aes.monitoring.v1.MonitoringService.ListVMMonitoring parameters: - name: Connect-Protocol-Version in: header @@ -5077,7 +5030,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DetachDiskRequest' + $ref: '#/components/schemas/aes.monitoring.v1.ListVMMonitoringRequest' required: true responses: default: @@ -5091,13 +5044,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.DetachDiskResponse' - /aes.storage.v1.StorageService/GetDisk: + $ref: '#/components/schemas/aes.monitoring.v1.ListVMMonitoringResponse' + /aes.monitoring.v1.MonitoringService/QueryVMMonitoring: post: tags: - - aes.storage.v1.StorageService - summary: GetDisk - operationId: aes.storage.v1.StorageService.GetDisk + - aes.monitoring.v1.MonitoringService + summary: QueryVMMonitoring + operationId: aes.monitoring.v1.MonitoringService.QueryVMMonitoring parameters: - name: Connect-Protocol-Version in: header @@ -5112,7 +5065,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.GetDiskRequest' + $ref: '#/components/schemas/aes.monitoring.v1.QueryVMMonitoringRequest' required: true responses: default: @@ -5126,13 +5079,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.GetDiskResponse' - /aes.storage.v1.StorageService/GetSnapshot: + $ref: '#/components/schemas/aes.monitoring.v1.QueryVMMonitoringResponse' + /aes.monitoring.v1.MonitoringService/RevokeEnhancedMonitoring: post: tags: - - aes.storage.v1.StorageService - summary: GetSnapshot - operationId: aes.storage.v1.StorageService.GetSnapshot + - aes.monitoring.v1.MonitoringService + summary: RevokeEnhancedMonitoring + operationId: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring parameters: - name: Connect-Protocol-Version in: header @@ -5147,7 +5100,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.GetSnapshotRequest' + $ref: '#/components/schemas/aes.monitoring.v1.RevokeEnhancedMonitoringRequest' required: true responses: default: @@ -5161,13 +5114,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.GetSnapshotResponse' - /aes.storage.v1.StorageService/ListDisks: + $ref: '#/components/schemas/aes.monitoring.v1.RevokeEnhancedMonitoringResponse' + /aes.network.v1.NetworkService/AddVmToSecurityGroup: post: tags: - - aes.storage.v1.StorageService - summary: ListDisks - operationId: aes.storage.v1.StorageService.ListDisks + - aes.network.v1.NetworkService + summary: AddVmToSecurityGroup + description: Membership is editable post-provision (no VM restart — only ACLs/address-sets change). + operationId: aes.network.v1.NetworkService.AddVmToSecurityGroup parameters: - name: Connect-Protocol-Version in: header @@ -5182,7 +5136,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ListDisksRequest' + $ref: '#/components/schemas/aes.network.v1.AddVmToSecurityGroupRequest' required: true responses: default: @@ -5196,13 +5150,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ListDisksResponse' - /aes.storage.v1.StorageService/ListFileShares: + $ref: '#/components/schemas/aes.network.v1.AddVmToSecurityGroupResponse' + /aes.network.v1.NetworkService/CreateFirewallRule: post: tags: - - aes.storage.v1.StorageService - summary: ListFileShares - operationId: aes.storage.v1.StorageService.ListFileShares + - aes.network.v1.NetworkService + summary: CreateFirewallRule + description: |- + CreateFirewallRule opens the listed ingress ports on the VM's public IP from the listed + source CIDRs. Egress is unrestricted (blocking it breaks cloud-init / package installs / DNS). + operationId: aes.network.v1.NetworkService.CreateFirewallRule parameters: - name: Connect-Protocol-Version in: header @@ -5217,7 +5174,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ListFileSharesRequest' + $ref: '#/components/schemas/aes.network.v1.CreateFirewallRuleRequest' required: true responses: default: @@ -5231,13 +5188,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ListFileSharesResponse' - /aes.storage.v1.StorageService/ListSnapshotSchedules: + $ref: '#/components/schemas/aes.network.v1.CreateFirewallRuleResponse' + /aes.network.v1.NetworkService/CreateNetwork: post: tags: - - aes.storage.v1.StorageService - summary: ListSnapshotSchedules - operationId: aes.storage.v1.StorageService.ListSnapshotSchedules + - aes.network.v1.NetworkService + summary: CreateNetwork + operationId: aes.network.v1.NetworkService.CreateNetwork parameters: - name: Connect-Protocol-Version in: header @@ -5252,7 +5209,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ListSnapshotSchedulesRequest' + $ref: '#/components/schemas/aes.network.v1.CreateNetworkRequest' required: true responses: default: @@ -5266,13 +5223,18 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ListSnapshotSchedulesResponse' - /aes.storage.v1.StorageService/ListSnapshots: + $ref: '#/components/schemas/aes.network.v1.CreateNetworkResponse' + /aes.network.v1.NetworkService/CreateSecurityGroup: post: tags: - - aes.storage.v1.StorageService - summary: ListSnapshots - operationId: aes.storage.v1.StorageService.ListSnapshots + - aes.network.v1.NetworkService + summary: CreateSecurityGroup + description: |- + Security groups — INTERNAL (east-west) network policy on the private NIC, distinct from + the public firewall above. A group is a reusable ruleset attached to >=0 VMs; rules allow + traffic from/to a CIDR or another security group. VMs talk freely by default — attaching + a group locks that VM down to its rules. + operationId: aes.network.v1.NetworkService.CreateSecurityGroup parameters: - name: Connect-Protocol-Version in: header @@ -5287,7 +5249,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ListSnapshotsRequest' + $ref: '#/components/schemas/aes.network.v1.CreateSecurityGroupRequest' required: true responses: default: @@ -5301,17 +5263,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ListSnapshotsResponse' - /aes.storage.v1.StorageService/QuoteDiskResize: + $ref: '#/components/schemas/aes.network.v1.CreateSecurityGroupResponse' + /aes.network.v1.NetworkService/DeleteFirewallRule: post: tags: - - aes.storage.v1.StorageService - summary: QuoteDiskResize - description: |- - QuoteDiskResize prices a resize before it is applied. A disk covered by its VM's monthly - reservation grows as a paid upgrade: the difference for the remaining term is charged - immediately on resize — due_now_minor is that amount. 0 for hourly-billed disks. - operationId: aes.storage.v1.StorageService.QuoteDiskResize + - aes.network.v1.NetworkService + summary: DeleteFirewallRule + operationId: aes.network.v1.NetworkService.DeleteFirewallRule parameters: - name: Connect-Protocol-Version in: header @@ -5326,7 +5284,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.QuoteDiskResizeRequest' + $ref: '#/components/schemas/aes.network.v1.DeleteFirewallRuleRequest' required: true responses: default: @@ -5340,17 +5298,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.QuoteDiskResizeResponse' - /aes.storage.v1.StorageService/ResizeDisk: + $ref: '#/components/schemas/aes.network.v1.DeleteFirewallRuleResponse' + /aes.network.v1.NetworkService/DeleteSecurityGroup: post: tags: - - aes.storage.v1.StorageService - summary: ResizeDisk - description: |- - ResizeDisk grows the disk online — the volume expands without unmounting; for attached - disks, the guest sees the new size after a filesystem-level resize. Shrinking is not - supported (expansion is one-way). - operationId: aes.storage.v1.StorageService.ResizeDisk + - aes.network.v1.NetworkService + summary: DeleteSecurityGroup + operationId: aes.network.v1.NetworkService.DeleteSecurityGroup parameters: - name: Connect-Protocol-Version in: header @@ -5365,7 +5319,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ResizeDiskRequest' + $ref: '#/components/schemas/aes.network.v1.DeleteSecurityGroupRequest' required: true responses: default: @@ -5379,13 +5333,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.ResizeDiskResponse' - /aes.storage.v1.StorageService/UpdateDisk: + $ref: '#/components/schemas/aes.network.v1.DeleteSecurityGroupResponse' + /aes.network.v1.NetworkService/GetSecurityGroup: post: tags: - - aes.storage.v1.StorageService - summary: UpdateDisk - operationId: aes.storage.v1.StorageService.UpdateDisk + - aes.network.v1.NetworkService + summary: GetSecurityGroup + operationId: aes.network.v1.NetworkService.GetSecurityGroup parameters: - name: Connect-Protocol-Version in: header @@ -5400,7 +5354,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.UpdateDiskRequest' + $ref: '#/components/schemas/aes.network.v1.GetSecurityGroupRequest' required: true responses: default: @@ -5414,13 +5368,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.UpdateDiskResponse' - /aes.storage.v1.StorageService/UpdateSnapshotSchedule: + $ref: '#/components/schemas/aes.network.v1.GetSecurityGroupResponse' + /aes.network.v1.NetworkService/ListFirewallRules: post: tags: - - aes.storage.v1.StorageService - summary: UpdateSnapshotSchedule - operationId: aes.storage.v1.StorageService.UpdateSnapshotSchedule + - aes.network.v1.NetworkService + summary: ListFirewallRules + operationId: aes.network.v1.NetworkService.ListFirewallRules parameters: - name: Connect-Protocol-Version in: header @@ -5435,7 +5389,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.UpdateSnapshotScheduleRequest' + $ref: '#/components/schemas/aes.network.v1.ListFirewallRulesRequest' required: true responses: default: @@ -5449,16 +5403,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.storage.v1.UpdateSnapshotScheduleResponse' - /aes.support.v1.SupportService/CloseTicket: + $ref: '#/components/schemas/aes.network.v1.ListFirewallRulesResponse' + /aes.network.v1.NetworkService/ListNetworks: post: tags: - - aes.support.v1.SupportService - summary: CloseTicket - description: |- - CloseTicket transitions the ticket to CLOSED. Customer can close from any non-CLOSED - status. Staff may mark a ticket RESOLVED before the customer closes it. - operationId: aes.support.v1.SupportService.CloseTicket + - aes.network.v1.NetworkService + summary: ListNetworks + operationId: aes.network.v1.NetworkService.ListNetworks parameters: - name: Connect-Protocol-Version in: header @@ -5473,7 +5424,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.CloseTicketRequest' + $ref: '#/components/schemas/aes.network.v1.ListNetworksRequest' required: true responses: default: @@ -5487,14 +5438,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.CloseTicketResponse' - /aes.support.v1.SupportService/CreateTicket: + $ref: '#/components/schemas/aes.network.v1.ListNetworksResponse' + /aes.network.v1.NetworkService/ListSecurityGroups: post: tags: - - aes.support.v1.SupportService - summary: CreateTicket - description: CreateTicket opens a new ticket and posts the initial customer message. - operationId: aes.support.v1.SupportService.CreateTicket + - aes.network.v1.NetworkService + summary: ListSecurityGroups + operationId: aes.network.v1.NetworkService.ListSecurityGroups parameters: - name: Connect-Protocol-Version in: header @@ -5509,7 +5459,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.CreateTicketRequest' + $ref: '#/components/schemas/aes.network.v1.ListSecurityGroupsRequest' required: true responses: default: @@ -5523,16 +5473,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.CreateTicketResponse' - /aes.support.v1.SupportService/GetTicket: + $ref: '#/components/schemas/aes.network.v1.ListSecurityGroupsResponse' + /aes.network.v1.NetworkService/RemoveVmFromSecurityGroup: post: tags: - - aes.support.v1.SupportService - summary: GetTicket - description: |- - GetTicket returns the ticket and its message thread. internal_note messages are - filtered out for non-staff callers. - operationId: aes.support.v1.SupportService.GetTicket + - aes.network.v1.NetworkService + summary: RemoveVmFromSecurityGroup + operationId: aes.network.v1.NetworkService.RemoveVmFromSecurityGroup parameters: - name: Connect-Protocol-Version in: header @@ -5547,7 +5494,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.GetTicketRequest' + $ref: '#/components/schemas/aes.network.v1.RemoveVmFromSecurityGroupRequest' required: true responses: default: @@ -5561,16 +5508,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.GetTicketResponse' - /aes.support.v1.SupportService/ListTickets: + $ref: '#/components/schemas/aes.network.v1.RemoveVmFromSecurityGroupResponse' + /aes.network.v1.NetworkService/UpdateSecurityGroup: post: tags: - - aes.support.v1.SupportService - summary: ListTickets - description: |- - ListTickets returns tickets owned by the caller's organization. Closed tickets are - excluded by default; pass status_filter=TICKET_STATUS_CLOSED to see them. - operationId: aes.support.v1.SupportService.ListTickets + - aes.network.v1.NetworkService + summary: UpdateSecurityGroup + operationId: aes.network.v1.NetworkService.UpdateSecurityGroup parameters: - name: Connect-Protocol-Version in: header @@ -5585,7 +5529,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.ListTicketsRequest' + $ref: '#/components/schemas/aes.network.v1.UpdateSecurityGroupRequest' required: true responses: default: @@ -5599,16 +5543,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.ListTicketsResponse' - /aes.support.v1.SupportService/ReplyTicket: + $ref: '#/components/schemas/aes.network.v1.UpdateSecurityGroupResponse' + /aes.ops.v1.OperationsService/GetOperation: post: tags: - - aes.support.v1.SupportService - summary: ReplyTicket - description: |- - ReplyTicket appends a customer message and transitions status to PENDING_STAFF when the - ticket was previously PENDING_CUSTOMER. No-op transition otherwise. - operationId: aes.support.v1.SupportService.ReplyTicket + - aes.ops.v1.OperationsService + summary: GetOperation + operationId: aes.ops.v1.OperationsService.GetOperation parameters: - name: Connect-Protocol-Version in: header @@ -5623,7 +5564,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.ReplyTicketRequest' + $ref: '#/components/schemas/aes.ops.v1.GetOperationRequest' required: true responses: default: @@ -5637,18 +5578,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.support.v1.ReplyTicketResponse' - /aes.wallet.v1.WalletService/AttachPaymentMethod: + $ref: '#/components/schemas/aes.ops.v1.GetOperationResponse' + /aes.ops.v1.OperationsService/ListOperations: post: tags: - - aes.wallet.v1.WalletService - summary: AttachPaymentMethod - description: |- - Payment method management. Metalhost never sees raw card data — the customer obtains a - Stripe payment method ID via Stripe.js client-side and posts the id here. Metalhost stores - (stripe_customer_id, stripe_payment_method_id, last4, brand, exp). AttachPaymentMethod - also creates the Stripe customer if the billing account doesn't have one yet. - operationId: aes.wallet.v1.WalletService.AttachPaymentMethod + - aes.ops.v1.OperationsService + summary: ListOperations + description: Lists operations newest-first (reverse name order; opaque page_token is the last-seen name). + operationId: aes.ops.v1.OperationsService.ListOperations parameters: - name: Connect-Protocol-Version in: header @@ -5663,7 +5600,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.AttachPaymentMethodRequest' + $ref: '#/components/schemas/aes.ops.v1.ListOperationsRequest' required: true responses: default: @@ -5677,18 +5614,19 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.AttachPaymentMethodResponse' - /aes.wallet.v1.WalletService/ConfigureAutoRecharge: + $ref: '#/components/schemas/aes.ops.v1.ListOperationsResponse' + /aes.project.v1.ProjectService/CheckSlugAvailable: post: tags: - - aes.wallet.v1.WalletService - summary: ConfigureAutoRecharge + - aes.project.v1.ProjectService + summary: CheckSlugAvailable description: |- - Auto-recharge — opt-in. Customer enables Stripe auto-charge by setting enabled=true with a - saved payment_method, threshold, and amount. The dispatcher only picks wallets where - enabled = TRUE; Metalhost never charges a card without explicit consent. Disable by setting - enabled=false (config is preserved so re-enabling doesn't require resubmitting threshold/amount). - operationId: aes.wallet.v1.WalletService.ConfigureAutoRecharge + CheckSlugAvailable reports whether a workspace (org) or project slug can be claimed, for the + onboarding wizard's live availability check. ORG/user slugs are global; PROJECT slugs are + scoped to `parent` (an org resource name). The response carries the server-normalized slug + and a human reason ("taken" / "invalid" / "") — never API jargon. Authed; no resource is + created. Validation mirrors the create paths (DNS-1035, 3–30 chars, reserved-word blocklist). + operationId: aes.project.v1.ProjectService.CheckSlugAvailable parameters: - name: Connect-Protocol-Version in: header @@ -5703,7 +5641,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ConfigureAutoRechargeRequest' + $ref: '#/components/schemas/aes.project.v1.CheckSlugAvailableRequest' required: true responses: default: @@ -5717,20 +5655,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ConfigureAutoRechargeResponse' - /aes.wallet.v1.WalletService/ConfigureWalletAlerts: + $ref: '#/components/schemas/aes.project.v1.CheckSlugAvailableResponse' + /aes.project.v1.ProjectService/CreateOrganization: post: tags: - - aes.wallet.v1.WalletService - summary: ConfigureWalletAlerts - description: |- - Wallet alerts. One config per wallet: balance_alert_minor (fire when prepay balance drops - below) and/or days_remaining_alert (fire when balance / daily burn falls below this many - days). Either can be unset (NULL) to disable that alert. Edge-fire arming — fires once - when the condition first becomes true, re-arms when balance recovers above the threshold. - Customer-side refunds are not modeled: open a support ticket; operator refunds via - Stripe Dashboard and the charge.refunded webhook posts the ledger entry. - operationId: aes.wallet.v1.WalletService.ConfigureWalletAlerts + - aes.project.v1.ProjectService + summary: CreateOrganization + operationId: aes.project.v1.ProjectService.CreateOrganization parameters: - name: Connect-Protocol-Version in: header @@ -5745,7 +5676,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ConfigureWalletAlertsRequest' + $ref: '#/components/schemas/aes.project.v1.CreateOrganizationRequest' required: true responses: default: @@ -5759,18 +5690,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ConfigureWalletAlertsResponse' - /aes.wallet.v1.WalletService/CreateCardSetupIntent: + $ref: '#/components/schemas/aes.project.v1.CreateOrganizationResponse' + /aes.project.v1.ProjectService/CreateProject: post: tags: - - aes.wallet.v1.WalletService - summary: CreateCardSetupIntent - description: |- - CreateCardSetupIntent: Stripe SetupIntent in card mode. Returns the client_secret the - browser's needs to render + collect card details without charging. - After Stripe confirms, the frontend calls AttachPaymentMethod with the resulting - payment_method_id to persist + add to the customer. Used by onboarding + add-card UI. - operationId: aes.wallet.v1.WalletService.CreateCardSetupIntent + - aes.project.v1.ProjectService + summary: CreateProject + operationId: aes.project.v1.ProjectService.CreateProject parameters: - name: Connect-Protocol-Version in: header @@ -5785,7 +5711,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.CreateCardSetupIntentRequest' + $ref: '#/components/schemas/aes.project.v1.CreateProjectRequest' required: true responses: default: @@ -5799,16 +5725,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.CreateCardSetupIntentResponse' - /aes.wallet.v1.WalletService/CreateCoinbaseTopUpCheckout: + $ref: '#/components/schemas/aes.project.v1.CreateProjectResponse' + /aes.project.v1.ProjectService/DeleteOrganization: post: tags: - - aes.wallet.v1.WalletService - summary: CreateCoinbaseTopUpCheckout + - aes.project.v1.ProjectService + summary: DeleteOrganization description: |- - CreateCoinbaseTopUpCheckout: hosted USDC checkout for a wallet top-up. Returns a Coinbase - checkout URL the customer pays on; the wallet is credited when payment is confirmed. - operationId: aes.wallet.v1.WalletService.CreateCoinbaseTopUpCheckout + DeleteOrganization soft-deletes the org. Fails when the org still has projects/billing + accounts under it — clean those up first. + operationId: aes.project.v1.ProjectService.DeleteOrganization parameters: - name: Connect-Protocol-Version in: header @@ -5823,7 +5749,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.CreateCoinbaseTopUpCheckoutRequest' + $ref: '#/components/schemas/aes.project.v1.DeleteOrganizationRequest' required: true responses: default: @@ -5837,19 +5763,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.CreateCoinbaseTopUpCheckoutResponse' - /aes.wallet.v1.WalletService/CreateStripeTopUpIntent: + $ref: '#/components/schemas/aes.project.v1.DeleteOrganizationResponse' + /aes.project.v1.ProjectService/DeleteProject: post: tags: - - aes.wallet.v1.WalletService - summary: CreateStripeTopUpIntent + - aes.project.v1.ProjectService + summary: DeleteProject description: |- - Customer-initiated top-ups. Two flavors: - - Stripe payment intent: customer's browser confirms a card charge; the wallet is - credited on payment success. - - Coinbase checkout: returns a hosted Coinbase URL the customer pays USDC on (any chain - Coinbase supports); the wallet is credited on payment success. - operationId: aes.wallet.v1.WalletService.CreateStripeTopUpIntent + DeleteProject soft-deletes the project. Cascading FKs on compute_instances / tenant_networks / + service_accounts wipe project resources via ON DELETE CASCADE; compact billing history keeps the project_name + as history (FK is ON DELETE SET NULL). + operationId: aes.project.v1.ProjectService.DeleteProject parameters: - name: Connect-Protocol-Version in: header @@ -5864,7 +5788,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.CreateStripeTopUpIntentRequest' + $ref: '#/components/schemas/aes.project.v1.DeleteProjectRequest' required: true responses: default: @@ -5878,13 +5802,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.CreateStripeTopUpIntentResponse' - /aes.wallet.v1.WalletService/DetachPaymentMethod: + $ref: '#/components/schemas/aes.project.v1.DeleteProjectResponse' + /aes.project.v1.ProjectService/GetOrganization: post: tags: - - aes.wallet.v1.WalletService - summary: DetachPaymentMethod - operationId: aes.wallet.v1.WalletService.DetachPaymentMethod + - aes.project.v1.ProjectService + summary: GetOrganization + operationId: aes.project.v1.ProjectService.GetOrganization parameters: - name: Connect-Protocol-Version in: header @@ -5899,7 +5823,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.DetachPaymentMethodRequest' + $ref: '#/components/schemas/aes.project.v1.GetOrganizationRequest' required: true responses: default: @@ -5913,13 +5837,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.DetachPaymentMethodResponse' - /aes.wallet.v1.WalletService/DownloadInvoicePDF: + $ref: '#/components/schemas/aes.project.v1.GetOrganizationResponse' + /aes.project.v1.ProjectService/GetProject: post: tags: - - aes.wallet.v1.WalletService - summary: DownloadInvoicePDF - operationId: aes.wallet.v1.WalletService.DownloadInvoicePDF + - aes.project.v1.ProjectService + summary: GetProject + operationId: aes.project.v1.ProjectService.GetProject parameters: - name: Connect-Protocol-Version in: header @@ -5934,7 +5858,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.DownloadInvoicePDFRequest' + $ref: '#/components/schemas/aes.project.v1.GetProjectRequest' required: true responses: default: @@ -5948,13 +5872,18 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.DownloadInvoicePDFResponse' - /aes.wallet.v1.WalletService/ExportUsage: + $ref: '#/components/schemas/aes.project.v1.GetProjectResponse' + /aes.project.v1.ProjectService/ListOrgActivity: post: tags: - - aes.wallet.v1.WalletService - summary: ExportUsage - operationId: aes.wallet.v1.WalletService.ExportUsage + - aes.project.v1.ProjectService + summary: ListOrgActivity + description: |- + ListOrgActivity returns a humanized stream of recent events across the org — VM created, + disk resized, payment processed, firewall rule added, etc. Backed by audit_events but + filtered + reshaped for end-user consumption (raw audit log is available via + AuditService.SearchEvents). Sorted newest-first. + operationId: aes.project.v1.ProjectService.ListOrgActivity parameters: - name: Connect-Protocol-Version in: header @@ -5969,7 +5898,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ExportUsageRequest' + $ref: '#/components/schemas/aes.project.v1.ListOrgActivityRequest' required: true responses: default: @@ -5983,13 +5912,17 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ExportUsageResponse' - /aes.wallet.v1.WalletService/GetActivePromotion: + $ref: '#/components/schemas/aes.project.v1.ListOrgActivityResponse' + /aes.project.v1.ProjectService/ListProjectMembers: post: tags: - - aes.wallet.v1.WalletService - summary: GetActivePromotion - operationId: aes.wallet.v1.WalletService.GetActivePromotion + - aes.project.v1.ProjectService + summary: ListProjectMembers + description: |- + Per-member project access (#208). Org owners/admins reach every project implicitly; these + RPCs grant a specific org member access to a specific project with a project role + (owner/editor/viewer). Caller must be a project owner, an org owner/admin, or platform admin. + operationId: aes.project.v1.ProjectService.ListProjectMembers parameters: - name: Connect-Protocol-Version in: header @@ -6004,7 +5937,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetActivePromotionRequest' + $ref: '#/components/schemas/aes.project.v1.ListProjectMembersRequest' required: true responses: default: @@ -6018,13 +5951,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetActivePromotionResponse' - /aes.wallet.v1.WalletService/GetAutoRechargeConfig: + $ref: '#/components/schemas/aes.project.v1.ListProjectMembersResponse' + /aes.project.v1.ProjectService/ListProjects: post: tags: - - aes.wallet.v1.WalletService - summary: GetAutoRechargeConfig - operationId: aes.wallet.v1.WalletService.GetAutoRechargeConfig + - aes.project.v1.ProjectService + summary: ListProjects + operationId: aes.project.v1.ProjectService.ListProjects parameters: - name: Connect-Protocol-Version in: header @@ -6039,7 +5972,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetAutoRechargeConfigRequest' + $ref: '#/components/schemas/aes.project.v1.ListProjectsRequest' required: true responses: default: @@ -6053,13 +5986,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetAutoRechargeConfigResponse' - /aes.wallet.v1.WalletService/GetBillingAccount: + $ref: '#/components/schemas/aes.project.v1.ListProjectsResponse' + /aes.project.v1.ProjectService/RemoveProjectMember: post: tags: - - aes.wallet.v1.WalletService - summary: GetBillingAccount - operationId: aes.wallet.v1.WalletService.GetBillingAccount + - aes.project.v1.ProjectService + summary: RemoveProjectMember + description: |- + RemoveProjectMember revokes a member's project-scoped access (org owners/admins keep implicit + access regardless). + operationId: aes.project.v1.ProjectService.RemoveProjectMember parameters: - name: Connect-Protocol-Version in: header @@ -6074,7 +6010,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetBillingAccountRequest' + $ref: '#/components/schemas/aes.project.v1.RemoveProjectMemberRequest' required: true responses: default: @@ -6088,17 +6024,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetBillingAccountResponse' - /aes.wallet.v1.WalletService/GetCostForecast: + $ref: '#/components/schemas/aes.project.v1.RemoveProjectMemberResponse' + /aes.project.v1.ProjectService/SetProjectMember: post: tags: - - aes.wallet.v1.WalletService - summary: GetCostForecast - description: |- - GetCostForecast returns month-to-date spend + a linear projection to end-of-month. Customers - call this for budget tracking; the projection is naive (mtd_spend / days_elapsed × days_in_month) - with no seasonality or per-resource modeling. - operationId: aes.wallet.v1.WalletService.GetCostForecast + - aes.project.v1.ProjectService + summary: SetProjectMember + description: SetProjectMember grants or updates a member's role on the project (idempotent upsert). + operationId: aes.project.v1.ProjectService.SetProjectMember parameters: - name: Connect-Protocol-Version in: header @@ -6113,7 +6046,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetCostForecastRequest' + $ref: '#/components/schemas/aes.project.v1.SetProjectMemberRequest' required: true responses: default: @@ -6127,13 +6060,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetCostForecastResponse' - /aes.wallet.v1.WalletService/GetInvoice: + $ref: '#/components/schemas/aes.project.v1.SetProjectMemberResponse' + /aes.project.v1.ProjectService/UpdateOrganization: post: tags: - - aes.wallet.v1.WalletService - summary: GetInvoice - operationId: aes.wallet.v1.WalletService.GetInvoice + - aes.project.v1.ProjectService + summary: UpdateOrganization + operationId: aes.project.v1.ProjectService.UpdateOrganization parameters: - name: Connect-Protocol-Version in: header @@ -6148,7 +6081,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetInvoiceRequest' + $ref: '#/components/schemas/aes.project.v1.UpdateOrganizationRequest' required: true responses: default: @@ -6162,17 +6095,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetInvoiceResponse' - /aes.wallet.v1.WalletService/GetProjectSpendBreakdown: + $ref: '#/components/schemas/aes.project.v1.UpdateOrganizationResponse' + /aes.project.v1.ProjectService/UpdateProject: post: tags: - - aes.wallet.v1.WalletService - summary: GetProjectSpendBreakdown - description: |- - GetProjectSpendBreakdown returns this period's spend broken down by project (#208). Billing - stays org-level (one wallet/invoice); this is read-only visibility into which project drives - cost. Spend is estimated from metered usage × effective rates over the period. - operationId: aes.wallet.v1.WalletService.GetProjectSpendBreakdown + - aes.project.v1.ProjectService + summary: UpdateProject + operationId: aes.project.v1.ProjectService.UpdateProject parameters: - name: Connect-Protocol-Version in: header @@ -6187,7 +6116,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetProjectSpendBreakdownRequest' + $ref: '#/components/schemas/aes.project.v1.UpdateProjectRequest' required: true responses: default: @@ -6201,13 +6130,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetProjectSpendBreakdownResponse' - /aes.wallet.v1.WalletService/GetTopUp: + $ref: '#/components/schemas/aes.project.v1.UpdateProjectResponse' + /aes.quota.v1.QuotaService/GetMyQuotas: post: tags: - - aes.wallet.v1.WalletService - summary: GetTopUp - operationId: aes.wallet.v1.WalletService.GetTopUp + - aes.quota.v1.QuotaService + summary: GetMyQuotas + operationId: aes.quota.v1.QuotaService.GetMyQuotas parameters: - name: Connect-Protocol-Version in: header @@ -6222,7 +6151,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetTopUpRequest' + $ref: '#/components/schemas/aes.quota.v1.GetMyQuotasRequest' required: true responses: default: @@ -6236,13 +6165,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetTopUpResponse' - /aes.wallet.v1.WalletService/GetWallet: + $ref: '#/components/schemas/aes.quota.v1.GetMyQuotasResponse' + /aes.quota.v1.QuotaService/ListMyQuotaRequests: post: tags: - - aes.wallet.v1.WalletService - summary: GetWallet - operationId: aes.wallet.v1.WalletService.GetWallet + - aes.quota.v1.QuotaService + summary: ListMyQuotaRequests + description: ListMyQuotaRequests returns the organization's quota requests, newest first. + operationId: aes.quota.v1.QuotaService.ListMyQuotaRequests parameters: - name: Connect-Protocol-Version in: header @@ -6257,7 +6187,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetWalletRequest' + $ref: '#/components/schemas/aes.quota.v1.ListMyQuotaRequestsRequest' required: true responses: default: @@ -6271,13 +6201,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetWalletResponse' - /aes.wallet.v1.WalletService/GetWalletAlerts: + $ref: '#/components/schemas/aes.quota.v1.ListMyQuotaRequestsResponse' + /aes.quota.v1.QuotaService/RequestQuotaIncrease: post: tags: - - aes.wallet.v1.WalletService - summary: GetWalletAlerts - operationId: aes.wallet.v1.WalletService.GetWalletAlerts + - aes.quota.v1.QuotaService + summary: RequestQuotaIncrease + description: |- + RequestQuotaIncrease files a request to raise an organization-level quota. Requests are + reviewed by the platform team; track status via ListMyQuotaRequests. + operationId: aes.quota.v1.QuotaService.RequestQuotaIncrease parameters: - name: Connect-Protocol-Version in: header @@ -6292,7 +6225,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetWalletAlertsRequest' + $ref: '#/components/schemas/aes.quota.v1.RequestQuotaIncreaseRequest' required: true responses: default: @@ -6306,17 +6239,16 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetWalletAlertsResponse' - /aes.wallet.v1.WalletService/GetWalletBalance: + $ref: '#/components/schemas/aes.quota.v1.RequestQuotaIncreaseResponse' + /aes.storage.v1.StorageService/AttachDisk: post: tags: - - aes.wallet.v1.WalletService - summary: GetWalletBalance + - aes.storage.v1.StorageService + summary: AttachDisk description: |- - GetWalletBalance returns the current prepay balance. Separate from GetWallet so the cheap - balance-only lookup doesn't drag the full wallet metadata + permissions check overhead. - Caller needs wallet read access. - operationId: aes.wallet.v1.WalletService.GetWalletBalance + AttachDisk hot-plugs the disk into the named VM. The disk must be AVAILABLE (not already + attached); the VM must be RUNNING. + operationId: aes.storage.v1.StorageService.AttachDisk parameters: - name: Connect-Protocol-Version in: header @@ -6331,7 +6263,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetWalletBalanceRequest' + $ref: '#/components/schemas/aes.storage.v1.AttachDiskRequest' required: true responses: default: @@ -6345,13 +6277,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.GetWalletBalanceResponse' - /aes.wallet.v1.WalletService/ListBillingAccounts: + $ref: '#/components/schemas/aes.storage.v1.AttachDiskResponse' + /aes.storage.v1.StorageService/CreateDisk: post: tags: - - aes.wallet.v1.WalletService - summary: ListBillingAccounts - operationId: aes.wallet.v1.WalletService.ListBillingAccounts + - aes.storage.v1.StorageService + summary: CreateDisk + operationId: aes.storage.v1.StorageService.CreateDisk parameters: - name: Connect-Protocol-Version in: header @@ -6366,7 +6298,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListBillingAccountsRequest' + $ref: '#/components/schemas/aes.storage.v1.CreateDiskRequest' required: true responses: default: @@ -6380,21 +6312,22 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListBillingAccountsResponse' - /aes.wallet.v1.WalletService/ListInvoices: + $ref: '#/components/schemas/aes.storage.v1.CreateDiskResponse' + /aes.storage.v1.StorageService/CreateFileShare: post: tags: - - aes.wallet.v1.WalletService - summary: ListInvoices + - aes.storage.v1.StorageService + summary: CreateFileShare description: |- - Invoice viewer. Invoices are auto-generated by a monthly close worker (separate cron); these - RPCs let customers list/get/download. PDF lives in object storage; DownloadInvoicePDF - returns a signed URL. - operationId: aes.wallet.v1.WalletService.ListInvoices - parameters: - - name: Connect-Protocol-Version - in: header - required: true + File shares — RWX NFS volumes that multiple VMs in the same tenant network can mount + concurrently. Access is restricted to the tenant network, so any VM on that network can + `mount -t nfs4` using the FileShare's `mount_command`. No attach/detach bookkeeping — + the customer mounts in-guest. + operationId: aes.storage.v1.StorageService.CreateFileShare + parameters: + - name: Connect-Protocol-Version + in: header + required: true schema: $ref: '#/components/schemas/connect-protocol-version' - name: Connect-Timeout-Ms @@ -6405,7 +6338,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListInvoicesRequest' + $ref: '#/components/schemas/aes.storage.v1.CreateFileShareRequest' required: true responses: default: @@ -6419,13 +6352,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListInvoicesResponse' - /aes.wallet.v1.WalletService/ListPaymentMethods: + $ref: '#/components/schemas/aes.storage.v1.CreateFileShareResponse' + /aes.storage.v1.StorageService/CreateSnapshot: post: tags: - - aes.wallet.v1.WalletService - summary: ListPaymentMethods - operationId: aes.wallet.v1.WalletService.ListPaymentMethods + - aes.storage.v1.StorageService + summary: CreateSnapshot + operationId: aes.storage.v1.StorageService.CreateSnapshot parameters: - name: Connect-Protocol-Version in: header @@ -6440,7 +6373,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListPaymentMethodsRequest' + $ref: '#/components/schemas/aes.storage.v1.CreateSnapshotRequest' required: true responses: default: @@ -6454,17 +6387,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListPaymentMethodsResponse' - /aes.wallet.v1.WalletService/ListPublicMeterRates: + $ref: '#/components/schemas/aes.storage.v1.CreateSnapshotResponse' + /aes.storage.v1.StorageService/CreateSnapshotSchedule: post: tags: - - aes.wallet.v1.WalletService - summary: ListPublicMeterRates - description: |- - ListPublicMeterRates returns the currently-effective rate per (meter, currency). Read-only, - un-scoped — meters are public catalog data; pricing is the same for every customer (any - per-customer discounts will live in a separate negotiated_rates table later). - operationId: aes.wallet.v1.WalletService.ListPublicMeterRates + - aes.storage.v1.StorageService + summary: CreateSnapshotSchedule + operationId: aes.storage.v1.StorageService.CreateSnapshotSchedule parameters: - name: Connect-Protocol-Version in: header @@ -6479,7 +6408,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListPublicMeterRatesRequest' + $ref: '#/components/schemas/aes.storage.v1.CreateSnapshotScheduleRequest' required: true responses: default: @@ -6493,13 +6422,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListPublicMeterRatesResponse' - /aes.wallet.v1.WalletService/ListTopUps: + $ref: '#/components/schemas/aes.storage.v1.CreateSnapshotScheduleResponse' + /aes.storage.v1.StorageService/DeleteDisk: post: tags: - - aes.wallet.v1.WalletService - summary: ListTopUps - operationId: aes.wallet.v1.WalletService.ListTopUps + - aes.storage.v1.StorageService + summary: DeleteDisk + operationId: aes.storage.v1.StorageService.DeleteDisk parameters: - name: Connect-Protocol-Version in: header @@ -6514,7 +6443,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListTopUpsRequest' + $ref: '#/components/schemas/aes.storage.v1.DeleteDiskRequest' required: true responses: default: @@ -6528,16 +6457,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.ListTopUpsResponse' - /aes.wallet.v1.WalletService/QueryUsage: + $ref: '#/components/schemas/aes.storage.v1.DeleteDiskResponse' + /aes.storage.v1.StorageService/DeleteFileShare: post: tags: - - aes.wallet.v1.WalletService - summary: QueryUsage - description: |- - Usage query / export. QueryUsage aggregates compact daily V2 accruals by meter / project / - time-bucket; ExportUsage materializes CSV/NDJSON in object storage and returns a presigned URL. - operationId: aes.wallet.v1.WalletService.QueryUsage + - aes.storage.v1.StorageService + summary: DeleteFileShare + operationId: aes.storage.v1.StorageService.DeleteFileShare parameters: - name: Connect-Protocol-Version in: header @@ -6552,7 +6478,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.QueryUsageRequest' + $ref: '#/components/schemas/aes.storage.v1.DeleteFileShareRequest' required: true responses: default: @@ -6566,19 +6492,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.QueryUsageResponse' - /aes.wallet.v1.WalletService/RedeemPromotionCode: + $ref: '#/components/schemas/aes.storage.v1.DeleteFileShareResponse' + /aes.storage.v1.StorageService/DeleteSnapshot: post: tags: - - aes.wallet.v1.WalletService - summary: RedeemPromotionCode - description: |- - Promotions. RedeemPromotionCode accepts a single-use coupon code or a shared campaign - code (e.g. "PODCAST50" / "MH5"), redeemable once per org. Discount promotions install a - percentage-off window applied at settlement / prepaid-quote time; credit promotions add - the funds to the wallet at redeem time (a saved payment method is required for those). - GetActivePromotion backs the billing-page banner for both kinds. - operationId: aes.wallet.v1.WalletService.RedeemPromotionCode + - aes.storage.v1.StorageService + summary: DeleteSnapshot + operationId: aes.storage.v1.StorageService.DeleteSnapshot parameters: - name: Connect-Protocol-Version in: header @@ -6593,7 +6513,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.RedeemPromotionCodeRequest' + $ref: '#/components/schemas/aes.storage.v1.DeleteSnapshotRequest' required: true responses: default: @@ -6607,13 +6527,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.RedeemPromotionCodeResponse' - /aes.wallet.v1.WalletService/SetDefaultPaymentMethod: + $ref: '#/components/schemas/aes.storage.v1.DeleteSnapshotResponse' + /aes.storage.v1.StorageService/DeleteSnapshotSchedule: post: tags: - - aes.wallet.v1.WalletService - summary: SetDefaultPaymentMethod - operationId: aes.wallet.v1.WalletService.SetDefaultPaymentMethod + - aes.storage.v1.StorageService + summary: DeleteSnapshotSchedule + operationId: aes.storage.v1.StorageService.DeleteSnapshotSchedule parameters: - name: Connect-Protocol-Version in: header @@ -6628,7 +6548,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.SetDefaultPaymentMethodRequest' + $ref: '#/components/schemas/aes.storage.v1.DeleteSnapshotScheduleRequest' required: true responses: default: @@ -6642,13 +6562,14 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.wallet.v1.SetDefaultPaymentMethodResponse' - /aes.webhooks.v1.WebhooksService/CreateSubscription: + $ref: '#/components/schemas/aes.storage.v1.DeleteSnapshotScheduleResponse' + /aes.storage.v1.StorageService/DetachDisk: post: tags: - - aes.webhooks.v1.WebhooksService - summary: CreateSubscription - operationId: aes.webhooks.v1.WebhooksService.CreateSubscription + - aes.storage.v1.StorageService + summary: DetachDisk + description: DetachDisk hot-unplugs the disk. The disk returns to AVAILABLE; the VM keeps running. + operationId: aes.storage.v1.StorageService.DetachDisk parameters: - name: Connect-Protocol-Version in: header @@ -6663,7 +6584,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.CreateSubscriptionRequest' + $ref: '#/components/schemas/aes.storage.v1.DetachDiskRequest' required: true responses: default: @@ -6677,13 +6598,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.CreateSubscriptionResponse' - /aes.webhooks.v1.WebhooksService/DeleteSubscription: + $ref: '#/components/schemas/aes.storage.v1.DetachDiskResponse' + /aes.storage.v1.StorageService/GetDisk: post: tags: - - aes.webhooks.v1.WebhooksService - summary: DeleteSubscription - operationId: aes.webhooks.v1.WebhooksService.DeleteSubscription + - aes.storage.v1.StorageService + summary: GetDisk + operationId: aes.storage.v1.StorageService.GetDisk parameters: - name: Connect-Protocol-Version in: header @@ -6698,7 +6619,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.DeleteSubscriptionRequest' + $ref: '#/components/schemas/aes.storage.v1.GetDiskRequest' required: true responses: default: @@ -6712,13 +6633,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.DeleteSubscriptionResponse' - /aes.webhooks.v1.WebhooksService/GetSubscription: + $ref: '#/components/schemas/aes.storage.v1.GetDiskResponse' + /aes.storage.v1.StorageService/GetSnapshot: post: tags: - - aes.webhooks.v1.WebhooksService - summary: GetSubscription - operationId: aes.webhooks.v1.WebhooksService.GetSubscription + - aes.storage.v1.StorageService + summary: GetSnapshot + operationId: aes.storage.v1.StorageService.GetSnapshot parameters: - name: Connect-Protocol-Version in: header @@ -6733,7 +6654,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.GetSubscriptionRequest' + $ref: '#/components/schemas/aes.storage.v1.GetSnapshotRequest' required: true responses: default: @@ -6747,16 +6668,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.GetSubscriptionResponse' - /aes.webhooks.v1.WebhooksService/ListDeliveries: + $ref: '#/components/schemas/aes.storage.v1.GetSnapshotResponse' + /aes.storage.v1.StorageService/ListDisks: post: tags: - - aes.webhooks.v1.WebhooksService - summary: ListDeliveries - description: |- - ListDeliveries shows recent attempts for a subscription — status code, response body - snippet, retry count. Bounded ring (last 100 per subscription). - operationId: aes.webhooks.v1.WebhooksService.ListDeliveries + - aes.storage.v1.StorageService + summary: ListDisks + operationId: aes.storage.v1.StorageService.ListDisks parameters: - name: Connect-Protocol-Version in: header @@ -6771,7 +6689,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.ListDeliveriesRequest' + $ref: '#/components/schemas/aes.storage.v1.ListDisksRequest' required: true responses: default: @@ -6785,13 +6703,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.ListDeliveriesResponse' - /aes.webhooks.v1.WebhooksService/ListSubscriptions: + $ref: '#/components/schemas/aes.storage.v1.ListDisksResponse' + /aes.storage.v1.StorageService/ListFileShares: post: tags: - - aes.webhooks.v1.WebhooksService - summary: ListSubscriptions - operationId: aes.webhooks.v1.WebhooksService.ListSubscriptions + - aes.storage.v1.StorageService + summary: ListFileShares + operationId: aes.storage.v1.StorageService.ListFileShares parameters: - name: Connect-Protocol-Version in: header @@ -6806,7 +6724,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.ListSubscriptionsRequest' + $ref: '#/components/schemas/aes.storage.v1.ListFileSharesRequest' required: true responses: default: @@ -6820,13 +6738,13 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.ListSubscriptionsResponse' - /aes.webhooks.v1.WebhooksService/UpdateSubscription: + $ref: '#/components/schemas/aes.storage.v1.ListFileSharesResponse' + /aes.storage.v1.StorageService/ListSnapshotSchedules: post: tags: - - aes.webhooks.v1.WebhooksService - summary: UpdateSubscription - operationId: aes.webhooks.v1.WebhooksService.UpdateSubscription + - aes.storage.v1.StorageService + summary: ListSnapshotSchedules + operationId: aes.storage.v1.StorageService.ListSnapshotSchedules parameters: - name: Connect-Protocol-Version in: header @@ -6841,7 +6759,7 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.UpdateSubscriptionRequest' + $ref: '#/components/schemas/aes.storage.v1.ListSnapshotSchedulesRequest' required: true responses: default: @@ -6855,344 +6773,3488 @@ paths: content: application/json: schema: - $ref: '#/components/schemas/aes.webhooks.v1.UpdateSubscriptionResponse' -components: - schemas: - aes.audit.v1.AuditChange: - type: object - properties: - field: - type: string - title: field - description: e.g. "role", "state", "unit_price_minor", "limit_value", "balance_minor" - before: - type: string - title: before - description: stringified — display only - after: - type: string - title: after - title: AuditChange - additionalProperties: false - description: AuditChange is a single-field before→after diff attached to a mutation's audit event. - aes.audit.v1.AuditEvent: - type: object - properties: - id: - type: string - title: id - timestampUnix: - type: - - integer - - string - title: timestamp_unix - format: int64 - action: - type: string - title: action - principal: - type: string - title: principal - resourceName: - type: string - title: resource_name - description: |- - Resource the event is about, e.g. `virtual-machines/`. Renamed from `resource` to - match the platform `*_name` convention (proto audit pass). - metadata: - type: object - title: metadata - additionalProperties: - type: string - title: value - requestId: - type: string - title: request_id - traceId: - type: string - title: trace_id - organizationName: - type: string - title: organization_name - projectName: - type: string - title: project_name - severity: - type: string - title: severity - change: - title: change - description: |- - Structured before→after diff for state-changing mutations (role flips, rate changes, - suspensions, quota bumps). Recorded server-side at mutation time; null when the event - carries no structured diff. Display-only — values are stringified. - $ref: '#/components/schemas/aes.audit.v1.AuditChange' - title: AuditEvent - additionalProperties: false - aes.audit.v1.AuditEvent.MetadataEntry: - type: object - properties: - key: - type: string - title: key - value: - type: string - title: value - title: MetadataEntry + $ref: '#/components/schemas/aes.storage.v1.ListSnapshotSchedulesResponse' + /aes.storage.v1.StorageService/ListSnapshots: + post: + tags: + - aes.storage.v1.StorageService + summary: ListSnapshots + operationId: aes.storage.v1.StorageService.ListSnapshots + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.ListSnapshotsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.ListSnapshotsResponse' + /aes.storage.v1.StorageService/QuoteDiskResize: + post: + tags: + - aes.storage.v1.StorageService + summary: QuoteDiskResize + description: |- + QuoteDiskResize prices a resize before it is applied. A disk covered by its VM's monthly + reservation grows as a paid upgrade: the difference for the remaining term is charged + immediately on resize — due_now_minor is that amount. 0 for hourly-billed disks. + operationId: aes.storage.v1.StorageService.QuoteDiskResize + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.QuoteDiskResizeRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.QuoteDiskResizeResponse' + /aes.storage.v1.StorageService/ResizeDisk: + post: + tags: + - aes.storage.v1.StorageService + summary: ResizeDisk + description: |- + ResizeDisk grows the disk online — the volume expands without unmounting; for attached + disks, the guest sees the new size after a filesystem-level resize. Shrinking is not + supported (expansion is one-way). + operationId: aes.storage.v1.StorageService.ResizeDisk + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.ResizeDiskRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.ResizeDiskResponse' + /aes.storage.v1.StorageService/UpdateDisk: + post: + tags: + - aes.storage.v1.StorageService + summary: UpdateDisk + operationId: aes.storage.v1.StorageService.UpdateDisk + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.UpdateDiskRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.UpdateDiskResponse' + /aes.storage.v1.StorageService/UpdateSnapshotSchedule: + post: + tags: + - aes.storage.v1.StorageService + summary: UpdateSnapshotSchedule + operationId: aes.storage.v1.StorageService.UpdateSnapshotSchedule + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.UpdateSnapshotScheduleRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.storage.v1.UpdateSnapshotScheduleResponse' + /aes.support.v1.SupportService/CloseTicket: + post: + tags: + - aes.support.v1.SupportService + summary: CloseTicket + description: CloseTicket closes the conversation. ReplyTicket with reopen=true can reopen it at any time. + operationId: aes.support.v1.SupportService.CloseTicket + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.CloseTicketRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.CloseTicketResponse' + /aes.support.v1.SupportService/CreateTicket: + post: + tags: + - aes.support.v1.SupportService + summary: CreateTicket + description: CreateTicket opens a new ticket and posts the initial customer message. + operationId: aes.support.v1.SupportService.CreateTicket + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.CreateTicketRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.CreateTicketResponse' + /aes.support.v1.SupportService/GetTicket: + post: + tags: + - aes.support.v1.SupportService + summary: GetTicket + description: |- + GetTicket returns the ticket and its message thread. internal_note messages are + filtered out for non-staff callers. + operationId: aes.support.v1.SupportService.GetTicket + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.GetTicketRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.GetTicketResponse' + /aes.support.v1.SupportService/ListTickets: + post: + tags: + - aes.support.v1.SupportService + summary: ListTickets + description: |- + ListTickets returns tickets owned by the caller's organization. Closed tickets are + excluded by default; pass status_filter=TICKET_STATUS_CLOSED to see them. + operationId: aes.support.v1.SupportService.ListTickets + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.ListTicketsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.ListTicketsResponse' + /aes.support.v1.SupportService/ReplyTicket: + post: + tags: + - aes.support.v1.SupportService + summary: ReplyTicket + description: |- + ReplyTicket appends a customer message and transitions status to PENDING_STAFF when the + ticket was previously PENDING_CUSTOMER. No-op transition otherwise. + operationId: aes.support.v1.SupportService.ReplyTicket + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.ReplyTicketRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.support.v1.ReplyTicketResponse' + /aes.wallet.v1.WalletService/AttachPaymentMethod: + post: + tags: + - aes.wallet.v1.WalletService + summary: AttachPaymentMethod + description: |- + Payment method management. Metalhost never sees raw card data — the customer obtains a + Stripe payment method ID via Stripe.js client-side and posts the id here. Metalhost stores + (stripe_customer_id, stripe_payment_method_id, last4, brand, exp). AttachPaymentMethod + also creates the Stripe customer if the billing account doesn't have one yet. + operationId: aes.wallet.v1.WalletService.AttachPaymentMethod + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.AttachPaymentMethodRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.AttachPaymentMethodResponse' + /aes.wallet.v1.WalletService/ConfigureAutoRecharge: + post: + tags: + - aes.wallet.v1.WalletService + summary: ConfigureAutoRecharge + description: |- + Auto-recharge — opt-in. Customer enables Stripe auto-charge by setting enabled=true with a + saved payment_method, threshold, and amount. The dispatcher only picks wallets where + enabled = TRUE; Metalhost never charges a card without explicit consent. Disable by setting + enabled=false (config is preserved so re-enabling doesn't require resubmitting threshold/amount). + operationId: aes.wallet.v1.WalletService.ConfigureAutoRecharge + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ConfigureAutoRechargeRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ConfigureAutoRechargeResponse' + /aes.wallet.v1.WalletService/ConfigureWalletAlerts: + post: + tags: + - aes.wallet.v1.WalletService + summary: ConfigureWalletAlerts + description: |- + Wallet alerts. One config per wallet: balance_alert_minor (fire when prepay balance drops + below) and/or days_remaining_alert (fire when balance / daily burn falls below this many + days). Either can be unset (NULL) to disable that alert. Edge-fire arming — fires once + when the condition first becomes true, re-arms when balance recovers above the threshold. + Customer-side refunds are not modeled: open a support ticket; operator refunds via + Stripe Dashboard and the charge.refunded webhook posts the ledger entry. + operationId: aes.wallet.v1.WalletService.ConfigureWalletAlerts + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ConfigureWalletAlertsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ConfigureWalletAlertsResponse' + /aes.wallet.v1.WalletService/CreateCardSetupIntent: + post: + tags: + - aes.wallet.v1.WalletService + summary: CreateCardSetupIntent + description: |- + CreateCardSetupIntent: Stripe SetupIntent in card mode. Returns the client_secret the + browser's needs to render + collect card details without charging. + After Stripe confirms, the frontend calls AttachPaymentMethod with the resulting + payment_method_id to persist + add to the customer. Used by onboarding + add-card UI. + operationId: aes.wallet.v1.WalletService.CreateCardSetupIntent + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.CreateCardSetupIntentRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.CreateCardSetupIntentResponse' + /aes.wallet.v1.WalletService/CreateCoinbaseTopUpCheckout: + post: + tags: + - aes.wallet.v1.WalletService + summary: CreateCoinbaseTopUpCheckout + description: |- + CreateCoinbaseTopUpCheckout: hosted USDC checkout for a wallet top-up. Returns a Coinbase + checkout URL the customer pays on; the wallet is credited when payment is confirmed. + operationId: aes.wallet.v1.WalletService.CreateCoinbaseTopUpCheckout + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.CreateCoinbaseTopUpCheckoutRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.CreateCoinbaseTopUpCheckoutResponse' + /aes.wallet.v1.WalletService/CreateStripeTopUpIntent: + post: + tags: + - aes.wallet.v1.WalletService + summary: CreateStripeTopUpIntent + description: |- + Customer-initiated top-ups. Two flavors: + - Stripe payment intent: customer's browser confirms a card charge; the wallet is + credited on payment success. + - Coinbase checkout: returns a hosted Coinbase URL the customer pays USDC on (any chain + Coinbase supports); the wallet is credited on payment success. + operationId: aes.wallet.v1.WalletService.CreateStripeTopUpIntent + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.CreateStripeTopUpIntentRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.CreateStripeTopUpIntentResponse' + /aes.wallet.v1.WalletService/DetachPaymentMethod: + post: + tags: + - aes.wallet.v1.WalletService + summary: DetachPaymentMethod + operationId: aes.wallet.v1.WalletService.DetachPaymentMethod + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.DetachPaymentMethodRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.DetachPaymentMethodResponse' + /aes.wallet.v1.WalletService/DownloadInvoicePDF: + post: + tags: + - aes.wallet.v1.WalletService + summary: DownloadInvoicePDF + operationId: aes.wallet.v1.WalletService.DownloadInvoicePDF + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.DownloadInvoicePDFRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.DownloadInvoicePDFResponse' + /aes.wallet.v1.WalletService/ExportUsage: + post: + tags: + - aes.wallet.v1.WalletService + summary: ExportUsage + operationId: aes.wallet.v1.WalletService.ExportUsage + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ExportUsageRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ExportUsageResponse' + /aes.wallet.v1.WalletService/GetActivePromotion: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetActivePromotion + operationId: aes.wallet.v1.WalletService.GetActivePromotion + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetActivePromotionRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetActivePromotionResponse' + /aes.wallet.v1.WalletService/GetAutoRechargeConfig: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetAutoRechargeConfig + operationId: aes.wallet.v1.WalletService.GetAutoRechargeConfig + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetAutoRechargeConfigRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetAutoRechargeConfigResponse' + /aes.wallet.v1.WalletService/GetBillingAccount: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetBillingAccount + operationId: aes.wallet.v1.WalletService.GetBillingAccount + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetBillingAccountRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetBillingAccountResponse' + /aes.wallet.v1.WalletService/GetCostForecast: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetCostForecast + description: |- + GetCostForecast returns month-to-date spend + a linear projection to end-of-month. Customers + call this for budget tracking; the projection is naive (mtd_spend / days_elapsed × days_in_month) + with no seasonality or per-resource modeling. + operationId: aes.wallet.v1.WalletService.GetCostForecast + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetCostForecastRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetCostForecastResponse' + /aes.wallet.v1.WalletService/GetInvoice: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetInvoice + operationId: aes.wallet.v1.WalletService.GetInvoice + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetInvoiceRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetInvoiceResponse' + /aes.wallet.v1.WalletService/GetProjectSpendBreakdown: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetProjectSpendBreakdown + description: |- + GetProjectSpendBreakdown returns this period's spend broken down by project (#208). Billing + stays org-level (one wallet/invoice); this is read-only visibility into which project drives + cost. Spend is estimated from metered usage × effective rates over the period. + operationId: aes.wallet.v1.WalletService.GetProjectSpendBreakdown + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetProjectSpendBreakdownRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetProjectSpendBreakdownResponse' + /aes.wallet.v1.WalletService/GetTopUp: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetTopUp + operationId: aes.wallet.v1.WalletService.GetTopUp + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetTopUpRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetTopUpResponse' + /aes.wallet.v1.WalletService/GetWallet: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetWallet + operationId: aes.wallet.v1.WalletService.GetWallet + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetWalletRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetWalletResponse' + /aes.wallet.v1.WalletService/GetWalletAlerts: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetWalletAlerts + operationId: aes.wallet.v1.WalletService.GetWalletAlerts + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetWalletAlertsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetWalletAlertsResponse' + /aes.wallet.v1.WalletService/GetWalletBalance: + post: + tags: + - aes.wallet.v1.WalletService + summary: GetWalletBalance + description: |- + GetWalletBalance returns the current prepay balance. Separate from GetWallet so the cheap + balance-only lookup doesn't drag the full wallet metadata + permissions check overhead. + Caller needs wallet read access. + operationId: aes.wallet.v1.WalletService.GetWalletBalance + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetWalletBalanceRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.GetWalletBalanceResponse' + /aes.wallet.v1.WalletService/ListBillingAccounts: + post: + tags: + - aes.wallet.v1.WalletService + summary: ListBillingAccounts + operationId: aes.wallet.v1.WalletService.ListBillingAccounts + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListBillingAccountsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListBillingAccountsResponse' + /aes.wallet.v1.WalletService/ListInvoices: + post: + tags: + - aes.wallet.v1.WalletService + summary: ListInvoices + description: |- + Invoice viewer. Invoices are auto-generated by a monthly close worker (separate cron); these + RPCs let customers list/get/download. PDF lives in object storage; DownloadInvoicePDF + returns a signed URL. + operationId: aes.wallet.v1.WalletService.ListInvoices + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListInvoicesRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListInvoicesResponse' + /aes.wallet.v1.WalletService/ListPaymentMethods: + post: + tags: + - aes.wallet.v1.WalletService + summary: ListPaymentMethods + operationId: aes.wallet.v1.WalletService.ListPaymentMethods + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListPaymentMethodsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListPaymentMethodsResponse' + /aes.wallet.v1.WalletService/ListPublicMeterRates: + post: + tags: + - aes.wallet.v1.WalletService + summary: ListPublicMeterRates + description: |- + ListPublicMeterRates returns the currently-effective rate per (meter, currency). Read-only, + un-scoped — meters are public catalog data; pricing is the same for every customer (any + per-customer discounts will live in a separate negotiated_rates table later). + operationId: aes.wallet.v1.WalletService.ListPublicMeterRates + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListPublicMeterRatesRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListPublicMeterRatesResponse' + /aes.wallet.v1.WalletService/ListTopUps: + post: + tags: + - aes.wallet.v1.WalletService + summary: ListTopUps + operationId: aes.wallet.v1.WalletService.ListTopUps + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListTopUpsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.ListTopUpsResponse' + /aes.wallet.v1.WalletService/QueryUsage: + post: + tags: + - aes.wallet.v1.WalletService + summary: QueryUsage + description: |- + Usage query / export. QueryUsage aggregates compact daily V2 accruals by meter / project / + time-bucket; ExportUsage materializes CSV/NDJSON in object storage and returns a presigned URL. + operationId: aes.wallet.v1.WalletService.QueryUsage + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.QueryUsageRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.QueryUsageResponse' + /aes.wallet.v1.WalletService/RedeemPromotionCode: + post: + tags: + - aes.wallet.v1.WalletService + summary: RedeemPromotionCode + description: |- + Promotions. RedeemPromotionCode accepts a single-use coupon code or a shared campaign + code (e.g. "PODCAST50" / "MH5"), redeemable once per org. Discount promotions install a + percentage-off window applied at settlement / prepaid-quote time; credit promotions add + the funds to the wallet at redeem time (a saved payment method is required for those). + GetActivePromotion backs the billing-page banner for both kinds. + operationId: aes.wallet.v1.WalletService.RedeemPromotionCode + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.RedeemPromotionCodeRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.RedeemPromotionCodeResponse' + /aes.wallet.v1.WalletService/SetDefaultPaymentMethod: + post: + tags: + - aes.wallet.v1.WalletService + summary: SetDefaultPaymentMethod + operationId: aes.wallet.v1.WalletService.SetDefaultPaymentMethod + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.SetDefaultPaymentMethodRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.wallet.v1.SetDefaultPaymentMethodResponse' + /aes.webhooks.v1.WebhooksService/CreateSubscription: + post: + tags: + - aes.webhooks.v1.WebhooksService + summary: CreateSubscription + operationId: aes.webhooks.v1.WebhooksService.CreateSubscription + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.CreateSubscriptionRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.CreateSubscriptionResponse' + /aes.webhooks.v1.WebhooksService/DeleteSubscription: + post: + tags: + - aes.webhooks.v1.WebhooksService + summary: DeleteSubscription + operationId: aes.webhooks.v1.WebhooksService.DeleteSubscription + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.DeleteSubscriptionRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.DeleteSubscriptionResponse' + /aes.webhooks.v1.WebhooksService/GetSubscription: + post: + tags: + - aes.webhooks.v1.WebhooksService + summary: GetSubscription + operationId: aes.webhooks.v1.WebhooksService.GetSubscription + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.GetSubscriptionRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.GetSubscriptionResponse' + /aes.webhooks.v1.WebhooksService/ListDeliveries: + post: + tags: + - aes.webhooks.v1.WebhooksService + summary: ListDeliveries + description: |- + ListDeliveries shows recent attempts for a subscription — status code, response body + snippet, retry count. Bounded ring (last 100 per subscription). + operationId: aes.webhooks.v1.WebhooksService.ListDeliveries + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.ListDeliveriesRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.ListDeliveriesResponse' + /aes.webhooks.v1.WebhooksService/ListSubscriptions: + post: + tags: + - aes.webhooks.v1.WebhooksService + summary: ListSubscriptions + operationId: aes.webhooks.v1.WebhooksService.ListSubscriptions + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.ListSubscriptionsRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.ListSubscriptionsResponse' + /aes.webhooks.v1.WebhooksService/RotateSubscriptionSecret: + post: + tags: + - aes.webhooks.v1.WebhooksService + summary: RotateSubscriptionSecret + operationId: aes.webhooks.v1.WebhooksService.RotateSubscriptionSecret + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.RotateSubscriptionSecretRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.RotateSubscriptionSecretResponse' + /aes.webhooks.v1.WebhooksService/UpdateSubscription: + post: + tags: + - aes.webhooks.v1.WebhooksService + summary: UpdateSubscription + operationId: aes.webhooks.v1.WebhooksService.UpdateSubscription + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.UpdateSubscriptionRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.webhooks.v1.UpdateSubscriptionResponse' +components: + schemas: + aes.audit.v1.AuditChange: + type: object + properties: + field: + type: string + title: field + description: e.g. "role", "state", "unit_price_minor", "limit_value", "balance_minor" + before: + type: string + title: before + description: stringified — display only + after: + type: string + title: after + title: AuditChange + additionalProperties: false + description: AuditChange is a single-field before→after diff attached to a mutation's audit event. + aes.audit.v1.AuditEvent: + type: object + properties: + id: + type: string + title: id + timestampUnix: + type: + - integer + - string + title: timestamp_unix + format: int64 + action: + type: string + title: action + principal: + type: string + title: principal + resourceName: + type: string + title: resource_name + description: |- + Resource the event is about, e.g. `virtual-machines/`. Renamed from `resource` to + match the platform `*_name` convention (proto audit pass). + metadata: + type: object + title: metadata + additionalProperties: + type: string + title: value + requestId: + type: string + title: request_id + traceId: + type: string + title: trace_id + organizationName: + type: string + title: organization_name + projectName: + type: string + title: project_name + severity: + type: string + title: severity + change: + title: change + description: |- + Structured before→after diff for state-changing mutations (role flips, rate changes, + suspensions, quota bumps). Recorded server-side at mutation time; null when the event + carries no structured diff. Display-only — values are stringified. + $ref: '#/components/schemas/aes.audit.v1.AuditChange' + title: AuditEvent + additionalProperties: false + aes.audit.v1.AuditEvent.MetadataEntry: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + title: MetadataEntry + additionalProperties: false + aes.audit.v1.LogEventRequest: + type: object + properties: + action: + type: string + title: action + principal: + type: string + title: principal + resourceName: + type: string + title: resource_name + metadata: + type: object + title: metadata + additionalProperties: + type: string + title: value + requestId: + type: string + title: request_id + traceId: + type: string + title: trace_id + organizationName: + type: string + title: organization_name + projectName: + type: string + title: project_name + severity: + type: string + title: severity + change: + title: change + description: Optional structured diff (see AuditEvent.change). + $ref: '#/components/schemas/aes.audit.v1.AuditChange' + title: LogEventRequest + additionalProperties: false + aes.audit.v1.LogEventRequest.MetadataEntry: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + title: MetadataEntry + additionalProperties: false + aes.audit.v1.LogEventResponse: + type: object + properties: + event: + title: event + $ref: '#/components/schemas/aes.audit.v1.AuditEvent' + title: LogEventResponse + additionalProperties: false + aes.audit.v1.SearchEventsRequest: + type: object + properties: + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + description: Opaque cursor from SearchEventsResponse.next_page_token. + actionPrefix: + type: string + title: action_prefix + description: If set, action must have this prefix (SQL LIKE prefix match). + principalPrefix: + type: string + title: principal_prefix + projectName: + type: string + title: project_name + description: |- + Project filter (`projects/{slug}`). Caller must set either this or organization_name + to scope the query. + minTimestampUnix: + type: + - integer + - string + title: min_timestamp_unix + format: int64 + description: Minimum event time (inclusive), Unix seconds; 0 = no lower bound. + organizationName: + type: string + title: organization_name + description: |- + Organization filter (`organizations/{slug}`). Use for billing / org-scoped audit + queries that don't belong to a single project (e.g. wallet.topup.succeeded). Caller + must hold a project binding under the org or admin.organization on it. + title: SearchEventsRequest + additionalProperties: false + aes.audit.v1.SearchEventsResponse: + type: object + properties: + events: + type: array + items: + $ref: '#/components/schemas/aes.audit.v1.AuditEvent' + title: events + nextPageToken: + type: string + title: next_page_token + title: SearchEventsResponse + additionalProperties: false + aes.baremetal.v1.AttachBareMetalISORequest: + type: object + properties: + name: + type: string + title: name + objectKey: + type: string + title: object_key + description: Object key returned by CreateBareMetalISOUploadURL (a prior upload). + title: AttachBareMetalISORequest + additionalProperties: false + aes.baremetal.v1.AttachBareMetalISOResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: AttachBareMetalISOResponse + additionalProperties: false + aes.baremetal.v1.AvailableBareMetal: + type: object + properties: + hostName: + type: string + title: host_name + description: Host resource name to lease (`hosts/{slug}`). + datacenterName: + type: string + title: datacenter_name + specLabel: + type: string + title: spec_label + description: Derived display label, e.g. "cascadelake · 48c · 384GiB". + cpuModel: + type: string + title: cpu_model + cpuGeneration: + type: string + title: cpu_generation + totalCores: + type: integer + title: total_cores + format: int32 + ramGib: + type: integer + title: ram_gib + format: int32 + storageGib: + type: integer + title: storage_gib + format: int32 + monthlyPriceMinor: + type: + - integer + - string + title: monthly_price_minor + format: int64 + description: Per-server price the operator set; the hourly rate is monthly_price_minor/730. + currency: + type: string + title: currency + fulfillment: + title: fulfillment + description: Fulfillment speed. IMMEDIATE unless stated otherwise. + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalFulfillment' + provisioningEtaMinutes: + type: integer + title: provisioning_eta_minutes + format: int32 + description: Expected minutes until handover for non-immediate fulfillment. + title: AvailableBareMetal + additionalProperties: false + aes.baremetal.v1.BareMetalAvailability: + type: string + title: BareMetalAvailability + enum: + - BARE_METAL_AVAILABILITY_UNSPECIFIED + - BARE_METAL_AVAILABILITY_AVAILABLE + - BARE_METAL_AVAILABILITY_LEASED + - BARE_METAL_AVAILABILITY_UNAVAILABLE + description: Availability of a published bare-metal host in the public inventory. + aes.baremetal.v1.BareMetalBootDevice: + type: string + title: BareMetalBootDevice + enum: + - BARE_METAL_BOOT_DEVICE_UNSPECIFIED + - BARE_METAL_BOOT_DEVICE_DISK + - BARE_METAL_BOOT_DEVICE_CDROM + - BARE_METAL_BOOT_DEVICE_PXE + description: BareMetalBootDevice selects the one-time boot source for SetBareMetalBootDevice. + aes.baremetal.v1.BareMetalFulfillment: + type: string + title: BareMetalFulfillment + enum: + - BARE_METAL_FULFILLMENT_UNSPECIFIED + - BARE_METAL_FULFILLMENT_IMMEDIATE + - BARE_METAL_FULFILLMENT_CONVERT_JIT + description: How quickly a listed server can be handed over after an order. + aes.baremetal.v1.BareMetalInstance: + type: object + properties: + name: + type: string + title: name + description: Resource name `bare-metal-instances/{slug}`. + projectName: + type: string + title: project_name + datacenterName: + type: string + title: datacenter_name + instanceType: + type: string + title: instance_type + description: Derived hardware label (e.g. "cascadelake · 48c · 384GiB"). Display/audit only. + hostName: + type: string + title: host_name + description: Host bound to this lease (`hosts/{slug}`). Set when state=ACTIVE; empty when CREATING. + state: + type: string + title: state + description: PROVISIONING / ACTIVE / RELEASING / RELEASED. + redfishEndpoint: + type: string + title: redfish_endpoint + description: |- + Redfish endpoint for this leased host. Customer uses this to BMC-control the box + (PXE install, power cycle, console). Empty when the host has no Redfish configured. + createTimeUnix: + type: + - integer + - string + title: create_time_unix + format: int64 + updateTimeUnix: + type: + - integer + - string + title: update_time_unix + format: int64 + labels: + type: object + title: labels + additionalProperties: + type: string + title: value + annotations: + type: object + title: annotations + additionalProperties: + type: string + title: value + billingMode: + title: billing_mode + description: |- + Billing (mirrors VM semantics). billing_mode HOURLY or MONTHLY_*; commitment_end_at_unix + + autorenew are set for MONTHLY_*. monthly_price_minor is the per-server price snapshotted at + lease time (the hourly rate billed is monthly_price_minor/730). + $ref: '#/components/schemas/aes.compute.v1.BillingMode' + commitmentEndAtUnix: + type: + - integer + - string + title: commitment_end_at_unix + format: int64 + autorenew: + type: boolean + title: autorenew + monthlyPriceMinor: + type: + - integer + - string + title: monthly_price_minor + format: int64 + currency: + type: string + title: currency + osImage: + type: string + title: os_image + description: |- + Provisioning / cloud-init. os_image is the catalog id (or custom_image_url when set); + hostname + linux_username drive the SSH command shown in the UI. + customImageUrl: + type: string + title: custom_image_url + hostname: + type: string + title: hostname + linuxUsername: + type: string + title: linux_username + publicIpv4Cidr: + type: string + title: public_ipv4_cidr + description: |- + Public IPv4 block assigned to the host's NIC(s). primary_ipv4 is the first address (the + cloud-init / management IP). For a /32, cidr is `/32`. + primaryIpv4: + type: string + title: primary_ipv4 + powerState: + type: string + title: power_state + description: 'Current BMC power state: "On" / "Off" / "" (unknown). Billing is unaffected by power.' + publicGateway: + type: string + title: public_gateway + description: |- + Public network details for the host's NIC, from the DC pool. Surfaced so a bring-your-own-OS + customer can hand-configure their network: gateway + the SUBNET prefix length the IPs sit in + (e.g. /24). The managed install uses these too. Empty/0 when the DC has none set. + publicPrefixLen: + type: integer + title: public_prefix_len + format: int32 + title: BareMetalInstance + additionalProperties: false + aes.baremetal.v1.BareMetalInstance.AnnotationsEntry: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + title: AnnotationsEntry + additionalProperties: false + aes.baremetal.v1.BareMetalInstance.LabelsEntry: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + title: LabelsEntry + additionalProperties: false + aes.baremetal.v1.BareMetalNode: + type: object + properties: + hostName: + type: string + title: host_name + description: hosts/{slug} + datacenterName: + type: string + title: datacenter_name + specLabel: + type: string + title: spec_label + cpuModel: + type: string + title: cpu_model + cpuGeneration: + type: string + title: cpu_generation + totalCores: + type: integer + title: total_cores + format: int32 + ramGib: + type: integer + title: ram_gib + format: int32 + storageGib: + type: integer + title: storage_gib + format: int32 + monthlyPriceMinor: + type: + - integer + - string + title: monthly_price_minor + format: int64 + description: Listed monthly price (hourly = monthly/730). 0 when the host is unpriced. + currency: + type: string + title: currency + availability: + title: availability + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalAvailability' + gpuModel: + type: string + title: gpu_model + description: |- + GPU model + count when this is a GPU node (empty/0 otherwise). cpu_generation already carries + the CPU class, so heterogeneous fleets (incl. AMD-CPU GPU boxes) are described per-node. + gpuCount: + type: integer + title: gpu_count + format: int32 + fulfillment: + title: fulfillment + description: Fulfillment speed when available. IMMEDIATE unless stated otherwise. + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalFulfillment' + provisioningEtaMinutes: + type: integer + title: provisioning_eta_minutes + format: int32 + description: Expected minutes until handover for non-immediate fulfillment. + title: BareMetalNode + additionalProperties: false + description: |- + BareMetalNode is one published host in the public inventory: the same spec fields as + AvailableBareMetal plus an availability tag and (when present) GPU model/count. No lessee, BMC, + or serial is ever projected. + aes.baremetal.v1.BareMetalPowerAction: + type: string + title: BareMetalPowerAction + enum: + - BARE_METAL_POWER_ACTION_UNSPECIFIED + - BARE_METAL_POWER_ACTION_ON + - BARE_METAL_POWER_ACTION_OFF + - BARE_METAL_POWER_ACTION_REBOOT + description: BareMetalPowerAction selects the BMC power operation. + aes.baremetal.v1.CreateBareMetalISOFromURLRequest: + type: object + properties: + projectName: + type: string + title: project_name + url: + type: string + title: url + description: Public HTTPS URL to the ISO (e.g. a distro mirror). Fetched server-side into the org library. + filename: + type: string + title: filename + description: Optional filename override; defaults to the URL's basename. + title: CreateBareMetalISOFromURLRequest + additionalProperties: false + aes.baremetal.v1.CreateBareMetalISOFromURLResponse: + type: object + properties: + objectKey: + type: string + title: object_key + description: The object key the import is streaming into; poll ListBareMetalISOs until it appears. + operation: + title: operation + description: |- + The durable import Operation (kind=bm_iso_import). Poll GetOperation — or watch the IMPORTING + entry in ListBareMetalISOs — for live byte progress; the import survives control-plane restarts. + Null when the import completes synchronously without a trackable operation. + $ref: '#/components/schemas/aes.ops.v1.Operation' + title: CreateBareMetalISOFromURLResponse + additionalProperties: false + aes.baremetal.v1.CreateBareMetalISOUploadURLRequest: + type: object + properties: + projectName: + type: string + title: project_name + description: |- + Project whose ORG owns the library. The ISO is stored org-scoped (shared across the org's + projects); the caller must have access to this project. + filename: + type: string + title: filename + description: |- + Customer's ISO filename (e.g. "proxmox-ve-8.iso"); forms the object key + display name. + Sanitized server-side. + title: CreateBareMetalISOUploadURLRequest + additionalProperties: false + aes.baremetal.v1.CreateBareMetalISOUploadURLResponse: + type: object + properties: + uploadUrl: + type: string + title: upload_url + description: Presigned PUT URL — the client uploads the ISO bytes directly here (HTTP PUT). Short-lived. + objectKey: + type: string + title: object_key + description: Opaque object key to pass back to AttachBareMetalISO once the upload completes. + expiresAtUnix: + type: + - integer + - string + title: expires_at_unix + format: int64 + title: CreateBareMetalISOUploadURLResponse + additionalProperties: false + aes.baremetal.v1.CreateBareMetalInstanceRequest: + type: object + properties: + name: + type: string + title: name + description: Resource name `bare-metal-instances/{slug}`. Slug must be DNS-safe. + projectName: + type: string + title: project_name + hostName: + type: string + title: host_name + description: The specific available host to lease (`hosts/{slug}`), from ListAvailableBareMetal. + labels: + type: object + title: labels + additionalProperties: + type: string + title: value + annotations: + type: object + title: annotations + additionalProperties: + type: string + title: value + idempotencyKey: + type: string + title: idempotency_key + billingMode: + title: billing_mode + description: |- + Billing mode. Default HOURLY. MONTHLY_* charges the wallet upfront for the term at the + tier's discount; the prepayment must succeed or Create fails. (Field 7 was `instance_type`.) + $ref: '#/components/schemas/aes.compute.v1.BillingMode' + autorenew: + type: boolean + title: autorenew + description: 'For MONTHLY_*: enable auto-renewal at term end. Ignored when HOURLY.' + osImage: + type: string + title: os_image + description: |- + OS + cloud-init. os_image is a catalog id (e.g. "ubuntu-2404"); custom_image_url overrides it + with a direct image URL. hostname + linux_username + ssh_key_names + user_data seed cloud-init. + customImageUrl: + type: string + title: custom_image_url + hostname: + type: string + title: hostname + linuxUsername: + type: string + title: linux_username + sshKeyNames: + type: array + items: + type: string + title: ssh_key_names + userData: + type: string + title: user_data + publicIpv4PrefixLen: + type: integer + title: public_ipv4_prefix_len + format: int32 + description: |- + Public IPv4 block size as a prefix length: 32 (1 IP) / 31 / 30 / 29 / 28 (16 IPs). Default 32. + The block is reserved from the DC public pool at lease time; the first address is primary. + title: CreateBareMetalInstanceRequest + additionalProperties: false + aes.baremetal.v1.CreateBareMetalInstanceRequest.AnnotationsEntry: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + title: AnnotationsEntry + additionalProperties: false + aes.baremetal.v1.CreateBareMetalInstanceRequest.LabelsEntry: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + title: LabelsEntry + additionalProperties: false + aes.baremetal.v1.CreateBareMetalInstanceResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: CreateBareMetalInstanceResponse + additionalProperties: false + aes.baremetal.v1.DeleteBareMetalISORequest: + type: object + properties: + projectName: + type: string + title: project_name + objectKey: + type: string + title: object_key + title: DeleteBareMetalISORequest + additionalProperties: false + aes.baremetal.v1.DeleteBareMetalISOResponse: + type: object + title: DeleteBareMetalISOResponse + additionalProperties: false + aes.baremetal.v1.DetachBareMetalISORequest: + type: object + properties: + name: + type: string + title: name + title: DetachBareMetalISORequest + additionalProperties: false + aes.baremetal.v1.DetachBareMetalISOResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: DetachBareMetalISOResponse + additionalProperties: false + aes.baremetal.v1.EnterBareMetalRescueModeRequest: + type: object + properties: + name: + type: string + title: name + rescueImageUrl: + type: string + title: rescue_image_url + description: |- + Optional explicit rescue image URL override; defaults to the datacenter's configured + rescue image. Useful for distro-specific rescue tooling. + title: EnterBareMetalRescueModeRequest + additionalProperties: false + aes.baremetal.v1.EnterBareMetalRescueModeResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: EnterBareMetalRescueModeResponse + additionalProperties: false + aes.baremetal.v1.ExitBareMetalRescueModeRequest: + type: object + properties: + name: + type: string + title: name + title: ExitBareMetalRescueModeRequest + additionalProperties: false + aes.baremetal.v1.ExitBareMetalRescueModeResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: ExitBareMetalRescueModeResponse + additionalProperties: false + aes.baremetal.v1.GetBareMetalConsoleURLRequest: + type: object + properties: + name: + type: string + title: name + title: GetBareMetalConsoleURLRequest + additionalProperties: false + aes.baremetal.v1.GetBareMetalConsoleURLResponse: + type: object + properties: + consoleUrl: + type: string + title: console_url + description: |- + Short-lived websocket path (expires after 60s). Single-use; a current browser session + (cookie) or Authorization: Bearer is also required to connect (defense-in-depth). + expiresAtUnix: + type: + - integer + - string + title: expires_at_unix + format: int64 + vncPassword: + type: string + title: vnc_password + description: |- + Per-session VNC password the noVNC client authenticates with (≤8 chars — RFB limit). The + BMC's VNC server is only reachable through Metalhost, so this is defense-in-depth behind + the token+cookie gate, not the primary control. + title: GetBareMetalConsoleURLResponse + additionalProperties: false + aes.baremetal.v1.GetBareMetalInstanceRequest: + type: object + properties: + name: + type: string + title: name + title: GetBareMetalInstanceRequest + additionalProperties: false + aes.baremetal.v1.GetBareMetalInstanceResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: GetBareMetalInstanceResponse + additionalProperties: false + aes.baremetal.v1.GetBareMetalVirtualMediaRequest: + type: object + properties: + name: + type: string + title: name + title: GetBareMetalVirtualMediaRequest + additionalProperties: false + aes.baremetal.v1.GetBareMetalVirtualMediaResponse: + type: object + properties: + inserted: + type: boolean + title: inserted + isoFilename: + type: string + title: iso_filename + description: |- + Friendly filename + library object key when the mounted image is a metalhost library ISO + (empty for inserted media we can't resolve, e.g. an external URL). + objectKey: + type: string + title: object_key + title: GetBareMetalVirtualMediaResponse + additionalProperties: false + aes.baremetal.v1.ISOFile: + type: object + properties: + objectKey: + type: string + title: object_key + description: opaque key passed to Attach/Delete + filename: + type: string + title: filename + description: display name (basename) + sizeBytes: + type: + - integer + - string + title: size_bytes + format: int64 + uploadedAtUnix: + type: + - integer + - string + title: uploaded_at_unix + format: int64 + status: + type: string + title: status + description: |- + Lifecycle status: "READY" (object exists, attachable), "IMPORTING" (URL import in flight), + or "FAILED" (URL import failed — error_message has the reason). Empty defaults to READY for + older clients. Only READY entries can be attached. + bytesDownloaded: + type: + - integer + - string + title: bytes_downloaded + format: int64 + description: |- + For IMPORTING entries: bytes streamed so far and the total (from the source Content-Length; + 0 when the source didn't advertise a length). UI renders bytes_downloaded/total_bytes as a + progress bar; total_bytes==0 → indeterminate spinner. + totalBytes: + type: + - integer + - string + title: total_bytes + format: int64 + operationName: + type: string + title: operation_name + description: |- + The `bm_iso_import` Operation resource name backing an IMPORTING/FAILED entry (poll + GetOperation for live progress; empty for READY objects). + errorMessage: + type: string + title: error_message + description: 'Set when status == "FAILED": the import error surfaced to the customer.' + title: ISOFile + additionalProperties: false + description: |- + ISOFile is one entry in the org's install-ISO library. A library entry is either a READY + object that physically exists in object storage, or a synthetic IMPORTING/FAILED entry + projected from an in-flight `bm_iso_import` Operation (a URL import that hasn't landed yet) so + the UI can render a live progress bar inline with the completed ISOs. + aes.baremetal.v1.ListAvailableBareMetalRequest: + type: object + properties: + datacenterName: + type: string + title: datacenter_name + description: Optional filter to one datacenter. + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + title: ListAvailableBareMetalRequest + additionalProperties: false + aes.baremetal.v1.ListAvailableBareMetalResponse: + type: object + properties: + hosts: + type: array + items: + $ref: '#/components/schemas/aes.baremetal.v1.AvailableBareMetal' + title: hosts + nextPageToken: + type: string + title: next_page_token + title: ListAvailableBareMetalResponse + additionalProperties: false + aes.baremetal.v1.ListBareMetalISOsRequest: + type: object + properties: + projectName: + type: string + title: project_name + title: ListBareMetalISOsRequest + additionalProperties: false + aes.baremetal.v1.ListBareMetalISOsResponse: + type: object + properties: + isos: + type: array + items: + $ref: '#/components/schemas/aes.baremetal.v1.ISOFile' + title: isos + maxIsos: + type: integer + title: max_isos + format: int32 + description: Per-org quota + current usage, so the UI can show "3 / 5" and disable upload at the cap. + title: ListBareMetalISOsResponse + additionalProperties: false + aes.baremetal.v1.ListBareMetalInstancesRequest: + type: object + properties: + projectName: + type: string + title: project_name + description: Required. Scopes results to the given project (`projects/{slug}`). + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + title: ListBareMetalInstancesRequest + additionalProperties: false + aes.baremetal.v1.ListBareMetalInstancesResponse: + type: object + properties: + bareMetalInstances: + type: array + items: + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: bare_metal_instances + nextPageToken: + type: string + title: next_page_token + title: ListBareMetalInstancesResponse + additionalProperties: false + aes.baremetal.v1.ListBareMetalInventoryRequest: + type: object + properties: + datacenterName: + type: string + title: datacenter_name + description: Optional filter to one datacenter. + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + title: ListBareMetalInventoryRequest + additionalProperties: false + aes.baremetal.v1.ListBareMetalInventoryResponse: + type: object + properties: + nodes: + type: array + items: + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalNode' + title: nodes + nextPageToken: + type: string + title: next_page_token + total: + type: integer + title: total + format: int32 + description: Fleet totals for the current filter (whole fleet, not just this page). + available: + type: integer + title: available + format: int32 + leased: + type: integer + title: leased + format: int32 + title: ListBareMetalInventoryResponse + additionalProperties: false + aes.baremetal.v1.QuoteBareMetalRequest: + type: object + properties: + hostName: + type: string + title: host_name + description: Host to quote (must be available/priced). + billingMode: + title: billing_mode + $ref: '#/components/schemas/aes.compute.v1.BillingMode' + currency: + type: string + title: currency + publicIpv4PrefixLen: + type: integer + title: public_ipv4_prefix_len + format: int32 + description: Public IPv4 block size (32/31/30/29/28). Default 32. Folds the per-IP cost into the quote. + title: QuoteBareMetalRequest + additionalProperties: false + aes.baremetal.v1.QuoteBareMetalResponse: + type: object + properties: + monthlyPriceMinor: + type: + - integer + - string + title: monthly_price_minor + format: int64 + description: Host monthly price + derived hourly rate (monthly/730), host only. + hourlyRateMinor: + type: + - integer + - string + title: hourly_rate_minor + format: int64 + discountPct: + type: integer + title: discount_pct + format: int32 + description: 'For MONTHLY_*: discount applied + total due now for the term (host + IP block). 0 for HOURLY.' + prepayDueMinor: + type: + - integer + - string + title: prepay_due_minor + format: int64 + currency: + type: string + title: currency + ipv4Count: + type: integer + title: ipv4_count + format: int32 + description: 'Public-IP breakdown: count of addresses + monthly cost per IP (so the UI can itemize host + IPs).' + ipv4MonthlyMinor: + type: + - integer + - string + title: ipv4_monthly_minor + format: int64 + title: QuoteBareMetalResponse + additionalProperties: false + aes.baremetal.v1.ReinstallBareMetalRequest: + type: object + properties: + name: + type: string + title: name + osImage: + type: string + title: os_image + description: New OS for the reinstall (catalog id or custom URL). Empty = keep the current image. + customImageUrl: + type: string + title: custom_image_url + hostname: + type: string + title: hostname + description: cloud-init overrides for the reinstall. Empty fields keep the lease's current values. + linuxUsername: + type: string + title: linux_username + sshKeyNames: + type: array + items: + type: string + title: ssh_key_names + userData: + type: string + title: user_data + title: ReinstallBareMetalRequest + additionalProperties: false + aes.baremetal.v1.ReinstallBareMetalResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: ReinstallBareMetalResponse + additionalProperties: false + aes.baremetal.v1.ReleaseBareMetalInstanceRequest: + type: object + properties: + name: + type: string + title: name + idempotencyKey: + type: string + title: idempotency_key + title: ReleaseBareMetalInstanceRequest + additionalProperties: false + aes.baremetal.v1.ReleaseBareMetalInstanceResponse: + type: object + title: ReleaseBareMetalInstanceResponse + additionalProperties: false + aes.baremetal.v1.RenewBareMetalNowRequest: + type: object + properties: + name: + type: string + title: name + title: RenewBareMetalNowRequest + additionalProperties: false + aes.baremetal.v1.RenewBareMetalNowResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + newTermId: + type: string + title: new_term_id + description: The new baremetal_reservations row id, for traceability. + journalEntryId: + type: string + title: journal_entry_id + description: The wallet journal entry that recorded the prepayment. + chargedAmountMinor: + type: + - integer + - string + title: charged_amount_minor + format: int64 + title: RenewBareMetalNowResponse + additionalProperties: false + aes.baremetal.v1.SetBareMetalBootDeviceRequest: + type: object + properties: + name: + type: string + title: name + device: + title: device + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalBootDevice' + title: SetBareMetalBootDeviceRequest + additionalProperties: false + aes.baremetal.v1.SetBareMetalBootDeviceResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: SetBareMetalBootDeviceResponse + additionalProperties: false + aes.baremetal.v1.SetBareMetalPowerRequest: + type: object + properties: + name: + type: string + title: name + action: + title: action + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalPowerAction' + title: SetBareMetalPowerRequest + additionalProperties: false + aes.baremetal.v1.SetBareMetalPowerResponse: + type: object + properties: + instance: + title: instance + $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + title: SetBareMetalPowerResponse + additionalProperties: false + aes.catalog.v1.Datacenter: + type: object + properties: + name: + type: string + title: name + description: Resource name, e.g. `datacenters/us-dal-1`. + displayName: + type: string + title: display_name + state: + title: state + $ref: '#/components/schemas/aes.catalog.v1.DatacenterState' + kubernetesApiEndpoint: + type: string + title: kubernetes_api_endpoint + description: Operator-visible control-plane endpoint for the datacenter. + labels: + type: object + title: labels + additionalProperties: + type: string + title: value + annotations: + type: object + title: annotations + additionalProperties: + type: string + title: value + kubernetesVersion: + type: string + title: kubernetes_version + kubevirtVersion: + type: string + title: kubevirt_version + healthSummary: + type: string + title: health_summary + description: Opaque summary JSON or text for health snapshots. + capacityPct: + type: integer + title: capacity_pct + format: int32 + description: |- + ────────────── Capacity (populated by ListDatacenters / GetDatacenter) ────────────── + capacity_pct: % of usable VM CPU capacity currently allocated (0..100). Same number + GetRegionHealth returns. Allows the VM-create UI to dim a region or surface a "near + capacity" badge without a second round-trip. 0 means empty (or unmeasurable); 100 means + no more VMs can be scheduled until something stops. Zero when the DC isn't READY/DEGRADED + (e.g. PROVISIONING DCs report 0). + title: Datacenter + additionalProperties: false + aes.catalog.v1.Datacenter.AnnotationsEntry: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + title: AnnotationsEntry + additionalProperties: false + aes.catalog.v1.Datacenter.LabelsEntry: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + title: LabelsEntry + additionalProperties: false + aes.catalog.v1.DatacenterState: + type: string + title: DatacenterState + enum: + - DATACENTER_STATE_UNSPECIFIED + - DATACENTER_STATE_PLANNED + - DATACENTER_STATE_PROVISIONING + - DATACENTER_STATE_READY + - DATACENTER_STATE_DEGRADED + - DATACENTER_STATE_DEPROVISIONING + - DATACENTER_STATE_RETIRED + description: Datacenter lifecycle. + aes.catalog.v1.DatacenterVMCapacity: + type: object + properties: + datacenterName: + type: string + title: datacenter_name + status: + type: string + title: status + description: READY / DEGRADED + capacityPct: + type: integer + title: capacity_pct + format: int32 + description: max across classes + sellableVcpu: + type: + - integer + - string + title: sellable_vcpu + format: int64 + freeVcpu: + type: + - integer + - string + title: free_vcpu + format: int64 + sellableRamGib: + type: + - integer + - string + title: sellable_ram_gib + format: int64 + freeRamGib: + type: + - integer + - string + title: free_ram_gib + format: int64 + storageFreeGib: + type: + - integer + - string + title: storage_free_gib + format: int64 + byCpuClass: + type: array + items: + $ref: '#/components/schemas/aes.catalog.v1.VMClassCapacity' + title: by_cpu_class + title: DatacenterVMCapacity + additionalProperties: false + description: |- + DatacenterVMCapacity rolls the pool breakdown up to the datacenter. The rollup fields (4-8) are + the sum across by_cpu_class; simple consumers can read those and ignore the breakdown. + aes.catalog.v1.GetRegionHealthRequest: + type: object + properties: + datacenterName: + type: string + title: datacenter_name + title: GetRegionHealthRequest additionalProperties: false - aes.audit.v1.LogEventRequest: + aes.catalog.v1.GetRegionHealthResponse: type: object properties: - action: + health: + title: health + $ref: '#/components/schemas/aes.catalog.v1.RegionHealth' + title: GetRegionHealthResponse + additionalProperties: false + aes.catalog.v1.GetVMCapacityRequest: + type: object + properties: + datacenterName: type: string - title: action - principal: + title: datacenter_name + description: Optional filter to one datacenter. Empty = all READY/DEGRADED DCs. + title: GetVMCapacityRequest + additionalProperties: false + aes.catalog.v1.GetVMCapacityResponse: + type: object + properties: + datacenters: + type: array + items: + $ref: '#/components/schemas/aes.catalog.v1.DatacenterVMCapacity' + title: datacenters + title: GetVMCapacityResponse + additionalProperties: false + aes.catalog.v1.GpuModelCapacity: + type: object + properties: + gpuModel: type: string - title: principal - resourceName: + title: gpu_model + description: e.g. "h100" + total: + type: integer + title: total + format: int32 + description: allocatable GPUs of this model in the pool + free: + type: integer + title: free + format: int32 + description: currently unleased + reserveVcpu: + type: + - integer + - string + title: reserve_vcpu + format: int64 + description: Operator-set per-GPU reservation kept free for an unsold GPU (physical units). Informational. + reserveRamGib: + type: + - integer + - string + title: reserve_ram_gib + format: int64 + maxNodeFreeVcpu: + type: + - integer + - string + title: max_node_free_vcpu + format: int64 + description: |- + Largest single VM (vCPU / RAM, oversubscribe-adjusted) that can schedule on the most-free node + currently holding a free GPU of this model — RAW node free, BEFORE the reservation kept for the + node's other unsold GPUs. A GPU VM lands on ONE node, so this — not the pool sum — bounds how + big a GPU VM can be. 0 when the live probe is unavailable. + maxNodeFreeRamGib: + type: + - integer + - string + title: max_node_free_ram_gib + format: int64 + maxNodeFreeGpus: + type: integer + title: max_node_free_gpus + format: int32 + description: |- + Free GPUs of this model on that same representative node. The configurator subtracts + reserve_* × (max_node_free_gpus − requested_count) from the raw node free above, so renting MORE + GPUs frees the reservation held for the node's remaining GPUs (more CPU/RAM for the VM). + title: GpuModelCapacity + additionalProperties: false + description: GpuModelCapacity is the whole-GPU availability for one GPU model within a pool. + aes.catalog.v1.ListDatacentersRequest: + type: object + properties: + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + filter: + type: string + title: filter + description: 'Reserved for CEL / simple filters (Phase 0: ignored).' + title: ListDatacentersRequest + additionalProperties: false + aes.catalog.v1.ListDatacentersResponse: + type: object + properties: + datacenters: + type: array + items: + $ref: '#/components/schemas/aes.catalog.v1.Datacenter' + title: datacenters + nextPageToken: + type: string + title: next_page_token + title: ListDatacentersResponse + additionalProperties: false + aes.catalog.v1.ListMaintenanceWindowsRequest: + type: object + properties: + datacenterName: + type: string + title: datacenter_name + description: Optional DC filter; empty = all DCs. + activeOnly: + type: boolean + title: active_only + description: When true, only windows whose end_time is in the future. Default false (returns history too). + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + title: ListMaintenanceWindowsRequest + additionalProperties: false + aes.catalog.v1.ListMaintenanceWindowsResponse: + type: object + properties: + maintenanceWindows: + type: array + items: + $ref: '#/components/schemas/aes.catalog.v1.MaintenanceWindow' + title: maintenance_windows + nextPageToken: + type: string + title: next_page_token + title: ListMaintenanceWindowsResponse + additionalProperties: false + aes.catalog.v1.MaintenanceWindow: + type: object + properties: + name: + type: string + title: name + datacenterName: + type: string + title: datacenter_name + startTimeUnix: + type: + - integer + - string + title: start_time_unix + format: int64 + endTimeUnix: + type: + - integer + - string + title: end_time_unix + format: int64 + description: + type: string + title: description + affectedComponents: + type: array + items: + type: string + title: affected_components + description: 'Resource kinds affected: e.g. "compute" / "storage" / "network".' + status: + type: string + title: status + description: '''SCHEDULED'' | ''ACTIVE'' | ''COMPLETED'' | ''CANCELLED''.' + title: MaintenanceWindow + additionalProperties: false + aes.catalog.v1.QuoteVirtualMachineRequest: + type: object + properties: + vcpus: + type: integer + title: vcpus + format: int32 + description: |- + Same fields as CreateVirtualMachineRequest's configurator slice. Validated under the + same 1–16 GiB-per-vCPU ratio bounds; an out-of-range shape returns InvalidArgument. + ramGib: + type: integer + title: ram_gib + format: int32 + cpuClass: + type: string + title: cpu_class + bootDiskGib: + type: integer + title: boot_disk_gib + format: int32 + extraDiskGib: + type: integer + title: extra_disk_gib + format: int32 + publicIpv4Count: + type: integer + title: public_ipv4_count + format: int32 + currency: + type: string + title: currency + description: default USD + gpuModel: + type: string + title: gpu_model + description: |- + Whole-GPU passthrough. gpu_model is the SKU variant (e.g. "rtx4090"), gpu_count the number of + cards; priced via compute.gpu..runtime_hours. Empty/0 = CPU-only quote. + gpuCount: + type: integer + title: gpu_count + format: int32 + title: QuoteVirtualMachineRequest + additionalProperties: false + aes.catalog.v1.QuoteVirtualMachineResponse: + type: object + properties: + hourlyMinor: + type: + - integer + - string + title: hourly_minor + format: int64 + description: |- + ROUND-to-int64 view for clients that don't want to parse decimals. For shapes whose + hourly cost is sub-cent (typical for small configurator VMs at $2.50/vCPU-month) this + rounds — use hourly_minor_decimal for the exact NUMERIC. + monthly1Minor: + type: + - integer + - string + title: monthly_1_minor + format: int64 + description: |- + Per-term prepayment totals for each MONTHLY_* tier, in minor units. Discount applied: + MONTHLY_1 = 0%, MONTHLY_3 = 5%, MONTHLY_6 = 8%, MONTHLY_12 = 12%. Calculated as + hourly × 730 hours × months × (1 - discount/100), rounded once at the end. + monthly3Minor: + type: + - integer + - string + title: monthly_3_minor + format: int64 + monthly6Minor: + type: + - integer + - string + title: monthly_6_minor + format: int64 + monthly12Minor: + type: + - integer + - string + title: monthly_12_minor + format: int64 + currency: type: string - title: resource_name - metadata: - type: object - title: metadata - additionalProperties: - type: string - title: value - requestId: + title: currency + hourlyMinorDecimal: type: string - title: request_id - traceId: + title: hourly_minor_decimal + description: |- + Exact NUMERIC text values mirroring the int64 fields above (1.0 = 1 cent, 6 decimals + of sub-cent precision). Clients that need to compose further math (display hourly, + pro-rate by elapsed seconds, etc.) should consume these instead of the rounded int64s. + monthly1MinorDecimal: type: string - title: trace_id - organizationName: + title: monthly_1_minor_decimal + monthly3MinorDecimal: type: string - title: organization_name - projectName: + title: monthly_3_minor_decimal + monthly6MinorDecimal: type: string - title: project_name - severity: + title: monthly_6_minor_decimal + monthly12MinorDecimal: type: string - title: severity - change: - title: change - description: Optional structured diff (see AuditEvent.change). - $ref: '#/components/schemas/aes.audit.v1.AuditChange' - title: LogEventRequest + title: monthly_12_minor_decimal + title: QuoteVirtualMachineResponse additionalProperties: false - aes.audit.v1.LogEventRequest.MetadataEntry: + aes.catalog.v1.RegionHealth: type: object properties: - key: + datacenterName: type: string - title: key - value: + title: datacenter_name + status: type: string - title: value - title: MetadataEntry - additionalProperties: false - aes.audit.v1.LogEventResponse: - type: object - properties: - event: - title: event - $ref: '#/components/schemas/aes.audit.v1.AuditEvent' - title: LogEventResponse - additionalProperties: false - aes.audit.v1.SearchEventsRequest: - type: object - properties: - pageSize: + title: status + capacityPct: type: integer - title: page_size + title: capacity_pct format: int32 - pageToken: - type: string - title: page_token - description: Opaque cursor from SearchEventsResponse.next_page_token. - actionPrefix: - type: string - title: action_prefix - description: If set, action must have this prefix (SQL LIKE prefix match). - principalPrefix: - type: string - title: principal_prefix - projectName: + degradedComponents: + type: array + items: + type: string + title: degraded_components + healthSummary: type: string - title: project_name + title: health_summary + lastUpdatedUnix: + type: + - integer + - string + title: last_updated_unix + format: int64 + vmSellableVcpu: + type: + - integer + - string + title: vm_sellable_vcpu + format: int64 description: |- - Project filter (`projects/{slug}`). Caller must set either this or organization_name - to scope the query. - minTimestampUnix: + VM CPU capacity. sellable = total vCPU a customer can buy; running = in use; + free = available. Presented to customers as plain vCPU counts. + vmRunningVcpu: type: - integer - string - title: min_timestamp_unix + title: vm_running_vcpu + format: int64 + vmFreeVcpu: + type: + - integer + - string + title: vm_free_vcpu + format: int64 + vmSellableRamGib: + type: + - integer + - string + title: vm_sellable_ram_gib format: int64 - description: Minimum event time (inclusive), Unix seconds; 0 = no lower bound. - organizationName: - type: string - title: organization_name description: |- - Organization filter (`organizations/{slug}`). Use for billing / org-scoped audit - queries that don't belong to a single project (e.g. wallet.topup.succeeded). Caller - must hold a project binding under the org or admin.organization on it. - title: SearchEventsRequest - additionalProperties: false - aes.audit.v1.SearchEventsResponse: - type: object - properties: - events: - type: array - items: - $ref: '#/components/schemas/aes.audit.v1.AuditEvent' - title: events - nextPageToken: - type: string - title: next_page_token - title: SearchEventsResponse - additionalProperties: false - aes.baremetal.v1.AttachBareMetalISORequest: - type: object - properties: - name: - type: string - title: name - objectKey: - type: string - title: object_key - description: Object key returned by CreateBareMetalISOUploadURL (a prior upload). - title: AttachBareMetalISORequest - additionalProperties: false - aes.baremetal.v1.AttachBareMetalISOResponse: - type: object - properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: AttachBareMetalISOResponse + VM RAM capacity. sellable = total RAM a customer can buy; running = Σ ram_gib of + RUNNING VMs; free = headroom. + vmRunningRamGib: + type: + - integer + - string + title: vm_running_ram_gib + format: int64 + vmFreeRamGib: + type: + - integer + - string + title: vm_free_ram_gib + format: int64 + storageUsableGib: + type: + - integer + - string + title: storage_usable_gib + format: int64 + description: |- + Block storage capacity (post-replication usable). usable = total after replication; + free = available. Zero when the datacenter has no storage capacity data (stale/unavailable). + storageFreeGib: + type: + - integer + - string + title: storage_free_gib + format: int64 + reachable: + type: boolean + title: reachable + description: |- + Whether this region's control plane is currently reachable. When false the region is + temporarily offline: new VM creates are paused and capacity figures are last-known. + Defaults true. + unreachableSinceUnix: + type: + - integer + - string + title: unreachable_since_unix + format: int64 + description: Unix seconds the region became unreachable (0 when reachable). + title: RegionHealth additionalProperties: false - aes.baremetal.v1.AvailableBareMetal: + description: |- + RegionHealth is the customer-visible summary of a DC's current state. capacity_pct is the + % of compute hosts currently allocated (0..100); status is the DC's `state` mapped to a + human-friendly summary; degraded_components lists subsystems with non-OK status. + aes.catalog.v1.VMClassCapacity: type: object properties: - hostName: - type: string - title: host_name - description: Host resource name to lease (`hosts/{slug}`). - datacenterName: - type: string - title: datacenter_name - specLabel: - type: string - title: spec_label - description: Derived display label, e.g. "cascadelake · 48c · 384GiB". - cpuModel: - type: string - title: cpu_model - cpuGeneration: + cpuClass: type: string - title: cpu_generation - totalCores: - type: integer - title: total_cores - format: int32 - ramGib: - type: integer - title: ram_gib - format: int32 - storageGib: + title: cpu_class + description: e.g. "cascadelake", "genoa" + sellableVcpu: + type: + - integer + - string + title: sellable_vcpu + format: int64 + freeVcpu: + type: + - integer + - string + title: free_vcpu + format: int64 + sellableRamGib: + type: + - integer + - string + title: sellable_ram_gib + format: int64 + freeRamGib: + type: + - integer + - string + title: free_ram_gib + format: int64 + capacityPct: type: integer - title: storage_gib + title: capacity_pct format: int32 - monthlyPriceMinor: + description: |- + Most-utilized dimension (cpu/ram/gpu) as 0..100 — a pool is "full" when this hits 100 even if + another dimension has headroom (binding-resource rule). + gpus: + type: array + items: + $ref: '#/components/schemas/aes.catalog.v1.GpuModelCapacity' + title: gpus + description: GPU availability per model in this pool (empty for non-GPU pools). + maxNodeFreeVcpu: type: - integer - string - title: monthly_price_minor + title: max_node_free_vcpu format: int64 - description: Per-server price the operator set; the hourly rate is monthly_price_minor/730. - currency: + description: |- + Largest single CPU VM (vCPU / RAM, oversubscribe-adjusted) that can schedule on this class's + most-free node. A VM lands on ONE node, so this bounds the configurator sliders — the pool + sum (free_vcpu/free_ram_gib) can be admitted but then stay Pending if no single node fits. + 0 when the live probe is unavailable. + maxNodeFreeRamGib: + type: + - integer + - string + title: max_node_free_ram_gib + format: int64 + title: VMClassCapacity + additionalProperties: false + description: VMClassCapacity is the sellable capacity of one pool = (datacenter, cpu_class). + aes.compute.v1.BackupVolume: + type: object + properties: + sourceDisk: type: string - title: currency - fulfillment: - title: fulfillment - description: Fulfillment speed. IMMEDIATE unless stated otherwise. - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalFulfillment' - provisioningEtaMinutes: + title: source_disk + role: + type: string + title: role + sizeGib: type: integer - title: provisioning_eta_minutes + title: size_gib format: int32 - description: Expected minutes until handover for non-immediate fulfillment. - title: AvailableBareMetal + displayName: + type: string + title: display_name + title: BackupVolume additionalProperties: false - aes.baremetal.v1.BareMetalAvailability: - type: string - title: BareMetalAvailability - enum: - - BARE_METAL_AVAILABILITY_UNSPECIFIED - - BARE_METAL_AVAILABILITY_AVAILABLE - - BARE_METAL_AVAILABILITY_LEASED - - BARE_METAL_AVAILABILITY_UNAVAILABLE - description: Availability of a published bare-metal host in the public inventory. - aes.baremetal.v1.BareMetalBootDevice: - type: string - title: BareMetalBootDevice - enum: - - BARE_METAL_BOOT_DEVICE_UNSPECIFIED - - BARE_METAL_BOOT_DEVICE_DISK - - BARE_METAL_BOOT_DEVICE_CDROM - - BARE_METAL_BOOT_DEVICE_PXE - description: BareMetalBootDevice selects the one-time boot source for SetBareMetalBootDevice. - aes.baremetal.v1.BareMetalFulfillment: + aes.compute.v1.BillingMode: type: string - title: BareMetalFulfillment + title: BillingMode enum: - - BARE_METAL_FULFILLMENT_UNSPECIFIED - - BARE_METAL_FULFILLMENT_IMMEDIATE - - BARE_METAL_FULFILLMENT_CONVERT_JIT - description: How quickly a listed server can be handed over after an order. - aes.baremetal.v1.BareMetalInstance: + - BILLING_MODE_UNSPECIFIED + - BILLING_MODE_HOURLY + - BILLING_MODE_MONTHLY_1 + - BILLING_MODE_MONTHLY_3 + - BILLING_MODE_MONTHLY_6 + - BILLING_MODE_MONTHLY_12 + description: |- + BillingMode picks how a VM is charged: per-hour (post-paid usage events) or upfront monthly + commitment at a discounted rate. Server treats UNSPECIFIED as HOURLY so missing the field + on Create gets the default behavior. + aes.compute.v1.BootDiskSpec: type: object properties: - name: - type: string - title: name - description: Resource name `bare-metal-instances/{slug}`. - projectName: - type: string - title: project_name - datacenterName: - type: string - title: datacenter_name - instanceType: - type: string - title: instance_type - description: Derived hardware label (e.g. "cascadelake · 48c · 384GiB"). Display/audit only. - hostName: + displayName: type: string - title: host_name - description: Host bound to this lease (`hosts/{slug}`). Set when state=ACTIVE; empty when CREATING. - state: + title: display_name + sizeGib: + type: integer + title: size_gib + format: int32 + description: 1..1024 GiB. + storageClass: type: string - title: state - description: PROVISIONING / ACTIVE / RELEASING / RELEASED. - redfishEndpoint: + title: storage_class + description: Storage tier (`nvme`). Defaults to nvme. + fromImageUrl: type: string - title: redfish_endpoint + title: from_image_url description: |- - Redfish endpoint for this leased host. Customer uses this to BMC-control the box - (PXE install, power cycle, console). Empty when the host has no Redfish configured. - createTimeUnix: - type: - - integer - - string - title: create_time_unix - format: int64 - updateTimeUnix: - type: - - integer - - string - title: update_time_unix - format: int64 + Streamable raw disk image URL. Required UNLESS clone_source_disk is set (clone path + supplies the data by snapshotting an existing disk instead). labels: type: object title: labels @@ -7205,73 +10267,73 @@ components: additionalProperties: type: string title: value - billingMode: - title: billing_mode - description: |- - Billing (mirrors VM semantics). billing_mode HOURLY or MONTHLY_*; commitment_end_at_unix + - autorenew are set for MONTHLY_*. monthly_price_minor is the per-server price snapshotted at - lease time (the hourly rate billed is monthly_price_minor/730). - $ref: '#/components/schemas/aes.compute.v1.BillingMode' - commitmentEndAtUnix: - type: - - integer - - string - title: commitment_end_at_unix - format: int64 - autorenew: - type: boolean - title: autorenew - monthlyPriceMinor: - type: - - integer - - string - title: monthly_price_minor - format: int64 - currency: - type: string - title: currency - osImage: + cloneSourceDisk: type: string - title: os_image + title: clone_source_disk description: |- - Provisioning / cloud-init. os_image is the catalog id (or custom_image_url when set); - hostname + linux_username drive the SSH command shown in the UI. - customImageUrl: - type: string - title: custom_image_url - hostname: + Clone path: when set, this boot disk is created by copying the named source Disk rather + than importing from from_image_url. Set by CloneVirtualMachine; customers don't set this + directly. size_gib is derived from the source. + title: BootDiskSpec + additionalProperties: false + description: |- + BootDiskSpec is the inline disk spec carried by CreateVirtualMachineRequest.boot_disk. + from_image_url is required — empty source is rejected (every boot disk needs an OS + image). The resulting Disk is owned by the same project as the VM and persists past + DeleteVirtualMachine. + aes.compute.v1.BootDiskSpec.AnnotationsEntry: + type: object + properties: + key: type: string - title: hostname - linuxUsername: + title: key + value: type: string - title: linux_username - publicIpv4Cidr: + title: value + title: AnnotationsEntry + additionalProperties: false + aes.compute.v1.BootDiskSpec.LabelsEntry: + type: object + properties: + key: type: string - title: public_ipv4_cidr - description: |- - Public IPv4 block assigned to the host's NIC(s). primary_ipv4 is the first address (the - cloud-init / management IP). For a /32, cidr is `/32`. - primaryIpv4: + title: key + value: type: string - title: primary_ipv4 - powerState: + title: value + title: LabelsEntry + additionalProperties: false + aes.compute.v1.CloneVirtualMachineRequest: + type: object + properties: + sourceVmName: type: string - title: power_state - description: 'Current BMC power state: "On" / "Off" / "" (unknown). Billing is unaffected by power.' - publicGateway: + title: source_vm_name + description: Source VM resource name to clone from. + targetDisplayName: type: string - title: public_gateway + title: target_display_name + description: |- + Display name for the new VM. Required so the customer can distinguish the clone in + listings — the resource name itself is server-assigned. + labels: + type: object + title: labels + additionalProperties: + type: string + title: value description: |- - Public network details for the host's NIC, from the DC pool. Surfaced so a bring-your-own-OS - customer can hand-configure their network: gateway + the SUBNET prefix length the IPs sit in - (e.g. /24). The managed install uses these too. Empty/0 when the DC has none set. - publicPrefixLen: - type: integer - title: public_prefix_len - format: int32 - title: BareMetalInstance + Labels/annotations applied to the new VM (NOT inherited from the source — clone is for + disk state, not metadata). + annotations: + type: object + title: annotations + additionalProperties: + type: string + title: value + title: CloneVirtualMachineRequest additionalProperties: false - aes.baremetal.v1.BareMetalInstance.AnnotationsEntry: + aes.compute.v1.CloneVirtualMachineRequest.AnnotationsEntry: type: object properties: key: @@ -7282,7 +10344,7 @@ components: title: value title: AnnotationsEntry additionalProperties: false - aes.baremetal.v1.BareMetalInstance.LabelsEntry: + aes.compute.v1.CloneVirtualMachineRequest.LabelsEntry: type: object properties: key: @@ -7293,206 +10355,139 @@ components: title: value title: LabelsEntry additionalProperties: false - aes.baremetal.v1.BareMetalNode: + aes.compute.v1.CloneVirtualMachineResponse: type: object properties: - hostName: - type: string - title: host_name - description: hosts/{slug} - datacenterName: - type: string - title: datacenter_name - specLabel: - type: string - title: spec_label - cpuModel: - type: string - title: cpu_model - cpuGeneration: - type: string - title: cpu_generation - totalCores: - type: integer - title: total_cores - format: int32 - ramGib: - type: integer - title: ram_gib - format: int32 - storageGib: - type: integer - title: storage_gib - format: int32 - monthlyPriceMinor: - type: - - integer - - string - title: monthly_price_minor - format: int64 - description: Listed monthly price (hourly = monthly/730). 0 when the host is unpriced. - currency: - type: string - title: currency - availability: - title: availability - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalAvailability' - gpuModel: + virtualMachine: + title: virtual_machine + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + vmSnapshotName: type: string - title: gpu_model + title: vm_snapshot_name description: |- - GPU model + count when this is a GPU node (empty/0 otherwise). cpu_generation already carries - the CPU class, so heterogeneous fleets (incl. AMD-CPU GPU boxes) are described per-node. - gpuCount: - type: integer - title: gpu_count - format: int32 - fulfillment: - title: fulfillment - description: Fulfillment speed when available. IMMEDIATE unless stated otherwise. - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalFulfillment' - provisioningEtaMinutes: - type: integer - title: provisioning_eta_minutes - format: int32 - description: Expected minutes until handover for non-immediate fulfillment. - title: BareMetalNode + The intermediate snapshot the clone was taken from. Useful for retry / audit; the + customer can reuse it to clone again or roll back. + operation: + title: operation + description: |- + When async provisioning is configured, the long-running operation tracking the clone. + Empty in sync mode. + $ref: '#/components/schemas/aes.ops.v1.Operation' + title: CloneVirtualMachineResponse additionalProperties: false - description: |- - BareMetalNode is one published host in the public inventory: the same spec fields as - AvailableBareMetal plus an availability tag and (when present) GPU model/count. No lessee, BMC, - or serial is ever projected. - aes.baremetal.v1.BareMetalPowerAction: + aes.compute.v1.ConsoleType: type: string - title: BareMetalPowerAction + title: ConsoleType enum: - - BARE_METAL_POWER_ACTION_UNSPECIFIED - - BARE_METAL_POWER_ACTION_ON - - BARE_METAL_POWER_ACTION_OFF - - BARE_METAL_POWER_ACTION_REBOOT - description: BareMetalPowerAction selects the BMC power operation. - aes.baremetal.v1.CreateBareMetalISOFromURLRequest: + - CONSOLE_TYPE_UNSPECIFIED + - CONSOLE_TYPE_SERIAL + - CONSOLE_TYPE_VNC + description: ConsoleType picks which console the proxy bridges to. + aes.compute.v1.CreateSSHKeyRequest: type: object properties: projectName: type: string title: project_name - url: + description: Full resource name `projects/{slug}`. Slug-only is also accepted. + sshKeyId: type: string - title: url - description: Public HTTPS URL to the ISO (e.g. a distro mirror). Fetched server-side into the org library. - filename: + title: ssh_key_id + description: DNS-safe slug. Resource name becomes `projects/{project_name}/ssh-keys/{ssh_key_id}`. + displayName: type: string - title: filename - description: Optional filename override; defaults to the URL's basename. - title: CreateBareMetalISOFromURLRequest + title: display_name + publicKey: + type: string + title: public_key + description: OpenSSH single-line format. Trailing comment optional. + labels: + type: object + title: labels + additionalProperties: + type: string + title: value + annotations: + type: object + title: annotations + additionalProperties: + type: string + title: value + idempotencyKey: + type: string + title: idempotency_key + title: CreateSSHKeyRequest additionalProperties: false - aes.baremetal.v1.CreateBareMetalISOFromURLResponse: + aes.compute.v1.CreateSSHKeyRequest.AnnotationsEntry: type: object properties: - objectKey: + key: type: string - title: object_key - description: The object key the import is streaming into; poll ListBareMetalISOs until it appears. - operation: - title: operation - description: |- - The durable import Operation (kind=bm_iso_import). Poll GetOperation — or watch the IMPORTING - entry in ListBareMetalISOs — for live byte progress; the import survives control-plane restarts. - Null when the import completes synchronously without a trackable operation. - $ref: '#/components/schemas/aes.ops.v1.Operation' - title: CreateBareMetalISOFromURLResponse + title: key + value: + type: string + title: value + title: AnnotationsEntry additionalProperties: false - aes.baremetal.v1.CreateBareMetalISOUploadURLRequest: + aes.compute.v1.CreateSSHKeyRequest.LabelsEntry: type: object properties: - projectName: + key: type: string - title: project_name - description: |- - Project whose ORG owns the library. The ISO is stored org-scoped (shared across the org's - projects); the caller must have access to this project. - filename: + title: key + value: type: string - title: filename - description: |- - Customer's ISO filename (e.g. "proxmox-ve-8.iso"); forms the object key + display name. - Sanitized server-side. - title: CreateBareMetalISOUploadURLRequest + title: value + title: LabelsEntry additionalProperties: false - aes.baremetal.v1.CreateBareMetalISOUploadURLResponse: + aes.compute.v1.CreateSSHKeyResponse: type: object properties: - uploadUrl: - type: string - title: upload_url - description: Presigned PUT URL — the client uploads the ISO bytes directly here (HTTP PUT). Short-lived. - objectKey: - type: string - title: object_key - description: Opaque object key to pass back to AttachBareMetalISO once the upload completes. - expiresAtUnix: - type: - - integer - - string - title: expires_at_unix - format: int64 - title: CreateBareMetalISOUploadURLResponse + sshKey: + title: ssh_key + $ref: '#/components/schemas/aes.compute.v1.SSHKey' + title: CreateSSHKeyResponse additionalProperties: false - aes.baremetal.v1.CreateBareMetalInstanceRequest: + aes.compute.v1.CreateVirtualMachineFromBackupRequest: type: object properties: - name: + vmSnapshotName: type: string - title: name - description: Resource name `bare-metal-instances/{slug}`. Slug must be DNS-safe. - projectName: + title: vm_snapshot_name + description: VmSnapshot to materialize from (`projects/{p}/vm-snapshots/{id}`). Must be READY. + targetDisplayName: type: string - title: project_name - hostName: + title: target_display_name + description: |- + Display name + hostname for the new VM. Display name is required; hostname falls back + to a sanitised version of the display name when empty. + hostname: type: string - title: host_name - description: The specific available host to lease (`hosts/{slug}`), from ListAvailableBareMetal. - labels: - type: object - title: labels - additionalProperties: - type: string - title: value - annotations: - type: object - title: annotations - additionalProperties: - type: string - title: value - idempotencyKey: + title: hostname + vcpus: + type: integer + title: vcpus + format: int32 + description: |- + Configurator shape override. When unset (any of the three), the server inherits the + source VM's shape for the unset components. + ramGib: + type: integer + title: ram_gib + format: int32 + cpuClass: type: string - title: idempotency_key + title: cpu_class billingMode: title: billing_mode - description: |- - Billing mode. Default HOURLY. MONTHLY_* charges the wallet upfront for the term at the - tier's discount; the prepayment must succeed or Create fails. (Field 7 was `instance_type`.) + description: Same lifecycle / billing knobs as CreateVirtualMachine. $ref: '#/components/schemas/aes.compute.v1.BillingMode' autorenew: type: boolean title: autorenew - description: 'For MONTHLY_*: enable auto-renewal at term end. Ignored when HOURLY.' - osImage: - type: string - title: os_image - description: |- - OS + cloud-init. os_image is a catalog id (e.g. "ubuntu-2404"); custom_image_url overrides it - with a direct image URL. hostname + linux_username + ssh_key_names + user_data seed cloud-init. - customImageUrl: - type: string - title: custom_image_url - hostname: - type: string - title: hostname - linuxUsername: - type: string - title: linux_username + assignPublicIpv4: + type: boolean + title: assign_public_ipv4 sshKeyNames: type: array items: @@ -7501,16 +10496,22 @@ components: userData: type: string title: user_data - publicIpv4PrefixLen: - type: integer - title: public_ipv4_prefix_len - format: int32 - description: |- - Public IPv4 block size as a prefix length: 32 (1 IP) / 31 / 30 / 29 / 28 (16 IPs). Default 32. - The block is reserved from the DC public pool at lease time; the first address is primary. - title: CreateBareMetalInstanceRequest + labels: + type: object + title: labels + additionalProperties: + type: string + title: value + description: Labels/annotations applied to the new VM (NOT inherited — same posture as Clone). + annotations: + type: object + title: annotations + additionalProperties: + type: string + title: value + title: CreateVirtualMachineFromBackupRequest additionalProperties: false - aes.baremetal.v1.CreateBareMetalInstanceRequest.AnnotationsEntry: + aes.compute.v1.CreateVirtualMachineFromBackupRequest.AnnotationsEntry: type: object properties: key: @@ -7521,7 +10522,7 @@ components: title: value title: AnnotationsEntry additionalProperties: false - aes.baremetal.v1.CreateBareMetalInstanceRequest.LabelsEntry: + aes.compute.v1.CreateVirtualMachineFromBackupRequest.LabelsEntry: type: object properties: key: @@ -7532,226 +10533,196 @@ components: title: value title: LabelsEntry additionalProperties: false - aes.baremetal.v1.CreateBareMetalInstanceResponse: - type: object - properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: CreateBareMetalInstanceResponse - additionalProperties: false - aes.baremetal.v1.DeleteBareMetalISORequest: - type: object - properties: - projectName: - type: string - title: project_name - objectKey: - type: string - title: object_key - title: DeleteBareMetalISORequest - additionalProperties: false - aes.baremetal.v1.DeleteBareMetalISOResponse: - type: object - title: DeleteBareMetalISOResponse - additionalProperties: false - aes.baremetal.v1.DetachBareMetalISORequest: + aes.compute.v1.CreateVirtualMachineFromBackupResponse: type: object properties: - name: + virtualMachine: + title: virtual_machine + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + diskSnapshotName: type: string - title: name - title: DetachBareMetalISORequest - additionalProperties: false - aes.baremetal.v1.DetachBareMetalISOResponse: - type: object - properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: DetachBareMetalISOResponse + title: disk_snapshot_name + description: |- + Reserved for a future implementation that materialises an intermediate DiskSnapshot row + for the cloned boot disk. Today the server uses an internal storage path that bypasses + the public DiskSnapshot model, so this field is always empty. Kept on the wire so a later + implementation can populate it without a proto change. + operation: + title: operation + description: When async provisioning is configured, the long-running operation. Empty in sync mode. + $ref: '#/components/schemas/aes.ops.v1.Operation' + title: CreateVirtualMachineFromBackupResponse additionalProperties: false - aes.baremetal.v1.EnterBareMetalRescueModeRequest: + aes.compute.v1.CreateVirtualMachineRequest: type: object properties: - name: - type: string - title: name - rescueImageUrl: - type: string - title: rescue_image_url - description: |- - Optional explicit rescue image URL override; defaults to the datacenter's configured - rescue image. Useful for distro-specific rescue tooling. - title: EnterBareMetalRescueModeRequest + manifest: + title: manifest + $ref: '#/components/schemas/aes.compute.v1.VirtualMachineManifest' + title: CreateVirtualMachineRequest additionalProperties: false - aes.baremetal.v1.EnterBareMetalRescueModeResponse: + description: |- + CreateVirtualMachineRequest wraps the declarative manifest — the manifest IS the request body. + Internal control fields (clone source) never appear here: CloneVirtualMachine builds the create + input in-process rather than through this message. + aes.compute.v1.CreateVirtualMachineResponse: type: object properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: EnterBareMetalRescueModeResponse + operation: + title: operation + description: 'Set when provisioning is async: poll GetOperation until SUCCEEDED; metadata may include virtual_machine_name.' + $ref: '#/components/schemas/aes.ops.v1.Operation' + virtualMachine: + title: virtual_machine + description: Set only for the synchronous create path. + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + title: CreateVirtualMachineResponse additionalProperties: false - aes.baremetal.v1.ExitBareMetalRescueModeRequest: + aes.compute.v1.DeleteSSHKeyRequest: type: object properties: name: type: string title: name - title: ExitBareMetalRescueModeRequest + title: DeleteSSHKeyRequest additionalProperties: false - aes.baremetal.v1.ExitBareMetalRescueModeResponse: + aes.compute.v1.DeleteSSHKeyResponse: type: object - properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: ExitBareMetalRescueModeResponse + title: DeleteSSHKeyResponse additionalProperties: false - aes.baremetal.v1.GetBareMetalConsoleURLRequest: + aes.compute.v1.DeleteVirtualMachineRequest: type: object properties: name: type: string title: name - title: GetBareMetalConsoleURLRequest - additionalProperties: false - aes.baremetal.v1.GetBareMetalConsoleURLResponse: - type: object - properties: - consoleUrl: + description: Resource name, e.g. `virtual-machines/{id}`. + etag: type: string - title: console_url + title: etag description: |- - Short-lived websocket path (expires after 60s). Single-use; a current browser session - (cookie) or Authorization: Bearer is also required to connect (defense-in-depth). - expiresAtUnix: - type: - - integer - - string - title: expires_at_unix - format: int64 - vncPassword: - type: string - title: vnc_password + Optimistic concurrency. Empty = unconditional delete; non-empty = require match against + current row's etag, else Aborted. + deleteAttachedDisks: + type: boolean + title: delete_attached_disks description: |- - Per-session VNC password the noVNC client authenticates with (≤8 chars — RFB limit). The - BMC's VNC server is only reachable through Metalhost, so this is defense-in-depth behind - the token+cookie gate, not the primary control. - title: GetBareMetalConsoleURLResponse - additionalProperties: false - aes.baremetal.v1.GetBareMetalInstanceRequest: - type: object - properties: - name: - type: string - title: name - title: GetBareMetalInstanceRequest + When true, also delete the disks currently attached to this VM (boot + data) instead of + detaching them back to AVAILABLE. Disk-first default is false — disks outlive the VM so a + customer can rebuild onto the same boot disk. Set true to fully tear down the VM and + reclaim its storage in one action. Irreversible: the disk data is destroyed. + title: DeleteVirtualMachineRequest additionalProperties: false - aes.baremetal.v1.GetBareMetalInstanceResponse: + aes.compute.v1.DeleteVirtualMachineResponse: type: object properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: GetBareMetalInstanceResponse + operation: + title: operation + description: 'Set when delete is async: poll GetOperation until SUCCEEDED.' + $ref: '#/components/schemas/aes.ops.v1.Operation' + title: DeleteVirtualMachineResponse additionalProperties: false - aes.baremetal.v1.GetBareMetalVirtualMediaRequest: + aes.compute.v1.DeleteVmSnapshotRequest: type: object properties: name: type: string title: name - title: GetBareMetalVirtualMediaRequest + title: DeleteVmSnapshotRequest additionalProperties: false - aes.baremetal.v1.GetBareMetalVirtualMediaResponse: + aes.compute.v1.DeleteVmSnapshotResponse: type: object - properties: - inserted: - type: boolean - title: inserted - isoFilename: - type: string - title: iso_filename - description: |- - Friendly filename + library object key when the mounted image is a metalhost library ISO - (empty for inserted media we can't resolve, e.g. an external URL). - objectKey: - type: string - title: object_key - title: GetBareMetalVirtualMediaResponse + title: DeleteVmSnapshotResponse additionalProperties: false - aes.baremetal.v1.ISOFile: + aes.compute.v1.GPUSpec: type: object properties: - objectKey: - type: string - title: object_key - description: opaque key passed to Attach/Delete - filename: + model: type: string - title: filename - description: display name (basename) - sizeBytes: - type: - - integer - - string - title: size_bytes - format: int64 - uploadedAtUnix: - type: - - integer - - string - title: uploaded_at_unix - format: int64 - status: + title: model + description: GPU model published in the chosen DC (e.g. "rtx4090") + count: + type: integer + title: count + format: int32 + description: whole GPUs to attach (≥1) + title: GPUSpec + additionalProperties: false + aes.compute.v1.GetVMMetricsRequest: + type: object + properties: + name: type: string - title: status - description: |- - Lifecycle status: "READY" (object exists, attachable), "IMPORTING" (URL import in flight), - or "FAILED" (URL import failed — error_message has the reason). Empty defaults to READY for - older clients. Only READY entries can be attached. - bytesDownloaded: + title: name + startTimeUnix: type: - integer - string - title: bytes_downloaded + title: start_time_unix format: int64 - description: |- - For IMPORTING entries: bytes streamed so far and the total (from the source Content-Length; - 0 when the source didn't advertise a length). UI renders bytes_downloaded/total_bytes as a - progress bar; total_bytes==0 → indeterminate spinner. - totalBytes: + description: Unix seconds; required. Bounds the metrics window. + endTimeUnix: type: - integer - string - title: total_bytes + title: end_time_unix format: int64 - operationName: + stepSeconds: + type: integer + title: step_seconds + format: int32 + description: Step in seconds. Default 60. Max 3600 (1h). Smaller = denser series. + title: GetVMMetricsRequest + additionalProperties: false + aes.compute.v1.GetVMMetricsResponse: + type: object + properties: + series: + type: array + items: + $ref: '#/components/schemas/aes.compute.v1.MetricSeries' + title: series + title: GetVMMetricsResponse + additionalProperties: false + aes.compute.v1.GetVirtualMachineRequest: + type: object + properties: + name: type: string - title: operation_name - description: |- - The `bm_iso_import` Operation resource name backing an IMPORTING/FAILED entry (poll - GetOperation for live progress; empty for READY objects). - errorMessage: + title: name + title: GetVirtualMachineRequest + additionalProperties: false + aes.compute.v1.GetVirtualMachineResponse: + type: object + properties: + virtualMachine: + title: virtual_machine + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + title: GetVirtualMachineResponse + additionalProperties: false + aes.compute.v1.GetVmSnapshotRequest: + type: object + properties: + name: type: string - title: error_message - description: 'Set when status == "FAILED": the import error surfaced to the customer.' - title: ISOFile + title: name + title: GetVmSnapshotRequest additionalProperties: false - description: |- - ISOFile is one entry in the org's install-ISO library. A library entry is either a READY - object that physically exists in object storage, or a synthetic IMPORTING/FAILED entry - projected from an in-flight `bm_iso_import` Operation (a URL import that hasn't landed yet) so - the UI can render a live progress bar inline with the completed ISOs. - aes.baremetal.v1.ListAvailableBareMetalRequest: + aes.compute.v1.GetVmSnapshotResponse: type: object properties: - datacenterName: + snapshot: + title: snapshot + $ref: '#/components/schemas/aes.compute.v1.VmSnapshot' + title: GetVmSnapshotResponse + additionalProperties: false + aes.compute.v1.ListSSHKeysRequest: + type: object + properties: + projectName: type: string - title: datacenter_name - description: Optional filter to one datacenter. + title: project_name + description: Full resource name `projects/{slug}`. Slug-only is also accepted. pageSize: type: integer title: page_size @@ -7759,51 +10730,57 @@ components: pageToken: type: string title: page_token - title: ListAvailableBareMetalRequest + title: ListSSHKeysRequest additionalProperties: false - aes.baremetal.v1.ListAvailableBareMetalResponse: + aes.compute.v1.ListSSHKeysResponse: type: object properties: - hosts: + sshKeys: type: array items: - $ref: '#/components/schemas/aes.baremetal.v1.AvailableBareMetal' - title: hosts + $ref: '#/components/schemas/aes.compute.v1.SSHKey' + title: ssh_keys nextPageToken: type: string title: next_page_token - title: ListAvailableBareMetalResponse + title: ListSSHKeysResponse additionalProperties: false - aes.baremetal.v1.ListBareMetalISOsRequest: + aes.compute.v1.ListVMUtilizationRequest: type: object properties: projectName: type: string title: project_name - title: ListBareMetalISOsRequest + title: ListVMUtilizationRequest additionalProperties: false - aes.baremetal.v1.ListBareMetalISOsResponse: + aes.compute.v1.ListVMUtilizationResponse: type: object properties: - isos: + vms: type: array items: - $ref: '#/components/schemas/aes.baremetal.v1.ISOFile' - title: isos - maxIsos: - type: integer - title: max_isos - format: int32 - description: Per-org quota + current usage, so the UI can show "3 / 5" and disable upload at the cap. - title: ListBareMetalISOsResponse + $ref: '#/components/schemas/aes.compute.v1.VMUtilization' + title: vms + available: + type: boolean + title: available + description: |- + false when utilization telemetry is temporarily unavailable for the project's region — + render shapes without bars rather than zeros. + polledAtUnix: + type: + - integer + - string + title: polled_at_unix + format: int64 + title: ListVMUtilizationResponse additionalProperties: false - aes.baremetal.v1.ListBareMetalInstancesRequest: + aes.compute.v1.ListVirtualMachinesRequest: type: object properties: projectName: type: string title: project_name - description: Required. Scopes results to the given project (`projects/{slug}`). pageSize: type: integer title: page_size @@ -7811,28 +10788,31 @@ components: pageToken: type: string title: page_token - title: ListBareMetalInstancesRequest + title: ListVirtualMachinesRequest additionalProperties: false - aes.baremetal.v1.ListBareMetalInstancesResponse: + aes.compute.v1.ListVirtualMachinesResponse: type: object properties: - bareMetalInstances: + virtualMachines: type: array items: - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: bare_metal_instances + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + title: virtual_machines nextPageToken: type: string title: next_page_token - title: ListBareMetalInstancesResponse + title: ListVirtualMachinesResponse additionalProperties: false - aes.baremetal.v1.ListBareMetalInventoryRequest: + aes.compute.v1.ListVmSnapshotsRequest: type: object properties: - datacenterName: + projectName: type: string - title: datacenter_name - description: Optional filter to one datacenter. + title: project_name + sourceVm: + type: string + title: source_vm + description: 'Optional: filter to snapshots taken from this VM.' pageSize: type: integer title: page_size @@ -7840,168 +10820,182 @@ components: pageToken: type: string title: page_token - title: ListBareMetalInventoryRequest + title: ListVmSnapshotsRequest additionalProperties: false - aes.baremetal.v1.ListBareMetalInventoryResponse: + aes.compute.v1.ListVmSnapshotsResponse: type: object properties: - nodes: + vmSnapshots: type: array items: - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalNode' - title: nodes + $ref: '#/components/schemas/aes.compute.v1.VmSnapshot' + title: vm_snapshots nextPageToken: type: string title: next_page_token - total: - type: integer - title: total - format: int32 - description: Fleet totals for the current filter (whole fleet, not just this page). - available: - type: integer - title: available - format: int32 - leased: - type: integer - title: leased - format: int32 - title: ListBareMetalInventoryResponse + title: ListVmSnapshotsResponse additionalProperties: false - aes.baremetal.v1.QuoteBareMetalRequest: + aes.compute.v1.MetricSample: type: object properties: - hostName: + timestampUnix: + type: + - integer + - string + title: timestamp_unix + format: int64 + value: + type: number + title: value + format: double + title: MetricSample + additionalProperties: false + aes.compute.v1.MetricSeries: + type: object + properties: + metric: type: string - title: host_name - description: Host to quote (must be available/priced). - billingMode: - title: billing_mode - $ref: '#/components/schemas/aes.compute.v1.BillingMode' - currency: + title: metric + description: |- + 'cpu_utilization_pct' | 'memory_used_bytes' | 'disk_read_bps' | 'disk_write_bps' | + 'net_rx_bps' | 'net_tx_bps'. + samples: + type: array + items: + $ref: '#/components/schemas/aes.compute.v1.MetricSample' + title: samples + title: MetricSeries + additionalProperties: false + aes.compute.v1.OpenConsoleRequest: + type: object + properties: + name: type: string - title: currency - publicIpv4PrefixLen: - type: integer - title: public_ipv4_prefix_len - format: int32 - description: Public IPv4 block size (32/31/30/29/28). Default 32. Folds the per-IP cost into the quote. - title: QuoteBareMetalRequest + title: name + type: + title: type + description: Defaults to SERIAL when unset. + $ref: '#/components/schemas/aes.compute.v1.ConsoleType' + title: OpenConsoleRequest additionalProperties: false - aes.baremetal.v1.QuoteBareMetalResponse: + aes.compute.v1.OpenConsoleResponse: type: object properties: - monthlyPriceMinor: - type: - - integer - - string - title: monthly_price_minor - format: int64 - description: Host monthly price + derived hourly rate (monthly/730), host only. - hourlyRateMinor: + websocketPath: + type: string + title: websocket_path + description: |- + Relative path the client opens via WebSocket on the Metalhost public endpoint + (e.g. wss://metalhost/v1/console/). The server validates the token and bridges to + the VM's console privately. + token: + type: string + title: token + description: |- + One-shot token embedded in the websocket_path. Single-use, scoped to (vm, console_type), + expires at expires_at_unix. + expiresAtUnix: type: - integer - string - title: hourly_rate_minor + title: expires_at_unix format: int64 - discountPct: + title: OpenConsoleResponse + additionalProperties: false + aes.compute.v1.QuoteVirtualMachineResizeRequest: + type: object + properties: + name: + type: string + title: name + vcpus: type: integer - title: discount_pct + title: vcpus format: int32 - description: 'For MONTHLY_*: discount applied + total due now for the term (host + IP block). 0 for HOURLY.' - prepayDueMinor: + description: |- + Target shape, same semantics as ResizeVirtualMachineRequest. cpu_class cannot change + while a monthly term is active. + ramGib: + type: integer + title: ram_gib + format: int32 + title: QuoteVirtualMachineResizeRequest + additionalProperties: false + aes.compute.v1.QuoteVirtualMachineResizeResponse: + type: object + properties: + reserved: + type: boolean + title: reserved + description: True when the VM is inside an active monthly term (resize = paid one-way upgrade). + dueNowMinor: type: - integer - string - title: prepay_due_minor + title: due_now_minor format: int64 + description: Charged immediately when the resize is applied. Always 0 when reserved is false. currency: type: string title: currency - ipv4Count: - type: integer - title: ipv4_count - format: int32 - description: 'Public-IP breakdown: count of addresses + monthly cost per IP (so the UI can itemize host + IPs).' - ipv4MonthlyMinor: + termEndUnix: type: - integer - string - title: ipv4_monthly_minor + title: term_end_unix format: int64 - title: QuoteBareMetalResponse + description: End of the current term the upgrade is prorated to. 0 when reserved is false. + title: QuoteVirtualMachineResizeResponse additionalProperties: false - aes.baremetal.v1.ReinstallBareMetalRequest: + aes.compute.v1.ReimageVirtualMachineRequest: type: object properties: name: type: string title: name - osImage: - type: string - title: os_image - description: New OS for the reinstall (catalog id or custom URL). Empty = keep the current image. - customImageUrl: - type: string - title: custom_image_url - hostname: - type: string - title: hostname - description: cloud-init overrides for the reinstall. Empty fields keep the lease's current values. - linuxUsername: + bootImageUrl: type: string - title: linux_username - sshKeyNames: - type: array - items: - type: string - title: ssh_key_names - userData: + title: boot_image_url + description: |- + Required: streamable raw disk image URL. Setting this is the canonical way to upgrade + the base OS (Ubuntu 24.04 → 26.04) without recreating the VM. Empty = reuse the original + boot source. + confirmationToken: type: string - title: user_data - title: ReinstallBareMetalRequest - additionalProperties: false - aes.baremetal.v1.ReinstallBareMetalResponse: - type: object - properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: ReinstallBareMetalResponse + title: confirmation_token + description: |- + Required confirmation token. Server returns the expected value on a first call and the + client echoes it back on the second to acknowledge data loss. Wire format: must equal + "REIMAGE/" + the VM name. Refusing this for headless flows is fine (operators set the + token directly), but UIs should round-trip it through a confirmation dialog. + title: ReimageVirtualMachineRequest additionalProperties: false - aes.baremetal.v1.ReleaseBareMetalInstanceRequest: + aes.compute.v1.ReimageVirtualMachineResponse: type: object properties: - name: - type: string - title: name - idempotencyKey: - type: string - title: idempotency_key - title: ReleaseBareMetalInstanceRequest - additionalProperties: false - aes.baremetal.v1.ReleaseBareMetalInstanceResponse: - type: object - title: ReleaseBareMetalInstanceResponse + virtualMachine: + title: virtual_machine + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + title: ReimageVirtualMachineResponse additionalProperties: false - aes.baremetal.v1.RenewBareMetalNowRequest: + aes.compute.v1.RenewVMNowRequest: type: object properties: name: type: string title: name - title: RenewBareMetalNowRequest + title: RenewVMNowRequest additionalProperties: false - aes.baremetal.v1.RenewBareMetalNowResponse: + aes.compute.v1.RenewVMNowResponse: type: object properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' + virtualMachine: + title: virtual_machine + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' newTermId: type: string title: new_term_id - description: The new baremetal_reservations row id, for traceability. + description: The new vm_reservations row id, for traceability. journalEntryId: type: string title: journal_entry_id @@ -8012,63 +11006,106 @@ components: - string title: charged_amount_minor format: int64 - title: RenewBareMetalNowResponse + title: RenewVMNowResponse additionalProperties: false - aes.baremetal.v1.SetBareMetalBootDeviceRequest: + aes.compute.v1.ResizeVirtualMachineRequest: type: object properties: name: type: string title: name - device: - title: device - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalBootDevice' - title: SetBareMetalBootDeviceRequest + vcpus: + type: integer + title: vcpus + format: int32 + description: |- + New configurator shape. All three required; the server rejects InvalidArgument if any is + unset (resize is not "patch one field" — it's a full re-shape so pricing + placement + recompute consistently). Same 1–16 GiB RAM-per-vCPU ratio bounds as Create. + ramGib: + type: integer + title: ram_gib + format: int32 + cpuClass: + type: string + title: cpu_class + description: |- + CPU class. Required — changing class is allowed but the datacenter must have capacity for + the new class or the VM won't restart. + title: ResizeVirtualMachineRequest additionalProperties: false - aes.baremetal.v1.SetBareMetalBootDeviceResponse: + aes.compute.v1.ResizeVirtualMachineResponse: type: object properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: SetBareMetalBootDeviceResponse + virtualMachine: + title: virtual_machine + description: Set on the synchronous path. + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + operation: + title: operation + description: |- + Set when the resize runs as a long-running Operation. Client polls GetOperation until + SUCCEEDED, then re-Gets the VM to see the new shape. The operation runs the full + stop → reshape → start sequence with retries so a mid-flight failure doesn't strand + the VM in STOPPED with the old shape. + $ref: '#/components/schemas/aes.ops.v1.Operation' + title: ResizeVirtualMachineResponse additionalProperties: false - aes.baremetal.v1.SetBareMetalPowerRequest: + aes.compute.v1.RestartVirtualMachineRequest: type: object properties: name: type: string title: name - action: - title: action - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalPowerAction' - title: SetBareMetalPowerRequest + title: RestartVirtualMachineRequest additionalProperties: false - aes.baremetal.v1.SetBareMetalPowerResponse: + aes.compute.v1.RestartVirtualMachineResponse: type: object properties: - instance: - title: instance - $ref: '#/components/schemas/aes.baremetal.v1.BareMetalInstance' - title: SetBareMetalPowerResponse + virtualMachine: + title: virtual_machine + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + title: RestartVirtualMachineResponse additionalProperties: false - aes.catalog.v1.Datacenter: + aes.compute.v1.SSHKey: type: object properties: name: type: string title: name - description: Resource name, e.g. `datacenters/us-dal-1`. + description: Resource name `projects/{project}/ssh-keys/{slug}`. displayName: type: string title: display_name - state: - title: state - $ref: '#/components/schemas/aes.catalog.v1.DatacenterState' - kubernetesApiEndpoint: + projectName: type: string - title: kubernetes_api_endpoint - description: Operator-visible control-plane endpoint for the datacenter. + title: project_name + publicKey: + type: string + title: public_key + description: |- + OpenSSH-format public key (one line: "ssh-ed25519 AAAA... user@host"). Validated for + syntax (algorithm + base64) on Create. + algorithm: + type: string + title: algorithm + description: Algorithm extracted from public_key — "ssh-ed25519" / "ssh-rsa" / "ecdsa-sha2-nistp256". + fingerprint: + type: string + title: fingerprint + description: SHA-256 fingerprint shown in the dashboard for visual identification ("SHA256:abc..."). + createTimeUnix: + type: + - integer + - string + title: create_time_unix + format: int64 + updateTimeUnix: + type: + - integer + - string + title: update_time_unix + format: int64 labels: type: object title: labels @@ -8079,32 +11116,11 @@ components: type: object title: annotations additionalProperties: - type: string - title: value - kubernetesVersion: - type: string - title: kubernetes_version - kubevirtVersion: - type: string - title: kubevirt_version - healthSummary: - type: string - title: health_summary - description: Opaque summary JSON or text for health snapshots. - capacityPct: - type: integer - title: capacity_pct - format: int32 - description: |- - ────────────── Capacity (populated by ListDatacenters / GetDatacenter) ────────────── - capacity_pct: % of usable VM CPU capacity currently allocated (0..100). Same number - GetRegionHealth returns. Allows the VM-create UI to dim a region or surface a "near - capacity" badge without a second round-trip. 0 means empty (or unmeasurable); 100 means - no more VMs can be scheduled until something stops. Zero when the DC isn't READY/DEGRADED - (e.g. PROVISIONING DCs report 0). - title: Datacenter + type: string + title: value + title: SSHKey additionalProperties: false - aes.catalog.v1.Datacenter.AnnotationsEntry: + aes.compute.v1.SSHKey.AnnotationsEntry: type: object properties: key: @@ -8115,7 +11131,7 @@ components: title: value title: AnnotationsEntry additionalProperties: false - aes.catalog.v1.Datacenter.LabelsEntry: + aes.compute.v1.SSHKey.LabelsEntry: type: object properties: key: @@ -8126,674 +11142,524 @@ components: title: value title: LabelsEntry additionalProperties: false - aes.catalog.v1.DatacenterState: - type: string - title: DatacenterState - enum: - - DATACENTER_STATE_UNSPECIFIED - - DATACENTER_STATE_PLANNED - - DATACENTER_STATE_PROVISIONING - - DATACENTER_STATE_READY - - DATACENTER_STATE_DEGRADED - - DATACENTER_STATE_DEPROVISIONING - - DATACENTER_STATE_RETIRED - description: Datacenter lifecycle. - aes.catalog.v1.DatacenterVMCapacity: + aes.compute.v1.SetVMAutorenewRequest: type: object properties: - datacenterName: - type: string - title: datacenter_name - status: + name: type: string - title: status - description: READY / DEGRADED - capacityPct: - type: integer - title: capacity_pct - format: int32 - description: max across classes - sellableVcpu: - type: - - integer - - string - title: sellable_vcpu - format: int64 - freeVcpu: - type: - - integer - - string - title: free_vcpu - format: int64 - sellableRamGib: - type: - - integer - - string - title: sellable_ram_gib - format: int64 - freeRamGib: - type: - - integer - - string - title: free_ram_gib - format: int64 - storageFreeGib: - type: - - integer - - string - title: storage_free_gib - format: int64 - byCpuClass: - type: array - items: - $ref: '#/components/schemas/aes.catalog.v1.VMClassCapacity' - title: by_cpu_class - title: DatacenterVMCapacity + title: name + autorenew: + type: boolean + title: autorenew + title: SetVMAutorenewRequest additionalProperties: false - description: |- - DatacenterVMCapacity rolls the pool breakdown up to the datacenter. The rollup fields (4-8) are - the sum across by_cpu_class; simple consumers can read those and ignore the breakdown. - aes.catalog.v1.GetRegionHealthRequest: + aes.compute.v1.SetVMAutorenewResponse: type: object properties: - datacenterName: - type: string - title: datacenter_name - title: GetRegionHealthRequest + virtualMachine: + title: virtual_machine + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + title: SetVMAutorenewResponse additionalProperties: false - aes.catalog.v1.GetRegionHealthResponse: + aes.compute.v1.SnapshotVirtualMachineRequest: type: object properties: - health: - title: health - $ref: '#/components/schemas/aes.catalog.v1.RegionHealth' - title: GetRegionHealthResponse + vmName: + type: string + title: vm_name + description: |- + VM to snapshot (`virtual-machines/{id}`). Can be RUNNING or STOPPED — both are supported + (running snapshots are crash-consistent). + displayName: + type: string + title: display_name + labels: + type: object + title: labels + additionalProperties: + type: string + title: value + annotations: + type: object + title: annotations + additionalProperties: + type: string + title: value + title: SnapshotVirtualMachineRequest additionalProperties: false - aes.catalog.v1.GetVMCapacityRequest: + aes.compute.v1.SnapshotVirtualMachineRequest.AnnotationsEntry: type: object properties: - datacenterName: + key: type: string - title: datacenter_name - description: Optional filter to one datacenter. Empty = all READY/DEGRADED DCs. - title: GetVMCapacityRequest + title: key + value: + type: string + title: value + title: AnnotationsEntry additionalProperties: false - aes.catalog.v1.GetVMCapacityResponse: + aes.compute.v1.SnapshotVirtualMachineRequest.LabelsEntry: type: object properties: - datacenters: - type: array - items: - $ref: '#/components/schemas/aes.catalog.v1.DatacenterVMCapacity' - title: datacenters - title: GetVMCapacityResponse + key: + type: string + title: key + value: + type: string + title: value + title: LabelsEntry additionalProperties: false - aes.catalog.v1.GpuModelCapacity: + aes.compute.v1.SnapshotVirtualMachineResponse: type: object properties: - gpuModel: - type: string - title: gpu_model - description: e.g. "h100" - total: - type: integer - title: total - format: int32 - description: allocatable GPUs of this model in the pool - free: - type: integer - title: free - format: int32 - description: currently unleased - reserveVcpu: - type: - - integer - - string - title: reserve_vcpu - format: int64 - description: Operator-set per-GPU reservation kept free for an unsold GPU (physical units). Informational. - reserveRamGib: - type: - - integer - - string - title: reserve_ram_gib - format: int64 - maxNodeFreeVcpu: - type: - - integer - - string - title: max_node_free_vcpu - format: int64 - description: |- - Largest single VM (vCPU / RAM, oversubscribe-adjusted) that can schedule on the most-free node - currently holding a free GPU of this model — RAW node free, BEFORE the reservation kept for the - node's other unsold GPUs. A GPU VM lands on ONE node, so this — not the pool sum — bounds how - big a GPU VM can be. 0 when the live probe is unavailable. - maxNodeFreeRamGib: - type: - - integer - - string - title: max_node_free_ram_gib - format: int64 - maxNodeFreeGpus: - type: integer - title: max_node_free_gpus - format: int32 - description: |- - Free GPUs of this model on that same representative node. The configurator subtracts - reserve_* × (max_node_free_gpus − requested_count) from the raw node free above, so renting MORE - GPUs frees the reservation held for the node's remaining GPUs (more CPU/RAM for the VM). - title: GpuModelCapacity + snapshot: + title: snapshot + $ref: '#/components/schemas/aes.compute.v1.VmSnapshot' + title: SnapshotVirtualMachineResponse additionalProperties: false - description: GpuModelCapacity is the whole-GPU availability for one GPU model within a pool. - aes.catalog.v1.ListDatacentersRequest: + aes.compute.v1.StartVirtualMachineRequest: type: object properties: - pageSize: - type: integer - title: page_size - format: int32 - pageToken: - type: string - title: page_token - filter: + name: type: string - title: filter - description: 'Reserved for CEL / simple filters (Phase 0: ignored).' - title: ListDatacentersRequest + title: name + title: StartVirtualMachineRequest additionalProperties: false - aes.catalog.v1.ListDatacentersResponse: + aes.compute.v1.StartVirtualMachineResponse: type: object properties: - datacenters: - type: array - items: - $ref: '#/components/schemas/aes.catalog.v1.Datacenter' - title: datacenters - nextPageToken: - type: string - title: next_page_token - title: ListDatacentersResponse + virtualMachine: + title: virtual_machine + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + operation: + title: operation + description: The operation tracking this request. Poll until terminal, then fetch the VM. + $ref: '#/components/schemas/aes.ops.v1.Operation' + title: StartVirtualMachineResponse additionalProperties: false - aes.catalog.v1.ListMaintenanceWindowsRequest: + aes.compute.v1.StopVirtualMachineRequest: type: object properties: - datacenterName: - type: string - title: datacenter_name - description: Optional DC filter; empty = all DCs. - activeOnly: - type: boolean - title: active_only - description: When true, only windows whose end_time is in the future. Default false (returns history too). - pageSize: - type: integer - title: page_size - format: int32 - pageToken: + name: type: string - title: page_token - title: ListMaintenanceWindowsRequest + title: name + title: StopVirtualMachineRequest additionalProperties: false - aes.catalog.v1.ListMaintenanceWindowsResponse: + aes.compute.v1.StopVirtualMachineResponse: type: object properties: - maintenanceWindows: - type: array - items: - $ref: '#/components/schemas/aes.catalog.v1.MaintenanceWindow' - title: maintenance_windows - nextPageToken: - type: string - title: next_page_token - title: ListMaintenanceWindowsResponse + virtualMachine: + title: virtual_machine + $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' + operation: + title: operation + description: The operation tracking this request. Poll until terminal, then fetch the VM. + $ref: '#/components/schemas/aes.ops.v1.Operation' + title: StopVirtualMachineResponse additionalProperties: false - aes.catalog.v1.MaintenanceWindow: + aes.compute.v1.UserSpec: type: object properties: name: type: string title: name - datacenterName: - type: string - title: datacenter_name - startTimeUnix: - type: - - integer - - string - title: start_time_unix - format: int64 - endTimeUnix: - type: - - integer - - string - title: end_time_unix - format: int64 - description: + description: Login name. `^[a-z_][a-z0-9_-]{0,31}$`, and not `root`. Required. + password: type: string - title: description - affectedComponents: + title: password + description: |- + Optional plaintext password. Sent over TLS, hashed server-side ($6$ SHA-512 crypt) into the + cloud-init seed. NEVER persisted plaintext and never echoed back on Get/List. When any user + has a password, cloud-init `ssh_pwauth` is enabled; otherwise it stays disabled. + sudo: + type: boolean + title: sudo + description: |- + Grant passwordless sudo (ALL=(ALL) NOPASSWD:ALL). When false, a user with a password + receives password-authenticated sudo; a key-only user receives no sudo access. + sshKeys: type: array items: type: string - title: affected_components - description: 'Resource kinds affected: e.g. "compute" / "storage" / "network".' - status: + title: ssh_keys + description: |- + Registered SSHKey resource refs (`projects/{p}/ssh-keys/{id}`), merged into this user's + ssh_authorized_keys. + sshPubkey: type: string - title: status - description: '''SCHEDULED'' | ''ACTIVE'' | ''COMPLETED'' | ''CANCELLED''.' - title: MaintenanceWindow + title: ssh_pubkey + description: Inline OpenSSH public key(s), newline-separated. Merged after ssh_keys. + title: UserSpec additionalProperties: false - aes.catalog.v1.QuoteVirtualMachineRequest: + aes.compute.v1.VMBillingSpec: type: object properties: - vcpus: - type: integer - title: vcpus - format: int32 + mode: + title: mode + description: HOURLY (default) = per-hour usage. MONTHLY_* prepays the full term upfront at the tier discount. + $ref: '#/components/schemas/aes.compute.v1.BillingMode' + autorenew: + type: boolean + title: autorenew + description: 'For MONTHLY_*: auto-renew at term end. Ignored when HOURLY.' + title: VMBillingSpec + additionalProperties: false + aes.compute.v1.VMBootSpec: + type: object + properties: + image: + type: string + title: image description: |- - Same fields as CreateVirtualMachineRequest's configurator slice. Validated under the - same 1–16 GiB-per-vCPU ratio bounds; an out-of-range shape returns InvalidArgument. - ramGib: + Curated catalog image id (e.g. "ubuntu-24-04") — resolved server-side to an image URL + + the distro's default login user. Mutually exclusive with image_url/disk_name. + imageUrl: + type: string + title: image_url + description: |- + Raw streamable image URL — escape hatch for non-catalog images. Mutually exclusive with + image/disk_name. + diskGib: type: integer - title: ram_gib + title: disk_gib format: int32 + description: Boot disk size GiB (1..1024). Required when image/image_url is set. + diskName: + type: string + title: disk_name + description: |- + Bind a pre-existing Disk as boot instead of importing an image (`projects/{p}/disks/{id}`). + The disk must be AVAILABLE, same project+DC, unattached. Mutually exclusive with image/image_url. + title: VMBootSpec + additionalProperties: false + aes.compute.v1.VMComputeSpec: + type: object + properties: cpuClass: type: string title: cpu_class - bootDiskGib: - type: integer - title: boot_disk_gib - format: int32 - extraDiskGib: - type: integer - title: extra_disk_gib - format: int32 - publicIpv4Count: + description: CPU class — must have published pricing and capacity in the datacenter. Required. + vcpus: type: integer - title: public_ipv4_count + title: vcpus format: int32 - currency: - type: string - title: currency - description: default USD - gpuModel: - type: string - title: gpu_model - description: |- - Whole-GPU passthrough. gpu_model is the SKU variant (e.g. "rtx4090"), gpu_count the number of - cards; priced via compute.gpu..runtime_hours. Empty/0 = CPU-only quote. - gpuCount: + description: required, validated against the RAM-per-vCPU ratio bounds + ramGib: type: integer - title: gpu_count + title: ram_gib format: int32 - title: QuoteVirtualMachineRequest + description: required + gpu: + title: gpu + description: Optional whole-GPU passthrough. Omit for a CPU-only VM. + $ref: '#/components/schemas/aes.compute.v1.GPUSpec' + title: VMComputeSpec additionalProperties: false - aes.catalog.v1.QuoteVirtualMachineResponse: + aes.compute.v1.VMNetworkSpec: type: object properties: - hourlyMinor: - type: - - integer - - string - title: hourly_minor - format: int64 + network: + type: string + title: network description: |- - ROUND-to-int64 view for clients that don't want to parse decimals. For shapes whose - hourly cost is sub-cent (typical for small configurator VMs at $2.50/vCPU-month) this - rounds — use hourly_minor_decimal for the exact NUMERIC. - monthly1Minor: - type: - - integer - - string - title: monthly_1_minor - format: int64 + Tenant network `projects/{p}/networks/{id}`. Empty → the project's default network + (auto-created lazily on first VM in the project + DC). + publicIpv4: + type: boolean + title: public_ipv4 description: |- - Per-term prepayment totals for each MONTHLY_* tier, in minor units. Discount applied: - MONTHLY_1 = 0%, MONTHLY_3 = 5%, MONTHLY_6 = 8%, MONTHLY_12 = 12%. Calculated as - hourly × 730 hours × months × (1 - discount/100), rounded once at the end. - monthly3Minor: - type: - - integer - - string - title: monthly_3_minor - format: int64 - monthly6Minor: - type: - - integer - - string - title: monthly_6_minor - format: int64 - monthly12Minor: - type: - - integer - - string - title: monthly_12_minor - format: int64 - currency: - type: string - title: currency - hourlyMinorDecimal: - type: string - title: hourly_minor_decimal + Allocate a public IPv4 for the VM's public NIC (the scarce, billed extra). IPv6 comes + free on the public NIC regardless (see VirtualMachine.public_ipv6) unless private_only. + Default false. + securityGroups: + type: array + items: + type: string + title: security_groups description: |- - Exact NUMERIC text values mirroring the int64 fields above (1.0 = 1 cent, 6 decimals - of sub-cent precision). Clients that need to compose further math (display hourly, - pro-rate by elapsed seconds, etc.) should consume these instead of the rounded int64s. - monthly1MinorDecimal: - type: string - title: monthly_1_minor_decimal - monthly3MinorDecimal: - type: string - title: monthly_3_minor_decimal - monthly6MinorDecimal: - type: string - title: monthly_6_minor_decimal - monthly12MinorDecimal: + Internal security groups to attach to the VM's private NIC at create + (`organizations/{org}/projects/{p}/securityGroups/{id}`). Empty = open within the VPC. + privateOnly: + type: boolean + title: private_only + description: |- + private_only attaches NO public NIC at all — no public IPv4, no public IPv6, no inbound + internet surface. The VM still has outbound internet via the private NIC's NAT. Default + false: every VM gets a public NIC with a free IPv6 GUA. Use for air-gapped-ish workloads. + title: VMNetworkSpec + additionalProperties: false + aes.compute.v1.VMUtilization: + type: object + properties: + virtualMachineName: type: string - title: monthly_12_minor_decimal - title: QuoteVirtualMachineResponse + title: virtual_machine_name + cpuPct: + type: number + title: cpu_pct + format: double + description: 0-100, normalized to the VM's vCPU count. + memPct: + type: number + title: mem_pct + format: double + description: 0-100 of guest-visible memory in use. + gpuPct: + type: number + title: gpu_pct + format: double + description: |- + 0-100 averaged across the VM's GPUs. 0 for CPU-only VMs or when GPU telemetry + isn't reporting. + idleDays: + type: integer + title: idle_days + format: int32 + description: |- + Consecutive days the VM has stayed under the idle threshold (CPU and, when present, + GPU averaging below 10%). 0 = active. Stopping idle workloads is the dashboard's + first cost-hygiene suggestion. + title: VMUtilization additionalProperties: false - aes.catalog.v1.RegionHealth: + aes.compute.v1.VirtualMachine: type: object properties: + name: + type: string + title: name + projectName: + type: string + title: project_name datacenterName: type: string title: datacenter_name - status: - type: string - title: status - capacityPct: - type: integer - title: capacity_pct - format: int32 - degradedComponents: - type: array - items: - type: string - title: degraded_components - healthSummary: + state: type: string - title: health_summary - lastUpdatedUnix: - type: - - integer - - string - title: last_updated_unix - format: int64 - vmSellableVcpu: - type: - - integer - - string - title: vm_sellable_vcpu - format: int64 + title: state description: |- - VM CPU capacity. sellable = total vCPU a customer can buy; running = in use; - free = available. Presented to customers as plain vCPU counts. - vmRunningVcpu: - type: - - integer - - string - title: vm_running_vcpu - format: int64 - vmFreeVcpu: - type: - - integer - - string - title: vm_free_vcpu - format: int64 - vmSellableRamGib: + Current lifecycle state — PROVISIONING / BOOTING / RUNNING / RESTARTING / STOPPING / + STOPPED / STOPPED_FOR_NONPAYMENT / STOPPED_FOR_SUSPENSION / FAILED / ORPHANED / DELETING / + DELETED. STOPPED_FOR_SUSPENSION means an admin suspended the owning organization; the VM's + disks are preserved and it returns to STOPPED when the org is reinstated. Updated after + the corresponding lifecycle RPC succeeds. A VM that can no longer be found on its host + surfaces as ORPHANED (and is restored automatically if it reappears); reads may reflect + that transition. + createTimeUnix: type: - integer - string - title: vm_sellable_ram_gib + title: create_time_unix format: int64 + labels: + type: object + title: labels + additionalProperties: + type: string + title: value + description: User-facing labels (filterable, indexed externally). Merged on Update unless clear_labels. + annotations: + type: object + title: annotations + additionalProperties: + type: string + title: value + description: Operator notes / non-indexed metadata. Same merge-by-default semantics as labels. + etag: + type: string + title: etag description: |- - VM RAM capacity. sellable = total RAM a customer can buy; running = Σ ram_gib of - RUNNING VMs; free = headroom. - vmRunningRamGib: - type: - - integer - - string - title: vm_running_ram_gib - format: int64 - vmFreeRamGib: + ETag for optimistic concurrency. Server generates from the row's version + update_time; + every mutation that takes an etag refuses to apply when the supplied etag doesn't match + the current row, returning Aborted. Treat as opaque on the client side. + updateTimeUnix: type: - integer - string - title: vm_free_ram_gib + title: update_time_unix format: int64 - storageUsableGib: + description: Last-modified time, mirrors the underlying row's update_time. Useful for sorting + UI. + billingMode: + title: billing_mode + description: Current billing mode. HOURLY = per-hour usage; MONTHLY_* = prepaid term. + $ref: '#/components/schemas/aes.compute.v1.BillingMode' + commitmentEndAtUnix: type: - integer - string - title: storage_usable_gib + title: commitment_end_at_unix format: int64 description: |- - Block storage capacity (post-replication usable). usable = total after replication; - free = available. Zero when the datacenter has no storage capacity data (stale/unavailable). - storageFreeGib: - type: - - integer - - string - title: storage_free_gib - format: int64 - reachable: + For MONTHLY_*: when the prepaid term ends. After this passes the renewal worker either + re-charges (autorenew=true) or flips the row back to HOURLY. Zero when billing_mode is + HOURLY. + autorenew: type: boolean - title: reachable + title: autorenew description: |- - Whether this region's control plane is currently reachable. When false the region is - temporarily offline: new VM creates are paused and capacity figures are last-known. - Defaults true. - unreachableSinceUnix: - type: - - integer - - string - title: unreachable_since_unix - format: int64 - description: Unix seconds the region became unreachable (0 when reachable). - title: RegionHealth - additionalProperties: false - description: |- - RegionHealth is the customer-visible summary of a DC's current state. capacity_pct is the - % of compute hosts currently allocated (0..100); status is the DC's `state` mapped to a - human-friendly summary; degraded_components lists subsystems with non-OK status. - aes.catalog.v1.VMClassCapacity: - type: object - properties: - cpuClass: + For MONTHLY_*: whether the renewal worker should auto-charge for the next term when + this one ends. Customer toggles via SetVMAutorenew. Ignored when billing_mode is HOURLY. + privateIpv4: type: string - title: cpu_class - description: e.g. "cascadelake", "genoa" - sellableVcpu: - type: - - integer - - string - title: sellable_vcpu - format: int64 - freeVcpu: - type: - - integer - - string - title: free_vcpu - format: int64 - sellableRamGib: - type: - - integer - - string - title: sellable_ram_gib - format: int64 - freeRamGib: - type: - - integer - - string - title: free_ram_gib - format: int64 - capacityPct: - type: integer - title: capacity_pct - format: int32 + title: private_ipv4 description: |- - Most-utilized dimension (cpu/ram/gpu) as 0..100 — a pool is "full" when this hits 100 even if - another dimension has headroom (binding-resource rule). - gpus: - type: array - items: - $ref: '#/components/schemas/aes.catalog.v1.GpuModelCapacity' - title: gpus - description: GPU availability per model in this pool (empty for non-GPU pools). - maxNodeFreeVcpu: - type: - - integer - - string - title: max_node_free_vcpu - format: int64 + ────────────── Runtime-derived fields (populated live at Get/List time) ────────────── + These are NOT stored; Get/List handlers read them from the datacenter so the API surface + matches reality (private IP, host node, disk size, boot image, detailed status). Empty when + the VM has been deleted or is unreachable — `state` then reads `DELETED`/`UNKNOWN`. + + Tenant-private IPv4 from the project's network. Pinned across stop/start. Routable only + inside the tenant network (cross-network requires explicit peering); for outbound internet + egress the VM uses its public NIC when one is allocated. + hostNode: + type: string + title: host_node description: |- - Largest single CPU VM (vCPU / RAM, oversubscribe-adjusted) that can schedule on this class's - most-free node. A VM lands on ONE node, so this bounds the configurator sliders — the pool - sum (free_vcpu/free_ram_gib) can be admitted but then stay Pending if no single node fits. - 0 when the live probe is unavailable. - maxNodeFreeRamGib: - type: - - integer - - string - title: max_node_free_ram_gib - format: int64 - title: VMClassCapacity - additionalProperties: false - description: VMClassCapacity is the sellable capacity of one pool = (datacenter, cpu_class). - aes.compute.v1.BackupVolume: - type: object - properties: - sourceDisk: + Host the VM runs on (e.g. "worker-01"). Useful for capacity reports and migration + affinity hints. + statusDetail: + type: string + title: status_detail + description: |- + Finer-grained status than `state`. Values: "Running", "Starting", "Stopping", "Stopped", + "Provisioning", "ErrImagePull", "Unknown", and others. Use for UI surfacing of transient + phases that don't map cleanly to `state`. + hostname: + type: string + title: hostname + description: |- + User-facing hostname (DNS-1123 label, ≤63 chars). Injected as the guest's cloud-init + hostname. Customer chooses; defaults to the resource id if omitted at create time. + networkName: + type: string + title: network_name + description: |- + Tenant network the VM is attached to (`projects/{p}/networks/{id}`). Each VM has exactly + one network, which provides the VM's single NIC and IPv6 address. VMs in the same network + can talk freely; cross-network requires explicit peering. + publicIpv4: + type: string + title: public_ipv4 + description: |- + Public IPv4 address allocated to this VM for the public NIC workflow. Empty when the VM + was created without `assign_public_ipv4=true`. When set, this is the same value as the + PublicIp resource's ip_address. + publicIpv6: + type: string + title: public_ipv6 + description: |- + Public IPv6 address on the same public NIC as public_ipv4. Included automatically with + the public IP in IPv6-enabled datacenters — no extra request flag and no extra charge. + Statically configured and pinned for the VM's lifetime. Empty when the VM has no public + IP or the datacenter doesn't offer IPv6 yet. + publicIpv6Prefix: type: string - title: source_disk - role: + title: public_ipv6_prefix + description: |- + Routed IPv6 /64 (CIDR form) dedicated to this VM, included free with the public NIC in + supported datacenters. The whole prefix routes to the VM: the first address + (::1) is preconfigured in the guest; bind any others directly. Pinned for the + VM's lifetime. Empty when the datacenter doesn't offer routed prefixes yet. + bootDisk: type: string - title: role - sizeGib: + title: boot_disk + description: |- + The Disk resource bound as the VM's boot device (`projects/{p}/disks/{id}`). Set on every + persistent VM (ephemeral lab VMs leave it empty). The disk has its own + lifecycle: DeleteVirtualMachine detaches it but does not delete it, so a customer can bind + the same boot_disk to a fresh VM and keep their data. Use GetDisk for size + source URL. + vcpus: type: integer - title: size_gib + title: vcpus format: int32 - displayName: - type: string - title: display_name - title: BackupVolume - additionalProperties: false - aes.compute.v1.BillingMode: - type: string - title: BillingMode - enum: - - BILLING_MODE_UNSPECIFIED - - BILLING_MODE_HOURLY - - BILLING_MODE_MONTHLY_1 - - BILLING_MODE_MONTHLY_3 - - BILLING_MODE_MONTHLY_6 - - BILLING_MODE_MONTHLY_12 - description: |- - BillingMode picks how a VM is charged: per-hour (post-paid usage events) or upfront monthly - commitment at a discounted rate. Server treats UNSPECIFIED as HOURLY so missing the field - on Create gets the default behavior. - aes.compute.v1.BootDiskSpec: - type: object - properties: - displayName: - type: string - title: display_name - sizeGib: + description: |- + Configurator shape — the (vcpus, ram_gib, cpu_class) the VM was created with. Drives the + per-component hourly usage events. + ramGib: type: integer - title: size_gib + title: ram_gib format: int32 - description: 1..1024 GiB. - storageClass: + cpuClass: type: string - title: storage_class - description: Storage tier (`nvme`). Defaults to nvme. - fromImageUrl: + title: cpu_class + gpuModel: type: string - title: from_image_url + title: gpu_model description: |- - Streamable raw disk image URL. Required UNLESS clone_source_disk is set (clone path - supplies the data by snapshotting an existing disk instead). - labels: - type: object - title: labels - additionalProperties: - type: string - title: value - annotations: - type: object - title: annotations - additionalProperties: - type: string - title: value - cloneSourceDisk: + Whole-GPU passthrough attached to the VM. gpu_model is the SKU variant (e.g. "rtx4090"); + gpu_count is how many physical cards. Empty / 0 for a CPU-only VM. Drives the + compute.gpu..runtime_hours meter. + gpuCount: + type: integer + title: gpu_count + format: int32 + currentCostPerHourMinorDecimal: type: string - title: clone_source_disk + title: current_cost_per_hour_minor_decimal description: |- - Clone path: when set, this boot disk is created by copying the named source Disk rather - than importing from from_image_url. Set by CloneVirtualMachine; customers don't set this - directly. size_gib is derived from the source. - title: BootDiskSpec - additionalProperties: false - description: |- - BootDiskSpec is the inline disk spec carried by CreateVirtualMachineRequest.boot_disk. - from_image_url is required — empty source is rejected (every boot disk needs an OS - image). The resulting Disk is owned by the same project as the VM and persists past - DeleteVirtualMachine. - aes.compute.v1.BootDiskSpec.AnnotationsEntry: - type: object - properties: - key: - type: string - title: key - value: - type: string - title: value - title: AnnotationsEntry - additionalProperties: false - aes.compute.v1.BootDiskSpec.LabelsEntry: - type: object - properties: - key: - type: string - title: key - value: - type: string - title: value - title: LabelsEntry - additionalProperties: false - aes.compute.v1.CloneVirtualMachineRequest: - type: object - properties: - sourceVmName: + ────────────── Live cost fields (computed at Get-time, not persisted) ────────────── + current_cost_per_hour_minor_decimal: the hourly rate this VM would accrue in HOURLY mode + at current rates, including boot disk + any public IP. NUMERIC text so sub-cent precision + (e.g. "0.342465" for a 1-vCPU cascadelake VM) survives the wire. Zero string ("0") when + the VM is in a state that doesn't bill (DELETED, etc.) or rates aren't seeded. + + Why decimal: a small VM's hourly rate is fractional cents — rounding to int64 hides the + truth and customers see "$0/hr". The portal displays the decimal value to 4-6 places. + + mtd_spend_minor_decimal: month-to-date wallet debits attributed to this VM. Reflects what + the customer has actually paid for this VM since start-of-month UTC. Sub-cent residue not + yet charged is NOT counted. + mtdSpendMinorDecimal: type: string - title: source_vm_name - description: Source VM resource name to clone from. - targetDisplayName: + title: mtd_spend_minor_decimal + linuxUsername: type: string - title: target_display_name + title: linux_username description: |- - Display name for the new VM. Required so the customer can distinguish the clone in - listings — the resource name itself is server-assigned. - labels: - type: object - title: labels - additionalProperties: + Linux login user cloud-init created for SSH access (`ssh @`). + Set from CreateVirtualMachineRequest.linux_username. Empty on VMs created with a raw + user_data cloud-config (the customer's YAML owns user creation) or on pre-feature rows. + securityGroups: + type: array + items: type: string - title: value + title: security_groups description: |- - Labels/annotations applied to the new VM (NOT inherited from the source — clone is for - disk state, not metadata). - annotations: - type: object - title: annotations - additionalProperties: - type: string - title: value - title: CloneVirtualMachineRequest + Internal security groups attached to this VM's private NIC + (`organizations/{org}/projects/{p}/securityGroups/{id}`). Empty = the VM is open to the + rest of the VPC (default). Editable post-create via Add/RemoveVmFromSecurityGroup. + datacenterReachable: + type: boolean + title: datacenter_reachable + description: |- + Whether this VM's datacenter is currently reachable from the control plane. Computed live at + Get/List time (not stored). When false, the datacenter is temporarily offline: `state` and the + other runtime-derived fields above are LAST-KNOWN (as of the last successful sync, not live), + and lifecycle actions are paused until it reconnects. Defaults true. + datacenterUnreachableSinceUnix: + type: + - integer + - string + title: datacenter_unreachable_since_unix + format: int64 + description: |- + Unix seconds the VM's datacenter became unreachable (0 when reachable). Lets the UI show how + long the outage has lasted ("offline 3m"). + createdBy: + type: string + title: created_by + description: Principal that created the VM (e.g. `users/jane`). '' for legacy rows / system-created. + renewalCostPerHourMinorDecimal: + type: string + title: renewal_cost_per_hour_minor_decimal + description: |- + For a VM inside a monthly term: the full-shape hourly rate at current prices — what the + next renewal (or the fallback to hourly billing at term end) will effectively cost. + current_cost_per_hour_minor_decimal reads "0" during the term (the shape is prepaid); + this field lets burn-rate and balance projections still account for the commitment. + Empty for hourly-billed VMs. + title: VirtualMachine additionalProperties: false - aes.compute.v1.CloneVirtualMachineRequest.AnnotationsEntry: + aes.compute.v1.VirtualMachine.AnnotationsEntry: type: object properties: key: @@ -8804,7 +11670,7 @@ components: title: value title: AnnotationsEntry additionalProperties: false - aes.compute.v1.CloneVirtualMachineRequest.LabelsEntry: + aes.compute.v1.VirtualMachine.LabelsEntry: type: object properties: key: @@ -8815,70 +11681,60 @@ components: title: value title: LabelsEntry additionalProperties: false - aes.compute.v1.CloneVirtualMachineResponse: + aes.compute.v1.VirtualMachineManifest: type: object properties: - virtualMachine: - title: virtual_machine - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - vmSnapshotName: + apiVersion: type: string - title: vm_snapshot_name - description: |- - The intermediate snapshot the clone was taken from. Useful for retry / audit; the - customer can reuse it to clone again or roll back. - operation: - title: operation - description: |- - When async provisioning is configured, the long-running operation tracking the clone. - Empty in sync mode. - $ref: '#/components/schemas/aes.ops.v1.Operation' - title: CloneVirtualMachineResponse + title: api_version + description: '"compute.metalhost.io/v1" (optional; validated when set)' + kind: + type: string + title: kind + description: '"VirtualMachine" (optional; validated when set)' + metadata: + title: metadata + $ref: '#/components/schemas/aes.compute.v1.VirtualMachineMetadata' + spec: + title: spec + $ref: '#/components/schemas/aes.compute.v1.VirtualMachineSpec' + title: VirtualMachineManifest additionalProperties: false - aes.compute.v1.ConsoleType: - type: string - title: ConsoleType - enum: - - CONSOLE_TYPE_UNSPECIFIED - - CONSOLE_TYPE_SERIAL - - CONSOLE_TYPE_VNC - description: ConsoleType picks which console the proxy bridges to. - aes.compute.v1.CreateSSHKeyRequest: + description: |- + ───────────────────────────── Declarative VM manifest ───────────────────────────── + The customer-facing, CLI-and-web-shared create document (docs/specs/VM_DECLARATIVE_MANIFEST_AND_USERS.md). + CreateVirtualMachine takes this directly; the web configures it and sends it, and (planned) + `metalhost vm apply -f vm.yaml` deserializes YAML into the same message — one schema, the YAML + is just its serialization. api_version/kind round-trip the YAML form; the server validates them + when present but they carry no behavior (the RPC method already implies kind=VirtualMachine). + aes.compute.v1.VirtualMachineMetadata: type: object properties: - projectName: - type: string - title: project_name - description: Full resource name `projects/{slug}`. Slug-only is also accepted. - sshKeyId: - type: string - title: ssh_key_id - description: DNS-safe slug. Resource name becomes `projects/{project_name}/ssh-keys/{ssh_key_id}`. - displayName: + name: type: string - title: display_name - publicKey: + title: name + description: Hostname (DNS-1123 label, ≤63 chars). Empty → server defaults to the VM's resource id slug. + project: type: string - title: public_key - description: OpenSSH single-line format. Trailing comment optional. + title: project + description: Owning project `projects/{slug}`. Empty → the principal's default project. labels: type: object title: labels additionalProperties: type: string title: value + description: User-facing labels stamped at create time (filterable). `aes.metalhost/*` keys are reserved. annotations: type: object title: annotations additionalProperties: type: string title: value - idempotencyKey: - type: string - title: idempotency_key - title: CreateSSHKeyRequest + description: Operator notes / non-indexed metadata. Same `aes.metalhost/*` reservation. + title: VirtualMachineMetadata additionalProperties: false - aes.compute.v1.CreateSSHKeyRequest.AnnotationsEntry: + aes.compute.v1.VirtualMachineMetadata.AnnotationsEntry: type: object properties: key: @@ -8889,7 +11745,7 @@ components: title: value title: AnnotationsEntry additionalProperties: false - aes.compute.v1.CreateSSHKeyRequest.LabelsEntry: + aes.compute.v1.VirtualMachineMetadata.LabelsEntry: type: object properties: key: @@ -8900,3088 +11756,3771 @@ components: title: value title: LabelsEntry additionalProperties: false - aes.compute.v1.CreateSSHKeyResponse: + aes.compute.v1.VirtualMachineSpec: type: object properties: - sshKey: - title: ssh_key - $ref: '#/components/schemas/aes.compute.v1.SSHKey' - title: CreateSSHKeyResponse + region: + type: string + title: region + description: Target datacenter `datacenters/{slug}`. Required. + compute: + title: compute + description: Configurator shape. Required. + $ref: '#/components/schemas/aes.compute.v1.VMComputeSpec' + boot: + title: boot + description: Boot source. Required (one of image / image_url / disk_name). + $ref: '#/components/schemas/aes.compute.v1.VMBootSpec' + network: + title: network + description: Network attachment + public IP choice. + $ref: '#/components/schemas/aes.compute.v1.VMNetworkSpec' + users: + type: array + items: + $ref: '#/components/schemas/aes.compute.v1.UserSpec' + title: users + description: |- + Login users created via cloud-init. Empty AND cloud_init empty → no inbound login (console + only). When cloud_init is set it OWNS user creation and users is ignored. + cloudInit: + type: string + title: cloud_init + description: |- + Raw #cloud-config userdata. When set, replaces all generated cloud-init (users included). + Must be valid `#cloud-config` YAML. + billing: + title: billing + description: Billing term. Defaults to HOURLY. + $ref: '#/components/schemas/aes.compute.v1.VMBillingSpec' + title: VirtualMachineSpec additionalProperties: false - aes.compute.v1.CreateVirtualMachineFromBackupRequest: + aes.compute.v1.VmSnapshot: type: object properties: - vmSnapshotName: + name: type: string - title: vm_snapshot_name - description: VmSnapshot to materialize from (`projects/{p}/vm-snapshots/{id}`). Must be READY. - targetDisplayName: + title: name + description: Resource name `projects/{project}/vm-snapshots/{id}`. + displayName: type: string - title: target_display_name - description: |- - Display name + hostname for the new VM. Display name is required; hostname falls back - to a sanitised version of the display name when empty. - hostname: + title: display_name + projectName: type: string - title: hostname - vcpus: - type: integer - title: vcpus - format: int32 - description: |- - Configurator shape override. When unset (any of the three), the server inherits the - source VM's shape for the unset components. - ramGib: + title: project_name + datacenterName: + type: string + title: datacenter_name + sourceVm: + type: string + title: source_vm + description: Resource name of the source VM at snapshot creation time. + sizeGib: type: integer - title: ram_gib + title: size_gib format: int32 - cpuClass: - type: string - title: cpu_class - billingMode: - title: billing_mode - description: Same lifecycle / billing knobs as CreateVirtualMachine. - $ref: '#/components/schemas/aes.compute.v1.BillingMode' - autorenew: - type: boolean - title: autorenew - assignPublicIpv4: - type: boolean - title: assign_public_ipv4 - sshKeyNames: - type: array - items: - type: string - title: ssh_key_names - userData: + description: Sum of disk sizes at snapshot time (used for billing units). + state: type: string - title: user_data + title: state + description: CREATING / READY / DELETING / DELETED. + createTimeUnix: + type: + - integer + - string + title: create_time_unix + format: int64 + updateTimeUnix: + type: + - integer + - string + title: update_time_unix + format: int64 labels: type: object title: labels additionalProperties: type: string title: value - description: Labels/annotations applied to the new VM (NOT inherited — same posture as Clone). annotations: type: object title: annotations additionalProperties: type: string title: value - title: CreateVirtualMachineFromBackupRequest - additionalProperties: false - aes.compute.v1.CreateVirtualMachineFromBackupRequest.AnnotationsEntry: - type: object - properties: - key: + currentCostPerHourMinorDecimal: type: string - title: key - value: + title: current_cost_per_hour_minor_decimal + description: |- + ────────────── Live cost fields (computed at Get/List-time, not persisted) ── + Hourly rate this snapshot accrues against the wallet at current pricing + (size_gib × the snapshot storage unit price). + NUMERIC text so fractional cents survive the wire (a 40 GiB backup costs + ~0.55 cents per hour — int64 would round to 1 and overstate by ~80%). + Zero ("0") when rates aren't seeded or the snapshot is in a non-billing + state (DELETED, etc.); empty ("") only when the field is uninitialised. + monthlyCostMinorDecimal: type: string - title: value - title: AnnotationsEntry - additionalProperties: false - aes.compute.v1.CreateVirtualMachineFromBackupRequest.LabelsEntry: - type: object - properties: - key: + title: monthly_cost_minor_decimal + description: |- + Convenience: monthly rate at 730 hours/month. Same precision rules; the + SPA displays this directly so the customer doesn't have to multiply. + consistency: type: string - title: key - value: + title: consistency + description: QUIESCED, CRASH_CONSISTENT, or OFFLINE; empty until captured. + volumes: + type: array + items: + $ref: '#/components/schemas/aes.compute.v1.BackupVolume' + title: volumes + createdBySchedule: type: string - title: value - title: LabelsEntry - additionalProperties: false - aes.compute.v1.CreateVirtualMachineFromBackupResponse: - type: object - properties: - virtualMachine: - title: virtual_machine - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - diskSnapshotName: + title: created_by_schedule + errorMessage: type: string - title: disk_snapshot_name - description: |- - Reserved for a future implementation that materialises an intermediate DiskSnapshot row - for the cloned boot disk. Today the server uses an internal storage path that bypasses - the public DiskSnapshot model, so this field is always empty. Kept on the wire so a later - implementation can populate it without a proto change. - operation: - title: operation - description: When async provisioning is configured, the long-running operation. Empty in sync mode. - $ref: '#/components/schemas/aes.ops.v1.Operation' - title: CreateVirtualMachineFromBackupResponse - additionalProperties: false - aes.compute.v1.CreateVirtualMachineRequest: - type: object - properties: - manifest: - title: manifest - $ref: '#/components/schemas/aes.compute.v1.VirtualMachineManifest' - title: CreateVirtualMachineRequest + title: error_message + gpuModel: + type: string + title: gpu_model + gpuCount: + type: integer + title: gpu_count + format: int32 + networkName: + type: string + title: network_name + privateOnly: + type: boolean + title: private_only + title: VmSnapshot additionalProperties: false description: |- - CreateVirtualMachineRequest wraps the declarative manifest — the manifest IS the request body. - Internal control fields (clone source) never appear here: CloneVirtualMachine builds the create - input in-process rather than through this message. - aes.compute.v1.CreateVirtualMachineResponse: + MachineImage is a registered URL pointing at a streamable raw disk image. Resource name: + `projects/{project}/images/{image_id}`. Day-1 images are external URLs (S3/GCS/operator + HTTP); a managed upload endpoint is a future story. + VmSnapshot is a point-in-time copy of a VM (definition + every disk). State machine: + CREATING → READY → DELETING → DELETED. Survives source VM deletion (the snapshot row is + independent). + aes.compute.v1.VmSnapshot.AnnotationsEntry: type: object - properties: - operation: - title: operation - description: 'Set when provisioning is async: poll GetOperation until SUCCEEDED; metadata may include virtual_machine_name.' - $ref: '#/components/schemas/aes.ops.v1.Operation' - virtualMachine: - title: virtual_machine - description: Set only for the synchronous create path. - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - title: CreateVirtualMachineResponse + properties: + key: + type: string + title: key + value: + type: string + title: value + title: AnnotationsEntry additionalProperties: false - aes.compute.v1.DeleteSSHKeyRequest: + aes.compute.v1.VmSnapshot.LabelsEntry: type: object properties: - name: + key: type: string - title: name - title: DeleteSSHKeyRequest + title: key + value: + type: string + title: value + title: LabelsEntry additionalProperties: false - aes.compute.v1.DeleteSSHKeyResponse: + aes.health.v1.CheckRequest: type: object - title: DeleteSSHKeyResponse + title: CheckRequest additionalProperties: false - aes.compute.v1.DeleteVirtualMachineRequest: + aes.health.v1.CheckResponse: type: object properties: - name: + status: type: string - title: name - description: Resource name, e.g. `virtual-machines/{id}`. - etag: + title: status + version: type: string - title: etag - description: |- - Optimistic concurrency. Empty = unconditional delete; non-empty = require match against - current row's etag, else Aborted. - deleteAttachedDisks: - type: boolean - title: delete_attached_disks + title: version description: |- - When true, also delete the disks currently attached to this VM (boot + data) instead of - detaching them back to AVAILABLE. Disk-first default is false — disks outlive the VM so a - customer can rebuild onto the same boot disk. Set true to fully tear down the VM and - reclaim its storage in one action. Irreversible: the disk data is destroyed. - title: DeleteVirtualMachineRequest + Server build version (e.g. "0.0.1-rc235"). Empty when the binary was built without + ldflags injection — defaults to "dev" in that case. SPA renders it in the footer so + operators can confirm which backend tag is running. + title: CheckResponse additionalProperties: false - aes.compute.v1.DeleteVirtualMachineResponse: + aes.iam.v1.AcceptInviteRequest: type: object properties: - operation: - title: operation - description: 'Set when delete is async: poll GetOperation until SUCCEEDED.' - $ref: '#/components/schemas/aes.ops.v1.Operation' - title: DeleteVirtualMachineResponse + acceptToken: + type: string + title: accept_token + title: AcceptInviteRequest additionalProperties: false - aes.compute.v1.DeleteVmSnapshotRequest: + aes.iam.v1.AcceptInviteResponse: type: object properties: - name: + organizationName: type: string - title: name - title: DeleteVmSnapshotRequest + title: organization_name + principal: + type: string + title: principal + apiKey: + title: api_key + $ref: '#/components/schemas/aes.iam.v1.ApiKey' + secret: + type: string + title: secret + needsCredentials: + type: boolean + title: needs_credentials + description: |- + True when the accepted user has no password set AND no linked OIDC identity, meaning + the only way back into the account today is the now-consumed invite token. The SPA + forces a credential-setup step (SetInitialPassword or LinkOidcProvider) before sending + the user to the dashboard. Existing users get false here. + title: AcceptInviteResponse additionalProperties: false - aes.compute.v1.DeleteVmSnapshotResponse: + aes.iam.v1.AcceptMyInviteRequest: type: object - title: DeleteVmSnapshotResponse + properties: + inviteId: + type: string + title: invite_id + title: AcceptMyInviteRequest additionalProperties: false - aes.compute.v1.GPUSpec: + aes.iam.v1.AcceptMyInviteResponse: type: object properties: - model: + organizationName: type: string - title: model - description: GPU model published in the chosen DC (e.g. "rtx4090") - count: - type: integer - title: count - format: int32 - description: whole GPUs to attach (≥1) - title: GPUSpec + title: organization_name + title: AcceptMyInviteResponse additionalProperties: false - aes.compute.v1.GetVMMetricsRequest: + aes.iam.v1.ApiKey: type: object properties: name: type: string title: name - startTimeUnix: + description: |- + Resource name `api-keys/` (AIP-122 canonical form). The slug after the prefix + is the SHA-256 hex of the key — use this with RevokeApiKey. + principal: + type: string + title: principal + description: Owner principal (always the caller for keys minted via IamService). + defaultProject: + type: string + title: default_project + description: Default project the key authorises requests against when no explicit project is given. + displayName: + type: string + title: display_name + description: Caller-supplied label for UX (e.g. "ci-bot-prod"). Not validated for uniqueness. + keyPrefix: + type: string + title: key_prefix + description: |- + First few characters of the secret — convenient for matching when revoking. Never the full + secret. + createTimeUnix: type: - integer - string - title: start_time_unix + title: create_time_unix format: int64 - description: Unix seconds; required. Bounds the metrics window. - endTimeUnix: + expiresAtUnix: type: - integer - string - title: end_time_unix + title: expires_at_unix format: int64 - stepSeconds: - type: integer - title: step_seconds - format: int32 - description: Step in seconds. Default 60. Max 3600 (1h). Smaller = denser series. - title: GetVMMetricsRequest + description: 0 when the key never expires. + revokedAtUnix: + type: + - integer + - string + title: revoked_at_unix + format: int64 + description: 0 when the key is still active. + scopeProject: + type: string + title: scope_project + description: |- + When non-empty, the key is HARD-SCOPED to this project. Requests targeting other projects + (or org-level resources) are rejected with PermissionDenied regardless of the principal's + bindings. Use this for least-privilege keys (CI bots, app integrations). Empty means the + key inherits the full set of the principal's bindings — `default_project` above is just a + UX fallback, not a scope. + title: ApiKey additionalProperties: false - aes.compute.v1.GetVMMetricsResponse: + description: |- + ApiKey describes a key without exposing the secret. Used in ListApiKeys and as the metadata + half of CreateApiKey's response (the secret half is on CreateApiKeyResponse.secret). + aes.iam.v1.AutomationCredential: type: object properties: - series: + name: + type: string + title: name + principal: + type: string + title: principal + projectName: + type: string + title: project_name + displayName: + type: string + title: display_name + permissions: type: array items: - $ref: '#/components/schemas/aes.compute.v1.MetricSeries' - title: series - title: GetVMMetricsResponse + type: string + title: permissions + kind: + type: string + title: kind + createTimeUnix: + type: + - integer + - string + title: create_time_unix + format: int64 + expiresAtUnix: + type: + - integer + - string + title: expires_at_unix + format: int64 + revokedAtUnix: + type: + - integer + - string + title: revoked_at_unix + format: int64 + lastUsedAtUnix: + type: + - integer + - string + title: last_used_at_unix + format: int64 + rotatedAtUnix: + type: + - integer + - string + title: rotated_at_unix + format: int64 + title: AutomationCredential additionalProperties: false - aes.compute.v1.GetVirtualMachineRequest: + aes.iam.v1.BeginGitHubSetupRequest: + type: object + properties: + projectName: + type: string + title: project_name + id: + type: string + title: id + pairingCode: + type: string + title: pairing_code + description: Browser-generated 32-byte random base64url pairing code; stored only hashed. + title: BeginGitHubSetupRequest + additionalProperties: false + aes.iam.v1.BeginGitHubSetupResponse: + type: object + properties: + setup: + title: setup + $ref: '#/components/schemas/aes.iam.v1.GitHubSetup' + title: BeginGitHubSetupResponse + additionalProperties: false + aes.iam.v1.Capability: + type: object + properties: + name: + type: string + title: name + displayName: + type: string + title: display_name + description: + type: string + title: description + title: Capability + additionalProperties: false + aes.iam.v1.ChangePasswordRequest: + type: object + properties: + currentPassword: + type: string + title: current_password + newPassword: + type: string + title: new_password + title: ChangePasswordRequest + additionalProperties: false + aes.iam.v1.ChangePasswordResponse: + type: object + title: ChangePasswordResponse + additionalProperties: false + aes.iam.v1.CheckPermissionRequest: type: object properties: - name: + principal: type: string - title: name - title: GetVirtualMachineRequest + title: principal + description: When empty, uses the authenticated principal from the request context (requires API key auth). + permission: + type: string + title: permission + description: Permission id, e.g. admin.platform or admin.catalog.read. + resourceName: + type: string + title: resource_name + description: Resource scope for bindings, e.g. //metalhost/platform. Empty defaults to //metalhost/platform. + title: CheckPermissionRequest additionalProperties: false - aes.compute.v1.GetVirtualMachineResponse: + aes.iam.v1.CheckPermissionResponse: type: object properties: - virtualMachine: - title: virtual_machine - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - title: GetVirtualMachineResponse + allowed: + type: boolean + title: allowed + title: CheckPermissionResponse additionalProperties: false - aes.compute.v1.GetVmSnapshotRequest: + aes.iam.v1.CompleteOidcLoginRequest: type: object properties: - name: + providerName: type: string - title: name - title: GetVmSnapshotRequest + title: provider_name + code: + type: string + title: code + description: Authorization code from the IdP redirect. + state: + type: string + title: state + description: Echo of the state we issued in StartOidcLogin. + redirectUri: + type: string + title: redirect_uri + title: CompleteOidcLoginRequest additionalProperties: false - aes.compute.v1.GetVmSnapshotResponse: + aes.iam.v1.CompleteOidcLoginResponse: type: object properties: - snapshot: - title: snapshot - $ref: '#/components/schemas/aes.compute.v1.VmSnapshot' - title: GetVmSnapshotResponse + principal: + type: string + title: principal + description: Set when MFA enforcement is NOT engaged for this principal — single-leg OIDC path. + apiKey: + title: api_key + $ref: '#/components/schemas/aes.iam.v1.ApiKey' + secret: + type: string + title: secret + mfaChallengeToken: + type: string + title: mfa_challenge_token + description: |- + P0-4: same semantics as LoginResponse.mfa_challenge_token — when set, api_key + secret are + empty and the caller must finish via SubmitMFAChallenge. + title: CompleteOidcLoginResponse additionalProperties: false - aes.compute.v1.ListSSHKeysRequest: + aes.iam.v1.CreateApiKeyRequest: type: object properties: - projectName: + displayName: type: string - title: project_name - description: Full resource name `projects/{slug}`. Slug-only is also accepted. - pageSize: - type: integer - title: page_size - format: int32 - pageToken: + title: display_name + description: Optional label, e.g. "laptop" or "ci-bot". Echoed back; not validated for uniqueness. + defaultProject: type: string - title: page_token - title: ListSSHKeysRequest + title: default_project + description: |- + Project the key targets when no explicit project is supplied on a request. Empty falls + back to the caller's existing default_project. The caller must have access to this project. + projectScoped: + type: boolean + title: project_scoped + description: |- + When true, the key is hard-scoped to `default_project` — every request authenticated by + this key is rejected with PermissionDenied unless it targets that project. Cross-project + and org-level access are blocked even for principals that hold admin.organization or + admin.platform. Use this for CI bots / app integrations that should never reach beyond + their tenant project. The resulting key's `ApiKey.scope_project` field is set to the same + value as `default_project`. Default false (key inherits the principal's full bindings). + title: CreateApiKeyRequest additionalProperties: false - aes.compute.v1.ListSSHKeysResponse: + aes.iam.v1.CreateApiKeyResponse: type: object properties: - sshKeys: - type: array - items: - $ref: '#/components/schemas/aes.compute.v1.SSHKey' - title: ssh_keys - nextPageToken: + apiKey: + title: api_key + $ref: '#/components/schemas/aes.iam.v1.ApiKey' + secret: type: string - title: next_page_token - title: ListSSHKeysResponse + title: secret + description: |- + The plaintext secret. Returned ONCE — store it immediately. Subsequent ListApiKeys calls + expose only metadata. + title: CreateApiKeyResponse additionalProperties: false - aes.compute.v1.ListVMUtilizationRequest: + aes.iam.v1.CreateCredentialRequest: type: object properties: projectName: type: string title: project_name - title: ListVMUtilizationRequest - additionalProperties: false - aes.compute.v1.ListVMUtilizationResponse: - type: object - properties: - vms: + serviceAccount: + type: string + title: service_account + description: Empty issues a personal credential; service accounts require project admin. + displayName: + type: string + title: display_name + permissions: type: array items: - $ref: '#/components/schemas/aes.compute.v1.VMUtilization' - title: vms - available: - type: boolean - title: available - description: |- - false when utilization telemetry is temporarily unavailable for the project's region — - render shapes without bars rather than zeros. - polledAtUnix: + type: string + title: permissions + expiresAtUnix: type: - integer - string - title: polled_at_unix + title: expires_at_unix format: int64 - title: ListVMUtilizationResponse + description: Zero selects 90 days; otherwise between 15 minutes and one year from now. + requestId: + type: string + title: request_id + title: CreateCredentialRequest additionalProperties: false - aes.compute.v1.ListVirtualMachinesRequest: + aes.iam.v1.CreateCredentialResponse: type: object properties: - projectName: + credential: + title: credential + $ref: '#/components/schemas/aes.iam.v1.AutomationCredential' + secret: type: string - title: project_name - pageSize: - type: integer - title: page_size - format: int32 - pageToken: + title: secret + description: Returned once, never persisted in plaintext. + secretUnavailable: + type: boolean + title: secret_unavailable + description: A repeated request returns current metadata, never the original secret. + title: CreateCredentialResponse + additionalProperties: false + aes.iam.v1.CreateGitHubTrustRequest: + type: object + properties: + trust: + title: trust + $ref: '#/components/schemas/aes.iam.v1.GitHubTrust' + setupId: type: string - title: page_token - title: ListVirtualMachinesRequest + title: setup_id + description: Optional verified workflow discovery; confirmation is retry-safe by setup ID. + requestId: + type: string + title: request_id + description: Optional for older callers; supply a stable UUID for direct-create recovery. + title: CreateGitHubTrustRequest additionalProperties: false - aes.compute.v1.ListVirtualMachinesResponse: + aes.iam.v1.CreateGitHubTrustResponse: type: object properties: - virtualMachines: + trust: + title: trust + $ref: '#/components/schemas/aes.iam.v1.GitHubTrust' + title: CreateGitHubTrustResponse + additionalProperties: false + aes.iam.v1.CreateServiceAccountRequest: + type: object + properties: + projectName: + type: string + title: project_name + displayName: + type: string + title: display_name + permissions: type: array items: - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - title: virtual_machines - nextPageToken: + type: string + title: permissions + requestId: type: string - title: next_page_token - title: ListVirtualMachinesResponse + title: request_id + title: CreateServiceAccountRequest additionalProperties: false - aes.compute.v1.ListVmSnapshotsRequest: + aes.iam.v1.CreateServiceAccountResponse: type: object properties: - projectName: + serviceAccount: + title: service_account + $ref: '#/components/schemas/aes.iam.v1.ServiceAccount' + title: CreateServiceAccountResponse + additionalProperties: false + aes.iam.v1.CreateWorkspaceRequest: + type: object + properties: + slug: type: string - title: project_name - sourceVm: + title: slug + description: |- + Bare workspace slug the user typed (server normalizes: lowercase + trim). Becomes the org + resource name `organizations/`. Validated against DNS-1035 + reserved rules. + displayName: type: string - title: source_vm - description: 'Optional: filter to snapshots taken from this VM.' - pageSize: - type: integer - title: page_size - format: int32 - pageToken: + title: display_name + description: |- + Human-facing workspace name shown in the UI (org display_name). Falls back to the slug + when empty. + title: CreateWorkspaceRequest + additionalProperties: false + aes.iam.v1.CreateWorkspaceResponse: + type: object + properties: + organizationName: type: string - title: page_token - title: ListVmSnapshotsRequest + title: organization_name + description: The org resource name `organizations/` that was created. + title: CreateWorkspaceResponse additionalProperties: false - aes.compute.v1.ListVmSnapshotsResponse: + aes.iam.v1.DeclineMyInviteRequest: type: object properties: - vmSnapshots: - type: array - items: - $ref: '#/components/schemas/aes.compute.v1.VmSnapshot' - title: vm_snapshots - nextPageToken: + inviteId: type: string - title: next_page_token - title: ListVmSnapshotsResponse + title: invite_id + title: DeclineMyInviteRequest additionalProperties: false - aes.compute.v1.MetricSample: + aes.iam.v1.DeclineMyInviteResponse: + type: object + title: DeclineMyInviteResponse + additionalProperties: false + aes.iam.v1.DeleteGitHubTrustRequest: type: object properties: - timestampUnix: + name: + type: string + title: name + expectedVersion: type: - integer - string - title: timestamp_unix + title: expected_version format: int64 - value: - type: number - title: value - format: double - title: MetricSample + title: DeleteGitHubTrustRequest + additionalProperties: false + aes.iam.v1.DeleteGitHubTrustResponse: + type: object + title: DeleteGitHubTrustResponse + additionalProperties: false + aes.iam.v1.DeleteServiceAccountRequest: + type: object + properties: + name: + type: string + title: name + expectedVersion: + type: + - integer + - string + title: expected_version + format: int64 + title: DeleteServiceAccountRequest additionalProperties: false - aes.compute.v1.MetricSeries: + aes.iam.v1.DeleteServiceAccountResponse: + type: object + title: DeleteServiceAccountResponse + additionalProperties: false + aes.iam.v1.EnrollMFARequest: type: object properties: - metric: + displayName: type: string - title: metric + title: display_name + description: Optional — e.g. "iPhone 15". + title: EnrollMFARequest + additionalProperties: false + aes.iam.v1.EnrollMFAResponse: + type: object + properties: + device: + title: device + $ref: '#/components/schemas/aes.iam.v1.MFADevice' + secret: + type: string + title: secret description: |- - 'cpu_utilization_pct' | 'memory_used_bytes' | 'disk_read_bps' | 'disk_write_bps' | - 'net_rx_bps' | 'net_tx_bps'. - samples: - type: array - items: - $ref: '#/components/schemas/aes.compute.v1.MetricSample' - title: samples - title: MetricSeries + Cleartext shared secret. Returned exactly once, not stored anywhere the caller can read + again — they must enter it (or scan the QR) into their authenticator app NOW. + provisioningUri: + type: string + title: provisioning_uri + description: |- + Provisioning URI: `otpauth://totp/{Issuer}:{Account}?secret=...&issuer={Issuer}` — most + authenticator apps render this as a QR code. + title: EnrollMFAResponse additionalProperties: false - aes.compute.v1.OpenConsoleRequest: + aes.iam.v1.ExchangeGitHubTokenRequest: type: object properties: - name: + trustName: type: string - title: name - type: - title: type - description: Defaults to SERIAL when unset. - $ref: '#/components/schemas/aes.compute.v1.ConsoleType' - title: OpenConsoleRequest + title: trust_name + assertion: + type: string + title: assertion + title: ExchangeGitHubTokenRequest additionalProperties: false - aes.compute.v1.OpenConsoleResponse: + aes.iam.v1.ExchangeGitHubTokenResponse: type: object properties: - websocketPath: + accessToken: type: string - title: websocket_path - description: |- - Relative path the client opens via WebSocket on the Metalhost public endpoint - (e.g. wss://metalhost/v1/console/). The server validates the token and bridges to - the VM's console privately. - token: + title: access_token + tokenType: type: string - title: token - description: |- - One-shot token embedded in the websocket_path. Single-use, scoped to (vm, console_type), - expires at expires_at_unix. + title: token_type expiresAtUnix: type: - integer - string title: expires_at_unix format: int64 - title: OpenConsoleResponse + projectName: + type: string + title: project_name + permissions: + type: array + items: + type: string + title: permissions + title: ExchangeGitHubTokenResponse additionalProperties: false - aes.compute.v1.QuoteVirtualMachineResizeRequest: + aes.iam.v1.GetAuthMetadataRequest: type: object - properties: - name: - type: string - title: name - vcpus: - type: integer - title: vcpus - format: int32 - description: |- - Target shape, same semantics as ResizeVirtualMachineRequest. cpu_class cannot change - while a monthly term is active. - ramGib: - type: integer - title: ram_gib - format: int32 - title: QuoteVirtualMachineResizeRequest + title: GetAuthMetadataRequest additionalProperties: false - aes.compute.v1.QuoteVirtualMachineResizeResponse: + aes.iam.v1.GetAuthMetadataResponse: type: object properties: - reserved: + supportsApiKey: type: boolean - title: reserved - description: True when the VM is inside an active monthly term (resize = paid one-way upgrade). - dueNowMinor: - type: - - integer - - string - title: due_now_minor - format: int64 - description: Charged immediately when the resize is applied. Always 0 when reserved is false. - currency: + title: supports_api_key + oidcIssuerUrl: type: string - title: currency - termEndUnix: - type: - - integer - - string - title: term_end_unix - format: int64 - description: End of the current term the upgrade is prorated to. 0 when reserved is false. - title: QuoteVirtualMachineResizeResponse + title: oidc_issuer_url + description: OIDC issuer URL for interactive login (e.g. https://issuer.example.com). Empty if not configured. + oidcAudience: + type: string + title: oidc_audience + description: Optional audience for OIDC tokens when enforced at the gateway. + supportsOidc: + type: boolean + title: supports_oidc + description: True when an issuer is configured (discovery / token validation may still be gateway-only in Phase 0). + supportsRbac: + type: boolean + title: supports_rbac + description: True when CheckPermission is backed by role/permission policy. + title: GetAuthMetadataResponse additionalProperties: false - aes.compute.v1.ReimageVirtualMachineRequest: + aes.iam.v1.GetCallerIdentityRequest: + type: object + title: GetCallerIdentityRequest + additionalProperties: false + aes.iam.v1.GetCallerIdentityResponse: type: object properties: - name: + principal: type: string - title: name - bootImageUrl: + title: principal + description: The authenticated principal, e.g. "users/alice" or "serviceAccounts/bot". + defaultProject: type: string - title: boot_image_url - description: |- - Required: streamable raw disk image URL. Setting this is the canonical way to upgrade - the base OS (Ubuntu 24.04 → 26.04) without recreating the VM. Empty = reuse the original - boot source. - confirmationToken: + title: default_project + description: The default project attached to the bearer token, or empty. + scopeProject: type: string - title: confirmation_token + title: scope_project description: |- - Required confirmation token. Server returns the expected value on a first call and the - client echoes it back on the second to acknowledge data loss. Wire format: must equal - "REIMAGE/" + the VM name. Refusing this for headless flows is fine (operators set the - token directly), but UIs should round-trip it through a confirmation dialog. - title: ReimageVirtualMachineRequest + When non-empty, the bearer token is hard-scoped to this project — cross-project requests + are rejected by RequireProjectAccess. Empty means the token has no project scope (its + permissions are limited only by the principal's role bindings). + accessibleOrganizations: + type: array + items: + type: string + title: accessible_organizations + description: |- + Organizations the caller has a role binding against (any role). Useful for the + portal landing resolver: when this is non-empty but default_project is empty, the user + has access to ≥1 org but hasn't created/been-assigned a project yet — route them to + the onboarding wizard. Empty list means the user has no org access at all (orphan + account; very rare). + title: GetCallerIdentityResponse additionalProperties: false - aes.compute.v1.ReimageVirtualMachineResponse: + aes.iam.v1.GetGitHubSetupRequest: type: object properties: - virtualMachine: - title: virtual_machine - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - title: ReimageVirtualMachineResponse + id: + type: string + title: id + title: GetGitHubSetupRequest additionalProperties: false - aes.compute.v1.RenewVMNowRequest: + aes.iam.v1.GetGitHubSetupResponse: type: object properties: - name: - type: string - title: name - title: RenewVMNowRequest + setup: + title: setup + $ref: '#/components/schemas/aes.iam.v1.GitHubSetup' + title: GetGitHubSetupResponse additionalProperties: false - aes.compute.v1.RenewVMNowResponse: + aes.iam.v1.GetOrgMemberRequest: type: object properties: - virtualMachine: - title: virtual_machine - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - newTermId: + organizationName: type: string - title: new_term_id - description: The new vm_reservations row id, for traceability. - journalEntryId: + title: organization_name + description: organizations/ + principal: type: string - title: journal_entry_id - description: The wallet journal entry that recorded the prepayment. - chargedAmountMinor: - type: - - integer - - string - title: charged_amount_minor - format: int64 - title: RenewVMNowResponse + title: principal + description: users/ + title: GetOrgMemberRequest additionalProperties: false - aes.compute.v1.ResizeVirtualMachineRequest: + aes.iam.v1.GetOrgMemberResponse: + type: object + properties: + member: + title: member + $ref: '#/components/schemas/aes.iam.v1.OrgMember' + title: GetOrgMemberResponse + additionalProperties: false + aes.iam.v1.GetServiceAccountRequest: type: object properties: name: type: string title: name - vcpus: - type: integer - title: vcpus - format: int32 - description: |- - New configurator shape. All three required; the server rejects InvalidArgument if any is - unset (resize is not "patch one field" — it's a full re-shape so pricing + placement - recompute consistently). Same 1–16 GiB RAM-per-vCPU ratio bounds as Create. - ramGib: - type: integer - title: ram_gib - format: int32 - cpuClass: - type: string - title: cpu_class - description: |- - CPU class. Required — changing class is allowed but the datacenter must have capacity for - the new class or the VM won't restart. - title: ResizeVirtualMachineRequest + title: GetServiceAccountRequest additionalProperties: false - aes.compute.v1.ResizeVirtualMachineResponse: + aes.iam.v1.GetServiceAccountResponse: type: object properties: - virtualMachine: - title: virtual_machine - description: Set on the synchronous path. - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - operation: - title: operation - description: |- - Set when the resize runs as a long-running Operation. Client polls GetOperation until - SUCCEEDED, then re-Gets the VM to see the new shape. The operation runs the full - stop → reshape → start sequence with retries so a mid-flight failure doesn't strand - the VM in STOPPED with the old shape. - $ref: '#/components/schemas/aes.ops.v1.Operation' - title: ResizeVirtualMachineResponse + serviceAccount: + title: service_account + $ref: '#/components/schemas/aes.iam.v1.ServiceAccount' + title: GetServiceAccountResponse additionalProperties: false - aes.compute.v1.RestartVirtualMachineRequest: + aes.iam.v1.GetUserRequest: type: object properties: name: type: string title: name - title: RestartVirtualMachineRequest + description: Empty name means "the caller". Non-empty fetches a specific user (permission required). + title: GetUserRequest additionalProperties: false - aes.compute.v1.RestartVirtualMachineResponse: + aes.iam.v1.GetUserResponse: type: object properties: - virtualMachine: - title: virtual_machine - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - title: RestartVirtualMachineResponse + user: + title: user + $ref: '#/components/schemas/aes.iam.v1.User' + title: GetUserResponse additionalProperties: false - aes.compute.v1.SSHKey: + aes.iam.v1.GitHubSetup: + type: object + properties: + id: + type: string + title: id + projectName: + type: string + title: project_name + audience: + type: string + title: audience + expiresAtUnix: + type: + - integer + - string + title: expires_at_unix + format: int64 + state: + type: string + title: state + identity: + title: identity + $ref: '#/components/schemas/aes.iam.v1.GitHubTrust' + confirmedTrustName: + type: string + title: confirmed_trust_name + title: GitHubSetup + additionalProperties: false + aes.iam.v1.GitHubTrust: type: object properties: name: type: string title: name - description: Resource name `projects/{project}/ssh-keys/{slug}`. + projectName: + type: string + title: project_name + serviceAccount: + type: string + title: service_account displayName: type: string title: display_name - projectName: + repository: type: string - title: project_name - publicKey: + title: repository + repositoryId: type: string - title: public_key - description: |- - OpenSSH-format public key (one line: "ssh-ed25519 AAAA... user@host"). Validated for - syntax (algorithm + base64) on Create. - algorithm: + title: repository_id + repositoryOwnerId: type: string - title: algorithm - description: Algorithm extracted from public_key — "ssh-ed25519" / "ssh-rsa" / "ecdsa-sha2-nistp256". - fingerprint: + title: repository_owner_id + subject: type: string - title: fingerprint - description: SHA-256 fingerprint shown in the dashboard for visual identification ("SHA256:abc..."). - createTimeUnix: + title: subject + ref: + type: string + title: ref + environment: + type: string + title: environment + workflowRef: + type: string + title: workflow_ref + jobWorkflowRef: + type: string + title: job_workflow_ref + events: + type: array + items: + type: string + title: events + permissions: + type: array + items: + type: string + title: permissions + state: + type: string + title: state + version: type: - integer - string - title: create_time_unix + title: version format: int64 - updateTimeUnix: + createTimeUnix: type: - integer - string - title: update_time_unix + title: create_time_unix format: int64 - labels: - type: object - title: labels - additionalProperties: - type: string - title: value - annotations: - type: object - title: annotations - additionalProperties: - type: string - title: value - title: SSHKey + audience: + type: string + title: audience + title: GitHubTrust additionalProperties: false - aes.compute.v1.SSHKey.AnnotationsEntry: + aes.iam.v1.ImportGitHubSshKeysRequest: type: object properties: - key: + projectName: type: string - title: key - value: + title: project_name + description: Project under which to create the keys, e.g. "projects/acme-prod". + githubUsername: type: string - title: value - title: AnnotationsEntry + title: github_username + description: |- + GitHub login (not numeric id). Required — even when the caller is OIDC-linked to GitHub, + we don't currently persist the username and the client must pass it. If the caller wants + us to look it up from a linked OIDC identity, set `use_linked_identity=true` and leave + github_username empty. + useLinkedIdentity: + type: boolean + title: use_linked_identity + description: |- + When true, the server resolves the GitHub username from the caller's linked oidc_identities + row (provider_name='github'). Returns FailedPrecondition if no linked identity exists. + displayNamePrefix: + type: string + title: display_name_prefix + description: |- + Optional display-name prefix for created keys; defaults to "github--" when + empty. + title: ImportGitHubSshKeysRequest additionalProperties: false - aes.compute.v1.SSHKey.LabelsEntry: + description: |- + ImportGitHubSshKeys onboarding shortcut. Fetches https://github.com/.keys + (public endpoint, no auth) and bulk-creates SSHKey rows under the named project. Duplicates + (by fingerprint) are skipped; the response lists keys actually created. + aes.iam.v1.ImportGitHubSshKeysResponse: type: object properties: - key: + createdSshKeyNames: + type: array + items: + type: string + title: created_ssh_key_names + description: Newly-created SSHKey resource names (e.g. "projects/acme-prod/ssh-keys/"). + skippedExisting: + type: integer + title: skipped_existing + format: int32 + description: |- + Number of keys returned by GitHub that were skipped because the same fingerprint already + exists under the project (we never duplicate keys). + title: ImportGitHubSshKeysResponse + additionalProperties: false + aes.iam.v1.InviteOrgMemberRequest: + type: object + properties: + organizationName: type: string - title: key - value: + title: organization_name + description: Org the invite is for (`organizations/{slug}`). Caller must hold admin.organization on it. + email: type: string - title: value - title: LabelsEntry + title: email + description: Email of the invitee. Used to derive the principal slug at AcceptInvite time. + role: + type: string + title: role + description: |- + Role assigned at accept time. v1 ships only "viewer" / "editor" / "admin"; admin is + equivalent to admin.organization on the org. Other strings rejected. + displayName: + type: string + title: display_name + description: Optional human display name pre-fill (the invitee can override at accept). + title: InviteOrgMemberRequest additionalProperties: false - aes.compute.v1.SetVMAutorenewRequest: + aes.iam.v1.InviteOrgMemberResponse: type: object properties: - name: + acceptToken: type: string - title: name - autorenew: - type: boolean - title: autorenew - title: SetVMAutorenewRequest + title: accept_token + description: |- + Opaque token the invitee redeems via AcceptInvite. Bearer-only — anyone with the token + can accept. Operators forward via email out-of-band; expires in 7 days. + expiresAtUnix: + type: + - integer + - string + title: expires_at_unix + format: int64 + title: InviteOrgMemberResponse additionalProperties: false - aes.compute.v1.SetVMAutorenewResponse: + aes.iam.v1.LinkOidcProviderRequest: type: object properties: - virtualMachine: - title: virtual_machine - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - title: SetVMAutorenewResponse + providerName: + type: string + title: provider_name + description: OIDC provider to link (`oidc-providers/{slug}`). + redirectUri: + type: string + title: redirect_uri + description: Where the provider should redirect after the user authorizes. + title: LinkOidcProviderRequest additionalProperties: false - aes.compute.v1.SnapshotVirtualMachineRequest: + aes.iam.v1.LinkOidcProviderResponse: type: object properties: - vmName: + authorizeUrl: type: string - title: vm_name - description: |- - VM to snapshot (`virtual-machines/{id}`). Can be RUNNING or STOPPED — both are supported - (running snapshots are crash-consistent). - displayName: + title: authorize_url + state: type: string - title: display_name - labels: - type: object - title: labels - additionalProperties: - type: string - title: value - annotations: - type: object - title: annotations - additionalProperties: - type: string - title: value - title: SnapshotVirtualMachineRequest + title: state + title: LinkOidcProviderResponse + additionalProperties: false + aes.iam.v1.ListApiKeysRequest: + type: object + properties: + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + title: ListApiKeysRequest + additionalProperties: false + aes.iam.v1.ListApiKeysResponse: + type: object + properties: + apiKeys: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.ApiKey' + title: api_keys + nextPageToken: + type: string + title: next_page_token + title: ListApiKeysResponse + additionalProperties: false + aes.iam.v1.ListCapabilitiesRequest: + type: object + title: ListCapabilitiesRequest additionalProperties: false - aes.compute.v1.SnapshotVirtualMachineRequest.AnnotationsEntry: + aes.iam.v1.ListCapabilitiesResponse: type: object properties: - key: - type: string - title: key - value: - type: string - title: value - title: AnnotationsEntry + capabilities: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.Capability' + title: capabilities + title: ListCapabilitiesResponse additionalProperties: false - aes.compute.v1.SnapshotVirtualMachineRequest.LabelsEntry: + aes.iam.v1.ListCredentialsRequest: type: object properties: - key: + projectName: type: string - title: key - value: + title: project_name + serviceAccount: type: string - title: value - title: LabelsEntry + title: service_account + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + title: ListCredentialsRequest additionalProperties: false - aes.compute.v1.SnapshotVirtualMachineResponse: + aes.iam.v1.ListCredentialsResponse: type: object properties: - snapshot: - title: snapshot - $ref: '#/components/schemas/aes.compute.v1.VmSnapshot' - title: SnapshotVirtualMachineResponse + credentials: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.AutomationCredential' + title: credentials + nextPageToken: + type: string + title: next_page_token + title: ListCredentialsResponse additionalProperties: false - aes.compute.v1.StartVirtualMachineRequest: + aes.iam.v1.ListGitHubTrustsRequest: type: object properties: - name: + projectName: type: string - title: name - title: StartVirtualMachineRequest + title: project_name + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + title: ListGitHubTrustsRequest additionalProperties: false - aes.compute.v1.StartVirtualMachineResponse: + aes.iam.v1.ListGitHubTrustsResponse: type: object properties: - virtualMachine: - title: virtual_machine - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - operation: - title: operation - description: The operation tracking this request. Poll until terminal, then fetch the VM. - $ref: '#/components/schemas/aes.ops.v1.Operation' - title: StartVirtualMachineResponse + trusts: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.GitHubTrust' + title: trusts + nextPageToken: + type: string + title: next_page_token + title: ListGitHubTrustsResponse additionalProperties: false - aes.compute.v1.StopVirtualMachineRequest: + aes.iam.v1.ListMFADevicesRequest: type: object - properties: - name: - type: string - title: name - title: StopVirtualMachineRequest + title: ListMFADevicesRequest additionalProperties: false - aes.compute.v1.StopVirtualMachineResponse: + aes.iam.v1.ListMFADevicesResponse: type: object properties: - virtualMachine: - title: virtual_machine - $ref: '#/components/schemas/aes.compute.v1.VirtualMachine' - operation: - title: operation - description: The operation tracking this request. Poll until terminal, then fetch the VM. - $ref: '#/components/schemas/aes.ops.v1.Operation' - title: StopVirtualMachineResponse + mfaDevices: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.MFADevice' + title: mfa_devices + title: ListMFADevicesResponse additionalProperties: false - aes.compute.v1.UserSpec: + aes.iam.v1.ListMyInvitesRequest: + type: object + title: ListMyInvitesRequest + additionalProperties: false + aes.iam.v1.ListMyInvitesResponse: type: object properties: - name: - type: string - title: name - description: Login name. `^[a-z_][a-z0-9_-]{0,31}$`, and not `root`. Required. - password: - type: string - title: password - description: |- - Optional plaintext password. Sent over TLS, hashed server-side ($6$ SHA-512 crypt) into the - cloud-init seed. NEVER persisted plaintext and never echoed back on Get/List. When any user - has a password, cloud-init `ssh_pwauth` is enabled; otherwise it stays disabled. - sudo: - type: boolean - title: sudo - description: |- - Grant passwordless sudo (ALL=(ALL) NOPASSWD:ALL). When false, a user with a password - receives password-authenticated sudo; a key-only user receives no sudo access. - sshKeys: + invites: type: array items: - type: string - title: ssh_keys - description: |- - Registered SSHKey resource refs (`projects/{p}/ssh-keys/{id}`), merged into this user's - ssh_authorized_keys. - sshPubkey: - type: string - title: ssh_pubkey - description: Inline OpenSSH public key(s), newline-separated. Merged after ssh_keys. - title: UserSpec + $ref: '#/components/schemas/aes.iam.v1.MyInvite' + title: invites + title: ListMyInvitesResponse additionalProperties: false - aes.compute.v1.VMBillingSpec: + aes.iam.v1.ListMyOrganizationsRequest: + type: object + title: ListMyOrganizationsRequest + additionalProperties: false + description: ── Self-service multi-org messages ──────────────────────────────────────────────────────── + aes.iam.v1.ListMyOrganizationsResponse: type: object properties: - mode: - title: mode - description: HOURLY (default) = per-hour usage. MONTHLY_* prepays the full term upfront at the tier discount. - $ref: '#/components/schemas/aes.compute.v1.BillingMode' - autorenew: - type: boolean - title: autorenew - description: 'For MONTHLY_*: auto-renew at term end. Ignored when HOURLY.' - title: VMBillingSpec + organizations: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.OrgMembership' + title: organizations + title: ListMyOrganizationsResponse additionalProperties: false - aes.compute.v1.VMBootSpec: + aes.iam.v1.ListNotificationsRequest: type: object properties: - image: - type: string - title: image - description: |- - Curated catalog image id (e.g. "ubuntu-24-04") — resolved server-side to an image URL + - the distro's default login user. Mutually exclusive with image_url/disk_name. - imageUrl: + organizationName: type: string - title: image_url - description: |- - Raw streamable image URL — escape hatch for non-catalog images. Mutually exclusive with - image/disk_name. - diskGib: + title: organization_name + description: organizations/. When empty, defaults to the caller's primary org. + pageSize: type: integer - title: disk_gib + title: page_size format: int32 - description: Boot disk size GiB (1..1024). Required when image/image_url is set. - diskName: + pageToken: type: string - title: disk_name + title: page_token + unreadOnly: + type: boolean + title: unread_only description: |- - Bind a pre-existing Disk as boot instead of importing an image (`projects/{p}/disks/{id}`). - The disk must be AVAILABLE, same project+DC, unattached. Mutually exclusive with image/image_url. - title: VMBootSpec + When true, only return unread notifications. Otherwise all notifications in the 30-day + window are returned with their read state. + title: ListNotificationsRequest additionalProperties: false - aes.compute.v1.VMComputeSpec: + description: |- + ListNotifications: customer-notable subset of the org audit feed (see ActivityEvent + .notify_in_app). Joined to notification_reads so the response includes read state per row. + Server enforces a 30-day window. + aes.iam.v1.ListNotificationsResponse: type: object properties: - cpuClass: + notifications: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.Notification' + title: notifications + nextPageToken: type: string - title: cpu_class - description: CPU class — must have published pricing and capacity in the datacenter. Required. - vcpus: - type: integer - title: vcpus - format: int32 - description: required, validated against the RAM-per-vCPU ratio bounds - ramGib: + title: next_page_token + unreadCount: type: integer - title: ram_gib + title: unread_count format: int32 - description: required - gpu: - title: gpu - description: Optional whole-GPU passthrough. Omit for a CPU-only VM. - $ref: '#/components/schemas/aes.compute.v1.GPUSpec' - title: VMComputeSpec + description: Total unread count across the 30-day window — drives the bell-icon badge. + title: ListNotificationsResponse additionalProperties: false - aes.compute.v1.VMNetworkSpec: + aes.iam.v1.ListOrgMembersRequest: type: object properties: - network: + organizationName: type: string - title: network - description: |- - Tenant network `projects/{p}/networks/{id}`. Empty → the project's default network - (auto-created lazily on first VM in the project + DC). - publicIpv4: - type: boolean - title: public_ipv4 - description: |- - Allocate a public IPv4 for the VM's public NIC (the scarce, billed extra). IPv6 comes - free on the public NIC regardless (see VirtualMachine.public_ipv6) unless private_only. - Default false. - securityGroups: - type: array - items: - type: string - title: security_groups - description: |- - Internal security groups to attach to the VM's private NIC at create - (`organizations/{org}/projects/{p}/securityGroups/{id}`). Empty = open within the VPC. - privateOnly: - type: boolean - title: private_only - description: |- - private_only attaches NO public NIC at all — no public IPv4, no public IPv6, no inbound - internet surface. The VM still has outbound internet via the private NIC's NAT. Default - false: every VM gets a public NIC with a free IPv6 GUA. Use for air-gapped-ish workloads. - title: VMNetworkSpec + title: organization_name + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + title: ListOrgMembersRequest + additionalProperties: false + aes.iam.v1.ListOrgMembersResponse: + type: object + properties: + orgMembers: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.OrgMember' + title: org_members + nextPageToken: + type: string + title: next_page_token + title: ListOrgMembersResponse additionalProperties: false - aes.compute.v1.VMUtilization: + aes.iam.v1.ListPendingInvitesRequest: type: object properties: - virtualMachineName: + organizationName: type: string - title: virtual_machine_name - cpuPct: - type: number - title: cpu_pct - format: double - description: 0-100, normalized to the VM's vCPU count. - memPct: - type: number - title: mem_pct - format: double - description: 0-100 of guest-visible memory in use. - gpuPct: - type: number - title: gpu_pct - format: double - description: |- - 0-100 averaged across the VM's GPUs. 0 for CPU-only VMs or when GPU telemetry - isn't reporting. - idleDays: + title: organization_name + pageSize: type: integer - title: idle_days + title: page_size format: int32 - description: |- - Consecutive days the VM has stayed under the idle threshold (CPU and, when present, - GPU averaging below 10%). 0 = active. Stopping idle workloads is the dashboard's - first cost-hygiene suggestion. - title: VMUtilization + pageToken: + type: string + title: page_token + title: ListPendingInvitesRequest additionalProperties: false - aes.compute.v1.VirtualMachine: + aes.iam.v1.ListPendingInvitesResponse: type: object properties: - name: + invites: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.PendingInvite' + title: invites + nextPageToken: type: string - title: name + title: next_page_token + title: ListPendingInvitesResponse + additionalProperties: false + aes.iam.v1.ListServiceAccountsRequest: + type: object + properties: projectName: type: string title: project_name - datacenterName: - type: string - title: datacenter_name - state: - type: string - title: state - description: |- - Current lifecycle state — PROVISIONING / BOOTING / RUNNING / RESTARTING / STOPPING / - STOPPED / STOPPED_FOR_NONPAYMENT / STOPPED_FOR_SUSPENSION / FAILED / ORPHANED / DELETING / - DELETED. STOPPED_FOR_SUSPENSION means an admin suspended the owning organization; the VM's - disks are preserved and it returns to STOPPED when the org is reinstated. Updated after - the corresponding lifecycle RPC succeeds. A VM that can no longer be found on its host - surfaces as ORPHANED (and is restored automatically if it reappears); reads may reflect - that transition. - createTimeUnix: - type: - - integer - - string - title: create_time_unix - format: int64 - labels: - type: object - title: labels - additionalProperties: - type: string - title: value - description: User-facing labels (filterable, indexed externally). Merged on Update unless clear_labels. - annotations: - type: object - title: annotations - additionalProperties: - type: string - title: value - description: Operator notes / non-indexed metadata. Same merge-by-default semantics as labels. - etag: - type: string - title: etag - description: |- - ETag for optimistic concurrency. Server generates from the row's version + update_time; - every mutation that takes an etag refuses to apply when the supplied etag doesn't match - the current row, returning Aborted. Treat as opaque on the client side. - updateTimeUnix: - type: - - integer - - string - title: update_time_unix - format: int64 - description: Last-modified time, mirrors the underlying row's update_time. Useful for sorting + UI. - billingMode: - title: billing_mode - description: Current billing mode. HOURLY = per-hour usage; MONTHLY_* = prepaid term. - $ref: '#/components/schemas/aes.compute.v1.BillingMode' - commitmentEndAtUnix: - type: - - integer - - string - title: commitment_end_at_unix - format: int64 - description: |- - For MONTHLY_*: when the prepaid term ends. After this passes the renewal worker either - re-charges (autorenew=true) or flips the row back to HOURLY. Zero when billing_mode is - HOURLY. - autorenew: - type: boolean - title: autorenew - description: |- - For MONTHLY_*: whether the renewal worker should auto-charge for the next term when - this one ends. Customer toggles via SetVMAutorenew. Ignored when billing_mode is HOURLY. - privateIpv4: - type: string - title: private_ipv4 - description: |- - ────────────── Runtime-derived fields (populated live at Get/List time) ────────────── - These are NOT stored; Get/List handlers read them from the datacenter so the API surface - matches reality (private IP, host node, disk size, boot image, detailed status). Empty when - the VM has been deleted or is unreachable — `state` then reads `DELETED`/`UNKNOWN`. - - Tenant-private IPv4 from the project's network. Pinned across stop/start. Routable only - inside the tenant network (cross-network requires explicit peering); for outbound internet - egress the VM uses its public NIC when one is allocated. - hostNode: - type: string - title: host_node - description: |- - Host the VM runs on (e.g. "worker-01"). Useful for capacity reports and migration - affinity hints. - statusDetail: + pageSize: + type: integer + title: page_size + format: int32 + pageToken: type: string - title: status_detail - description: |- - Finer-grained status than `state`. Values: "Running", "Starting", "Stopping", "Stopped", - "Provisioning", "ErrImagePull", "Unknown", and others. Use for UI surfacing of transient - phases that don't map cleanly to `state`. - hostname: + title: page_token + title: ListServiceAccountsRequest + additionalProperties: false + aes.iam.v1.ListServiceAccountsResponse: + type: object + properties: + serviceAccounts: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.ServiceAccount' + title: service_accounts + nextPageToken: type: string - title: hostname - description: |- - User-facing hostname (DNS-1123 label, ≤63 chars). Injected as the guest's cloud-init - hostname. Customer chooses; defaults to the resource id if omitted at create time. - networkName: + title: next_page_token + title: ListServiceAccountsResponse + additionalProperties: false + aes.iam.v1.ListSessionsRequest: + type: object + title: ListSessionsRequest + additionalProperties: false + aes.iam.v1.ListSessionsResponse: + type: object + properties: + sessions: + type: array + items: + $ref: '#/components/schemas/aes.iam.v1.Session' + title: sessions + title: ListSessionsResponse + additionalProperties: false + aes.iam.v1.LoginRequest: + type: object + properties: + email: type: string - title: network_name - description: |- - Tenant network the VM is attached to (`projects/{p}/networks/{id}`). Each VM has exactly - one network, which provides the VM's single NIC and IPv6 address. VMs in the same network - can talk freely; cross-network requires explicit peering. - publicIpv4: + title: email + password: type: string - title: public_ipv4 - description: |- - Public IPv4 address allocated to this VM for the public NIC workflow. Empty when the VM - was created without `assign_public_ipv4=true`. When set, this is the same value as the - PublicIp resource's ip_address. - publicIpv6: + title: password + title: LoginRequest + additionalProperties: false + aes.iam.v1.LoginResponse: + type: object + properties: + principal: type: string - title: public_ipv6 - description: |- - Public IPv6 address on the same public NIC as public_ipv4. Included automatically with - the public IP in IPv6-enabled datacenters — no extra request flag and no extra charge. - Statically configured and pinned for the VM's lifetime. Empty when the VM has no public - IP or the datacenter doesn't offer IPv6 yet. - publicIpv6Prefix: + title: principal + description: Set when MFA enforcement is NOT engaged for this principal — single-leg login path. + apiKey: + title: api_key + $ref: '#/components/schemas/aes.iam.v1.ApiKey' + secret: type: string - title: public_ipv6_prefix - description: |- - Routed IPv6 /64 (CIDR form) dedicated to this VM, included free with the public NIC in - supported datacenters. The whole prefix routes to the VM: the first address - (::1) is preconfigured in the guest; bind any others directly. Pinned for the - VM's lifetime. Empty when the datacenter doesn't offer routed prefixes yet. - bootDisk: + title: secret + mfaChallengeToken: type: string - title: boot_disk - description: |- - The Disk resource bound as the VM's boot device (`projects/{p}/disks/{id}`). Set on every - persistent VM (ephemeral lab VMs leave it empty). The disk has its own - lifecycle: DeleteVirtualMachine detaches it but does not delete it, so a customer can bind - the same boot_disk to a fresh VM and keep their data. Use GetDisk for size + source URL. - vcpus: - type: integer - title: vcpus - format: int32 + title: mfa_challenge_token description: |- - Configurator shape — the (vcpus, ram_gib, cpu_class) the VM was created with. Drives the - per-component hourly usage events. - ramGib: - type: integer - title: ram_gib - format: int32 - cpuClass: + P0-4: when the principal's org has require_mfa=TRUE AND the principal has at least one + ACTIVE mfa_credentials row, the server returns ONLY this challenge token (api_key + secret + empty) and the SPA/CLI must call SubmitMFAChallenge with the token + TOTP code (or + recovery_code) to finish the login. 5-minute TTL, single-use, max 5 wrong attempts. + title: LoginResponse + additionalProperties: false + aes.iam.v1.LogoutRequest: + type: object + title: LogoutRequest + additionalProperties: false + aes.iam.v1.LogoutResponse: + type: object + title: LogoutResponse + additionalProperties: false + aes.iam.v1.MFADevice: + type: object + properties: + name: type: string - title: cpu_class - gpuModel: + title: name + description: Resource name `mfa-devices/`. + displayName: type: string - title: gpu_model - description: |- - Whole-GPU passthrough attached to the VM. gpu_model is the SKU variant (e.g. "rtx4090"); - gpu_count is how many physical cards. Empty / 0 for a CPU-only VM. Drives the - compute.gpu..runtime_hours meter. - gpuCount: - type: integer - title: gpu_count - format: int32 - currentCostPerHourMinorDecimal: + title: display_name + type: type: string - title: current_cost_per_hour_minor_decimal - description: |- - ────────────── Live cost fields (computed at Get-time, not persisted) ────────────── - current_cost_per_hour_minor_decimal: the hourly rate this VM would accrue in HOURLY mode - at current rates, including boot disk + any public IP. NUMERIC text so sub-cent precision - (e.g. "0.342465" for a 1-vCPU cascadelake VM) survives the wire. Zero string ("0") when - the VM is in a state that doesn't bill (DELETED, etc.) or rates aren't seeded. - - Why decimal: a small VM's hourly rate is fractional cents — rounding to int64 hides the - truth and customers see "$0/hr". The portal displays the decimal value to 4-6 places. - - mtd_spend_minor_decimal: month-to-date wallet debits attributed to this VM. Reflects what - the customer has actually paid for this VM since start-of-month UTC. Sub-cent residue not - yet charged is NOT counted. - mtdSpendMinorDecimal: + title: type + description: '"totp" — only TOTP in v1.' + state: type: string - title: mtd_spend_minor_decimal - linuxUsername: + title: state + description: PENDING | ACTIVE + secretPrefix: type: string - title: linux_username - description: |- - Linux login user cloud-init created for SSH access (`ssh @`). - Set from CreateVirtualMachineRequest.linux_username. Empty on VMs created with a raw - user_data cloud-config (the customer's YAML owns user creation) or on pre-feature rows. - securityGroups: - type: array - items: - type: string - title: security_groups - description: |- - Internal security groups attached to this VM's private NIC - (`organizations/{org}/projects/{p}/securityGroups/{id}`). Empty = the VM is open to the - rest of the VPC (default). Editable post-create via Add/RemoveVmFromSecurityGroup. - datacenterReachable: - type: boolean - title: datacenter_reachable - description: |- - Whether this VM's datacenter is currently reachable from the control plane. Computed live at - Get/List time (not stored). When false, the datacenter is temporarily offline: `state` and the - other runtime-derived fields above are LAST-KNOWN (as of the last successful sync, not live), - and lifecycle actions are paused until it reconnects. Defaults true. - datacenterUnreachableSinceUnix: + title: secret_prefix + description: First 6 chars of the secret, for the user to identify devices. + enrolledAtUnix: type: - integer - string - title: datacenter_unreachable_since_unix + title: enrolled_at_unix format: int64 - description: |- - Unix seconds the VM's datacenter became unreachable (0 when reachable). Lets the UI show how - long the outage has lasted ("offline 3m"). - createdBy: - type: string - title: created_by - description: Principal that created the VM (e.g. `users/jane`). '' for legacy rows / system-created. - renewalCostPerHourMinorDecimal: - type: string - title: renewal_cost_per_hour_minor_decimal - description: |- - For a VM inside a monthly term: the full-shape hourly rate at current prices — what the - next renewal (or the fallback to hourly billing at term end) will effectively cost. - current_cost_per_hour_minor_decimal reads "0" during the term (the shape is prepaid); - this field lets burn-rate and balance projections still account for the commitment. - Empty for hourly-billed VMs. - title: VirtualMachine + lastUsedAtUnix: + type: + - integer + - string + title: last_used_at_unix + format: int64 + title: MFADevice additionalProperties: false - aes.compute.v1.VirtualMachine.AnnotationsEntry: + aes.iam.v1.MarkNotificationsReadRequest: type: object properties: - key: - type: string - title: key - value: + organizationName: type: string - title: value - title: AnnotationsEntry + title: organization_name + description: |- + organizations/. When empty, defaults to caller's primary org. Used so a malicious + caller can't mark someone else's org's notifications "read" by guessing event ids. + notificationIds: + type: array + items: + type: string + title: notification_ids + description: Specific notification (= audit event) ids to mark read. Ignored when mark_all=true. + markAll: + type: boolean + title: mark_all + description: |- + When true, marks every visible notification in the 30-day window read for this caller. + Convenience for the "Mark all as read" button on the bell-icon dropdown. + title: MarkNotificationsReadRequest additionalProperties: false - aes.compute.v1.VirtualMachine.LabelsEntry: + aes.iam.v1.MarkNotificationsReadResponse: type: object properties: - key: - type: string - title: key - value: - type: string - title: value - title: LabelsEntry + markedCount: + type: integer + title: marked_count + format: int32 + title: MarkNotificationsReadResponse additionalProperties: false - aes.compute.v1.VirtualMachineManifest: + aes.iam.v1.MyInvite: type: object properties: - apiVersion: + inviteId: type: string - title: api_version - description: '"compute.metalhost.io/v1" (optional; validated when set)' - kind: + title: invite_id + organizationName: type: string - title: kind - description: '"VirtualMachine" (optional; validated when set)' - metadata: - title: metadata - $ref: '#/components/schemas/aes.compute.v1.VirtualMachineMetadata' - spec: - title: spec - $ref: '#/components/schemas/aes.compute.v1.VirtualMachineSpec' - title: VirtualMachineManifest + title: organization_name + organizationDisplayName: + type: string + title: organization_display_name + role: + type: string + title: role + inviterPrincipal: + type: string + title: inviter_principal + expiresAtUnix: + type: + - integer + - string + title: expires_at_unix + format: int64 + title: MyInvite additionalProperties: false - description: |- - ───────────────────────────── Declarative VM manifest ───────────────────────────── - The customer-facing, CLI-and-web-shared create document (docs/specs/VM_DECLARATIVE_MANIFEST_AND_USERS.md). - CreateVirtualMachine takes this directly; the web configures it and sends it, and (planned) - `metalhost vm apply -f vm.yaml` deserializes YAML into the same message — one schema, the YAML - is just its serialization. api_version/kind round-trip the YAML form; the server validates them - when present but they carry no behavior (the RPC method already implies kind=VirtualMachine). - aes.compute.v1.VirtualMachineMetadata: + aes.iam.v1.Notification: type: object properties: - name: + id: type: string - title: name - description: Hostname (DNS-1123 label, ≤63 chars). Empty → server defaults to the VM's resource id slug. - project: + title: id + description: The underlying audit event id; reuse it as the key when calling MarkNotificationsRead. + timestampUnix: + type: + - integer + - string + title: timestamp_unix + format: int64 + actor: type: string - title: project - description: Owning project `projects/{slug}`. Empty → the principal's default project. - labels: - type: object - title: labels - additionalProperties: - type: string - title: value - description: User-facing labels stamped at create time (filterable). `aes.metalhost/*` keys are reserved. - annotations: - type: object - title: annotations - additionalProperties: - type: string - title: value - description: Operator notes / non-indexed metadata. Same `aes.metalhost/*` reservation. - title: VirtualMachineMetadata + title: actor + summary: + type: string + title: summary + description: Humanized summary, same string ListOrgActivity produces. + resourceName: + type: string + title: resource_name + outcome: + type: string + title: outcome + description: SUCCESS / FAILURE / WARNING. + read: + type: boolean + title: read + description: Whether the calling user has marked this notification as read. + readAtUnix: + type: + - integer + - string + title: read_at_unix + format: int64 + description: When `read=true`, the unix timestamp the user marked it. + title: Notification additionalProperties: false - aes.compute.v1.VirtualMachineMetadata.AnnotationsEntry: + aes.iam.v1.OrgMember: type: object properties: - key: + principal: type: string - title: key - value: + title: principal + role: + type: string + title: role + email: type: string - title: value - title: AnnotationsEntry + title: email + displayName: + type: string + title: display_name + joinedAtUnix: + type: + - integer + - string + title: joined_at_unix + format: int64 + mfaEnrolled: + type: boolean + title: mfa_enrolled + description: |- + True when the user has at least one VERIFIED MFA device. Surfaced by GetOrgMember; the + bulk ListOrgMembers leaves this unset (we don't want to pay the per-row MFA query on + every list call). + lastSeenUnix: + type: + - integer + - string + title: last_seen_unix + format: int64 + description: |- + Most recent auth_sessions.last_used_at across this user's sessions, or 0 when none. + Surfaced by GetOrgMember; unset on ListOrgMembers for the same reason as mfa_enrolled. + title: OrgMember additionalProperties: false - aes.compute.v1.VirtualMachineMetadata.LabelsEntry: + aes.iam.v1.OrgMembership: type: object properties: - key: + organizationName: type: string - title: key - value: + title: organization_name + description: organizations/ + organizationDisplayName: type: string - title: value - title: LabelsEntry - additionalProperties: false - aes.compute.v1.VirtualMachineSpec: - type: object - properties: - region: + title: organization_display_name + role: type: string - title: region - description: Target datacenter `datacenters/{slug}`. Required. - compute: - title: compute - description: Configurator shape. Required. - $ref: '#/components/schemas/aes.compute.v1.VMComputeSpec' - boot: - title: boot - description: Boot source. Required (one of image / image_url / disk_name). - $ref: '#/components/schemas/aes.compute.v1.VMBootSpec' - network: - title: network - description: Network attachment + public IP choice. - $ref: '#/components/schemas/aes.compute.v1.VMNetworkSpec' - users: - type: array - items: - $ref: '#/components/schemas/aes.compute.v1.UserSpec' - title: users - description: |- - Login users created via cloud-init. Empty AND cloud_init empty → no inbound login (console - only). When cloud_init is set it OWNS user creation and users is ignored. - cloudInit: + title: role + description: caller's role in this org (org.admin wins if multiple) + state: type: string - title: cloud_init - description: |- - Raw #cloud-config userdata. When set, replaces all generated cloud-init (users included). - Must be valid `#cloud-config` YAML. - billing: - title: billing - description: Billing term. Defaults to HOURLY. - $ref: '#/components/schemas/aes.compute.v1.VMBillingSpec' - title: VirtualMachineSpec + title: state + description: ACTIVE | SUSPENDED + title: OrgMembership additionalProperties: false - aes.compute.v1.VmSnapshot: + aes.iam.v1.PendingInvite: type: object properties: - name: + id: type: string - title: name - description: Resource name `projects/{project}/vm-snapshots/{id}`. - displayName: + title: id + organizationName: type: string - title: display_name - projectName: + title: organization_name + email: type: string - title: project_name - datacenterName: + title: email + role: type: string - title: datacenter_name - sourceVm: + title: role + description: Customer-facing role label (admin / editor / viewer). + displayName: type: string - title: source_vm - description: Resource name of the source VM at snapshot creation time. - sizeGib: - type: integer - title: size_gib - format: int32 - description: Sum of disk sizes at snapshot time (used for billing units). - state: + title: display_name + inviterPrincipal: type: string - title: state - description: CREATING / READY / DELETING / DELETED. - createTimeUnix: + title: inviter_principal + description: Resource name of the org admin who issued the invite. + expiresAtUnix: type: - integer - string - title: create_time_unix + title: expires_at_unix format: int64 - updateTimeUnix: + createTimeUnix: type: - integer - string - title: update_time_unix + title: create_time_unix format: int64 - labels: - type: object - title: labels - additionalProperties: - type: string - title: value - annotations: - type: object - title: annotations - additionalProperties: - type: string - title: value - currentCostPerHourMinorDecimal: - type: string - title: current_cost_per_hour_minor_decimal - description: |- - ────────────── Live cost fields (computed at Get/List-time, not persisted) ── - Hourly rate this snapshot accrues against the wallet at current pricing - (size_gib × the snapshot storage unit price). - NUMERIC text so fractional cents survive the wire (a 40 GiB backup costs - ~0.55 cents per hour — int64 would round to 1 and overstate by ~80%). - Zero ("0") when rates aren't seeded or the snapshot is in a non-billing - state (DELETED, etc.); empty ("") only when the field is uninitialised. - monthlyCostMinorDecimal: - type: string - title: monthly_cost_minor_decimal - description: |- - Convenience: monthly rate at 730 hours/month. Same precision rules; the - SPA displays this directly so the customer doesn't have to multiply. - consistency: + title: PendingInvite + additionalProperties: false + description: |- + PendingInvite is the unaccepted-invite shape surfaced to org admins. accept_token is + intentionally omitted — the original recipient of InviteOrgMember has it; the list view + is for resend (re-invite) + revoke, not token disclosure. + aes.iam.v1.RegenerateRecoveryCodesRequest: + type: object + properties: + totpCode: type: string - title: consistency - description: QUIESCED, CRASH_CONSISTENT, or OFFLINE; empty until captured. - volumes: + title: totp_code + description: 6-digit TOTP code from the caller's authenticator (proves possession before rotating codes). + title: RegenerateRecoveryCodesRequest + additionalProperties: false + aes.iam.v1.RegenerateRecoveryCodesResponse: + type: object + properties: + recoveryCodes: type: array items: - $ref: '#/components/schemas/aes.compute.v1.BackupVolume' - title: volumes - createdBySchedule: - type: string - title: created_by_schedule - errorMessage: - type: string - title: error_message - gpuModel: - type: string - title: gpu_model - gpuCount: - type: integer - title: gpu_count - format: int32 - networkName: - type: string - title: network_name - privateOnly: - type: boolean - title: private_only - title: VmSnapshot + type: string + title: recovery_codes + description: Fresh single-use recovery codes; the previous set is invalidated. + title: RegenerateRecoveryCodesResponse additionalProperties: false - description: |- - MachineImage is a registered URL pointing at a streamable raw disk image. Resource name: - `projects/{project}/images/{image_id}`. Day-1 images are external URLs (S3/GCS/operator - HTTP); a managed upload endpoint is a future story. - VmSnapshot is a point-in-time copy of a VM (definition + every disk). State machine: - CREATING → READY → DELETING → DELETED. Survives source VM deletion (the snapshot row is - independent). - aes.compute.v1.VmSnapshot.AnnotationsEntry: + aes.iam.v1.RemoveOrgMemberRequest: type: object properties: - key: + organizationName: type: string - title: key - value: + title: organization_name + principal: type: string - title: value - title: AnnotationsEntry + title: principal + title: RemoveOrgMemberRequest additionalProperties: false - aes.compute.v1.VmSnapshot.LabelsEntry: + aes.iam.v1.RemoveOrgMemberResponse: + type: object + title: RemoveOrgMemberResponse + additionalProperties: false + aes.iam.v1.RequestEmailChangeRequest: type: object properties: - key: - type: string - title: key - value: + newEmail: type: string - title: value - title: LabelsEntry + title: new_email + description: New email address. Must be a valid email + not already in use by another active user. + title: RequestEmailChangeRequest additionalProperties: false - aes.health.v1.CheckRequest: + aes.iam.v1.RequestEmailChangeResponse: type: object - title: CheckRequest + title: RequestEmailChangeResponse additionalProperties: false - aes.health.v1.CheckResponse: + aes.iam.v1.RequestPasswordResetRequest: type: object properties: - status: - type: string - title: status - version: + email: type: string - title: version + title: email + title: RequestPasswordResetRequest + additionalProperties: false + aes.iam.v1.RequestPasswordResetResponse: + type: object + properties: + ok: + type: boolean + title: ok description: |- - Server build version (e.g. "0.0.1-rc235"). Empty when the binary was built without - ldflags injection — defaults to "dev" in that case. SPA renders it in the footer so - operators can confirm which backend tag is running. - title: CheckResponse + Always true. The RPC never reveals whether the email matched a user — that would be an + account-enumeration oracle. Caller's UX: "If that email is on file, we've sent a reset + link." + title: RequestPasswordResetResponse additionalProperties: false - aes.iam.v1.AcceptInviteRequest: + aes.iam.v1.ResetPasswordRequest: type: object properties: - acceptToken: + token: type: string - title: accept_token - title: AcceptInviteRequest + title: token + description: Token from the reset email (plaintext; server hashes it for lookup). + newPassword: + type: string + title: new_password + title: ResetPasswordRequest additionalProperties: false - aes.iam.v1.AcceptInviteResponse: + aes.iam.v1.ResetPasswordResponse: type: object properties: - organizationName: - type: string - title: organization_name principal: type: string title: principal - apiKey: - title: api_key - $ref: '#/components/schemas/aes.iam.v1.ApiKey' - secret: - type: string - title: secret - needsCredentials: - type: boolean - title: needs_credentials description: |- - True when the accepted user has no password set AND no linked OIDC identity, meaning - the only way back into the account today is the now-consumed invite token. The SPA - forces a credential-setup step (SetInitialPassword or LinkOidcProvider) before sending - the user to the dashboard. Existing users get false here. - title: AcceptInviteResponse + The principal whose password was reset, so the UI can show "Reset successful — sign in + as alice@example.com". + title: ResetPasswordResponse additionalProperties: false - aes.iam.v1.AcceptMyInviteRequest: + aes.iam.v1.RevokeAllOtherSessionsRequest: + type: object + title: RevokeAllOtherSessionsRequest + additionalProperties: false + aes.iam.v1.RevokeAllOtherSessionsResponse: type: object properties: - inviteId: - type: string - title: invite_id - title: AcceptMyInviteRequest + revokedCount: + type: integer + title: revoked_count + format: int32 + description: Number of sessions revoked (excludes the calling session). + title: RevokeAllOtherSessionsResponse additionalProperties: false - aes.iam.v1.AcceptMyInviteResponse: + aes.iam.v1.RevokeApiKeyRequest: type: object properties: - organizationName: + name: type: string - title: organization_name - title: AcceptMyInviteResponse + title: name + description: The id from ListApiKeys / CreateApiKey responses. Resource name api-keys/ (renamed from id in proto audit) + title: RevokeApiKeyRequest additionalProperties: false - aes.iam.v1.ApiKey: + aes.iam.v1.RevokeApiKeyResponse: + type: object + title: RevokeApiKeyResponse + additionalProperties: false + aes.iam.v1.RevokeCredentialRequest: type: object properties: name: type: string title: name - description: |- - Resource name `api-keys/` (AIP-122 canonical form). The slug after the prefix - is the SHA-256 hex of the key — use this with RevokeApiKey. - principal: - type: string - title: principal - description: Owner principal (always the caller for keys minted via IamService). - defaultProject: - type: string - title: default_project - description: Default project the key authorises requests against when no explicit project is given. - displayName: - type: string - title: display_name - description: Caller-supplied label for UX (e.g. "ci-bot-prod"). Not validated for uniqueness. - keyPrefix: - type: string - title: key_prefix - description: |- - First few characters of the secret — convenient for matching when revoking. Never the full - secret. - createTimeUnix: - type: - - integer - - string - title: create_time_unix - format: int64 - expiresAtUnix: - type: - - integer - - string - title: expires_at_unix - format: int64 - description: 0 when the key never expires. - revokedAtUnix: - type: - - integer - - string - title: revoked_at_unix - format: int64 - description: 0 when the key is still active. - scopeProject: - type: string - title: scope_project - description: |- - When non-empty, the key is HARD-SCOPED to this project. Requests targeting other projects - (or org-level resources) are rejected with PermissionDenied regardless of the principal's - bindings. Use this for least-privilege keys (CI bots, app integrations). Empty means the - key inherits the full set of the principal's bindings — `default_project` above is just a - UX fallback, not a scope. - title: ApiKey + title: RevokeCredentialRequest additionalProperties: false - description: |- - ApiKey describes a key without exposing the secret. Used in ListApiKeys and as the metadata - half of CreateApiKey's response (the secret half is on CreateApiKeyResponse.secret). - aes.iam.v1.ChangePasswordRequest: + aes.iam.v1.RevokeCredentialResponse: + type: object + title: RevokeCredentialResponse + additionalProperties: false + aes.iam.v1.RevokeInviteRequest: type: object properties: - currentPassword: + organizationName: type: string - title: current_password - newPassword: + title: organization_name + inviteId: type: string - title: new_password - title: ChangePasswordRequest + title: invite_id + description: The invite id from ListPendingInvites. + title: RevokeInviteRequest additionalProperties: false - aes.iam.v1.ChangePasswordResponse: + aes.iam.v1.RevokeInviteResponse: type: object - title: ChangePasswordResponse + title: RevokeInviteResponse additionalProperties: false - aes.iam.v1.CheckPermissionRequest: + aes.iam.v1.RevokeMFADeviceRequest: type: object properties: - principal: - type: string - title: principal - description: When empty, uses the authenticated principal from the request context (requires API key auth). - permission: - type: string - title: permission - description: Permission id, e.g. admin.platform or admin.catalog.read. - resourceName: + name: type: string - title: resource_name - description: Resource scope for bindings, e.g. //metalhost/platform. Empty defaults to //metalhost/platform. - title: CheckPermissionRequest + title: name + description: Resource name mfa-devices/ (renamed from device_id in proto audit) + title: RevokeMFADeviceRequest additionalProperties: false - aes.iam.v1.CheckPermissionResponse: + aes.iam.v1.RevokeMFADeviceResponse: type: object - properties: - allowed: - type: boolean - title: allowed - title: CheckPermissionResponse + title: RevokeMFADeviceResponse additionalProperties: false - aes.iam.v1.CompleteOidcLoginRequest: + aes.iam.v1.RevokeSessionRequest: type: object properties: - providerName: - type: string - title: provider_name - code: + name: type: string - title: code - description: Authorization code from the IdP redirect. - state: + title: name + description: Resource name sessions/ (renamed from session_id in proto audit) + title: RevokeSessionRequest + additionalProperties: false + aes.iam.v1.RevokeSessionResponse: + type: object + title: RevokeSessionResponse + additionalProperties: false + aes.iam.v1.RotateApiKeyRequest: + type: object + properties: + keyPrefix: type: string - title: state - description: Echo of the state we issued in StartOidcLogin. - redirectUri: + title: key_prefix + description: The key prefix (first ~12 chars of the original secret) of the key being rotated. + displayName: type: string - title: redirect_uri - title: CompleteOidcLoginRequest + title: display_name + description: Optional override for the new key's display name; defaults to the rotated key's name. + title: RotateApiKeyRequest additionalProperties: false - aes.iam.v1.CompleteOidcLoginResponse: + aes.iam.v1.RotateApiKeyResponse: type: object properties: - principal: - type: string - title: principal - description: Set when MFA enforcement is NOT engaged for this principal — single-leg OIDC path. - apiKey: - title: api_key + newApiKey: + title: new_api_key $ref: '#/components/schemas/aes.iam.v1.ApiKey' - secret: + newSecret: type: string - title: secret - mfaChallengeToken: + title: new_secret + revokedKeyPrefix: type: string - title: mfa_challenge_token - description: |- - P0-4: same semantics as LoginResponse.mfa_challenge_token — when set, api_key + secret are - empty and the caller must finish via SubmitMFAChallenge. - title: CompleteOidcLoginResponse + title: revoked_key_prefix + description: The prefix of the key that was revoked. + title: RotateApiKeyResponse additionalProperties: false - aes.iam.v1.CreateApiKeyRequest: + aes.iam.v1.RotateCredentialRequest: type: object properties: - displayName: - type: string - title: display_name - description: Optional label, e.g. "laptop" or "ci-bot". Echoed back; not validated for uniqueness. - defaultProject: - type: string - title: default_project - description: |- - Project the key targets when no explicit project is supplied on a request. Empty falls - back to the caller's existing default_project. The caller must have access to this project. - projectScoped: - type: boolean - title: project_scoped - description: |- - When true, the key is hard-scoped to `default_project` — every request authenticated by - this key is rejected with PermissionDenied unless it targets that project. Cross-project - and org-level access are blocked even for principals that hold admin.organization or - admin.platform. Use this for CI bots / app integrations that should never reach beyond - their tenant project. The resulting key's `ApiKey.scope_project` field is set to the same - value as `default_project`. Default false (key inherits the principal's full bindings). - title: CreateApiKeyRequest + name: + type: string + title: name + overlapSeconds: + type: integer + title: overlap_seconds + format: int32 + description: Zero revokes immediately; otherwise overlap is capped at 24h and old expiry. + requestId: + type: string + title: request_id + title: RotateCredentialRequest additionalProperties: false - aes.iam.v1.CreateApiKeyResponse: + aes.iam.v1.RotateCredentialResponse: type: object properties: - apiKey: - title: api_key - $ref: '#/components/schemas/aes.iam.v1.ApiKey' + credential: + title: credential + $ref: '#/components/schemas/aes.iam.v1.AutomationCredential' secret: type: string title: secret - description: |- - The plaintext secret. Returned ONCE — store it immediately. Subsequent ListApiKeys calls - expose only metadata. - title: CreateApiKeyResponse + previousExpiresAtUnix: + type: + - integer + - string + title: previous_expires_at_unix + format: int64 + secretUnavailable: + type: boolean + title: secret_unavailable + title: RotateCredentialResponse additionalProperties: false - aes.iam.v1.CreateWorkspaceRequest: + aes.iam.v1.ServiceAccount: type: object properties: - slug: + name: type: string - title: slug - description: |- - Bare workspace slug the user typed (server normalizes: lowercase + trim). Becomes the org - resource name `organizations/`. Validated against DNS-1035 + reserved rules. + title: name + projectName: + type: string + title: project_name displayName: type: string title: display_name - description: |- - Human-facing workspace name shown in the UI (org display_name). Falls back to the slug - when empty. - title: CreateWorkspaceRequest + permissions: + type: array + items: + type: string + title: permissions + state: + type: string + title: state + version: + type: + - integer + - string + title: version + format: int64 + createTimeUnix: + type: + - integer + - string + title: create_time_unix + format: int64 + title: ServiceAccount additionalProperties: false - aes.iam.v1.CreateWorkspaceResponse: + aes.iam.v1.Session: type: object properties: - organizationName: + name: type: string - title: organization_name - description: The org resource name `organizations/` that was created. - title: CreateWorkspaceResponse + title: name + description: Resource name `sessions/`. + principal: + type: string + title: principal + source: + type: string + title: source + description: '"oidc" | "signup" | "invite-accept" | "manual"' + ipAddress: + type: string + title: ip_address + userAgent: + type: string + title: user_agent + keyFingerprint: + type: string + title: key_fingerprint + description: |- + Last 6 chars of the SHA-256 of the API key this session is bound to. Doesn't expose the + key but lets the user correlate "current session" by matching the prefix shown in their + CLI / browser. + createTimeUnix: + type: + - integer + - string + title: create_time_unix + format: int64 + lastUsedAtUnix: + type: + - integer + - string + title: last_used_at_unix + format: int64 + expiresAtUnix: + type: + - integer + - string + title: expires_at_unix + format: int64 + isCurrent: + type: boolean + title: is_current + description: True for the session the caller is using right now. + title: Session additionalProperties: false - aes.iam.v1.DeclineMyInviteRequest: + aes.iam.v1.SetGitHubTrustStateRequest: type: object properties: - inviteId: + name: type: string - title: invite_id - title: DeclineMyInviteRequest + title: name + state: + type: string + title: state + expectedVersion: + type: + - integer + - string + title: expected_version + format: int64 + title: SetGitHubTrustStateRequest additionalProperties: false - aes.iam.v1.DeclineMyInviteResponse: + aes.iam.v1.SetGitHubTrustStateResponse: type: object - title: DeclineMyInviteResponse + properties: + trust: + title: trust + $ref: '#/components/schemas/aes.iam.v1.GitHubTrust' + title: SetGitHubTrustStateResponse additionalProperties: false - aes.iam.v1.EnrollMFARequest: + aes.iam.v1.SetInitialPasswordRequest: type: object properties: - displayName: + newPassword: type: string - title: display_name - description: Optional — e.g. "iPhone 15". - title: EnrollMFARequest + title: new_password + description: New password. Same minimum-length rules as SignUp/ResetPassword. + title: SetInitialPasswordRequest additionalProperties: false - aes.iam.v1.EnrollMFAResponse: + aes.iam.v1.SetInitialPasswordResponse: + type: object + title: SetInitialPasswordResponse + additionalProperties: false + aes.iam.v1.SetServiceAccountStateRequest: type: object properties: - device: - title: device - $ref: '#/components/schemas/aes.iam.v1.MFADevice' - secret: + name: type: string - title: secret - description: |- - Cleartext shared secret. Returned exactly once, not stored anywhere the caller can read - again — they must enter it (or scan the QR) into their authenticator app NOW. - provisioningUri: + title: name + state: type: string - title: provisioning_uri - description: |- - Provisioning URI: `otpauth://totp/{Issuer}:{Account}?secret=...&issuer={Issuer}` — most - authenticator apps render this as a QR code. - title: EnrollMFAResponse + title: state + description: ACTIVE or DISABLED; a customer cannot clear a security LOCKED state. + expectedVersion: + type: + - integer + - string + title: expected_version + format: int64 + title: SetServiceAccountStateRequest additionalProperties: false - aes.iam.v1.GetAuthMetadataRequest: + aes.iam.v1.SetServiceAccountStateResponse: type: object - title: GetAuthMetadataRequest + properties: + serviceAccount: + title: service_account + $ref: '#/components/schemas/aes.iam.v1.ServiceAccount' + title: SetServiceAccountStateResponse additionalProperties: false - aes.iam.v1.GetAuthMetadataResponse: + aes.iam.v1.SetSessionDefaultProjectRequest: type: object properties: - supportsApiKey: - type: boolean - title: supports_api_key - oidcIssuerUrl: - type: string - title: oidc_issuer_url - description: OIDC issuer URL for interactive login (e.g. https://issuer.example.com). Empty if not configured. - oidcAudience: + projectName: type: string - title: oidc_audience - description: Optional audience for OIDC tokens when enforced at the gateway. - supportsOidc: - type: boolean - title: supports_oidc - description: True when an issuer is configured (discovery / token validation may still be gateway-only in Phase 0). - supportsRbac: - type: boolean - title: supports_rbac - description: True when CheckPermission is backed by role/permission policy. - title: GetAuthMetadataResponse + title: project_name + description: |- + Resource name `projects/`. Must be one the caller has access to (we check via + RequireProjectRead). Empty string clears the default (sets api_keys.default_project + to NULL) — useful for "leave project" actions where the user no longer has access. + title: SetSessionDefaultProjectRequest additionalProperties: false - aes.iam.v1.GetCallerIdentityRequest: + aes.iam.v1.SetSessionDefaultProjectResponse: type: object - title: GetCallerIdentityRequest + properties: + projectName: + type: string + title: project_name + description: |- + Echoes back what was set (or empty if cleared) so the client can update its cached + identity without a follow-up GetCallerIdentity call. + title: SetSessionDefaultProjectResponse additionalProperties: false - aes.iam.v1.GetCallerIdentityResponse: + aes.iam.v1.SignUpRequest: type: object properties: - principal: + displayName: type: string - title: principal - description: The authenticated principal, e.g. "users/alice" or "serviceAccounts/bot". - defaultProject: + title: display_name + description: |- + Human-readable name for the tenant (becomes the org's display name). Required. + Customer-facing wording: "Company / organization name". + email: type: string - title: default_project - description: The default project attached to the bearer token, or empty. - scopeProject: + title: email + description: |- + Email address. Required. Used to derive the principal slug and as the account's contact + address. When `password` is supplied, the server sends a Resend verification email and + returns SignUpResponse.verification_pending=true (no API key yet); the caller then calls + VerifyEmail with the token from the email. When `password` is empty, the legacy + closed-beta path runs (gated by METALHOST_ENABLE_PUBLIC_SIGNUP) and immediately mints the + API key — used by dev / staging / OIDC-only signups that don't store a password. + password: type: string - title: scope_project + title: password description: |- - When non-empty, the bearer token is hard-scoped to this project — cross-project requests - are rejected by RequireProjectAccess. Empty means the token has no project scope (its - permissions are limited only by the principal's role bindings). - accessibleOrganizations: - type: array - items: - type: string - title: accessible_organizations + Optional plaintext password. Length must be ≥ 8. Empty string falls through to the legacy + closed-beta path (no verification, no password stored). + fullName: + type: string + title: full_name + description: |- + Full name of the signing-up user (becomes users.display_name). Optional; when empty the + server falls back to display_name (the company / org name). Surfacing this separately + lets the portal greet the user by their name ("Welcome back, Alice") instead of their + company name. Portal sign-up form should collect both. + attribution: + title: attribution + description: |- + Optional marketing attribution captured on the website at first visit. Stored on the + account at creation; never updated afterwards. + $ref: '#/components/schemas/aes.iam.v1.SignupAttribution' + turnstileToken: + type: string + title: turnstile_token + description: |- + Cloudflare Turnstile widget token. Required when the deployment has bot protection + enabled; safe to omit otherwise. + survey: + title: survey description: |- - Organizations the caller has a role binding against (any role). Useful for the - portal landing resolver: when this is non-empty but default_project is empty, the user - has access to ≥1 org but hasn't created/been-assigned a project yet — route them to - the onboarding wizard. Empty list means the user has no org access at all (orphan - account; very rare). - title: GetCallerIdentityResponse + Optional "What brings you to Metal Host?" answer from the sign-up form. Stored on the + account at creation; never updated afterwards. Rides email_verifications until + VerifyEmail materializes the user (same path as attribution). + $ref: '#/components/schemas/aes.iam.v1.SignupSurvey' + title: SignUpRequest additionalProperties: false - aes.iam.v1.GetOrgMemberRequest: + aes.iam.v1.SignUpResponse: type: object properties: organizationName: type: string title: organization_name - description: organizations/ + description: The created organization (`organizations/{slug}`). Empty when verification_pending=true. + projectName: + type: string + title: project_name + description: The default project under the new org (`projects/{slug}-default`). Empty when pending. principal: type: string title: principal - description: users/ - title: GetOrgMemberRequest - additionalProperties: false - aes.iam.v1.GetOrgMemberResponse: - type: object - properties: - member: - title: member - $ref: '#/components/schemas/aes.iam.v1.OrgMember' - title: GetOrgMemberResponse + description: The principal id (`users/{slug}`) that owns the new tenancy. Empty when pending. + apiKey: + title: api_key + description: |- + The minted API key + plaintext secret. Same one-shot semantics as CreateApiKey — the + secret is never retrievable again after this response. Nil when verification_pending=true. + $ref: '#/components/schemas/aes.iam.v1.ApiKey' + secret: + type: string + title: secret + verificationPending: + type: boolean + title: verification_pending + description: |- + True when the server sent a verification email and is waiting for VerifyEmail. The + organization / user / API key fields above are empty in this case. + title: SignUpResponse additionalProperties: false - aes.iam.v1.GetUserRequest: + aes.iam.v1.SignupAttribution: type: object properties: - name: + utmSource: type: string - title: name - description: Empty name means "the caller". Non-empty fetches a specific user (permission required). - title: GetUserRequest + title: utm_source + utmMedium: + type: string + title: utm_medium + utmCampaign: + type: string + title: utm_campaign + utmTerm: + type: string + title: utm_term + utmContent: + type: string + title: utm_content + gclid: + type: string + title: gclid + description: Google Ads click ID. + rdtCid: + type: string + title: rdt_cid + description: Reddit Ads click ID. + landingPage: + type: string + title: landing_page + description: First page visited (path + query). + referrer: + type: string + title: referrer + description: document.referrer at first visit. + firstTouchAtUnix: + type: + - integer + - string + title: first_touch_at_unix + format: int64 + description: Unix seconds of the first visit. + title: SignupAttribution additionalProperties: false - aes.iam.v1.GetUserResponse: - type: object - properties: - user: - title: user - $ref: '#/components/schemas/aes.iam.v1.User' - title: GetUserResponse + description: |- + Marketing attribution for a new account: UTM parameters and ad click IDs captured on the + website at first visit. All fields optional. + aes.iam.v1.SignupIntent: + type: string + title: SignupIntent + enum: + - SIGNUP_INTENT_UNSPECIFIED + - SIGNUP_INTENT_MOVING_WORKLOAD + - SIGNUP_INTENT_STARTING_NEW + - SIGNUP_INTENT_ADDING_CAPACITY + - SIGNUP_INTENT_COMPARING_PROVIDERS + - SIGNUP_INTENT_SOMETHING_ELSE + description: Why the customer is signing up. Captured on the website; values match the sign-up form copy. + aes.iam.v1.SignupSurvey: + type: object + properties: + intent: + title: intent + $ref: '#/components/schemas/aes.iam.v1.SignupIntent' + somethingElse: + type: string + title: something_else + description: |- + Free-text when intent is SIGNUP_INTENT_SOMETHING_ELSE. Server truncates to 100 + characters. Ignored for any other intent. + title: SignupSurvey additionalProperties: false - aes.iam.v1.ImportGitHubSshKeysRequest: + description: Single-question signup survey. Optional; empty/unspecified is stored as SQL NULL. + aes.iam.v1.StartOidcLoginRequest: type: object properties: - projectName: + providerName: type: string - title: project_name - description: Project under which to create the keys, e.g. "projects/acme-prod". - githubUsername: + title: provider_name + description: Provider name (`oidc-providers/{slug}`) — a platform-configured OIDC provider slug. + redirectUri: type: string - title: github_username - description: |- - GitHub login (not numeric id). Required — even when the caller is OIDC-linked to GitHub, - we don't currently persist the username and the client must pass it. If the caller wants - us to look it up from a linked OIDC identity, set `use_linked_identity=true` and leave - github_username empty. - useLinkedIdentity: - type: boolean - title: use_linked_identity + title: redirect_uri + description: Where the IdP should redirect after auth — typically the gateway's /oauth/callback. + attribution: + title: attribution description: |- - When true, the server resolves the GitHub username from the caller's linked oidc_identities - row (provider_name='github'). Returns FailedPrecondition if no linked identity exists. - displayNamePrefix: - type: string - title: display_name_prefix + Optional marketing attribution captured on the website at first visit. Applied only when + this sign-in creates a brand-new account; ignored on sign-ins to existing accounts. + $ref: '#/components/schemas/aes.iam.v1.SignupAttribution' + survey: + title: survey description: |- - Optional display-name prefix for created keys; defaults to "github--" when - empty. - title: ImportGitHubSshKeysRequest + Optional "What brings you to Metal Host?" answer. Applied only when this sign-in creates + a brand-new account; ignored on sign-ins to existing accounts. Rides oidc_login_sessions + because the OAuth redirect drops URL params. + $ref: '#/components/schemas/aes.iam.v1.SignupSurvey' + title: StartOidcLoginRequest additionalProperties: false - description: |- - ImportGitHubSshKeys onboarding shortcut. Fetches https://github.com/.keys - (public endpoint, no auth) and bulk-creates SSHKey rows under the named project. Duplicates - (by fingerprint) are skipped; the response lists keys actually created. - aes.iam.v1.ImportGitHubSshKeysResponse: + aes.iam.v1.StartOidcLoginResponse: type: object properties: - createdSshKeyNames: - type: array - items: - type: string - title: created_ssh_key_names - description: Newly-created SSHKey resource names (e.g. "projects/acme-prod/ssh-keys/"). - skippedExisting: - type: integer - title: skipped_existing - format: int32 + authorizeUrl: + type: string + title: authorize_url description: |- - Number of keys returned by GitHub that were skipped because the same fingerprint already - exists under the project (we never duplicate keys). - title: ImportGitHubSshKeysResponse + Browser navigates here. Metalhost-generated state token is embedded; gateway preserves it + through to CompleteOidcLogin so we can validate replay. + state: + type: string + title: state + title: StartOidcLoginResponse additionalProperties: false - aes.iam.v1.InviteOrgMemberRequest: + aes.iam.v1.SubmitGitHubSetupRequest: type: object properties: - organizationName: - type: string - title: organization_name - description: Org the invite is for (`organizations/{slug}`). Caller must hold admin.organization on it. - email: + id: type: string - title: email - description: Email of the invitee. Used to derive the principal slug at AcceptInvite time. - role: + title: id + pairingCode: type: string - title: role - description: |- - Role assigned at accept time. v1 ships only "viewer" / "editor" / "admin"; admin is - equivalent to admin.organization on the org. Other strings rejected. - displayName: + title: pairing_code + assertion: type: string - title: display_name - description: Optional human display name pre-fill (the invitee can override at accept). - title: InviteOrgMemberRequest + title: assertion + title: SubmitGitHubSetupRequest additionalProperties: false - aes.iam.v1.InviteOrgMemberResponse: + aes.iam.v1.SubmitGitHubSetupResponse: + type: object + title: SubmitGitHubSetupResponse + additionalProperties: false + aes.iam.v1.SubmitMFAChallengeRequest: type: object properties: - acceptToken: + challengeToken: type: string - title: accept_token + title: challenge_token + description: Opaque challenge token returned by Login or CompleteOidcLogin. + totpCode: + type: string + title: totp_code description: |- - Opaque token the invitee redeems via AcceptInvite. Bearer-only — anyone with the token - can accept. Operators forward via email out-of-band; expires in 7 days. - expiresAtUnix: - type: - - integer - - string - title: expires_at_unix - format: int64 - title: InviteOrgMemberResponse + 6-digit TOTP code from the caller's authenticator app. One of totp_code OR recovery_code + must be set; if both are provided, totp_code wins. + recoveryCode: + type: string + title: recovery_code + description: |- + Single-use recovery code (16 chars, hex). Consumed on use. Provided when the caller has + lost their authenticator device. + title: SubmitMFAChallengeRequest additionalProperties: false - aes.iam.v1.LinkOidcProviderRequest: + aes.iam.v1.SubmitMFAChallengeResponse: type: object properties: - providerName: + principal: type: string - title: provider_name - description: OIDC provider to link (`oidc-providers/{slug}`). - redirectUri: + title: principal + description: Same shape as LoginResponse's success branch. + apiKey: + title: api_key + $ref: '#/components/schemas/aes.iam.v1.ApiKey' + secret: type: string - title: redirect_uri - description: Where the provider should redirect after the user authorizes. - title: LinkOidcProviderRequest + title: secret + usedRecoveryCode: + type: boolean + title: used_recovery_code + description: |- + True when the caller used a recovery code (so the SPA can prompt them to re-enroll a + fresh device — recovery codes are one-shot and don't re-mint). + title: SubmitMFAChallengeResponse additionalProperties: false - aes.iam.v1.LinkOidcProviderResponse: + aes.iam.v1.UpdateGitHubTrustRequest: type: object properties: - authorizeUrl: + name: type: string - title: authorize_url - state: + title: name + displayName: type: string - title: state - title: LinkOidcProviderResponse + title: display_name + permissions: + type: array + items: + type: string + title: permissions + expectedVersion: + type: + - integer + - string + title: expected_version + format: int64 + requestId: + type: string + title: request_id + title: UpdateGitHubTrustRequest additionalProperties: false - aes.iam.v1.ListApiKeysRequest: + aes.iam.v1.UpdateGitHubTrustResponse: type: object properties: - pageSize: - type: integer - title: page_size - format: int32 - pageToken: - type: string - title: page_token - title: ListApiKeysRequest + trust: + title: trust + $ref: '#/components/schemas/aes.iam.v1.GitHubTrust' + title: UpdateGitHubTrustResponse additionalProperties: false - aes.iam.v1.ListApiKeysResponse: + aes.iam.v1.UpdateOrgMemberRoleRequest: type: object properties: - apiKeys: - type: array - items: - $ref: '#/components/schemas/aes.iam.v1.ApiKey' - title: api_keys - nextPageToken: + organizationName: type: string - title: next_page_token - title: ListApiKeysResponse + title: organization_name + description: organizations/. + principal: + type: string + title: principal + description: Resource name of the user (`users/`). + role: + type: string + title: role + description: 'Same role names as InviteOrgMember: viewer / editor / admin.' + title: UpdateOrgMemberRoleRequest additionalProperties: false - aes.iam.v1.ListMFADevicesRequest: + aes.iam.v1.UpdateOrgMemberRoleResponse: type: object - title: ListMFADevicesRequest + properties: + member: + title: member + $ref: '#/components/schemas/aes.iam.v1.OrgMember' + title: UpdateOrgMemberRoleResponse additionalProperties: false - aes.iam.v1.ListMFADevicesResponse: + aes.iam.v1.UpdateServiceAccountRequest: type: object properties: - mfaDevices: + name: + type: string + title: name + displayName: + type: string + title: display_name + permissions: type: array items: - $ref: '#/components/schemas/aes.iam.v1.MFADevice' - title: mfa_devices - title: ListMFADevicesResponse - additionalProperties: false - aes.iam.v1.ListMyInvitesRequest: - type: object - title: ListMyInvitesRequest + type: string + title: permissions + expectedVersion: + type: + - integer + - string + title: expected_version + format: int64 + title: UpdateServiceAccountRequest additionalProperties: false - aes.iam.v1.ListMyInvitesResponse: + aes.iam.v1.UpdateServiceAccountResponse: type: object properties: - invites: - type: array - items: - $ref: '#/components/schemas/aes.iam.v1.MyInvite' - title: invites - title: ListMyInvitesResponse + serviceAccount: + title: service_account + $ref: '#/components/schemas/aes.iam.v1.ServiceAccount' + title: UpdateServiceAccountResponse additionalProperties: false - aes.iam.v1.ListMyOrganizationsRequest: + aes.iam.v1.UpdateUserRequest: type: object - title: ListMyOrganizationsRequest + properties: + name: + type: string + title: name + displayName: + type: + - string + - "null" + title: display_name + description: Only the supplied optional fields are updated. Other fields are preserved. + title: UpdateUserRequest additionalProperties: false - description: ── Self-service multi-org messages ──────────────────────────────────────────────────────── - aes.iam.v1.ListMyOrganizationsResponse: + aes.iam.v1.UpdateUserResponse: type: object properties: - organizations: - type: array - items: - $ref: '#/components/schemas/aes.iam.v1.OrgMembership' - title: organizations - title: ListMyOrganizationsResponse + user: + title: user + $ref: '#/components/schemas/aes.iam.v1.User' + title: UpdateUserResponse additionalProperties: false - aes.iam.v1.ListNotificationsRequest: + aes.iam.v1.User: type: object properties: - organizationName: + name: type: string - title: organization_name - description: organizations/. When empty, defaults to the caller's primary org. - pageSize: - type: integer - title: page_size - format: int32 - pageToken: + title: name + email: type: string - title: page_token - unreadOnly: + title: email + displayName: + type: string + title: display_name + state: + type: string + title: state + description: ACTIVE / DISABLED / LOCKED — same vocabulary as the users table state column. + mfaEnrolled: type: boolean - title: unread_only + title: mfa_enrolled description: |- - When true, only return unread notifications. Otherwise all notifications in the 30-day - window are returned with their read state. - title: ListNotificationsRequest + True when the user has at least one VERIFIED MFA device. Tells the UI whether to show + the "Enable MFA" prompt or the "Manage MFA" link. + passwordSet: + type: boolean + title: password_set + description: |- + True when password_hash is non-empty (user can log in with email + password). False for + OIDC-only signups. + createTimeUnix: + type: + - integer + - string + title: create_time_unix + format: int64 + title: User additionalProperties: false description: |- - ListNotifications: customer-notable subset of the org audit feed (see ActivityEvent - .notify_in_app). Joined to notification_reads so the response includes read state per row. - Server enforces a 30-day window. - aes.iam.v1.ListNotificationsResponse: + User is the profile shape returned by GetUser / UpdateUser. Read-only on most fields; only + display_name is mutable via UpdateUser. Email changes go through RequestEmailChange. + aes.iam.v1.ValidateApiKeyRequest: type: object properties: - notifications: - type: array - items: - $ref: '#/components/schemas/aes.iam.v1.Notification' - title: notifications - nextPageToken: + rawKey: type: string - title: next_page_token - unreadCount: - type: integer - title: unread_count - format: int32 - description: Total unread count across the 30-day window — drives the bell-icon badge. - title: ListNotificationsResponse + title: raw_key + title: ValidateApiKeyRequest additionalProperties: false - aes.iam.v1.ListOrgMembersRequest: + aes.iam.v1.ValidateApiKeyResponse: type: object properties: - organizationName: + principal: type: string - title: organization_name - pageSize: - type: integer - title: page_size - format: int32 - pageToken: + title: principal + description: Stable principal id, e.g. `users/alice` or `serviceAccounts/bot`. + defaultProject: type: string - title: page_token - title: ListOrgMembersRequest + title: default_project + description: Optional default project for this key (UX helper until full authz). + title: ValidateApiKeyResponse additionalProperties: false - aes.iam.v1.ListOrgMembersResponse: + aes.iam.v1.ValidateOidcTokenRequest: type: object properties: - orgMembers: - type: array - items: - $ref: '#/components/schemas/aes.iam.v1.OrgMember' - title: org_members - nextPageToken: + accessToken: type: string - title: next_page_token - title: ListOrgMembersResponse + title: access_token + description: Bearer token without the "Bearer " prefix, or full Authorization header contents. + title: ValidateOidcTokenRequest additionalProperties: false - aes.iam.v1.ListPendingInvitesRequest: + aes.iam.v1.ValidateOidcTokenResponse: type: object properties: - organizationName: + principal: type: string - title: organization_name - pageSize: - type: integer - title: page_size - format: int32 - pageToken: + title: principal + defaultProject: type: string - title: page_token - title: ListPendingInvitesRequest + title: default_project + claims: + type: object + title: claims + additionalProperties: + type: string + title: value + title: ValidateOidcTokenResponse additionalProperties: false - aes.iam.v1.ListPendingInvitesResponse: + aes.iam.v1.ValidateOidcTokenResponse.ClaimsEntry: type: object properties: - invites: - type: array - items: - $ref: '#/components/schemas/aes.iam.v1.PendingInvite' - title: invites - nextPageToken: + key: type: string - title: next_page_token - title: ListPendingInvitesResponse - additionalProperties: false - aes.iam.v1.ListSessionsRequest: - type: object - title: ListSessionsRequest - additionalProperties: false - aes.iam.v1.ListSessionsResponse: - type: object - properties: - sessions: - type: array - items: - $ref: '#/components/schemas/aes.iam.v1.Session' - title: sessions - title: ListSessionsResponse + title: key + value: + type: string + title: value + title: ClaimsEntry additionalProperties: false - aes.iam.v1.LoginRequest: + aes.iam.v1.VerifyEmailRequest: type: object properties: - email: - type: string - title: email - password: + token: type: string - title: password - title: LoginRequest + title: token + description: The token from the verification email link. + title: VerifyEmailRequest additionalProperties: false - aes.iam.v1.LoginResponse: + aes.iam.v1.VerifyEmailResponse: type: object properties: + organizationName: + type: string + title: organization_name + projectName: + type: string + title: project_name principal: type: string title: principal - description: Set when MFA enforcement is NOT engaged for this principal — single-leg login path. apiKey: title: api_key $ref: '#/components/schemas/aes.iam.v1.ApiKey' secret: type: string title: secret - mfaChallengeToken: + title: VerifyEmailResponse + additionalProperties: false + aes.iam.v1.VerifyMFAEnrollmentRequest: + type: object + properties: + name: type: string - title: mfa_challenge_token - description: |- - P0-4: when the principal's org has require_mfa=TRUE AND the principal has at least one - ACTIVE mfa_credentials row, the server returns ONLY this challenge token (api_key + secret - empty) and the SPA/CLI must call SubmitMFAChallenge with the token + TOTP code (or - recovery_code) to finish the login. 5-minute TTL, single-use, max 5 wrong attempts. - title: LoginResponse + title: name + description: Resource name mfa-devices/ (renamed from device_id in proto audit) + totpCode: + type: string + title: totp_code + description: 6-digit TOTP code from the authenticator app. + title: VerifyMFAEnrollmentRequest additionalProperties: false - aes.iam.v1.LogoutRequest: + aes.iam.v1.VerifyMFAEnrollmentResponse: type: object - title: LogoutRequest + properties: + device: + title: device + $ref: '#/components/schemas/aes.iam.v1.MFADevice' + recoveryCodes: + type: array + items: + type: string + title: recovery_codes + description: |- + One-shot recovery codes. Returned exactly once on first successful verification — store + these somewhere safe; each can be used once if the authenticator is lost. + title: VerifyMFAEnrollmentResponse additionalProperties: false - aes.iam.v1.LogoutResponse: + aes.monitoring.v1.AlertDestination: type: object - title: LogoutResponse + properties: + name: + type: string + title: name + projectName: + type: string + title: project_name + displayName: + type: string + title: display_name + kind: + type: string + title: kind + description: EMAIL selects an existing verified project member; WEBHOOK an existing subscription. + principal: + type: string + title: principal + subscriptionName: + type: string + title: subscription_name + enabled: + type: boolean + title: enabled + version: + type: + - integer + - string + title: version + format: int64 + verificationStatus: + type: string + title: verification_status + description: VERIFIED, PENDING, or NOT_REQUIRED for a webhook subscription. + pendingVerificationId: + type: string + title: pending_verification_id + description: Only populated for the current recipient's own unexpired verification. + lastTest: + title: last_test + description: Most recent test within retained history; absence is not delivery success. + $ref: '#/components/schemas/aes.monitoring.v1.DestinationTest' + title: AlertDestination additionalProperties: false - aes.iam.v1.MFADevice: + aes.monitoring.v1.AlertDestinationCandidate: type: object properties: name: type: string title: name - description: Resource name `mfa-devices/`. displayName: type: string title: display_name - type: + kind: type: string - title: type - description: '"totp" — only TOTP in v1.' - state: + title: kind + description: EMAIL or WEBHOOK. The name is an existing user or subscription resource. + address: type: string - title: state - description: PENDING | ACTIVE - secretPrefix: + title: address + title: AlertDestinationCandidate + additionalProperties: false + aes.monitoring.v1.AlertInstance: + type: object + properties: + ruleId: type: string - title: secret_prefix - description: First 6 chars of the secret, for the user to identify devices. - enrolledAtUnix: + title: rule_id + ruleVersion: type: - integer - string - title: enrolled_at_unix + title: rule_version format: int64 - lastUsedAtUnix: + vmName: + type: string + title: vm_name + health: + type: string + title: health + condition: + type: string + title: condition + incidentId: + type: string + title: incident_id + transitionTimeUnix: type: - integer - string - title: last_used_at_unix + title: transition_time_unix format: int64 - title: MFADevice + title: AlertInstance additionalProperties: false - aes.iam.v1.MarkNotificationsReadRequest: + aes.monitoring.v1.AlertPreviewResource: type: object properties: - organizationName: + vmName: type: string - title: organization_name - description: |- - organizations/. When empty, defaults to caller's primary org. Used so a malicious - caller can't mark someone else's org's notifications "read" by guessing event ids. - notificationIds: - type: array - items: - type: string - title: notification_ids - description: Specific notification (= audit event) ids to mark read. Ignored when mark_all=true. - markAll: + title: vm_name + displayName: + type: string + title: display_name + status: + type: string + title: status + description: AVAILABLE, AWAITING_DATA, SUPPRESSED, UNKNOWN intent/placement, or ERROR. + value: + type: + - number + - "null" + title: value + format: double + conditionMet: type: boolean - title: mark_all - description: |- - When true, marks every visible notification in the 30-day window read for this caller. - Convenience for the "Mark all as read" button on the bell-icon dropdown. - title: MarkNotificationsReadRequest - additionalProperties: false - aes.iam.v1.MarkNotificationsReadResponse: - type: object - properties: - markedCount: - type: integer - title: marked_count - format: int32 - title: MarkNotificationsReadResponse + title: condition_met + title: AlertPreviewResource additionalProperties: false - aes.iam.v1.MyInvite: + aes.monitoring.v1.AlertRule: type: object properties: - inviteId: - type: string - title: invite_id - organizationName: + id: type: string - title: organization_name - organizationDisplayName: + title: id + projectName: type: string - title: organization_display_name - role: + title: project_name + spec: + title: spec + $ref: '#/components/schemas/aes.monitoring.v1.AlertRuleSpec' + version: + type: + - integer + - string + title: version + format: int64 + appliedVersion: + type: + - integer + - string + title: applied_version + format: int64 + syncStatus: type: string - title: role - inviterPrincipal: + title: sync_status + description: PENDING, APPLIED, ERROR, LIMITED, or RETIRED. Saving is not engine acceptance. + syncError: type: string - title: inviter_principal - expiresAtUnix: + title: sync_error + createTimeUnix: type: - integer - string - title: expires_at_unix + title: create_time_unix format: int64 - title: MyInvite + updateTimeUnix: + type: + - integer + - string + title: update_time_unix + format: int64 + lastEvaluatedAtUnix: + type: + - integer + - string + title: last_evaluated_at_unix + format: int64 + title: AlertRule additionalProperties: false - aes.iam.v1.Notification: + aes.monitoring.v1.AlertRuleSpec: type: object properties: - id: + displayName: type: string - title: id - description: The underlying audit event id; reuse it as the key when calling MarkNotificationsRead. - timestampUnix: + title: display_name + metricId: + type: string + title: metric_id + description: One of the metric IDs returned by the alert template catalog. + operator: + type: string + title: operator + description: GREATER_THAN or LESS_THAN. Availability templates use GREATER_THAN 0. + threshold: + type: number + title: threshold + format: double + sustainedSeconds: + type: integer + title: sustained_seconds + format: int32 + severity: + type: string + title: severity + description: WARNING or CRITICAL. + allVms: + type: boolean + title: all_vms + vmNames: + type: array + items: + type: string + title: vm_names + enabled: + type: boolean + title: enabled + repeatIntervalSeconds: + type: integer + title: repeat_interval_seconds + format: int32 + destinationNames: + type: array + items: + type: string + title: destination_names + title: AlertRuleSpec + additionalProperties: false + aes.monitoring.v1.DeleteAlertDestinationRequest: + type: object + properties: + projectName: + type: string + title: project_name + name: + type: string + title: name + expectedVersion: type: - integer - string - title: timestamp_unix + title: expected_version format: int64 - actor: - type: string - title: actor - summary: + requestId: type: string - title: summary - description: Humanized summary, same string ListOrgActivity produces. - resourceName: + title: request_id + title: DeleteAlertDestinationRequest + additionalProperties: false + aes.monitoring.v1.DeleteAlertDestinationResponse: + type: object + title: DeleteAlertDestinationResponse + additionalProperties: false + aes.monitoring.v1.DeleteAlertRuleRequest: + type: object + properties: + projectName: type: string - title: resource_name - outcome: + title: project_name + id: type: string - title: outcome - description: SUCCESS / FAILURE / WARNING. - read: - type: boolean - title: read - description: Whether the calling user has marked this notification as read. - readAtUnix: + title: id + expectedVersion: type: - integer - string - title: read_at_unix + title: expected_version format: int64 - description: When `read=true`, the unix timestamp the user marked it. - title: Notification + requestId: + type: string + title: request_id + title: DeleteAlertRuleRequest additionalProperties: false - aes.iam.v1.OrgMember: + aes.monitoring.v1.DeleteAlertRuleResponse: + type: object + title: DeleteAlertRuleResponse + additionalProperties: false + aes.monitoring.v1.DestinationTest: type: object properties: - principal: + id: type: string - title: principal - role: + title: id + destinationName: type: string - title: role - email: + title: destination_name + state: type: string - title: email - displayName: + title: state + description: PENDING, SENDING, SENT, FAILED, EXPIRED, or SKIPPED. SENT means provider acceptance. + attemptCount: + type: integer + title: attempt_count + format: int32 + lastError: type: string - title: display_name - joinedAtUnix: - type: - - integer - - string - title: joined_at_unix - format: int64 - mfaEnrolled: - type: boolean - title: mfa_enrolled - description: |- - True when the user has at least one VERIFIED MFA device. Surfaced by GetOrgMember; the - bulk ListOrgMembers leaves this unset (we don't want to pay the per-row MFA query on - every list call). - lastSeenUnix: + title: last_error + createTimeUnix: type: - integer - string - title: last_seen_unix + title: create_time_unix format: int64 - description: |- - Most recent auth_sessions.last_used_at across this user's sessions, or 0 when none. - Surfaced by GetOrgMember; unset on ListOrgMembers for the same reason as mfa_enrolled. - title: OrgMember + title: DestinationTest additionalProperties: false - aes.iam.v1.OrgMembership: + aes.monitoring.v1.EnableEnhancedMonitoringRequest: type: object properties: - organizationName: - type: string - title: organization_name - description: organizations/ - organizationDisplayName: - type: string - title: organization_display_name - role: + name: type: string - title: role - description: caller's role in this org (org.admin wins if multiple) - state: + title: name + requestId: type: string - title: state - description: ACTIVE | SUSPENDED - title: OrgMembership + title: request_id + confirmDeviceAttachment: + type: boolean + title: confirm_device_attachment + description: |- + When the device is absent, the VM must already have completed its normal + stop operation. This RPC never stops, starts or restarts a VM itself. + title: EnableEnhancedMonitoringRequest additionalProperties: false - aes.iam.v1.PendingInvite: + aes.monitoring.v1.EnableEnhancedMonitoringResponse: type: object properties: - id: - type: string - title: id - organizationName: + monitoring: + title: monitoring + $ref: '#/components/schemas/aes.monitoring.v1.EnhancedMonitoring' + title: EnableEnhancedMonitoringResponse + additionalProperties: false + aes.monitoring.v1.EnhancedMonitoring: + type: object + properties: + name: type: string - title: organization_name - email: + title: name + installationId: type: string - title: email - role: + title: installation_id + resourceId: type: string - title: role - description: Customer-facing role label (admin / editor / viewer). - displayName: + title: resource_id + status: type: string - title: display_name - inviterPrincipal: + title: status + description: DISABLED, AWAITING_INSTALLATION, CONNECTED, STALE, REVOKED, UNSUPPORTED. + deviceReady: + type: boolean + title: device_ready + restartRequired: + type: boolean + title: restart_required + collectorVersion: type: string - title: inviter_principal - description: Resource name of the org admin who issued the invite. - expiresAtUnix: + title: collector_version + capabilities: + type: array + items: + type: string + title: capabilities + lastSeenAtUnix: type: - integer - string - title: expires_at_unix + title: last_seen_at_unix format: int64 - createTimeUnix: + revokedAtUnix: type: - integer - string - title: create_time_unix + title: revoked_at_unix format: int64 - title: PendingInvite + configurationJson: + type: string + title: configuration_json + description: |- + Public installation identity, not a bearer credential. Requires the trusted + VMI-bound collection path; copying this configuration grants no authority. + runtimeState: + type: string + title: runtime_state + title: EnhancedMonitoring additionalProperties: false - description: |- - PendingInvite is the unaccepted-invite shape surfaced to org admins. accept_token is - intentionally omitted — the original recipient of InviteOrgMember has it; the list view - is for resend (re-invite) + revoke, not token disclosure. - aes.iam.v1.RegenerateRecoveryCodesRequest: + aes.monitoring.v1.GetDestinationTestRequest: type: object properties: - totpCode: + projectName: type: string - title: totp_code - description: 6-digit TOTP code from the caller's authenticator (proves possession before rotating codes). - title: RegenerateRecoveryCodesRequest + title: project_name + id: + type: string + title: id + title: GetDestinationTestRequest additionalProperties: false - aes.iam.v1.RegenerateRecoveryCodesResponse: + aes.monitoring.v1.GetDestinationTestResponse: type: object properties: - recoveryCodes: - type: array - items: - type: string - title: recovery_codes - description: Fresh single-use recovery codes; the previous set is invalidated. - title: RegenerateRecoveryCodesResponse + test: + title: test + $ref: '#/components/schemas/aes.monitoring.v1.DestinationTest' + title: GetDestinationTestResponse additionalProperties: false - aes.iam.v1.RemoveOrgMemberRequest: + aes.monitoring.v1.GetEnhancedMonitoringRequest: type: object properties: - organizationName: + name: type: string - title: organization_name - principal: + title: name + title: GetEnhancedMonitoringRequest + additionalProperties: false + aes.monitoring.v1.GetEnhancedMonitoringResponse: + type: object + properties: + monitoring: + title: monitoring + $ref: '#/components/schemas/aes.monitoring.v1.EnhancedMonitoring' + title: GetEnhancedMonitoringResponse + additionalProperties: false + aes.monitoring.v1.GetIncidentRequest: + type: object + properties: + projectName: type: string - title: principal - title: RemoveOrgMemberRequest + title: project_name + id: + type: string + title: id + pageToken: + type: string + title: page_token + description: Cursor for older transitions; each page includes up to 50 transitions and their deliveries. + title: GetIncidentRequest additionalProperties: false - aes.iam.v1.RemoveOrgMemberResponse: + aes.monitoring.v1.GetIncidentResponse: type: object - title: RemoveOrgMemberResponse + properties: + incident: + title: incident + $ref: '#/components/schemas/aes.monitoring.v1.Incident' + transitions: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.IncidentTransition' + title: transitions + deliveries: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.IncidentDelivery' + title: deliveries + nextPageToken: + type: string + title: next_page_token + title: GetIncidentResponse additionalProperties: false - aes.iam.v1.RequestEmailChangeRequest: + aes.monitoring.v1.GetIncidentSummaryRequest: type: object properties: - newEmail: + projectName: type: string - title: new_email - description: New email address. Must be a valid email + not already in use by another active user. - title: RequestEmailChangeRequest + title: project_name + title: GetIncidentSummaryRequest additionalProperties: false - aes.iam.v1.RequestEmailChangeResponse: + aes.monitoring.v1.GetIncidentSummaryResponse: type: object - title: RequestEmailChangeResponse + properties: + openCount: + type: integer + title: open_count + format: int32 + criticalCount: + type: integer + title: critical_count + format: int32 + incidents: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.Incident' + title: incidents + description: At most five recent open incidents. Reading never acknowledges or resolves them. + title: GetIncidentSummaryResponse additionalProperties: false - aes.iam.v1.RequestPasswordResetRequest: + aes.monitoring.v1.Incident: type: object properties: - email: + id: type: string - title: email - title: RequestPasswordResetRequest + title: id + projectName: + type: string + title: project_name + ruleId: + type: string + title: rule_id + ruleVersion: + type: + - integer + - string + title: rule_version + format: int64 + vmName: + type: string + title: vm_name + state: + type: string + title: state + description: OPEN, RECOVERED, or RETIRED. Acknowledgement does not resolve an incident. + openedAtUnix: + type: + - integer + - string + title: opened_at_unix + format: int64 + closedAtUnix: + type: + - integer + - string + title: closed_at_unix + format: int64 + closeReason: + type: string + title: close_reason + acknowledgedBy: + type: string + title: acknowledged_by + acknowledgedAtUnix: + type: + - integer + - string + title: acknowledged_at_unix + format: int64 + snoozedUntilUnix: + type: + - integer + - string + title: snoozed_until_unix + format: int64 + version: + type: + - integer + - string + title: version + format: int64 + snapshot: + title: snapshot + $ref: '#/components/schemas/aes.monitoring.v1.IncidentSnapshot' + evaluationHealth: + type: string + title: evaluation_health + description: Current evaluation health, independent of the incident's lifecycle. + vmDisplayName: + type: string + title: vm_display_name + description: Current hostname only when the immutable resource still matches this incident. + title: Incident additionalProperties: false - aes.iam.v1.RequestPasswordResetResponse: + aes.monitoring.v1.IncidentDelivery: type: object properties: - ok: - type: boolean - title: ok - description: |- - Always true. The RPC never reveals whether the email matched a user — that would be an - account-enumeration oracle. Caller's UX: "If that email is on file, we've sent a reset - link." - title: RequestPasswordResetResponse + id: + type: string + title: id + transitionId: + type: string + title: transition_id + destinationName: + type: string + title: destination_name + state: + type: string + title: state + attemptCount: + type: integer + title: attempt_count + format: int32 + createTimeUnix: + type: + - integer + - string + title: create_time_unix + format: int64 + completedAtUnix: + type: + - integer + - string + title: completed_at_unix + format: int64 + lastError: + type: string + title: last_error + title: IncidentDelivery additionalProperties: false - aes.iam.v1.ResetPasswordRequest: + aes.monitoring.v1.IncidentSnapshot: type: object properties: - token: + ruleName: type: string - title: token - description: Token from the reset email (plaintext; server hashes it for lookup). - newPassword: + title: rule_name + metricId: type: string - title: new_password - title: ResetPasswordRequest + title: metric_id + operator: + type: string + title: operator + threshold: + type: number + title: threshold + format: double + sustainedSeconds: + type: integer + title: sustained_seconds + format: int32 + severity: + type: string + title: severity + value: + type: + - number + - "null" + title: value + format: double + datacenterName: + type: string + title: datacenter_name + observedAtUnix: + type: + - integer + - string + title: observed_at_unix + format: int64 + title: IncidentSnapshot additionalProperties: false - aes.iam.v1.ResetPasswordResponse: + aes.monitoring.v1.IncidentTransition: type: object properties: + id: + type: string + title: id + kind: + type: string + title: kind + createTimeUnix: + type: + - integer + - string + title: create_time_unix + format: int64 principal: type: string title: principal - description: |- - The principal whose password was reset, so the UI can show "Reset successful — sign in - as alice@example.com". - title: ResetPasswordResponse + snapshot: + title: snapshot + $ref: '#/components/schemas/aes.monitoring.v1.IncidentSnapshot' + title: IncidentTransition additionalProperties: false - aes.iam.v1.RevokeAllOtherSessionsRequest: + aes.monitoring.v1.ListAlertDestinationCandidatesRequest: type: object - title: RevokeAllOtherSessionsRequest + properties: + projectName: + type: string + title: project_name + kind: + type: string + title: kind + search: + type: string + title: search + pageToken: + type: string + title: page_token + title: ListAlertDestinationCandidatesRequest additionalProperties: false - aes.iam.v1.RevokeAllOtherSessionsResponse: + aes.monitoring.v1.ListAlertDestinationCandidatesResponse: type: object properties: - revokedCount: - type: integer - title: revoked_count - format: int32 - description: Number of sessions revoked (excludes the calling session). - title: RevokeAllOtherSessionsResponse + candidates: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.AlertDestinationCandidate' + title: candidates + nextPageToken: + type: string + title: next_page_token + title: ListAlertDestinationCandidatesResponse additionalProperties: false - aes.iam.v1.RevokeApiKeyRequest: + aes.monitoring.v1.ListAlertDestinationsRequest: type: object properties: - name: + projectName: type: string - title: name - description: The id from ListApiKeys / CreateApiKey responses. Resource name api-keys/ (renamed from id in proto audit) - title: RevokeApiKeyRequest + title: project_name + title: ListAlertDestinationsRequest additionalProperties: false - aes.iam.v1.RevokeApiKeyResponse: + aes.monitoring.v1.ListAlertDestinationsResponse: type: object - title: RevokeApiKeyResponse + properties: + destinations: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.AlertDestination' + title: destinations + limit: + type: integer + title: limit + format: int32 + callerPrincipal: + type: string + title: caller_principal + emailAvailable: + type: boolean + title: email_available + webhookAvailable: + type: boolean + title: webhook_available + title: ListAlertDestinationsResponse additionalProperties: false - aes.iam.v1.RevokeInviteRequest: + aes.monitoring.v1.ListAlertInstancesRequest: type: object properties: - organizationName: + projectName: type: string - title: organization_name - inviteId: + title: project_name + ruleId: type: string - title: invite_id - description: The invite id from ListPendingInvites. - title: RevokeInviteRequest - additionalProperties: false - aes.iam.v1.RevokeInviteResponse: - type: object - title: RevokeInviteResponse + title: rule_id + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + title: ListAlertInstancesRequest additionalProperties: false - aes.iam.v1.RevokeMFADeviceRequest: + aes.monitoring.v1.ListAlertInstancesResponse: type: object properties: - name: + instances: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.AlertInstance' + title: instances + nextPageToken: type: string - title: name - description: Resource name mfa-devices/ (renamed from device_id in proto audit) - title: RevokeMFADeviceRequest - additionalProperties: false - aes.iam.v1.RevokeMFADeviceResponse: - type: object - title: RevokeMFADeviceResponse + title: next_page_token + title: ListAlertInstancesResponse additionalProperties: false - aes.iam.v1.RevokeSessionRequest: + aes.monitoring.v1.ListAlertRulesRequest: type: object properties: - name: + projectName: type: string - title: name - description: Resource name sessions/ (renamed from session_id in proto audit) - title: RevokeSessionRequest + title: project_name + title: ListAlertRulesRequest additionalProperties: false - aes.iam.v1.RevokeSessionResponse: + aes.monitoring.v1.ListAlertRulesResponse: type: object - title: RevokeSessionResponse + properties: + rules: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.AlertRule' + title: rules + ruleLimit: + type: integer + title: rule_limit + format: int32 + evaluatedInstanceLimit: + type: integer + title: evaluated_instance_limit + format: int32 + canManage: + type: boolean + title: can_manage + title: ListAlertRulesResponse additionalProperties: false - aes.iam.v1.RotateApiKeyRequest: + aes.monitoring.v1.ListIncidentsRequest: type: object properties: - keyPrefix: + projectName: type: string - title: key_prefix - description: The key prefix (first ~12 chars of the original secret) of the key being rotated. - displayName: + title: project_name + state: type: string - title: display_name - description: Optional override for the new key's display name; defaults to the rotated key's name. - title: RotateApiKeyRequest - additionalProperties: false - aes.iam.v1.RotateApiKeyResponse: - type: object - properties: - newApiKey: - title: new_api_key - $ref: '#/components/schemas/aes.iam.v1.ApiKey' - newSecret: + title: state + description: Empty for all; otherwise OPEN, RECOVERED, or RETIRED. + vmName: type: string - title: new_secret - revokedKeyPrefix: + title: vm_name + pageSize: + type: integer + title: page_size + format: int32 + pageToken: type: string - title: revoked_key_prefix - description: The prefix of the key that was revoked. - title: RotateApiKeyResponse + title: page_token + title: ListIncidentsRequest additionalProperties: false - aes.iam.v1.Session: + aes.monitoring.v1.ListIncidentsResponse: type: object properties: - name: - type: string - title: name - description: Resource name `sessions/`. - principal: - type: string - title: principal - source: - type: string - title: source - description: '"oidc" | "signup" | "invite-accept" | "manual"' - ipAddress: - type: string - title: ip_address - userAgent: - type: string - title: user_agent - keyFingerprint: + incidents: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.Incident' + title: incidents + nextPageToken: type: string - title: key_fingerprint - description: |- - Last 6 chars of the SHA-256 of the API key this session is bound to. Doesn't expose the - key but lets the user correlate "current session" by matching the prefix shown in their - CLI / browser. - createTimeUnix: - type: - - integer - - string - title: create_time_unix - format: int64 - lastUsedAtUnix: - type: - - integer - - string - title: last_used_at_unix - format: int64 - expiresAtUnix: - type: - - integer - - string - title: expires_at_unix - format: int64 - isCurrent: - type: boolean - title: is_current - description: True for the session the caller is using right now. - title: Session + title: next_page_token + title: ListIncidentsResponse additionalProperties: false - aes.iam.v1.SetInitialPasswordRequest: + aes.monitoring.v1.ListMetricDescriptorsRequest: type: object properties: - newPassword: + projectName: type: string - title: new_password - description: New password. Same minimum-length rules as SignUp/ResetPassword. - title: SetInitialPasswordRequest + title: project_name + title: ListMetricDescriptorsRequest additionalProperties: false - aes.iam.v1.SetInitialPasswordResponse: + aes.monitoring.v1.ListMetricDescriptorsResponse: type: object - title: SetInitialPasswordResponse + properties: + metrics: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.MetricDescriptor' + title: metrics + retentionDays: + type: integer + title: retention_days + format: int32 + sampleIntervalSeconds: + type: integer + title: sample_interval_seconds + format: int32 + title: ListMetricDescriptorsResponse additionalProperties: false - aes.iam.v1.SetSessionDefaultProjectRequest: + aes.monitoring.v1.ListVMMonitoringRequest: type: object properties: projectName: type: string - title: project_name - description: |- - Resource name `projects/`. Must be one the caller has access to (we check via - RequireProjectRead). Empty string clears the default (sets api_keys.default_project - to NULL) — useful for "leave project" actions where the user no longer has access. - title: SetSessionDefaultProjectRequest + title: project_name + pageSize: + type: integer + title: page_size + format: int32 + pageToken: + type: string + title: page_token + search: + type: string + title: search + datacenterName: + type: string + title: datacenter_name + state: + type: string + title: state + inventoryOnly: + type: boolean + title: inventory_only + description: Record pickers can skip time-series queries. Status is then NOT_REQUESTED. + title: ListVMMonitoringRequest additionalProperties: false - aes.iam.v1.SetSessionDefaultProjectResponse: + aes.monitoring.v1.ListVMMonitoringResponse: type: object properties: - projectName: + vms: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.MonitoredVM' + title: vms + nextPageToken: type: string - title: project_name - description: |- - Echoes back what was set (or empty if cleared) so the client can update its cached - identity without a follow-up GetCallerIdentity call. - title: SetSessionDefaultProjectResponse + title: next_page_token + queryStatus: + type: string + title: query_status + title: ListVMMonitoringResponse additionalProperties: false - aes.iam.v1.SignUpRequest: + aes.monitoring.v1.MetricDescriptor: type: object properties: + id: + type: string + title: id displayName: type: string title: display_name - description: |- - Human-readable name for the tenant (becomes the org's display name). Required. - Customer-facing wording: "Company / organization name". - email: - type: string - title: email - description: |- - Email address. Required. Used to derive the principal slug and as the account's contact - address. When `password` is supplied, the server sends a Resend verification email and - returns SignUpResponse.verification_pending=true (no API key yet); the caller then calls - VerifyEmail with the token from the email. When `password` is empty, the legacy - closed-beta path runs (gated by METALHOST_ENABLE_PUBLIC_SIGNUP) and immediately mints the - API key — used by dev / staging / OIDC-only signups that don't store a password. - password: + unit: type: string - title: password - description: |- - Optional plaintext password. Length must be ≥ 8. Empty string falls through to the legacy - closed-beta path (no verification, no password stored). - fullName: + title: unit + description: type: string - title: full_name - description: |- - Full name of the signing-up user (becomes users.display_name). Optional; when empty the - server falls back to display_name (the company / org name). Surfacing this separately - lets the portal greet the user by their name ("Welcome back, Alice") instead of their - company name. Portal sign-up form should collect both. - attribution: - title: attribution - description: |- - Optional marketing attribution captured on the website at first visit. Stored on the - account at creation; never updated afterwards. - $ref: '#/components/schemas/aes.iam.v1.SignupAttribution' - turnstileToken: + title: description + source: type: string - title: turnstile_token - description: |- - Cloudflare Turnstile widget token. Required when the deployment has bot protection - enabled; safe to omit otherwise. - title: SignUpRequest + title: source + title: MetricDescriptor additionalProperties: false - aes.iam.v1.SignUpResponse: + aes.monitoring.v1.MetricQuality: type: object properties: - organizationName: + metricId: type: string - title: organization_name - description: The created organization (`organizations/{slug}`). Empty when verification_pending=true. - projectName: - type: string - title: project_name - description: The default project under the new org (`projects/{slug}-default`). Empty when pending. - principal: + title: metric_id + status: type: string - title: principal - description: The principal id (`users/{slug}`) that owns the new tenancy. Empty when pending. - apiKey: - title: api_key - description: |- - The minted API key + plaintext secret. Same one-shot semantics as CreateApiKey — the - secret is never retrievable again after this response. Nil when verification_pending=true. - $ref: '#/components/schemas/aes.iam.v1.ApiKey' - secret: + title: status + description: AVAILABLE, STALE, AWAITING_DATA, UNSUPPORTED, or ERROR. + observedAtUnix: + type: + - integer + - string + title: observed_at_unix + format: int64 + description: type: string - title: secret - verificationPending: - type: boolean - title: verification_pending - description: |- - True when the server sent a verification email and is waiting for VerifyEmail. The - organization / user / API key fields above are empty in this case. - title: SignUpResponse + title: description + title: MetricQuality additionalProperties: false - aes.iam.v1.SignupAttribution: + aes.monitoring.v1.MonitoredVM: type: object properties: - utmSource: - type: string - title: utm_source - utmMedium: - type: string - title: utm_medium - utmCampaign: - type: string - title: utm_campaign - utmTerm: - type: string - title: utm_term - utmContent: + name: type: string - title: utm_content - gclid: + title: name + displayName: type: string - title: gclid - description: Google Ads click ID. - rdtCid: + title: display_name + datacenterName: type: string - title: rdt_cid - description: Reddit Ads click ID. - landingPage: + title: datacenter_name + state: type: string - title: landing_page - description: First page visited (path + query). - referrer: + title: state + collectionStatus: type: string - title: referrer - description: document.referrer at first visit. - firstTouchAtUnix: + title: collection_status + description: AVAILABLE, STALE, AWAITING_DATA, or ERROR; never infer VM health from this. + observedAtUnix: type: - integer - string - title: first_touch_at_unix + title: observed_at_unix format: int64 - description: Unix seconds of the first visit. - title: SignupAttribution + enhancedStatus: + type: string + title: enhanced_status + cpuUtilizationPercent: + type: + - number + - "null" + title: cpu_utilization_percent + format: double + memoryUsedBytes: + type: + - number + - "null" + title: memory_used_bytes + format: double + filesystemUsedPercent: + type: + - number + - "null" + title: filesystem_used_percent + format: double + title: MonitoredVM additionalProperties: false - description: |- - Marketing attribution for a new account: UTM parameters and ad click IDs captured on the - website at first visit. All fields optional. - aes.iam.v1.StartOidcLoginRequest: + aes.monitoring.v1.PreviewAlertRuleRequest: type: object properties: - providerName: - type: string - title: provider_name - description: Provider name (`oidc-providers/{slug}`) — a platform-configured OIDC provider slug. - redirectUri: + projectName: type: string - title: redirect_uri - description: Where the IdP should redirect after auth — typically the gateway's /oauth/callback. - attribution: - title: attribution - description: |- - Optional marketing attribution captured on the website at first visit. Applied only when - this sign-in creates a brand-new account; ignored on sign-ins to existing accounts. - $ref: '#/components/schemas/aes.iam.v1.SignupAttribution' - title: StartOidcLoginRequest + title: project_name + spec: + title: spec + $ref: '#/components/schemas/aes.monitoring.v1.AlertRuleSpec' + title: PreviewAlertRuleRequest additionalProperties: false - aes.iam.v1.StartOidcLoginResponse: + aes.monitoring.v1.PreviewAlertRuleResponse: type: object properties: - authorizeUrl: + matchedResourceCount: + type: integer + title: matched_resource_count + format: int32 + resources: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.AlertPreviewResource' + title: resources + sampleOnly: + type: boolean + title: sample_only + queryStatus: type: string - title: authorize_url - description: |- - Browser navigates here. Metalhost-generated state token is embedded; gateway preserves it - through to CompleteOidcLogin so we can validate replay. - state: + title: query_status + explanation: type: string - title: state - title: StartOidcLoginResponse + title: explanation + title: PreviewAlertRuleResponse additionalProperties: false - aes.iam.v1.SubmitMFAChallengeRequest: + aes.monitoring.v1.QueryVMMonitoringRequest: type: object properties: - challengeToken: - type: string - title: challenge_token - description: Opaque challenge token returned by Login or CompleteOidcLogin. - totpCode: - type: string - title: totp_code - description: |- - 6-digit TOTP code from the caller's authenticator app. One of totp_code OR recovery_code - must be set; if both are provided, totp_code wins. - recoveryCode: + name: type: string - title: recovery_code - description: |- - Single-use recovery code (16 chars, hex). Consumed on use. Provided when the caller has - lost their authenticator device. - title: SubmitMFAChallengeRequest + title: name + metricIds: + type: array + items: + type: string + title: metric_ids + startTimeUnix: + type: + - integer + - string + title: start_time_unix + format: int64 + endTimeUnix: + type: + - integer + - string + title: end_time_unix + format: int64 + stepSeconds: + type: integer + title: step_seconds + format: int32 + title: QueryVMMonitoringRequest additionalProperties: false - aes.iam.v1.SubmitMFAChallengeResponse: + aes.monitoring.v1.QueryVMMonitoringResponse: type: object properties: - principal: - type: string - title: principal - description: Same shape as LoginResponse's success branch. - apiKey: - title: api_key - $ref: '#/components/schemas/aes.iam.v1.ApiKey' - secret: - type: string - title: secret - usedRecoveryCode: - type: boolean - title: used_recovery_code - description: |- - True when the caller used a recovery code (so the SPA can prompt them to re-enroll a - fresh device — recovery codes are one-shot and don't re-mint). - title: SubmitMFAChallengeResponse + series: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.Series' + title: series + quality: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.MetricQuality' + title: quality + startTimeUnix: + type: + - integer + - string + title: start_time_unix + format: int64 + endTimeUnix: + type: + - integer + - string + title: end_time_unix + format: int64 + stepSeconds: + type: integer + title: step_seconds + format: int32 + title: QueryVMMonitoringResponse additionalProperties: false - aes.iam.v1.UpdateOrgMemberRoleRequest: + aes.monitoring.v1.RequestDestinationVerificationRequest: type: object properties: - organizationName: + projectName: type: string - title: organization_name - description: organizations/. - principal: + title: project_name + name: type: string - title: principal - description: Resource name of the user (`users/`). - role: + title: name + requestId: type: string - title: role - description: 'Same role names as InviteOrgMember: viewer / editor / admin.' - title: UpdateOrgMemberRoleRequest + title: request_id + title: RequestDestinationVerificationRequest additionalProperties: false - aes.iam.v1.UpdateOrgMemberRoleResponse: + aes.monitoring.v1.RequestDestinationVerificationResponse: type: object properties: - member: - title: member - $ref: '#/components/schemas/aes.iam.v1.OrgMember' - title: UpdateOrgMemberRoleResponse + verificationId: + type: string + title: verification_id + title: RequestDestinationVerificationResponse additionalProperties: false - aes.iam.v1.UpdateUserRequest: + aes.monitoring.v1.RevokeEnhancedMonitoringRequest: type: object properties: name: type: string title: name - displayName: - type: - - string - - "null" - title: display_name - description: Only the supplied optional fields are updated. Other fields are preserved. - title: UpdateUserRequest + installationId: + type: string + title: installation_id + description: Compare-and-revoke prevents an old dialog revoking a replacement install. + title: RevokeEnhancedMonitoringRequest additionalProperties: false - aes.iam.v1.UpdateUserResponse: + aes.monitoring.v1.RevokeEnhancedMonitoringResponse: + type: object + title: RevokeEnhancedMonitoringResponse + additionalProperties: false + aes.monitoring.v1.Sample: type: object properties: - user: - title: user - $ref: '#/components/schemas/aes.iam.v1.User' - title: UpdateUserResponse + timestampUnix: + type: + - integer + - string + title: timestamp_unix + format: int64 + value: + type: number + title: value + format: double + title: Sample additionalProperties: false - aes.iam.v1.User: + aes.monitoring.v1.SaveAlertDestinationRequest: type: object properties: - name: - type: string - title: name - email: - type: string - title: email - displayName: - type: string - title: display_name - state: + destination: + title: destination + $ref: '#/components/schemas/aes.monitoring.v1.AlertDestination' + requestId: type: string - title: state - description: ACTIVE / DISABLED / LOCKED — same vocabulary as the users table state column. - mfaEnrolled: - type: boolean - title: mfa_enrolled - description: |- - True when the user has at least one VERIFIED MFA device. Tells the UI whether to show - the "Enable MFA" prompt or the "Manage MFA" link. - passwordSet: - type: boolean - title: password_set - description: |- - True when password_hash is non-empty (user can log in with email + password). False for - OIDC-only signups. - createTimeUnix: + title: request_id + expectedVersion: type: - integer - string - title: create_time_unix + title: expected_version format: int64 - title: User + description: Zero for create; otherwise the version last read. + title: SaveAlertDestinationRequest additionalProperties: false - description: |- - User is the profile shape returned by GetUser / UpdateUser. Read-only on most fields; only - display_name is mutable via UpdateUser. Email changes go through RequestEmailChange. - aes.iam.v1.ValidateApiKeyRequest: + aes.monitoring.v1.SaveAlertDestinationResponse: type: object properties: - rawKey: - type: string - title: raw_key - title: ValidateApiKeyRequest + destination: + title: destination + $ref: '#/components/schemas/aes.monitoring.v1.AlertDestination' + title: SaveAlertDestinationResponse additionalProperties: false - aes.iam.v1.ValidateApiKeyResponse: + aes.monitoring.v1.SaveAlertRuleRequest: type: object properties: - principal: + projectName: type: string - title: principal - description: Stable principal id, e.g. `users/alice` or `serviceAccounts/bot`. - defaultProject: + title: project_name + id: type: string - title: default_project - description: Optional default project for this key (UX helper until full authz). - title: ValidateApiKeyResponse + title: id + description: Client-generated UUID, retained on retry. Never reused after deletion. + spec: + title: spec + $ref: '#/components/schemas/aes.monitoring.v1.AlertRuleSpec' + expectedVersion: + type: + - integer + - string + title: expected_version + format: int64 + description: Zero for create; otherwise the last version read. + requestId: + type: string + title: request_id + description: Client-generated UUID identifying this mutation; reuse on an ambiguous retry. + title: SaveAlertRuleRequest additionalProperties: false - aes.iam.v1.ValidateOidcTokenRequest: + aes.monitoring.v1.SaveAlertRuleResponse: type: object properties: - accessToken: - type: string - title: access_token - description: Bearer token without the "Bearer " prefix, or full Authorization header contents. - title: ValidateOidcTokenRequest + rule: + title: rule + $ref: '#/components/schemas/aes.monitoring.v1.AlertRule' + title: SaveAlertRuleResponse additionalProperties: false - aes.iam.v1.ValidateOidcTokenResponse: + aes.monitoring.v1.Series: type: object properties: - principal: - type: string - title: principal - defaultProject: + metricId: type: string - title: default_project - claims: + title: metric_id + dimensions: type: object - title: claims + title: dimensions additionalProperties: type: string title: value - title: ValidateOidcTokenResponse + samples: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.Sample' + title: samples + title: Series additionalProperties: false - aes.iam.v1.ValidateOidcTokenResponse.ClaimsEntry: + aes.monitoring.v1.Series.DimensionsEntry: type: object properties: key: @@ -11990,65 +15529,88 @@ components: value: type: string title: value - title: ClaimsEntry + title: DimensionsEntry additionalProperties: false - aes.iam.v1.VerifyEmailRequest: + aes.monitoring.v1.TestAlertDestinationRequest: type: object properties: - token: + projectName: type: string - title: token - description: The token from the verification email link. - title: VerifyEmailRequest + title: project_name + destinationName: + type: string + title: destination_name + requestId: + type: string + title: request_id + description: Keep this UUID on retry; a new ID deliberately requests another test. + title: TestAlertDestinationRequest additionalProperties: false - aes.iam.v1.VerifyEmailResponse: + aes.monitoring.v1.TestAlertDestinationResponse: + type: object + properties: + test: + title: test + $ref: '#/components/schemas/aes.monitoring.v1.DestinationTest' + title: TestAlertDestinationResponse + additionalProperties: false + aes.monitoring.v1.UpdateIncidentRequest: type: object properties: - organizationName: - type: string - title: organization_name projectName: type: string title: project_name - principal: + id: type: string - title: principal - apiKey: - title: api_key - $ref: '#/components/schemas/aes.iam.v1.ApiKey' - secret: + title: id + expectedVersion: + type: + - integer + - string + title: expected_version + format: int64 + requestId: type: string - title: secret - title: VerifyEmailResponse + title: request_id + action: + type: string + title: action + description: ACKNOWLEDGE, SNOOZE, or UNSNOOZE. These never change OPEN to RECOVERED. + durationSeconds: + type: integer + title: duration_seconds + format: int32 + description: 'SNOOZE only: 900, 3600, 14400, or 86400 seconds.' + title: UpdateIncidentRequest additionalProperties: false - aes.iam.v1.VerifyMFAEnrollmentRequest: + aes.monitoring.v1.UpdateIncidentResponse: + type: object + properties: + incident: + title: incident + $ref: '#/components/schemas/aes.monitoring.v1.Incident' + title: UpdateIncidentResponse + additionalProperties: false + aes.monitoring.v1.VerifyAlertDestinationRequest: type: object properties: + projectName: + type: string + title: project_name name: type: string title: name - description: Resource name mfa-devices/ (renamed from device_id in proto audit) - totpCode: + verificationId: type: string - title: totp_code - description: 6-digit TOTP code from the authenticator app. - title: VerifyMFAEnrollmentRequest + title: verification_id + code: + type: string + title: code + title: VerifyAlertDestinationRequest additionalProperties: false - aes.iam.v1.VerifyMFAEnrollmentResponse: + aes.monitoring.v1.VerifyAlertDestinationResponse: type: object - properties: - device: - title: device - $ref: '#/components/schemas/aes.iam.v1.MFADevice' - recoveryCodes: - type: array - items: - type: string - title: recovery_codes - description: |- - One-shot recovery codes. Returned exactly once on first successful verification — store - these somewhere safe; each can be used once if the authenticator is lost. - title: VerifyMFAEnrollmentResponse + title: VerifyAlertDestinationResponse additionalProperties: false aes.network.v1.AddVmToSecurityGroupRequest: type: object @@ -14891,6 +18453,13 @@ components: type: string title: body description: Optional final customer-side message recorded before close. + requestId: + type: string + title: request_id + expectedUpdatedAt: + title: expected_updated_at + description: Reject closing when another participant has changed the ticket since it was read. + $ref: '#/components/schemas/google.protobuf.Timestamp' title: CloseTicketRequest additionalProperties: false aes.support.v1.CloseTicketResponse: @@ -14926,6 +18495,9 @@ components: items: $ref: '#/components/schemas/aes.support.v1.ResourceRef' title: resource_refs + requestId: + type: string + title: request_id title: CreateTicketRequest additionalProperties: false aes.support.v1.CreateTicketResponse: @@ -15005,6 +18577,13 @@ components: body: type: string title: body + reopen: + type: boolean + title: reopen + description: Explicit consent to reopen a closed conversation. There is no expiry window. + requestId: + type: string + title: request_id title: ReplyTicketRequest additionalProperties: false aes.support.v1.ReplyTicketResponse: @@ -15103,6 +18682,10 @@ components: escalatedAt: title: escalated_at $ref: '#/components/schemas/google.protobuf.Timestamp' + closedAt: + title: closed_at + description: Last closure time, preserved when the conversation is reopened. + $ref: '#/components/schemas/google.protobuf.Timestamp' title: Ticket additionalProperties: false aes.support.v1.TicketCategory: @@ -15181,12 +18764,7 @@ components: - TICKET_STATUS_PENDING_STAFF - TICKET_STATUS_RESOLVED - TICKET_STATUS_CLOSED - description: |- - Lifecycle states. PENDING_CUSTOMER means staff replied and we're waiting on the user; - PENDING_STAFF means the user replied and we owe them a response. RESOLVED is set by staff; - CLOSED is the terminal state — set when the customer - confirms or auto-closes after an inactivity window. Customer-side CloseTicket goes - directly to CLOSED. + description: CLOSED is the only finished state. RESOLVED remains a deprecated wire-compatible alias. aes.wallet.v1.ActivePromotion: type: object properties: @@ -16813,6 +20391,44 @@ components: title: next_page_token title: ListSubscriptionsResponse additionalProperties: false + aes.webhooks.v1.RotateSubscriptionSecretRequest: + type: object + properties: + name: + type: string + title: name + expectedSecretVersion: + type: + - integer + - string + title: expected_secret_version + format: int64 + requestId: + type: string + title: request_id + description: Stable UUID for recovery after a lost response. Retries never reveal secrets. + overlapSeconds: + type: integer + title: overlap_seconds + format: int32 + description: 0 immediately invalidates the old secret; maximum 86400 (24 hours). + title: RotateSubscriptionSecretRequest + additionalProperties: false + aes.webhooks.v1.RotateSubscriptionSecretResponse: + type: object + properties: + subscription: + title: subscription + $ref: '#/components/schemas/aes.webhooks.v1.Subscription' + secret: + type: string + title: secret + secretUnavailable: + type: boolean + title: secret_unavailable + description: A committed request was retried. Recover by deliberately rotating again. + title: RotateSubscriptionSecretResponse + additionalProperties: false aes.webhooks.v1.Subscription: type: object properties: @@ -16857,6 +20473,19 @@ components: type: string title: secret_prefix description: Per-subscription identifier returned via the X-Metalhost-Subscription header in deliveries. + secretVersion: + type: + - integer + - string + title: secret_version + format: int64 + previousSecretExpiresAtUnix: + type: + - integer + - string + title: previous_secret_expires_at_unix + format: int64 + description: Zero when no overlap exists. Expired previous secrets are never used to sign. title: Subscription additionalProperties: false aes.webhooks.v1.UpdateSubscriptionRequest: @@ -17312,6 +20941,7 @@ tags: removed entirely; customers paste cloud-init YAML directly on the VM create form. - name: aes.health.v1.HealthService description: Liveness/readiness for load balancers and ops. + - name: aes.iam.v1.AutomationService - name: aes.iam.v1.IamService description: |- IamService holds identity primitives for customer orgs and projects. @@ -17319,6 +20949,8 @@ tags: The public API intentionally omits token-validation helpers, per-button permission pre-checks, and deployment-metadata endpoints — callers rely on request-time PermissionDenied instead. ListOrgMembers covers single-member lookups. + - name: aes.monitoring.v1.AlertService + - name: aes.monitoring.v1.MonitoringService - name: aes.network.v1.NetworkService description: |- NetworkService manages tenant-facing networks for tenant-private connectivity. Each Network diff --git a/metalhost/monitoring.go b/metalhost/monitoring.go new file mode 100644 index 0000000..d5d0b54 --- /dev/null +++ b/metalhost/monitoring.go @@ -0,0 +1,40 @@ +package metalhost + +import ( + "errors" + "net/url" + "regexp" + "strings" +) + +// MonitoringURLs are project-scoped authenticated HTTP endpoints, not Connect RPCs. +type MonitoringURLs struct { + Prometheus string + Metrics string + ScrapeTargets string +} + +var projectComponent = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9_.-]{0,127}$`) + +// MonitoringEndpoints validates a canonical project name and an API origin. +// Plain HTTP is supported only on loopback for local development. A returned URL +// does not grant access: use an authorized project-scoped monitoring.read key. +func (c Config) MonitoringEndpoints(project string) (MonitoringURLs, error) { + endpoint, err := url.Parse(c.BaseURL()) + if err != nil || endpoint.Host == "" || endpoint.User != nil || endpoint.RawQuery != "" || endpoint.ForceQuery || endpoint.Fragment != "" || (endpoint.Path != "" && endpoint.Path != "/") { + return MonitoringURLs{}, errors.New("monitoring requires an API origin without credentials, path, query, or fragment") + } + loopback := endpoint.Hostname() == "localhost" || endpoint.Hostname() == "127.0.0.1" || endpoint.Hostname() == "::1" + if endpoint.Scheme != "https" && !(endpoint.Scheme == "http" && loopback) { + return MonitoringURLs{}, errors.New("monitoring requires HTTPS, except for a local loopback API") + } + parts := strings.Split(project, "/") + valid := len(parts) == 2 && parts[0] == "projects" && projectComponent.MatchString(parts[1]) + valid = valid || (len(parts) == 4 && parts[0] == "organizations" && parts[2] == "projects" && projectComponent.MatchString(parts[1]) && projectComponent.MatchString(parts[3])) + if !valid { + return MonitoringURLs{}, errors.New("canonical projects/{id} or organizations/{org}/projects/{id} name required") + } + endpoint.Path = "/v1/monitoring/" + project + base := endpoint.String() + return MonitoringURLs{Prometheus: base + "/prometheus", Metrics: base + "/metrics", ScrapeTargets: base + "/scrape-targets"}, nil +} diff --git a/metalhost/monitoring_test.go b/metalhost/monitoring_test.go new file mode 100644 index 0000000..7d3741f --- /dev/null +++ b/metalhost/monitoring_test.go @@ -0,0 +1,27 @@ +package metalhost + +import "testing" + +func TestMonitoringEndpoints(t *testing.T) { + for _, project := range []string{"projects/example", "organizations/example/projects/default"} { + urls, err := (Config{Endpoint: " https://api.metalhost.net/ "}).MonitoringEndpoints(project) + if err != nil || urls.Prometheus != "https://api.metalhost.net/v1/monitoring/"+project+"/prometheus" || urls.Metrics != "https://api.metalhost.net/v1/monitoring/"+project+"/metrics" || urls.ScrapeTargets != "https://api.metalhost.net/v1/monitoring/"+project+"/scrape-targets" { + t.Fatalf("URLs: %+v %v", urls, err) + } + } + for _, project := range []string{"example", "projects/..", "projects/%2e%2e", "projects/a/b", "projects/a?tenant=b", "organizations/a/projects/", "projects/a\n"} { + if _, err := (Config{Endpoint: "https://api.metalhost.net"}).MonitoringEndpoints(project); err == nil { + t.Fatalf("accepted invalid project %q", project) + } + } + for _, endpoint := range []string{"http://api.metalhost.net", "https://key@api.metalhost.net", "https://api.metalhost.net?key=x", "https://api.metalhost.net#token", "https://api.metalhost.net/path", "ftp://localhost", "https://api.metalhost.net?"} { + if _, err := (Config{Endpoint: endpoint}).MonitoringEndpoints("projects/a"); err == nil { + t.Fatalf("accepted invalid API origin %q", endpoint) + } + } + for _, endpoint := range []string{"http://127.0.0.1:8080", "http://[::1]:8080", "http://localhost:8080"} { + if _, err := (Config{Endpoint: endpoint}).MonitoringEndpoints("projects/a"); err != nil { + t.Fatal(err) + } + } +} diff --git a/metalhost/webhook.go b/metalhost/webhook.go new file mode 100644 index 0000000..57ccc30 --- /dev/null +++ b/metalhost/webhook.go @@ -0,0 +1,84 @@ +package metalhost + +import ( + "crypto/hmac" + "crypto/sha256" + "encoding/hex" + "errors" + "net/http" + "regexp" + "strconv" + "strings" + "time" +) + +// WebhookIdentity is returned only after signature and replay-window validation. +// Deduplicate DeliveryID durably. AttemptID changes on each delivery retry. +type WebhookIdentity struct { + DeliveryID string + AttemptID string + SignedAt time.Time +} + +var webhookAttempt = regexp.MustCompile(`^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$`) +var webhookDelivery = regexp.MustCompile(`^[a-zA-Z0-9_/-]{1,512}$`) + +// VerifyWebhook verifies the timestamped V2 signature over the exact raw body. +// Bound request bodies before reading them (maximum 1 MiB here), pass a trusted +// clock, and persist deduplication before acknowledging the delivery. Signatures +// alone do not prevent repeated delivery within the five-minute replay window. +// Either overlapping secret is accepted if its signature is present; the legacy +// untimestamped signature header is deliberately never used as a fallback. +func VerifyWebhook(headers http.Header, body []byte, secret string, now time.Time) (WebhookIdentity, error) { + invalid := func() (WebhookIdentity, error) { + return WebhookIdentity{}, errors.New("invalid or expired webhook signature") + } + if len(body) > 1<<20 || len(secret) < 32 || len(secret) > 256 || now.IsZero() { + return invalid() + } + one := func(name string) string { + values := headers.Values(name) + if len(values) != 1 { + return "" + } + return values[0] + } + delivery, attempt, signature := one("X-Metalhost-Delivery"), one("X-Metalhost-Attempt"), one("X-Metalhost-Signature-V2") + if !webhookDelivery.MatchString(delivery) || !webhookAttempt.MatchString(attempt) || len(signature) > 1024 { + return invalid() + } + fields := strings.Split(signature, ",") + if len(fields) < 2 || len(fields) > 3 || !strings.HasPrefix(fields[0], "t=") { + return invalid() + } + timestamp := strings.TrimPrefix(fields[0], "t=") + seconds, err := strconv.ParseInt(timestamp, 10, 64) + if err != nil || seconds <= 0 || strconv.FormatInt(seconds, 10) != timestamp { + return invalid() + } + signedAt := time.Unix(seconds, 0) + age := now.Sub(signedAt) + if age > 5*time.Minute || age < -5*time.Minute { + return invalid() + } + mac := hmac.New(sha256.New, []byte(secret)) + _, _ = mac.Write([]byte(timestamp + "." + delivery + "." + attempt + ".")) + _, _ = mac.Write(body) + expected := mac.Sum(nil) + matched := false + for _, field := range fields[1:] { + if !strings.HasPrefix(field, "v2=") { + return invalid() + } + supplied, err := hex.DecodeString(strings.TrimPrefix(field, "v2=")) + if err != nil || len(supplied) != sha256.Size { + return invalid() + } + valid := hmac.Equal(expected, supplied) + matched = matched || valid + } + if !matched { + return invalid() + } + return WebhookIdentity{DeliveryID: delivery, AttemptID: attempt, SignedAt: signedAt}, nil +} diff --git a/metalhost/webhook_test.go b/metalhost/webhook_test.go new file mode 100644 index 0000000..d2c0d6b --- /dev/null +++ b/metalhost/webhook_test.go @@ -0,0 +1,61 @@ +package metalhost + +import ( + "crypto/hmac" + "crypto/sha256" + "encoding/hex" + "net/http" + "strconv" + "strings" + "testing" + "time" +) + +func TestVerifyWebhookRotationReplayAndTampering(t *testing.T) { + now := time.Unix(1789920000, 0) + secret, old := strings.Repeat("n", 40), strings.Repeat("o", 40) + body := []byte(`{"event_ids":["stable-event"]}`) + headers := make(http.Header) + headers.Set("X-Metalhost-Delivery", "group/stable-delivery") + headers.Set("X-Metalhost-Attempt", "00000000-0000-4000-8000-000000000001") + timestamp := strconv.FormatInt(now.Unix(), 10) + sign := func(key string) string { + mac := hmac.New(sha256.New, []byte(key)) + _, _ = mac.Write(append([]byte(timestamp+".group/stable-delivery.00000000-0000-4000-8000-000000000001."), body...)) + return hex.EncodeToString(mac.Sum(nil)) + } + headers.Set("X-Metalhost-Signature-V2", "t="+timestamp+",v2="+sign(secret)+",v2="+sign(old)) + for _, key := range []string{secret, old} { + identity, err := VerifyWebhook(headers, body, key, now) + if err != nil || identity.DeliveryID != "group/stable-delivery" || identity.AttemptID != "00000000-0000-4000-8000-000000000001" || !identity.SignedAt.Equal(now) { + t.Fatalf("overlap verification: %+v %v", identity, err) + } + } + for _, delta := range []time.Duration{6 * time.Minute, -6 * time.Minute} { + if _, err := VerifyWebhook(headers, body, secret, now.Add(delta)); err == nil { + t.Fatal("replay window ignored") + } + } + for _, field := range []string{"X-Metalhost-Delivery", "X-Metalhost-Attempt", "X-Metalhost-Signature-V2"} { + changed := headers.Clone() + changed.Set(field, "tampered") + if _, err := VerifyWebhook(changed, body, secret, now); err == nil { + t.Fatalf("accepted changed %s", field) + } + changed = headers.Clone() + changed.Add(field, headers.Get(field)) + if _, err := VerifyWebhook(changed, body, secret, now); err == nil { + t.Fatalf("accepted duplicate %s", field) + } + } + for _, raw := range [][]byte{[]byte(`{ "event_ids":["stable-event"]}`), make([]byte, (1<<20)+1)} { + if _, err := VerifyWebhook(headers, raw, secret, now); err == nil { + t.Fatal("accepted altered/oversized body") + } + } + headers.Del("X-Metalhost-Signature-V2") + headers.Set("X-Metalhost-Signature", "sha256="+sign(secret)) + if _, err := VerifyWebhook(headers, body, secret, now); err == nil { + t.Fatal("downgraded to legacy signature") + } +} diff --git a/proto/aes/iam/v1/automation.proto b/proto/aes/iam/v1/automation.proto new file mode 100644 index 0000000..7ec1bfc --- /dev/null +++ b/proto/aes/iam/v1/automation.proto @@ -0,0 +1,230 @@ +syntax = "proto3"; + +package aes.iam.v1; + +service AutomationService { + rpc ListCapabilities(ListCapabilitiesRequest) returns (ListCapabilitiesResponse); + rpc CreateServiceAccount(CreateServiceAccountRequest) returns (CreateServiceAccountResponse); + rpc GetServiceAccount(GetServiceAccountRequest) returns (GetServiceAccountResponse); + rpc ListServiceAccounts(ListServiceAccountsRequest) returns (ListServiceAccountsResponse); + rpc UpdateServiceAccount(UpdateServiceAccountRequest) returns (UpdateServiceAccountResponse); + rpc SetServiceAccountState(SetServiceAccountStateRequest) returns (SetServiceAccountStateResponse); + rpc DeleteServiceAccount(DeleteServiceAccountRequest) returns (DeleteServiceAccountResponse); + rpc CreateCredential(CreateCredentialRequest) returns (CreateCredentialResponse); + rpc ListCredentials(ListCredentialsRequest) returns (ListCredentialsResponse); + rpc RotateCredential(RotateCredentialRequest) returns (RotateCredentialResponse); + rpc RevokeCredential(RevokeCredentialRequest) returns (RevokeCredentialResponse); + rpc CreateGitHubTrust(CreateGitHubTrustRequest) returns (CreateGitHubTrustResponse); + rpc UpdateGitHubTrust(UpdateGitHubTrustRequest) returns (UpdateGitHubTrustResponse); + rpc ListGitHubTrusts(ListGitHubTrustsRequest) returns (ListGitHubTrustsResponse); + rpc SetGitHubTrustState(SetGitHubTrustStateRequest) returns (SetGitHubTrustStateResponse); + rpc DeleteGitHubTrust(DeleteGitHubTrustRequest) returns (DeleteGitHubTrustResponse); + rpc BeginGitHubSetup(BeginGitHubSetupRequest) returns (BeginGitHubSetupResponse); + rpc GetGitHubSetup(GetGitHubSetupRequest) returns (GetGitHubSetupResponse); + // Verifies claims for a pending setup; never issues a credential or creates trust. + rpc SubmitGitHubSetup(SubmitGitHubSetupRequest) returns (SubmitGitHubSetupResponse); + // Authenticates the signed GitHub assertion, not a Metalhost session. + rpc ExchangeGitHubToken(ExchangeGitHubTokenRequest) returns (ExchangeGitHubTokenResponse); +} + +message Capability { + string name = 1; + string display_name = 2; + string description = 3; +} +message ListCapabilitiesRequest {} +message ListCapabilitiesResponse { repeated Capability capabilities = 1; } + +message ServiceAccount { + string name = 1; + string project_name = 2; + string display_name = 3; + repeated string permissions = 4; + string state = 5; + int64 version = 6; + int64 create_time_unix = 7; +} +message CreateServiceAccountRequest { + string project_name = 1; + string display_name = 2; + repeated string permissions = 3; + string request_id = 4; +} +message CreateServiceAccountResponse { ServiceAccount service_account = 1; } +message GetServiceAccountRequest { string name = 1; } +message GetServiceAccountResponse { ServiceAccount service_account = 1; } +message ListServiceAccountsRequest { + string project_name = 1; + int32 page_size = 2; + string page_token = 3; +} +message ListServiceAccountsResponse { + repeated ServiceAccount service_accounts = 1; + string next_page_token = 2; +} +message UpdateServiceAccountRequest { + string name = 1; + string display_name = 2; + repeated string permissions = 3; + int64 expected_version = 4; +} +message UpdateServiceAccountResponse { ServiceAccount service_account = 1; } +message SetServiceAccountStateRequest { + string name = 1; + // ACTIVE or DISABLED; a customer cannot clear a security LOCKED state. + string state = 2; + int64 expected_version = 3; +} +message SetServiceAccountStateResponse { ServiceAccount service_account = 1; } +message DeleteServiceAccountRequest { + string name = 1; + int64 expected_version = 2; +} +message DeleteServiceAccountResponse {} + +message AutomationCredential { + string name = 1; + string principal = 2; + string project_name = 3; + string display_name = 4; + repeated string permissions = 5; + string kind = 6; + int64 create_time_unix = 7; + int64 expires_at_unix = 8; + int64 revoked_at_unix = 9; + int64 last_used_at_unix = 10; + int64 rotated_at_unix = 11; +} +message CreateCredentialRequest { + string project_name = 1; + // Empty issues a personal credential; service accounts require project admin. + string service_account = 2; + string display_name = 3; + repeated string permissions = 4; + // Zero selects 90 days; otherwise between 15 minutes and one year from now. + int64 expires_at_unix = 5; + string request_id = 6; +} +message CreateCredentialResponse { + AutomationCredential credential = 1; + // Returned once, never persisted in plaintext. + string secret = 2; + // A repeated request returns current metadata, never the original secret. + bool secret_unavailable = 3; +} +message ListCredentialsRequest { + string project_name = 1; + string service_account = 2; + int32 page_size = 3; + string page_token = 4; +} +message ListCredentialsResponse { + repeated AutomationCredential credentials = 1; + string next_page_token = 2; +} +message RotateCredentialRequest { + string name = 1; + // Zero revokes immediately; otherwise overlap is capped at 24h and old expiry. + int32 overlap_seconds = 2; + string request_id = 3; +} +message RotateCredentialResponse { + AutomationCredential credential = 1; + string secret = 2; + int64 previous_expires_at_unix = 3; + bool secret_unavailable = 4; +} +message RevokeCredentialRequest { string name = 1; } +message RevokeCredentialResponse {} + +message GitHubTrust { + string name = 1; + string project_name = 2; + string service_account = 3; + string display_name = 4; + string repository = 5; + string repository_id = 6; + string repository_owner_id = 7; + string subject = 8; + string ref = 9; + string environment = 10; + string workflow_ref = 11; + string job_workflow_ref = 12; + repeated string events = 13; + repeated string permissions = 14; + string state = 15; + int64 version = 16; + int64 create_time_unix = 17; + string audience = 18; +} +message CreateGitHubTrustRequest { + GitHubTrust trust = 1; + // Optional verified workflow discovery; confirmation is retry-safe by setup ID. + string setup_id = 2; + // Optional for older callers; supply a stable UUID for direct-create recovery. + string request_id = 3; +} +message CreateGitHubTrustResponse { GitHubTrust trust = 1; } +message UpdateGitHubTrustRequest { + string name = 1; + string display_name = 2; + repeated string permissions = 3; + int64 expected_version = 4; + string request_id = 5; +} +message UpdateGitHubTrustResponse { GitHubTrust trust = 1; } +message ListGitHubTrustsRequest { + string project_name = 1; + int32 page_size = 2; + string page_token = 3; +} +message ListGitHubTrustsResponse { + repeated GitHubTrust trusts = 1; + string next_page_token = 2; +} +message SetGitHubTrustStateRequest { + string name = 1; + string state = 2; + int64 expected_version = 3; +} +message SetGitHubTrustStateResponse { GitHubTrust trust = 1; } +message DeleteGitHubTrustRequest { + string name = 1; + int64 expected_version = 2; +} +message DeleteGitHubTrustResponse {} +message ExchangeGitHubTokenRequest { + string trust_name = 1; + string assertion = 2; +} +message ExchangeGitHubTokenResponse { + string access_token = 1; + string token_type = 2; + int64 expires_at_unix = 3; + string project_name = 4; + repeated string permissions = 5; +} +message BeginGitHubSetupRequest { + string project_name = 1; + string id = 2; + // Browser-generated 32-byte random base64url pairing code; stored only hashed. + string pairing_code = 3; +} +message GetGitHubSetupRequest { string id = 1; } +message BeginGitHubSetupResponse { GitHubSetup setup = 1; } +message GetGitHubSetupResponse { GitHubSetup setup = 1; } +message GitHubSetup { + string id = 1; + string project_name = 2; + string audience = 3; + int64 expires_at_unix = 4; + string state = 5; + GitHubTrust identity = 6; + string confirmed_trust_name = 7; +} +message SubmitGitHubSetupRequest { + string id = 1; + string pairing_code = 2; + string assertion = 3; +} +message SubmitGitHubSetupResponse {} diff --git a/proto/aes/iam/v1/iam.proto b/proto/aes/iam/v1/iam.proto index 1276209..e1785ac 100644 --- a/proto/aes/iam/v1/iam.proto +++ b/proto/aes/iam/v1/iam.proto @@ -338,6 +338,33 @@ message SignUpRequest { // Cloudflare Turnstile widget token. Required when the deployment has bot protection // enabled; safe to omit otherwise. string turnstile_token = 6; + // Optional "What brings you to Metal Host?" answer from the sign-up form. Stored on the + // account at creation; never updated afterwards. Rides email_verifications until + // VerifyEmail materializes the user (same path as attribution). + SignupSurvey survey = 7; +} + +// Why the customer is signing up. Captured on the website; values match the sign-up form copy. +enum SignupIntent { + SIGNUP_INTENT_UNSPECIFIED = 0; + // Moving an existing workload from another provider. + SIGNUP_INTENT_MOVING_WORKLOAD = 1; + // Starting something new. + SIGNUP_INTENT_STARTING_NEW = 2; + // Adding capacity next to my current setup. + SIGNUP_INTENT_ADDING_CAPACITY = 3; + // Comparing providers, nothing to deploy yet. + SIGNUP_INTENT_COMPARING_PROVIDERS = 4; + // Something else — see SignupSurvey.something_else. + SIGNUP_INTENT_SOMETHING_ELSE = 5; +} + +// Single-question signup survey. Optional; empty/unspecified is stored as SQL NULL. +message SignupSurvey { + SignupIntent intent = 1; + // Free-text when intent is SIGNUP_INTENT_SOMETHING_ELSE. Server truncates to 100 + // characters. Ignored for any other intent. + string something_else = 2; } // Marketing attribution for a new account: UTM parameters and ad click IDs captured on the @@ -621,6 +648,10 @@ message StartOidcLoginRequest { // Optional marketing attribution captured on the website at first visit. Applied only when // this sign-in creates a brand-new account; ignored on sign-ins to existing accounts. SignupAttribution attribution = 3; + // Optional "What brings you to Metal Host?" answer. Applied only when this sign-in creates + // a brand-new account; ignored on sign-ins to existing accounts. Rides oidc_login_sessions + // because the OAuth redirect drops URL params. + SignupSurvey survey = 4; } message StartOidcLoginResponse { diff --git a/proto/aes/monitoring/v1/alerts.proto b/proto/aes/monitoring/v1/alerts.proto new file mode 100644 index 0000000..8837023 --- /dev/null +++ b/proto/aes/monitoring/v1/alerts.proto @@ -0,0 +1,298 @@ +syntax = "proto3"; + +package aes.monitoring.v1; + +service AlertService { + rpc ListAlertRules(ListAlertRulesRequest) returns (ListAlertRulesResponse); + rpc SaveAlertRule(SaveAlertRuleRequest) returns (SaveAlertRuleResponse); + rpc DeleteAlertRule(DeleteAlertRuleRequest) returns (DeleteAlertRuleResponse); + rpc PreviewAlertRule(PreviewAlertRuleRequest) returns (PreviewAlertRuleResponse); + rpc ListAlertDestinations(ListAlertDestinationsRequest) returns (ListAlertDestinationsResponse); + rpc SaveAlertDestination(SaveAlertDestinationRequest) returns (SaveAlertDestinationResponse); + rpc DeleteAlertDestination(DeleteAlertDestinationRequest) returns (DeleteAlertDestinationResponse); + rpc RequestDestinationVerification(RequestDestinationVerificationRequest) returns (RequestDestinationVerificationResponse); + rpc VerifyAlertDestination(VerifyAlertDestinationRequest) returns (VerifyAlertDestinationResponse); + rpc ListIncidents(ListIncidentsRequest) returns (ListIncidentsResponse); + rpc GetIncidentSummary(GetIncidentSummaryRequest) returns (GetIncidentSummaryResponse); + rpc GetIncident(GetIncidentRequest) returns (GetIncidentResponse); + rpc UpdateIncident(UpdateIncidentRequest) returns (UpdateIncidentResponse); + rpc ListAlertInstances(ListAlertInstancesRequest) returns (ListAlertInstancesResponse); + rpc ListAlertDestinationCandidates(ListAlertDestinationCandidatesRequest) returns (ListAlertDestinationCandidatesResponse); + rpc TestAlertDestination(TestAlertDestinationRequest) returns (TestAlertDestinationResponse); + rpc GetDestinationTest(GetDestinationTestRequest) returns (GetDestinationTestResponse); +} + +message AlertRuleSpec { + string display_name = 1; + // One of the metric IDs returned by the alert template catalog. + string metric_id = 2; + // GREATER_THAN or LESS_THAN. Availability templates use GREATER_THAN 0. + string operator = 3; + double threshold = 4; + int32 sustained_seconds = 5; + // WARNING or CRITICAL. + string severity = 6; + bool all_vms = 7; + repeated string vm_names = 8; + bool enabled = 9; + int32 repeat_interval_seconds = 10; + repeated string destination_names = 11; +} +message AlertRule { + string id = 1; + string project_name = 2; + AlertRuleSpec spec = 3; + int64 version = 4; + int64 applied_version = 5; + // PENDING, APPLIED, ERROR, LIMITED, or RETIRED. Saving is not engine acceptance. + string sync_status = 6; + string sync_error = 7; + int64 create_time_unix = 8; + int64 update_time_unix = 9; + int64 last_evaluated_at_unix = 10; +} +message ListAlertRulesRequest { string project_name = 1; } +message ListAlertRulesResponse { + repeated AlertRule rules = 1; + int32 rule_limit = 2; + int32 evaluated_instance_limit = 3; + bool can_manage = 4; +} +message SaveAlertRuleRequest { + string project_name = 1; + // Client-generated UUID, retained on retry. Never reused after deletion. + string id = 2; + AlertRuleSpec spec = 3; + // Zero for create; otherwise the last version read. + int64 expected_version = 4; + // Client-generated UUID identifying this mutation; reuse on an ambiguous retry. + string request_id = 5; +} +message SaveAlertRuleResponse { AlertRule rule = 1; } +message DeleteAlertRuleRequest { + string project_name = 1; + string id = 2; + int64 expected_version = 3; + string request_id = 4; +} +message DeleteAlertRuleResponse {} +message PreviewAlertRuleRequest { + string project_name = 1; + AlertRuleSpec spec = 2; +} +message AlertPreviewResource { + string vm_name = 1; + string display_name = 2; + // AVAILABLE, AWAITING_DATA, SUPPRESSED, UNKNOWN intent/placement, or ERROR. + string status = 3; + optional double value = 4; + bool condition_met = 5; +} +message PreviewAlertRuleResponse { + int32 matched_resource_count = 1; + repeated AlertPreviewResource resources = 2; + bool sample_only = 3; + string query_status = 4; + string explanation = 5; +} + +message AlertDestination { + string name = 1; + string project_name = 2; + string display_name = 3; + // EMAIL selects an existing verified project member; WEBHOOK an existing subscription. + string kind = 4; + string principal = 5; + string subscription_name = 6; + bool enabled = 7; + int64 version = 8; + // VERIFIED, PENDING, or NOT_REQUIRED for a webhook subscription. + string verification_status = 9; + // Only populated for the current recipient's own unexpired verification. + string pending_verification_id = 10; + // Most recent test within retained history; absence is not delivery success. + DestinationTest last_test = 11; +} +message ListAlertDestinationsRequest { string project_name = 1; } +message ListAlertDestinationsResponse { + repeated AlertDestination destinations = 1; + int32 limit = 2; + string caller_principal = 3; + bool email_available = 4; + bool webhook_available = 5; +} +message SaveAlertDestinationRequest { + AlertDestination destination = 1; + string request_id = 2; + // Zero for create; otherwise the version last read. + int64 expected_version = 3; +} +message SaveAlertDestinationResponse { AlertDestination destination = 1; } +message DeleteAlertDestinationRequest { + string project_name = 1; + string name = 2; + int64 expected_version = 3; + string request_id = 4; +} +message DeleteAlertDestinationResponse {} +message RequestDestinationVerificationRequest { + string project_name = 1; + string name = 2; + string request_id = 3; +} +message RequestDestinationVerificationResponse { string verification_id = 1; } +message VerifyAlertDestinationRequest { + string project_name = 1; + string name = 2; + string verification_id = 3; + string code = 4; +} +message VerifyAlertDestinationResponse {} + +message IncidentSnapshot { + string rule_name = 1; + string metric_id = 2; + string operator = 3; + double threshold = 4; + int32 sustained_seconds = 5; + string severity = 6; + optional double value = 7; + string datacenter_name = 8; + int64 observed_at_unix = 9; +} +message Incident { + string id = 1; + string project_name = 2; + string rule_id = 3; + int64 rule_version = 4; + string vm_name = 5; + // OPEN, RECOVERED, or RETIRED. Acknowledgement does not resolve an incident. + string state = 6; + int64 opened_at_unix = 7; + int64 closed_at_unix = 8; + string close_reason = 9; + string acknowledged_by = 10; + int64 acknowledged_at_unix = 11; + int64 snoozed_until_unix = 12; + int64 version = 13; + IncidentSnapshot snapshot = 14; + // Current evaluation health, independent of the incident's lifecycle. + string evaluation_health = 15; + // Current hostname only when the immutable resource still matches this incident. + string vm_display_name = 16; +} +message GetIncidentSummaryRequest { string project_name = 1; } +message GetIncidentSummaryResponse { + int32 open_count = 1; + int32 critical_count = 2; + // At most five recent open incidents. Reading never acknowledges or resolves them. + repeated Incident incidents = 3; +} +message IncidentTransition { + string id = 1; + string kind = 2; + int64 create_time_unix = 3; + string principal = 4; + IncidentSnapshot snapshot = 5; +} +message IncidentDelivery { + string id = 1; + string transition_id = 2; + string destination_name = 3; + string state = 4; + int32 attempt_count = 5; + int64 create_time_unix = 6; + int64 completed_at_unix = 7; + string last_error = 8; +} +message ListIncidentsRequest { + string project_name = 1; + // Empty for all; otherwise OPEN, RECOVERED, or RETIRED. + string state = 2; + string vm_name = 3; + int32 page_size = 4; + string page_token = 5; +} +message ListIncidentsResponse { + repeated Incident incidents = 1; + string next_page_token = 2; +} +message GetIncidentRequest { + string project_name = 1; + string id = 2; + // Cursor for older transitions; each page includes up to 50 transitions and their deliveries. + string page_token = 3; +} +message GetIncidentResponse { + Incident incident = 1; + repeated IncidentTransition transitions = 2; + repeated IncidentDelivery deliveries = 3; + string next_page_token = 4; +} +message UpdateIncidentRequest { + string project_name = 1; + string id = 2; + int64 expected_version = 3; + string request_id = 4; + // ACKNOWLEDGE, SNOOZE, or UNSNOOZE. These never change OPEN to RECOVERED. + string action = 5; + // SNOOZE only: 900, 3600, 14400, or 86400 seconds. + int32 duration_seconds = 6; +} +message UpdateIncidentResponse { Incident incident = 1; } +message AlertInstance { + string rule_id = 1; + int64 rule_version = 2; + string vm_name = 3; + string health = 4; + string condition = 5; + string incident_id = 6; + int64 transition_time_unix = 7; +} +message ListAlertInstancesRequest { + string project_name = 1; + string rule_id = 2; + int32 page_size = 3; + string page_token = 4; +} +message ListAlertInstancesResponse { + repeated AlertInstance instances = 1; + string next_page_token = 2; +} + +message AlertDestinationCandidate { + string name = 1; + string display_name = 2; + // EMAIL or WEBHOOK. The name is an existing user or subscription resource. + string kind = 3; + string address = 4; +} +message ListAlertDestinationCandidatesRequest { + string project_name = 1; + string kind = 2; + string search = 3; + string page_token = 4; +} +message ListAlertDestinationCandidatesResponse { + repeated AlertDestinationCandidate candidates = 1; + string next_page_token = 2; +} + +message DestinationTest { + string id = 1; + string destination_name = 2; + // PENDING, SENDING, SENT, FAILED, EXPIRED, or SKIPPED. SENT means provider acceptance. + string state = 3; + int32 attempt_count = 4; + string last_error = 5; + int64 create_time_unix = 6; +} +message TestAlertDestinationRequest { + string project_name = 1; + string destination_name = 2; + // Keep this UUID on retry; a new ID deliberately requests another test. + string request_id = 3; +} +message TestAlertDestinationResponse { DestinationTest test = 1; } +message GetDestinationTestRequest { string project_name = 1; string id = 2; } +message GetDestinationTestResponse { DestinationTest test = 1; } diff --git a/proto/aes/monitoring/v1/monitoring.proto b/proto/aes/monitoring/v1/monitoring.proto new file mode 100644 index 0000000..5397ee8 --- /dev/null +++ b/proto/aes/monitoring/v1/monitoring.proto @@ -0,0 +1,118 @@ +syntax = "proto3"; + +package aes.monitoring.v1; + +service MonitoringService { + rpc ListMetricDescriptors(ListMetricDescriptorsRequest) returns (ListMetricDescriptorsResponse); + rpc ListVMMonitoring(ListVMMonitoringRequest) returns (ListVMMonitoringResponse); + rpc QueryVMMonitoring(QueryVMMonitoringRequest) returns (QueryVMMonitoringResponse); + rpc GetEnhancedMonitoring(GetEnhancedMonitoringRequest) returns (GetEnhancedMonitoringResponse); + rpc EnableEnhancedMonitoring(EnableEnhancedMonitoringRequest) returns (EnableEnhancedMonitoringResponse); + rpc RevokeEnhancedMonitoring(RevokeEnhancedMonitoringRequest) returns (RevokeEnhancedMonitoringResponse); +} + +message MetricDescriptor { + string id = 1; + string display_name = 2; + string unit = 3; + string description = 4; + string source = 5; +} +message ListMetricDescriptorsRequest { string project_name = 1; } +message ListMetricDescriptorsResponse { + repeated MetricDescriptor metrics = 1; + int32 retention_days = 2; + int32 sample_interval_seconds = 3; +} +message ListVMMonitoringRequest { + string project_name = 1; + int32 page_size = 2; + string page_token = 3; + string search = 4; + string datacenter_name = 5; + string state = 6; + // Record pickers can skip time-series queries. Status is then NOT_REQUESTED. + bool inventory_only = 7; +} +message MonitoredVM { + string name = 1; + string display_name = 2; + string datacenter_name = 3; + string state = 4; + // AVAILABLE, STALE, AWAITING_DATA, or ERROR; never infer VM health from this. + string collection_status = 5; + int64 observed_at_unix = 6; + string enhanced_status = 7; + optional double cpu_utilization_percent = 8; + optional double memory_used_bytes = 9; + optional double filesystem_used_percent = 10; +} +message ListVMMonitoringResponse { + repeated MonitoredVM vms = 1; + string next_page_token = 2; + string query_status = 3; +} +message QueryVMMonitoringRequest { + string name = 1; + repeated string metric_ids = 2; + int64 start_time_unix = 3; + int64 end_time_unix = 4; + int32 step_seconds = 5; +} +message Sample { + int64 timestamp_unix = 1; + double value = 2; +} +message Series { + string metric_id = 1; + map dimensions = 2; + repeated Sample samples = 3; +} +message MetricQuality { + string metric_id = 1; + // AVAILABLE, STALE, AWAITING_DATA, UNSUPPORTED, or ERROR. + string status = 2; + int64 observed_at_unix = 3; + string description = 4; +} +message QueryVMMonitoringResponse { + repeated Series series = 1; + repeated MetricQuality quality = 2; + int64 start_time_unix = 3; + int64 end_time_unix = 4; + int32 step_seconds = 5; +} + +message EnhancedMonitoring { + string name = 1; + string installation_id = 2; + string resource_id = 3; + // DISABLED, AWAITING_INSTALLATION, CONNECTED, STALE, REVOKED, UNSUPPORTED. + string status = 4; + bool device_ready = 5; + bool restart_required = 6; + string collector_version = 7; + repeated string capabilities = 8; + int64 last_seen_at_unix = 9; + int64 revoked_at_unix = 10; + // Public installation identity, not a bearer credential. Requires the trusted + // VMI-bound collection path; copying this configuration grants no authority. + string configuration_json = 11; + string runtime_state = 12; +} +message GetEnhancedMonitoringRequest { string name = 1; } +message GetEnhancedMonitoringResponse { EnhancedMonitoring monitoring = 1; } +message EnableEnhancedMonitoringRequest { + string name = 1; + string request_id = 2; + // When the device is absent, the VM must already have completed its normal + // stop operation. This RPC never stops, starts or restarts a VM itself. + bool confirm_device_attachment = 3; +} +message EnableEnhancedMonitoringResponse { EnhancedMonitoring monitoring = 1; } +message RevokeEnhancedMonitoringRequest { + string name = 1; + // Compare-and-revoke prevents an old dialog revoking a replacement install. + string installation_id = 2; +} +message RevokeEnhancedMonitoringResponse {} diff --git a/proto/aes/support/v1/support.proto b/proto/aes/support/v1/support.proto index b36d2cc..4e1fd19 100644 --- a/proto/aes/support/v1/support.proto +++ b/proto/aes/support/v1/support.proto @@ -22,22 +22,17 @@ service SupportService { // ReplyTicket appends a customer message and transitions status to PENDING_STAFF when the // ticket was previously PENDING_CUSTOMER. No-op transition otherwise. rpc ReplyTicket(ReplyTicketRequest) returns (ReplyTicketResponse); - // CloseTicket transitions the ticket to CLOSED. Customer can close from any non-CLOSED - // status. Staff may mark a ticket RESOLVED before the customer closes it. + // CloseTicket closes the conversation. ReplyTicket with reopen=true can reopen it at any time. rpc CloseTicket(CloseTicketRequest) returns (CloseTicketResponse); } -// Lifecycle states. PENDING_CUSTOMER means staff replied and we're waiting on the user; -// PENDING_STAFF means the user replied and we owe them a response. RESOLVED is set by staff; -// CLOSED is the terminal state — set when the customer -// confirms or auto-closes after an inactivity window. Customer-side CloseTicket goes -// directly to CLOSED. +// CLOSED is the only finished state. RESOLVED remains a deprecated wire-compatible alias. enum TicketStatus { TICKET_STATUS_UNSPECIFIED = 0; TICKET_STATUS_OPEN = 1; TICKET_STATUS_PENDING_CUSTOMER = 2; TICKET_STATUS_PENDING_STAFF = 3; - TICKET_STATUS_RESOLVED = 4; + TICKET_STATUS_RESOLVED = 4 [deprecated = true]; TICKET_STATUS_CLOSED = 5; } @@ -106,6 +101,8 @@ message Ticket { // Set on creation per plan tier; null = no SLA. Breach monitoring is applied automatically. google.protobuf.Timestamp sla_due_at = 15; google.protobuf.Timestamp escalated_at = 16; + // Last closure time, preserved when the conversation is reopened. + google.protobuf.Timestamp closed_at = 19; } message TicketMessage { @@ -140,6 +137,7 @@ message CreateTicketRequest { // Optional. Defaults to TICKET_PRIORITY_NORMAL when unspecified. TicketPriority priority = 5; repeated ResourceRef resource_refs = 6; + string request_id = 7; } message CreateTicketResponse { @@ -162,7 +160,7 @@ message ListTicketsResponse { } message GetTicketRequest { - string name = 1; // Resource name tickets/ (renamed from ticket_id in proto audit) + string name = 1; // Resource name tickets/ (renamed from ticket_id in proto audit) } message GetTicketResponse { @@ -172,8 +170,11 @@ message GetTicketResponse { } message ReplyTicketRequest { - string name = 1; // Resource name tickets/ (renamed from ticket_id in proto audit) + string name = 1; // Resource name tickets/ (renamed from ticket_id in proto audit) string body = 2; + // Explicit consent to reopen a closed conversation. There is no expiry window. + bool reopen = 3; + string request_id = 4; } message ReplyTicketResponse { @@ -183,9 +184,12 @@ message ReplyTicketResponse { } message CloseTicketRequest { - string name = 1; // Resource name tickets/ (renamed from ticket_id in proto audit) + string name = 1; // Resource name tickets/ (renamed from ticket_id in proto audit) // Optional final customer-side message recorded before close. string body = 2; + string request_id = 3; + // Reject closing when another participant has changed the ticket since it was read. + google.protobuf.Timestamp expected_updated_at = 4; } message CloseTicketResponse { diff --git a/proto/aes/webhooks/v1/webhooks.proto b/proto/aes/webhooks/v1/webhooks.proto index 8ee82f2..64f5475 100644 --- a/proto/aes/webhooks/v1/webhooks.proto +++ b/proto/aes/webhooks/v1/webhooks.proto @@ -19,6 +19,7 @@ service WebhooksService { rpc ListSubscriptions(ListSubscriptionsRequest) returns (ListSubscriptionsResponse); rpc UpdateSubscription(UpdateSubscriptionRequest) returns (UpdateSubscriptionResponse); rpc DeleteSubscription(DeleteSubscriptionRequest) returns (DeleteSubscriptionResponse); + rpc RotateSubscriptionSecret(RotateSubscriptionSecretRequest) returns (RotateSubscriptionSecretResponse); // ListDeliveries shows recent attempts for a subscription — status code, response body // snippet, retry count. Bounded ring (last 100 per subscription). rpc ListDeliveries(ListDeliveriesRequest) returns (ListDeliveriesResponse); @@ -40,6 +41,25 @@ message Subscription { int64 update_time_unix = 7; // Per-subscription identifier returned via the X-Metalhost-Subscription header in deliveries. string secret_prefix = 8; + int64 secret_version = 9; + // Zero when no overlap exists. Expired previous secrets are never used to sign. + int64 previous_secret_expires_at_unix = 10; +} + +message RotateSubscriptionSecretRequest { + string name = 1; + int64 expected_secret_version = 2; + // Stable UUID for recovery after a lost response. Retries never reveal secrets. + string request_id = 3; + // 0 immediately invalidates the old secret; maximum 86400 (24 hours). + int32 overlap_seconds = 4; +} + +message RotateSubscriptionSecretResponse { + Subscription subscription = 1; + string secret = 2; + // A committed request was retried. Recover by deliberately rotating again. + bool secret_unavailable = 3; } message CreateSubscriptionRequest { diff --git a/scripts/sync-api-snapshot.sh b/scripts/sync-api-snapshot.sh index 97e864b..a44aade 100755 --- a/scripts/sync-api-snapshot.sh +++ b/scripts/sync-api-snapshot.sh @@ -57,6 +57,7 @@ for pkg in \ compute \ health \ iam \ + monitoring \ network \ ops \ project \ From 0b9bd32bc500c0876e1e4a5455a2096e2867c9c4 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Mon, 21 Sep 2026 12:43:08 -0500 Subject: [PATCH 2/5] feat(monitoring): sync completion APIs and historical preview contract --- docs/OBSERVABILITY.md | 9 +- gen/go/aes/monitoring/v1/alerts.pb.go | 256 ++++++++++----- gen/go/aes/monitoring/v1/monitoring.pb.go | 379 +++++++++++++++++----- gen/openapi/metalhost.openapi.yaml | 133 +++++++- proto/aes/monitoring/v1/alerts.proto | 13 +- proto/aes/monitoring/v1/monitoring.proto | 19 ++ 6 files changed, 636 insertions(+), 173 deletions(-) diff --git a/docs/OBSERVABILITY.md b/docs/OBSERVABILITY.md index d4ca048..f6a6b79 100644 --- a/docs/OBSERVABILITY.md +++ b/docs/OBSERVABILITY.md @@ -68,7 +68,14 @@ chart responses with per-family quality. Metric samples are never invoices. `AlertService` manages structured rules, current/future VM selections, previews, incidents, verified destinations and explicit test deliveries. Rules reconcile asynchronously: check desired/applied version and evaluation health after save. -Current-sample preview is not a historical simulation or delivery guarantee. +Preview defaults to the current sample. Set `history_seconds` to 3600, 21600 or +86400 for a bounded historical estimate on up to 50 matching VMs. Inspect +`history_status` and each resource's evaluated/expected sample counts: missing +retained running intent or fresh telemetry produces gaps, not healthy samples. +The episode estimate applies the proposed threshold and sustained duration; it +does not replay routing, delivery or predict future notifications. +Enhanced templates accept only their allowlisted exact `dimensions`; obtain +mount/service/GPU names from observations rather than constructing PromQL. Acknowledging or snoozing an incident does not resolve it. A missing metric or collector outage must not manufacture recovery. diff --git a/gen/go/aes/monitoring/v1/alerts.pb.go b/gen/go/aes/monitoring/v1/alerts.pb.go index b451c40..1aaa936 100644 --- a/gen/go/aes/monitoring/v1/alerts.pb.go +++ b/gen/go/aes/monitoring/v1/alerts.pb.go @@ -37,8 +37,10 @@ type AlertRuleSpec struct { Enabled bool `protobuf:"varint,9,opt,name=enabled,proto3" json:"enabled,omitempty"` RepeatIntervalSeconds int32 `protobuf:"varint,10,opt,name=repeat_interval_seconds,json=repeatIntervalSeconds,proto3" json:"repeat_interval_seconds,omitempty"` DestinationNames []string `protobuf:"bytes,11,rep,name=destination_names,json=destinationNames,proto3" json:"destination_names,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Optional exact observed dimensions; never arbitrary PromQL or regex. + Dimensions map[string]string `protobuf:"bytes,12,rep,name=dimensions,proto3" json:"dimensions,omitempty" protobuf_key:"bytes,1,opt,name=key" protobuf_val:"bytes,2,opt,name=value"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AlertRuleSpec) Reset() { @@ -148,6 +150,13 @@ func (x *AlertRuleSpec) GetDestinationNames() []string { return nil } +func (x *AlertRuleSpec) GetDimensions() map[string]string { + if x != nil { + return x.Dimensions + } + return nil +} + type AlertRule struct { state protoimpl.MessageState `protogen:"open.v1"` Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` @@ -605,11 +614,13 @@ func (*DeleteAlertRuleResponse) Descriptor() ([]byte, []int) { } type PreviewAlertRuleRequest struct { - state protoimpl.MessageState `protogen:"open.v1"` - ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` - Spec *AlertRuleSpec `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + state protoimpl.MessageState `protogen:"open.v1"` + ProjectName string `protobuf:"bytes,1,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` + Spec *AlertRuleSpec `protobuf:"bytes,2,opt,name=spec,proto3" json:"spec,omitempty"` + // Zero keeps the current-sample preview; otherwise 3600, 21600, or 86400. + HistorySeconds int32 `protobuf:"varint,3,opt,name=history_seconds,json=historySeconds,proto3" json:"history_seconds,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *PreviewAlertRuleRequest) Reset() { @@ -656,16 +667,26 @@ func (x *PreviewAlertRuleRequest) GetSpec() *AlertRuleSpec { return nil } +func (x *PreviewAlertRuleRequest) GetHistorySeconds() int32 { + if x != nil { + return x.HistorySeconds + } + return 0 +} + type AlertPreviewResource struct { state protoimpl.MessageState `protogen:"open.v1"` VmName string `protobuf:"bytes,1,opt,name=vm_name,json=vmName,proto3" json:"vm_name,omitempty"` DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // AVAILABLE, AWAITING_DATA, SUPPRESSED, UNKNOWN intent/placement, or ERROR. - Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` - Value *float64 `protobuf:"fixed64,4,opt,name=value,proto3,oneof" json:"value,omitempty"` - ConditionMet bool `protobuf:"varint,5,opt,name=condition_met,json=conditionMet,proto3" json:"condition_met,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // AVAILABLE, AWAITING_DATA, UNSUPPORTED, SUPPRESSED, UNKNOWN intent/placement, or ERROR. + Status string `protobuf:"bytes,3,opt,name=status,proto3" json:"status,omitempty"` + Value *float64 `protobuf:"fixed64,4,opt,name=value,proto3,oneof" json:"value,omitempty"` + ConditionMet bool `protobuf:"varint,5,opt,name=condition_met,json=conditionMet,proto3" json:"condition_met,omitempty"` + HistoricalFiringEpisodes int32 `protobuf:"varint,6,opt,name=historical_firing_episodes,json=historicalFiringEpisodes,proto3" json:"historical_firing_episodes,omitempty"` + HistoricalEvaluatedSamples int32 `protobuf:"varint,7,opt,name=historical_evaluated_samples,json=historicalEvaluatedSamples,proto3" json:"historical_evaluated_samples,omitempty"` + HistoricalExpectedSamples int32 `protobuf:"varint,8,opt,name=historical_expected_samples,json=historicalExpectedSamples,proto3" json:"historical_expected_samples,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *AlertPreviewResource) Reset() { @@ -733,6 +754,27 @@ func (x *AlertPreviewResource) GetConditionMet() bool { return false } +func (x *AlertPreviewResource) GetHistoricalFiringEpisodes() int32 { + if x != nil { + return x.HistoricalFiringEpisodes + } + return 0 +} + +func (x *AlertPreviewResource) GetHistoricalEvaluatedSamples() int32 { + if x != nil { + return x.HistoricalEvaluatedSamples + } + return 0 +} + +func (x *AlertPreviewResource) GetHistoricalExpectedSamples() int32 { + if x != nil { + return x.HistoricalExpectedSamples + } + return 0 +} + type PreviewAlertRuleResponse struct { state protoimpl.MessageState `protogen:"open.v1"` MatchedResourceCount int32 `protobuf:"varint,1,opt,name=matched_resource_count,json=matchedResourceCount,proto3" json:"matched_resource_count,omitempty"` @@ -740,6 +782,10 @@ type PreviewAlertRuleResponse struct { SampleOnly bool `protobuf:"varint,3,opt,name=sample_only,json=sampleOnly,proto3" json:"sample_only,omitempty"` QueryStatus string `protobuf:"bytes,4,opt,name=query_status,json=queryStatus,proto3" json:"query_status,omitempty"` Explanation string `protobuf:"bytes,5,opt,name=explanation,proto3" json:"explanation,omitempty"` + HistoryStartUnix int64 `protobuf:"varint,6,opt,name=history_start_unix,json=historyStartUnix,proto3" json:"history_start_unix,omitempty"` + HistoryEndUnix int64 `protobuf:"varint,7,opt,name=history_end_unix,json=historyEndUnix,proto3" json:"history_end_unix,omitempty"` + HistoryStepSeconds int32 `protobuf:"varint,8,opt,name=history_step_seconds,json=historyStepSeconds,proto3" json:"history_step_seconds,omitempty"` + HistoryStatus string `protobuf:"bytes,9,opt,name=history_status,json=historyStatus,proto3" json:"history_status,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -809,6 +855,34 @@ func (x *PreviewAlertRuleResponse) GetExplanation() string { return "" } +func (x *PreviewAlertRuleResponse) GetHistoryStartUnix() int64 { + if x != nil { + return x.HistoryStartUnix + } + return 0 +} + +func (x *PreviewAlertRuleResponse) GetHistoryEndUnix() int64 { + if x != nil { + return x.HistoryEndUnix + } + return 0 +} + +func (x *PreviewAlertRuleResponse) GetHistoryStepSeconds() int32 { + if x != nil { + return x.HistoryStepSeconds + } + return 0 +} + +func (x *PreviewAlertRuleResponse) GetHistoryStatus() string { + if x != nil { + return x.HistoryStatus + } + return "" +} + type AlertDestination struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -3109,7 +3183,7 @@ var File_aes_monitoring_v1_alerts_proto protoreflect.FileDescriptor const file_aes_monitoring_v1_alerts_proto_rawDesc = "" + "\n" + - "\x1eaes/monitoring/v1/alerts.proto\x12\x11aes.monitoring.v1\"\x85\x03\n" + + "\x1eaes/monitoring/v1/alerts.proto\x12\x11aes.monitoring.v1\"\x96\x04\n" + "\rAlertRuleSpec\x12!\n" + "\fdisplay_name\x18\x01 \x01(\tR\vdisplayName\x12\x1b\n" + "\tmetric_id\x18\x02 \x01(\tR\bmetricId\x12\x1a\n" + @@ -3122,7 +3196,13 @@ const file_aes_monitoring_v1_alerts_proto_rawDesc = "" + "\aenabled\x18\t \x01(\bR\aenabled\x126\n" + "\x17repeat_interval_seconds\x18\n" + " \x01(\x05R\x15repeatIntervalSeconds\x12+\n" + - "\x11destination_names\x18\v \x03(\tR\x10destinationNames\"\x80\x03\n" + + "\x11destination_names\x18\v \x03(\tR\x10destinationNames\x12P\n" + + "\n" + + "dimensions\x18\f \x03(\v20.aes.monitoring.v1.AlertRuleSpec.DimensionsEntryR\n" + + "dimensions\x1a=\n" + + "\x0fDimensionsEntry\x12\x10\n" + + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x80\x03\n" + "\tAlertRule\x12\x0e\n" + "\x02id\x18\x01 \x01(\tR\x02id\x12!\n" + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x124\n" + @@ -3161,24 +3241,32 @@ const file_aes_monitoring_v1_alerts_proto_rawDesc = "" + "\x10expected_version\x18\x03 \x01(\x03R\x0fexpectedVersion\x12\x1d\n" + "\n" + "request_id\x18\x04 \x01(\tR\trequestId\"\x19\n" + - "\x17DeleteAlertRuleResponse\"r\n" + + "\x17DeleteAlertRuleResponse\"\x9b\x01\n" + "\x17PreviewAlertRuleRequest\x12!\n" + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x124\n" + - "\x04spec\x18\x02 \x01(\v2 .aes.monitoring.v1.AlertRuleSpecR\x04spec\"\xb4\x01\n" + + "\x04spec\x18\x02 \x01(\v2 .aes.monitoring.v1.AlertRuleSpecR\x04spec\x12'\n" + + "\x0fhistory_seconds\x18\x03 \x01(\x05R\x0ehistorySeconds\"\xf4\x02\n" + "\x14AlertPreviewResource\x12\x17\n" + "\avm_name\x18\x01 \x01(\tR\x06vmName\x12!\n" + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12\x16\n" + "\x06status\x18\x03 \x01(\tR\x06status\x12\x19\n" + "\x05value\x18\x04 \x01(\x01H\x00R\x05value\x88\x01\x01\x12#\n" + - "\rcondition_met\x18\x05 \x01(\bR\fconditionMetB\b\n" + - "\x06_value\"\xfd\x01\n" + + "\rcondition_met\x18\x05 \x01(\bR\fconditionMet\x12<\n" + + "\x1ahistorical_firing_episodes\x18\x06 \x01(\x05R\x18historicalFiringEpisodes\x12@\n" + + "\x1chistorical_evaluated_samples\x18\a \x01(\x05R\x1ahistoricalEvaluatedSamples\x12>\n" + + "\x1bhistorical_expected_samples\x18\b \x01(\x05R\x19historicalExpectedSamplesB\b\n" + + "\x06_value\"\xae\x03\n" + "\x18PreviewAlertRuleResponse\x124\n" + "\x16matched_resource_count\x18\x01 \x01(\x05R\x14matchedResourceCount\x12E\n" + "\tresources\x18\x02 \x03(\v2'.aes.monitoring.v1.AlertPreviewResourceR\tresources\x12\x1f\n" + "\vsample_only\x18\x03 \x01(\bR\n" + "sampleOnly\x12!\n" + "\fquery_status\x18\x04 \x01(\tR\vqueryStatus\x12 \n" + - "\vexplanation\x18\x05 \x01(\tR\vexplanation\"\xa9\x03\n" + + "\vexplanation\x18\x05 \x01(\tR\vexplanation\x12,\n" + + "\x12history_start_unix\x18\x06 \x01(\x03R\x10historyStartUnix\x12(\n" + + "\x10history_end_unix\x18\a \x01(\x03R\x0ehistoryEndUnix\x120\n" + + "\x14history_step_seconds\x18\b \x01(\x05R\x12historyStepSeconds\x12%\n" + + "\x0ehistory_status\x18\t \x01(\tR\rhistoryStatus\"\xa9\x03\n" + "\x10AlertDestination\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + "\fproject_name\x18\x02 \x01(\tR\vprojectName\x12!\n" + @@ -3397,7 +3485,7 @@ func file_aes_monitoring_v1_alerts_proto_rawDescGZIP() []byte { return file_aes_monitoring_v1_alerts_proto_rawDescData } -var file_aes_monitoring_v1_alerts_proto_msgTypes = make([]protoimpl.MessageInfo, 45) +var file_aes_monitoring_v1_alerts_proto_msgTypes = make([]protoimpl.MessageInfo, 46) var file_aes_monitoring_v1_alerts_proto_goTypes = []any{ (*AlertRuleSpec)(nil), // 0: aes.monitoring.v1.AlertRuleSpec (*AlertRule)(nil), // 1: aes.monitoring.v1.AlertRule @@ -3444,69 +3532,71 @@ var file_aes_monitoring_v1_alerts_proto_goTypes = []any{ (*TestAlertDestinationResponse)(nil), // 42: aes.monitoring.v1.TestAlertDestinationResponse (*GetDestinationTestRequest)(nil), // 43: aes.monitoring.v1.GetDestinationTestRequest (*GetDestinationTestResponse)(nil), // 44: aes.monitoring.v1.GetDestinationTestResponse + nil, // 45: aes.monitoring.v1.AlertRuleSpec.DimensionsEntry } var file_aes_monitoring_v1_alerts_proto_depIdxs = []int32{ - 0, // 0: aes.monitoring.v1.AlertRule.spec:type_name -> aes.monitoring.v1.AlertRuleSpec - 1, // 1: aes.monitoring.v1.ListAlertRulesResponse.rules:type_name -> aes.monitoring.v1.AlertRule - 0, // 2: aes.monitoring.v1.SaveAlertRuleRequest.spec:type_name -> aes.monitoring.v1.AlertRuleSpec - 1, // 3: aes.monitoring.v1.SaveAlertRuleResponse.rule:type_name -> aes.monitoring.v1.AlertRule - 0, // 4: aes.monitoring.v1.PreviewAlertRuleRequest.spec:type_name -> aes.monitoring.v1.AlertRuleSpec - 9, // 5: aes.monitoring.v1.PreviewAlertRuleResponse.resources:type_name -> aes.monitoring.v1.AlertPreviewResource - 40, // 6: aes.monitoring.v1.AlertDestination.last_test:type_name -> aes.monitoring.v1.DestinationTest - 11, // 7: aes.monitoring.v1.ListAlertDestinationsResponse.destinations:type_name -> aes.monitoring.v1.AlertDestination - 11, // 8: aes.monitoring.v1.SaveAlertDestinationRequest.destination:type_name -> aes.monitoring.v1.AlertDestination - 11, // 9: aes.monitoring.v1.SaveAlertDestinationResponse.destination:type_name -> aes.monitoring.v1.AlertDestination - 22, // 10: aes.monitoring.v1.Incident.snapshot:type_name -> aes.monitoring.v1.IncidentSnapshot - 23, // 11: aes.monitoring.v1.GetIncidentSummaryResponse.incidents:type_name -> aes.monitoring.v1.Incident - 22, // 12: aes.monitoring.v1.IncidentTransition.snapshot:type_name -> aes.monitoring.v1.IncidentSnapshot - 23, // 13: aes.monitoring.v1.ListIncidentsResponse.incidents:type_name -> aes.monitoring.v1.Incident - 23, // 14: aes.monitoring.v1.GetIncidentResponse.incident:type_name -> aes.monitoring.v1.Incident - 26, // 15: aes.monitoring.v1.GetIncidentResponse.transitions:type_name -> aes.monitoring.v1.IncidentTransition - 27, // 16: aes.monitoring.v1.GetIncidentResponse.deliveries:type_name -> aes.monitoring.v1.IncidentDelivery - 23, // 17: aes.monitoring.v1.UpdateIncidentResponse.incident:type_name -> aes.monitoring.v1.Incident - 34, // 18: aes.monitoring.v1.ListAlertInstancesResponse.instances:type_name -> aes.monitoring.v1.AlertInstance - 37, // 19: aes.monitoring.v1.ListAlertDestinationCandidatesResponse.candidates:type_name -> aes.monitoring.v1.AlertDestinationCandidate - 40, // 20: aes.monitoring.v1.TestAlertDestinationResponse.test:type_name -> aes.monitoring.v1.DestinationTest - 40, // 21: aes.monitoring.v1.GetDestinationTestResponse.test:type_name -> aes.monitoring.v1.DestinationTest - 2, // 22: aes.monitoring.v1.AlertService.ListAlertRules:input_type -> aes.monitoring.v1.ListAlertRulesRequest - 4, // 23: aes.monitoring.v1.AlertService.SaveAlertRule:input_type -> aes.monitoring.v1.SaveAlertRuleRequest - 6, // 24: aes.monitoring.v1.AlertService.DeleteAlertRule:input_type -> aes.monitoring.v1.DeleteAlertRuleRequest - 8, // 25: aes.monitoring.v1.AlertService.PreviewAlertRule:input_type -> aes.monitoring.v1.PreviewAlertRuleRequest - 12, // 26: aes.monitoring.v1.AlertService.ListAlertDestinations:input_type -> aes.monitoring.v1.ListAlertDestinationsRequest - 14, // 27: aes.monitoring.v1.AlertService.SaveAlertDestination:input_type -> aes.monitoring.v1.SaveAlertDestinationRequest - 16, // 28: aes.monitoring.v1.AlertService.DeleteAlertDestination:input_type -> aes.monitoring.v1.DeleteAlertDestinationRequest - 18, // 29: aes.monitoring.v1.AlertService.RequestDestinationVerification:input_type -> aes.monitoring.v1.RequestDestinationVerificationRequest - 20, // 30: aes.monitoring.v1.AlertService.VerifyAlertDestination:input_type -> aes.monitoring.v1.VerifyAlertDestinationRequest - 28, // 31: aes.monitoring.v1.AlertService.ListIncidents:input_type -> aes.monitoring.v1.ListIncidentsRequest - 24, // 32: aes.monitoring.v1.AlertService.GetIncidentSummary:input_type -> aes.monitoring.v1.GetIncidentSummaryRequest - 30, // 33: aes.monitoring.v1.AlertService.GetIncident:input_type -> aes.monitoring.v1.GetIncidentRequest - 32, // 34: aes.monitoring.v1.AlertService.UpdateIncident:input_type -> aes.monitoring.v1.UpdateIncidentRequest - 35, // 35: aes.monitoring.v1.AlertService.ListAlertInstances:input_type -> aes.monitoring.v1.ListAlertInstancesRequest - 38, // 36: aes.monitoring.v1.AlertService.ListAlertDestinationCandidates:input_type -> aes.monitoring.v1.ListAlertDestinationCandidatesRequest - 41, // 37: aes.monitoring.v1.AlertService.TestAlertDestination:input_type -> aes.monitoring.v1.TestAlertDestinationRequest - 43, // 38: aes.monitoring.v1.AlertService.GetDestinationTest:input_type -> aes.monitoring.v1.GetDestinationTestRequest - 3, // 39: aes.monitoring.v1.AlertService.ListAlertRules:output_type -> aes.monitoring.v1.ListAlertRulesResponse - 5, // 40: aes.monitoring.v1.AlertService.SaveAlertRule:output_type -> aes.monitoring.v1.SaveAlertRuleResponse - 7, // 41: aes.monitoring.v1.AlertService.DeleteAlertRule:output_type -> aes.monitoring.v1.DeleteAlertRuleResponse - 10, // 42: aes.monitoring.v1.AlertService.PreviewAlertRule:output_type -> aes.monitoring.v1.PreviewAlertRuleResponse - 13, // 43: aes.monitoring.v1.AlertService.ListAlertDestinations:output_type -> aes.monitoring.v1.ListAlertDestinationsResponse - 15, // 44: aes.monitoring.v1.AlertService.SaveAlertDestination:output_type -> aes.monitoring.v1.SaveAlertDestinationResponse - 17, // 45: aes.monitoring.v1.AlertService.DeleteAlertDestination:output_type -> aes.monitoring.v1.DeleteAlertDestinationResponse - 19, // 46: aes.monitoring.v1.AlertService.RequestDestinationVerification:output_type -> aes.monitoring.v1.RequestDestinationVerificationResponse - 21, // 47: aes.monitoring.v1.AlertService.VerifyAlertDestination:output_type -> aes.monitoring.v1.VerifyAlertDestinationResponse - 29, // 48: aes.monitoring.v1.AlertService.ListIncidents:output_type -> aes.monitoring.v1.ListIncidentsResponse - 25, // 49: aes.monitoring.v1.AlertService.GetIncidentSummary:output_type -> aes.monitoring.v1.GetIncidentSummaryResponse - 31, // 50: aes.monitoring.v1.AlertService.GetIncident:output_type -> aes.monitoring.v1.GetIncidentResponse - 33, // 51: aes.monitoring.v1.AlertService.UpdateIncident:output_type -> aes.monitoring.v1.UpdateIncidentResponse - 36, // 52: aes.monitoring.v1.AlertService.ListAlertInstances:output_type -> aes.monitoring.v1.ListAlertInstancesResponse - 39, // 53: aes.monitoring.v1.AlertService.ListAlertDestinationCandidates:output_type -> aes.monitoring.v1.ListAlertDestinationCandidatesResponse - 42, // 54: aes.monitoring.v1.AlertService.TestAlertDestination:output_type -> aes.monitoring.v1.TestAlertDestinationResponse - 44, // 55: aes.monitoring.v1.AlertService.GetDestinationTest:output_type -> aes.monitoring.v1.GetDestinationTestResponse - 39, // [39:56] is the sub-list for method output_type - 22, // [22:39] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 45, // 0: aes.monitoring.v1.AlertRuleSpec.dimensions:type_name -> aes.monitoring.v1.AlertRuleSpec.DimensionsEntry + 0, // 1: aes.monitoring.v1.AlertRule.spec:type_name -> aes.monitoring.v1.AlertRuleSpec + 1, // 2: aes.monitoring.v1.ListAlertRulesResponse.rules:type_name -> aes.monitoring.v1.AlertRule + 0, // 3: aes.monitoring.v1.SaveAlertRuleRequest.spec:type_name -> aes.monitoring.v1.AlertRuleSpec + 1, // 4: aes.monitoring.v1.SaveAlertRuleResponse.rule:type_name -> aes.monitoring.v1.AlertRule + 0, // 5: aes.monitoring.v1.PreviewAlertRuleRequest.spec:type_name -> aes.monitoring.v1.AlertRuleSpec + 9, // 6: aes.monitoring.v1.PreviewAlertRuleResponse.resources:type_name -> aes.monitoring.v1.AlertPreviewResource + 40, // 7: aes.monitoring.v1.AlertDestination.last_test:type_name -> aes.monitoring.v1.DestinationTest + 11, // 8: aes.monitoring.v1.ListAlertDestinationsResponse.destinations:type_name -> aes.monitoring.v1.AlertDestination + 11, // 9: aes.monitoring.v1.SaveAlertDestinationRequest.destination:type_name -> aes.monitoring.v1.AlertDestination + 11, // 10: aes.monitoring.v1.SaveAlertDestinationResponse.destination:type_name -> aes.monitoring.v1.AlertDestination + 22, // 11: aes.monitoring.v1.Incident.snapshot:type_name -> aes.monitoring.v1.IncidentSnapshot + 23, // 12: aes.monitoring.v1.GetIncidentSummaryResponse.incidents:type_name -> aes.monitoring.v1.Incident + 22, // 13: aes.monitoring.v1.IncidentTransition.snapshot:type_name -> aes.monitoring.v1.IncidentSnapshot + 23, // 14: aes.monitoring.v1.ListIncidentsResponse.incidents:type_name -> aes.monitoring.v1.Incident + 23, // 15: aes.monitoring.v1.GetIncidentResponse.incident:type_name -> aes.monitoring.v1.Incident + 26, // 16: aes.monitoring.v1.GetIncidentResponse.transitions:type_name -> aes.monitoring.v1.IncidentTransition + 27, // 17: aes.monitoring.v1.GetIncidentResponse.deliveries:type_name -> aes.monitoring.v1.IncidentDelivery + 23, // 18: aes.monitoring.v1.UpdateIncidentResponse.incident:type_name -> aes.monitoring.v1.Incident + 34, // 19: aes.monitoring.v1.ListAlertInstancesResponse.instances:type_name -> aes.monitoring.v1.AlertInstance + 37, // 20: aes.monitoring.v1.ListAlertDestinationCandidatesResponse.candidates:type_name -> aes.monitoring.v1.AlertDestinationCandidate + 40, // 21: aes.monitoring.v1.TestAlertDestinationResponse.test:type_name -> aes.monitoring.v1.DestinationTest + 40, // 22: aes.monitoring.v1.GetDestinationTestResponse.test:type_name -> aes.monitoring.v1.DestinationTest + 2, // 23: aes.monitoring.v1.AlertService.ListAlertRules:input_type -> aes.monitoring.v1.ListAlertRulesRequest + 4, // 24: aes.monitoring.v1.AlertService.SaveAlertRule:input_type -> aes.monitoring.v1.SaveAlertRuleRequest + 6, // 25: aes.monitoring.v1.AlertService.DeleteAlertRule:input_type -> aes.monitoring.v1.DeleteAlertRuleRequest + 8, // 26: aes.monitoring.v1.AlertService.PreviewAlertRule:input_type -> aes.monitoring.v1.PreviewAlertRuleRequest + 12, // 27: aes.monitoring.v1.AlertService.ListAlertDestinations:input_type -> aes.monitoring.v1.ListAlertDestinationsRequest + 14, // 28: aes.monitoring.v1.AlertService.SaveAlertDestination:input_type -> aes.monitoring.v1.SaveAlertDestinationRequest + 16, // 29: aes.monitoring.v1.AlertService.DeleteAlertDestination:input_type -> aes.monitoring.v1.DeleteAlertDestinationRequest + 18, // 30: aes.monitoring.v1.AlertService.RequestDestinationVerification:input_type -> aes.monitoring.v1.RequestDestinationVerificationRequest + 20, // 31: aes.monitoring.v1.AlertService.VerifyAlertDestination:input_type -> aes.monitoring.v1.VerifyAlertDestinationRequest + 28, // 32: aes.monitoring.v1.AlertService.ListIncidents:input_type -> aes.monitoring.v1.ListIncidentsRequest + 24, // 33: aes.monitoring.v1.AlertService.GetIncidentSummary:input_type -> aes.monitoring.v1.GetIncidentSummaryRequest + 30, // 34: aes.monitoring.v1.AlertService.GetIncident:input_type -> aes.monitoring.v1.GetIncidentRequest + 32, // 35: aes.monitoring.v1.AlertService.UpdateIncident:input_type -> aes.monitoring.v1.UpdateIncidentRequest + 35, // 36: aes.monitoring.v1.AlertService.ListAlertInstances:input_type -> aes.monitoring.v1.ListAlertInstancesRequest + 38, // 37: aes.monitoring.v1.AlertService.ListAlertDestinationCandidates:input_type -> aes.monitoring.v1.ListAlertDestinationCandidatesRequest + 41, // 38: aes.monitoring.v1.AlertService.TestAlertDestination:input_type -> aes.monitoring.v1.TestAlertDestinationRequest + 43, // 39: aes.monitoring.v1.AlertService.GetDestinationTest:input_type -> aes.monitoring.v1.GetDestinationTestRequest + 3, // 40: aes.monitoring.v1.AlertService.ListAlertRules:output_type -> aes.monitoring.v1.ListAlertRulesResponse + 5, // 41: aes.monitoring.v1.AlertService.SaveAlertRule:output_type -> aes.monitoring.v1.SaveAlertRuleResponse + 7, // 42: aes.monitoring.v1.AlertService.DeleteAlertRule:output_type -> aes.monitoring.v1.DeleteAlertRuleResponse + 10, // 43: aes.monitoring.v1.AlertService.PreviewAlertRule:output_type -> aes.monitoring.v1.PreviewAlertRuleResponse + 13, // 44: aes.monitoring.v1.AlertService.ListAlertDestinations:output_type -> aes.monitoring.v1.ListAlertDestinationsResponse + 15, // 45: aes.monitoring.v1.AlertService.SaveAlertDestination:output_type -> aes.monitoring.v1.SaveAlertDestinationResponse + 17, // 46: aes.monitoring.v1.AlertService.DeleteAlertDestination:output_type -> aes.monitoring.v1.DeleteAlertDestinationResponse + 19, // 47: aes.monitoring.v1.AlertService.RequestDestinationVerification:output_type -> aes.monitoring.v1.RequestDestinationVerificationResponse + 21, // 48: aes.monitoring.v1.AlertService.VerifyAlertDestination:output_type -> aes.monitoring.v1.VerifyAlertDestinationResponse + 29, // 49: aes.monitoring.v1.AlertService.ListIncidents:output_type -> aes.monitoring.v1.ListIncidentsResponse + 25, // 50: aes.monitoring.v1.AlertService.GetIncidentSummary:output_type -> aes.monitoring.v1.GetIncidentSummaryResponse + 31, // 51: aes.monitoring.v1.AlertService.GetIncident:output_type -> aes.monitoring.v1.GetIncidentResponse + 33, // 52: aes.monitoring.v1.AlertService.UpdateIncident:output_type -> aes.monitoring.v1.UpdateIncidentResponse + 36, // 53: aes.monitoring.v1.AlertService.ListAlertInstances:output_type -> aes.monitoring.v1.ListAlertInstancesResponse + 39, // 54: aes.monitoring.v1.AlertService.ListAlertDestinationCandidates:output_type -> aes.monitoring.v1.ListAlertDestinationCandidatesResponse + 42, // 55: aes.monitoring.v1.AlertService.TestAlertDestination:output_type -> aes.monitoring.v1.TestAlertDestinationResponse + 44, // 56: aes.monitoring.v1.AlertService.GetDestinationTest:output_type -> aes.monitoring.v1.GetDestinationTestResponse + 40, // [40:57] is the sub-list for method output_type + 23, // [23:40] is the sub-list for method input_type + 23, // [23:23] is the sub-list for extension type_name + 23, // [23:23] is the sub-list for extension extendee + 0, // [0:23] is the sub-list for field type_name } func init() { file_aes_monitoring_v1_alerts_proto_init() } @@ -3522,7 +3612,7 @@ func file_aes_monitoring_v1_alerts_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_aes_monitoring_v1_alerts_proto_rawDesc), len(file_aes_monitoring_v1_alerts_proto_rawDesc)), NumEnums: 0, - NumMessages: 45, + NumMessages: 46, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/aes/monitoring/v1/monitoring.pb.go b/gen/go/aes/monitoring/v1/monitoring.pb.go index 7f9b6f7..1654d46 100644 --- a/gen/go/aes/monitoring/v1/monitoring.pb.go +++ b/gen/go/aes/monitoring/v1/monitoring.pb.go @@ -210,9 +210,10 @@ type ListVMMonitoringRequest struct { DatacenterName string `protobuf:"bytes,5,opt,name=datacenter_name,json=datacenterName,proto3" json:"datacenter_name,omitempty"` State string `protobuf:"bytes,6,opt,name=state,proto3" json:"state,omitempty"` // Record pickers can skip time-series queries. Status is then NOT_REQUESTED. - InventoryOnly bool `protobuf:"varint,7,opt,name=inventory_only,json=inventoryOnly,proto3" json:"inventory_only,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + InventoryOnly bool `protobuf:"varint,7,opt,name=inventory_only,json=inventoryOnly,proto3" json:"inventory_only,omitempty"` + IncludeOverview bool `protobuf:"varint,8,opt,name=include_overview,json=includeOverview,proto3" json:"include_overview,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListVMMonitoringRequest) Reset() { @@ -294,6 +295,13 @@ func (x *ListVMMonitoringRequest) GetInventoryOnly() bool { return false } +func (x *ListVMMonitoringRequest) GetIncludeOverview() bool { + if x != nil { + return x.IncludeOverview + } + return false +} + type MonitoredVM struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -416,6 +424,7 @@ type ListVMMonitoringResponse struct { Vms []*MonitoredVM `protobuf:"bytes,1,rep,name=vms,proto3" json:"vms,omitempty"` NextPageToken string `protobuf:"bytes,2,opt,name=next_page_token,json=nextPageToken,proto3" json:"next_page_token,omitempty"` QueryStatus string `protobuf:"bytes,3,opt,name=query_status,json=queryStatus,proto3" json:"query_status,omitempty"` + Overview *MonitoringOverview `protobuf:"bytes,4,opt,name=overview,proto3" json:"overview,omitempty"` unknownFields protoimpl.UnknownFields sizeCache protoimpl.SizeCache } @@ -471,6 +480,158 @@ func (x *ListVMMonitoringResponse) GetQueryStatus() string { return "" } +func (x *ListVMMonitoringResponse) GetOverview() *MonitoringOverview { + if x != nil { + return x.Overview + } + return nil +} + +type MonitoringDatacenterSummary struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` + VmCount int64 `protobuf:"varint,3,opt,name=vm_count,json=vmCount,proto3" json:"vm_count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MonitoringDatacenterSummary) Reset() { + *x = MonitoringDatacenterSummary{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MonitoringDatacenterSummary) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MonitoringDatacenterSummary) ProtoMessage() {} + +func (x *MonitoringDatacenterSummary) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[6] + 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 MonitoringDatacenterSummary.ProtoReflect.Descriptor instead. +func (*MonitoringDatacenterSummary) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{6} +} + +func (x *MonitoringDatacenterSummary) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *MonitoringDatacenterSummary) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *MonitoringDatacenterSummary) GetVmCount() int64 { + if x != nil { + return x.VmCount + } + return 0 +} + +type MonitoringOverview struct { + state protoimpl.MessageState `protogen:"open.v1"` + // Whole project, independent of the current page and filters. Not VM health. + VmCount int64 `protobuf:"varint,1,opt,name=vm_count,json=vmCount,proto3" json:"vm_count,omitempty"` + RunningCount int64 `protobuf:"varint,2,opt,name=running_count,json=runningCount,proto3" json:"running_count,omitempty"` + EnhancedConnectedCount int64 `protobuf:"varint,3,opt,name=enhanced_connected_count,json=enhancedConnectedCount,proto3" json:"enhanced_connected_count,omitempty"` + EnhancedStaleCount int64 `protobuf:"varint,4,opt,name=enhanced_stale_count,json=enhancedStaleCount,proto3" json:"enhanced_stale_count,omitempty"` + EnhancedAwaitingCount int64 `protobuf:"varint,5,opt,name=enhanced_awaiting_count,json=enhancedAwaitingCount,proto3" json:"enhanced_awaiting_count,omitempty"` + Datacenters []*MonitoringDatacenterSummary `protobuf:"bytes,6,rep,name=datacenters,proto3" json:"datacenters,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *MonitoringOverview) Reset() { + *x = MonitoringOverview{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *MonitoringOverview) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MonitoringOverview) ProtoMessage() {} + +func (x *MonitoringOverview) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[7] + 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 MonitoringOverview.ProtoReflect.Descriptor instead. +func (*MonitoringOverview) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{7} +} + +func (x *MonitoringOverview) GetVmCount() int64 { + if x != nil { + return x.VmCount + } + return 0 +} + +func (x *MonitoringOverview) GetRunningCount() int64 { + if x != nil { + return x.RunningCount + } + return 0 +} + +func (x *MonitoringOverview) GetEnhancedConnectedCount() int64 { + if x != nil { + return x.EnhancedConnectedCount + } + return 0 +} + +func (x *MonitoringOverview) GetEnhancedStaleCount() int64 { + if x != nil { + return x.EnhancedStaleCount + } + return 0 +} + +func (x *MonitoringOverview) GetEnhancedAwaitingCount() int64 { + if x != nil { + return x.EnhancedAwaitingCount + } + return 0 +} + +func (x *MonitoringOverview) GetDatacenters() []*MonitoringDatacenterSummary { + if x != nil { + return x.Datacenters + } + return nil +} + type QueryVMMonitoringRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -484,7 +645,7 @@ type QueryVMMonitoringRequest struct { func (x *QueryVMMonitoringRequest) Reset() { *x = QueryVMMonitoringRequest{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[6] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -496,7 +657,7 @@ func (x *QueryVMMonitoringRequest) String() string { func (*QueryVMMonitoringRequest) ProtoMessage() {} func (x *QueryVMMonitoringRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[6] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -509,7 +670,7 @@ func (x *QueryVMMonitoringRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryVMMonitoringRequest.ProtoReflect.Descriptor instead. func (*QueryVMMonitoringRequest) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{6} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{8} } func (x *QueryVMMonitoringRequest) GetName() string { @@ -557,7 +718,7 @@ type Sample struct { func (x *Sample) Reset() { *x = Sample{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[7] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -569,7 +730,7 @@ func (x *Sample) String() string { func (*Sample) ProtoMessage() {} func (x *Sample) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[7] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -582,7 +743,7 @@ func (x *Sample) ProtoReflect() protoreflect.Message { // Deprecated: Use Sample.ProtoReflect.Descriptor instead. func (*Sample) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{7} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{9} } func (x *Sample) GetTimestampUnix() int64 { @@ -610,7 +771,7 @@ type Series struct { func (x *Series) Reset() { *x = Series{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[8] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -622,7 +783,7 @@ func (x *Series) String() string { func (*Series) ProtoMessage() {} func (x *Series) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[8] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[10] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -635,7 +796,7 @@ func (x *Series) ProtoReflect() protoreflect.Message { // Deprecated: Use Series.ProtoReflect.Descriptor instead. func (*Series) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{8} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{10} } func (x *Series) GetMetricId() string { @@ -672,7 +833,7 @@ type MetricQuality struct { func (x *MetricQuality) Reset() { *x = MetricQuality{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[9] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -684,7 +845,7 @@ func (x *MetricQuality) String() string { func (*MetricQuality) ProtoMessage() {} func (x *MetricQuality) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[9] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[11] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -697,7 +858,7 @@ func (x *MetricQuality) ProtoReflect() protoreflect.Message { // Deprecated: Use MetricQuality.ProtoReflect.Descriptor instead. func (*MetricQuality) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{9} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{11} } func (x *MetricQuality) GetMetricId() string { @@ -741,7 +902,7 @@ type QueryVMMonitoringResponse struct { func (x *QueryVMMonitoringResponse) Reset() { *x = QueryVMMonitoringResponse{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[10] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -753,7 +914,7 @@ func (x *QueryVMMonitoringResponse) String() string { func (*QueryVMMonitoringResponse) ProtoMessage() {} func (x *QueryVMMonitoringResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[10] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -766,7 +927,7 @@ func (x *QueryVMMonitoringResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryVMMonitoringResponse.ProtoReflect.Descriptor instead. func (*QueryVMMonitoringResponse) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{10} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{12} } func (x *QueryVMMonitoringResponse) GetSeries() []*Series { @@ -819,15 +980,18 @@ type EnhancedMonitoring struct { RevokedAtUnix int64 `protobuf:"varint,10,opt,name=revoked_at_unix,json=revokedAtUnix,proto3" json:"revoked_at_unix,omitempty"` // Public installation identity, not a bearer credential. Requires the trusted // VMI-bound collection path; copying this configuration grants no authority. - ConfigurationJson string `protobuf:"bytes,11,opt,name=configuration_json,json=configurationJson,proto3" json:"configuration_json,omitempty"` - RuntimeState string `protobuf:"bytes,12,opt,name=runtime_state,json=runtimeState,proto3" json:"runtime_state,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + ConfigurationJson string `protobuf:"bytes,11,opt,name=configuration_json,json=configurationJson,proto3" json:"configuration_json,omitempty"` + RuntimeState string `protobuf:"bytes,12,opt,name=runtime_state,json=runtimeState,proto3" json:"runtime_state,omitempty"` + DiscoveredServices []string `protobuf:"bytes,13,rep,name=discovered_services,json=discoveredServices,proto3" json:"discovered_services,omitempty"` + SelectedServices []string `protobuf:"bytes,14,rep,name=selected_services,json=selectedServices,proto3" json:"selected_services,omitempty"` + ServiceDiscoveryStatus string `protobuf:"bytes,15,opt,name=service_discovery_status,json=serviceDiscoveryStatus,proto3" json:"service_discovery_status,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *EnhancedMonitoring) Reset() { *x = EnhancedMonitoring{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[11] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -839,7 +1003,7 @@ func (x *EnhancedMonitoring) String() string { func (*EnhancedMonitoring) ProtoMessage() {} func (x *EnhancedMonitoring) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[11] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[13] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -852,7 +1016,7 @@ func (x *EnhancedMonitoring) ProtoReflect() protoreflect.Message { // Deprecated: Use EnhancedMonitoring.ProtoReflect.Descriptor instead. func (*EnhancedMonitoring) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{11} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{13} } func (x *EnhancedMonitoring) GetName() string { @@ -939,6 +1103,27 @@ func (x *EnhancedMonitoring) GetRuntimeState() string { return "" } +func (x *EnhancedMonitoring) GetDiscoveredServices() []string { + if x != nil { + return x.DiscoveredServices + } + return nil +} + +func (x *EnhancedMonitoring) GetSelectedServices() []string { + if x != nil { + return x.SelectedServices + } + return nil +} + +func (x *EnhancedMonitoring) GetServiceDiscoveryStatus() string { + if x != nil { + return x.ServiceDiscoveryStatus + } + return "" +} + type GetEnhancedMonitoringRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -948,7 +1133,7 @@ type GetEnhancedMonitoringRequest struct { func (x *GetEnhancedMonitoringRequest) Reset() { *x = GetEnhancedMonitoringRequest{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[12] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -960,7 +1145,7 @@ func (x *GetEnhancedMonitoringRequest) String() string { func (*GetEnhancedMonitoringRequest) ProtoMessage() {} func (x *GetEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[12] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -973,7 +1158,7 @@ func (x *GetEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnhancedMonitoringRequest.ProtoReflect.Descriptor instead. func (*GetEnhancedMonitoringRequest) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{12} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{14} } func (x *GetEnhancedMonitoringRequest) GetName() string { @@ -992,7 +1177,7 @@ type GetEnhancedMonitoringResponse struct { func (x *GetEnhancedMonitoringResponse) Reset() { *x = GetEnhancedMonitoringResponse{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[13] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1004,7 +1189,7 @@ func (x *GetEnhancedMonitoringResponse) String() string { func (*GetEnhancedMonitoringResponse) ProtoMessage() {} func (x *GetEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[13] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1017,7 +1202,7 @@ func (x *GetEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnhancedMonitoringResponse.ProtoReflect.Descriptor instead. func (*GetEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{13} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{15} } func (x *GetEnhancedMonitoringResponse) GetMonitoring() *EnhancedMonitoring { @@ -1040,7 +1225,7 @@ type EnableEnhancedMonitoringRequest struct { func (x *EnableEnhancedMonitoringRequest) Reset() { *x = EnableEnhancedMonitoringRequest{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1052,7 +1237,7 @@ func (x *EnableEnhancedMonitoringRequest) String() string { func (*EnableEnhancedMonitoringRequest) ProtoMessage() {} func (x *EnableEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1065,7 +1250,7 @@ func (x *EnableEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EnableEnhancedMonitoringRequest.ProtoReflect.Descriptor instead. func (*EnableEnhancedMonitoringRequest) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{14} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{16} } func (x *EnableEnhancedMonitoringRequest) GetName() string { @@ -1098,7 +1283,7 @@ type EnableEnhancedMonitoringResponse struct { func (x *EnableEnhancedMonitoringResponse) Reset() { *x = EnableEnhancedMonitoringResponse{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1110,7 +1295,7 @@ func (x *EnableEnhancedMonitoringResponse) String() string { func (*EnableEnhancedMonitoringResponse) ProtoMessage() {} func (x *EnableEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1123,7 +1308,7 @@ func (x *EnableEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EnableEnhancedMonitoringResponse.ProtoReflect.Descriptor instead. func (*EnableEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{15} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{17} } func (x *EnableEnhancedMonitoringResponse) GetMonitoring() *EnhancedMonitoring { @@ -1144,7 +1329,7 @@ type RevokeEnhancedMonitoringRequest struct { func (x *RevokeEnhancedMonitoringRequest) Reset() { *x = RevokeEnhancedMonitoringRequest{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1156,7 +1341,7 @@ func (x *RevokeEnhancedMonitoringRequest) String() string { func (*RevokeEnhancedMonitoringRequest) ProtoMessage() {} func (x *RevokeEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1169,7 +1354,7 @@ func (x *RevokeEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeEnhancedMonitoringRequest.ProtoReflect.Descriptor instead. func (*RevokeEnhancedMonitoringRequest) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{16} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{18} } func (x *RevokeEnhancedMonitoringRequest) GetName() string { @@ -1194,7 +1379,7 @@ type RevokeEnhancedMonitoringResponse struct { func (x *RevokeEnhancedMonitoringResponse) Reset() { *x = RevokeEnhancedMonitoringResponse{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1206,7 +1391,7 @@ func (x *RevokeEnhancedMonitoringResponse) String() string { func (*RevokeEnhancedMonitoringResponse) ProtoMessage() {} func (x *RevokeEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1219,7 +1404,7 @@ func (x *RevokeEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeEnhancedMonitoringResponse.ProtoReflect.Descriptor instead. func (*RevokeEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{17} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{19} } var File_aes_monitoring_v1_monitoring_proto protoreflect.FileDescriptor @@ -1238,7 +1423,7 @@ const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + "\x1dListMetricDescriptorsResponse\x12=\n" + "\ametrics\x18\x01 \x03(\v2#.aes.monitoring.v1.MetricDescriptorR\ametrics\x12%\n" + "\x0eretention_days\x18\x02 \x01(\x05R\rretentionDays\x126\n" + - "\x17sample_interval_seconds\x18\x03 \x01(\x05R\x15sampleIntervalSeconds\"\xf6\x01\n" + + "\x17sample_interval_seconds\x18\x03 \x01(\x05R\x15sampleIntervalSeconds\"\xa1\x02\n" + "\x17ListVMMonitoringRequest\x12!\n" + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12\x1b\n" + "\tpage_size\x18\x02 \x01(\x05R\bpageSize\x12\x1d\n" + @@ -1247,7 +1432,8 @@ const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + "\x06search\x18\x04 \x01(\tR\x06search\x12'\n" + "\x0fdatacenter_name\x18\x05 \x01(\tR\x0edatacenterName\x12\x14\n" + "\x05state\x18\x06 \x01(\tR\x05state\x12%\n" + - "\x0einventory_only\x18\a \x01(\bR\rinventoryOnly\"\xfc\x03\n" + + "\x0einventory_only\x18\a \x01(\bR\rinventoryOnly\x12)\n" + + "\x10include_overview\x18\b \x01(\bR\x0fincludeOverview\"\xfc\x03\n" + "\vMonitoredVM\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12'\n" + @@ -1262,11 +1448,23 @@ const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + " \x01(\x01H\x02R\x15filesystemUsedPercent\x88\x01\x01B\x1a\n" + "\x18_cpu_utilization_percentB\x14\n" + "\x12_memory_used_bytesB\x1a\n" + - "\x18_filesystem_used_percent\"\x97\x01\n" + + "\x18_filesystem_used_percent\"\xda\x01\n" + "\x18ListVMMonitoringResponse\x120\n" + "\x03vms\x18\x01 \x03(\v2\x1e.aes.monitoring.v1.MonitoredVMR\x03vms\x12&\n" + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\x12!\n" + - "\fquery_status\x18\x03 \x01(\tR\vqueryStatus\"\xbc\x01\n" + + "\fquery_status\x18\x03 \x01(\tR\vqueryStatus\x12A\n" + + "\boverview\x18\x04 \x01(\v2%.aes.monitoring.v1.MonitoringOverviewR\boverview\"o\n" + + "\x1bMonitoringDatacenterSummary\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12!\n" + + "\fdisplay_name\x18\x02 \x01(\tR\vdisplayName\x12\x19\n" + + "\bvm_count\x18\x03 \x01(\x03R\avmCount\"\xca\x02\n" + + "\x12MonitoringOverview\x12\x19\n" + + "\bvm_count\x18\x01 \x01(\x03R\avmCount\x12#\n" + + "\rrunning_count\x18\x02 \x01(\x03R\frunningCount\x128\n" + + "\x18enhanced_connected_count\x18\x03 \x01(\x03R\x16enhancedConnectedCount\x120\n" + + "\x14enhanced_stale_count\x18\x04 \x01(\x03R\x12enhancedStaleCount\x126\n" + + "\x17enhanced_awaiting_count\x18\x05 \x01(\x03R\x15enhancedAwaitingCount\x12P\n" + + "\vdatacenters\x18\x06 \x03(\v2..aes.monitoring.v1.MonitoringDatacenterSummaryR\vdatacenters\"\xbc\x01\n" + "\x18QueryVMMonitoringRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12\x1d\n" + "\n" + @@ -1296,7 +1494,7 @@ const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + "\aquality\x18\x02 \x03(\v2 .aes.monitoring.v1.MetricQualityR\aquality\x12&\n" + "\x0fstart_time_unix\x18\x03 \x01(\x03R\rstartTimeUnix\x12\"\n" + "\rend_time_unix\x18\x04 \x01(\x03R\vendTimeUnix\x12!\n" + - "\fstep_seconds\x18\x05 \x01(\x05R\vstepSeconds\"\xd0\x03\n" + + "\fstep_seconds\x18\x05 \x01(\x05R\vstepSeconds\"\xe8\x04\n" + "\x12EnhancedMonitoring\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12'\n" + "\x0finstallation_id\x18\x02 \x01(\tR\x0einstallationId\x12\x1f\n" + @@ -1311,7 +1509,10 @@ const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + "\x0frevoked_at_unix\x18\n" + " \x01(\x03R\rrevokedAtUnix\x12-\n" + "\x12configuration_json\x18\v \x01(\tR\x11configurationJson\x12#\n" + - "\rruntime_state\x18\f \x01(\tR\fruntimeState\"2\n" + + "\rruntime_state\x18\f \x01(\tR\fruntimeState\x12/\n" + + "\x13discovered_services\x18\r \x03(\tR\x12discoveredServices\x12+\n" + + "\x11selected_services\x18\x0e \x03(\tR\x10selectedServices\x128\n" + + "\x18service_discovery_status\x18\x0f \x01(\tR\x16serviceDiscoveryStatus\"2\n" + "\x1cGetEnhancedMonitoringRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\"f\n" + "\x1dGetEnhancedMonitoringResponse\x12E\n" + @@ -1352,7 +1553,7 @@ func file_aes_monitoring_v1_monitoring_proto_rawDescGZIP() []byte { return file_aes_monitoring_v1_monitoring_proto_rawDescData } -var file_aes_monitoring_v1_monitoring_proto_msgTypes = make([]protoimpl.MessageInfo, 19) +var file_aes_monitoring_v1_monitoring_proto_msgTypes = make([]protoimpl.MessageInfo, 21) var file_aes_monitoring_v1_monitoring_proto_goTypes = []any{ (*MetricDescriptor)(nil), // 0: aes.monitoring.v1.MetricDescriptor (*ListMetricDescriptorsRequest)(nil), // 1: aes.monitoring.v1.ListMetricDescriptorsRequest @@ -1360,46 +1561,50 @@ var file_aes_monitoring_v1_monitoring_proto_goTypes = []any{ (*ListVMMonitoringRequest)(nil), // 3: aes.monitoring.v1.ListVMMonitoringRequest (*MonitoredVM)(nil), // 4: aes.monitoring.v1.MonitoredVM (*ListVMMonitoringResponse)(nil), // 5: aes.monitoring.v1.ListVMMonitoringResponse - (*QueryVMMonitoringRequest)(nil), // 6: aes.monitoring.v1.QueryVMMonitoringRequest - (*Sample)(nil), // 7: aes.monitoring.v1.Sample - (*Series)(nil), // 8: aes.monitoring.v1.Series - (*MetricQuality)(nil), // 9: aes.monitoring.v1.MetricQuality - (*QueryVMMonitoringResponse)(nil), // 10: aes.monitoring.v1.QueryVMMonitoringResponse - (*EnhancedMonitoring)(nil), // 11: aes.monitoring.v1.EnhancedMonitoring - (*GetEnhancedMonitoringRequest)(nil), // 12: aes.monitoring.v1.GetEnhancedMonitoringRequest - (*GetEnhancedMonitoringResponse)(nil), // 13: aes.monitoring.v1.GetEnhancedMonitoringResponse - (*EnableEnhancedMonitoringRequest)(nil), // 14: aes.monitoring.v1.EnableEnhancedMonitoringRequest - (*EnableEnhancedMonitoringResponse)(nil), // 15: aes.monitoring.v1.EnableEnhancedMonitoringResponse - (*RevokeEnhancedMonitoringRequest)(nil), // 16: aes.monitoring.v1.RevokeEnhancedMonitoringRequest - (*RevokeEnhancedMonitoringResponse)(nil), // 17: aes.monitoring.v1.RevokeEnhancedMonitoringResponse - nil, // 18: aes.monitoring.v1.Series.DimensionsEntry + (*MonitoringDatacenterSummary)(nil), // 6: aes.monitoring.v1.MonitoringDatacenterSummary + (*MonitoringOverview)(nil), // 7: aes.monitoring.v1.MonitoringOverview + (*QueryVMMonitoringRequest)(nil), // 8: aes.monitoring.v1.QueryVMMonitoringRequest + (*Sample)(nil), // 9: aes.monitoring.v1.Sample + (*Series)(nil), // 10: aes.monitoring.v1.Series + (*MetricQuality)(nil), // 11: aes.monitoring.v1.MetricQuality + (*QueryVMMonitoringResponse)(nil), // 12: aes.monitoring.v1.QueryVMMonitoringResponse + (*EnhancedMonitoring)(nil), // 13: aes.monitoring.v1.EnhancedMonitoring + (*GetEnhancedMonitoringRequest)(nil), // 14: aes.monitoring.v1.GetEnhancedMonitoringRequest + (*GetEnhancedMonitoringResponse)(nil), // 15: aes.monitoring.v1.GetEnhancedMonitoringResponse + (*EnableEnhancedMonitoringRequest)(nil), // 16: aes.monitoring.v1.EnableEnhancedMonitoringRequest + (*EnableEnhancedMonitoringResponse)(nil), // 17: aes.monitoring.v1.EnableEnhancedMonitoringResponse + (*RevokeEnhancedMonitoringRequest)(nil), // 18: aes.monitoring.v1.RevokeEnhancedMonitoringRequest + (*RevokeEnhancedMonitoringResponse)(nil), // 19: aes.monitoring.v1.RevokeEnhancedMonitoringResponse + nil, // 20: aes.monitoring.v1.Series.DimensionsEntry } var file_aes_monitoring_v1_monitoring_proto_depIdxs = []int32{ 0, // 0: aes.monitoring.v1.ListMetricDescriptorsResponse.metrics:type_name -> aes.monitoring.v1.MetricDescriptor 4, // 1: aes.monitoring.v1.ListVMMonitoringResponse.vms:type_name -> aes.monitoring.v1.MonitoredVM - 18, // 2: aes.monitoring.v1.Series.dimensions:type_name -> aes.monitoring.v1.Series.DimensionsEntry - 7, // 3: aes.monitoring.v1.Series.samples:type_name -> aes.monitoring.v1.Sample - 8, // 4: aes.monitoring.v1.QueryVMMonitoringResponse.series:type_name -> aes.monitoring.v1.Series - 9, // 5: aes.monitoring.v1.QueryVMMonitoringResponse.quality:type_name -> aes.monitoring.v1.MetricQuality - 11, // 6: aes.monitoring.v1.GetEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring - 11, // 7: aes.monitoring.v1.EnableEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring - 1, // 8: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:input_type -> aes.monitoring.v1.ListMetricDescriptorsRequest - 3, // 9: aes.monitoring.v1.MonitoringService.ListVMMonitoring:input_type -> aes.monitoring.v1.ListVMMonitoringRequest - 6, // 10: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:input_type -> aes.monitoring.v1.QueryVMMonitoringRequest - 12, // 11: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:input_type -> aes.monitoring.v1.GetEnhancedMonitoringRequest - 14, // 12: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:input_type -> aes.monitoring.v1.EnableEnhancedMonitoringRequest - 16, // 13: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:input_type -> aes.monitoring.v1.RevokeEnhancedMonitoringRequest - 2, // 14: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:output_type -> aes.monitoring.v1.ListMetricDescriptorsResponse - 5, // 15: aes.monitoring.v1.MonitoringService.ListVMMonitoring:output_type -> aes.monitoring.v1.ListVMMonitoringResponse - 10, // 16: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:output_type -> aes.monitoring.v1.QueryVMMonitoringResponse - 13, // 17: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:output_type -> aes.monitoring.v1.GetEnhancedMonitoringResponse - 15, // 18: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:output_type -> aes.monitoring.v1.EnableEnhancedMonitoringResponse - 17, // 19: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:output_type -> aes.monitoring.v1.RevokeEnhancedMonitoringResponse - 14, // [14:20] is the sub-list for method output_type - 8, // [8:14] is the sub-list for method input_type - 8, // [8:8] is the sub-list for extension type_name - 8, // [8:8] is the sub-list for extension extendee - 0, // [0:8] is the sub-list for field type_name + 7, // 2: aes.monitoring.v1.ListVMMonitoringResponse.overview:type_name -> aes.monitoring.v1.MonitoringOverview + 6, // 3: aes.monitoring.v1.MonitoringOverview.datacenters:type_name -> aes.monitoring.v1.MonitoringDatacenterSummary + 20, // 4: aes.monitoring.v1.Series.dimensions:type_name -> aes.monitoring.v1.Series.DimensionsEntry + 9, // 5: aes.monitoring.v1.Series.samples:type_name -> aes.monitoring.v1.Sample + 10, // 6: aes.monitoring.v1.QueryVMMonitoringResponse.series:type_name -> aes.monitoring.v1.Series + 11, // 7: aes.monitoring.v1.QueryVMMonitoringResponse.quality:type_name -> aes.monitoring.v1.MetricQuality + 13, // 8: aes.monitoring.v1.GetEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring + 13, // 9: aes.monitoring.v1.EnableEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring + 1, // 10: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:input_type -> aes.monitoring.v1.ListMetricDescriptorsRequest + 3, // 11: aes.monitoring.v1.MonitoringService.ListVMMonitoring:input_type -> aes.monitoring.v1.ListVMMonitoringRequest + 8, // 12: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:input_type -> aes.monitoring.v1.QueryVMMonitoringRequest + 14, // 13: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:input_type -> aes.monitoring.v1.GetEnhancedMonitoringRequest + 16, // 14: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:input_type -> aes.monitoring.v1.EnableEnhancedMonitoringRequest + 18, // 15: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:input_type -> aes.monitoring.v1.RevokeEnhancedMonitoringRequest + 2, // 16: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:output_type -> aes.monitoring.v1.ListMetricDescriptorsResponse + 5, // 17: aes.monitoring.v1.MonitoringService.ListVMMonitoring:output_type -> aes.monitoring.v1.ListVMMonitoringResponse + 12, // 18: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:output_type -> aes.monitoring.v1.QueryVMMonitoringResponse + 15, // 19: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:output_type -> aes.monitoring.v1.GetEnhancedMonitoringResponse + 17, // 20: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:output_type -> aes.monitoring.v1.EnableEnhancedMonitoringResponse + 19, // 21: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:output_type -> aes.monitoring.v1.RevokeEnhancedMonitoringResponse + 16, // [16:22] is the sub-list for method output_type + 10, // [10:16] is the sub-list for method input_type + 10, // [10:10] is the sub-list for extension type_name + 10, // [10:10] is the sub-list for extension extendee + 0, // [0:10] is the sub-list for field type_name } func init() { file_aes_monitoring_v1_monitoring_proto_init() } @@ -1414,7 +1619,7 @@ func file_aes_monitoring_v1_monitoring_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_aes_monitoring_v1_monitoring_proto_rawDesc), len(file_aes_monitoring_v1_monitoring_proto_rawDesc)), NumEnums: 0, - NumMessages: 19, + NumMessages: 21, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/openapi/metalhost.openapi.yaml b/gen/openapi/metalhost.openapi.yaml index 1b197c0..1863fc7 100644 --- a/gen/openapi/metalhost.openapi.yaml +++ b/gen/openapi/metalhost.openapi.yaml @@ -14443,7 +14443,7 @@ components: status: type: string title: status - description: AVAILABLE, AWAITING_DATA, SUPPRESSED, UNKNOWN intent/placement, or ERROR. + description: AVAILABLE, AWAITING_DATA, UNSUPPORTED, SUPPRESSED, UNKNOWN intent/placement, or ERROR. value: type: - number @@ -14453,6 +14453,18 @@ components: conditionMet: type: boolean title: condition_met + historicalFiringEpisodes: + type: integer + title: historical_firing_episodes + format: int32 + historicalEvaluatedSamples: + type: integer + title: historical_evaluated_samples + format: int32 + historicalExpectedSamples: + type: integer + title: historical_expected_samples + format: int32 title: AlertPreviewResource additionalProperties: false aes.monitoring.v1.AlertRule: @@ -14552,8 +14564,26 @@ components: items: type: string title: destination_names + dimensions: + type: object + title: dimensions + additionalProperties: + type: string + title: value + description: Optional exact observed dimensions; never arbitrary PromQL or regex. title: AlertRuleSpec additionalProperties: false + aes.monitoring.v1.AlertRuleSpec.DimensionsEntry: + type: object + properties: + key: + type: string + title: key + value: + type: string + title: value + title: DimensionsEntry + additionalProperties: false aes.monitoring.v1.DeleteAlertDestinationRequest: type: object properties: @@ -14706,6 +14736,19 @@ components: runtimeState: type: string title: runtime_state + discoveredServices: + type: array + items: + type: string + title: discovered_services + selectedServices: + type: array + items: + type: string + title: selected_services + serviceDiscoveryStatus: + type: string + title: service_discovery_status title: EnhancedMonitoring additionalProperties: false aes.monitoring.v1.GetDestinationTestRequest: @@ -15187,6 +15230,9 @@ components: type: boolean title: inventory_only description: Record pickers can skip time-series queries. Status is then NOT_REQUESTED. + includeOverview: + type: boolean + title: include_overview title: ListVMMonitoringRequest additionalProperties: false aes.monitoring.v1.ListVMMonitoringResponse: @@ -15203,6 +15249,9 @@ components: queryStatus: type: string title: query_status + overview: + title: overview + $ref: '#/components/schemas/aes.monitoring.v1.MonitoringOverview' title: ListVMMonitoringResponse additionalProperties: false aes.monitoring.v1.MetricDescriptor: @@ -15294,6 +15343,64 @@ components: format: double title: MonitoredVM additionalProperties: false + aes.monitoring.v1.MonitoringDatacenterSummary: + type: object + properties: + name: + type: string + title: name + displayName: + type: string + title: display_name + vmCount: + type: + - integer + - string + title: vm_count + format: int64 + title: MonitoringDatacenterSummary + additionalProperties: false + aes.monitoring.v1.MonitoringOverview: + type: object + properties: + vmCount: + type: + - integer + - string + title: vm_count + format: int64 + description: Whole project, independent of the current page and filters. Not VM health. + runningCount: + type: + - integer + - string + title: running_count + format: int64 + enhancedConnectedCount: + type: + - integer + - string + title: enhanced_connected_count + format: int64 + enhancedStaleCount: + type: + - integer + - string + title: enhanced_stale_count + format: int64 + enhancedAwaitingCount: + type: + - integer + - string + title: enhanced_awaiting_count + format: int64 + datacenters: + type: array + items: + $ref: '#/components/schemas/aes.monitoring.v1.MonitoringDatacenterSummary' + title: datacenters + title: MonitoringOverview + additionalProperties: false aes.monitoring.v1.PreviewAlertRuleRequest: type: object properties: @@ -15303,6 +15410,11 @@ components: spec: title: spec $ref: '#/components/schemas/aes.monitoring.v1.AlertRuleSpec' + historySeconds: + type: integer + title: history_seconds + format: int32 + description: Zero keeps the current-sample preview; otherwise 3600, 21600, or 86400. title: PreviewAlertRuleRequest additionalProperties: false aes.monitoring.v1.PreviewAlertRuleResponse: @@ -15326,6 +15438,25 @@ components: explanation: type: string title: explanation + historyStartUnix: + type: + - integer + - string + title: history_start_unix + format: int64 + historyEndUnix: + type: + - integer + - string + title: history_end_unix + format: int64 + historyStepSeconds: + type: integer + title: history_step_seconds + format: int32 + historyStatus: + type: string + title: history_status title: PreviewAlertRuleResponse additionalProperties: false aes.monitoring.v1.QueryVMMonitoringRequest: diff --git a/proto/aes/monitoring/v1/alerts.proto b/proto/aes/monitoring/v1/alerts.proto index 8837023..486e6cb 100644 --- a/proto/aes/monitoring/v1/alerts.proto +++ b/proto/aes/monitoring/v1/alerts.proto @@ -37,6 +37,8 @@ message AlertRuleSpec { bool enabled = 9; int32 repeat_interval_seconds = 10; repeated string destination_names = 11; + // Optional exact observed dimensions; never arbitrary PromQL or regex. + map dimensions = 12; } message AlertRule { string id = 1; @@ -79,14 +81,19 @@ message DeleteAlertRuleResponse {} message PreviewAlertRuleRequest { string project_name = 1; AlertRuleSpec spec = 2; + // Zero keeps the current-sample preview; otherwise 3600, 21600, or 86400. + int32 history_seconds = 3; } message AlertPreviewResource { string vm_name = 1; string display_name = 2; - // AVAILABLE, AWAITING_DATA, SUPPRESSED, UNKNOWN intent/placement, or ERROR. + // AVAILABLE, AWAITING_DATA, UNSUPPORTED, SUPPRESSED, UNKNOWN intent/placement, or ERROR. string status = 3; optional double value = 4; bool condition_met = 5; + int32 historical_firing_episodes = 6; + int32 historical_evaluated_samples = 7; + int32 historical_expected_samples = 8; } message PreviewAlertRuleResponse { int32 matched_resource_count = 1; @@ -94,6 +101,10 @@ message PreviewAlertRuleResponse { bool sample_only = 3; string query_status = 4; string explanation = 5; + int64 history_start_unix = 6; + int64 history_end_unix = 7; + int32 history_step_seconds = 8; + string history_status = 9; } message AlertDestination { diff --git a/proto/aes/monitoring/v1/monitoring.proto b/proto/aes/monitoring/v1/monitoring.proto index 5397ee8..0914dba 100644 --- a/proto/aes/monitoring/v1/monitoring.proto +++ b/proto/aes/monitoring/v1/monitoring.proto @@ -33,6 +33,7 @@ message ListVMMonitoringRequest { string state = 6; // Record pickers can skip time-series queries. Status is then NOT_REQUESTED. bool inventory_only = 7; + bool include_overview = 8; } message MonitoredVM { string name = 1; @@ -51,6 +52,21 @@ message ListVMMonitoringResponse { repeated MonitoredVM vms = 1; string next_page_token = 2; string query_status = 3; + MonitoringOverview overview = 4; +} +message MonitoringDatacenterSummary { + string name = 1; + string display_name = 2; + int64 vm_count = 3; +} +message MonitoringOverview { + // Whole project, independent of the current page and filters. Not VM health. + int64 vm_count = 1; + int64 running_count = 2; + int64 enhanced_connected_count = 3; + int64 enhanced_stale_count = 4; + int64 enhanced_awaiting_count = 5; + repeated MonitoringDatacenterSummary datacenters = 6; } message QueryVMMonitoringRequest { string name = 1; @@ -99,6 +115,9 @@ message EnhancedMonitoring { // VMI-bound collection path; copying this configuration grants no authority. string configuration_json = 11; string runtime_state = 12; + repeated string discovered_services = 13; + repeated string selected_services = 14; + string service_discovery_status = 15; } message GetEnhancedMonitoringRequest { string name = 1; } message GetEnhancedMonitoringResponse { EnhancedMonitoring monitoring = 1; } From 8c9aa97e9cd0164fea9f241115852a27edd3d081 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Thu, 24 Sep 2026 20:53:35 -0500 Subject: [PATCH 3/5] Document September APIs with authenticated monitoring and webhook examples --- README.md | 5 +++ docs/API_SURFACE.md | 7 ++- docs/OBSERVABILITY.md | 64 +++++++++++++++++++++++++--- examples/monitoring/main.go | 49 +++++++++++++++++++++ examples/webhookreceiver/receiver.go | 50 ++++++++++++++++++++++ 5 files changed, 169 insertions(+), 6 deletions(-) create mode 100644 examples/monitoring/main.go create mode 100644 examples/webhookreceiver/receiver.go diff --git a/README.md b/README.md index 895387f..b1426b4 100644 --- a/README.md +++ b/README.md @@ -58,6 +58,11 @@ For the coordinated, unreleased September APIs, see [Observability](docs/OBSERVA scoped automation/GitHub identity, monitoring endpoints, Grafana, alerts, and timestamped webhook verification with overlapping rotation. +Read-only and receiver examples are in [examples/monitoring](examples/monitoring/main.go) +and [examples/webhookreceiver](examples/webhookreceiver/receiver.go). Compile/check +them without making API requests with `go test ./metalhost ./examples/...`. +Managed GitHub runners are not part of the workflow identity integration. + ## Keep the API snapshot synchronized Install pinned generation tools once: diff --git a/docs/API_SURFACE.md b/docs/API_SURFACE.md index 97cb1b7..4941c8a 100644 --- a/docs/API_SURFACE.md +++ b/docs/API_SURFACE.md @@ -7,7 +7,9 @@ The SDK's public Go surface has two layers: ## Generated services -The released snapshot includes: +This checkout's snapshot includes the services below. The September entries +remain coordinated-release previews; this list is not a claim that every +published SDK version or production endpoint exposes them. - audit - bare metal @@ -90,3 +92,6 @@ that a recipient read a notification. Missing data is never healthy zero usage. Hosted PromQL and Prometheus scrape endpoints are ordinary authenticated HTTP interfaces, not Connect RPCs. Use a project-scoped `monitoring.read` credential; the server derives immutable tenant identity and does not trust tenant headers. + +See [Observability](OBSERVABILITY.md) for runnable examples and explicit CLI/API +boundaries. Workflow identity does not provision GitHub runners. diff --git a/docs/OBSERVABILITY.md b/docs/OBSERVABILITY.md index f6a6b79..a296909 100644 --- a/docs/OBSERVABILITY.md +++ b/docs/OBSERVABILITY.md @@ -25,9 +25,16 @@ Do not trust a repository name alone. The workflow needs `id-token: write`; assertions must match the deployment's configured audience and fixed GitHub issuer. Pull-request events are not permitted. The exchanged token lasts 15 minutes, has no refresh token, and can only use its configured project/grants. -Prefer the CLI's `auth github -- COMMAND`; it masks tokens and supplies the -short-lived credential only to the child environment, not a config file or -GitHub artifact. Long jobs need a fresh assertion/exchange. +The September CLI branch implements `auth github` and `monitoring`; older +CLI releases do not. Alternatively, use the +[complete HTTP workflow example](https://metalhost.net/docs/developers/guides/github-actions) +from the coordinated docs release. Exchange through +`AutomationService.ExchangeGitHubToken` with `trust_name` and `assertion`; use +the returned `access_token` as Bearer, scoped to the returned `project_name`. +Mask both tokens and keep them in one step, not a config file, `GITHUB_ENV` or +artifact. Long jobs need a fresh assertion/exchange. The trust's exact workflow, +branch, event and environment must match verification. This is not GitHub sign-in +and does not provision runners. Managed runners are planned separately. ## Metrics, Grafana and Prometheus @@ -57,12 +64,36 @@ scraping need `authorization.credentials_file`. Keep the credential file mode 0600. The exporter omits expired samples instead of refreshing old observations. The initial hosted limit is seven days, minimum 30-second query steps, 10,000 -points/series budget, four concurrent queries per project and a 4-MiB response -cap. Narrow queries on 422; back off on 429; show an unavailable state on service +points per series, a 16-KiB public expression cap and a 4-MiB response +cap. Concurrency is per project per gateway replica: four in earlier previews, +twelve in the follow-up backend implementation, also subject to a global budget. +Narrow queries on 422; back off on 429; show an unavailable state on service failure. Empty, unsupported and stale metrics are not zero or proof of health. Use `MonitoringService` for typed metric descriptors, VM summaries and curated chart responses with per-family quality. Metric samples are never invoices. +### Runnable read-only example + +The [monitoring example](../examples/monitoring/main.go) uses this checkout's +generated client and explicitly installs `Config.RoundTripper`; `Config.Client` +does not add Bearer authentication on its own. Set `METALHOST_ENDPOINT` to an +enabled HTTPS API origin, `METALHOST_VM` to a full resource name, and load +`METALHOST_API_KEY` from your secret manager with `monitoring.read`, then run: + +```sh +go run ./examples/monitoring +``` + +It queries one hour of CPU/memory, prints quality and sample counts, and changes +no resources. Seven-day queries need a coarser step (for example 1800 seconds), +not 60 seconds. Use returned bounds/step and retain quality alongside values. +List calls use `next_page_token`/`page_token`; one page is not a whole inventory. + +Optional guest pause/resume is a newer follow-up API not present in this SDK +snapshot. Do not assume generated clients track an unreleased backend checkout. +The portal and verified collector archive remain the installation entry points; +revocation is permanent, unlike pause, and does not uninstall guest software. + ## Alerts and destinations `AlertService` manages structured rules, current/future VM selections, previews, @@ -78,6 +109,10 @@ Enhanced templates accept only their allowlisted exact `dimensions`; obtain mount/service/GPU names from observations rather than constructing PromQL. Acknowledging or snoozing an incident does not resolve it. A missing metric or collector outage must not manufacture recovery. +`OPEN` means recovery has not been confirmed, not that the retained incident +value is live. `RECOVERED` requires recovery evidence; `RETIRED` records a changed +rule/resource context rather than fabricated recovery. Rule saving is a separate +mutation from preview; use stable UUIDs and expected versions. Select existing project-member or webhook rows as destinations. Email needs recipient verification; destination pause stops future sending without changing @@ -85,6 +120,13 @@ incident history. `TestAlertDestination` is an explicit external send with a stable request UUID; poll `GetDestinationTest`. The latest retained result is also returned by `ListAlertDestinations`. `SENT` means provider/endpoint acceptance, not that a person read it. +Slack, Discord and Teams destinations take a write-only provider webhook URL +at creation. Changing that endpoint requires a new destination. Check the +deployment's channel availability before asking recipients to verify or test. +Scoped automation is an RPC allowlist: `monitoring.write` is not blanket access +to every AlertService method. In particular, verification, destination tests +and incident acknowledgements use the authorized human dashboard flow in the +current implementation. ## Verify and rotate webhook signatures @@ -101,6 +143,18 @@ signatures and keep a trustworthy clock. The verifier authenticates clock/replay window. It does not implement durable deduplication for you. It never falls back to the legacy untimestamped header. +See the compilable [receiver example](../examples/webhookreceiver/receiver.go). +Supply an `Inbox` implementation that atomically stores the verified raw body +with a unique delivery ID before returning 2xx. An in-memory map is insufficient +across restarts/replicas. Decode/process from that durable inbox; deduplicate +individual event IDs as well when grouped deliveries overlap. + +Check examples without making API requests: + +```sh +go test ./metalhost ./examples/... +``` + `WebhooksService.RotateSubscriptionSecret` requires the current secret version and a stable request UUID. A successful original call returns one new secret; retry recovery returns metadata plus `secret_unavailable`. Select immediate diff --git a/examples/monitoring/main.go b/examples/monitoring/main.go new file mode 100644 index 0000000..06457fd --- /dev/null +++ b/examples/monitoring/main.go @@ -0,0 +1,49 @@ +// Read-only monitoring example; requires an explicitly enabled API environment. +package main + +import ( + "context" + "fmt" + "log" + "net/http" + "os" + "time" + + "connectrpc.com/connect" + monitoringv1 "github.com/AES-Services/metalhost-sdk/gen/go/aes/monitoring/v1" + "github.com/AES-Services/metalhost-sdk/gen/go/aes/monitoring/v1/monitoringv1connect" + "github.com/AES-Services/metalhost-sdk/metalhost" +) + +func main() { + cfg := metalhost.Config{Endpoint: os.Getenv("METALHOST_ENDPOINT"), APIKey: os.Getenv("METALHOST_API_KEY")} + vm := os.Getenv("METALHOST_VM") + if cfg.Endpoint == "" || cfg.APIKey == "" || vm == "" { + log.Fatal("set METALHOST_ENDPOINT, METALHOST_API_KEY and the full METALHOST_VM resource name") + } + cfg.HTTPClient = &http.Client{ + Transport: cfg.RoundTripper(http.DefaultTransport), + Timeout: 30 * time.Second, + CheckRedirect: func(_ *http.Request, _ []*http.Request) error { + return http.ErrUseLastResponse + }, + } + client := monitoringv1connect.NewMonitoringServiceClient(cfg.Client(), cfg.BaseURL()) + ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second) + defer cancel() + end := time.Now().Unix() + result, err := client.QueryVMMonitoring(ctx, connect.NewRequest(&monitoringv1.QueryVMMonitoringRequest{ + Name: vm, MetricIds: []string{"cpu_utilization_pct", "memory_used_bytes"}, + StartTimeUnix: end - 3600, EndTimeUnix: end, StepSeconds: 60, + })) + if err != nil { + log.Fatal(err) + } + fmt.Printf("bounds=%d..%d step=%ds\n", result.Msg.StartTimeUnix, result.Msg.EndTimeUnix, result.Msg.StepSeconds) + for _, quality := range result.Msg.Quality { + fmt.Printf("%s: %s observed=%d\n", quality.MetricId, quality.Status, quality.ObservedAtUnix) + } + for _, series := range result.Msg.Series { + fmt.Printf("%s dimensions=%v samples=%d\n", series.MetricId, series.Dimensions, len(series.Samples)) + } +} diff --git a/examples/webhookreceiver/receiver.go b/examples/webhookreceiver/receiver.go new file mode 100644 index 0000000..b478cc7 --- /dev/null +++ b/examples/webhookreceiver/receiver.go @@ -0,0 +1,50 @@ +// Package webhookreceiver demonstrates bounded V2 verification and durable handoff. +// It is not a standalone server: supply a durable Inbox and serve behind HTTPS. +package webhookreceiver + +import ( + "context" + "io" + "net/http" + "time" + + "github.com/AES-Services/metalhost-sdk/metalhost" +) + +// Inbox must atomically persist the verified body with a unique DeliveryID. +// Duplicate IDs are successful no-ops, not errors. A worker processes persisted +// bodies and deduplicates individual event IDs where grouped payloads overlap. +// Scope the inbox to this subscription; never use an unverified header as a key. +type Inbox interface { + PutOnce(context.Context, string, []byte) error +} + +func Handler(secret string, inbox Inbox) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + if r.Method != http.MethodPost { + w.Header().Set("Allow", http.MethodPost) + http.Error(w, "POST required", http.StatusMethodNotAllowed) + return + } + if inbox == nil { + http.Error(w, "receiver unavailable", http.StatusServiceUnavailable) + return + } + body, err := io.ReadAll(http.MaxBytesReader(w, r.Body, 1<<20)) + if err != nil { + http.Error(w, "invalid or oversized body", http.StatusBadRequest) + return + } + identity, err := metalhost.VerifyWebhook(r.Header, body, secret, time.Now()) + if err != nil { + http.Error(w, "invalid signature", http.StatusUnauthorized) + return + } + // Acknowledge only after durable storage. Do not log the raw body or secret. + if err := inbox.PutOnce(r.Context(), identity.DeliveryID, body); err != nil { + http.Error(w, "receiver unavailable", http.StatusServiceUnavailable) + return + } + w.WriteHeader(http.StatusAccepted) + }) +} From 73ae03d8c84a78f7dfe03efb0abc61648cbecde9 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Thu, 24 Sep 2026 23:50:45 -0500 Subject: [PATCH 4/5] Sync September follow-up public contracts and examples --- docs/OBSERVABILITY.md | 35 ++- gen/go/aes/iam/v1/automation.pb.go | 19 +- gen/go/aes/monitoring/v1/alerts.pb.go | 23 +- gen/go/aes/monitoring/v1/monitoring.pb.go | 218 ++++++++++++++---- .../monitoringv1connect/monitoring.connect.go | 42 +++- gen/openapi/metalhost.openapi.yaml | 80 ++++++- metalhost/observability_contract_test.go | 61 +++++ proto/aes/iam/v1/automation.proto | 3 + proto/aes/monitoring/v1/alerts.proto | 6 +- proto/aes/monitoring/v1/monitoring.proto | 12 +- 10 files changed, 428 insertions(+), 71 deletions(-) create mode 100644 metalhost/observability_contract_test.go diff --git a/docs/OBSERVABILITY.md b/docs/OBSERVABILITY.md index a296909..07efc21 100644 --- a/docs/OBSERVABILITY.md +++ b/docs/OBSERVABILITY.md @@ -89,10 +89,33 @@ no resources. Seven-day queries need a coarser step (for example 1800 seconds), not 60 seconds. Use returned bounds/step and retain quality alongside values. List calls use `next_page_token`/`page_token`; one page is not a whole inventory. -Optional guest pause/resume is a newer follow-up API not present in this SDK -snapshot. Do not assume generated clients track an unreleased backend checkout. -The portal and verified collector archive remain the installation entry points; -revocation is permanent, unlike pause, and does not uninstall guest software. +This snapshot includes `SetEnhancedMonitoringPaused`. Use `GetEnhancedMonitoring` +to obtain the current `installation_id`, then send the full VM `name`, that ID, +`paused: true`, and a fresh UUID `request_id`. To resume, send `paused: false` +with a new request ID. Retry an uncertain operation with its original ID and +unchanged body. Pause/resume requires `monitoring.write`, preserves the +installation and retained history, and does not stop/start the VM or uninstall +software. Revocation is permanent. The portal and verified collector archive +remain the installation entry points. + +For example, with an authenticated generated `MonitoringServiceClient`: + +```go +response, err := client.SetEnhancedMonitoringPaused(ctx, connect.NewRequest( + &monitoringv1.SetEnhancedMonitoringPausedRequest{ + Name: vmName, InstallationId: installationID, + Paused: true, RequestId: requestID, + }, +)) +``` + +Retain `requestID` before sending; inspect `response.Msg.Monitoring.Status` after +success. Resume uses the same installation, not a second enrollment. + +Project administrators can list all project credentials with +`ListCredentialsRequest{ProjectName: project, AllProjectCredentials: true}`. +Do not combine that flag with `service_account`. It permits inspection/revocation +under the backend's authorization rules, not rotation of another member's key. ## Alerts and destinations @@ -121,7 +144,9 @@ stable request UUID; poll `GetDestinationTest`. The latest retained result is also returned by `ListAlertDestinations`. `SENT` means provider/endpoint acceptance, not that a person read it. Slack, Discord and Teams destinations take a write-only provider webhook URL -at creation. Changing that endpoint requires a new destination. Check the +in `SaveAlertDestinationRequest.webhook_url` at creation. Read it from a secret +manager or private input file, never source control or logs. Omit it when editing +an existing destination. Changing that endpoint requires a new destination. Check the deployment's channel availability before asking recipients to verify or test. Scoped automation is an RPC allowlist: `monitoring.write` is not blanket access to every AlertService method. In particular, verification, destination tests diff --git a/gen/go/aes/iam/v1/automation.pb.go b/gen/go/aes/iam/v1/automation.pb.go index 6cd8d9a..e384a8e 100644 --- a/gen/go/aes/iam/v1/automation.pb.go +++ b/gen/go/aes/iam/v1/automation.pb.go @@ -1148,8 +1148,11 @@ type ListCredentialsRequest struct { ServiceAccount string `protobuf:"bytes,2,opt,name=service_account,json=serviceAccount,proto3" json:"service_account,omitempty"` PageSize int32 `protobuf:"varint,3,opt,name=page_size,json=pageSize,proto3" json:"page_size,omitempty"` PageToken string `protobuf:"bytes,4,opt,name=page_token,json=pageToken,proto3" json:"page_token,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Project administrators may inspect all project API keys. Cannot be combined + // with service_account. This never grants permission to rotate another user's key. + AllProjectCredentials bool `protobuf:"varint,5,opt,name=all_project_credentials,json=allProjectCredentials,proto3" json:"all_project_credentials,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *ListCredentialsRequest) Reset() { @@ -1210,6 +1213,13 @@ func (x *ListCredentialsRequest) GetPageToken() string { return "" } +func (x *ListCredentialsRequest) GetAllProjectCredentials() bool { + if x != nil { + return x.AllProjectCredentials + } + return false +} + type ListCredentialsResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Credentials []*AutomationCredential `protobuf:"bytes,1,rep,name=credentials,proto3" json:"credentials,omitempty"` @@ -2775,13 +2785,14 @@ const file_aes_iam_v1_automation_proto_rawDesc = "" + "credential\x18\x01 \x01(\v2 .aes.iam.v1.AutomationCredentialR\n" + "credential\x12\x16\n" + "\x06secret\x18\x02 \x01(\tR\x06secret\x12-\n" + - "\x12secret_unavailable\x18\x03 \x01(\bR\x11secretUnavailable\"\xa0\x01\n" + + "\x12secret_unavailable\x18\x03 \x01(\bR\x11secretUnavailable\"\xd8\x01\n" + "\x16ListCredentialsRequest\x12!\n" + "\fproject_name\x18\x01 \x01(\tR\vprojectName\x12'\n" + "\x0fservice_account\x18\x02 \x01(\tR\x0eserviceAccount\x12\x1b\n" + "\tpage_size\x18\x03 \x01(\x05R\bpageSize\x12\x1d\n" + "\n" + - "page_token\x18\x04 \x01(\tR\tpageToken\"\x85\x01\n" + + "page_token\x18\x04 \x01(\tR\tpageToken\x126\n" + + "\x17all_project_credentials\x18\x05 \x01(\bR\x15allProjectCredentials\"\x85\x01\n" + "\x17ListCredentialsResponse\x12B\n" + "\vcredentials\x18\x01 \x03(\v2 .aes.iam.v1.AutomationCredentialR\vcredentials\x12&\n" + "\x0fnext_page_token\x18\x02 \x01(\tR\rnextPageToken\"u\n" + diff --git a/gen/go/aes/monitoring/v1/alerts.pb.go b/gen/go/aes/monitoring/v1/alerts.pb.go index 1aaa936..1a4972b 100644 --- a/gen/go/aes/monitoring/v1/alerts.pb.go +++ b/gen/go/aes/monitoring/v1/alerts.pb.go @@ -888,7 +888,8 @@ type AlertDestination struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` ProjectName string `protobuf:"bytes,2,opt,name=project_name,json=projectName,proto3" json:"project_name,omitempty"` DisplayName string `protobuf:"bytes,3,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"` - // EMAIL selects an existing verified project member; WEBHOOK an existing subscription. + // EMAIL selects a verified project member; WEBHOOK an existing subscription. + // SLACK, DISCORD and TEAMS use an encrypted, immutable provider webhook URL. Kind string `protobuf:"bytes,4,opt,name=kind,proto3" json:"kind,omitempty"` Principal string `protobuf:"bytes,5,opt,name=principal,proto3" json:"principal,omitempty"` SubscriptionName string `protobuf:"bytes,6,opt,name=subscription_name,json=subscriptionName,proto3" json:"subscription_name,omitempty"` @@ -1137,8 +1138,11 @@ type SaveAlertDestinationRequest struct { RequestId string `protobuf:"bytes,2,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` // Zero for create; otherwise the version last read. ExpectedVersion int64 `protobuf:"varint,3,opt,name=expected_version,json=expectedVersion,proto3" json:"expected_version,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Write-only, required when creating SLACK/DISCORD/TEAMS. Omit on edits. + // Changing the endpoint requires a new destination to avoid redirecting queued alerts. + WebhookUrl string `protobuf:"bytes,4,opt,name=webhook_url,json=webhookUrl,proto3" json:"webhook_url,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *SaveAlertDestinationRequest) Reset() { @@ -1192,6 +1196,13 @@ func (x *SaveAlertDestinationRequest) GetExpectedVersion() int64 { return 0 } +func (x *SaveAlertDestinationRequest) GetWebhookUrl() string { + if x != nil { + return x.WebhookUrl + } + return "" +} + type SaveAlertDestinationResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Destination *AlertDestination `protobuf:"bytes,1,opt,name=destination,proto3" json:"destination,omitempty"` @@ -3287,12 +3298,14 @@ const file_aes_monitoring_v1_alerts_proto_rawDesc = "" + "\x05limit\x18\x02 \x01(\x05R\x05limit\x12)\n" + "\x10caller_principal\x18\x03 \x01(\tR\x0fcallerPrincipal\x12'\n" + "\x0femail_available\x18\x04 \x01(\bR\x0eemailAvailable\x12+\n" + - "\x11webhook_available\x18\x05 \x01(\bR\x10webhookAvailable\"\xae\x01\n" + + "\x11webhook_available\x18\x05 \x01(\bR\x10webhookAvailable\"\xcf\x01\n" + "\x1bSaveAlertDestinationRequest\x12E\n" + "\vdestination\x18\x01 \x01(\v2#.aes.monitoring.v1.AlertDestinationR\vdestination\x12\x1d\n" + "\n" + "request_id\x18\x02 \x01(\tR\trequestId\x12)\n" + - "\x10expected_version\x18\x03 \x01(\x03R\x0fexpectedVersion\"e\n" + + "\x10expected_version\x18\x03 \x01(\x03R\x0fexpectedVersion\x12\x1f\n" + + "\vwebhook_url\x18\x04 \x01(\tR\n" + + "webhookUrl\"e\n" + "\x1cSaveAlertDestinationResponse\x12E\n" + "\vdestination\x18\x01 \x01(\v2#.aes.monitoring.v1.AlertDestinationR\vdestination\"\xa0\x01\n" + "\x1dDeleteAlertDestinationRequest\x12!\n" + diff --git a/gen/go/aes/monitoring/v1/monitoring.pb.go b/gen/go/aes/monitoring/v1/monitoring.pb.go index 1654d46..c2854e8 100644 --- a/gen/go/aes/monitoring/v1/monitoring.pb.go +++ b/gen/go/aes/monitoring/v1/monitoring.pb.go @@ -970,7 +970,7 @@ type EnhancedMonitoring struct { Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` InstallationId string `protobuf:"bytes,2,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"` ResourceId string `protobuf:"bytes,3,opt,name=resource_id,json=resourceId,proto3" json:"resource_id,omitempty"` - // DISABLED, AWAITING_INSTALLATION, CONNECTED, STALE, REVOKED, UNSUPPORTED. + // DISABLED, AWAITING_INSTALLATION, CONNECTED, STALE, PAUSED, REVOKED, UNSUPPORTED. Status string `protobuf:"bytes,4,opt,name=status,proto3" json:"status,omitempty"` DeviceReady bool `protobuf:"varint,5,opt,name=device_ready,json=deviceReady,proto3" json:"device_ready,omitempty"` RestartRequired bool `protobuf:"varint,6,opt,name=restart_required,json=restartRequired,proto3" json:"restart_required,omitempty"` @@ -979,7 +979,7 @@ type EnhancedMonitoring struct { LastSeenAtUnix int64 `protobuf:"varint,9,opt,name=last_seen_at_unix,json=lastSeenAtUnix,proto3" json:"last_seen_at_unix,omitempty"` RevokedAtUnix int64 `protobuf:"varint,10,opt,name=revoked_at_unix,json=revokedAtUnix,proto3" json:"revoked_at_unix,omitempty"` // Public installation identity, not a bearer credential. Requires the trusted - // VMI-bound collection path; copying this configuration grants no authority. + // VM-bound collection path; copying this configuration grants no authority. ConfigurationJson string `protobuf:"bytes,11,opt,name=configuration_json,json=configurationJson,proto3" json:"configuration_json,omitempty"` RuntimeState string `protobuf:"bytes,12,opt,name=runtime_state,json=runtimeState,proto3" json:"runtime_state,omitempty"` DiscoveredServices []string `protobuf:"bytes,13,rep,name=discovered_services,json=discoveredServices,proto3" json:"discovered_services,omitempty"` @@ -1407,6 +1407,118 @@ func (*RevokeEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{19} } +type SetEnhancedMonitoringPausedRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + InstallationId string `protobuf:"bytes,2,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"` + Paused bool `protobuf:"varint,3,opt,name=paused,proto3" json:"paused,omitempty"` + RequestId string `protobuf:"bytes,4,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SetEnhancedMonitoringPausedRequest) Reset() { + *x = SetEnhancedMonitoringPausedRequest{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetEnhancedMonitoringPausedRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetEnhancedMonitoringPausedRequest) ProtoMessage() {} + +func (x *SetEnhancedMonitoringPausedRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[20] + 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 SetEnhancedMonitoringPausedRequest.ProtoReflect.Descriptor instead. +func (*SetEnhancedMonitoringPausedRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{20} +} + +func (x *SetEnhancedMonitoringPausedRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *SetEnhancedMonitoringPausedRequest) GetInstallationId() string { + if x != nil { + return x.InstallationId + } + return "" +} + +func (x *SetEnhancedMonitoringPausedRequest) GetPaused() bool { + if x != nil { + return x.Paused + } + return false +} + +func (x *SetEnhancedMonitoringPausedRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +type SetEnhancedMonitoringPausedResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Monitoring *EnhancedMonitoring `protobuf:"bytes,1,opt,name=monitoring,proto3" json:"monitoring,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *SetEnhancedMonitoringPausedResponse) Reset() { + *x = SetEnhancedMonitoringPausedResponse{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *SetEnhancedMonitoringPausedResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*SetEnhancedMonitoringPausedResponse) ProtoMessage() {} + +func (x *SetEnhancedMonitoringPausedResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[21] + 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 SetEnhancedMonitoringPausedResponse.ProtoReflect.Descriptor instead. +func (*SetEnhancedMonitoringPausedResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{21} +} + +func (x *SetEnhancedMonitoringPausedResponse) GetMonitoring() *EnhancedMonitoring { + if x != nil { + return x.Monitoring + } + return nil +} + var File_aes_monitoring_v1_monitoring_proto protoreflect.FileDescriptor const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + @@ -1531,14 +1643,25 @@ const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + "\x1fRevokeEnhancedMonitoringRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12'\n" + "\x0finstallation_id\x18\x02 \x01(\tR\x0einstallationId\"\"\n" + - " RevokeEnhancedMonitoringResponse2\xf4\x05\n" + + " RevokeEnhancedMonitoringResponse\"\x98\x01\n" + + "\"SetEnhancedMonitoringPausedRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12'\n" + + "\x0finstallation_id\x18\x02 \x01(\tR\x0einstallationId\x12\x16\n" + + "\x06paused\x18\x03 \x01(\bR\x06paused\x12\x1d\n" + + "\n" + + "request_id\x18\x04 \x01(\tR\trequestId\"l\n" + + "#SetEnhancedMonitoringPausedResponse\x12E\n" + + "\n" + + "monitoring\x18\x01 \x01(\v2%.aes.monitoring.v1.EnhancedMonitoringR\n" + + "monitoring2\x83\a\n" + "\x11MonitoringService\x12z\n" + "\x15ListMetricDescriptors\x12/.aes.monitoring.v1.ListMetricDescriptorsRequest\x1a0.aes.monitoring.v1.ListMetricDescriptorsResponse\x12k\n" + "\x10ListVMMonitoring\x12*.aes.monitoring.v1.ListVMMonitoringRequest\x1a+.aes.monitoring.v1.ListVMMonitoringResponse\x12n\n" + "\x11QueryVMMonitoring\x12+.aes.monitoring.v1.QueryVMMonitoringRequest\x1a,.aes.monitoring.v1.QueryVMMonitoringResponse\x12z\n" + "\x15GetEnhancedMonitoring\x12/.aes.monitoring.v1.GetEnhancedMonitoringRequest\x1a0.aes.monitoring.v1.GetEnhancedMonitoringResponse\x12\x83\x01\n" + "\x18EnableEnhancedMonitoring\x122.aes.monitoring.v1.EnableEnhancedMonitoringRequest\x1a3.aes.monitoring.v1.EnableEnhancedMonitoringResponse\x12\x83\x01\n" + - "\x18RevokeEnhancedMonitoring\x122.aes.monitoring.v1.RevokeEnhancedMonitoringRequest\x1a3.aes.monitoring.v1.RevokeEnhancedMonitoringResponseB\xdb\x01\n" + + "\x18RevokeEnhancedMonitoring\x122.aes.monitoring.v1.RevokeEnhancedMonitoringRequest\x1a3.aes.monitoring.v1.RevokeEnhancedMonitoringResponse\x12\x8c\x01\n" + + "\x1bSetEnhancedMonitoringPaused\x125.aes.monitoring.v1.SetEnhancedMonitoringPausedRequest\x1a6.aes.monitoring.v1.SetEnhancedMonitoringPausedResponseB\xdb\x01\n" + "\x15com.aes.monitoring.v1B\x0fMonitoringProtoP\x01ZKgithub.com/AES-Services/metalhost-sdk/gen/go/aes/monitoring/v1;monitoringv1\xa2\x02\x03AMX\xaa\x02\x11Aes.Monitoring.V1\xca\x02\x11Aes\\Monitoring\\V1\xe2\x02\x1dAes\\Monitoring\\V1\\GPBMetadata\xea\x02\x13Aes::Monitoring::V1b\x06proto3" var ( @@ -1553,58 +1676,63 @@ func file_aes_monitoring_v1_monitoring_proto_rawDescGZIP() []byte { return file_aes_monitoring_v1_monitoring_proto_rawDescData } -var file_aes_monitoring_v1_monitoring_proto_msgTypes = make([]protoimpl.MessageInfo, 21) +var file_aes_monitoring_v1_monitoring_proto_msgTypes = make([]protoimpl.MessageInfo, 23) var file_aes_monitoring_v1_monitoring_proto_goTypes = []any{ - (*MetricDescriptor)(nil), // 0: aes.monitoring.v1.MetricDescriptor - (*ListMetricDescriptorsRequest)(nil), // 1: aes.monitoring.v1.ListMetricDescriptorsRequest - (*ListMetricDescriptorsResponse)(nil), // 2: aes.monitoring.v1.ListMetricDescriptorsResponse - (*ListVMMonitoringRequest)(nil), // 3: aes.monitoring.v1.ListVMMonitoringRequest - (*MonitoredVM)(nil), // 4: aes.monitoring.v1.MonitoredVM - (*ListVMMonitoringResponse)(nil), // 5: aes.monitoring.v1.ListVMMonitoringResponse - (*MonitoringDatacenterSummary)(nil), // 6: aes.monitoring.v1.MonitoringDatacenterSummary - (*MonitoringOverview)(nil), // 7: aes.monitoring.v1.MonitoringOverview - (*QueryVMMonitoringRequest)(nil), // 8: aes.monitoring.v1.QueryVMMonitoringRequest - (*Sample)(nil), // 9: aes.monitoring.v1.Sample - (*Series)(nil), // 10: aes.monitoring.v1.Series - (*MetricQuality)(nil), // 11: aes.monitoring.v1.MetricQuality - (*QueryVMMonitoringResponse)(nil), // 12: aes.monitoring.v1.QueryVMMonitoringResponse - (*EnhancedMonitoring)(nil), // 13: aes.monitoring.v1.EnhancedMonitoring - (*GetEnhancedMonitoringRequest)(nil), // 14: aes.monitoring.v1.GetEnhancedMonitoringRequest - (*GetEnhancedMonitoringResponse)(nil), // 15: aes.monitoring.v1.GetEnhancedMonitoringResponse - (*EnableEnhancedMonitoringRequest)(nil), // 16: aes.monitoring.v1.EnableEnhancedMonitoringRequest - (*EnableEnhancedMonitoringResponse)(nil), // 17: aes.monitoring.v1.EnableEnhancedMonitoringResponse - (*RevokeEnhancedMonitoringRequest)(nil), // 18: aes.monitoring.v1.RevokeEnhancedMonitoringRequest - (*RevokeEnhancedMonitoringResponse)(nil), // 19: aes.monitoring.v1.RevokeEnhancedMonitoringResponse - nil, // 20: aes.monitoring.v1.Series.DimensionsEntry + (*MetricDescriptor)(nil), // 0: aes.monitoring.v1.MetricDescriptor + (*ListMetricDescriptorsRequest)(nil), // 1: aes.monitoring.v1.ListMetricDescriptorsRequest + (*ListMetricDescriptorsResponse)(nil), // 2: aes.monitoring.v1.ListMetricDescriptorsResponse + (*ListVMMonitoringRequest)(nil), // 3: aes.monitoring.v1.ListVMMonitoringRequest + (*MonitoredVM)(nil), // 4: aes.monitoring.v1.MonitoredVM + (*ListVMMonitoringResponse)(nil), // 5: aes.monitoring.v1.ListVMMonitoringResponse + (*MonitoringDatacenterSummary)(nil), // 6: aes.monitoring.v1.MonitoringDatacenterSummary + (*MonitoringOverview)(nil), // 7: aes.monitoring.v1.MonitoringOverview + (*QueryVMMonitoringRequest)(nil), // 8: aes.monitoring.v1.QueryVMMonitoringRequest + (*Sample)(nil), // 9: aes.monitoring.v1.Sample + (*Series)(nil), // 10: aes.monitoring.v1.Series + (*MetricQuality)(nil), // 11: aes.monitoring.v1.MetricQuality + (*QueryVMMonitoringResponse)(nil), // 12: aes.monitoring.v1.QueryVMMonitoringResponse + (*EnhancedMonitoring)(nil), // 13: aes.monitoring.v1.EnhancedMonitoring + (*GetEnhancedMonitoringRequest)(nil), // 14: aes.monitoring.v1.GetEnhancedMonitoringRequest + (*GetEnhancedMonitoringResponse)(nil), // 15: aes.monitoring.v1.GetEnhancedMonitoringResponse + (*EnableEnhancedMonitoringRequest)(nil), // 16: aes.monitoring.v1.EnableEnhancedMonitoringRequest + (*EnableEnhancedMonitoringResponse)(nil), // 17: aes.monitoring.v1.EnableEnhancedMonitoringResponse + (*RevokeEnhancedMonitoringRequest)(nil), // 18: aes.monitoring.v1.RevokeEnhancedMonitoringRequest + (*RevokeEnhancedMonitoringResponse)(nil), // 19: aes.monitoring.v1.RevokeEnhancedMonitoringResponse + (*SetEnhancedMonitoringPausedRequest)(nil), // 20: aes.monitoring.v1.SetEnhancedMonitoringPausedRequest + (*SetEnhancedMonitoringPausedResponse)(nil), // 21: aes.monitoring.v1.SetEnhancedMonitoringPausedResponse + nil, // 22: aes.monitoring.v1.Series.DimensionsEntry } var file_aes_monitoring_v1_monitoring_proto_depIdxs = []int32{ 0, // 0: aes.monitoring.v1.ListMetricDescriptorsResponse.metrics:type_name -> aes.monitoring.v1.MetricDescriptor 4, // 1: aes.monitoring.v1.ListVMMonitoringResponse.vms:type_name -> aes.monitoring.v1.MonitoredVM 7, // 2: aes.monitoring.v1.ListVMMonitoringResponse.overview:type_name -> aes.monitoring.v1.MonitoringOverview 6, // 3: aes.monitoring.v1.MonitoringOverview.datacenters:type_name -> aes.monitoring.v1.MonitoringDatacenterSummary - 20, // 4: aes.monitoring.v1.Series.dimensions:type_name -> aes.monitoring.v1.Series.DimensionsEntry + 22, // 4: aes.monitoring.v1.Series.dimensions:type_name -> aes.monitoring.v1.Series.DimensionsEntry 9, // 5: aes.monitoring.v1.Series.samples:type_name -> aes.monitoring.v1.Sample 10, // 6: aes.monitoring.v1.QueryVMMonitoringResponse.series:type_name -> aes.monitoring.v1.Series 11, // 7: aes.monitoring.v1.QueryVMMonitoringResponse.quality:type_name -> aes.monitoring.v1.MetricQuality 13, // 8: aes.monitoring.v1.GetEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring 13, // 9: aes.monitoring.v1.EnableEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring - 1, // 10: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:input_type -> aes.monitoring.v1.ListMetricDescriptorsRequest - 3, // 11: aes.monitoring.v1.MonitoringService.ListVMMonitoring:input_type -> aes.monitoring.v1.ListVMMonitoringRequest - 8, // 12: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:input_type -> aes.monitoring.v1.QueryVMMonitoringRequest - 14, // 13: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:input_type -> aes.monitoring.v1.GetEnhancedMonitoringRequest - 16, // 14: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:input_type -> aes.monitoring.v1.EnableEnhancedMonitoringRequest - 18, // 15: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:input_type -> aes.monitoring.v1.RevokeEnhancedMonitoringRequest - 2, // 16: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:output_type -> aes.monitoring.v1.ListMetricDescriptorsResponse - 5, // 17: aes.monitoring.v1.MonitoringService.ListVMMonitoring:output_type -> aes.monitoring.v1.ListVMMonitoringResponse - 12, // 18: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:output_type -> aes.monitoring.v1.QueryVMMonitoringResponse - 15, // 19: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:output_type -> aes.monitoring.v1.GetEnhancedMonitoringResponse - 17, // 20: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:output_type -> aes.monitoring.v1.EnableEnhancedMonitoringResponse - 19, // 21: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:output_type -> aes.monitoring.v1.RevokeEnhancedMonitoringResponse - 16, // [16:22] is the sub-list for method output_type - 10, // [10:16] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name + 13, // 10: aes.monitoring.v1.SetEnhancedMonitoringPausedResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring + 1, // 11: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:input_type -> aes.monitoring.v1.ListMetricDescriptorsRequest + 3, // 12: aes.monitoring.v1.MonitoringService.ListVMMonitoring:input_type -> aes.monitoring.v1.ListVMMonitoringRequest + 8, // 13: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:input_type -> aes.monitoring.v1.QueryVMMonitoringRequest + 14, // 14: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:input_type -> aes.monitoring.v1.GetEnhancedMonitoringRequest + 16, // 15: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:input_type -> aes.monitoring.v1.EnableEnhancedMonitoringRequest + 18, // 16: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:input_type -> aes.monitoring.v1.RevokeEnhancedMonitoringRequest + 20, // 17: aes.monitoring.v1.MonitoringService.SetEnhancedMonitoringPaused:input_type -> aes.monitoring.v1.SetEnhancedMonitoringPausedRequest + 2, // 18: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:output_type -> aes.monitoring.v1.ListMetricDescriptorsResponse + 5, // 19: aes.monitoring.v1.MonitoringService.ListVMMonitoring:output_type -> aes.monitoring.v1.ListVMMonitoringResponse + 12, // 20: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:output_type -> aes.monitoring.v1.QueryVMMonitoringResponse + 15, // 21: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:output_type -> aes.monitoring.v1.GetEnhancedMonitoringResponse + 17, // 22: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:output_type -> aes.monitoring.v1.EnableEnhancedMonitoringResponse + 19, // 23: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:output_type -> aes.monitoring.v1.RevokeEnhancedMonitoringResponse + 21, // 24: aes.monitoring.v1.MonitoringService.SetEnhancedMonitoringPaused:output_type -> aes.monitoring.v1.SetEnhancedMonitoringPausedResponse + 18, // [18:25] is the sub-list for method output_type + 11, // [11:18] is the sub-list for method input_type + 11, // [11:11] is the sub-list for extension type_name + 11, // [11:11] is the sub-list for extension extendee + 0, // [0:11] is the sub-list for field type_name } func init() { file_aes_monitoring_v1_monitoring_proto_init() } @@ -1619,7 +1747,7 @@ func file_aes_monitoring_v1_monitoring_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_aes_monitoring_v1_monitoring_proto_rawDesc), len(file_aes_monitoring_v1_monitoring_proto_rawDesc)), NumEnums: 0, - NumMessages: 21, + NumMessages: 23, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go b/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go index a729edd..5c6980d 100644 --- a/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go +++ b/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go @@ -51,6 +51,9 @@ const ( // MonitoringServiceRevokeEnhancedMonitoringProcedure is the fully-qualified name of the // MonitoringService's RevokeEnhancedMonitoring RPC. MonitoringServiceRevokeEnhancedMonitoringProcedure = "/aes.monitoring.v1.MonitoringService/RevokeEnhancedMonitoring" + // MonitoringServiceSetEnhancedMonitoringPausedProcedure is the fully-qualified name of the + // MonitoringService's SetEnhancedMonitoringPaused RPC. + MonitoringServiceSetEnhancedMonitoringPausedProcedure = "/aes.monitoring.v1.MonitoringService/SetEnhancedMonitoringPaused" ) // MonitoringServiceClient is a client for the aes.monitoring.v1.MonitoringService service. @@ -61,6 +64,7 @@ type MonitoringServiceClient interface { GetEnhancedMonitoring(context.Context, *connect.Request[v1.GetEnhancedMonitoringRequest]) (*connect.Response[v1.GetEnhancedMonitoringResponse], error) EnableEnhancedMonitoring(context.Context, *connect.Request[v1.EnableEnhancedMonitoringRequest]) (*connect.Response[v1.EnableEnhancedMonitoringResponse], error) RevokeEnhancedMonitoring(context.Context, *connect.Request[v1.RevokeEnhancedMonitoringRequest]) (*connect.Response[v1.RevokeEnhancedMonitoringResponse], error) + SetEnhancedMonitoringPaused(context.Context, *connect.Request[v1.SetEnhancedMonitoringPausedRequest]) (*connect.Response[v1.SetEnhancedMonitoringPausedResponse], error) } // NewMonitoringServiceClient constructs a client for the aes.monitoring.v1.MonitoringService @@ -110,17 +114,24 @@ func NewMonitoringServiceClient(httpClient connect.HTTPClient, baseURL string, o connect.WithSchema(monitoringServiceMethods.ByName("RevokeEnhancedMonitoring")), connect.WithClientOptions(opts...), ), + setEnhancedMonitoringPaused: connect.NewClient[v1.SetEnhancedMonitoringPausedRequest, v1.SetEnhancedMonitoringPausedResponse]( + httpClient, + baseURL+MonitoringServiceSetEnhancedMonitoringPausedProcedure, + connect.WithSchema(monitoringServiceMethods.ByName("SetEnhancedMonitoringPaused")), + connect.WithClientOptions(opts...), + ), } } // monitoringServiceClient implements MonitoringServiceClient. type monitoringServiceClient struct { - listMetricDescriptors *connect.Client[v1.ListMetricDescriptorsRequest, v1.ListMetricDescriptorsResponse] - listVMMonitoring *connect.Client[v1.ListVMMonitoringRequest, v1.ListVMMonitoringResponse] - queryVMMonitoring *connect.Client[v1.QueryVMMonitoringRequest, v1.QueryVMMonitoringResponse] - getEnhancedMonitoring *connect.Client[v1.GetEnhancedMonitoringRequest, v1.GetEnhancedMonitoringResponse] - enableEnhancedMonitoring *connect.Client[v1.EnableEnhancedMonitoringRequest, v1.EnableEnhancedMonitoringResponse] - revokeEnhancedMonitoring *connect.Client[v1.RevokeEnhancedMonitoringRequest, v1.RevokeEnhancedMonitoringResponse] + listMetricDescriptors *connect.Client[v1.ListMetricDescriptorsRequest, v1.ListMetricDescriptorsResponse] + listVMMonitoring *connect.Client[v1.ListVMMonitoringRequest, v1.ListVMMonitoringResponse] + queryVMMonitoring *connect.Client[v1.QueryVMMonitoringRequest, v1.QueryVMMonitoringResponse] + getEnhancedMonitoring *connect.Client[v1.GetEnhancedMonitoringRequest, v1.GetEnhancedMonitoringResponse] + enableEnhancedMonitoring *connect.Client[v1.EnableEnhancedMonitoringRequest, v1.EnableEnhancedMonitoringResponse] + revokeEnhancedMonitoring *connect.Client[v1.RevokeEnhancedMonitoringRequest, v1.RevokeEnhancedMonitoringResponse] + setEnhancedMonitoringPaused *connect.Client[v1.SetEnhancedMonitoringPausedRequest, v1.SetEnhancedMonitoringPausedResponse] } // ListMetricDescriptors calls aes.monitoring.v1.MonitoringService.ListMetricDescriptors. @@ -153,6 +164,12 @@ func (c *monitoringServiceClient) RevokeEnhancedMonitoring(ctx context.Context, return c.revokeEnhancedMonitoring.CallUnary(ctx, req) } +// SetEnhancedMonitoringPaused calls +// aes.monitoring.v1.MonitoringService.SetEnhancedMonitoringPaused. +func (c *monitoringServiceClient) SetEnhancedMonitoringPaused(ctx context.Context, req *connect.Request[v1.SetEnhancedMonitoringPausedRequest]) (*connect.Response[v1.SetEnhancedMonitoringPausedResponse], error) { + return c.setEnhancedMonitoringPaused.CallUnary(ctx, req) +} + // MonitoringServiceHandler is an implementation of the aes.monitoring.v1.MonitoringService service. type MonitoringServiceHandler interface { ListMetricDescriptors(context.Context, *connect.Request[v1.ListMetricDescriptorsRequest]) (*connect.Response[v1.ListMetricDescriptorsResponse], error) @@ -161,6 +178,7 @@ type MonitoringServiceHandler interface { GetEnhancedMonitoring(context.Context, *connect.Request[v1.GetEnhancedMonitoringRequest]) (*connect.Response[v1.GetEnhancedMonitoringResponse], error) EnableEnhancedMonitoring(context.Context, *connect.Request[v1.EnableEnhancedMonitoringRequest]) (*connect.Response[v1.EnableEnhancedMonitoringResponse], error) RevokeEnhancedMonitoring(context.Context, *connect.Request[v1.RevokeEnhancedMonitoringRequest]) (*connect.Response[v1.RevokeEnhancedMonitoringResponse], error) + SetEnhancedMonitoringPaused(context.Context, *connect.Request[v1.SetEnhancedMonitoringPausedRequest]) (*connect.Response[v1.SetEnhancedMonitoringPausedResponse], error) } // NewMonitoringServiceHandler builds an HTTP handler from the service implementation. It returns @@ -206,6 +224,12 @@ func NewMonitoringServiceHandler(svc MonitoringServiceHandler, opts ...connect.H connect.WithSchema(monitoringServiceMethods.ByName("RevokeEnhancedMonitoring")), connect.WithHandlerOptions(opts...), ) + monitoringServiceSetEnhancedMonitoringPausedHandler := connect.NewUnaryHandler( + MonitoringServiceSetEnhancedMonitoringPausedProcedure, + svc.SetEnhancedMonitoringPaused, + connect.WithSchema(monitoringServiceMethods.ByName("SetEnhancedMonitoringPaused")), + connect.WithHandlerOptions(opts...), + ) return "/aes.monitoring.v1.MonitoringService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case MonitoringServiceListMetricDescriptorsProcedure: @@ -220,6 +244,8 @@ func NewMonitoringServiceHandler(svc MonitoringServiceHandler, opts ...connect.H monitoringServiceEnableEnhancedMonitoringHandler.ServeHTTP(w, r) case MonitoringServiceRevokeEnhancedMonitoringProcedure: monitoringServiceRevokeEnhancedMonitoringHandler.ServeHTTP(w, r) + case MonitoringServiceSetEnhancedMonitoringPausedProcedure: + monitoringServiceSetEnhancedMonitoringPausedHandler.ServeHTTP(w, r) default: http.NotFound(w, r) } @@ -252,3 +278,7 @@ func (UnimplementedMonitoringServiceHandler) EnableEnhancedMonitoring(context.Co func (UnimplementedMonitoringServiceHandler) RevokeEnhancedMonitoring(context.Context, *connect.Request[v1.RevokeEnhancedMonitoringRequest]) (*connect.Response[v1.RevokeEnhancedMonitoringResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring is not implemented")) } + +func (UnimplementedMonitoringServiceHandler) SetEnhancedMonitoringPaused(context.Context, *connect.Request[v1.SetEnhancedMonitoringPausedRequest]) (*connect.Response[v1.SetEnhancedMonitoringPausedResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.SetEnhancedMonitoringPaused is not implemented")) +} diff --git a/gen/openapi/metalhost.openapi.yaml b/gen/openapi/metalhost.openapi.yaml index 1863fc7..7943d14 100644 --- a/gen/openapi/metalhost.openapi.yaml +++ b/gen/openapi/metalhost.openapi.yaml @@ -5115,6 +5115,41 @@ paths: application/json: schema: $ref: '#/components/schemas/aes.monitoring.v1.RevokeEnhancedMonitoringResponse' + /aes.monitoring.v1.MonitoringService/SetEnhancedMonitoringPaused: + post: + tags: + - aes.monitoring.v1.MonitoringService + summary: SetEnhancedMonitoringPaused + operationId: aes.monitoring.v1.MonitoringService.SetEnhancedMonitoringPaused + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.monitoring.v1.SetEnhancedMonitoringPausedRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.monitoring.v1.SetEnhancedMonitoringPausedResponse' /aes.network.v1.NetworkService/AddVmToSecurityGroup: post: tags: @@ -12901,6 +12936,12 @@ components: pageToken: type: string title: page_token + allProjectCredentials: + type: boolean + title: all_project_credentials + description: |- + Project administrators may inspect all project API keys. Cannot be combined + with service_account. This never grants permission to rotate another user's key. title: ListCredentialsRequest additionalProperties: false aes.iam.v1.ListCredentialsResponse: @@ -14351,7 +14392,9 @@ components: kind: type: string title: kind - description: EMAIL selects an existing verified project member; WEBHOOK an existing subscription. + description: |- + EMAIL selects a verified project member; WEBHOOK an existing subscription. + SLACK, DISCORD and TEAMS use an encrypted, immutable provider webhook URL. principal: type: string title: principal @@ -14700,7 +14743,7 @@ components: status: type: string title: status - description: DISABLED, AWAITING_INSTALLATION, CONNECTED, STALE, REVOKED, UNSUPPORTED. + description: DISABLED, AWAITING_INSTALLATION, CONNECTED, STALE, PAUSED, REVOKED, UNSUPPORTED. deviceReady: type: boolean title: device_ready @@ -14732,7 +14775,7 @@ components: title: configuration_json description: |- Public installation identity, not a bearer credential. Requires the trusted - VMI-bound collection path; copying this configuration grants no authority. + VM-bound collection path; copying this configuration grants no authority. runtimeState: type: string title: runtime_state @@ -15588,6 +15631,12 @@ components: title: expected_version format: int64 description: Zero for create; otherwise the version last read. + webhookUrl: + type: string + title: webhook_url + description: |- + Write-only, required when creating SLACK/DISCORD/TEAMS. Omit on edits. + Changing the endpoint requires a new destination to avoid redirecting queued alerts. title: SaveAlertDestinationRequest additionalProperties: false aes.monitoring.v1.SaveAlertDestinationResponse: @@ -15662,6 +15711,31 @@ components: title: value title: DimensionsEntry additionalProperties: false + aes.monitoring.v1.SetEnhancedMonitoringPausedRequest: + type: object + properties: + name: + type: string + title: name + installationId: + type: string + title: installation_id + paused: + type: boolean + title: paused + requestId: + type: string + title: request_id + title: SetEnhancedMonitoringPausedRequest + additionalProperties: false + aes.monitoring.v1.SetEnhancedMonitoringPausedResponse: + type: object + properties: + monitoring: + title: monitoring + $ref: '#/components/schemas/aes.monitoring.v1.EnhancedMonitoring' + title: SetEnhancedMonitoringPausedResponse + additionalProperties: false aes.monitoring.v1.TestAlertDestinationRequest: type: object properties: diff --git a/metalhost/observability_contract_test.go b/metalhost/observability_contract_test.go new file mode 100644 index 0000000..1904324 --- /dev/null +++ b/metalhost/observability_contract_test.go @@ -0,0 +1,61 @@ +package metalhost + +import ( + "encoding/json" + "os" + "strings" + "testing" + + iamv1 "github.com/AES-Services/metalhost-sdk/gen/go/aes/iam/v1" + monitoringv1 "github.com/AES-Services/metalhost-sdk/gen/go/aes/monitoring/v1" + "github.com/AES-Services/metalhost-sdk/gen/go/aes/monitoring/v1/monitoringv1connect" + "google.golang.org/protobuf/encoding/protojson" + "google.golang.org/protobuf/proto" +) + +func TestSeptemberFollowupContracts(t *testing.T) { + for _, tc := range []struct { + name string + request proto.Message + field string + want any + }{ + {"pause", &monitoringv1.SetEnhancedMonitoringPausedRequest{Name: "virtual-machines/example", InstallationId: "installation", Paused: true, RequestId: "request"}, "paused", true}, + {"project credentials", &iamv1.ListCredentialsRequest{ProjectName: "projects/example", AllProjectCredentials: true}, "allProjectCredentials", true}, + {"chat destination", &monitoringv1.SaveAlertDestinationRequest{WebhookUrl: "https://example.invalid/test-only"}, "webhookUrl", "https://example.invalid/test-only"}, + } { + t.Run(tc.name, func(t *testing.T) { + raw, err := protojson.Marshal(tc.request) + if err != nil { + t.Fatal(err) + } + var fields map[string]any + if err := json.Unmarshal(raw, &fields); err != nil { + t.Fatal(err) + } + if fields[tc.field] != tc.want { + t.Fatalf("missing or changed %s", tc.field) + } + roundtrip := tc.request.ProtoReflect().New().Interface() + if err := protojson.Unmarshal(raw, roundtrip); err != nil { + t.Fatal(err) + } + if !proto.Equal(tc.request, roundtrip) { + t.Fatal("request did not round-trip") + } + }) + } + const procedure = "/aes.monitoring.v1.MonitoringService/SetEnhancedMonitoringPaused" + if monitoringv1connect.MonitoringServiceSetEnhancedMonitoringPausedProcedure != procedure { + t.Fatal("procedure changed") + } + spec, err := os.ReadFile("../gen/openapi/metalhost.openapi.yaml") + if err != nil { + t.Fatal(err) + } + for _, field := range []string{procedure, "allProjectCredentials", "webhookUrl"} { + if !strings.Contains(string(spec), field) { + t.Fatalf("OpenAPI missing %s", field) + } + } +} diff --git a/proto/aes/iam/v1/automation.proto b/proto/aes/iam/v1/automation.proto index 7ec1bfc..7d0a756 100644 --- a/proto/aes/iam/v1/automation.proto +++ b/proto/aes/iam/v1/automation.proto @@ -117,6 +117,9 @@ message ListCredentialsRequest { string service_account = 2; int32 page_size = 3; string page_token = 4; + // Project administrators may inspect all project API keys. Cannot be combined + // with service_account. This never grants permission to rotate another user's key. + bool all_project_credentials = 5; } message ListCredentialsResponse { repeated AutomationCredential credentials = 1; diff --git a/proto/aes/monitoring/v1/alerts.proto b/proto/aes/monitoring/v1/alerts.proto index 486e6cb..9fc8c58 100644 --- a/proto/aes/monitoring/v1/alerts.proto +++ b/proto/aes/monitoring/v1/alerts.proto @@ -111,7 +111,8 @@ message AlertDestination { string name = 1; string project_name = 2; string display_name = 3; - // EMAIL selects an existing verified project member; WEBHOOK an existing subscription. + // EMAIL selects a verified project member; WEBHOOK an existing subscription. + // SLACK, DISCORD and TEAMS use an encrypted, immutable provider webhook URL. string kind = 4; string principal = 5; string subscription_name = 6; @@ -137,6 +138,9 @@ message SaveAlertDestinationRequest { string request_id = 2; // Zero for create; otherwise the version last read. int64 expected_version = 3; + // Write-only, required when creating SLACK/DISCORD/TEAMS. Omit on edits. + // Changing the endpoint requires a new destination to avoid redirecting queued alerts. + string webhook_url = 4; } message SaveAlertDestinationResponse { AlertDestination destination = 1; } message DeleteAlertDestinationRequest { diff --git a/proto/aes/monitoring/v1/monitoring.proto b/proto/aes/monitoring/v1/monitoring.proto index 0914dba..068a3de 100644 --- a/proto/aes/monitoring/v1/monitoring.proto +++ b/proto/aes/monitoring/v1/monitoring.proto @@ -9,6 +9,7 @@ service MonitoringService { rpc GetEnhancedMonitoring(GetEnhancedMonitoringRequest) returns (GetEnhancedMonitoringResponse); rpc EnableEnhancedMonitoring(EnableEnhancedMonitoringRequest) returns (EnableEnhancedMonitoringResponse); rpc RevokeEnhancedMonitoring(RevokeEnhancedMonitoringRequest) returns (RevokeEnhancedMonitoringResponse); + rpc SetEnhancedMonitoringPaused(SetEnhancedMonitoringPausedRequest) returns (SetEnhancedMonitoringPausedResponse); } message MetricDescriptor { @@ -103,7 +104,7 @@ message EnhancedMonitoring { string name = 1; string installation_id = 2; string resource_id = 3; - // DISABLED, AWAITING_INSTALLATION, CONNECTED, STALE, REVOKED, UNSUPPORTED. + // DISABLED, AWAITING_INSTALLATION, CONNECTED, STALE, PAUSED, REVOKED, UNSUPPORTED. string status = 4; bool device_ready = 5; bool restart_required = 6; @@ -112,7 +113,7 @@ message EnhancedMonitoring { int64 last_seen_at_unix = 9; int64 revoked_at_unix = 10; // Public installation identity, not a bearer credential. Requires the trusted - // VMI-bound collection path; copying this configuration grants no authority. + // VM-bound collection path; copying this configuration grants no authority. string configuration_json = 11; string runtime_state = 12; repeated string discovered_services = 13; @@ -135,3 +136,10 @@ message RevokeEnhancedMonitoringRequest { string installation_id = 2; } message RevokeEnhancedMonitoringResponse {} +message SetEnhancedMonitoringPausedRequest { + string name = 1; + string installation_id = 2; + bool paused = 3; + string request_id = 4; +} +message SetEnhancedMonitoringPausedResponse { EnhancedMonitoring monitoring = 1; } From 0784b3ecb8c92ce47f602a4d487e5757e7cdf9d1 Mon Sep 17 00:00:00 2001 From: zblocker64 Date: Sat, 26 Sep 2026 00:06:37 -0500 Subject: [PATCH 5/5] Sync the guest collector install contract from the backend VM creation, enhanced monitoring, and operations now include the opt-in installer fields that shipped on Metalhost main after the last snapshot. --- gen/go/aes/compute/v1/compute.pb.go | 21 +- gen/go/aes/monitoring/v1/monitoring.pb.go | 293 ++++++++++++++---- .../monitoringv1connect/monitoring.connect.go | 31 ++ gen/go/aes/ops/v1/operations.pb.go | 20 +- gen/openapi/metalhost.openapi.yaml | 86 +++++ proto/aes/compute/v1/compute.proto | 3 + proto/aes/monitoring/v1/monitoring.proto | 16 + proto/aes/ops/v1/operations.proto | 2 + 8 files changed, 399 insertions(+), 73 deletions(-) diff --git a/gen/go/aes/compute/v1/compute.pb.go b/gen/go/aes/compute/v1/compute.pb.go index 4630b10..983914a 100644 --- a/gen/go/aes/compute/v1/compute.pb.go +++ b/gen/go/aes/compute/v1/compute.pb.go @@ -700,9 +700,12 @@ type VirtualMachineSpec struct { // Must be valid `#cloud-config` YAML. CloudInit string `protobuf:"bytes,6,opt,name=cloud_init,json=cloudInit,proto3" json:"cloud_init,omitempty"` // Billing term. Defaults to HOURLY. - Billing *VMBillingSpec `protobuf:"bytes,7,opt,name=billing,proto3" json:"billing,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + Billing *VMBillingSpec `protobuf:"bytes,7,opt,name=billing,proto3" json:"billing,omitempty"` + // Opt in to installing the approved guest metrics collector through cloud-init + // on first boot. Requires a fresh supported cloud image; default false. + InstallGuestCollector bool `protobuf:"varint,8,opt,name=install_guest_collector,json=installGuestCollector,proto3" json:"install_guest_collector,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *VirtualMachineSpec) Reset() { @@ -784,6 +787,13 @@ func (x *VirtualMachineSpec) GetBilling() *VMBillingSpec { return nil } +func (x *VirtualMachineSpec) GetInstallGuestCollector() bool { + if x != nil { + return x.InstallGuestCollector + } + return false +} + type VMComputeSpec struct { state protoimpl.MessageState `protogen:"open.v1"` // CPU class — must have published pricing and capacity in the datacenter. Required. @@ -4217,7 +4227,7 @@ const file_aes_compute_v1_compute_proto_rawDesc = "" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a>\n" + "\x10AnnotationsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + - "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\xd6\x02\n" + + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\"\x8e\x03\n" + "\x12VirtualMachineSpec\x12\x16\n" + "\x06region\x18\x01 \x01(\tR\x06region\x127\n" + "\acompute\x18\x02 \x01(\v2\x1d.aes.compute.v1.VMComputeSpecR\acompute\x12.\n" + @@ -4226,7 +4236,8 @@ const file_aes_compute_v1_compute_proto_rawDesc = "" + "\x05users\x18\x05 \x03(\v2\x18.aes.compute.v1.UserSpecR\x05users\x12\x1d\n" + "\n" + "cloud_init\x18\x06 \x01(\tR\tcloudInit\x127\n" + - "\abilling\x18\a \x01(\v2\x1d.aes.compute.v1.VMBillingSpecR\abilling\"\x86\x01\n" + + "\abilling\x18\a \x01(\v2\x1d.aes.compute.v1.VMBillingSpecR\abilling\x126\n" + + "\x17install_guest_collector\x18\b \x01(\bR\x15installGuestCollector\"\x86\x01\n" + "\rVMComputeSpec\x12\x1b\n" + "\tcpu_class\x18\x01 \x01(\tR\bcpuClass\x12\x14\n" + "\x05vcpus\x18\x02 \x01(\x05R\x05vcpus\x12\x17\n" + diff --git a/gen/go/aes/monitoring/v1/monitoring.pb.go b/gen/go/aes/monitoring/v1/monitoring.pb.go index c2854e8..340ef8b 100644 --- a/gen/go/aes/monitoring/v1/monitoring.pb.go +++ b/gen/go/aes/monitoring/v1/monitoring.pb.go @@ -985,8 +985,14 @@ type EnhancedMonitoring struct { DiscoveredServices []string `protobuf:"bytes,13,rep,name=discovered_services,json=discoveredServices,proto3" json:"discovered_services,omitempty"` SelectedServices []string `protobuf:"bytes,14,rep,name=selected_services,json=selectedServices,proto3" json:"selected_services,omitempty"` ServiceDiscoveryStatus string `protobuf:"bytes,15,opt,name=service_discovery_status,json=serviceDiscoveryStatus,proto3" json:"service_discovery_status,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + // Latest durable installer request. CONNECTED still requires fresh guest metrics. + InstallRequestId string `protobuf:"bytes,16,opt,name=install_request_id,json=installRequestId,proto3" json:"install_request_id,omitempty"` + // QUEUED, INSTALLING, AWAITING_DATA, SUCCEEDED, FAILED, UNKNOWN. + InstallStatus string `protobuf:"bytes,17,opt,name=install_status,json=installStatus,proto3" json:"install_status,omitempty"` + InstallError string `protobuf:"bytes,18,opt,name=install_error,json=installError,proto3" json:"install_error,omitempty"` + AutomaticInstallAvailable bool `protobuf:"varint,19,opt,name=automatic_install_available,json=automaticInstallAvailable,proto3" json:"automatic_install_available,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *EnhancedMonitoring) Reset() { @@ -1124,6 +1130,147 @@ func (x *EnhancedMonitoring) GetServiceDiscoveryStatus() string { return "" } +func (x *EnhancedMonitoring) GetInstallRequestId() string { + if x != nil { + return x.InstallRequestId + } + return "" +} + +func (x *EnhancedMonitoring) GetInstallStatus() string { + if x != nil { + return x.InstallStatus + } + return "" +} + +func (x *EnhancedMonitoring) GetInstallError() string { + if x != nil { + return x.InstallError + } + return "" +} + +func (x *EnhancedMonitoring) GetAutomaticInstallAvailable() bool { + if x != nil { + return x.AutomaticInstallAvailable + } + return false +} + +type InstallGuestCollectorRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + InstallationId string `protobuf:"bytes,2,opt,name=installation_id,json=installationId,proto3" json:"installation_id,omitempty"` + RequestId string `protobuf:"bytes,3,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // Customer consent to privileged installation of the approved collector. + ConfirmInstallation bool `protobuf:"varint,4,opt,name=confirm_installation,json=confirmInstallation,proto3" json:"confirm_installation,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *InstallGuestCollectorRequest) Reset() { + *x = InstallGuestCollectorRequest{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *InstallGuestCollectorRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstallGuestCollectorRequest) ProtoMessage() {} + +func (x *InstallGuestCollectorRequest) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] + 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 InstallGuestCollectorRequest.ProtoReflect.Descriptor instead. +func (*InstallGuestCollectorRequest) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{14} +} + +func (x *InstallGuestCollectorRequest) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *InstallGuestCollectorRequest) GetInstallationId() string { + if x != nil { + return x.InstallationId + } + return "" +} + +func (x *InstallGuestCollectorRequest) GetRequestId() string { + if x != nil { + return x.RequestId + } + return "" +} + +func (x *InstallGuestCollectorRequest) GetConfirmInstallation() bool { + if x != nil { + return x.ConfirmInstallation + } + return false +} + +type InstallGuestCollectorResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Monitoring *EnhancedMonitoring `protobuf:"bytes,1,opt,name=monitoring,proto3" json:"monitoring,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *InstallGuestCollectorResponse) Reset() { + *x = InstallGuestCollectorResponse{} + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *InstallGuestCollectorResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InstallGuestCollectorResponse) ProtoMessage() {} + +func (x *InstallGuestCollectorResponse) ProtoReflect() protoreflect.Message { + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] + 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 InstallGuestCollectorResponse.ProtoReflect.Descriptor instead. +func (*InstallGuestCollectorResponse) Descriptor() ([]byte, []int) { + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{15} +} + +func (x *InstallGuestCollectorResponse) GetMonitoring() *EnhancedMonitoring { + if x != nil { + return x.Monitoring + } + return nil +} + type GetEnhancedMonitoringRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` @@ -1133,7 +1280,7 @@ type GetEnhancedMonitoringRequest struct { func (x *GetEnhancedMonitoringRequest) Reset() { *x = GetEnhancedMonitoringRequest{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1145,7 +1292,7 @@ func (x *GetEnhancedMonitoringRequest) String() string { func (*GetEnhancedMonitoringRequest) ProtoMessage() {} func (x *GetEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[14] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1158,7 +1305,7 @@ func (x *GetEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnhancedMonitoringRequest.ProtoReflect.Descriptor instead. func (*GetEnhancedMonitoringRequest) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{14} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{16} } func (x *GetEnhancedMonitoringRequest) GetName() string { @@ -1177,7 +1324,7 @@ type GetEnhancedMonitoringResponse struct { func (x *GetEnhancedMonitoringResponse) Reset() { *x = GetEnhancedMonitoringResponse{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1189,7 +1336,7 @@ func (x *GetEnhancedMonitoringResponse) String() string { func (*GetEnhancedMonitoringResponse) ProtoMessage() {} func (x *GetEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[15] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1202,7 +1349,7 @@ func (x *GetEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetEnhancedMonitoringResponse.ProtoReflect.Descriptor instead. func (*GetEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{15} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{17} } func (x *GetEnhancedMonitoringResponse) GetMonitoring() *EnhancedMonitoring { @@ -1225,7 +1372,7 @@ type EnableEnhancedMonitoringRequest struct { func (x *EnableEnhancedMonitoringRequest) Reset() { *x = EnableEnhancedMonitoringRequest{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1237,7 +1384,7 @@ func (x *EnableEnhancedMonitoringRequest) String() string { func (*EnableEnhancedMonitoringRequest) ProtoMessage() {} func (x *EnableEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[16] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[18] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1250,7 +1397,7 @@ func (x *EnableEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use EnableEnhancedMonitoringRequest.ProtoReflect.Descriptor instead. func (*EnableEnhancedMonitoringRequest) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{16} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{18} } func (x *EnableEnhancedMonitoringRequest) GetName() string { @@ -1283,7 +1430,7 @@ type EnableEnhancedMonitoringResponse struct { func (x *EnableEnhancedMonitoringResponse) Reset() { *x = EnableEnhancedMonitoringResponse{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1295,7 +1442,7 @@ func (x *EnableEnhancedMonitoringResponse) String() string { func (*EnableEnhancedMonitoringResponse) ProtoMessage() {} func (x *EnableEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[17] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[19] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1308,7 +1455,7 @@ func (x *EnableEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use EnableEnhancedMonitoringResponse.ProtoReflect.Descriptor instead. func (*EnableEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{17} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{19} } func (x *EnableEnhancedMonitoringResponse) GetMonitoring() *EnhancedMonitoring { @@ -1329,7 +1476,7 @@ type RevokeEnhancedMonitoringRequest struct { func (x *RevokeEnhancedMonitoringRequest) Reset() { *x = RevokeEnhancedMonitoringRequest{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[18] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1341,7 +1488,7 @@ func (x *RevokeEnhancedMonitoringRequest) String() string { func (*RevokeEnhancedMonitoringRequest) ProtoMessage() {} func (x *RevokeEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[18] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1354,7 +1501,7 @@ func (x *RevokeEnhancedMonitoringRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeEnhancedMonitoringRequest.ProtoReflect.Descriptor instead. func (*RevokeEnhancedMonitoringRequest) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{18} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{20} } func (x *RevokeEnhancedMonitoringRequest) GetName() string { @@ -1379,7 +1526,7 @@ type RevokeEnhancedMonitoringResponse struct { func (x *RevokeEnhancedMonitoringResponse) Reset() { *x = RevokeEnhancedMonitoringResponse{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[19] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1391,7 +1538,7 @@ func (x *RevokeEnhancedMonitoringResponse) String() string { func (*RevokeEnhancedMonitoringResponse) ProtoMessage() {} func (x *RevokeEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[19] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1404,7 +1551,7 @@ func (x *RevokeEnhancedMonitoringResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RevokeEnhancedMonitoringResponse.ProtoReflect.Descriptor instead. func (*RevokeEnhancedMonitoringResponse) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{19} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{21} } type SetEnhancedMonitoringPausedRequest struct { @@ -1419,7 +1566,7 @@ type SetEnhancedMonitoringPausedRequest struct { func (x *SetEnhancedMonitoringPausedRequest) Reset() { *x = SetEnhancedMonitoringPausedRequest{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[20] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1431,7 +1578,7 @@ func (x *SetEnhancedMonitoringPausedRequest) String() string { func (*SetEnhancedMonitoringPausedRequest) ProtoMessage() {} func (x *SetEnhancedMonitoringPausedRequest) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[20] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1444,7 +1591,7 @@ func (x *SetEnhancedMonitoringPausedRequest) ProtoReflect() protoreflect.Message // Deprecated: Use SetEnhancedMonitoringPausedRequest.ProtoReflect.Descriptor instead. func (*SetEnhancedMonitoringPausedRequest) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{20} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{22} } func (x *SetEnhancedMonitoringPausedRequest) GetName() string { @@ -1484,7 +1631,7 @@ type SetEnhancedMonitoringPausedResponse struct { func (x *SetEnhancedMonitoringPausedResponse) Reset() { *x = SetEnhancedMonitoringPausedResponse{} - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[21] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1496,7 +1643,7 @@ func (x *SetEnhancedMonitoringPausedResponse) String() string { func (*SetEnhancedMonitoringPausedResponse) ProtoMessage() {} func (x *SetEnhancedMonitoringPausedResponse) ProtoReflect() protoreflect.Message { - mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[21] + mi := &file_aes_monitoring_v1_monitoring_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1509,7 +1656,7 @@ func (x *SetEnhancedMonitoringPausedResponse) ProtoReflect() protoreflect.Messag // Deprecated: Use SetEnhancedMonitoringPausedResponse.ProtoReflect.Descriptor instead. func (*SetEnhancedMonitoringPausedResponse) Descriptor() ([]byte, []int) { - return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{21} + return file_aes_monitoring_v1_monitoring_proto_rawDescGZIP(), []int{23} } func (x *SetEnhancedMonitoringPausedResponse) GetMonitoring() *EnhancedMonitoring { @@ -1606,7 +1753,7 @@ const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + "\aquality\x18\x02 \x03(\v2 .aes.monitoring.v1.MetricQualityR\aquality\x12&\n" + "\x0fstart_time_unix\x18\x03 \x01(\x03R\rstartTimeUnix\x12\"\n" + "\rend_time_unix\x18\x04 \x01(\x03R\vendTimeUnix\x12!\n" + - "\fstep_seconds\x18\x05 \x01(\x05R\vstepSeconds\"\xe8\x04\n" + + "\fstep_seconds\x18\x05 \x01(\x05R\vstepSeconds\"\xa2\x06\n" + "\x12EnhancedMonitoring\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\x12'\n" + "\x0finstallation_id\x18\x02 \x01(\tR\x0einstallationId\x12\x1f\n" + @@ -1624,7 +1771,21 @@ const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + "\rruntime_state\x18\f \x01(\tR\fruntimeState\x12/\n" + "\x13discovered_services\x18\r \x03(\tR\x12discoveredServices\x12+\n" + "\x11selected_services\x18\x0e \x03(\tR\x10selectedServices\x128\n" + - "\x18service_discovery_status\x18\x0f \x01(\tR\x16serviceDiscoveryStatus\"2\n" + + "\x18service_discovery_status\x18\x0f \x01(\tR\x16serviceDiscoveryStatus\x12,\n" + + "\x12install_request_id\x18\x10 \x01(\tR\x10installRequestId\x12%\n" + + "\x0einstall_status\x18\x11 \x01(\tR\rinstallStatus\x12#\n" + + "\rinstall_error\x18\x12 \x01(\tR\finstallError\x12>\n" + + "\x1bautomatic_install_available\x18\x13 \x01(\bR\x19automaticInstallAvailable\"\xad\x01\n" + + "\x1cInstallGuestCollectorRequest\x12\x12\n" + + "\x04name\x18\x01 \x01(\tR\x04name\x12'\n" + + "\x0finstallation_id\x18\x02 \x01(\tR\x0einstallationId\x12\x1d\n" + + "\n" + + "request_id\x18\x03 \x01(\tR\trequestId\x121\n" + + "\x14confirm_installation\x18\x04 \x01(\bR\x13confirmInstallation\"f\n" + + "\x1dInstallGuestCollectorResponse\x12E\n" + + "\n" + + "monitoring\x18\x01 \x01(\v2%.aes.monitoring.v1.EnhancedMonitoringR\n" + + "monitoring\"2\n" + "\x1cGetEnhancedMonitoringRequest\x12\x12\n" + "\x04name\x18\x01 \x01(\tR\x04name\"f\n" + "\x1dGetEnhancedMonitoringResponse\x12E\n" + @@ -1653,8 +1814,9 @@ const file_aes_monitoring_v1_monitoring_proto_rawDesc = "" + "#SetEnhancedMonitoringPausedResponse\x12E\n" + "\n" + "monitoring\x18\x01 \x01(\v2%.aes.monitoring.v1.EnhancedMonitoringR\n" + - "monitoring2\x83\a\n" + + "monitoring2\xff\a\n" + "\x11MonitoringService\x12z\n" + + "\x15InstallGuestCollector\x12/.aes.monitoring.v1.InstallGuestCollectorRequest\x1a0.aes.monitoring.v1.InstallGuestCollectorResponse\x12z\n" + "\x15ListMetricDescriptors\x12/.aes.monitoring.v1.ListMetricDescriptorsRequest\x1a0.aes.monitoring.v1.ListMetricDescriptorsResponse\x12k\n" + "\x10ListVMMonitoring\x12*.aes.monitoring.v1.ListVMMonitoringRequest\x1a+.aes.monitoring.v1.ListVMMonitoringResponse\x12n\n" + "\x11QueryVMMonitoring\x12+.aes.monitoring.v1.QueryVMMonitoringRequest\x1a,.aes.monitoring.v1.QueryVMMonitoringResponse\x12z\n" + @@ -1676,7 +1838,7 @@ func file_aes_monitoring_v1_monitoring_proto_rawDescGZIP() []byte { return file_aes_monitoring_v1_monitoring_proto_rawDescData } -var file_aes_monitoring_v1_monitoring_proto_msgTypes = make([]protoimpl.MessageInfo, 23) +var file_aes_monitoring_v1_monitoring_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_aes_monitoring_v1_monitoring_proto_goTypes = []any{ (*MetricDescriptor)(nil), // 0: aes.monitoring.v1.MetricDescriptor (*ListMetricDescriptorsRequest)(nil), // 1: aes.monitoring.v1.ListMetricDescriptorsRequest @@ -1692,47 +1854,52 @@ var file_aes_monitoring_v1_monitoring_proto_goTypes = []any{ (*MetricQuality)(nil), // 11: aes.monitoring.v1.MetricQuality (*QueryVMMonitoringResponse)(nil), // 12: aes.monitoring.v1.QueryVMMonitoringResponse (*EnhancedMonitoring)(nil), // 13: aes.monitoring.v1.EnhancedMonitoring - (*GetEnhancedMonitoringRequest)(nil), // 14: aes.monitoring.v1.GetEnhancedMonitoringRequest - (*GetEnhancedMonitoringResponse)(nil), // 15: aes.monitoring.v1.GetEnhancedMonitoringResponse - (*EnableEnhancedMonitoringRequest)(nil), // 16: aes.monitoring.v1.EnableEnhancedMonitoringRequest - (*EnableEnhancedMonitoringResponse)(nil), // 17: aes.monitoring.v1.EnableEnhancedMonitoringResponse - (*RevokeEnhancedMonitoringRequest)(nil), // 18: aes.monitoring.v1.RevokeEnhancedMonitoringRequest - (*RevokeEnhancedMonitoringResponse)(nil), // 19: aes.monitoring.v1.RevokeEnhancedMonitoringResponse - (*SetEnhancedMonitoringPausedRequest)(nil), // 20: aes.monitoring.v1.SetEnhancedMonitoringPausedRequest - (*SetEnhancedMonitoringPausedResponse)(nil), // 21: aes.monitoring.v1.SetEnhancedMonitoringPausedResponse - nil, // 22: aes.monitoring.v1.Series.DimensionsEntry + (*InstallGuestCollectorRequest)(nil), // 14: aes.monitoring.v1.InstallGuestCollectorRequest + (*InstallGuestCollectorResponse)(nil), // 15: aes.monitoring.v1.InstallGuestCollectorResponse + (*GetEnhancedMonitoringRequest)(nil), // 16: aes.monitoring.v1.GetEnhancedMonitoringRequest + (*GetEnhancedMonitoringResponse)(nil), // 17: aes.monitoring.v1.GetEnhancedMonitoringResponse + (*EnableEnhancedMonitoringRequest)(nil), // 18: aes.monitoring.v1.EnableEnhancedMonitoringRequest + (*EnableEnhancedMonitoringResponse)(nil), // 19: aes.monitoring.v1.EnableEnhancedMonitoringResponse + (*RevokeEnhancedMonitoringRequest)(nil), // 20: aes.monitoring.v1.RevokeEnhancedMonitoringRequest + (*RevokeEnhancedMonitoringResponse)(nil), // 21: aes.monitoring.v1.RevokeEnhancedMonitoringResponse + (*SetEnhancedMonitoringPausedRequest)(nil), // 22: aes.monitoring.v1.SetEnhancedMonitoringPausedRequest + (*SetEnhancedMonitoringPausedResponse)(nil), // 23: aes.monitoring.v1.SetEnhancedMonitoringPausedResponse + nil, // 24: aes.monitoring.v1.Series.DimensionsEntry } var file_aes_monitoring_v1_monitoring_proto_depIdxs = []int32{ 0, // 0: aes.monitoring.v1.ListMetricDescriptorsResponse.metrics:type_name -> aes.monitoring.v1.MetricDescriptor 4, // 1: aes.monitoring.v1.ListVMMonitoringResponse.vms:type_name -> aes.monitoring.v1.MonitoredVM 7, // 2: aes.monitoring.v1.ListVMMonitoringResponse.overview:type_name -> aes.monitoring.v1.MonitoringOverview 6, // 3: aes.monitoring.v1.MonitoringOverview.datacenters:type_name -> aes.monitoring.v1.MonitoringDatacenterSummary - 22, // 4: aes.monitoring.v1.Series.dimensions:type_name -> aes.monitoring.v1.Series.DimensionsEntry + 24, // 4: aes.monitoring.v1.Series.dimensions:type_name -> aes.monitoring.v1.Series.DimensionsEntry 9, // 5: aes.monitoring.v1.Series.samples:type_name -> aes.monitoring.v1.Sample 10, // 6: aes.monitoring.v1.QueryVMMonitoringResponse.series:type_name -> aes.monitoring.v1.Series 11, // 7: aes.monitoring.v1.QueryVMMonitoringResponse.quality:type_name -> aes.monitoring.v1.MetricQuality - 13, // 8: aes.monitoring.v1.GetEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring - 13, // 9: aes.monitoring.v1.EnableEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring - 13, // 10: aes.monitoring.v1.SetEnhancedMonitoringPausedResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring - 1, // 11: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:input_type -> aes.monitoring.v1.ListMetricDescriptorsRequest - 3, // 12: aes.monitoring.v1.MonitoringService.ListVMMonitoring:input_type -> aes.monitoring.v1.ListVMMonitoringRequest - 8, // 13: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:input_type -> aes.monitoring.v1.QueryVMMonitoringRequest - 14, // 14: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:input_type -> aes.monitoring.v1.GetEnhancedMonitoringRequest - 16, // 15: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:input_type -> aes.monitoring.v1.EnableEnhancedMonitoringRequest - 18, // 16: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:input_type -> aes.monitoring.v1.RevokeEnhancedMonitoringRequest - 20, // 17: aes.monitoring.v1.MonitoringService.SetEnhancedMonitoringPaused:input_type -> aes.monitoring.v1.SetEnhancedMonitoringPausedRequest - 2, // 18: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:output_type -> aes.monitoring.v1.ListMetricDescriptorsResponse - 5, // 19: aes.monitoring.v1.MonitoringService.ListVMMonitoring:output_type -> aes.monitoring.v1.ListVMMonitoringResponse - 12, // 20: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:output_type -> aes.monitoring.v1.QueryVMMonitoringResponse - 15, // 21: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:output_type -> aes.monitoring.v1.GetEnhancedMonitoringResponse - 17, // 22: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:output_type -> aes.monitoring.v1.EnableEnhancedMonitoringResponse - 19, // 23: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:output_type -> aes.monitoring.v1.RevokeEnhancedMonitoringResponse - 21, // 24: aes.monitoring.v1.MonitoringService.SetEnhancedMonitoringPaused:output_type -> aes.monitoring.v1.SetEnhancedMonitoringPausedResponse - 18, // [18:25] is the sub-list for method output_type - 11, // [11:18] is the sub-list for method input_type - 11, // [11:11] is the sub-list for extension type_name - 11, // [11:11] is the sub-list for extension extendee - 0, // [0:11] is the sub-list for field type_name + 13, // 8: aes.monitoring.v1.InstallGuestCollectorResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring + 13, // 9: aes.monitoring.v1.GetEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring + 13, // 10: aes.monitoring.v1.EnableEnhancedMonitoringResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring + 13, // 11: aes.monitoring.v1.SetEnhancedMonitoringPausedResponse.monitoring:type_name -> aes.monitoring.v1.EnhancedMonitoring + 14, // 12: aes.monitoring.v1.MonitoringService.InstallGuestCollector:input_type -> aes.monitoring.v1.InstallGuestCollectorRequest + 1, // 13: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:input_type -> aes.monitoring.v1.ListMetricDescriptorsRequest + 3, // 14: aes.monitoring.v1.MonitoringService.ListVMMonitoring:input_type -> aes.monitoring.v1.ListVMMonitoringRequest + 8, // 15: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:input_type -> aes.monitoring.v1.QueryVMMonitoringRequest + 16, // 16: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:input_type -> aes.monitoring.v1.GetEnhancedMonitoringRequest + 18, // 17: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:input_type -> aes.monitoring.v1.EnableEnhancedMonitoringRequest + 20, // 18: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:input_type -> aes.monitoring.v1.RevokeEnhancedMonitoringRequest + 22, // 19: aes.monitoring.v1.MonitoringService.SetEnhancedMonitoringPaused:input_type -> aes.monitoring.v1.SetEnhancedMonitoringPausedRequest + 15, // 20: aes.monitoring.v1.MonitoringService.InstallGuestCollector:output_type -> aes.monitoring.v1.InstallGuestCollectorResponse + 2, // 21: aes.monitoring.v1.MonitoringService.ListMetricDescriptors:output_type -> aes.monitoring.v1.ListMetricDescriptorsResponse + 5, // 22: aes.monitoring.v1.MonitoringService.ListVMMonitoring:output_type -> aes.monitoring.v1.ListVMMonitoringResponse + 12, // 23: aes.monitoring.v1.MonitoringService.QueryVMMonitoring:output_type -> aes.monitoring.v1.QueryVMMonitoringResponse + 17, // 24: aes.monitoring.v1.MonitoringService.GetEnhancedMonitoring:output_type -> aes.monitoring.v1.GetEnhancedMonitoringResponse + 19, // 25: aes.monitoring.v1.MonitoringService.EnableEnhancedMonitoring:output_type -> aes.monitoring.v1.EnableEnhancedMonitoringResponse + 21, // 26: aes.monitoring.v1.MonitoringService.RevokeEnhancedMonitoring:output_type -> aes.monitoring.v1.RevokeEnhancedMonitoringResponse + 23, // 27: aes.monitoring.v1.MonitoringService.SetEnhancedMonitoringPaused:output_type -> aes.monitoring.v1.SetEnhancedMonitoringPausedResponse + 20, // [20:28] is the sub-list for method output_type + 12, // [12:20] is the sub-list for method input_type + 12, // [12:12] is the sub-list for extension type_name + 12, // [12:12] is the sub-list for extension extendee + 0, // [0:12] is the sub-list for field type_name } func init() { file_aes_monitoring_v1_monitoring_proto_init() } @@ -1747,7 +1914,7 @@ func file_aes_monitoring_v1_monitoring_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_aes_monitoring_v1_monitoring_proto_rawDesc), len(file_aes_monitoring_v1_monitoring_proto_rawDesc)), NumEnums: 0, - NumMessages: 23, + NumMessages: 25, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go b/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go index 5c6980d..67ea177 100644 --- a/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go +++ b/gen/go/aes/monitoring/v1/monitoringv1connect/monitoring.connect.go @@ -33,6 +33,9 @@ const ( // reflection-formatted method names, remove the leading slash and convert the remaining slash to a // period. const ( + // MonitoringServiceInstallGuestCollectorProcedure is the fully-qualified name of the + // MonitoringService's InstallGuestCollector RPC. + MonitoringServiceInstallGuestCollectorProcedure = "/aes.monitoring.v1.MonitoringService/InstallGuestCollector" // MonitoringServiceListMetricDescriptorsProcedure is the fully-qualified name of the // MonitoringService's ListMetricDescriptors RPC. MonitoringServiceListMetricDescriptorsProcedure = "/aes.monitoring.v1.MonitoringService/ListMetricDescriptors" @@ -58,6 +61,8 @@ const ( // MonitoringServiceClient is a client for the aes.monitoring.v1.MonitoringService service. type MonitoringServiceClient interface { + // Explicitly authorizes installation of the platform-approved collector only. + InstallGuestCollector(context.Context, *connect.Request[v1.InstallGuestCollectorRequest]) (*connect.Response[v1.InstallGuestCollectorResponse], error) ListMetricDescriptors(context.Context, *connect.Request[v1.ListMetricDescriptorsRequest]) (*connect.Response[v1.ListMetricDescriptorsResponse], error) ListVMMonitoring(context.Context, *connect.Request[v1.ListVMMonitoringRequest]) (*connect.Response[v1.ListVMMonitoringResponse], error) QueryVMMonitoring(context.Context, *connect.Request[v1.QueryVMMonitoringRequest]) (*connect.Response[v1.QueryVMMonitoringResponse], error) @@ -78,6 +83,12 @@ func NewMonitoringServiceClient(httpClient connect.HTTPClient, baseURL string, o baseURL = strings.TrimRight(baseURL, "/") monitoringServiceMethods := v1.File_aes_monitoring_v1_monitoring_proto.Services().ByName("MonitoringService").Methods() return &monitoringServiceClient{ + installGuestCollector: connect.NewClient[v1.InstallGuestCollectorRequest, v1.InstallGuestCollectorResponse]( + httpClient, + baseURL+MonitoringServiceInstallGuestCollectorProcedure, + connect.WithSchema(monitoringServiceMethods.ByName("InstallGuestCollector")), + connect.WithClientOptions(opts...), + ), listMetricDescriptors: connect.NewClient[v1.ListMetricDescriptorsRequest, v1.ListMetricDescriptorsResponse]( httpClient, baseURL+MonitoringServiceListMetricDescriptorsProcedure, @@ -125,6 +136,7 @@ func NewMonitoringServiceClient(httpClient connect.HTTPClient, baseURL string, o // monitoringServiceClient implements MonitoringServiceClient. type monitoringServiceClient struct { + installGuestCollector *connect.Client[v1.InstallGuestCollectorRequest, v1.InstallGuestCollectorResponse] listMetricDescriptors *connect.Client[v1.ListMetricDescriptorsRequest, v1.ListMetricDescriptorsResponse] listVMMonitoring *connect.Client[v1.ListVMMonitoringRequest, v1.ListVMMonitoringResponse] queryVMMonitoring *connect.Client[v1.QueryVMMonitoringRequest, v1.QueryVMMonitoringResponse] @@ -134,6 +146,11 @@ type monitoringServiceClient struct { setEnhancedMonitoringPaused *connect.Client[v1.SetEnhancedMonitoringPausedRequest, v1.SetEnhancedMonitoringPausedResponse] } +// InstallGuestCollector calls aes.monitoring.v1.MonitoringService.InstallGuestCollector. +func (c *monitoringServiceClient) InstallGuestCollector(ctx context.Context, req *connect.Request[v1.InstallGuestCollectorRequest]) (*connect.Response[v1.InstallGuestCollectorResponse], error) { + return c.installGuestCollector.CallUnary(ctx, req) +} + // ListMetricDescriptors calls aes.monitoring.v1.MonitoringService.ListMetricDescriptors. func (c *monitoringServiceClient) ListMetricDescriptors(ctx context.Context, req *connect.Request[v1.ListMetricDescriptorsRequest]) (*connect.Response[v1.ListMetricDescriptorsResponse], error) { return c.listMetricDescriptors.CallUnary(ctx, req) @@ -172,6 +189,8 @@ func (c *monitoringServiceClient) SetEnhancedMonitoringPaused(ctx context.Contex // MonitoringServiceHandler is an implementation of the aes.monitoring.v1.MonitoringService service. type MonitoringServiceHandler interface { + // Explicitly authorizes installation of the platform-approved collector only. + InstallGuestCollector(context.Context, *connect.Request[v1.InstallGuestCollectorRequest]) (*connect.Response[v1.InstallGuestCollectorResponse], error) ListMetricDescriptors(context.Context, *connect.Request[v1.ListMetricDescriptorsRequest]) (*connect.Response[v1.ListMetricDescriptorsResponse], error) ListVMMonitoring(context.Context, *connect.Request[v1.ListVMMonitoringRequest]) (*connect.Response[v1.ListVMMonitoringResponse], error) QueryVMMonitoring(context.Context, *connect.Request[v1.QueryVMMonitoringRequest]) (*connect.Response[v1.QueryVMMonitoringResponse], error) @@ -188,6 +207,12 @@ type MonitoringServiceHandler interface { // and JSON codecs. They also support gzip compression. func NewMonitoringServiceHandler(svc MonitoringServiceHandler, opts ...connect.HandlerOption) (string, http.Handler) { monitoringServiceMethods := v1.File_aes_monitoring_v1_monitoring_proto.Services().ByName("MonitoringService").Methods() + monitoringServiceInstallGuestCollectorHandler := connect.NewUnaryHandler( + MonitoringServiceInstallGuestCollectorProcedure, + svc.InstallGuestCollector, + connect.WithSchema(monitoringServiceMethods.ByName("InstallGuestCollector")), + connect.WithHandlerOptions(opts...), + ) monitoringServiceListMetricDescriptorsHandler := connect.NewUnaryHandler( MonitoringServiceListMetricDescriptorsProcedure, svc.ListMetricDescriptors, @@ -232,6 +257,8 @@ func NewMonitoringServiceHandler(svc MonitoringServiceHandler, opts ...connect.H ) return "/aes.monitoring.v1.MonitoringService/", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { + case MonitoringServiceInstallGuestCollectorProcedure: + monitoringServiceInstallGuestCollectorHandler.ServeHTTP(w, r) case MonitoringServiceListMetricDescriptorsProcedure: monitoringServiceListMetricDescriptorsHandler.ServeHTTP(w, r) case MonitoringServiceListVMMonitoringProcedure: @@ -255,6 +282,10 @@ func NewMonitoringServiceHandler(svc MonitoringServiceHandler, opts ...connect.H // UnimplementedMonitoringServiceHandler returns CodeUnimplemented from all methods. type UnimplementedMonitoringServiceHandler struct{} +func (UnimplementedMonitoringServiceHandler) InstallGuestCollector(context.Context, *connect.Request[v1.InstallGuestCollectorRequest]) (*connect.Response[v1.InstallGuestCollectorResponse], error) { + return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.InstallGuestCollector is not implemented")) +} + func (UnimplementedMonitoringServiceHandler) ListMetricDescriptors(context.Context, *connect.Request[v1.ListMetricDescriptorsRequest]) (*connect.Response[v1.ListMetricDescriptorsResponse], error) { return nil, connect.NewError(connect.CodeUnimplemented, errors.New("aes.monitoring.v1.MonitoringService.ListMetricDescriptors is not implemented")) } diff --git a/gen/go/aes/ops/v1/operations.pb.go b/gen/go/aes/ops/v1/operations.pb.go index fcf4112..a78c30c 100644 --- a/gen/go/aes/ops/v1/operations.pb.go +++ b/gen/go/aes/ops/v1/operations.pb.go @@ -219,9 +219,11 @@ type CreateOperationRequest struct { // Requested runtime state for this lifecycle operation. VmRuntimeTargetState string `protobuf:"bytes,60,opt,name=vm_runtime_target_state,json=vmRuntimeTargetState,proto3" json:"vm_runtime_target_state,omitempty"` // Internal restore source, validated against project/DC before dispatch. - VmBackupName string `protobuf:"bytes,61,opt,name=vm_backup_name,json=vmBackupName,proto3" json:"vm_backup_name,omitempty"` - unknownFields protoimpl.UnknownFields - sizeCache protoimpl.SizeCache + VmBackupName string `protobuf:"bytes,61,opt,name=vm_backup_name,json=vmBackupName,proto3" json:"vm_backup_name,omitempty"` + // Internal provisioning opt-in; admitted by ComputeService. + VmInstallGuestCollector bool `protobuf:"varint,62,opt,name=vm_install_guest_collector,json=vmInstallGuestCollector,proto3" json:"vm_install_guest_collector,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache } func (x *CreateOperationRequest) Reset() { @@ -639,6 +641,13 @@ func (x *CreateOperationRequest) GetVmBackupName() string { return "" } +func (x *CreateOperationRequest) GetVmInstallGuestCollector() bool { + if x != nil { + return x.VmInstallGuestCollector + } + return false +} + type CreateOperationResponse struct { state protoimpl.MessageState `protogen:"open.v1"` Operation *Operation `protobuf:"bytes,1,opt,name=operation,proto3" json:"operation,omitempty"` @@ -1191,7 +1200,7 @@ var File_aes_ops_v1_operations_proto protoreflect.FileDescriptor const file_aes_ops_v1_operations_proto_rawDesc = "" + "\n" + "\x1baes/ops/v1/operations.proto\x12\n" + - "aes.ops.v1\"\xed\x15\n" + + "aes.ops.v1\"\xaa\x16\n" + "\x16CreateOperationRequest\x12\x12\n" + "\x04kind\x18\x01 \x01(\tR\x04kind\x12'\n" + "\x0fdatacenter_name\x18\x02 \x01(\tR\x0edatacenterName\x12&\n" + @@ -1253,7 +1262,8 @@ const file_aes_ops_v1_operations_proto_rawDesc = "" + "\x10defrag_plan_json\x18: \x01(\tR\x0edefragPlanJson\x12#\n" + "\rdefrag_budget\x18; \x01(\x05R\fdefragBudget\x125\n" + "\x17vm_runtime_target_state\x18< \x01(\tR\x14vmRuntimeTargetState\x12$\n" + - "\x0evm_backup_name\x18= \x01(\tR\fvmBackupName\x1a;\n" + + "\x0evm_backup_name\x18= \x01(\tR\fvmBackupName\x12;\n" + + "\x1avm_install_guest_collector\x18> \x01(\bR\x17vmInstallGuestCollector\x1a;\n" + "\rVmLabelsEntry\x12\x10\n" + "\x03key\x18\x01 \x01(\tR\x03key\x12\x14\n" + "\x05value\x18\x02 \x01(\tR\x05value:\x028\x01\x1a@\n" + diff --git a/gen/openapi/metalhost.openapi.yaml b/gen/openapi/metalhost.openapi.yaml index 7943d14..7635003 100644 --- a/gen/openapi/metalhost.openapi.yaml +++ b/gen/openapi/metalhost.openapi.yaml @@ -4975,6 +4975,42 @@ paths: application/json: schema: $ref: '#/components/schemas/aes.monitoring.v1.GetEnhancedMonitoringResponse' + /aes.monitoring.v1.MonitoringService/InstallGuestCollector: + post: + tags: + - aes.monitoring.v1.MonitoringService + summary: InstallGuestCollector + description: Explicitly authorizes installation of the platform-approved collector only. + operationId: aes.monitoring.v1.MonitoringService.InstallGuestCollector + parameters: + - name: Connect-Protocol-Version + in: header + required: true + schema: + $ref: '#/components/schemas/connect-protocol-version' + - name: Connect-Timeout-Ms + in: header + schema: + $ref: '#/components/schemas/connect-timeout-header' + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/aes.monitoring.v1.InstallGuestCollectorRequest' + required: true + responses: + default: + description: Error + content: + application/json: + schema: + $ref: '#/components/schemas/connect.error' + "200": + description: Success + content: + application/json: + schema: + $ref: '#/components/schemas/aes.monitoring.v1.InstallGuestCollectorResponse' /aes.monitoring.v1.MonitoringService/ListMetricDescriptors: post: tags: @@ -11828,6 +11864,12 @@ components: title: billing description: Billing term. Defaults to HOURLY. $ref: '#/components/schemas/aes.compute.v1.VMBillingSpec' + installGuestCollector: + type: boolean + title: install_guest_collector + description: |- + Opt in to installing the approved guest metrics collector through cloud-init + on first boot. Requires a fresh supported cloud image; default false. title: VirtualMachineSpec additionalProperties: false aes.compute.v1.VmSnapshot: @@ -14792,6 +14834,20 @@ components: serviceDiscoveryStatus: type: string title: service_discovery_status + installRequestId: + type: string + title: install_request_id + description: Latest durable installer request. CONNECTED still requires fresh guest metrics. + installStatus: + type: string + title: install_status + description: QUEUED, INSTALLING, AWAITING_DATA, SUCCEEDED, FAILED, UNKNOWN. + installError: + type: string + title: install_error + automaticInstallAvailable: + type: boolean + title: automatic_install_available title: EnhancedMonitoring additionalProperties: false aes.monitoring.v1.GetDestinationTestRequest: @@ -15065,6 +15121,32 @@ components: $ref: '#/components/schemas/aes.monitoring.v1.IncidentSnapshot' title: IncidentTransition additionalProperties: false + aes.monitoring.v1.InstallGuestCollectorRequest: + type: object + properties: + name: + type: string + title: name + installationId: + type: string + title: installation_id + requestId: + type: string + title: request_id + confirmInstallation: + type: boolean + title: confirm_installation + description: Customer consent to privileged installation of the approved collector. + title: InstallGuestCollectorRequest + additionalProperties: false + aes.monitoring.v1.InstallGuestCollectorResponse: + type: object + properties: + monitoring: + title: monitoring + $ref: '#/components/schemas/aes.monitoring.v1.EnhancedMonitoring' + title: InstallGuestCollectorResponse + additionalProperties: false aes.monitoring.v1.ListAlertDestinationCandidatesRequest: type: object properties: @@ -17005,6 +17087,10 @@ components: type: string title: vm_backup_name description: Internal restore source, validated against project/DC before dispatch. + vmInstallGuestCollector: + type: boolean + title: vm_install_guest_collector + description: Internal provisioning opt-in; admitted by ComputeService. title: CreateOperationRequest additionalProperties: false aes.ops.v1.CreateOperationRequest.VmAnnotationsEntry: diff --git a/proto/aes/compute/v1/compute.proto b/proto/aes/compute/v1/compute.proto index df27d2c..33f78d8 100644 --- a/proto/aes/compute/v1/compute.proto +++ b/proto/aes/compute/v1/compute.proto @@ -271,6 +271,9 @@ message VirtualMachineSpec { string cloud_init = 6; // Billing term. Defaults to HOURLY. VMBillingSpec billing = 7; + // Opt in to installing the approved guest metrics collector through cloud-init + // on first boot. Requires a fresh supported cloud image; default false. + bool install_guest_collector = 8; } message VMComputeSpec { diff --git a/proto/aes/monitoring/v1/monitoring.proto b/proto/aes/monitoring/v1/monitoring.proto index 068a3de..14ea629 100644 --- a/proto/aes/monitoring/v1/monitoring.proto +++ b/proto/aes/monitoring/v1/monitoring.proto @@ -3,6 +3,8 @@ syntax = "proto3"; package aes.monitoring.v1; service MonitoringService { + // Explicitly authorizes installation of the platform-approved collector only. + rpc InstallGuestCollector(InstallGuestCollectorRequest) returns (InstallGuestCollectorResponse); rpc ListMetricDescriptors(ListMetricDescriptorsRequest) returns (ListMetricDescriptorsResponse); rpc ListVMMonitoring(ListVMMonitoringRequest) returns (ListVMMonitoringResponse); rpc QueryVMMonitoring(QueryVMMonitoringRequest) returns (QueryVMMonitoringResponse); @@ -119,7 +121,21 @@ message EnhancedMonitoring { repeated string discovered_services = 13; repeated string selected_services = 14; string service_discovery_status = 15; + // Latest durable installer request. CONNECTED still requires fresh guest metrics. + string install_request_id = 16; + // QUEUED, INSTALLING, AWAITING_DATA, SUCCEEDED, FAILED, UNKNOWN. + string install_status = 17; + string install_error = 18; + bool automatic_install_available = 19; +} +message InstallGuestCollectorRequest { + string name = 1; + string installation_id = 2; + string request_id = 3; + // Customer consent to privileged installation of the approved collector. + bool confirm_installation = 4; } +message InstallGuestCollectorResponse { EnhancedMonitoring monitoring = 1; } message GetEnhancedMonitoringRequest { string name = 1; } message GetEnhancedMonitoringResponse { EnhancedMonitoring monitoring = 1; } message EnableEnhancedMonitoringRequest { diff --git a/proto/aes/ops/v1/operations.proto b/proto/aes/ops/v1/operations.proto index 749d3a5..21b157c 100644 --- a/proto/aes/ops/v1/operations.proto +++ b/proto/aes/ops/v1/operations.proto @@ -164,6 +164,8 @@ message CreateOperationRequest { string vm_runtime_target_state = 60; // Internal restore source, validated against project/DC before dispatch. string vm_backup_name = 61; + // Internal provisioning opt-in; admitted by ComputeService. + bool vm_install_guest_collector = 62; } message CreateOperationResponse {