diff --git a/apps/app-frontend/src/main.tsx b/apps/app-frontend/src/main.tsx
index 0ac147f7..ea8b5549 100644
--- a/apps/app-frontend/src/main.tsx
+++ b/apps/app-frontend/src/main.tsx
@@ -1,5 +1,12 @@
import React from 'react';
-import { BrowserRouter } from 'react-router-dom';
+import { RouterProvider, createBrowserRouter } from 'react-router-dom';
+import { createRegistry } from '@bufbuild/protobuf';
+import {
+ file_google_protobuf_duration,
+ file_google_protobuf_struct,
+ file_google_protobuf_timestamp,
+ file_google_protobuf_wrappers,
+} from '@bufbuild/protobuf/wkt';
import { createConnectTransport } from '@connectrpc/connect-web';
import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
import { createRoot } from 'react-dom/client';
@@ -12,6 +19,14 @@ import './i18n';
const connectTransport = createConnectTransport({
baseUrl: '/api/fulfillment',
interceptors: [connectErrorInterceptor],
+ jsonOptions: {
+ registry: createRegistry(
+ file_google_protobuf_wrappers,
+ file_google_protobuf_struct,
+ file_google_protobuf_timestamp,
+ file_google_protobuf_duration,
+ ),
+ },
});
// CSS load order is intentional: base → addons → local overrides
@@ -34,6 +49,8 @@ const queryClient = new QueryClient({
},
});
+const router = createBrowserRouter([{ path: '*', element: }]);
+
const rootElement = document.getElementById('root');
if (rootElement) {
@@ -41,9 +58,7 @@ if (rootElement) {
-
-
-
+ ,
diff --git a/apps/app-frontend/src/shell/AppShell.tsx b/apps/app-frontend/src/shell/AppShell.tsx
index 980405d5..3d523104 100644
--- a/apps/app-frontend/src/shell/AppShell.tsx
+++ b/apps/app-frontend/src/shell/AppShell.tsx
@@ -3,6 +3,7 @@ import { Navigate, Route, Routes, useLocation } from 'react-router-dom';
import { Page } from '@patternfly/react-core';
import ErrorBoundary from '@osac/ui-components/components/ErrorBoundary/ErrorBoundary';
+import ComputeInstanceProvisionWizard from '@osac/ui-components/components/vm/CreateWizard/ComputeInstanceProvisionWizard';
import { VmDetailsPage } from '@osac/ui-components/components/vm/VmDetailsPage';
import { useSession } from '@osac/ui-components/hooks/use-session';
import { SecurityGroupDetailPage } from '@osac/ui-components/pages/networking/SecurityGroupDetailPage';
@@ -12,7 +13,6 @@ import { VirtualNetworksListPage } from '@osac/ui-components/pages/networking/Vi
import { BareMetalRoutes } from '@osac/ui-components/pages/tenant/BareMetalRoutes';
import CatalogPage from '@osac/ui-components/pages/tenant/CatalogPage';
import { ClusterRoutes } from '@osac/ui-components/pages/tenant/ClusterRoutes';
-import { VmCreatePage } from '@osac/ui-components/pages/tenant/VmCreatePage';
import { VmListPage } from '@osac/ui-components/pages/tenant/VmListPage';
import { AdminCatalogRoutes } from './AdminCatalogRoutes';
@@ -50,7 +50,7 @@ export const AppShell = ({ logout }: { logout: () => Promise }) => {
path="/vms/create/:catalogItemId?"
element={
-
+
}
/>
diff --git a/libs/i18n/locales/en/translation.json b/libs/i18n/locales/en/translation.json
index 8ed870df..356c0ec4 100644
--- a/libs/i18n/locales/en/translation.json
+++ b/libs/i18n/locales/en/translation.json
@@ -1,87 +1,37 @@
{
+ " (deprecated)": " (deprecated)",
+ "{{name}} size": "{{name}} size",
"Actions": "Actions",
"Actions for {{name}}": "Actions for {{name}}",
"Add": "Add",
- "Add node set": "Add node set",
"Add rule": "Add rule",
"Administration": "Administration",
"All": "All",
+ "Always": "Always",
"API URL": "API URL",
+ "Are you sure you want to cancel? Your selections and entered data will be lost.": "Are you sure you want to cancel? Your selections and entered data will be lost.",
"At least one CIDR (IPv4 or IPv6) is required": "At least one CIDR (IPv4 or IPv6) is required",
- "At least one node set is required": "At least one node set is required",
+ "At least one security group is required": "At least one security group is required",
"Attach": "Attach",
"Attach public IP": "Attach public IP",
+ "Back": "Back",
"Bare Metal": "Bare Metal",
"bare metal instance": "bare metal instance",
"Bare metal instance conditions": "Bare metal instance conditions",
"Bare metal instances": "Bare metal instances",
"Bare Metal Machines": "Bare Metal Machines",
"Bare metal provisioning wizard": "Bare metal provisioning wizard",
+ "Boot disk size": "Boot disk size",
+ "Boot disk size (GiB)": "Boot disk size (GiB)",
+ "Boot disk size is required": "Boot disk size is required",
+ "Boot disk size must be greater than zero": "Boot disk size must be greater than zero",
"Browse catalog items and launch virtual machines, clusters, or bare metal machines from published offerings.": "Browse catalog items and launch virtual machines, clusters, or bare metal machines from published offerings.",
"Cancel": "Cancel",
"Catalog": "Catalog",
- "Catalog configuration is unavailable for this virtual machine.": "Catalog configuration is unavailable for this virtual machine.",
"Catalog item": "Catalog item",
+ "Catalog item is required": "Catalog item is required",
"Catalog management": "Catalog management",
"Catalog management resource type tabs": "Catalog management resource type tabs",
- "catalogProvision.actions.back": "Back",
- "catalogProvision.actions.cancel": "Cancel",
- "catalogProvision.actions.create": "Create",
- "catalogProvision.actions.next": "Next",
- "catalogProvision.actions.retry": "Retry",
- "catalogProvision.cancel.body": "Are you sure you want to cancel? Your selections and entered data will be lost.",
- "catalogProvision.cancel.discard": "Discard and close",
- "catalogProvision.cancel.keepEditing": "Keep editing",
- "catalogProvision.cancel.title": "Discard wizard progress?",
- "catalogProvision.catalog.count_one": "1 catalog item available",
- "catalogProvision.catalog.count_other": "{{count}} catalog items available",
- "catalogProvision.catalog.empty": "No catalog items match your search. Try changing keywords.",
- "catalogProvision.catalog.loadError": "Could not load catalog items",
- "catalogProvision.catalog.loadErrorDetail": "Unable to load catalog items right now. Please try again.",
- "catalogProvision.catalog.loading": "Loading catalog items…",
- "catalogProvision.catalog.searchAria": "Search catalog items",
- "catalogProvision.catalog.searchPlaceholder": "Search catalog items…",
- "catalogProvision.common.loading": "Loading...",
- "catalogProvision.errors.provisionFailed": "Provisioning failed. Please try again.",
- "catalogProvision.errors.provisionTitle": "Could not create resource",
- "catalogProvision.instanceTypes.deprecatedSuffix": " (deprecated)",
- "catalogProvision.instanceTypes.loadError": "Could not load instance types",
- "catalogProvision.networking.loadError": "Could not load networking options",
- "catalogProvision.review.catalogItem": "Catalog item",
- "catalogProvision.steps.catalog.title": "Catalog item",
- "catalogProvision.steps.configuration.title": "Configuration",
- "catalogProvision.steps.general.title": "General",
- "catalogProvision.steps.networking.title": "Networking",
- "catalogProvision.steps.review.title": "Review",
- "catalogProvision.validation.bootDiskNumber": "Boot disk size must be a number",
- "catalogProvision.validation.catalogItemRequired": "Select a catalog item",
- "catalogProvision.validation.imageRequired": "VM image is required",
- "catalogProvision.validation.instanceTypeRequired": "Instance type is required",
- "catalogProvision.validation.nameRequired": "Name is required",
- "catalogProvision.validation.required": "This field is required",
- "catalogProvision.validation.securityGroupRequired": "Security group is required",
- "catalogProvision.validation.stepInvalid": "Fix the highlighted errors before continuing.",
- "catalogProvision.validation.subnetRequired": "Subnet is required",
- "catalogProvision.validation.virtualNetworkRequired": "Virtual network is required",
- "catalogProvision.vm.breadcrumbCreate": "Create",
- "catalogProvision.vm.fields.bootDisk": "Boot disk",
- "catalogProvision.vm.fields.bootDiskDescription": "Size in GiB",
- "catalogProvision.vm.fields.image": "VM image",
- "catalogProvision.vm.fields.imageDescription": "OCI reference",
- "catalogProvision.vm.fields.instanceType": "Instance type",
- "catalogProvision.vm.fields.name": "Name",
- "catalogProvision.vm.fields.securityGroup": "Security groups",
- "catalogProvision.vm.fields.sshKey": "SSH public key",
- "catalogProvision.vm.fields.subnet": "Subnet",
- "catalogProvision.vm.fields.userData": "User Data",
- "catalogProvision.vm.fields.virtualNetwork": "Virtual network",
- "catalogProvision.vm.placeholders.selectInstanceType": "Select an instance type",
- "catalogProvision.vm.placeholders.selectSecurityGroup": "Select security groups",
- "catalogProvision.vm.placeholders.selectSubnet": "Select a subnet",
- "catalogProvision.vm.placeholders.selectVirtualNetwork": "Select a virtual network",
- "catalogProvision.vm.wizardDescription": "Select a catalog item, configure, and provision.",
- "catalogProvision.vm.wizardTitle": "Create virtual machine",
- "catalogProvision.wizard.navAria": "{{title}} steps",
"CIDR": "CIDR",
"CIDR must be within parent virtual network range": "CIDR must be within parent virtual network range",
"CIDR overlaps with existing subnet \"{{name}}\" ({{cidr}})": "CIDR overlaps with existing subnet \"{{name}}\" ({{cidr}})",
@@ -93,6 +43,7 @@
"Cluster summary": "Cluster summary",
"Clusters": "Clusters",
"Collapse user data": "Collapse user data",
+ "Compute instance provisioning wizard": "Compute instance provisioning wizard",
"Conditions": "Conditions",
"Configuration": "Configuration",
"Configuration defaults": "Configuration defaults",
@@ -106,14 +57,17 @@
"Console URL": "Console URL",
"Copied": "Copied",
"Copy": "Copy",
- "Could not load host types": "Could not load host types",
+ "Could not load catalog items": "Could not load catalog items",
"Could not load instance types": "Could not load instance types",
+ "Could not load networking options": "Could not load networking options",
"Create": "Create",
"Create cluster": "Create cluster",
+ "Create cluster steps": "Create cluster steps",
"Create cluster wizard": "Create cluster wizard",
"Create security group": "Create security group",
"Create subnet": "Create subnet",
"Create virtual machine": "Create virtual machine",
+ "Create virtual machine steps": "Create virtual machine steps",
"Create virtual network": "Create virtual network",
"Created": "Created",
"Creator": "Creator",
@@ -127,8 +81,9 @@
"deprecated": "deprecated",
"Destination CIDR": "Destination CIDR",
"Details": "Details",
+ "Discard and close": "Discard and close",
+ "Discard wizard progress?": "Discard wizard progress?",
"Download kubeconfig": "Download kubeconfig",
- "Each host type can only be selected once": "Each host type can only be selected once",
"Edit": "Edit",
"Edit rule": "Edit rule",
"Editable": "Editable",
@@ -148,6 +103,7 @@
"Failed": "Failed",
"Failed to attach public IP": "Failed to attach public IP",
"Failed to connect to the console.": "Failed to connect to the console.",
+ "Failed to create resource": "Failed to create resource",
"Failed to create subnet": "Failed to create subnet",
"Failed to create virtual network": "Failed to create virtual network",
"Failed to delete bare metal instance": "Failed to delete bare metal instance",
@@ -161,17 +117,19 @@
"Filter by publication status": "Filter by publication status",
"Filter catalog by keyword": "Filter catalog by keyword",
"Filter catalog by resource type": "Filter catalog by resource type",
+ "Fix the highlighted errors before continuing.": "Fix the highlighted errors before continuing.",
"Fixed": "Fixed",
"Full screen": "Full screen",
"General": "General",
"Graphical console disconnected": "Graphical console disconnected",
"Graphical console disconnected before it finished connecting": "Graphical console disconnected before it finished connecting",
"Graphical console viewer could not start because the display area has no size": "Graphical console viewer could not start because the display area has no size",
+ "Halted": "Halted",
"Host type": "Host type",
- "Host type is required": "Host type is required",
"ICMP": "ICMP",
"Inbound Rules": "Inbound Rules",
"Instance type": "Instance type",
+ "Instance type is required": "Instance type is required",
"Internal IP": "Internal IP",
"Invalid IPv4 CIDR format (e.g., 192.168.1.0/24)": "Invalid IPv4 CIDR format (e.g., 192.168.1.0/24)",
"Invalid IPv4 CIDR notation": "Invalid IPv4 CIDR notation",
@@ -184,12 +142,16 @@
"IPv6 CIDR": "IPv6 CIDR",
"IPv6 CIDR (Optional)": "IPv6 CIDR (Optional)",
"IPv6 CIDR is required": "IPv6 CIDR is required",
+ "Keep editing": "Keep editing",
+ "Loading catalog": "Loading catalog",
"Loading cluster password": "Loading cluster password",
"Loading security groups...": "Loading security groups...",
"Loading subnets...": "Loading subnets...",
+ "Loading...": "Loading...",
"Manage firewall rules for your virtual networks.": "Manage firewall rules for your virtual networks.",
"Manage virtual networks for your compute instances.": "Manage virtual networks for your compute instances.",
"Message": "Message",
+ "Must be a valid SSH public key (ssh-rsa, ssh-ed25519, ecdsa-sha2-*, or sk-* prefixed).": "Must be a valid SSH public key (ssh-rsa, ssh-ed25519, ecdsa-sha2-*, or sk-* prefixed).",
"Name": "Name",
"Name cannot end with a hyphen": "Name cannot end with a hyphen",
"Name cannot start with a hyphen": "Name cannot start with a hyphen",
@@ -198,14 +160,15 @@
"Name must be at most 63 characters long": "Name must be at most 63 characters long",
"Name must only contain lowercase letters (a-z), digits (0-9), and hyphens (-)": "Name must only contain lowercase letters (a-z), digits (0-9), and hyphens (-)",
"Networking": "Networking",
+ "Next": "Next",
"No bare metal instances match your search.": "No bare metal instances match your search.",
"No bare metal instances yet.": "No bare metal instances yet.",
"No catalog items found": "No catalog items found",
"No catalog items have been created yet.": "No catalog items have been created yet.",
"No catalog items match your search or filter.": "No catalog items match your search or filter.",
"No catalog items match your search.": "No catalog items match your search.",
+ "No catalog items match your search. Try changing keywords.": "No catalog items match your search. Try changing keywords.",
"No inbound rules yet. Add one to allow incoming traffic.": "No inbound rules yet. Add one to allow incoming traffic.",
- "No node sets added yet.": "No node sets added yet.",
"No node sets configured.": "No node sets configured.",
"No outbound rules yet. Add one to allow outgoing traffic.": "No outbound rules yet. Add one to allow outgoing traffic.",
"No published catalog items are available yet.": "No published catalog items are available yet.",
@@ -215,10 +178,10 @@
"No virtual networks configured.": "No virtual networks configured.",
"No virtual networks match your search.": "No virtual networks match your search.",
"No virtual networks yet. Create one to get started.": "No virtual networks yet. Create one to get started.",
- "Node set {{number}}": "Node set {{number}}",
+ "Node set name is required": "Node set name is required",
"Node sets": "Node sets",
"Node Sets": "Node Sets",
- "Nodes": "Nodes",
+ "OCI reference": "OCI reference",
"Open catalog item details for {{title}}": "Open catalog item details for {{title}}",
"Optional cloud-init user data (max 64 KB).": "Optional cloud-init user data (max 64 KB).",
"Organization": "Organization",
@@ -245,30 +208,39 @@
"Protocol is required": "Protocol is required",
"Provision a bare metal instance from a catalog item.": "Provision a bare metal instance from a catalog item.",
"Provision bare metal": "Provision bare metal",
+ "Provision bare metal steps": "Provision bare metal steps",
"Provisioning": "Provisioning",
"Provisioning failed": "Provisioning failed",
+ "Provisioning failed. Please try again.": "Provisioning failed. Please try again.",
"Public IP": "Public IP",
- "Public SSH key is required": "Public SSH key is required",
"Published": "Published",
"Pull secret": "Pull secret",
"Pull secret is required": "Pull secret is required",
+ "Pull secret set": "Pull secret set",
"Pull secrets download OpenShift components and connect clusters to your Red Hat account. Copy the full JSON from OpenShift Cluster Manager (console.redhat.com/openshift/install/pull-secret).": "Pull secrets download OpenShift components and connect clusters to your Red Hat account. Copy the full JSON from OpenShift Cluster Manager (console.redhat.com/openshift/install/pull-secret).",
"Release image": "Release image",
"Release image is required": "Release image is required",
- "Remove node set": "Remove node set",
"Restart": "Restart",
"Retry": "Retry",
+ "Review": "Review",
+ "Run strategy": "Run strategy",
+ "Run strategy is required": "Run strategy is required",
"Running": "Running",
"Save": "Save",
"Search by name": "Search by name",
"Search catalog items": "Search catalog items",
+ "Search catalog items…": "Search catalog items…",
"Search security groups by name…": "Search security groups by name…",
"Search virtual networks by name…": "Search virtual networks by name…",
"Security groups": "Security groups",
"Select a catalog item": "Select a catalog item",
"Select a catalog item, configure, and provision an OpenShift cluster.": "Select a catalog item, configure, and provision an OpenShift cluster.",
+ "Select a catalog item, configure, and provision.": "Select a catalog item, configure, and provision.",
+ "Select a run strategy": "Select a run strategy",
+ "Select a subnet": "Select a subnet",
"Select a virtual network": "Select a virtual network",
- "Select host type": "Select host type",
+ "Select an instance type": "Select an instance type",
+ "Select security groups": "Select security groups",
"Service CIDR": "Service CIDR",
"Service CIDR must not overlap the pod CIDR.": "Service CIDR must not overlap the pod CIDR.",
"Services": "Services",
@@ -276,7 +248,6 @@
"Size": "Size",
"Source CIDR": "Source CIDR",
"SSH public key": "SSH public key",
- "SSH public key must be in the form \"[TYPE] key [[EMAIL]]\". Supported types are ssh-rsa, ssh-ed25519, and ecdsa-sha2-nistp256/384/521.": "SSH public key must be in the form \"[TYPE] key [[EMAIL]]\". Supported types are ssh-rsa, ssh-ed25519, and ecdsa-sha2-nistp256/384/521.",
"Start": "Start",
"Starting": "Starting",
"Status": "Status",
@@ -284,6 +255,7 @@
"Stopped": "Stopped",
"Stopping": "Stopping",
"Subnet": "Subnet",
+ "Subnet is required": "Subnet is required",
"Subnets": "Subnets",
"Take over": "Take over",
"TCP": "TCP",
@@ -297,13 +269,14 @@
"This will permanently delete the security group and all its rules. This action cannot be undone.": "This will permanently delete the security group and all its rules. This action cannot be undone.",
"Timed out waiting for the graphical console to finish connecting": "Timed out waiting for the graphical console to finish connecting",
"UDP": "UDP",
+ "Unable to load catalog items right now. Please try again.": "Unable to load catalog items right now. Please try again.",
"Unauthorized": "Unauthorized",
"Unknown": "Unknown",
"Unpublished": "Unpublished",
+ "Unspecified": "Unspecified",
"Use IPv4 CIDR notation (for example 10.128.0.0/14).": "Use IPv4 CIDR notation (for example 10.128.0.0/14).",
"Use IPv4 CIDR notation (for example 172.30.0.0/16).": "Use IPv4 CIDR notation (for example 172.30.0.0/16).",
"User data": "User data",
- "User Data is required": "User Data is required",
"User data must not exceed 64 KB.": "User data must not exceed 64 KB.",
"View and manage your bare metal instances.": "View and manage your bare metal instances.",
"View password": "View password",
@@ -315,6 +288,8 @@
"Virtual Network": "Virtual Network",
"Virtual network is required": "Virtual network is required",
"Virtual networks": "Virtual networks",
+ "VM image": "VM image",
+ "VM image is required": "VM image is required",
"Worker nodes": "Worker nodes",
"You are not authorized to access this resource.": "You are not authorized to access this resource."
}
diff --git a/libs/types/src/osac/private/v1/baremetal_instance_catalog_item_type_pb.ts b/libs/types/src/osac/private/v1/baremetal_instance_catalog_item_type_pb.ts
index 6c0f6abb..671affa6 100644
--- a/libs/types/src/osac/private/v1/baremetal_instance_catalog_item_type_pb.ts
+++ b/libs/types/src/osac/private/v1/baremetal_instance_catalog_item_type_pb.ts
@@ -33,6 +33,8 @@ export const file_osac_private_v1_baremetal_instance_catalog_item_type: GenFile
* A bare metal instance catalog item defines a curated hardware offering that references an underlying bare metal
* instance template. Admins control which fields users can set, enforce defaults, and validate input via JSON Schema.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.private.v1.BareMetalInstanceCatalogItem
*/
export type BareMetalInstanceCatalogItem = Message<"osac.private.v1.BareMetalInstanceCatalogItem"> & {
diff --git a/libs/types/src/osac/private/v1/baremetal_instance_template_type_pb.ts b/libs/types/src/osac/private/v1/baremetal_instance_template_type_pb.ts
index 71efeacb..12bb5755 100644
--- a/libs/types/src/osac/private/v1/baremetal_instance_template_type_pb.ts
+++ b/libs/types/src/osac/private/v1/baremetal_instance_template_type_pb.ts
@@ -17,6 +17,7 @@
import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
import type { Any } from "../../../google/protobuf/any_pb";
import { file_google_protobuf_any } from "../../../google/protobuf/any_pb";
import type { BareMetalInstanceImage } from "./baremetal_instance_type_pb";
@@ -29,17 +30,20 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/private/v1/baremetal_instance_template_type.proto.
*/
export const file_osac_private_v1_baremetal_instance_template_type: GenFile = /*@__PURE__*/
- fileDesc("CjZvc2FjL3ByaXZhdGUvdjEvYmFyZW1ldGFsX2luc3RhbmNlX3RlbXBsYXRlX3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSKaAgoZQmFyZU1ldGFsSW5zdGFuY2VUZW1wbGF0ZRIKCgJpZBgBIAEoCRIrCghtZXRhZGF0YRgCIAEoCzIZLm9zYWMucHJpdmF0ZS52MS5NZXRhZGF0YRINCgV0aXRsZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCRJNCg1zcGVjX2RlZmF1bHRzGAUgASgLMjYub3NhYy5wcml2YXRlLnYxLkJhcmVNZXRhbEluc3RhbmNlVGVtcGxhdGVTcGVjRGVmYXVsdHMSUQoKcGFyYW1ldGVycxgGIAMoCzI9Lm9zYWMucHJpdmF0ZS52MS5CYXJlTWV0YWxJbnN0YW5jZVRlbXBsYXRlUGFyYW1ldGVyRGVmaW5pdGlvbiKnAQosQmFyZU1ldGFsSW5zdGFuY2VUZW1wbGF0ZVBhcmFtZXRlckRlZmluaXRpb24SDAoEbmFtZRgBIAEoCRINCgV0aXRsZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIQCghyZXF1aXJlZBgEIAEoCBIMCgR0eXBlGAUgASgJEiUKB2RlZmF1bHQYBiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55Im4KJUJhcmVNZXRhbEluc3RhbmNlVGVtcGxhdGVTcGVjRGVmYXVsdHMSOwoFaW1hZ2UYASABKAsyJy5vc2FjLnByaXZhdGUudjEuQmFyZU1ldGFsSW5zdGFuY2VJbWFnZUgAiAEBQggKBl9pbWFnZWIGcHJvdG8z", [file_google_protobuf_any, file_osac_private_v1_baremetal_instance_type, file_osac_private_v1_metadata_type]);
+ fileDesc("CjZvc2FjL3ByaXZhdGUvdjEvYmFyZW1ldGFsX2luc3RhbmNlX3RlbXBsYXRlX3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSK+AgoZQmFyZU1ldGFsSW5zdGFuY2VUZW1wbGF0ZRIuCgJpZBgBIAEoCUIiukgfch0QATIZXlthLXpBLVpfXVthLXpBLVowLTkuX10qJBIrCghtZXRhZGF0YRgCIAEoCzIZLm9zYWMucHJpdmF0ZS52MS5NZXRhZGF0YRINCgV0aXRsZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCRJNCg1zcGVjX2RlZmF1bHRzGAUgASgLMjYub3NhYy5wcml2YXRlLnYxLkJhcmVNZXRhbEluc3RhbmNlVGVtcGxhdGVTcGVjRGVmYXVsdHMSUQoKcGFyYW1ldGVycxgGIAMoCzI9Lm9zYWMucHJpdmF0ZS52MS5CYXJlTWV0YWxJbnN0YW5jZVRlbXBsYXRlUGFyYW1ldGVyRGVmaW5pdGlvbiKnAQosQmFyZU1ldGFsSW5zdGFuY2VUZW1wbGF0ZVBhcmFtZXRlckRlZmluaXRpb24SDAoEbmFtZRgBIAEoCRINCgV0aXRsZRgCIAEoCRITCgtkZXNjcmlwdGlvbhgDIAEoCRIQCghyZXF1aXJlZBgEIAEoCBIMCgR0eXBlGAUgASgJEiUKB2RlZmF1bHQYBiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55Im4KJUJhcmVNZXRhbEluc3RhbmNlVGVtcGxhdGVTcGVjRGVmYXVsdHMSOwoFaW1hZ2UYASABKAsyJy5vc2FjLnByaXZhdGUudjEuQmFyZU1ldGFsSW5zdGFuY2VJbWFnZUgAiAEBQggKBl9pbWFnZWIGcHJvdG8z", [file_buf_validate_validate, file_google_protobuf_any, file_osac_private_v1_baremetal_instance_type, file_osac_private_v1_metadata_type]);
/**
* A bare metal instance template defines a hardware profile (host type, OS image, network configuration)
* that can be used to create bare metal instances via a catalog item.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.private.v1.BareMetalInstanceTemplate
*/
export type BareMetalInstanceTemplate = Message<"osac.private.v1.BareMetalInstanceTemplate"> & {
/**
- * Unique identifier of the template.
+ * Unique identifier of the template. Must be a valid Ansible role name: letters, digits,
+ * underscores, and dots, starting with a letter or underscore (e.g., "osac.templates.bm_host_provisioning").
*
* @generated from field: string id = 1;
*/
diff --git a/libs/types/src/osac/private/v1/cluster_catalog_item_type_pb.ts b/libs/types/src/osac/private/v1/cluster_catalog_item_type_pb.ts
index 4204a8a1..b93e68f8 100644
--- a/libs/types/src/osac/private/v1/cluster_catalog_item_type_pb.ts
+++ b/libs/types/src/osac/private/v1/cluster_catalog_item_type_pb.ts
@@ -33,6 +33,8 @@ export const file_osac_private_v1_cluster_catalog_item_type: GenFile = /*@__PURE
* A cluster catalog item defines a curated infrastructure offering that references an underlying cluster template.
* Admins control which fields users can set, enforce defaults, and validate input via JSON Schema.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.private.v1.ClusterCatalogItem
*/
export type ClusterCatalogItem = Message<"osac.private.v1.ClusterCatalogItem"> & {
diff --git a/libs/types/src/osac/private/v1/cluster_template_type_pb.ts b/libs/types/src/osac/private/v1/cluster_template_type_pb.ts
index 0bcc5f25..94a83826 100644
--- a/libs/types/src/osac/private/v1/cluster_template_type_pb.ts
+++ b/libs/types/src/osac/private/v1/cluster_template_type_pb.ts
@@ -32,6 +32,8 @@ export const file_osac_private_v1_cluster_template_type: GenFile = /*@__PURE__*/
fileDesc("Citvc2FjL3ByaXZhdGUvdjEvY2x1c3Rlcl90ZW1wbGF0ZV90eXBlLnByb3RvEg9vc2FjLnByaXZhdGUudjEimQMKD0NsdXN0ZXJUZW1wbGF0ZRIKCgJpZBgBIAEoCRIrCghtZXRhZGF0YRgCIAEoCzIZLm9zYWMucHJpdmF0ZS52MS5NZXRhZGF0YRINCgV0aXRsZRgDIAEoCRITCgtkZXNjcmlwdGlvbhgEIAEoCRJHCgpwYXJhbWV0ZXJzGAUgAygLMjMub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJUZW1wbGF0ZVBhcmFtZXRlckRlZmluaXRpb24SQQoJbm9kZV9zZXRzGAYgAygLMi4ub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJUZW1wbGF0ZS5Ob2RlU2V0c0VudHJ5EkMKDXNwZWNfZGVmYXVsdHMYByABKAsyLC5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclRlbXBsYXRlU3BlY0RlZmF1bHRzGlgKDU5vZGVTZXRzRW50cnkSCwoDa2V5GAEgASgJEjYKBXZhbHVlGAIgASgLMicub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJUZW1wbGF0ZU5vZGVTZXQ6AjgBIp0BCiJDbHVzdGVyVGVtcGxhdGVQYXJhbWV0ZXJEZWZpbml0aW9uEgwKBG5hbWUYASABKAkSDQoFdGl0bGUYAiABKAkSEwoLZGVzY3JpcHRpb24YAyABKAkSEAoIcmVxdWlyZWQYBCABKAgSDAoEdHlwZRgFIAEoCRIlCgdkZWZhdWx0GAYgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueSI5ChZDbHVzdGVyVGVtcGxhdGVOb2RlU2V0EhEKCWhvc3RfdHlwZRgBIAEoCRIMCgRzaXplGAIgASgFIugBChtDbHVzdGVyVGVtcGxhdGVTcGVjRGVmYXVsdHMSGAoLcHVsbF9zZWNyZXQYASABKAlIAIgBARIbCg5zc2hfcHVibGljX2tleRgCIAEoCUgBiAEBEhoKDXJlbGVhc2VfaW1hZ2UYAyABKAlIAogBARI1CgduZXR3b3JrGAQgASgLMh8ub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJOZXR3b3JrSAOIAQFCDgoMX3B1bGxfc2VjcmV0QhEKD19zc2hfcHVibGljX2tleUIQCg5fcmVsZWFzZV9pbWFnZUIKCghfbmV0d29ya2IGcHJvdG8z", [file_google_protobuf_any, file_osac_private_v1_cluster_type, file_osac_private_v1_metadata_type]);
/**
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.private.v1.ClusterTemplate
*/
export type ClusterTemplate = Message<"osac.private.v1.ClusterTemplate"> & {
diff --git a/libs/types/src/osac/private/v1/cluster_type_pb.ts b/libs/types/src/osac/private/v1/cluster_type_pb.ts
index b8d2f908..54f59eef 100644
--- a/libs/types/src/osac/private/v1/cluster_type_pb.ts
+++ b/libs/types/src/osac/private/v1/cluster_type_pb.ts
@@ -31,7 +31,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/private/v1/cluster_type.proto.
*/
export const file_osac_private_v1_cluster_type: GenFile = /*@__PURE__*/
- fileDesc("CiJvc2FjL3ByaXZhdGUvdjEvY2x1c3Rlcl90eXBlLnByb3RvEg9vc2FjLnByaXZhdGUudjEingEKB0NsdXN0ZXISCgoCaWQYASABKAkSKwoIbWV0YWRhdGEYAiABKAsyGS5vc2FjLnByaXZhdGUudjEuTWV0YWRhdGESKgoEc3BlYxgDIAEoCzIcLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyU3BlYxIuCgZzdGF0dXMYBCABKAsyHi5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclN0YXR1cyL8BAoLQ2x1c3RlclNwZWMSEAoIdGVtcGxhdGUYASABKAkSUQoTdGVtcGxhdGVfcGFyYW1ldGVycxgCIAMoCzI0Lm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyU3BlYy5UZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRI9Cglub2RlX3NldHMYAyADKAsyKi5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclNwZWMuTm9kZVNldHNFbnRyeRIYCgtwdWxsX3NlY3JldBgEIAEoCUgAiAEBEhsKDnNzaF9wdWJsaWNfa2V5GAUgASgJSAGIAQESGgoNcmVsZWFzZV9pbWFnZRgGIAEoCUgCiAEBEjUKB25ldHdvcmsYByABKAsyHy5vc2FjLnByaXZhdGUudjEuQ2x1c3Rlck5ldHdvcmtIA4gBARIUCgxjYXRhbG9nX2l0ZW0YCCABKAkSRQoSbmV0d29ya19hdHRhY2htZW50GAkgASgLMikub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJOZXR3b3JrQXR0YWNobWVudBpPChdUZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRILCgNrZXkYASABKAkSIwoFdmFsdWUYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55OgI4ARpQCg1Ob2RlU2V0c0VudHJ5EgsKA2tleRgBIAEoCRIuCgV2YWx1ZRgCIAEoCzIfLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyTm9kZVNldDoCOAFCDgoMX3B1bGxfc2VjcmV0QhEKD19zc2hfcHVibGljX2tleUIQCg5fcmVsZWFzZV9pbWFnZUIKCghfbmV0d29yayJgCg5DbHVzdGVyTmV0d29yaxIVCghwb2RfY2lkchgBIAEoCUgAiAEBEhkKDHNlcnZpY2VfY2lkchgCIAEoCUgBiAEBQgsKCV9wb2RfY2lkckIPCg1fc2VydmljZV9jaWRyIuoCCg1DbHVzdGVyU3RhdHVzEiwKBXN0YXRlGAEgASgOMh0ub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJTdGF0ZRI1Cgpjb25kaXRpb25zGAIgAygLMiEub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJDb25kaXRpb24SDwoHYXBpX3VybBgDIAEoCRITCgtjb25zb2xlX3VybBgEIAEoCRI/Cglub2RlX3NldHMYBSADKAsyLC5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclN0YXR1cy5Ob2RlU2V0c0VudHJ5EgsKA2h1YhgGIAEoCRIUCgxhcGlfZW5kcG9pbnQYByABKAkSGAoQaW5ncmVzc19lbmRwb2ludBgIIAEoCRpQCg1Ob2RlU2V0c0VudHJ5EgsKA2tleRgBIAEoCRIuCgV2YWx1ZRgCIAEoCzIfLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyTm9kZVNldDoCOAEi9QEKEENsdXN0ZXJDb25kaXRpb24SMwoEdHlwZRgBIAEoDjIlLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyQ29uZGl0aW9uVHlwZRIwCgZzdGF0dXMYAiABKA4yIC5vc2FjLnByaXZhdGUudjEuQ29uZGl0aW9uU3RhdHVzEjgKFGxhc3RfdHJhbnNpdGlvbl90aW1lGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBITCgZyZWFzb24YBCABKAlIAIgBARIUCgdtZXNzYWdlGAUgASgJSAGIAQFCCQoHX3JlYXNvbkIKCghfbWVzc2FnZSJDChhDbHVzdGVyTmV0d29ya0F0dGFjaG1lbnQSDgoGc3VibmV0GAEgASgJEhcKD3NlY3VyaXR5X2dyb3VwcxgCIAMoCSIxCg5DbHVzdGVyTm9kZVNldBIRCglob3N0X3R5cGUYASABKAkSDAoEc2l6ZRgCIAEoBSp/CgxDbHVzdGVyU3RhdGUSHQoZQ0xVU1RFUl9TVEFURV9VTlNQRUNJRklFRBAAEh0KGUNMVVNURVJfU1RBVEVfUFJPR1JFU1NJTkcQARIXChNDTFVTVEVSX1NUQVRFX1JFQURZEAISGAoUQ0xVU1RFUl9TVEFURV9GQUlMRUQQAyrQAQoUQ2x1c3RlckNvbmRpdGlvblR5cGUSJgoiQ0xVU1RFUl9DT05ESVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEiYKIkNMVVNURVJfQ09ORElUSU9OX1RZUEVfUFJPR1JFU1NJTkcQARIgChxDTFVTVEVSX0NPTkRJVElPTl9UWVBFX1JFQURZEAISIQodQ0xVU1RFUl9DT05ESVRJT05fVFlQRV9GQUlMRUQQAxIjCh9DTFVTVEVSX0NPTkRJVElPTl9UWVBFX0RFR1JBREVEEARiBnByb3RvMw", [file_google_protobuf_any, file_google_protobuf_timestamp, file_osac_private_v1_condition_status_type, file_osac_private_v1_metadata_type]);
+ fileDesc("CiJvc2FjL3ByaXZhdGUvdjEvY2x1c3Rlcl90eXBlLnByb3RvEg9vc2FjLnByaXZhdGUudjEingEKB0NsdXN0ZXISCgoCaWQYASABKAkSKwoIbWV0YWRhdGEYAiABKAsyGS5vc2FjLnByaXZhdGUudjEuTWV0YWRhdGESKgoEc3BlYxgDIAEoCzIcLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyU3BlYxIuCgZzdGF0dXMYBCABKAsyHi5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclN0YXR1cyL8BAoLQ2x1c3RlclNwZWMSEAoIdGVtcGxhdGUYASABKAkSUQoTdGVtcGxhdGVfcGFyYW1ldGVycxgCIAMoCzI0Lm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyU3BlYy5UZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRI9Cglub2RlX3NldHMYAyADKAsyKi5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclNwZWMuTm9kZVNldHNFbnRyeRIYCgtwdWxsX3NlY3JldBgEIAEoCUgAiAEBEhsKDnNzaF9wdWJsaWNfa2V5GAUgASgJSAGIAQESGgoNcmVsZWFzZV9pbWFnZRgGIAEoCUgCiAEBEjUKB25ldHdvcmsYByABKAsyHy5vc2FjLnByaXZhdGUudjEuQ2x1c3Rlck5ldHdvcmtIA4gBARIUCgxjYXRhbG9nX2l0ZW0YCCABKAkSRQoSbmV0d29ya19hdHRhY2htZW50GAkgASgLMikub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJOZXR3b3JrQXR0YWNobWVudBpPChdUZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRILCgNrZXkYASABKAkSIwoFdmFsdWUYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55OgI4ARpQCg1Ob2RlU2V0c0VudHJ5EgsKA2tleRgBIAEoCRIuCgV2YWx1ZRgCIAEoCzIfLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyTm9kZVNldDoCOAFCDgoMX3B1bGxfc2VjcmV0QhEKD19zc2hfcHVibGljX2tleUIQCg5fcmVsZWFzZV9pbWFnZUIKCghfbmV0d29yayJgCg5DbHVzdGVyTmV0d29yaxIVCghwb2RfY2lkchgBIAEoCUgAiAEBEhkKDHNlcnZpY2VfY2lkchgCIAEoCUgBiAEBQgsKCV9wb2RfY2lkckIPCg1fc2VydmljZV9jaWRyIuoCCg1DbHVzdGVyU3RhdHVzEiwKBXN0YXRlGAEgASgOMh0ub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJTdGF0ZRI1Cgpjb25kaXRpb25zGAIgAygLMiEub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJDb25kaXRpb24SDwoHYXBpX3VybBgDIAEoCRITCgtjb25zb2xlX3VybBgEIAEoCRI/Cglub2RlX3NldHMYBSADKAsyLC5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclN0YXR1cy5Ob2RlU2V0c0VudHJ5EgsKA2h1YhgGIAEoCRIUCgxhcGlfZW5kcG9pbnQYByABKAkSGAoQaW5ncmVzc19lbmRwb2ludBgIIAEoCRpQCg1Ob2RlU2V0c0VudHJ5EgsKA2tleRgBIAEoCRIuCgV2YWx1ZRgCIAEoCzIfLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyTm9kZVNldDoCOAEi9QEKEENsdXN0ZXJDb25kaXRpb24SMwoEdHlwZRgBIAEoDjIlLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyQ29uZGl0aW9uVHlwZRIwCgZzdGF0dXMYAiABKA4yIC5vc2FjLnByaXZhdGUudjEuQ29uZGl0aW9uU3RhdHVzEjgKFGxhc3RfdHJhbnNpdGlvbl90aW1lGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBITCgZyZWFzb24YBCABKAlIAIgBARIUCgdtZXNzYWdlGAUgASgJSAGIAQFCCQoHX3JlYXNvbkIKCghfbWVzc2FnZSJDChhDbHVzdGVyTmV0d29ya0F0dGFjaG1lbnQSDgoGc3VibmV0GAEgASgJEhcKD3NlY3VyaXR5X2dyb3VwcxgCIAMoCSIxCg5DbHVzdGVyTm9kZVNldBIRCglob3N0X3R5cGUYASABKAkSDAoEc2l6ZRgCIAEoBSq8AQoMQ2x1c3RlclN0YXRlEh0KGUNMVVNURVJfU1RBVEVfVU5TUEVDSUZJRUQQABIdChlDTFVTVEVSX1NUQVRFX1BST0dSRVNTSU5HEAESFwoTQ0xVU1RFUl9TVEFURV9SRUFEWRACEhgKFENMVVNURVJfU1RBVEVfRkFJTEVEEAMSGgoWQ0xVU1RFUl9TVEFURV9ERUxFVElORxAEEh8KG0NMVVNURVJfU1RBVEVfREVMRVRFX0ZBSUxFRBAFKtABChRDbHVzdGVyQ29uZGl0aW9uVHlwZRImCiJDTFVTVEVSX0NPTkRJVElPTl9UWVBFX1VOU1BFQ0lGSUVEEAASJgoiQ0xVU1RFUl9DT05ESVRJT05fVFlQRV9QUk9HUkVTU0lORxABEiAKHENMVVNURVJfQ09ORElUSU9OX1RZUEVfUkVBRFkQAhIhCh1DTFVTVEVSX0NPTkRJVElPTl9UWVBFX0ZBSUxFRBADEiMKH0NMVVNURVJfQ09ORElUSU9OX1RZUEVfREVHUkFERUQQBGIGcHJvdG8z", [file_google_protobuf_any, file_google_protobuf_timestamp, file_osac_private_v1_condition_status_type, file_osac_private_v1_metadata_type]);
/**
* Contains the details about the cluster that are available only for the system.
@@ -356,6 +356,16 @@ export enum ClusterState {
* @generated from enum value: CLUSTER_STATE_FAILED = 3;
*/
FAILED = 3,
+
+ /**
+ * @generated from enum value: CLUSTER_STATE_DELETING = 4;
+ */
+ DELETING = 4,
+
+ /**
+ * @generated from enum value: CLUSTER_STATE_DELETE_FAILED = 5;
+ */
+ DELETE_FAILED = 5,
}
/**
diff --git a/libs/types/src/osac/private/v1/cluster_version_type_pb.ts b/libs/types/src/osac/private/v1/cluster_version_type_pb.ts
index 9b6d54e5..fd4ae378 100644
--- a/libs/types/src/osac/private/v1/cluster_version_type_pb.ts
+++ b/libs/types/src/osac/private/v1/cluster_version_type_pb.ts
@@ -17,6 +17,7 @@
import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
import { file_google_api_field_behavior } from "../../../google/api/field_behavior_pb";
import type { Timestamp } from "../../../google/protobuf/timestamp_pb";
import { file_google_protobuf_timestamp } from "../../../google/protobuf/timestamp_pb";
@@ -28,14 +29,14 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/private/v1/cluster_version_type.proto.
*/
export const file_osac_private_v1_cluster_version_type: GenFile = /*@__PURE__*/
- fileDesc("Cipvc2FjL3ByaXZhdGUvdjEvY2x1c3Rlcl92ZXJzaW9uX3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSKcAQoZQ2x1c3RlclZlcnNpb25EZXByZWNhdGlvbhI+ChVkZXByZWNhdGlvbl90aW1lc3RhbXAYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSPwoWb2Jzb2xlc2NlbmNlX3RpbWVzdGFtcBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAyI2Ch1DbHVzdGVyVmVyc2lvbkFsbG93ZWRVcGdyYWRlcxIVCg12ZXJzaW9uX25hbWVzGAEgAygJIrMBCg5DbHVzdGVyVmVyc2lvbhIKCgJpZBgBIAEoCRIrCghtZXRhZGF0YRgCIAEoCzIZLm9zYWMucHJpdmF0ZS52MS5NZXRhZGF0YRIxCgRzcGVjGAMgASgLMiMub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJWZXJzaW9uU3BlYxI1CgZzdGF0dXMYBCABKAsyJS5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclZlcnNpb25TdGF0dXMi5wIKEkNsdXN0ZXJWZXJzaW9uU3BlYxIVCgVpbWFnZRgBIAEoCUIG4EEC4EEFEhkKB2VuYWJsZWQYAiABKAhCA+BBAUgAiAEBEhwKCmlzX2RlZmF1bHQYAyABKAhCA+BBAUgBiAEBEjgKBXN0YXRlGAQgASgOMiQub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJWZXJzaW9uU3RhdGVCA+BBARJECgtkZXByZWNhdGlvbhgFIAEoCzIqLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyVmVyc2lvbkRlcHJlY2F0aW9uQgPgQQESFwoHdmVyc2lvbhgGIAEoCUIG4EEC4EEFEk0KEGFsbG93ZWRfdXBncmFkZXMYByABKAsyLi5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclZlcnNpb25BbGxvd2VkVXBncmFkZXNCA+BBAUIKCghfZW5hYmxlZEINCgtfaXNfZGVmYXVsdCIWChRDbHVzdGVyVmVyc2lvblN0YXR1cyqoAQoTQ2x1c3RlclZlcnNpb25TdGF0ZRIlCiFDTFVTVEVSX1ZFUlNJT05fU1RBVEVfVU5TUEVDSUZJRUQQABIgChxDTFVTVEVSX1ZFUlNJT05fU1RBVEVfQUNUSVZFEAESJAogQ0xVU1RFUl9WRVJTSU9OX1NUQVRFX0RFUFJFQ0FURUQQAhIiCh5DTFVTVEVSX1ZFUlNJT05fU1RBVEVfT0JTT0xFVEUQA2IGcHJvdG8z", [file_google_api_field_behavior, file_google_protobuf_timestamp, file_osac_private_v1_metadata_type]);
+ fileDesc("Cipvc2FjL3ByaXZhdGUvdjEvY2x1c3Rlcl92ZXJzaW9uX3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSKcAQoZQ2x1c3RlclZlcnNpb25EZXByZWNhdGlvbhI+ChVkZXByZWNhdGlvbl90aW1lc3RhbXAYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMSPwoWb2Jzb2xlc2NlbmNlX3RpbWVzdGFtcBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBCA+BBAyJLCh1DbHVzdGVyVmVyc2lvbkFsbG93ZWRVcGdyYWRlcxIqCg12ZXJzaW9uX25hbWVzGAEgAygJQhO6SBCSAQ0Q6AcYASIGcgQQARg/IrMBCg5DbHVzdGVyVmVyc2lvbhIKCgJpZBgBIAEoCRIrCghtZXRhZGF0YRgCIAEoCzIZLm9zYWMucHJpdmF0ZS52MS5NZXRhZGF0YRIxCgRzcGVjGAMgASgLMiMub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJWZXJzaW9uU3BlYxI1CgZzdGF0dXMYBCABKAsyJS5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclZlcnNpb25TdGF0dXMi5wIKEkNsdXN0ZXJWZXJzaW9uU3BlYxIVCgVpbWFnZRgBIAEoCUIG4EEC4EEFEhkKB2VuYWJsZWQYAiABKAhCA+BBAUgAiAEBEhwKCmlzX2RlZmF1bHQYAyABKAhCA+BBAUgBiAEBEjgKBXN0YXRlGAQgASgOMiQub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJWZXJzaW9uU3RhdGVCA+BBARJECgtkZXByZWNhdGlvbhgFIAEoCzIqLm9zYWMucHJpdmF0ZS52MS5DbHVzdGVyVmVyc2lvbkRlcHJlY2F0aW9uQgPgQQESFwoHdmVyc2lvbhgGIAEoCUIG4EEC4EEFEk0KEGFsbG93ZWRfdXBncmFkZXMYByABKAsyLi5vc2FjLnByaXZhdGUudjEuQ2x1c3RlclZlcnNpb25BbGxvd2VkVXBncmFkZXNCA+BBAUIKCghfZW5hYmxlZEINCgtfaXNfZGVmYXVsdCIWChRDbHVzdGVyVmVyc2lvblN0YXR1cyqoAQoTQ2x1c3RlclZlcnNpb25TdGF0ZRIlCiFDTFVTVEVSX1ZFUlNJT05fU1RBVEVfVU5TUEVDSUZJRUQQABIgChxDTFVTVEVSX1ZFUlNJT05fU1RBVEVfQUNUSVZFEAESJAogQ0xVU1RFUl9WRVJTSU9OX1NUQVRFX0RFUFJFQ0FURUQQAhIiCh5DTFVTVEVSX1ZFUlNJT05fU1RBVEVfT0JTT0xFVEUQA2IGcHJvdG8z", [file_buf_validate_validate, file_google_api_field_behavior, file_google_protobuf_timestamp, file_osac_private_v1_metadata_type]);
/**
* Contains deprecation details for a cluster version.
*
* The timestamps are managed by the server during lifecycle state transitions. The deprecation_timestamp is set when
- * the version transitions to DEPRECATED, and the obsolescence_timestamp is set when it transitions to OBSOLETE. Both
- * are cleared if the version returns to ACTIVE.
+ * the version transitions to DEPRECATED, and the obsolescence_timestamp is set when it transitions to OBSOLETE.
+ * Timestamps are retained as historical record when the version returns to ACTIVE.
*
* @generated from message osac.private.v1.ClusterVersionDeprecation
*/
@@ -76,6 +77,7 @@ export type ClusterVersionAllowedUpgrades = Message<"osac.private.v1.ClusterVers
/**
* ClusterVersion names (metadata.name). Must reference existing, non-deleted ClusterVersions. When a target
* version is deleted, it is automatically removed from all lists.
+ * No duplicate or empty entries are allowed.
*
* @generated from field: repeated string version_names = 1;
*/
@@ -268,7 +270,7 @@ export enum ClusterVersionState {
* The cluster version is fully available for new cluster creation.
*
* This is the default state assigned on creation. Returning to ACTIVE from DEPRECATED or OBSOLETE
- * clears the corresponding deprecation timestamps.
+ * retains the corresponding deprecation timestamps as historical record.
*
* @generated from enum value: CLUSTER_VERSION_STATE_ACTIVE = 1;
*/
diff --git a/libs/types/src/osac/private/v1/compute_instance_catalog_item_type_pb.ts b/libs/types/src/osac/private/v1/compute_instance_catalog_item_type_pb.ts
index 193e0eaa..b113c738 100644
--- a/libs/types/src/osac/private/v1/compute_instance_catalog_item_type_pb.ts
+++ b/libs/types/src/osac/private/v1/compute_instance_catalog_item_type_pb.ts
@@ -33,6 +33,8 @@ export const file_osac_private_v1_compute_instance_catalog_item_type: GenFile =
* A compute instance catalog item defines a curated infrastructure offering that references an underlying compute
* instance template. Admins control which fields users can set, enforce defaults, and validate input via JSON Schema.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.private.v1.ComputeInstanceCatalogItem
*/
export type ComputeInstanceCatalogItem = Message<"osac.private.v1.ComputeInstanceCatalogItem"> & {
diff --git a/libs/types/src/osac/private/v1/compute_instance_template_type_pb.ts b/libs/types/src/osac/private/v1/compute_instance_template_type_pb.ts
index 88a21dd4..81a51695 100644
--- a/libs/types/src/osac/private/v1/compute_instance_template_type_pb.ts
+++ b/libs/types/src/osac/private/v1/compute_instance_template_type_pb.ts
@@ -32,6 +32,8 @@ export const file_osac_private_v1_compute_instance_template_type: GenFile = /*@_
fileDesc("CjRvc2FjL3ByaXZhdGUvdjEvY29tcHV0ZV9pbnN0YW5jZV90ZW1wbGF0ZV90eXBlLnByb3RvEg9vc2FjLnByaXZhdGUudjEilAIKF0NvbXB1dGVJbnN0YW5jZVRlbXBsYXRlEgoKAmlkGAEgASgJEisKCG1ldGFkYXRhGAIgASgLMhkub3NhYy5wcml2YXRlLnYxLk1ldGFkYXRhEg0KBXRpdGxlGAMgASgJEhMKC2Rlc2NyaXB0aW9uGAQgASgJEk8KCnBhcmFtZXRlcnMYBSADKAsyOy5vc2FjLnByaXZhdGUudjEuQ29tcHV0ZUluc3RhbmNlVGVtcGxhdGVQYXJhbWV0ZXJEZWZpbml0aW9uEksKDXNwZWNfZGVmYXVsdHMYBiABKAsyNC5vc2FjLnByaXZhdGUudjEuQ29tcHV0ZUluc3RhbmNlVGVtcGxhdGVTcGVjRGVmYXVsdHMipQEKKkNvbXB1dGVJbnN0YW5jZVRlbXBsYXRlUGFyYW1ldGVyRGVmaW5pdGlvbhIMCgRuYW1lGAEgASgJEg0KBXRpdGxlGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEhAKCHJlcXVpcmVkGAQgASgIEgwKBHR5cGUYBSABKAkSJQoHZGVmYXVsdBgGIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5Bbnki1wIKI0NvbXB1dGVJbnN0YW5jZVRlbXBsYXRlU3BlY0RlZmF1bHRzEjkKBWltYWdlGAMgASgLMiUub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZUltYWdlSACIAQESPAoJYm9vdF9kaXNrGAQgASgLMiQub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZURpc2tIAYgBARIZCgxydW5fc3RyYXRlZ3kYBSABKAlIAogBARIaCg1pbnN0YW5jZV90eXBlGAYgASgJSAOIAQESFwoKaXNfd2luZG93cxgHIAEoCEgEiAEBQggKBl9pbWFnZUIMCgpfYm9vdF9kaXNrQg8KDV9ydW5fc3RyYXRlZ3lCEAoOX2luc3RhbmNlX3R5cGVCDQoLX2lzX3dpbmRvd3NKBAgBEAJKBAgCEANSBWNvcmVzUgptZW1vcnlfZ2liYgZwcm90bzM", [file_google_protobuf_any, file_osac_private_v1_compute_instance_type, file_osac_private_v1_metadata_type]);
/**
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.private.v1.ComputeInstanceTemplate
*/
export type ComputeInstanceTemplate = Message<"osac.private.v1.ComputeInstanceTemplate"> & {
diff --git a/libs/types/src/osac/private/v1/compute_instance_type_pb.ts b/libs/types/src/osac/private/v1/compute_instance_type_pb.ts
index 5d6d59fd..215eb106 100644
--- a/libs/types/src/osac/private/v1/compute_instance_type_pb.ts
+++ b/libs/types/src/osac/private/v1/compute_instance_type_pb.ts
@@ -31,7 +31,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/private/v1/compute_instance_type.proto.
*/
export const file_osac_private_v1_compute_instance_type: GenFile = /*@__PURE__*/
- fileDesc("Citvc2FjL3ByaXZhdGUvdjEvY29tcHV0ZV9pbnN0YW5jZV90eXBlLnByb3RvEg9vc2FjLnByaXZhdGUudjEitgEKD0NvbXB1dGVJbnN0YW5jZRIKCgJpZBgBIAEoCRIrCghtZXRhZGF0YRgCIAEoCzIZLm9zYWMucHJpdmF0ZS52MS5NZXRhZGF0YRIyCgRzcGVjGAMgASgLMiQub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZVNwZWMSNgoGc3RhdHVzGAQgASgLMiYub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZVN0YXR1cyI/ChRDb21wdXRlSW5zdGFuY2VJbWFnZRITCgtzb3VyY2VfdHlwZRgBIAEoCRISCgpzb3VyY2VfcmVmGAIgASgJIicKE0NvbXB1dGVJbnN0YW5jZURpc2sSEAoIc2l6ZV9naWIYASABKAUiPAoRTmV0d29ya0F0dGFjaG1lbnQSDgoGc3VibmV0GAEgASgJEhcKD3NlY3VyaXR5X2dyb3VwcxgCIAMoCSLhBgoTQ29tcHV0ZUluc3RhbmNlU3BlYxIQCgh0ZW1wbGF0ZRgBIAEoCRJZChN0ZW1wbGF0ZV9wYXJhbWV0ZXJzGAIgAygLMjwub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZVNwZWMuVGVtcGxhdGVQYXJhbWV0ZXJzRW50cnkSPQoUcmVzdGFydF9yZXF1ZXN0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSACIAQESOQoFaW1hZ2UYBCABKAsyJS5vc2FjLnByaXZhdGUudjEuQ29tcHV0ZUluc3RhbmNlSW1hZ2VIAYgBARIUCgdzc2hfa2V5GAcgASgJSAKIAQESPAoJYm9vdF9kaXNrGAggASgLMiQub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZURpc2tIA4gBARI+ChBhZGRpdGlvbmFsX2Rpc2tzGAkgAygLMiQub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZURpc2sSGQoMcnVuX3N0cmF0ZWd5GAogASgJSASIAQESFgoJdXNlcl9kYXRhGAsgASgJSAWIAQESPwoTbmV0d29ya19hdHRhY2htZW50cxgOIAMoCzIiLm9zYWMucHJpdmF0ZS52MS5OZXR3b3JrQXR0YWNobWVudBIUCgxjYXRhbG9nX2l0ZW0YDyABKAkSFwoKaXNfd2luZG93cxgQIAEoCEgGiAEBEhoKDWluc3RhbmNlX3R5cGUYESABKAlIB4gBARpPChdUZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRILCgNrZXkYASABKAkSIwoFdmFsdWUYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55OgI4AUIXChVfcmVzdGFydF9yZXF1ZXN0ZWRfYXRCCAoGX2ltYWdlQgoKCF9zc2hfa2V5QgwKCl9ib290X2Rpc2tCDwoNX3J1bl9zdHJhdGVneUIMCgpfdXNlcl9kYXRhQg0KC19pc193aW5kb3dzQhAKDl9pbnN0YW5jZV90eXBlSgQIBRAGSgQIBhAHSgQIDBANSgQIDRAOUgVjb3Jlc1IKbWVtb3J5X2dpYlIGc3VibmV0Ug9zZWN1cml0eV9ncm91cHMiowIKFUNvbXB1dGVJbnN0YW5jZVN0YXR1cxI0CgVzdGF0ZRgBIAEoDjIlLm9zYWMucHJpdmF0ZS52MS5Db21wdXRlSW5zdGFuY2VTdGF0ZRI9Cgpjb25kaXRpb25zGAIgAygLMikub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZUNvbmRpdGlvbhIbChNpbnRlcm5hbF9pcF9hZGRyZXNzGAMgASgJEgsKA2h1YhgEIAEoCRI6ChFsYXN0X3Jlc3RhcnRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXBIAIgBARIZChFwdWJsaWNfaXBfYWRkcmVzcxgGIAEoCUIUChJfbGFzdF9yZXN0YXJ0ZWRfYXQihQIKGENvbXB1dGVJbnN0YW5jZUNvbmRpdGlvbhI7CgR0eXBlGAEgASgOMi0ub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZUNvbmRpdGlvblR5cGUSMAoGc3RhdHVzGAIgASgOMiAub3NhYy5wcml2YXRlLnYxLkNvbmRpdGlvblN0YXR1cxI4ChRsYXN0X3RyYW5zaXRpb25fdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEwoGcmVhc29uGAQgASgJSACIAQESFAoHbWVzc2FnZRgFIAEoCUgBiAEBQgkKB19yZWFzb25CCgoIX21lc3NhZ2UquwIKFENvbXB1dGVJbnN0YW5jZVN0YXRlEiYKIkNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfVU5TUEVDSUZJRUQQABIjCh9DT01QVVRFX0lOU1RBTkNFX1NUQVRFX1NUQVJUSU5HEAESIgoeQ09NUFVURV9JTlNUQU5DRV9TVEFURV9SVU5OSU5HEAISIQodQ09NUFVURV9JTlNUQU5DRV9TVEFURV9GQUlMRUQQAxIjCh9DT01QVVRFX0lOU1RBTkNFX1NUQVRFX0RFTEVUSU5HEAQSIwofQ09NUFVURV9JTlNUQU5DRV9TVEFURV9TVE9QUElORxAFEiIKHkNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfU1RPUFBFRBAGEiEKHUNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfUEFVU0VEEAcqiQMKHENvbXB1dGVJbnN0YW5jZUNvbmRpdGlvblR5cGUSLworQ09NUFVURV9JTlNUQU5DRV9DT05ESVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEjkKNUNPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfQ09ORklHVVJBVElPTl9BUFBMSUVEEAESKQolQ09NUFVURV9JTlNUQU5DRV9DT05ESVRJT05fVFlQRV9SRUFEWRACEjcKM0NPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfUkVTVEFSVF9JTl9QUk9HUkVTUxADEjIKLkNPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfUkVTVEFSVF9GQUlMRUQQBBIvCitDT01QVVRFX0lOU1RBTkNFX0NPTkRJVElPTl9UWVBFX1BST1ZJU0lPTkVEEAUSNAowQ09NUFVURV9JTlNUQU5DRV9DT05ESVRJT05fVFlQRV9SRVNUQVJUX1JFUVVJUkVEEAZiBnByb3RvMw", [file_google_protobuf_any, file_google_protobuf_timestamp, file_osac_private_v1_condition_status_type, file_osac_private_v1_metadata_type]);
+ fileDesc("Citvc2FjL3ByaXZhdGUvdjEvY29tcHV0ZV9pbnN0YW5jZV90eXBlLnByb3RvEg9vc2FjLnByaXZhdGUudjEitgEKD0NvbXB1dGVJbnN0YW5jZRIKCgJpZBgBIAEoCRIrCghtZXRhZGF0YRgCIAEoCzIZLm9zYWMucHJpdmF0ZS52MS5NZXRhZGF0YRIyCgRzcGVjGAMgASgLMiQub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZVNwZWMSNgoGc3RhdHVzGAQgASgLMiYub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZVN0YXR1cyI/ChRDb21wdXRlSW5zdGFuY2VJbWFnZRITCgtzb3VyY2VfdHlwZRgBIAEoCRISCgpzb3VyY2VfcmVmGAIgASgJIicKE0NvbXB1dGVJbnN0YW5jZURpc2sSEAoIc2l6ZV9naWIYASABKAUiPAoRTmV0d29ya0F0dGFjaG1lbnQSDgoGc3VibmV0GAEgASgJEhcKD3NlY3VyaXR5X2dyb3VwcxgCIAMoCSLvBgoTQ29tcHV0ZUluc3RhbmNlU3BlYxIQCgh0ZW1wbGF0ZRgBIAEoCRJZChN0ZW1wbGF0ZV9wYXJhbWV0ZXJzGAIgAygLMjwub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZVNwZWMuVGVtcGxhdGVQYXJhbWV0ZXJzRW50cnkSPQoUcmVzdGFydF9yZXF1ZXN0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSACIAQESOQoFaW1hZ2UYBCABKAsyJS5vc2FjLnByaXZhdGUudjEuQ29tcHV0ZUluc3RhbmNlSW1hZ2VIAYgBARIbCg5zc2hfcHVibGljX2tleRgHIAEoCUgCiAEBEjwKCWJvb3RfZGlzaxgIIAEoCzIkLm9zYWMucHJpdmF0ZS52MS5Db21wdXRlSW5zdGFuY2VEaXNrSAOIAQESPgoQYWRkaXRpb25hbF9kaXNrcxgJIAMoCzIkLm9zYWMucHJpdmF0ZS52MS5Db21wdXRlSW5zdGFuY2VEaXNrEhkKDHJ1bl9zdHJhdGVneRgKIAEoCUgEiAEBEhYKCXVzZXJfZGF0YRgLIAEoCUgFiAEBEj8KE25ldHdvcmtfYXR0YWNobWVudHMYDiADKAsyIi5vc2FjLnByaXZhdGUudjEuTmV0d29ya0F0dGFjaG1lbnQSFAoMY2F0YWxvZ19pdGVtGA8gASgJEhcKCmlzX3dpbmRvd3MYECABKAhIBogBARIaCg1pbnN0YW5jZV90eXBlGBEgASgJSAeIAQEaTwoXVGVtcGxhdGVQYXJhbWV0ZXJzRW50cnkSCwoDa2V5GAEgASgJEiMKBXZhbHVlGAIgASgLMhQuZ29vZ2xlLnByb3RvYnVmLkFueToCOAFCFwoVX3Jlc3RhcnRfcmVxdWVzdGVkX2F0QggKBl9pbWFnZUIRCg9fc3NoX3B1YmxpY19rZXlCDAoKX2Jvb3RfZGlza0IPCg1fcnVuX3N0cmF0ZWd5QgwKCl91c2VyX2RhdGFCDQoLX2lzX3dpbmRvd3NCEAoOX2luc3RhbmNlX3R5cGVKBAgFEAZKBAgGEAdKBAgMEA1KBAgNEA5SBWNvcmVzUgptZW1vcnlfZ2liUgZzdWJuZXRSD3NlY3VyaXR5X2dyb3VwcyKlAgoVQ29tcHV0ZUluc3RhbmNlU3RhdHVzEjQKBXN0YXRlGAEgASgOMiUub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZVN0YXRlEj0KCmNvbmRpdGlvbnMYAiADKAsyKS5vc2FjLnByaXZhdGUudjEuQ29tcHV0ZUluc3RhbmNlQ29uZGl0aW9uEhsKE2ludGVybmFsX2lwX2FkZHJlc3MYAyABKAkSCwoDaHViGAQgASgJEjoKEWxhc3RfcmVzdGFydGVkX2F0GAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEhsKE2V4dGVybmFsX2lwX2FkZHJlc3MYBiABKAlCFAoSX2xhc3RfcmVzdGFydGVkX2F0IoUCChhDb21wdXRlSW5zdGFuY2VDb25kaXRpb24SOwoEdHlwZRgBIAEoDjItLm9zYWMucHJpdmF0ZS52MS5Db21wdXRlSW5zdGFuY2VDb25kaXRpb25UeXBlEjAKBnN0YXR1cxgCIAEoDjIgLm9zYWMucHJpdmF0ZS52MS5Db25kaXRpb25TdGF0dXMSOAoUbGFzdF90cmFuc2l0aW9uX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhMKBnJlYXNvbhgEIAEoCUgAiAEBEhQKB21lc3NhZ2UYBSABKAlIAYgBAUIJCgdfcmVhc29uQgoKCF9tZXNzYWdlKrsCChRDb21wdXRlSW5zdGFuY2VTdGF0ZRImCiJDT01QVVRFX0lOU1RBTkNFX1NUQVRFX1VOU1BFQ0lGSUVEEAASIwofQ09NUFVURV9JTlNUQU5DRV9TVEFURV9TVEFSVElORxABEiIKHkNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfUlVOTklORxACEiEKHUNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfRkFJTEVEEAMSIwofQ09NUFVURV9JTlNUQU5DRV9TVEFURV9ERUxFVElORxAEEiMKH0NPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfU1RPUFBJTkcQBRIiCh5DT01QVVRFX0lOU1RBTkNFX1NUQVRFX1NUT1BQRUQQBhIhCh1DT01QVVRFX0lOU1RBTkNFX1NUQVRFX1BBVVNFRBAHKokDChxDb21wdXRlSW5zdGFuY2VDb25kaXRpb25UeXBlEi8KK0NPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfVU5TUEVDSUZJRUQQABI5CjVDT01QVVRFX0lOU1RBTkNFX0NPTkRJVElPTl9UWVBFX0NPTkZJR1VSQVRJT05fQVBQTElFRBABEikKJUNPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfUkVBRFkQAhI3CjNDT01QVVRFX0lOU1RBTkNFX0NPTkRJVElPTl9UWVBFX1JFU1RBUlRfSU5fUFJPR1JFU1MQAxIyCi5DT01QVVRFX0lOU1RBTkNFX0NPTkRJVElPTl9UWVBFX1JFU1RBUlRfRkFJTEVEEAQSLworQ09NUFVURV9JTlNUQU5DRV9DT05ESVRJT05fVFlQRV9QUk9WSVNJT05FRBAFEjQKMENPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfUkVTVEFSVF9SRVFVSVJFRBAGYgZwcm90bzM", [file_google_protobuf_any, file_google_protobuf_timestamp, file_osac_private_v1_condition_status_type, file_osac_private_v1_metadata_type]);
/**
* Contains the details about the compute instance that are available only for the system.
@@ -177,9 +177,9 @@ export type ComputeInstanceSpec = Message<"osac.private.v1.ComputeInstanceSpec">
/**
* SSH public key.
*
- * @generated from field: optional string ssh_key = 7;
+ * @generated from field: optional string ssh_public_key = 7;
*/
- sshKey?: string | undefined;
+ sshPublicKey?: string | undefined;
/**
* Boot disk configuration.
@@ -284,11 +284,11 @@ export type ComputeInstanceStatus = Message<"osac.private.v1.ComputeInstanceStat
lastRestartedAt?: Timestamp | undefined;
/**
- * Public IP address attached to the compute instance.
+ * External IP address attached to the compute instance.
*
- * @generated from field: string public_ip_address = 6;
+ * @generated from field: string external_ip_address = 6;
*/
- publicIpAddress: string;
+ externalIpAddress: string;
};
/**
diff --git a/libs/types/src/osac/private/v1/event_type_pb.ts b/libs/types/src/osac/private/v1/event_type_pb.ts
index c4d41878..0afef42e 100644
--- a/libs/types/src/osac/private/v1/event_type_pb.ts
+++ b/libs/types/src/osac/private/v1/event_type_pb.ts
@@ -71,6 +71,8 @@ import type { RoleBinding } from "./role_binding_type_pb";
import { file_osac_private_v1_role_binding_type } from "./role_binding_type_pb";
import type { Role } from "./role_type_pb";
import { file_osac_private_v1_role_type } from "./role_type_pb";
+import type { Secret } from "./secret_type_pb";
+import { file_osac_private_v1_secret_type } from "./secret_type_pb";
import type { SecurityGroup } from "./security_group_type_pb";
import { file_osac_private_v1_security_group_type } from "./security_group_type_pb";
import type { StorageBackend } from "./storage_backend_type_pb";
@@ -89,7 +91,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/private/v1/event_type.proto.
*/
export const file_osac_private_v1_event_type: GenFile = /*@__PURE__*/
- fileDesc("CiBvc2FjL3ByaXZhdGUvdjEvZXZlbnRfdHlwZS5wcm90bxIPb3NhYy5wcml2YXRlLnYxIuEPCgVFdmVudBIKCgJpZBgBIAEoCRIoCgR0eXBlGAIgASgOMhoub3NhYy5wcml2YXRlLnYxLkV2ZW50VHlwZRIrCgdjbHVzdGVyGAMgASgLMhgub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJIABI8ChBjbHVzdGVyX3RlbXBsYXRlGAQgASgLMiAub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJUZW1wbGF0ZUgAEi4KCWhvc3RfdHlwZRgFIAEoCzIZLm9zYWMucHJpdmF0ZS52MS5Ib3N0VHlwZUgAEiMKA2h1YhgGIAEoCzIULm9zYWMucHJpdmF0ZS52MS5IdWJIABJNChljb21wdXRlX2luc3RhbmNlX3RlbXBsYXRlGAcgASgLMigub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZVRlbXBsYXRlSAASPAoQY29tcHV0ZV9pbnN0YW5jZRgIIAEoCzIgLm9zYWMucHJpdmF0ZS52MS5Db21wdXRlSW5zdGFuY2VIABI2Cg1uZXR3b3JrX2NsYXNzGAsgASgLMh0ub3NhYy5wcml2YXRlLnYxLk5ldHdvcmtDbGFzc0gAEikKBnN1Ym5ldBgMIAEoCzIXLm9zYWMucHJpdmF0ZS52MS5TdWJuZXRIABI6Cg92aXJ0dWFsX25ldHdvcmsYDSABKAsyHy5vc2FjLnByaXZhdGUudjEuVmlydHVhbE5ldHdvcmtIABI4Cg5zZWN1cml0eV9ncm91cBgOIAEoCzIeLm9zYWMucHJpdmF0ZS52MS5TZWN1cml0eUdyb3VwSAASNwoOcHVibGljX2lwX3Bvb2wYECABKAsyHS5vc2FjLnByaXZhdGUudjEuUHVibGljSVBQb29sSAASLgoJcHVibGljX2lwGBEgASgLMhkub3NhYy5wcml2YXRlLnYxLlB1YmxpY0lQSAASJQoEdXNlchgTIAEoCzIVLm9zYWMucHJpdmF0ZS52MS5Vc2VySAASJQoEcm9sZRgUIAEoCzIVLm9zYWMucHJpdmF0ZS52MS5Sb2xlSAASNAoMcm9sZV9iaW5kaW5nGBUgASgLMhwub3NhYy5wcml2YXRlLnYxLlJvbGVCaW5kaW5nSAASQwoUY2x1c3Rlcl9jYXRhbG9nX2l0ZW0YFiABKAsyIy5vc2FjLnByaXZhdGUudjEuQ2x1c3RlckNhdGFsb2dJdGVtSAASVAodY29tcHV0ZV9pbnN0YW5jZV9jYXRhbG9nX2l0ZW0YFyABKAsyKy5vc2FjLnByaXZhdGUudjEuQ29tcHV0ZUluc3RhbmNlQ2F0YWxvZ0l0ZW1IABIrCgdwcm9qZWN0GBggASgLMhgub3NhYy5wcml2YXRlLnYxLlByb2plY3RIABJDChRwdWJsaWNfaXBfYXR0YWNobWVudBgZIAEoCzIjLm9zYWMucHJpdmF0ZS52MS5QdWJsaWNJUEF0dGFjaG1lbnRIABI2Cg1pbnN0YW5jZV90eXBlGBogASgLMh0ub3NhYy5wcml2YXRlLnYxLkluc3RhbmNlVHlwZUgAEkEKE2JhcmVfbWV0YWxfaW5zdGFuY2UYGyABKAsyIi5vc2FjLnByaXZhdGUudjEuQmFyZU1ldGFsSW5zdGFuY2VIABJSChxiYXJlX21ldGFsX2luc3RhbmNlX3RlbXBsYXRlGBwgASgLMioub3NhYy5wcml2YXRlLnYxLkJhcmVNZXRhbEluc3RhbmNlVGVtcGxhdGVIABJZCiBiYXJlX21ldGFsX2luc3RhbmNlX2NhdGFsb2dfaXRlbRgdIAEoCzItLm9zYWMucHJpdmF0ZS52MS5CYXJlTWV0YWxJbnN0YW5jZUNhdGFsb2dJdGVtSAASOgoPc3RvcmFnZV9iYWNrZW5kGB4gASgLMh8ub3NhYy5wcml2YXRlLnYxLlN0b3JhZ2VCYWNrZW5kSAASKQoGdGVuYW50GB8gASgLMhcub3NhYy5wcml2YXRlLnYxLlRlbmFudEgAEj4KEWlkZW50aXR5X3Byb3ZpZGVyGCAgASgLMiEub3NhYy5wcml2YXRlLnYxLklkZW50aXR5UHJvdmlkZXJIABJAChJwcm9qZWN0X21lbWJlcnNoaXAYISABKAsyIi5vc2FjLnByaXZhdGUudjEuUHJvamVjdE1lbWJlcnNoaXBIABI7ChBleHRlcm5hbF9pcF9wb29sGCIgASgLMh8ub3NhYy5wcml2YXRlLnYxLkV4dGVybmFsSVBQb29sSAASMgoLZXh0ZXJuYWxfaXAYIyABKAsyGy5vc2FjLnByaXZhdGUudjEuRXh0ZXJuYWxJUEgAEkcKFmV4dGVybmFsX2lwX2F0dGFjaG1lbnQYJCABKAsyJS5vc2FjLnByaXZhdGUudjEuRXh0ZXJuYWxJUEF0dGFjaG1lbnRIABIyCgtuYXRfZ2F0ZXdheRglIAEoCzIbLm9zYWMucHJpdmF0ZS52MS5OQVRHYXRld2F5SAASOgoPY2x1c3Rlcl92ZXJzaW9uGCYgASgLMh8ub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJWZXJzaW9uSAASNAoMc3RvcmFnZV90aWVyGCcgASgLMhwub3NhYy5wcml2YXRlLnYxLlN0b3JhZ2VUaWVySABCCQoHcGF5bG9hZEoECBIQEyqkAQoJRXZlbnRUeXBlEhoKFkVWRU5UX1RZUEVfVU5TUEVDSUZJRUQQABIdChlFVkVOVF9UWVBFX09CSkVDVF9DUkVBVEVEEAESHQoZRVZFTlRfVFlQRV9PQkpFQ1RfVVBEQVRFRBACEh0KGUVWRU5UX1RZUEVfT0JKRUNUX0RFTEVURUQQAxIeChpFVkVOVF9UWVBFX09CSkVDVF9TSUdOQUxFRBAEYgZwcm90bzM", [file_osac_private_v1_baremetal_instance_catalog_item_type, file_osac_private_v1_baremetal_instance_template_type, file_osac_private_v1_baremetal_instance_type, file_osac_private_v1_cluster_catalog_item_type, file_osac_private_v1_cluster_template_type, file_osac_private_v1_cluster_version_type, file_osac_private_v1_cluster_type, file_osac_private_v1_compute_instance_catalog_item_type, file_osac_private_v1_compute_instance_template_type, file_osac_private_v1_compute_instance_type, file_osac_private_v1_external_ip_attachment_type, file_osac_private_v1_external_ip_pool_type, file_osac_private_v1_external_ip_type, file_osac_private_v1_host_type_type, file_osac_private_v1_hub_type, file_osac_private_v1_identity_provider_type, file_osac_private_v1_instance_type_type, file_osac_private_v1_nat_gateway_type, file_osac_private_v1_network_class_type, file_osac_private_v1_project_membership_type, file_osac_private_v1_project_type, file_osac_private_v1_tenant_type, file_osac_private_v1_public_ip_attachment_type, file_osac_private_v1_public_ip_pool_type, file_osac_private_v1_public_ip_type, file_osac_private_v1_role_binding_type, file_osac_private_v1_role_type, file_osac_private_v1_security_group_type, file_osac_private_v1_storage_backend_type, file_osac_private_v1_storage_tier_type, file_osac_private_v1_subnet_type, file_osac_private_v1_user_type, file_osac_private_v1_virtual_network_type]);
+ fileDesc("CiBvc2FjL3ByaXZhdGUvdjEvZXZlbnRfdHlwZS5wcm90bxIPb3NhYy5wcml2YXRlLnYxIowQCgVFdmVudBIKCgJpZBgBIAEoCRIoCgR0eXBlGAIgASgOMhoub3NhYy5wcml2YXRlLnYxLkV2ZW50VHlwZRIrCgdjbHVzdGVyGAMgASgLMhgub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJIABI8ChBjbHVzdGVyX3RlbXBsYXRlGAQgASgLMiAub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJUZW1wbGF0ZUgAEi4KCWhvc3RfdHlwZRgFIAEoCzIZLm9zYWMucHJpdmF0ZS52MS5Ib3N0VHlwZUgAEiMKA2h1YhgGIAEoCzIULm9zYWMucHJpdmF0ZS52MS5IdWJIABJNChljb21wdXRlX2luc3RhbmNlX3RlbXBsYXRlGAcgASgLMigub3NhYy5wcml2YXRlLnYxLkNvbXB1dGVJbnN0YW5jZVRlbXBsYXRlSAASPAoQY29tcHV0ZV9pbnN0YW5jZRgIIAEoCzIgLm9zYWMucHJpdmF0ZS52MS5Db21wdXRlSW5zdGFuY2VIABI2Cg1uZXR3b3JrX2NsYXNzGAsgASgLMh0ub3NhYy5wcml2YXRlLnYxLk5ldHdvcmtDbGFzc0gAEikKBnN1Ym5ldBgMIAEoCzIXLm9zYWMucHJpdmF0ZS52MS5TdWJuZXRIABI6Cg92aXJ0dWFsX25ldHdvcmsYDSABKAsyHy5vc2FjLnByaXZhdGUudjEuVmlydHVhbE5ldHdvcmtIABI4Cg5zZWN1cml0eV9ncm91cBgOIAEoCzIeLm9zYWMucHJpdmF0ZS52MS5TZWN1cml0eUdyb3VwSAASNwoOcHVibGljX2lwX3Bvb2wYECABKAsyHS5vc2FjLnByaXZhdGUudjEuUHVibGljSVBQb29sSAASLgoJcHVibGljX2lwGBEgASgLMhkub3NhYy5wcml2YXRlLnYxLlB1YmxpY0lQSAASJQoEdXNlchgTIAEoCzIVLm9zYWMucHJpdmF0ZS52MS5Vc2VySAASJQoEcm9sZRgUIAEoCzIVLm9zYWMucHJpdmF0ZS52MS5Sb2xlSAASNAoMcm9sZV9iaW5kaW5nGBUgASgLMhwub3NhYy5wcml2YXRlLnYxLlJvbGVCaW5kaW5nSAASQwoUY2x1c3Rlcl9jYXRhbG9nX2l0ZW0YFiABKAsyIy5vc2FjLnByaXZhdGUudjEuQ2x1c3RlckNhdGFsb2dJdGVtSAASVAodY29tcHV0ZV9pbnN0YW5jZV9jYXRhbG9nX2l0ZW0YFyABKAsyKy5vc2FjLnByaXZhdGUudjEuQ29tcHV0ZUluc3RhbmNlQ2F0YWxvZ0l0ZW1IABIrCgdwcm9qZWN0GBggASgLMhgub3NhYy5wcml2YXRlLnYxLlByb2plY3RIABJDChRwdWJsaWNfaXBfYXR0YWNobWVudBgZIAEoCzIjLm9zYWMucHJpdmF0ZS52MS5QdWJsaWNJUEF0dGFjaG1lbnRIABI2Cg1pbnN0YW5jZV90eXBlGBogASgLMh0ub3NhYy5wcml2YXRlLnYxLkluc3RhbmNlVHlwZUgAEkEKE2JhcmVfbWV0YWxfaW5zdGFuY2UYGyABKAsyIi5vc2FjLnByaXZhdGUudjEuQmFyZU1ldGFsSW5zdGFuY2VIABJSChxiYXJlX21ldGFsX2luc3RhbmNlX3RlbXBsYXRlGBwgASgLMioub3NhYy5wcml2YXRlLnYxLkJhcmVNZXRhbEluc3RhbmNlVGVtcGxhdGVIABJZCiBiYXJlX21ldGFsX2luc3RhbmNlX2NhdGFsb2dfaXRlbRgdIAEoCzItLm9zYWMucHJpdmF0ZS52MS5CYXJlTWV0YWxJbnN0YW5jZUNhdGFsb2dJdGVtSAASOgoPc3RvcmFnZV9iYWNrZW5kGB4gASgLMh8ub3NhYy5wcml2YXRlLnYxLlN0b3JhZ2VCYWNrZW5kSAASKQoGdGVuYW50GB8gASgLMhcub3NhYy5wcml2YXRlLnYxLlRlbmFudEgAEj4KEWlkZW50aXR5X3Byb3ZpZGVyGCAgASgLMiEub3NhYy5wcml2YXRlLnYxLklkZW50aXR5UHJvdmlkZXJIABJAChJwcm9qZWN0X21lbWJlcnNoaXAYISABKAsyIi5vc2FjLnByaXZhdGUudjEuUHJvamVjdE1lbWJlcnNoaXBIABI7ChBleHRlcm5hbF9pcF9wb29sGCIgASgLMh8ub3NhYy5wcml2YXRlLnYxLkV4dGVybmFsSVBQb29sSAASMgoLZXh0ZXJuYWxfaXAYIyABKAsyGy5vc2FjLnByaXZhdGUudjEuRXh0ZXJuYWxJUEgAEkcKFmV4dGVybmFsX2lwX2F0dGFjaG1lbnQYJCABKAsyJS5vc2FjLnByaXZhdGUudjEuRXh0ZXJuYWxJUEF0dGFjaG1lbnRIABIyCgtuYXRfZ2F0ZXdheRglIAEoCzIbLm9zYWMucHJpdmF0ZS52MS5OQVRHYXRld2F5SAASOgoPY2x1c3Rlcl92ZXJzaW9uGCYgASgLMh8ub3NhYy5wcml2YXRlLnYxLkNsdXN0ZXJWZXJzaW9uSAASNAoMc3RvcmFnZV90aWVyGCcgASgLMhwub3NhYy5wcml2YXRlLnYxLlN0b3JhZ2VUaWVySAASKQoGc2VjcmV0GCggASgLMhcub3NhYy5wcml2YXRlLnYxLlNlY3JldEgAQgkKB3BheWxvYWRKBAgSEBMqpAEKCUV2ZW50VHlwZRIaChZFVkVOVF9UWVBFX1VOU1BFQ0lGSUVEEAASHQoZRVZFTlRfVFlQRV9PQkpFQ1RfQ1JFQVRFRBABEh0KGUVWRU5UX1RZUEVfT0JKRUNUX1VQREFURUQQAhIdChlFVkVOVF9UWVBFX09CSkVDVF9ERUxFVEVEEAMSHgoaRVZFTlRfVFlQRV9PQkpFQ1RfU0lHTkFMRUQQBGIGcHJvdG8z", [file_osac_private_v1_baremetal_instance_catalog_item_type, file_osac_private_v1_baremetal_instance_template_type, file_osac_private_v1_baremetal_instance_type, file_osac_private_v1_cluster_catalog_item_type, file_osac_private_v1_cluster_template_type, file_osac_private_v1_cluster_version_type, file_osac_private_v1_cluster_type, file_osac_private_v1_compute_instance_catalog_item_type, file_osac_private_v1_compute_instance_template_type, file_osac_private_v1_compute_instance_type, file_osac_private_v1_external_ip_attachment_type, file_osac_private_v1_external_ip_pool_type, file_osac_private_v1_external_ip_type, file_osac_private_v1_host_type_type, file_osac_private_v1_hub_type, file_osac_private_v1_identity_provider_type, file_osac_private_v1_instance_type_type, file_osac_private_v1_nat_gateway_type, file_osac_private_v1_network_class_type, file_osac_private_v1_project_membership_type, file_osac_private_v1_project_type, file_osac_private_v1_tenant_type, file_osac_private_v1_public_ip_attachment_type, file_osac_private_v1_public_ip_pool_type, file_osac_private_v1_public_ip_type, file_osac_private_v1_role_binding_type, file_osac_private_v1_role_type, file_osac_private_v1_secret_type, file_osac_private_v1_security_group_type, file_osac_private_v1_storage_backend_type, file_osac_private_v1_storage_tier_type, file_osac_private_v1_subnet_type, file_osac_private_v1_user_type, file_osac_private_v1_virtual_network_type]);
/**
* Represents events delivered by the server.
@@ -314,6 +316,12 @@ export type Event = Message<"osac.private.v1.Event"> & {
*/
value: StorageTier;
case: "storageTier";
+ } | {
+ /**
+ * @generated from field: osac.private.v1.Secret secret = 40;
+ */
+ value: Secret;
+ case: "secret";
} | { case: undefined; value?: undefined };
};
diff --git a/libs/types/src/osac/private/v1/host_type_type_pb.ts b/libs/types/src/osac/private/v1/host_type_type_pb.ts
index 01071810..432c7fdc 100644
--- a/libs/types/src/osac/private/v1/host_type_type_pb.ts
+++ b/libs/types/src/osac/private/v1/host_type_type_pb.ts
@@ -28,6 +28,8 @@ export const file_osac_private_v1_host_type_type: GenFile = /*@__PURE__*/
fileDesc("CiRvc2FjL3ByaXZhdGUvdjEvaG9zdF90eXBlX3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSKeAQoISG9zdFR5cGUSCgoCaWQYASABKAkSKwoIbWV0YWRhdGEYAiABKAsyGS5vc2FjLnByaXZhdGUudjEuTWV0YWRhdGESDQoFdGl0bGUYAyABKAkSEwoLZGVzY3JpcHRpb24YBCABKAkSNQoKaW50ZXJmYWNlcxgFIAMoCzIhLm9zYWMucHJpdmF0ZS52MS5OZXR3b3JrSW50ZXJmYWNlIkMKEE5ldHdvcmtJbnRlcmZhY2USDAoEbmFtZRgBIAEoCRIMCgRyb2xlGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJYgZwcm90bzM", [file_osac_private_v1_metadata_type]);
/**
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.private.v1.HostType
*/
export type HostType = Message<"osac.private.v1.HostType"> & {
diff --git a/libs/types/src/osac/private/v1/network_class_type_pb.ts b/libs/types/src/osac/private/v1/network_class_type_pb.ts
index fb4ba11b..1ba5136e 100644
--- a/libs/types/src/osac/private/v1/network_class_type_pb.ts
+++ b/libs/types/src/osac/private/v1/network_class_type_pb.ts
@@ -44,6 +44,8 @@ export const file_osac_private_v1_network_class_type: GenFile = /*@__PURE__*/
* creating VirtualNetworks. The `implementation_strategy` field is the key identifier that VirtualNetwork resources
* reference to select their network backend.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.private.v1.NetworkClass
*/
export type NetworkClass = Message<"osac.private.v1.NetworkClass"> & {
diff --git a/libs/types/src/osac/private/v1/project_membership_type_pb.ts b/libs/types/src/osac/private/v1/project_membership_type_pb.ts
index 1fe9463d..5a4c1350 100644
--- a/libs/types/src/osac/private/v1/project_membership_type_pb.ts
+++ b/libs/types/src/osac/private/v1/project_membership_type_pb.ts
@@ -25,7 +25,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/private/v1/project_membership_type.proto.
*/
export const file_osac_private_v1_project_membership_type: GenFile = /*@__PURE__*/
- fileDesc("Ci1vc2FjL3ByaXZhdGUvdjEvcHJvamVjdF9tZW1iZXJzaGlwX3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSK8AQoRUHJvamVjdE1lbWJlcnNoaXASCgoCaWQYASABKAkSKwoIbWV0YWRhdGEYAiABKAsyGS5vc2FjLnByaXZhdGUudjEuTWV0YWRhdGESNAoEc3BlYxgDIAEoCzImLm9zYWMucHJpdmF0ZS52MS5Qcm9qZWN0TWVtYmVyc2hpcFNwZWMSOAoGc3RhdHVzGAQgASgLMigub3NhYy5wcml2YXRlLnYxLlByb2plY3RNZW1iZXJzaGlwU3RhdHVzIngKFVByb2plY3RNZW1iZXJzaGlwU3BlYxIPCgdwcm9qZWN0GAEgASgJEjQKBHJvbGUYAiABKA4yJi5vc2FjLnByaXZhdGUudjEuUHJvamVjdE1lbWJlcnNoaXBSb2xlEg4KBHVzZXIYAyABKAlIAEIICgZtZW1iZXIicwoXUHJvamVjdE1lbWJlcnNoaXBTdGF0dXMSNgoFc3RhdGUYASABKA4yJy5vc2FjLnByaXZhdGUudjEuUHJvamVjdE1lbWJlcnNoaXBTdGF0ZRIUCgdtZXNzYWdlGAIgASgJSACIAQFCCgoIX21lc3NhZ2UqiQEKFVByb2plY3RNZW1iZXJzaGlwUm9sZRInCiNQUk9KRUNUX01FTUJFUlNISVBfUk9MRV9VTlNQRUNJRklFRBAAEiIKHlBST0pFQ1RfTUVNQkVSU0hJUF9ST0xFX1ZJRVdFUhABEiMKH1BST0pFQ1RfTUVNQkVSU0hJUF9ST0xFX01BTkFHRVIQAiqxAQoWUHJvamVjdE1lbWJlcnNoaXBTdGF0ZRIoCiRQUk9KRUNUX01FTUJFUlNISVBfU1RBVEVfVU5TUEVDSUZJRUQQABIkCiBQUk9KRUNUX01FTUJFUlNISVBfU1RBVEVfUEVORElORxABEiIKHlBST0pFQ1RfTUVNQkVSU0hJUF9TVEFURV9SRUFEWRACEiMKH1BST0pFQ1RfTUVNQkVSU0hJUF9TVEFURV9GQUlMRUQQA2IGcHJvdG8z", [file_osac_private_v1_metadata_type]);
+ fileDesc("Ci1vc2FjL3ByaXZhdGUvdjEvcHJvamVjdF9tZW1iZXJzaGlwX3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSK8AQoRUHJvamVjdE1lbWJlcnNoaXASCgoCaWQYASABKAkSKwoIbWV0YWRhdGEYAiABKAsyGS5vc2FjLnByaXZhdGUudjEuTWV0YWRhdGESNAoEc3BlYxgDIAEoCzImLm9zYWMucHJpdmF0ZS52MS5Qcm9qZWN0TWVtYmVyc2hpcFNwZWMSOAoGc3RhdHVzGAQgASgLMigub3NhYy5wcml2YXRlLnYxLlByb2plY3RNZW1iZXJzaGlwU3RhdHVzIlwKFVByb2plY3RNZW1iZXJzaGlwU3BlYxI0CgRyb2xlGAIgASgOMiYub3NhYy5wcml2YXRlLnYxLlByb2plY3RNZW1iZXJzaGlwUm9sZRINCgV1c2VycxgDIAMoCSKCAQoXUHJvamVjdE1lbWJlcnNoaXBTdGF0dXMSNgoFc3RhdGUYASABKA4yJy5vc2FjLnByaXZhdGUudjEuUHJvamVjdE1lbWJlcnNoaXBTdGF0ZRIUCgdtZXNzYWdlGAIgASgJSACIAQESDQoFdXNlcnMYAyADKAlCCgoIX21lc3NhZ2UqiQEKFVByb2plY3RNZW1iZXJzaGlwUm9sZRInCiNQUk9KRUNUX01FTUJFUlNISVBfUk9MRV9VTlNQRUNJRklFRBAAEiIKHlBST0pFQ1RfTUVNQkVSU0hJUF9ST0xFX1ZJRVdFUhABEiMKH1BST0pFQ1RfTUVNQkVSU0hJUF9ST0xFX01BTkFHRVIQAiqxAQoWUHJvamVjdE1lbWJlcnNoaXBTdGF0ZRIoCiRQUk9KRUNUX01FTUJFUlNISVBfU1RBVEVfVU5TUEVDSUZJRUQQABIkCiBQUk9KRUNUX01FTUJFUlNISVBfU1RBVEVfUEVORElORxABEiIKHlBST0pFQ1RfTUVNQkVSU0hJUF9TVEFURV9SRUFEWRACEiMKH1BST0pFQ1RfTUVNQkVSU0hJUF9TVEFURV9GQUlMRUQQA2IGcHJvdG8z", [file_osac_private_v1_metadata_type]);
/**
* ProjectMembership represents a member's association with a project and their role within it.
@@ -70,39 +70,25 @@ export const ProjectMembershipSchema: GenMessage = /*@__PURE_
messageDesc(file_osac_private_v1_project_membership_type, 0);
/**
- * Describes a member of a project.
+ * Describes the members of a project.
*
* @generated from message osac.private.v1.ProjectMembershipSpec
*/
export type ProjectMembershipSpec = Message<"osac.private.v1.ProjectMembershipSpec"> & {
/**
- * Reference to the project that this membership applies to. This is the unique identifier (ID) of the Project object,
- * not the project name.
- *
- * @generated from field: string project = 1;
- */
- project: string;
-
- /**
- * Role of the member in the project. This indicates whether the member is a viewer, manager, etc.
+ * Role of the members in the project. This indicates whether the members are viewers, managers, etc.
*
* @generated from field: osac.private.v1.ProjectMembershipRole role = 2;
*/
role: ProjectMembershipRole;
/**
- * Unique identifier of the member. Currently members are users (referenced by their User object ID), but this leaves
- * room for adding other kinds of members in the future, like groups.
+ * Identifiers of the users that are members of the project. These are user identifiers (the `id` field of User
+ * objects), not usernames or email addresses.
*
- * @generated from oneof osac.private.v1.ProjectMembershipSpec.member
+ * @generated from field: repeated string users = 3;
*/
- member: {
- /**
- * @generated from field: string user = 3;
- */
- value: string;
- case: "user";
- } | { case: undefined; value?: undefined };
+ users: string[];
};
/**
@@ -132,6 +118,15 @@ export type ProjectMembershipStatus = Message<"osac.private.v1.ProjectMembership
* @generated from field: optional string message = 2;
*/
message?: string | undefined;
+
+ /**
+ * List of user IDs that have been successfully synced to the identity provider. This tracks which users
+ * currently have the role assigned, allowing the controller to detect when users are added or removed from
+ * the membership.
+ *
+ * @generated from field: repeated string users = 3;
+ */
+ users: string[];
};
/**
diff --git a/libs/types/src/osac/private/v1/public_ip_type_pb.ts b/libs/types/src/osac/private/v1/public_ip_type_pb.ts
index c4ac03d8..f9a95ad4 100644
--- a/libs/types/src/osac/private/v1/public_ip_type_pb.ts
+++ b/libs/types/src/osac/private/v1/public_ip_type_pb.ts
@@ -22,14 +22,13 @@ import type { IPFamily } from "./ip_family_type_pb";
import { file_osac_private_v1_ip_family_type } from "./ip_family_type_pb";
import type { Metadata } from "./metadata_type_pb";
import { file_osac_private_v1_metadata_type } from "./metadata_type_pb";
-import { file_osac_private_v1_public_ip_pool_type } from "./public_ip_pool_type_pb";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file osac/private/v1/public_ip_type.proto.
*/
export const file_osac_private_v1_public_ip_type: GenFile = /*@__PURE__*/
- fileDesc("CiRvc2FjL3ByaXZhdGUvdjEvcHVibGljX2lwX3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSKhAQoIUHVibGljSVASCgoCaWQYASABKAkSKwoIbWV0YWRhdGEYAiABKAsyGS5vc2FjLnByaXZhdGUudjEuTWV0YWRhdGESKwoEc3BlYxgDIAEoCzIdLm9zYWMucHJpdmF0ZS52MS5QdWJsaWNJUFNwZWMSLwoGc3RhdHVzGAQgASgLMh8ub3NhYy5wcml2YXRlLnYxLlB1YmxpY0lQU3RhdHVzIlQKDFB1YmxpY0lQU3BlYxIRCgRwb29sGAEgASgJQgPgQQUSMQoJaXBfZmFtaWx5GAIgASgOMhkub3NhYy5wcml2YXRlLnYxLklQRmFtaWx5QgPgQQUivQEKDlB1YmxpY0lQU3RhdHVzEjIKBXN0YXRlGAEgASgOMh4ub3NhYy5wcml2YXRlLnYxLlB1YmxpY0lQU3RhdGVCA+BBAxIZCgdtZXNzYWdlGAIgASgJQgPgQQNIAIgBARIQCgNodWIYAyABKAlCA+BBAxIUCgdhZGRyZXNzGAQgASgJQgPgQQMSEQoEcG9vbBgFIAEoCUID4EEDEhUKCGF0dGFjaGVkGAYgASgIQgPgQQNCCgoIX21lc3NhZ2UqpgEKDVB1YmxpY0lQU3RhdGUSHwobUFVCTElDX0lQX1NUQVRFX1VOU1BFQ0lGSUVEEAASGwoXUFVCTElDX0lQX1NUQVRFX1BFTkRJTkcQARIdChlQVUJMSUNfSVBfU1RBVEVfQUxMT0NBVEVEEAISGgoWUFVCTElDX0lQX1NUQVRFX0ZBSUxFRBADEhwKGFBVQkxJQ19JUF9TVEFURV9ERUxFVElORxAEYgZwcm90bzM", [file_google_api_field_behavior, file_osac_private_v1_ip_family_type, file_osac_private_v1_metadata_type, file_osac_private_v1_public_ip_pool_type]);
+ fileDesc("CiRvc2FjL3ByaXZhdGUvdjEvcHVibGljX2lwX3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSKhAQoIUHVibGljSVASCgoCaWQYASABKAkSKwoIbWV0YWRhdGEYAiABKAsyGS5vc2FjLnByaXZhdGUudjEuTWV0YWRhdGESKwoEc3BlYxgDIAEoCzIdLm9zYWMucHJpdmF0ZS52MS5QdWJsaWNJUFNwZWMSLwoGc3RhdHVzGAQgASgLMh8ub3NhYy5wcml2YXRlLnYxLlB1YmxpY0lQU3RhdHVzIlQKDFB1YmxpY0lQU3BlYxIRCgRwb29sGAEgASgJQgPgQQUSMQoJaXBfZmFtaWx5GAIgASgOMhkub3NhYy5wcml2YXRlLnYxLklQRmFtaWx5QgPgQQUivQEKDlB1YmxpY0lQU3RhdHVzEjIKBXN0YXRlGAEgASgOMh4ub3NhYy5wcml2YXRlLnYxLlB1YmxpY0lQU3RhdGVCA+BBAxIZCgdtZXNzYWdlGAIgASgJQgPgQQNIAIgBARIQCgNodWIYAyABKAlCA+BBAxIUCgdhZGRyZXNzGAQgASgJQgPgQQMSEQoEcG9vbBgFIAEoCUID4EEDEhUKCGF0dGFjaGVkGAYgASgIQgPgQQNCCgoIX21lc3NhZ2UqpgEKDVB1YmxpY0lQU3RhdGUSHwobUFVCTElDX0lQX1NUQVRFX1VOU1BFQ0lGSUVEEAASGwoXUFVCTElDX0lQX1NUQVRFX1BFTkRJTkcQARIdChlQVUJMSUNfSVBfU1RBVEVfQUxMT0NBVEVEEAISGgoWUFVCTElDX0lQX1NUQVRFX0ZBSUxFRBADEhwKGFBVQkxJQ19JUF9TVEFURV9ERUxFVElORxAEYgZwcm90bzM", [file_google_api_field_behavior, file_osac_private_v1_ip_family_type, file_osac_private_v1_metadata_type]);
/**
* Represents a public IP address allocated from a PublicIPPool.
diff --git a/libs/types/src/osac/private/v1/secret_type_pb.ts b/libs/types/src/osac/private/v1/secret_type_pb.ts
new file mode 100644
index 00000000..43921c4a
--- /dev/null
+++ b/libs/types/src/osac/private/v1/secret_type_pb.ts
@@ -0,0 +1,167 @@
+//
+// Copyright (c) 2026 Red Hat, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations under the License.
+//
+
+// @generated by protoc-gen-es v2.12.0 with parameter "target=ts"
+// @generated from file osac/private/v1/secret_type.proto (package osac.private.v1, syntax proto3)
+/* eslint-disable */
+
+import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
+import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
+import type { Metadata } from "./metadata_type_pb";
+import { file_osac_private_v1_metadata_type } from "./metadata_type_pb";
+import type { Message } from "@bufbuild/protobuf";
+
+/**
+ * Describes the file osac/private/v1/secret_type.proto.
+ */
+export const file_osac_private_v1_secret_type: GenFile = /*@__PURE__*/
+ fileDesc("CiFvc2FjL3ByaXZhdGUvdjEvc2VjcmV0X3R5cGUucHJvdG8SD29zYWMucHJpdmF0ZS52MSKbAQoGU2VjcmV0EgoKAmlkGAEgASgJEisKCG1ldGFkYXRhGAIgASgLMhkub3NhYy5wcml2YXRlLnYxLk1ldGFkYXRhEikKBHNwZWMYAyABKAsyGy5vc2FjLnByaXZhdGUudjEuU2VjcmV0U3BlYxItCgZzdGF0dXMYBCABKAsyHS5vc2FjLnByaXZhdGUudjEuU2VjcmV0U3RhdHVzIpYCCgpTZWNyZXRTcGVjEjMKBGRhdGEYASADKAsyJS5vc2FjLnByaXZhdGUudjEuU2VjcmV0U3BlYy5EYXRhRW50cnkSLwoHYmFja2VuZBgCIAEoDjIeLm9zYWMucHJpdmF0ZS52MS5TZWNyZXRCYWNrZW5kEkEKC2Nvb3JkaW5hdGVzGAMgAygLMiwub3NhYy5wcml2YXRlLnYxLlNlY3JldFNwZWMuQ29vcmRpbmF0ZXNFbnRyeRorCglEYXRhRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgMOgI4ARoyChBDb29yZGluYXRlc0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiiwEKDFNlY3JldFN0YXR1cxJGCg1yZXNvbHZlZF9kYXRhGAEgAygLMi8ub3NhYy5wcml2YXRlLnYxLlNlY3JldFN0YXR1cy5SZXNvbHZlZERhdGFFbnRyeRozChFSZXNvbHZlZERhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAw6AjgBKmEKDVNlY3JldEJhY2tlbmQSHgoaU0VDUkVUX0JBQ0tFTkRfVU5TUEVDSUZJRUQQABIYChRTRUNSRVRfQkFDS0VORF9WQVVMVBABEhYKElNFQ1JFVF9CQUNLRU5EX0hVQhACYgZwcm90bzM", [file_osac_private_v1_metadata_type]);
+
+/**
+ * Represents a secret containing opaque key-value data.
+ *
+ * Secrets store sensitive information such as TLS certificates, pull secrets, and credentials. Each secret holds a map
+ * of named binary values and optionally references a storage backend (such as Vault or Hub) for external secret
+ * management. The `coordinates` field carries backend-specific location metadata used to resolve the secret in the
+ * external system.
+ *
+ * @generated from message osac.private.v1.Secret
+ */
+export type Secret = Message<"osac.private.v1.Secret"> & {
+ /**
+ * Unique identifier of the secret.
+ *
+ * @generated from field: string id = 1;
+ */
+ id: string;
+
+ /**
+ * Metadata of the secret.
+ *
+ * @generated from field: osac.private.v1.Metadata metadata = 2;
+ */
+ metadata?: Metadata | undefined;
+
+ /**
+ * Desired state of the secret.
+ *
+ * @generated from field: osac.private.v1.SecretSpec spec = 3;
+ */
+ spec?: SecretSpec | undefined;
+
+ /**
+ * Observed state of the secret, populated by the server.
+ *
+ * @generated from field: osac.private.v1.SecretStatus status = 4;
+ */
+ status?: SecretStatus | undefined;
+};
+
+/**
+ * Describes the message osac.private.v1.Secret.
+ * Use `create(SecretSchema)` to create a new message.
+ */
+export const SecretSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secret_type, 0);
+
+/**
+ * Desired state of a secret.
+ *
+ * @generated from message osac.private.v1.SecretSpec
+ */
+export type SecretSpec = Message<"osac.private.v1.SecretSpec"> & {
+ /**
+ * Opaque key-value data. Each key identifies a named entry (for example, `crt` or `key`) and the
+ * corresponding value is the raw secret material.
+ *
+ * @generated from field: map data = 1;
+ */
+ data: { [key: string]: Uint8Array };
+
+ /**
+ * Storage backend used to manage this secret.
+ *
+ * @generated from field: osac.private.v1.SecretBackend backend = 2;
+ */
+ backend: SecretBackend;
+
+ /**
+ * Backend-specific location metadata.
+ *
+ * @generated from field: map coordinates = 3;
+ */
+ coordinates: { [key: string]: string };
+};
+
+/**
+ * Describes the message osac.private.v1.SecretSpec.
+ * Use `create(SecretSpecSchema)` to create a new message.
+ */
+export const SecretSpecSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secret_type, 1);
+
+/**
+ * Observed state of a secret, populated by the server.
+ *
+ * @generated from message osac.private.v1.SecretStatus
+ */
+export type SecretStatus = Message<"osac.private.v1.SecretStatus"> & {
+ /**
+ * The secret's resolved key-value data. Present in Get responses; omitted from List responses.
+ *
+ * @generated from field: map resolved_data = 1;
+ */
+ resolvedData: { [key: string]: Uint8Array };
+};
+
+/**
+ * Describes the message osac.private.v1.SecretStatus.
+ * Use `create(SecretStatusSchema)` to create a new message.
+ */
+export const SecretStatusSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secret_type, 2);
+
+/**
+ * Storage backends for secret management.
+ *
+ * @generated from enum osac.private.v1.SecretBackend
+ */
+export enum SecretBackend {
+ /**
+ * Backend is unknown or the secret is stored inline.
+ *
+ * @generated from enum value: SECRET_BACKEND_UNSPECIFIED = 0;
+ */
+ UNSPECIFIED = 0,
+
+ /**
+ * Secret is managed by HashiCorp Vault.
+ *
+ * @generated from enum value: SECRET_BACKEND_VAULT = 1;
+ */
+ VAULT = 1,
+
+ /**
+ * Secret is managed by the OSAC Hub.
+ *
+ * @generated from enum value: SECRET_BACKEND_HUB = 2;
+ */
+ HUB = 2,
+}
+
+/**
+ * Describes the enum osac.private.v1.SecretBackend.
+ */
+export const SecretBackendSchema: GenEnum = /*@__PURE__*/
+ enumDesc(file_osac_private_v1_secret_type, 0);
+
diff --git a/libs/types/src/osac/private/v1/secrets_service_pb.ts b/libs/types/src/osac/private/v1/secrets_service_pb.ts
new file mode 100644
index 00000000..4c4593f4
--- /dev/null
+++ b/libs/types/src/osac/private/v1/secrets_service_pb.ts
@@ -0,0 +1,378 @@
+//
+// Copyright (c) 2026 Red Hat, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations under the License.
+//
+
+// @generated by protoc-gen-es v2.12.0 with parameter "target=ts"
+// @generated from file osac/private/v1/secrets_service.proto (package osac.private.v1, syntax proto3)
+/* eslint-disable */
+
+import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
+import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_google_api_annotations } from "../../../google/api/annotations_pb";
+import type { FieldMask } from "../../../google/protobuf/field_mask_pb";
+import { file_google_protobuf_field_mask } from "../../../google/protobuf/field_mask_pb";
+import type { Secret } from "./secret_type_pb";
+import { file_osac_private_v1_secret_type } from "./secret_type_pb";
+import type { Message } from "@bufbuild/protobuf";
+
+/**
+ * Describes the file osac/private/v1/secrets_service.proto.
+ */
+export const file_osac_private_v1_secrets_service: GenFile = /*@__PURE__*/
+ fileDesc("CiVvc2FjL3ByaXZhdGUvdjEvc2VjcmV0c19zZXJ2aWNlLnByb3RvEg9vc2FjLnByaXZhdGUudjEikAEKElNlY3JldHNMaXN0UmVxdWVzdBITCgZvZmZzZXQYASABKAVIAIgBARISCgVsaW1pdBgCIAEoBUgBiAEBEhMKBmZpbHRlchgDIAEoCUgCiAEBEhIKBW9yZGVyGAQgASgJSAOIAQFCCQoHX29mZnNldEIICgZfbGltaXRCCQoHX2ZpbHRlckIICgZfb3JkZXIiWgoTU2VjcmV0c0xpc3RSZXNwb25zZRIMCgRzaXplGAEgASgFEg0KBXRvdGFsGAIgASgFEiYKBWl0ZW1zGAMgAygLMhcub3NhYy5wcml2YXRlLnYxLlNlY3JldCIfChFTZWNyZXRzR2V0UmVxdWVzdBIKCgJpZBgBIAEoCSI9ChJTZWNyZXRzR2V0UmVzcG9uc2USJwoGb2JqZWN0GAEgASgLMhcub3NhYy5wcml2YXRlLnYxLlNlY3JldCI/ChRTZWNyZXRzQ3JlYXRlUmVxdWVzdBInCgZvYmplY3QYASABKAsyFy5vc2FjLnByaXZhdGUudjEuU2VjcmV0IkAKFVNlY3JldHNDcmVhdGVSZXNwb25zZRInCgZvYmplY3QYASABKAsyFy5vc2FjLnByaXZhdGUudjEuU2VjcmV0In4KFFNlY3JldHNVcGRhdGVSZXF1ZXN0EicKBm9iamVjdBgBIAEoCzIXLm9zYWMucHJpdmF0ZS52MS5TZWNyZXQSLwoLdXBkYXRlX21hc2sYAiABKAsyGi5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrEgwKBGxvY2sYAyABKAgiQAoVU2VjcmV0c1VwZGF0ZVJlc3BvbnNlEicKBm9iamVjdBgBIAEoCzIXLm9zYWMucHJpdmF0ZS52MS5TZWNyZXQiIgoUU2VjcmV0c0RlbGV0ZVJlcXVlc3QSCgoCaWQYASABKAkiFwoVU2VjcmV0c0RlbGV0ZVJlc3BvbnNlIiIKFFNlY3JldHNTaWduYWxSZXF1ZXN0EgoKAmlkGAEgASgJIhcKFVNlY3JldHNTaWduYWxSZXNwb25zZTL3BQoHU2VjcmV0cxJyCgRMaXN0EiMub3NhYy5wcml2YXRlLnYxLlNlY3JldHNMaXN0UmVxdWVzdBokLm9zYWMucHJpdmF0ZS52MS5TZWNyZXRzTGlzdFJlc3BvbnNlIh+C0+STAhkSFy9hcGkvcHJpdmF0ZS92MS9zZWNyZXRzEnwKA0dldBIiLm9zYWMucHJpdmF0ZS52MS5TZWNyZXRzR2V0UmVxdWVzdBojLm9zYWMucHJpdmF0ZS52MS5TZWNyZXRzR2V0UmVzcG9uc2UiLILT5JMCJmIGb2JqZWN0EhwvYXBpL3ByaXZhdGUvdjEvc2VjcmV0cy97aWR9EogBCgZDcmVhdGUSJS5vc2FjLnByaXZhdGUudjEuU2VjcmV0c0NyZWF0ZVJlcXVlc3QaJi5vc2FjLnByaXZhdGUudjEuU2VjcmV0c0NyZWF0ZVJlc3BvbnNlIi+C0+STAik6Bm9iamVjdGIGb2JqZWN0IhcvYXBpL3ByaXZhdGUvdjEvc2VjcmV0cxKUAQoGVXBkYXRlEiUub3NhYy5wcml2YXRlLnYxLlNlY3JldHNVcGRhdGVSZXF1ZXN0GiYub3NhYy5wcml2YXRlLnYxLlNlY3JldHNVcGRhdGVSZXNwb25zZSI7gtPkkwI1OgZvYmplY3RiBm9iamVjdDIjL2FwaS9wcml2YXRlL3YxL3NlY3JldHMve29iamVjdC5pZH0SfQoGRGVsZXRlEiUub3NhYy5wcml2YXRlLnYxLlNlY3JldHNEZWxldGVSZXF1ZXN0GiYub3NhYy5wcml2YXRlLnYxLlNlY3JldHNEZWxldGVSZXNwb25zZSIkgtPkkwIeKhwvYXBpL3ByaXZhdGUvdjEvc2VjcmV0cy97aWR9ElkKBlNpZ25hbBIlLm9zYWMucHJpdmF0ZS52MS5TZWNyZXRzU2lnbmFsUmVxdWVzdBomLm9zYWMucHJpdmF0ZS52MS5TZWNyZXRzU2lnbmFsUmVzcG9uc2UiAGIGcHJvdG8z", [file_google_api_annotations, file_google_protobuf_field_mask, file_osac_private_v1_secret_type]);
+
+/**
+ * @generated from message osac.private.v1.SecretsListRequest
+ */
+export type SecretsListRequest = Message<"osac.private.v1.SecretsListRequest"> & {
+ /**
+ * Index of the first result. If not specified the default value will be zero.
+ *
+ * @generated from field: optional int32 offset = 1;
+ */
+ offset?: number | undefined;
+
+ /**
+ * Maximum number of results to be returned by the server. When not specified all the results will be returned. Note
+ * that there may not be enough results to return, and that the server may decide, for performance reasons, to return
+ * less results than requested.
+ *
+ * @generated from field: optional int32 limit = 2;
+ */
+ limit?: number | undefined;
+
+ /**
+ * Filter criteria.
+ *
+ * The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The
+ * built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the
+ * expression evaluates to `true` the object is included in the results. For example, to retrieve all secrets with
+ * a Vault backend:
+ *
+ * this.spec.backend == SECRET_BACKEND_VAULT
+ *
+ * If this isn't provided, or if the value is empty, then all the secrets that the user has permission to see will be
+ * returned. Not all CEL constructs are currently supported for implementation reasons; see the filter documentation
+ * (docs/FILTER.md) for the full details.
+ *
+ * @generated from field: optional string filter = 3;
+ */
+ filter?: string | undefined;
+
+ /**
+ * Order criteria.
+ *
+ * The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the
+ * names of the attributes of the secret instead of the names of the columns of a table. For example, in order to
+ * sort the secrets descending by name the value should be:
+ *
+ * metadata.name desc
+ *
+ * If the parameter isn't provided, or if the value is empty, then the order of the results is undefined.
+ *
+ * @generated from field: optional string order = 4;
+ */
+ order?: string | undefined;
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsListRequest.
+ * Use `create(SecretsListRequestSchema)` to create a new message.
+ */
+export const SecretsListRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 0);
+
+/**
+ * @generated from message osac.private.v1.SecretsListResponse
+ */
+export type SecretsListResponse = Message<"osac.private.v1.SecretsListResponse"> & {
+ /**
+ * Actual number of items returned. Note that this may be smaller than the value requested in the `limit` parameter
+ * of the request if there are not enough items, or if the system decides that returning that number of items isn't
+ * feasible or convenient for performance reasons.
+ *
+ * @generated from field: int32 size = 1;
+ */
+ size: number;
+
+ /**
+ * Total number of items of the collection that match the search criteria, regardless of the number of results
+ * requested with the `limit` parameter.
+ *
+ * @generated from field: int32 total = 2;
+ */
+ total: number;
+
+ /**
+ * List of results.
+ *
+ * @generated from field: repeated osac.private.v1.Secret items = 3;
+ */
+ items: Secret[];
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsListResponse.
+ * Use `create(SecretsListResponseSchema)` to create a new message.
+ */
+export const SecretsListResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 1);
+
+/**
+ * @generated from message osac.private.v1.SecretsGetRequest
+ */
+export type SecretsGetRequest = Message<"osac.private.v1.SecretsGetRequest"> & {
+ /**
+ * @generated from field: string id = 1;
+ */
+ id: string;
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsGetRequest.
+ * Use `create(SecretsGetRequestSchema)` to create a new message.
+ */
+export const SecretsGetRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 2);
+
+/**
+ * @generated from message osac.private.v1.SecretsGetResponse
+ */
+export type SecretsGetResponse = Message<"osac.private.v1.SecretsGetResponse"> & {
+ /**
+ * @generated from field: osac.private.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsGetResponse.
+ * Use `create(SecretsGetResponseSchema)` to create a new message.
+ */
+export const SecretsGetResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 3);
+
+/**
+ * @generated from message osac.private.v1.SecretsCreateRequest
+ */
+export type SecretsCreateRequest = Message<"osac.private.v1.SecretsCreateRequest"> & {
+ /**
+ * @generated from field: osac.private.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsCreateRequest.
+ * Use `create(SecretsCreateRequestSchema)` to create a new message.
+ */
+export const SecretsCreateRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 4);
+
+/**
+ * @generated from message osac.private.v1.SecretsCreateResponse
+ */
+export type SecretsCreateResponse = Message<"osac.private.v1.SecretsCreateResponse"> & {
+ /**
+ * @generated from field: osac.private.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsCreateResponse.
+ * Use `create(SecretsCreateResponseSchema)` to create a new message.
+ */
+export const SecretsCreateResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 5);
+
+/**
+ * @generated from message osac.private.v1.SecretsUpdateRequest
+ */
+export type SecretsUpdateRequest = Message<"osac.private.v1.SecretsUpdateRequest"> & {
+ /**
+ * @generated from field: osac.private.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+
+ /**
+ * @generated from field: google.protobuf.FieldMask update_mask = 2;
+ */
+ updateMask?: FieldMask | undefined;
+
+ /**
+ * Lock enables optimistic locking. When set to true, the server verifies that the current version of the object
+ * matches the value of the metadata.version field of the submitted object. If they differ the update will be
+ * rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently.
+ *
+ * @generated from field: bool lock = 3;
+ */
+ lock: boolean;
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsUpdateRequest.
+ * Use `create(SecretsUpdateRequestSchema)` to create a new message.
+ */
+export const SecretsUpdateRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 6);
+
+/**
+ * @generated from message osac.private.v1.SecretsUpdateResponse
+ */
+export type SecretsUpdateResponse = Message<"osac.private.v1.SecretsUpdateResponse"> & {
+ /**
+ * @generated from field: osac.private.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsUpdateResponse.
+ * Use `create(SecretsUpdateResponseSchema)` to create a new message.
+ */
+export const SecretsUpdateResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 7);
+
+/**
+ * @generated from message osac.private.v1.SecretsDeleteRequest
+ */
+export type SecretsDeleteRequest = Message<"osac.private.v1.SecretsDeleteRequest"> & {
+ /**
+ * @generated from field: string id = 1;
+ */
+ id: string;
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsDeleteRequest.
+ * Use `create(SecretsDeleteRequestSchema)` to create a new message.
+ */
+export const SecretsDeleteRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 8);
+
+/**
+ * @generated from message osac.private.v1.SecretsDeleteResponse
+ */
+export type SecretsDeleteResponse = Message<"osac.private.v1.SecretsDeleteResponse"> & {
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsDeleteResponse.
+ * Use `create(SecretsDeleteResponseSchema)` to create a new message.
+ */
+export const SecretsDeleteResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 9);
+
+/**
+ * @generated from message osac.private.v1.SecretsSignalRequest
+ */
+export type SecretsSignalRequest = Message<"osac.private.v1.SecretsSignalRequest"> & {
+ /**
+ * @generated from field: string id = 1;
+ */
+ id: string;
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsSignalRequest.
+ * Use `create(SecretsSignalRequestSchema)` to create a new message.
+ */
+export const SecretsSignalRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 10);
+
+/**
+ * @generated from message osac.private.v1.SecretsSignalResponse
+ */
+export type SecretsSignalResponse = Message<"osac.private.v1.SecretsSignalResponse"> & {
+};
+
+/**
+ * Describes the message osac.private.v1.SecretsSignalResponse.
+ * Use `create(SecretsSignalResponseSchema)` to create a new message.
+ */
+export const SecretsSignalResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_private_v1_secrets_service, 11);
+
+/**
+ * Service for managing secrets through the private API.
+ *
+ * Provides full CRUD access to secrets, including backend and coordinates fields that are not exposed through the
+ * public API. Used by controllers and administrators for secret lifecycle management and synchronization with
+ * external storage backends.
+ *
+ * @generated from service osac.private.v1.Secrets
+ */
+export const Secrets: GenService<{
+ /**
+ * Retrieves the list of secrets.
+ *
+ * @generated from rpc osac.private.v1.Secrets.List
+ */
+ list: {
+ methodKind: "unary";
+ input: typeof SecretsListRequestSchema;
+ output: typeof SecretsListResponseSchema;
+ },
+ /**
+ * Retrieves the details of one specific secret.
+ *
+ * @generated from rpc osac.private.v1.Secrets.Get
+ */
+ get: {
+ methodKind: "unary";
+ input: typeof SecretsGetRequestSchema;
+ output: typeof SecretsGetResponseSchema;
+ },
+ /**
+ * Creates a new secret.
+ *
+ * @generated from rpc osac.private.v1.Secrets.Create
+ */
+ create: {
+ methodKind: "unary";
+ input: typeof SecretsCreateRequestSchema;
+ output: typeof SecretsCreateResponseSchema;
+ },
+ /**
+ * Updates an existing secret.
+ *
+ * @generated from rpc osac.private.v1.Secrets.Update
+ */
+ update: {
+ methodKind: "unary";
+ input: typeof SecretsUpdateRequestSchema;
+ output: typeof SecretsUpdateResponseSchema;
+ },
+ /**
+ * Deletes a secret.
+ *
+ * @generated from rpc osac.private.v1.Secrets.Delete
+ */
+ delete: {
+ methodKind: "unary";
+ input: typeof SecretsDeleteRequestSchema;
+ output: typeof SecretsDeleteResponseSchema;
+ },
+ /**
+ * Signals that the secret may need reconciliation with its storage backend.
+ *
+ * @generated from rpc osac.private.v1.Secrets.Signal
+ */
+ signal: {
+ methodKind: "unary";
+ input: typeof SecretsSignalRequestSchema;
+ output: typeof SecretsSignalResponseSchema;
+ },
+}> = /*@__PURE__*/
+ serviceDesc(file_osac_private_v1_secrets_service, 0);
+
diff --git a/libs/types/src/osac/public/v1/baremetal_instance_catalog_item_type_pb.ts b/libs/types/src/osac/public/v1/baremetal_instance_catalog_item_type_pb.ts
index 34fd50a9..88dbb749 100644
--- a/libs/types/src/osac/public/v1/baremetal_instance_catalog_item_type_pb.ts
+++ b/libs/types/src/osac/public/v1/baremetal_instance_catalog_item_type_pb.ts
@@ -33,6 +33,8 @@ export const file_osac_public_v1_baremetal_instance_catalog_item_type: GenFile =
* A bare metal instance catalog item defines a curated hardware offering that references an underlying bare metal
* instance template.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.public.v1.BareMetalInstanceCatalogItem
*/
export type BareMetalInstanceCatalogItem = Message<"osac.public.v1.BareMetalInstanceCatalogItem"> & {
diff --git a/libs/types/src/osac/public/v1/baremetal_instance_template_type_pb.ts b/libs/types/src/osac/public/v1/baremetal_instance_template_type_pb.ts
index a2c73b03..45cbb5e3 100644
--- a/libs/types/src/osac/public/v1/baremetal_instance_template_type_pb.ts
+++ b/libs/types/src/osac/public/v1/baremetal_instance_template_type_pb.ts
@@ -35,6 +35,8 @@ export const file_osac_public_v1_baremetal_instance_template_type: GenFile = /*@
* A bare metal instance template defines a hardware profile (host type, OS image, network configuration)
* that can be used to create bare metal instances via a catalog item.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.public.v1.BareMetalInstanceTemplate
*/
export type BareMetalInstanceTemplate = Message<"osac.public.v1.BareMetalInstanceTemplate"> & {
diff --git a/libs/types/src/osac/public/v1/cluster_catalog_item_type_pb.ts b/libs/types/src/osac/public/v1/cluster_catalog_item_type_pb.ts
index d9064289..5e753aca 100644
--- a/libs/types/src/osac/public/v1/cluster_catalog_item_type_pb.ts
+++ b/libs/types/src/osac/public/v1/cluster_catalog_item_type_pb.ts
@@ -33,6 +33,8 @@ export const file_osac_public_v1_cluster_catalog_item_type: GenFile = /*@__PURE_
* A cluster catalog item defines a curated infrastructure offering that references an underlying cluster template.
* Admins control which fields users can set, enforce defaults, and validate input via JSON Schema.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.public.v1.ClusterCatalogItem
*/
export type ClusterCatalogItem = Message<"osac.public.v1.ClusterCatalogItem"> & {
diff --git a/libs/types/src/osac/public/v1/cluster_template_type_pb.ts b/libs/types/src/osac/public/v1/cluster_template_type_pb.ts
index 4f5cf2d5..b70b7b01 100644
--- a/libs/types/src/osac/public/v1/cluster_template_type_pb.ts
+++ b/libs/types/src/osac/public/v1/cluster_template_type_pb.ts
@@ -35,6 +35,8 @@ export const file_osac_public_v1_cluster_template_type: GenFile = /*@__PURE__*/
* A cluster template defines a type of cluster that can be created by the user. Note that the user doesn't create these
* templates: the system provides a collection of them, and the user chooses one.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.public.v1.ClusterTemplate
*/
export type ClusterTemplate = Message<"osac.public.v1.ClusterTemplate"> & {
diff --git a/libs/types/src/osac/public/v1/cluster_type_pb.ts b/libs/types/src/osac/public/v1/cluster_type_pb.ts
index f2ec7add..96830175 100644
--- a/libs/types/src/osac/public/v1/cluster_type_pb.ts
+++ b/libs/types/src/osac/public/v1/cluster_type_pb.ts
@@ -31,7 +31,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/public/v1/cluster_type.proto.
*/
export const file_osac_public_v1_cluster_type: GenFile = /*@__PURE__*/
- fileDesc("CiFvc2FjL3B1YmxpYy92MS9jbHVzdGVyX3R5cGUucHJvdG8SDm9zYWMucHVibGljLnYxIpsBCgdDbHVzdGVyEgoKAmlkGAEgASgJEioKCG1ldGFkYXRhGAIgASgLMhgub3NhYy5wdWJsaWMudjEuTWV0YWRhdGESKQoEc3BlYxgDIAEoCzIbLm9zYWMucHVibGljLnYxLkNsdXN0ZXJTcGVjEi0KBnN0YXR1cxgEIAEoCzIdLm9zYWMucHVibGljLnYxLkNsdXN0ZXJTdGF0dXMi9wQKC0NsdXN0ZXJTcGVjEhAKCHRlbXBsYXRlGAEgASgJElAKE3RlbXBsYXRlX3BhcmFtZXRlcnMYAiADKAsyMy5vc2FjLnB1YmxpYy52MS5DbHVzdGVyU3BlYy5UZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRI8Cglub2RlX3NldHMYAyADKAsyKS5vc2FjLnB1YmxpYy52MS5DbHVzdGVyU3BlYy5Ob2RlU2V0c0VudHJ5EhgKC3B1bGxfc2VjcmV0GAQgASgJSACIAQESGwoOc3NoX3B1YmxpY19rZXkYBSABKAlIAYgBARIaCg1yZWxlYXNlX2ltYWdlGAYgASgJSAKIAQESNAoHbmV0d29yaxgHIAEoCzIeLm9zYWMucHVibGljLnYxLkNsdXN0ZXJOZXR3b3JrSAOIAQESFAoMY2F0YWxvZ19pdGVtGAggASgJEkQKEm5ldHdvcmtfYXR0YWNobWVudBgJIAEoCzIoLm9zYWMucHVibGljLnYxLkNsdXN0ZXJOZXR3b3JrQXR0YWNobWVudBpPChdUZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRILCgNrZXkYASABKAkSIwoFdmFsdWUYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55OgI4ARpPCg1Ob2RlU2V0c0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoCzIeLm9zYWMucHVibGljLnYxLkNsdXN0ZXJOb2RlU2V0OgI4AUIOCgxfcHVsbF9zZWNyZXRCEQoPX3NzaF9wdWJsaWNfa2V5QhAKDl9yZWxlYXNlX2ltYWdlQgoKCF9uZXR3b3JrImAKDkNsdXN0ZXJOZXR3b3JrEhUKCHBvZF9jaWRyGAEgASgJSACIAQESGQoMc2VydmljZV9jaWRyGAIgASgJSAGIAQFCCwoJX3BvZF9jaWRyQg8KDV9zZXJ2aWNlX2NpZHIi2QIKDUNsdXN0ZXJTdGF0dXMSKwoFc3RhdGUYASABKA4yHC5vc2FjLnB1YmxpYy52MS5DbHVzdGVyU3RhdGUSNAoKY29uZGl0aW9ucxgCIAMoCzIgLm9zYWMucHVibGljLnYxLkNsdXN0ZXJDb25kaXRpb24SDwoHYXBpX3VybBgDIAEoCRITCgtjb25zb2xlX3VybBgEIAEoCRI+Cglub2RlX3NldHMYBSADKAsyKy5vc2FjLnB1YmxpYy52MS5DbHVzdGVyU3RhdHVzLk5vZGVTZXRzRW50cnkSFAoMYXBpX2VuZHBvaW50GAYgASgJEhgKEGluZ3Jlc3NfZW5kcG9pbnQYByABKAkaTwoNTm9kZVNldHNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKAsyHi5vc2FjLnB1YmxpYy52MS5DbHVzdGVyTm9kZVNldDoCOAEi8wEKEENsdXN0ZXJDb25kaXRpb24SMgoEdHlwZRgBIAEoDjIkLm9zYWMucHVibGljLnYxLkNsdXN0ZXJDb25kaXRpb25UeXBlEi8KBnN0YXR1cxgCIAEoDjIfLm9zYWMucHVibGljLnYxLkNvbmRpdGlvblN0YXR1cxI4ChRsYXN0X3RyYW5zaXRpb25fdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEwoGcmVhc29uGAQgASgJSACIAQESFAoHbWVzc2FnZRgFIAEoCUgBiAEBQgkKB19yZWFzb25CCgoIX21lc3NhZ2UiQwoYQ2x1c3Rlck5ldHdvcmtBdHRhY2htZW50Eg4KBnN1Ym5ldBgBIAEoCRIXCg9zZWN1cml0eV9ncm91cHMYAiADKAkiMQoOQ2x1c3Rlck5vZGVTZXQSEQoJaG9zdF90eXBlGAEgASgJEgwKBHNpemUYAiABKAUqfwoMQ2x1c3RlclN0YXRlEh0KGUNMVVNURVJfU1RBVEVfVU5TUEVDSUZJRUQQABIdChlDTFVTVEVSX1NUQVRFX1BST0dSRVNTSU5HEAESFwoTQ0xVU1RFUl9TVEFURV9SRUFEWRACEhgKFENMVVNURVJfU1RBVEVfRkFJTEVEEAMq0AEKFENsdXN0ZXJDb25kaXRpb25UeXBlEiYKIkNMVVNURVJfQ09ORElUSU9OX1RZUEVfVU5TUEVDSUZJRUQQABImCiJDTFVTVEVSX0NPTkRJVElPTl9UWVBFX1BST0dSRVNTSU5HEAESIAocQ0xVU1RFUl9DT05ESVRJT05fVFlQRV9SRUFEWRACEiEKHUNMVVNURVJfQ09ORElUSU9OX1RZUEVfRkFJTEVEEAMSIwofQ0xVU1RFUl9DT05ESVRJT05fVFlQRV9ERUdSQURFRBAEYgZwcm90bzM", [file_google_protobuf_any, file_google_protobuf_timestamp, file_osac_public_v1_condition_status_type, file_osac_public_v1_metadata_type]);
+ fileDesc("CiFvc2FjL3B1YmxpYy92MS9jbHVzdGVyX3R5cGUucHJvdG8SDm9zYWMucHVibGljLnYxIpsBCgdDbHVzdGVyEgoKAmlkGAEgASgJEioKCG1ldGFkYXRhGAIgASgLMhgub3NhYy5wdWJsaWMudjEuTWV0YWRhdGESKQoEc3BlYxgDIAEoCzIbLm9zYWMucHVibGljLnYxLkNsdXN0ZXJTcGVjEi0KBnN0YXR1cxgEIAEoCzIdLm9zYWMucHVibGljLnYxLkNsdXN0ZXJTdGF0dXMi9wQKC0NsdXN0ZXJTcGVjEhAKCHRlbXBsYXRlGAEgASgJElAKE3RlbXBsYXRlX3BhcmFtZXRlcnMYAiADKAsyMy5vc2FjLnB1YmxpYy52MS5DbHVzdGVyU3BlYy5UZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRI8Cglub2RlX3NldHMYAyADKAsyKS5vc2FjLnB1YmxpYy52MS5DbHVzdGVyU3BlYy5Ob2RlU2V0c0VudHJ5EhgKC3B1bGxfc2VjcmV0GAQgASgJSACIAQESGwoOc3NoX3B1YmxpY19rZXkYBSABKAlIAYgBARIaCg1yZWxlYXNlX2ltYWdlGAYgASgJSAKIAQESNAoHbmV0d29yaxgHIAEoCzIeLm9zYWMucHVibGljLnYxLkNsdXN0ZXJOZXR3b3JrSAOIAQESFAoMY2F0YWxvZ19pdGVtGAggASgJEkQKEm5ldHdvcmtfYXR0YWNobWVudBgJIAEoCzIoLm9zYWMucHVibGljLnYxLkNsdXN0ZXJOZXR3b3JrQXR0YWNobWVudBpPChdUZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRILCgNrZXkYASABKAkSIwoFdmFsdWUYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55OgI4ARpPCg1Ob2RlU2V0c0VudHJ5EgsKA2tleRgBIAEoCRItCgV2YWx1ZRgCIAEoCzIeLm9zYWMucHVibGljLnYxLkNsdXN0ZXJOb2RlU2V0OgI4AUIOCgxfcHVsbF9zZWNyZXRCEQoPX3NzaF9wdWJsaWNfa2V5QhAKDl9yZWxlYXNlX2ltYWdlQgoKCF9uZXR3b3JrImAKDkNsdXN0ZXJOZXR3b3JrEhUKCHBvZF9jaWRyGAEgASgJSACIAQESGQoMc2VydmljZV9jaWRyGAIgASgJSAGIAQFCCwoJX3BvZF9jaWRyQg8KDV9zZXJ2aWNlX2NpZHIi2QIKDUNsdXN0ZXJTdGF0dXMSKwoFc3RhdGUYASABKA4yHC5vc2FjLnB1YmxpYy52MS5DbHVzdGVyU3RhdGUSNAoKY29uZGl0aW9ucxgCIAMoCzIgLm9zYWMucHVibGljLnYxLkNsdXN0ZXJDb25kaXRpb24SDwoHYXBpX3VybBgDIAEoCRITCgtjb25zb2xlX3VybBgEIAEoCRI+Cglub2RlX3NldHMYBSADKAsyKy5vc2FjLnB1YmxpYy52MS5DbHVzdGVyU3RhdHVzLk5vZGVTZXRzRW50cnkSFAoMYXBpX2VuZHBvaW50GAYgASgJEhgKEGluZ3Jlc3NfZW5kcG9pbnQYByABKAkaTwoNTm9kZVNldHNFbnRyeRILCgNrZXkYASABKAkSLQoFdmFsdWUYAiABKAsyHi5vc2FjLnB1YmxpYy52MS5DbHVzdGVyTm9kZVNldDoCOAEi8wEKEENsdXN0ZXJDb25kaXRpb24SMgoEdHlwZRgBIAEoDjIkLm9zYWMucHVibGljLnYxLkNsdXN0ZXJDb25kaXRpb25UeXBlEi8KBnN0YXR1cxgCIAEoDjIfLm9zYWMucHVibGljLnYxLkNvbmRpdGlvblN0YXR1cxI4ChRsYXN0X3RyYW5zaXRpb25fdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEwoGcmVhc29uGAQgASgJSACIAQESFAoHbWVzc2FnZRgFIAEoCUgBiAEBQgkKB19yZWFzb25CCgoIX21lc3NhZ2UiQwoYQ2x1c3Rlck5ldHdvcmtBdHRhY2htZW50Eg4KBnN1Ym5ldBgBIAEoCRIXCg9zZWN1cml0eV9ncm91cHMYAiADKAkiMQoOQ2x1c3Rlck5vZGVTZXQSEQoJaG9zdF90eXBlGAEgASgJEgwKBHNpemUYAiABKAUqvAEKDENsdXN0ZXJTdGF0ZRIdChlDTFVTVEVSX1NUQVRFX1VOU1BFQ0lGSUVEEAASHQoZQ0xVU1RFUl9TVEFURV9QUk9HUkVTU0lORxABEhcKE0NMVVNURVJfU1RBVEVfUkVBRFkQAhIYChRDTFVTVEVSX1NUQVRFX0ZBSUxFRBADEhoKFkNMVVNURVJfU1RBVEVfREVMRVRJTkcQBBIfChtDTFVTVEVSX1NUQVRFX0RFTEVURV9GQUlMRUQQBSrQAQoUQ2x1c3RlckNvbmRpdGlvblR5cGUSJgoiQ0xVU1RFUl9DT05ESVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEiYKIkNMVVNURVJfQ09ORElUSU9OX1RZUEVfUFJPR1JFU1NJTkcQARIgChxDTFVTVEVSX0NPTkRJVElPTl9UWVBFX1JFQURZEAISIQodQ0xVU1RFUl9DT05ESVRJT05fVFlQRV9GQUlMRUQQAxIjCh9DTFVTVEVSX0NPTkRJVElPTl9UWVBFX0RFR1JBREVEEARiBnByb3RvMw", [file_google_protobuf_any, file_google_protobuf_timestamp, file_osac_public_v1_condition_status_type, file_osac_public_v1_metadata_type]);
/**
* Contains the details of the cluster.
@@ -581,6 +581,25 @@ export enum ClusterState {
* @generated from enum value: CLUSTER_STATE_FAILED = 3;
*/
FAILED = 3,
+
+ /**
+ * The cluster is being deprovisioned.
+ *
+ * The cluster will be archived once deletion completes successfully.
+ *
+ * @generated from enum value: CLUSTER_STATE_DELETING = 4;
+ */
+ DELETING = 4,
+
+ /**
+ * The cluster deletion has failed.
+ *
+ * The deprovision operation encountered an error and could not complete.
+ * The status conditions will contain specific error details.
+ *
+ * @generated from enum value: CLUSTER_STATE_DELETE_FAILED = 5;
+ */
+ DELETE_FAILED = 5,
}
/**
diff --git a/libs/types/src/osac/public/v1/cluster_version_type_pb.ts b/libs/types/src/osac/public/v1/cluster_version_type_pb.ts
index 8045b5e9..d8d58956 100644
--- a/libs/types/src/osac/public/v1/cluster_version_type_pb.ts
+++ b/libs/types/src/osac/public/v1/cluster_version_type_pb.ts
@@ -17,6 +17,7 @@
import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
import { file_google_api_field_behavior } from "../../../google/api/field_behavior_pb";
import type { Timestamp } from "../../../google/protobuf/timestamp_pb";
import { file_google_protobuf_timestamp } from "../../../google/protobuf/timestamp_pb";
@@ -28,14 +29,14 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/public/v1/cluster_version_type.proto.
*/
export const file_osac_public_v1_cluster_version_type: GenFile = /*@__PURE__*/
- fileDesc("Cilvc2FjL3B1YmxpYy92MS9jbHVzdGVyX3ZlcnNpb25fdHlwZS5wcm90bxIOb3NhYy5wdWJsaWMudjEinAEKGUNsdXN0ZXJWZXJzaW9uRGVwcmVjYXRpb24SPgoVZGVwcmVjYXRpb25fdGltZXN0YW1wGAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEj8KFm9ic29sZXNjZW5jZV90aW1lc3RhbXAYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMiNgodQ2x1c3RlclZlcnNpb25BbGxvd2VkVXBncmFkZXMSFQoNdmVyc2lvbl9uYW1lcxgBIAMoCSKwAQoOQ2x1c3RlclZlcnNpb24SCgoCaWQYASABKAkSKgoIbWV0YWRhdGEYAiABKAsyGC5vc2FjLnB1YmxpYy52MS5NZXRhZGF0YRIwCgRzcGVjGAMgASgLMiIub3NhYy5wdWJsaWMudjEuQ2x1c3RlclZlcnNpb25TcGVjEjQKBnN0YXR1cxgEIAEoCzIkLm9zYWMucHVibGljLnYxLkNsdXN0ZXJWZXJzaW9uU3RhdHVzIs0CChJDbHVzdGVyVmVyc2lvblNwZWMSGQoHZW5hYmxlZBgCIAEoCEID4EEBSACIAQESHAoKaXNfZGVmYXVsdBgDIAEoCEID4EEBSAGIAQESNwoFc3RhdGUYBCABKA4yIy5vc2FjLnB1YmxpYy52MS5DbHVzdGVyVmVyc2lvblN0YXRlQgPgQQESQwoLZGVwcmVjYXRpb24YBSABKAsyKS5vc2FjLnB1YmxpYy52MS5DbHVzdGVyVmVyc2lvbkRlcHJlY2F0aW9uQgPgQQESFwoHdmVyc2lvbhgGIAEoCUIG4EEC4EEFEkwKEGFsbG93ZWRfdXBncmFkZXMYByABKAsyLS5vc2FjLnB1YmxpYy52MS5DbHVzdGVyVmVyc2lvbkFsbG93ZWRVcGdyYWRlc0ID4EEBQgoKCF9lbmFibGVkQg0KC19pc19kZWZhdWx0IhYKFENsdXN0ZXJWZXJzaW9uU3RhdHVzKqgBChNDbHVzdGVyVmVyc2lvblN0YXRlEiUKIUNMVVNURVJfVkVSU0lPTl9TVEFURV9VTlNQRUNJRklFRBAAEiAKHENMVVNURVJfVkVSU0lPTl9TVEFURV9BQ1RJVkUQARIkCiBDTFVTVEVSX1ZFUlNJT05fU1RBVEVfREVQUkVDQVRFRBACEiIKHkNMVVNURVJfVkVSU0lPTl9TVEFURV9PQlNPTEVURRADYgZwcm90bzM", [file_google_api_field_behavior, file_google_protobuf_timestamp, file_osac_public_v1_metadata_type]);
+ fileDesc("Cilvc2FjL3B1YmxpYy92MS9jbHVzdGVyX3ZlcnNpb25fdHlwZS5wcm90bxIOb3NhYy5wdWJsaWMudjEinAEKGUNsdXN0ZXJWZXJzaW9uRGVwcmVjYXRpb24SPgoVZGVwcmVjYXRpb25fdGltZXN0YW1wGAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEID4EEDEj8KFm9ic29sZXNjZW5jZV90aW1lc3RhbXAYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQgPgQQMiSwodQ2x1c3RlclZlcnNpb25BbGxvd2VkVXBncmFkZXMSKgoNdmVyc2lvbl9uYW1lcxgBIAMoCUITukgQkgENEOgHGAEiBnIEEAEYPyKwAQoOQ2x1c3RlclZlcnNpb24SCgoCaWQYASABKAkSKgoIbWV0YWRhdGEYAiABKAsyGC5vc2FjLnB1YmxpYy52MS5NZXRhZGF0YRIwCgRzcGVjGAMgASgLMiIub3NhYy5wdWJsaWMudjEuQ2x1c3RlclZlcnNpb25TcGVjEjQKBnN0YXR1cxgEIAEoCzIkLm9zYWMucHVibGljLnYxLkNsdXN0ZXJWZXJzaW9uU3RhdHVzIs0CChJDbHVzdGVyVmVyc2lvblNwZWMSGQoHZW5hYmxlZBgCIAEoCEID4EEBSACIAQESHAoKaXNfZGVmYXVsdBgDIAEoCEID4EEBSAGIAQESNwoFc3RhdGUYBCABKA4yIy5vc2FjLnB1YmxpYy52MS5DbHVzdGVyVmVyc2lvblN0YXRlQgPgQQESQwoLZGVwcmVjYXRpb24YBSABKAsyKS5vc2FjLnB1YmxpYy52MS5DbHVzdGVyVmVyc2lvbkRlcHJlY2F0aW9uQgPgQQESFwoHdmVyc2lvbhgGIAEoCUIG4EEC4EEFEkwKEGFsbG93ZWRfdXBncmFkZXMYByABKAsyLS5vc2FjLnB1YmxpYy52MS5DbHVzdGVyVmVyc2lvbkFsbG93ZWRVcGdyYWRlc0ID4EEBQgoKCF9lbmFibGVkQg0KC19pc19kZWZhdWx0IhYKFENsdXN0ZXJWZXJzaW9uU3RhdHVzKqgBChNDbHVzdGVyVmVyc2lvblN0YXRlEiUKIUNMVVNURVJfVkVSU0lPTl9TVEFURV9VTlNQRUNJRklFRBAAEiAKHENMVVNURVJfVkVSU0lPTl9TVEFURV9BQ1RJVkUQARIkCiBDTFVTVEVSX1ZFUlNJT05fU1RBVEVfREVQUkVDQVRFRBACEiIKHkNMVVNURVJfVkVSU0lPTl9TVEFURV9PQlNPTEVURRADYgZwcm90bzM", [file_buf_validate_validate, file_google_api_field_behavior, file_google_protobuf_timestamp, file_osac_public_v1_metadata_type]);
/**
* Contains deprecation details for a cluster version.
*
* The timestamps are managed by the server during lifecycle state transitions. The deprecation_timestamp is set when
- * the version transitions to DEPRECATED, and the obsolescence_timestamp is set when it transitions to OBSOLETE. Both
- * are cleared if the version returns to ACTIVE.
+ * the version transitions to DEPRECATED, and the obsolescence_timestamp is set when it transitions to OBSOLETE.
+ * Timestamps are retained as historical record when the version returns to ACTIVE.
*
* @generated from message osac.public.v1.ClusterVersionDeprecation
*/
@@ -76,6 +77,7 @@ export type ClusterVersionAllowedUpgrades = Message<"osac.public.v1.ClusterVersi
/**
* ClusterVersion names (metadata.name). Must reference existing, non-deleted ClusterVersions. When a target
* version is deleted, it is automatically removed from all lists.
+ * No duplicate or empty entries are allowed.
*
* @generated from field: repeated string version_names = 1;
*/
@@ -257,7 +259,7 @@ export enum ClusterVersionState {
* The cluster version is fully available for new cluster creation.
*
* This is the default state assigned on creation. Returning to ACTIVE from DEPRECATED or OBSOLETE
- * clears the corresponding deprecation timestamps.
+ * retains the corresponding deprecation timestamps as historical record.
*
* @generated from enum value: CLUSTER_VERSION_STATE_ACTIVE = 1;
*/
diff --git a/libs/types/src/osac/public/v1/compute_instance_catalog_item_type_pb.ts b/libs/types/src/osac/public/v1/compute_instance_catalog_item_type_pb.ts
index 9f5d9c87..68c91c7a 100644
--- a/libs/types/src/osac/public/v1/compute_instance_catalog_item_type_pb.ts
+++ b/libs/types/src/osac/public/v1/compute_instance_catalog_item_type_pb.ts
@@ -33,6 +33,8 @@ export const file_osac_public_v1_compute_instance_catalog_item_type: GenFile = /
* A compute instance catalog item defines a curated infrastructure offering that references an underlying compute
* instance template.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.public.v1.ComputeInstanceCatalogItem
*/
export type ComputeInstanceCatalogItem = Message<"osac.public.v1.ComputeInstanceCatalogItem"> & {
diff --git a/libs/types/src/osac/public/v1/compute_instance_template_type_pb.ts b/libs/types/src/osac/public/v1/compute_instance_template_type_pb.ts
index bec6820f..fe6c61e7 100644
--- a/libs/types/src/osac/public/v1/compute_instance_template_type_pb.ts
+++ b/libs/types/src/osac/public/v1/compute_instance_template_type_pb.ts
@@ -35,6 +35,8 @@ export const file_osac_public_v1_compute_instance_template_type: GenFile = /*@__
* A compute instance template defines a type of compute instance that can be created by the user. Note that the user doesn't create these
* templates: the system provides a collection of them, and the user chooses one.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.public.v1.ComputeInstanceTemplate
*/
export type ComputeInstanceTemplate = Message<"osac.public.v1.ComputeInstanceTemplate"> & {
diff --git a/libs/types/src/osac/public/v1/compute_instance_type_pb.ts b/libs/types/src/osac/public/v1/compute_instance_type_pb.ts
index 3c3eaf1f..9409181d 100644
--- a/libs/types/src/osac/public/v1/compute_instance_type_pb.ts
+++ b/libs/types/src/osac/public/v1/compute_instance_type_pb.ts
@@ -31,7 +31,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/public/v1/compute_instance_type.proto.
*/
export const file_osac_public_v1_compute_instance_type: GenFile = /*@__PURE__*/
- fileDesc("Cipvc2FjL3B1YmxpYy92MS9jb21wdXRlX2luc3RhbmNlX3R5cGUucHJvdG8SDm9zYWMucHVibGljLnYxIrMBCg9Db21wdXRlSW5zdGFuY2USCgoCaWQYASABKAkSKgoIbWV0YWRhdGEYAiABKAsyGC5vc2FjLnB1YmxpYy52MS5NZXRhZGF0YRIxCgRzcGVjGAMgASgLMiMub3NhYy5wdWJsaWMudjEuQ29tcHV0ZUluc3RhbmNlU3BlYxI1CgZzdGF0dXMYBCABKAsyJS5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VTdGF0dXMiPwoUQ29tcHV0ZUluc3RhbmNlSW1hZ2USEwoLc291cmNlX3R5cGUYASABKAkSEgoKc291cmNlX3JlZhgCIAEoCSInChNDb21wdXRlSW5zdGFuY2VEaXNrEhAKCHNpemVfZ2liGAEgASgFIjwKEU5ldHdvcmtBdHRhY2htZW50Eg4KBnN1Ym5ldBgBIAEoCRIXCg9zZWN1cml0eV9ncm91cHMYAiADKAki3AYKE0NvbXB1dGVJbnN0YW5jZVNwZWMSEAoIdGVtcGxhdGUYASABKAkSWAoTdGVtcGxhdGVfcGFyYW1ldGVycxgCIAMoCzI7Lm9zYWMucHVibGljLnYxLkNvbXB1dGVJbnN0YW5jZVNwZWMuVGVtcGxhdGVQYXJhbWV0ZXJzRW50cnkSPQoUcmVzdGFydF9yZXF1ZXN0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSACIAQESOAoFaW1hZ2UYBCABKAsyJC5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VJbWFnZUgBiAEBEhQKB3NzaF9rZXkYByABKAlIAogBARI7Cglib290X2Rpc2sYCCABKAsyIy5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VEaXNrSAOIAQESPQoQYWRkaXRpb25hbF9kaXNrcxgJIAMoCzIjLm9zYWMucHVibGljLnYxLkNvbXB1dGVJbnN0YW5jZURpc2sSGQoMcnVuX3N0cmF0ZWd5GAogASgJSASIAQESFgoJdXNlcl9kYXRhGAsgASgJSAWIAQESPgoTbmV0d29ya19hdHRhY2htZW50cxgOIAMoCzIhLm9zYWMucHVibGljLnYxLk5ldHdvcmtBdHRhY2htZW50EhQKDGNhdGFsb2dfaXRlbRgPIAEoCRIXCgppc193aW5kb3dzGBAgASgISAaIAQESGgoNaW5zdGFuY2VfdHlwZRgRIAEoCUgHiAEBGk8KF1RlbXBsYXRlUGFyYW1ldGVyc0VudHJ5EgsKA2tleRgBIAEoCRIjCgV2YWx1ZRgCIAEoCzIULmdvb2dsZS5wcm90b2J1Zi5Bbnk6AjgBQhcKFV9yZXN0YXJ0X3JlcXVlc3RlZF9hdEIICgZfaW1hZ2VCCgoIX3NzaF9rZXlCDAoKX2Jvb3RfZGlza0IPCg1fcnVuX3N0cmF0ZWd5QgwKCl91c2VyX2RhdGFCDQoLX2lzX3dpbmRvd3NCEAoOX2luc3RhbmNlX3R5cGVKBAgFEAZKBAgGEAdKBAgMEA1KBAgNEA5SBWNvcmVzUgptZW1vcnlfZ2liUgZzdWJuZXRSD3NlY3VyaXR5X2dyb3VwcyKUAgoVQ29tcHV0ZUluc3RhbmNlU3RhdHVzEjMKBXN0YXRlGAEgASgOMiQub3NhYy5wdWJsaWMudjEuQ29tcHV0ZUluc3RhbmNlU3RhdGUSPAoKY29uZGl0aW9ucxgCIAMoCzIoLm9zYWMucHVibGljLnYxLkNvbXB1dGVJbnN0YW5jZUNvbmRpdGlvbhIbChNpbnRlcm5hbF9pcF9hZGRyZXNzGAMgASgJEjoKEWxhc3RfcmVzdGFydGVkX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcEgAiAEBEhkKEXB1YmxpY19pcF9hZGRyZXNzGAUgASgJQhQKEl9sYXN0X3Jlc3RhcnRlZF9hdCKDAgoYQ29tcHV0ZUluc3RhbmNlQ29uZGl0aW9uEjoKBHR5cGUYASABKA4yLC5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VDb25kaXRpb25UeXBlEi8KBnN0YXR1cxgCIAEoDjIfLm9zYWMucHVibGljLnYxLkNvbmRpdGlvblN0YXR1cxI4ChRsYXN0X3RyYW5zaXRpb25fdGltZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEwoGcmVhc29uGAQgASgJSACIAQESFAoHbWVzc2FnZRgFIAEoCUgBiAEBQgkKB19yZWFzb25CCgoIX21lc3NhZ2UquwIKFENvbXB1dGVJbnN0YW5jZVN0YXRlEiYKIkNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfVU5TUEVDSUZJRUQQABIjCh9DT01QVVRFX0lOU1RBTkNFX1NUQVRFX1NUQVJUSU5HEAESIgoeQ09NUFVURV9JTlNUQU5DRV9TVEFURV9SVU5OSU5HEAISIQodQ09NUFVURV9JTlNUQU5DRV9TVEFURV9GQUlMRUQQAxIjCh9DT01QVVRFX0lOU1RBTkNFX1NUQVRFX0RFTEVUSU5HEAQSIwofQ09NUFVURV9JTlNUQU5DRV9TVEFURV9TVE9QUElORxAFEiIKHkNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfU1RPUFBFRBAGEiEKHUNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfUEFVU0VEEAcqiQMKHENvbXB1dGVJbnN0YW5jZUNvbmRpdGlvblR5cGUSLworQ09NUFVURV9JTlNUQU5DRV9DT05ESVRJT05fVFlQRV9VTlNQRUNJRklFRBAAEjkKNUNPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfQ09ORklHVVJBVElPTl9BUFBMSUVEEAESKQolQ09NUFVURV9JTlNUQU5DRV9DT05ESVRJT05fVFlQRV9SRUFEWRACEjcKM0NPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfUkVTVEFSVF9JTl9QUk9HUkVTUxADEjIKLkNPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfUkVTVEFSVF9GQUlMRUQQBBIvCitDT01QVVRFX0lOU1RBTkNFX0NPTkRJVElPTl9UWVBFX1BST1ZJU0lPTkVEEAUSNAowQ09NUFVURV9JTlNUQU5DRV9DT05ESVRJT05fVFlQRV9SRVNUQVJUX1JFUVVJUkVEEAZiBnByb3RvMw", [file_google_protobuf_any, file_google_protobuf_timestamp, file_osac_public_v1_condition_status_type, file_osac_public_v1_metadata_type]);
+ fileDesc("Cipvc2FjL3B1YmxpYy92MS9jb21wdXRlX2luc3RhbmNlX3R5cGUucHJvdG8SDm9zYWMucHVibGljLnYxIrMBCg9Db21wdXRlSW5zdGFuY2USCgoCaWQYASABKAkSKgoIbWV0YWRhdGEYAiABKAsyGC5vc2FjLnB1YmxpYy52MS5NZXRhZGF0YRIxCgRzcGVjGAMgASgLMiMub3NhYy5wdWJsaWMudjEuQ29tcHV0ZUluc3RhbmNlU3BlYxI1CgZzdGF0dXMYBCABKAsyJS5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VTdGF0dXMiPwoUQ29tcHV0ZUluc3RhbmNlSW1hZ2USEwoLc291cmNlX3R5cGUYASABKAkSEgoKc291cmNlX3JlZhgCIAEoCSInChNDb21wdXRlSW5zdGFuY2VEaXNrEhAKCHNpemVfZ2liGAEgASgFIjwKEU5ldHdvcmtBdHRhY2htZW50Eg4KBnN1Ym5ldBgBIAEoCRIXCg9zZWN1cml0eV9ncm91cHMYAiADKAki6gYKE0NvbXB1dGVJbnN0YW5jZVNwZWMSEAoIdGVtcGxhdGUYASABKAkSWAoTdGVtcGxhdGVfcGFyYW1ldGVycxgCIAMoCzI7Lm9zYWMucHVibGljLnYxLkNvbXB1dGVJbnN0YW5jZVNwZWMuVGVtcGxhdGVQYXJhbWV0ZXJzRW50cnkSPQoUcmVzdGFydF9yZXF1ZXN0ZWRfYXQYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSACIAQESOAoFaW1hZ2UYBCABKAsyJC5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VJbWFnZUgBiAEBEhsKDnNzaF9wdWJsaWNfa2V5GAcgASgJSAKIAQESOwoJYm9vdF9kaXNrGAggASgLMiMub3NhYy5wdWJsaWMudjEuQ29tcHV0ZUluc3RhbmNlRGlza0gDiAEBEj0KEGFkZGl0aW9uYWxfZGlza3MYCSADKAsyIy5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VEaXNrEhkKDHJ1bl9zdHJhdGVneRgKIAEoCUgEiAEBEhYKCXVzZXJfZGF0YRgLIAEoCUgFiAEBEj4KE25ldHdvcmtfYXR0YWNobWVudHMYDiADKAsyIS5vc2FjLnB1YmxpYy52MS5OZXR3b3JrQXR0YWNobWVudBIUCgxjYXRhbG9nX2l0ZW0YDyABKAkSFwoKaXNfd2luZG93cxgQIAEoCEgGiAEBEhoKDWluc3RhbmNlX3R5cGUYESABKAlIB4gBARpPChdUZW1wbGF0ZVBhcmFtZXRlcnNFbnRyeRILCgNrZXkYASABKAkSIwoFdmFsdWUYAiABKAsyFC5nb29nbGUucHJvdG9idWYuQW55OgI4AUIXChVfcmVzdGFydF9yZXF1ZXN0ZWRfYXRCCAoGX2ltYWdlQhEKD19zc2hfcHVibGljX2tleUIMCgpfYm9vdF9kaXNrQg8KDV9ydW5fc3RyYXRlZ3lCDAoKX3VzZXJfZGF0YUINCgtfaXNfd2luZG93c0IQCg5faW5zdGFuY2VfdHlwZUoECAUQBkoECAYQB0oECAwQDUoECA0QDlIFY29yZXNSCm1lbW9yeV9naWJSBnN1Ym5ldFIPc2VjdXJpdHlfZ3JvdXBzIpYCChVDb21wdXRlSW5zdGFuY2VTdGF0dXMSMwoFc3RhdGUYASABKA4yJC5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VTdGF0ZRI8Cgpjb25kaXRpb25zGAIgAygLMigub3NhYy5wdWJsaWMudjEuQ29tcHV0ZUluc3RhbmNlQ29uZGl0aW9uEhsKE2ludGVybmFsX2lwX2FkZHJlc3MYAyABKAkSOgoRbGFzdF9yZXN0YXJ0ZWRfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wSACIAQESGwoTZXh0ZXJuYWxfaXBfYWRkcmVzcxgFIAEoCUIUChJfbGFzdF9yZXN0YXJ0ZWRfYXQigwIKGENvbXB1dGVJbnN0YW5jZUNvbmRpdGlvbhI6CgR0eXBlGAEgASgOMiwub3NhYy5wdWJsaWMudjEuQ29tcHV0ZUluc3RhbmNlQ29uZGl0aW9uVHlwZRIvCgZzdGF0dXMYAiABKA4yHy5vc2FjLnB1YmxpYy52MS5Db25kaXRpb25TdGF0dXMSOAoUbGFzdF90cmFuc2l0aW9uX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhMKBnJlYXNvbhgEIAEoCUgAiAEBEhQKB21lc3NhZ2UYBSABKAlIAYgBAUIJCgdfcmVhc29uQgoKCF9tZXNzYWdlKrsCChRDb21wdXRlSW5zdGFuY2VTdGF0ZRImCiJDT01QVVRFX0lOU1RBTkNFX1NUQVRFX1VOU1BFQ0lGSUVEEAASIwofQ09NUFVURV9JTlNUQU5DRV9TVEFURV9TVEFSVElORxABEiIKHkNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfUlVOTklORxACEiEKHUNPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfRkFJTEVEEAMSIwofQ09NUFVURV9JTlNUQU5DRV9TVEFURV9ERUxFVElORxAEEiMKH0NPTVBVVEVfSU5TVEFOQ0VfU1RBVEVfU1RPUFBJTkcQBRIiCh5DT01QVVRFX0lOU1RBTkNFX1NUQVRFX1NUT1BQRUQQBhIhCh1DT01QVVRFX0lOU1RBTkNFX1NUQVRFX1BBVVNFRBAHKokDChxDb21wdXRlSW5zdGFuY2VDb25kaXRpb25UeXBlEi8KK0NPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfVU5TUEVDSUZJRUQQABI5CjVDT01QVVRFX0lOU1RBTkNFX0NPTkRJVElPTl9UWVBFX0NPTkZJR1VSQVRJT05fQVBQTElFRBABEikKJUNPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfUkVBRFkQAhI3CjNDT01QVVRFX0lOU1RBTkNFX0NPTkRJVElPTl9UWVBFX1JFU1RBUlRfSU5fUFJPR1JFU1MQAxIyCi5DT01QVVRFX0lOU1RBTkNFX0NPTkRJVElPTl9UWVBFX1JFU1RBUlRfRkFJTEVEEAQSLworQ09NUFVURV9JTlNUQU5DRV9DT05ESVRJT05fVFlQRV9QUk9WSVNJT05FRBAFEjQKMENPTVBVVEVfSU5TVEFOQ0VfQ09ORElUSU9OX1RZUEVfUkVTVEFSVF9SRVFVSVJFRBAGYgZwcm90bzM", [file_google_protobuf_any, file_google_protobuf_timestamp, file_osac_public_v1_condition_status_type, file_osac_public_v1_metadata_type]);
/**
* Contains the details of the compute instance.
@@ -246,9 +246,9 @@ export type ComputeInstanceSpec = Message<"osac.public.v1.ComputeInstanceSpec">
/**
* SSH public key.
*
- * @generated from field: optional string ssh_key = 7;
+ * @generated from field: optional string ssh_public_key = 7;
*/
- sshKey?: string | undefined;
+ sshPublicKey?: string | undefined;
/**
* Boot disk configuration.
@@ -423,11 +423,11 @@ export type ComputeInstanceStatus = Message<"osac.public.v1.ComputeInstanceStatu
lastRestartedAt?: Timestamp | undefined;
/**
- * Public IP address attached to the compute instance.
+ * External IP address attached to the compute instance.
*
- * @generated from field: string public_ip_address = 5;
+ * @generated from field: string external_ip_address = 5;
*/
- publicIpAddress: string;
+ externalIpAddress: string;
};
/**
diff --git a/libs/types/src/osac/public/v1/event_type_pb.ts b/libs/types/src/osac/public/v1/event_type_pb.ts
index da56cf60..eeff8a14 100644
--- a/libs/types/src/osac/public/v1/event_type_pb.ts
+++ b/libs/types/src/osac/public/v1/event_type_pb.ts
@@ -17,6 +17,8 @@
import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
import { enumDesc, fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
+import type { BareMetalInstance } from "./baremetal_instance_type_pb";
+import { file_osac_public_v1_baremetal_instance_type } from "./baremetal_instance_type_pb";
import type { ClusterTemplate } from "./cluster_template_type_pb";
import { file_osac_public_v1_cluster_template_type } from "./cluster_template_type_pb";
import type { Cluster } from "./cluster_type_pb";
@@ -35,6 +37,8 @@ import type { RoleBinding } from "./role_binding_type_pb";
import { file_osac_public_v1_role_binding_type } from "./role_binding_type_pb";
import type { Project } from "./project_type_pb";
import { file_osac_public_v1_project_type } from "./project_type_pb";
+import type { Secret } from "./secret_type_pb";
+import { file_osac_public_v1_secret_type } from "./secret_type_pb";
import type { Role } from "./role_type_pb";
import { file_osac_public_v1_role_type } from "./role_type_pb";
import type { Tenant } from "./tenant_type_pb";
@@ -45,7 +49,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/public/v1/event_type.proto.
*/
export const file_osac_public_v1_event_type: GenFile = /*@__PURE__*/
- fileDesc("Ch9vc2FjL3B1YmxpYy92MS9ldmVudF90eXBlLnByb3RvEg5vc2FjLnB1YmxpYy52MSKNBQoFRXZlbnQSCgoCaWQYASABKAkSJwoEdHlwZRgCIAEoDjIZLm9zYWMucHVibGljLnYxLkV2ZW50VHlwZRIqCgdjbHVzdGVyGAMgASgLMhcub3NhYy5wdWJsaWMudjEuQ2x1c3RlckgAEjsKEGNsdXN0ZXJfdGVtcGxhdGUYBCABKAsyHy5vc2FjLnB1YmxpYy52MS5DbHVzdGVyVGVtcGxhdGVIABItCglob3N0X3R5cGUYBSABKAsyGC5vc2FjLnB1YmxpYy52MS5Ib3N0VHlwZUgAEkwKGWNvbXB1dGVfaW5zdGFuY2VfdGVtcGxhdGUYByABKAsyJy5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VUZW1wbGF0ZUgAEjsKEGNvbXB1dGVfaW5zdGFuY2UYCCABKAsyHy5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VIABIkCgRyb2xlGAkgASgLMhQub3NhYy5wdWJsaWMudjEuUm9sZUgAEjMKDHJvbGVfYmluZGluZxgKIAEoCzIbLm9zYWMucHVibGljLnYxLlJvbGVCaW5kaW5nSAASKgoHcHJvamVjdBgLIAEoCzIXLm9zYWMucHVibGljLnYxLlByb2plY3RIABI1Cg1pbnN0YW5jZV90eXBlGAwgASgLMhwub3NhYy5wdWJsaWMudjEuSW5zdGFuY2VUeXBlSAASKAoGdGVuYW50GA0gASgLMhYub3NhYy5wdWJsaWMudjEuVGVuYW50SAASOQoPY2x1c3Rlcl92ZXJzaW9uGA4gASgLMh4ub3NhYy5wdWJsaWMudjEuQ2x1c3RlclZlcnNpb25IAEIJCgdwYXlsb2FkKoQBCglFdmVudFR5cGUSGgoWRVZFTlRfVFlQRV9VTlNQRUNJRklFRBAAEh0KGUVWRU5UX1RZUEVfT0JKRUNUX0NSRUFURUQQARIdChlFVkVOVF9UWVBFX09CSkVDVF9VUERBVEVEEAISHQoZRVZFTlRfVFlQRV9PQkpFQ1RfREVMRVRFRBADYgZwcm90bzM", [file_osac_public_v1_cluster_template_type, file_osac_public_v1_cluster_type, file_osac_public_v1_cluster_version_type, file_osac_public_v1_compute_instance_template_type, file_osac_public_v1_compute_instance_type, file_osac_public_v1_host_type_type, file_osac_public_v1_instance_type_type, file_osac_public_v1_role_binding_type, file_osac_public_v1_project_type, file_osac_public_v1_role_type, file_osac_public_v1_tenant_type]);
+ fileDesc("Ch9vc2FjL3B1YmxpYy92MS9ldmVudF90eXBlLnByb3RvEg5vc2FjLnB1YmxpYy52MSL5BQoFRXZlbnQSCgoCaWQYASABKAkSJwoEdHlwZRgCIAEoDjIZLm9zYWMucHVibGljLnYxLkV2ZW50VHlwZRIqCgdjbHVzdGVyGAMgASgLMhcub3NhYy5wdWJsaWMudjEuQ2x1c3RlckgAEjsKEGNsdXN0ZXJfdGVtcGxhdGUYBCABKAsyHy5vc2FjLnB1YmxpYy52MS5DbHVzdGVyVGVtcGxhdGVIABItCglob3N0X3R5cGUYBSABKAsyGC5vc2FjLnB1YmxpYy52MS5Ib3N0VHlwZUgAEkwKGWNvbXB1dGVfaW5zdGFuY2VfdGVtcGxhdGUYByABKAsyJy5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VUZW1wbGF0ZUgAEjsKEGNvbXB1dGVfaW5zdGFuY2UYCCABKAsyHy5vc2FjLnB1YmxpYy52MS5Db21wdXRlSW5zdGFuY2VIABIkCgRyb2xlGAkgASgLMhQub3NhYy5wdWJsaWMudjEuUm9sZUgAEjMKDHJvbGVfYmluZGluZxgKIAEoCzIbLm9zYWMucHVibGljLnYxLlJvbGVCaW5kaW5nSAASKgoHcHJvamVjdBgLIAEoCzIXLm9zYWMucHVibGljLnYxLlByb2plY3RIABI1Cg1pbnN0YW5jZV90eXBlGAwgASgLMhwub3NhYy5wdWJsaWMudjEuSW5zdGFuY2VUeXBlSAASKAoGdGVuYW50GA0gASgLMhYub3NhYy5wdWJsaWMudjEuVGVuYW50SAASOQoPY2x1c3Rlcl92ZXJzaW9uGA4gASgLMh4ub3NhYy5wdWJsaWMudjEuQ2x1c3RlclZlcnNpb25IABJAChNiYXJlX21ldGFsX2luc3RhbmNlGA8gASgLMiEub3NhYy5wdWJsaWMudjEuQmFyZU1ldGFsSW5zdGFuY2VIABIoCgZzZWNyZXQYECABKAsyFi5vc2FjLnB1YmxpYy52MS5TZWNyZXRIAEIJCgdwYXlsb2FkKoQBCglFdmVudFR5cGUSGgoWRVZFTlRfVFlQRV9VTlNQRUNJRklFRBAAEh0KGUVWRU5UX1RZUEVfT0JKRUNUX0NSRUFURUQQARIdChlFVkVOVF9UWVBFX09CSkVDVF9VUERBVEVEEAISHQoZRVZFTlRfVFlQRV9PQkpFQ1RfREVMRVRFRBADYgZwcm90bzM", [file_osac_public_v1_baremetal_instance_type, file_osac_public_v1_cluster_template_type, file_osac_public_v1_cluster_type, file_osac_public_v1_cluster_version_type, file_osac_public_v1_compute_instance_template_type, file_osac_public_v1_compute_instance_type, file_osac_public_v1_host_type_type, file_osac_public_v1_instance_type_type, file_osac_public_v1_role_binding_type, file_osac_public_v1_project_type, file_osac_public_v1_secret_type, file_osac_public_v1_role_type, file_osac_public_v1_tenant_type]);
/**
* Represents events delivered by the server.
@@ -138,6 +142,18 @@ export type Event = Message<"osac.public.v1.Event"> & {
*/
value: ClusterVersion;
case: "clusterVersion";
+ } | {
+ /**
+ * @generated from field: osac.public.v1.BareMetalInstance bare_metal_instance = 15;
+ */
+ value: BareMetalInstance;
+ case: "bareMetalInstance";
+ } | {
+ /**
+ * @generated from field: osac.public.v1.Secret secret = 16;
+ */
+ value: Secret;
+ case: "secret";
} | { case: undefined; value?: undefined };
};
diff --git a/libs/types/src/osac/public/v1/host_type_type_pb.ts b/libs/types/src/osac/public/v1/host_type_type_pb.ts
index 42fda2d8..4d2db069 100644
--- a/libs/types/src/osac/public/v1/host_type_type_pb.ts
+++ b/libs/types/src/osac/public/v1/host_type_type_pb.ts
@@ -37,6 +37,8 @@ export const file_osac_public_v1_host_type_type: GenFile = /*@__PURE__*/
*
* The detailed chracteristics of the host (CPU, memory, GPU, etc) will be in the `description` field.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.public.v1.HostType
*/
export type HostType = Message<"osac.public.v1.HostType"> & {
diff --git a/libs/types/src/osac/public/v1/network_class_type_pb.ts b/libs/types/src/osac/public/v1/network_class_type_pb.ts
index 10cea98c..af8dbead 100644
--- a/libs/types/src/osac/public/v1/network_class_type_pb.ts
+++ b/libs/types/src/osac/public/v1/network_class_type_pb.ts
@@ -44,6 +44,8 @@ export const file_osac_public_v1_network_class_type: GenFile = /*@__PURE__*/
* Users query available NetworkClasses to discover which network types they can choose when
* creating VirtualNetworks.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.public.v1.NetworkClass
*/
export type NetworkClass = Message<"osac.public.v1.NetworkClass"> & {
diff --git a/libs/types/src/osac/public/v1/project_membership_type_pb.ts b/libs/types/src/osac/public/v1/project_membership_type_pb.ts
index 68745fbd..176729d7 100644
--- a/libs/types/src/osac/public/v1/project_membership_type_pb.ts
+++ b/libs/types/src/osac/public/v1/project_membership_type_pb.ts
@@ -25,7 +25,7 @@ import type { Message } from "@bufbuild/protobuf";
* Describes the file osac/public/v1/project_membership_type.proto.
*/
export const file_osac_public_v1_project_membership_type: GenFile = /*@__PURE__*/
- fileDesc("Cixvc2FjL3B1YmxpYy92MS9wcm9qZWN0X21lbWJlcnNoaXBfdHlwZS5wcm90bxIOb3NhYy5wdWJsaWMudjEiuQEKEVByb2plY3RNZW1iZXJzaGlwEgoKAmlkGAEgASgJEioKCG1ldGFkYXRhGAIgASgLMhgub3NhYy5wdWJsaWMudjEuTWV0YWRhdGESMwoEc3BlYxgDIAEoCzIlLm9zYWMucHVibGljLnYxLlByb2plY3RNZW1iZXJzaGlwU3BlYxI3CgZzdGF0dXMYBCABKAsyJy5vc2FjLnB1YmxpYy52MS5Qcm9qZWN0TWVtYmVyc2hpcFN0YXR1cyJ3ChVQcm9qZWN0TWVtYmVyc2hpcFNwZWMSDwoHcHJvamVjdBgBIAEoCRIzCgRyb2xlGAIgASgOMiUub3NhYy5wdWJsaWMudjEuUHJvamVjdE1lbWJlcnNoaXBSb2xlEg4KBHVzZXIYAyABKAlIAEIICgZtZW1iZXIicgoXUHJvamVjdE1lbWJlcnNoaXBTdGF0dXMSNQoFc3RhdGUYASABKA4yJi5vc2FjLnB1YmxpYy52MS5Qcm9qZWN0TWVtYmVyc2hpcFN0YXRlEhQKB21lc3NhZ2UYAiABKAlIAIgBAUIKCghfbWVzc2FnZSqJAQoVUHJvamVjdE1lbWJlcnNoaXBSb2xlEicKI1BST0pFQ1RfTUVNQkVSU0hJUF9ST0xFX1VOU1BFQ0lGSUVEEAASIgoeUFJPSkVDVF9NRU1CRVJTSElQX1JPTEVfVklFV0VSEAESIwofUFJPSkVDVF9NRU1CRVJTSElQX1JPTEVfTUFOQUdFUhACKrEBChZQcm9qZWN0TWVtYmVyc2hpcFN0YXRlEigKJFBST0pFQ1RfTUVNQkVSU0hJUF9TVEFURV9VTlNQRUNJRklFRBAAEiQKIFBST0pFQ1RfTUVNQkVSU0hJUF9TVEFURV9QRU5ESU5HEAESIgoeUFJPSkVDVF9NRU1CRVJTSElQX1NUQVRFX1JFQURZEAISIwofUFJPSkVDVF9NRU1CRVJTSElQX1NUQVRFX0ZBSUxFRBADYgZwcm90bzM", [file_osac_public_v1_metadata_type]);
+ fileDesc("Cixvc2FjL3B1YmxpYy92MS9wcm9qZWN0X21lbWJlcnNoaXBfdHlwZS5wcm90bxIOb3NhYy5wdWJsaWMudjEiuQEKEVByb2plY3RNZW1iZXJzaGlwEgoKAmlkGAEgASgJEioKCG1ldGFkYXRhGAIgASgLMhgub3NhYy5wdWJsaWMudjEuTWV0YWRhdGESMwoEc3BlYxgDIAEoCzIlLm9zYWMucHVibGljLnYxLlByb2plY3RNZW1iZXJzaGlwU3BlYxI3CgZzdGF0dXMYBCABKAsyJy5vc2FjLnB1YmxpYy52MS5Qcm9qZWN0TWVtYmVyc2hpcFN0YXR1cyJbChVQcm9qZWN0TWVtYmVyc2hpcFNwZWMSMwoEcm9sZRgCIAEoDjIlLm9zYWMucHVibGljLnYxLlByb2plY3RNZW1iZXJzaGlwUm9sZRINCgV1c2VycxgDIAMoCSJyChdQcm9qZWN0TWVtYmVyc2hpcFN0YXR1cxI1CgVzdGF0ZRgBIAEoDjImLm9zYWMucHVibGljLnYxLlByb2plY3RNZW1iZXJzaGlwU3RhdGUSFAoHbWVzc2FnZRgCIAEoCUgAiAEBQgoKCF9tZXNzYWdlKokBChVQcm9qZWN0TWVtYmVyc2hpcFJvbGUSJwojUFJPSkVDVF9NRU1CRVJTSElQX1JPTEVfVU5TUEVDSUZJRUQQABIiCh5QUk9KRUNUX01FTUJFUlNISVBfUk9MRV9WSUVXRVIQARIjCh9QUk9KRUNUX01FTUJFUlNISVBfUk9MRV9NQU5BR0VSEAIqsQEKFlByb2plY3RNZW1iZXJzaGlwU3RhdGUSKAokUFJPSkVDVF9NRU1CRVJTSElQX1NUQVRFX1VOU1BFQ0lGSUVEEAASJAogUFJPSkVDVF9NRU1CRVJTSElQX1NUQVRFX1BFTkRJTkcQARIiCh5QUk9KRUNUX01FTUJFUlNISVBfU1RBVEVfUkVBRFkQAhIjCh9QUk9KRUNUX01FTUJFUlNISVBfU1RBVEVfRkFJTEVEEANiBnByb3RvMw", [file_osac_public_v1_metadata_type]);
/**
* ProjectMembership represents a member's association with a project and their role within it.
@@ -70,39 +70,25 @@ export const ProjectMembershipSchema: GenMessage = /*@__PURE_
messageDesc(file_osac_public_v1_project_membership_type, 0);
/**
- * Describes a member of a project.
+ * Describes the members of a project.
*
* @generated from message osac.public.v1.ProjectMembershipSpec
*/
export type ProjectMembershipSpec = Message<"osac.public.v1.ProjectMembershipSpec"> & {
/**
- * Reference to the project that this membership applies to. This is the unique identifier (ID) of the Project object,
- * not the project name.
- *
- * @generated from field: string project = 1;
- */
- project: string;
-
- /**
- * Role of the member in the project. This indicates whether the member is a viewer, manager, etc.
+ * Role of the members in the project. This indicates whether the members are viewers, managers, etc.
*
* @generated from field: osac.public.v1.ProjectMembershipRole role = 2;
*/
role: ProjectMembershipRole;
/**
- * Unique identifier of the member. Currently members are users (referenced by their User object ID), but this leaves
- * room for adding other kinds of members in the future, like groups.
+ * Identifiers of the users that are members of the project. These are user identifiers (the `id` field of User
+ * objects), not usernames or email addresses.
*
- * @generated from oneof osac.public.v1.ProjectMembershipSpec.member
+ * @generated from field: repeated string users = 3;
*/
- member: {
- /**
- * @generated from field: string user = 3;
- */
- value: string;
- case: "user";
- } | { case: undefined; value?: undefined };
+ users: string[];
};
/**
diff --git a/libs/types/src/osac/public/v1/public_ip_type_pb.ts b/libs/types/src/osac/public/v1/public_ip_type_pb.ts
index cd0328fe..3a94a661 100644
--- a/libs/types/src/osac/public/v1/public_ip_type_pb.ts
+++ b/libs/types/src/osac/public/v1/public_ip_type_pb.ts
@@ -22,14 +22,13 @@ import type { IPFamily } from "./ip_family_type_pb";
import { file_osac_public_v1_ip_family_type } from "./ip_family_type_pb";
import type { Metadata } from "./metadata_type_pb";
import { file_osac_public_v1_metadata_type } from "./metadata_type_pb";
-import { file_osac_public_v1_public_ip_pool_type } from "./public_ip_pool_type_pb";
import type { Message } from "@bufbuild/protobuf";
/**
* Describes the file osac/public/v1/public_ip_type.proto.
*/
export const file_osac_public_v1_public_ip_type: GenFile = /*@__PURE__*/
- fileDesc("CiNvc2FjL3B1YmxpYy92MS9wdWJsaWNfaXBfdHlwZS5wcm90bxIOb3NhYy5wdWJsaWMudjEingEKCFB1YmxpY0lQEgoKAmlkGAEgASgJEioKCG1ldGFkYXRhGAIgASgLMhgub3NhYy5wdWJsaWMudjEuTWV0YWRhdGESKgoEc3BlYxgDIAEoCzIcLm9zYWMucHVibGljLnYxLlB1YmxpY0lQU3BlYxIuCgZzdGF0dXMYBCABKAsyHi5vc2FjLnB1YmxpYy52MS5QdWJsaWNJUFN0YXR1cyJTCgxQdWJsaWNJUFNwZWMSEQoEcG9vbBgBIAEoCUID4EEFEjAKCWlwX2ZhbWlseRgCIAEoDjIYLm9zYWMucHVibGljLnYxLklQRmFtaWx5QgPgQQUiqgEKDlB1YmxpY0lQU3RhdHVzEjEKBXN0YXRlGAEgASgOMh0ub3NhYy5wdWJsaWMudjEuUHVibGljSVBTdGF0ZUID4EEDEhkKB21lc3NhZ2UYAiABKAlCA+BBA0gAiAEBEhQKB2FkZHJlc3MYAyABKAlCA+BBAxIRCgRwb29sGAQgASgJQgPgQQMSFQoIYXR0YWNoZWQYBSABKAhCA+BBA0IKCghfbWVzc2FnZSqmAQoNUHVibGljSVBTdGF0ZRIfChtQVUJMSUNfSVBfU1RBVEVfVU5TUEVDSUZJRUQQABIbChdQVUJMSUNfSVBfU1RBVEVfUEVORElORxABEh0KGVBVQkxJQ19JUF9TVEFURV9BTExPQ0FURUQQAhIaChZQVUJMSUNfSVBfU1RBVEVfRkFJTEVEEAMSHAoYUFVCTElDX0lQX1NUQVRFX0RFTEVUSU5HEARiBnByb3RvMw", [file_google_api_field_behavior, file_osac_public_v1_ip_family_type, file_osac_public_v1_metadata_type, file_osac_public_v1_public_ip_pool_type]);
+ fileDesc("CiNvc2FjL3B1YmxpYy92MS9wdWJsaWNfaXBfdHlwZS5wcm90bxIOb3NhYy5wdWJsaWMudjEingEKCFB1YmxpY0lQEgoKAmlkGAEgASgJEioKCG1ldGFkYXRhGAIgASgLMhgub3NhYy5wdWJsaWMudjEuTWV0YWRhdGESKgoEc3BlYxgDIAEoCzIcLm9zYWMucHVibGljLnYxLlB1YmxpY0lQU3BlYxIuCgZzdGF0dXMYBCABKAsyHi5vc2FjLnB1YmxpYy52MS5QdWJsaWNJUFN0YXR1cyJTCgxQdWJsaWNJUFNwZWMSEQoEcG9vbBgBIAEoCUID4EEFEjAKCWlwX2ZhbWlseRgCIAEoDjIYLm9zYWMucHVibGljLnYxLklQRmFtaWx5QgPgQQUiqgEKDlB1YmxpY0lQU3RhdHVzEjEKBXN0YXRlGAEgASgOMh0ub3NhYy5wdWJsaWMudjEuUHVibGljSVBTdGF0ZUID4EEDEhkKB21lc3NhZ2UYAiABKAlCA+BBA0gAiAEBEhQKB2FkZHJlc3MYAyABKAlCA+BBAxIRCgRwb29sGAQgASgJQgPgQQMSFQoIYXR0YWNoZWQYBSABKAhCA+BBA0IKCghfbWVzc2FnZSqmAQoNUHVibGljSVBTdGF0ZRIfChtQVUJMSUNfSVBfU1RBVEVfVU5TUEVDSUZJRUQQABIbChdQVUJMSUNfSVBfU1RBVEVfUEVORElORxABEh0KGVBVQkxJQ19JUF9TVEFURV9BTExPQ0FURUQQAhIaChZQVUJMSUNfSVBfU1RBVEVfRkFJTEVEEAMSHAoYUFVCTElDX0lQX1NUQVRFX0RFTEVUSU5HEARiBnByb3RvMw", [file_google_api_field_behavior, file_osac_public_v1_ip_family_type, file_osac_public_v1_metadata_type]);
/**
* Represents a public IP address allocated from a PublicIPPool.
diff --git a/libs/types/src/osac/public/v1/secret_type_pb.ts b/libs/types/src/osac/public/v1/secret_type_pb.ts
new file mode 100644
index 00000000..6d3122f7
--- /dev/null
+++ b/libs/types/src/osac/public/v1/secret_type_pb.ts
@@ -0,0 +1,120 @@
+//
+// Copyright (c) 2026 Red Hat, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations under the License.
+//
+
+// @generated by protoc-gen-es v2.12.0 with parameter "target=ts"
+// @generated from file osac/public/v1/secret_type.proto (package osac.public.v1, syntax proto3)
+/* eslint-disable */
+
+import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
+import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_buf_validate_validate } from "../../../buf/validate/validate_pb";
+import type { Metadata } from "./metadata_type_pb";
+import { file_osac_public_v1_metadata_type } from "./metadata_type_pb";
+import type { Message } from "@bufbuild/protobuf";
+
+/**
+ * Describes the file osac/public/v1/secret_type.proto.
+ */
+export const file_osac_public_v1_secret_type: GenFile = /*@__PURE__*/
+ fileDesc("CiBvc2FjL3B1YmxpYy92MS9zZWNyZXRfdHlwZS5wcm90bxIOb3NhYy5wdWJsaWMudjEimAEKBlNlY3JldBIKCgJpZBgBIAEoCRIqCghtZXRhZGF0YRgCIAEoCzIYLm9zYWMucHVibGljLnYxLk1ldGFkYXRhEigKBHNwZWMYAyABKAsyGi5vc2FjLnB1YmxpYy52MS5TZWNyZXRTcGVjEiwKBnN0YXR1cxgEIAEoCzIcLm9zYWMucHVibGljLnYxLlNlY3JldFN0YXR1cyJ7CgpTZWNyZXRTcGVjEkAKBGRhdGEYASADKAsyJC5vc2FjLnB1YmxpYy52MS5TZWNyZXRTcGVjLkRhdGFFbnRyeUIMukgJmgEGIgRyAhABGisKCURhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAw6AjgBIooBCgxTZWNyZXRTdGF0dXMSRQoNcmVzb2x2ZWRfZGF0YRgBIAMoCzIuLm9zYWMucHVibGljLnYxLlNlY3JldFN0YXR1cy5SZXNvbHZlZERhdGFFbnRyeRozChFSZXNvbHZlZERhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAw6AjgBYgZwcm90bzM", [file_buf_validate_validate, file_osac_public_v1_metadata_type]);
+
+/**
+ * Represents a secret containing opaque key-value data.
+ *
+ * Secrets store sensitive information such as TLS certificates, pull secrets, and credentials. Each secret holds a map
+ * of named binary values. For example, a TLS secret might contain entries named `tls.crt` and `tls.key`.
+ *
+ * Secrets are scoped to a tenant and can be referenced by other resources that require sensitive configuration data.
+ *
+ * @generated from message osac.public.v1.Secret
+ */
+export type Secret = Message<"osac.public.v1.Secret"> & {
+ /**
+ * Unique identifier of the secret.
+ *
+ * @generated from field: string id = 1;
+ */
+ id: string;
+
+ /**
+ * Metadata of the secret.
+ *
+ * @generated from field: osac.public.v1.Metadata metadata = 2;
+ */
+ metadata?: Metadata | undefined;
+
+ /**
+ * Desired state of the secret.
+ *
+ * @generated from field: osac.public.v1.SecretSpec spec = 3;
+ */
+ spec?: SecretSpec | undefined;
+
+ /**
+ * Observed state of the secret, populated by the server.
+ *
+ * @generated from field: osac.public.v1.SecretStatus status = 4;
+ */
+ status?: SecretStatus | undefined;
+};
+
+/**
+ * Describes the message osac.public.v1.Secret.
+ * Use `create(SecretSchema)` to create a new message.
+ */
+export const SecretSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secret_type, 0);
+
+/**
+ * Desired state of a secret.
+ *
+ * @generated from message osac.public.v1.SecretSpec
+ */
+export type SecretSpec = Message<"osac.public.v1.SecretSpec"> & {
+ /**
+ * Opaque key-value data. Each key identifies a named entry (for example, `crt` or `key`) and the
+ * corresponding value is the raw secret material.
+ *
+ * @generated from field: map data = 1;
+ */
+ data: { [key: string]: Uint8Array };
+};
+
+/**
+ * Describes the message osac.public.v1.SecretSpec.
+ * Use `create(SecretSpecSchema)` to create a new message.
+ */
+export const SecretSpecSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secret_type, 1);
+
+/**
+ * Observed state of a secret, populated by the server.
+ *
+ * @generated from message osac.public.v1.SecretStatus
+ */
+export type SecretStatus = Message<"osac.public.v1.SecretStatus"> & {
+ /**
+ * The secret's resolved key-value data. Present in Get responses; omitted from List responses.
+ *
+ * @generated from field: map resolved_data = 1;
+ */
+ resolvedData: { [key: string]: Uint8Array };
+};
+
+/**
+ * Describes the message osac.public.v1.SecretStatus.
+ * Use `create(SecretStatusSchema)` to create a new message.
+ */
+export const SecretStatusSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secret_type, 2);
+
diff --git a/libs/types/src/osac/public/v1/secrets_service_pb.ts b/libs/types/src/osac/public/v1/secrets_service_pb.ts
new file mode 100644
index 00000000..7aa6eb43
--- /dev/null
+++ b/libs/types/src/osac/public/v1/secrets_service_pb.ts
@@ -0,0 +1,373 @@
+//
+// Copyright (c) 2026 Red Hat, Inc.
+//
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with
+// the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on
+// an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations under the License.
+//
+
+// @generated by protoc-gen-es v2.12.0 with parameter "target=ts"
+// @generated from file osac/public/v1/secrets_service.proto (package osac.public.v1, syntax proto3)
+/* eslint-disable */
+
+import type { GenFile, GenMessage, GenService } from "@bufbuild/protobuf/codegenv2";
+import { fileDesc, messageDesc, serviceDesc } from "@bufbuild/protobuf/codegenv2";
+import { file_google_api_annotations } from "../../../google/api/annotations_pb";
+import type { FieldMask } from "../../../google/protobuf/field_mask_pb";
+import { file_google_protobuf_field_mask } from "../../../google/protobuf/field_mask_pb";
+import type { Secret } from "./secret_type_pb";
+import { file_osac_public_v1_secret_type } from "./secret_type_pb";
+import type { Message } from "@bufbuild/protobuf";
+
+/**
+ * Describes the file osac/public/v1/secrets_service.proto.
+ */
+export const file_osac_public_v1_secrets_service: GenFile = /*@__PURE__*/
+ fileDesc("CiRvc2FjL3B1YmxpYy92MS9zZWNyZXRzX3NlcnZpY2UucHJvdG8SDm9zYWMucHVibGljLnYxIpABChJTZWNyZXRzTGlzdFJlcXVlc3QSEwoGb2Zmc2V0GAEgASgFSACIAQESEgoFbGltaXQYAiABKAVIAYgBARITCgZmaWx0ZXIYAyABKAlIAogBARISCgVvcmRlchgEIAEoCUgDiAEBQgkKB19vZmZzZXRCCAoGX2xpbWl0QgkKB19maWx0ZXJCCAoGX29yZGVyIlkKE1NlY3JldHNMaXN0UmVzcG9uc2USDAoEc2l6ZRgBIAEoBRINCgV0b3RhbBgCIAEoBRIlCgVpdGVtcxgDIAMoCzIWLm9zYWMucHVibGljLnYxLlNlY3JldCIfChFTZWNyZXRzR2V0UmVxdWVzdBIKCgJpZBgBIAEoCSI8ChJTZWNyZXRzR2V0UmVzcG9uc2USJgoGb2JqZWN0GAEgASgLMhYub3NhYy5wdWJsaWMudjEuU2VjcmV0Ij4KFFNlY3JldHNDcmVhdGVSZXF1ZXN0EiYKBm9iamVjdBgBIAEoCzIWLm9zYWMucHVibGljLnYxLlNlY3JldCI/ChVTZWNyZXRzQ3JlYXRlUmVzcG9uc2USJgoGb2JqZWN0GAEgASgLMhYub3NhYy5wdWJsaWMudjEuU2VjcmV0In0KFFNlY3JldHNVcGRhdGVSZXF1ZXN0EiYKBm9iamVjdBgBIAEoCzIWLm9zYWMucHVibGljLnYxLlNlY3JldBIvCgt1cGRhdGVfbWFzaxgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sSDAoEbG9jaxgDIAEoCCI/ChVTZWNyZXRzVXBkYXRlUmVzcG9uc2USJgoGb2JqZWN0GAEgASgLMhYub3NhYy5wdWJsaWMudjEuU2VjcmV0IiIKFFNlY3JldHNEZWxldGVSZXF1ZXN0EgoKAmlkGAEgASgJIhcKFVNlY3JldHNEZWxldGVSZXNwb25zZTKmBQoHU2VjcmV0cxJ0CgRMaXN0EiIub3NhYy5wdWJsaWMudjEuU2VjcmV0c0xpc3RSZXF1ZXN0GiMub3NhYy5wdWJsaWMudjEuU2VjcmV0c0xpc3RSZXNwb25zZSIjgtPkkwIdEhsvYXBpL2Z1bGZpbGxtZW50L3YxL3NlY3JldHMSfgoDR2V0EiEub3NhYy5wdWJsaWMudjEuU2VjcmV0c0dldFJlcXVlc3QaIi5vc2FjLnB1YmxpYy52MS5TZWNyZXRzR2V0UmVzcG9uc2UiMILT5JMCKmIGb2JqZWN0EiAvYXBpL2Z1bGZpbGxtZW50L3YxL3NlY3JldHMve2lkfRKKAQoGQ3JlYXRlEiQub3NhYy5wdWJsaWMudjEuU2VjcmV0c0NyZWF0ZVJlcXVlc3QaJS5vc2FjLnB1YmxpYy52MS5TZWNyZXRzQ3JlYXRlUmVzcG9uc2UiM4LT5JMCLToGb2JqZWN0YgZvYmplY3QiGy9hcGkvZnVsZmlsbG1lbnQvdjEvc2VjcmV0cxKWAQoGVXBkYXRlEiQub3NhYy5wdWJsaWMudjEuU2VjcmV0c1VwZGF0ZVJlcXVlc3QaJS5vc2FjLnB1YmxpYy52MS5TZWNyZXRzVXBkYXRlUmVzcG9uc2UiP4LT5JMCOToGb2JqZWN0YgZvYmplY3QyJy9hcGkvZnVsZmlsbG1lbnQvdjEvc2VjcmV0cy97b2JqZWN0LmlkfRJ/CgZEZWxldGUSJC5vc2FjLnB1YmxpYy52MS5TZWNyZXRzRGVsZXRlUmVxdWVzdBolLm9zYWMucHVibGljLnYxLlNlY3JldHNEZWxldGVSZXNwb25zZSIogtPkkwIiKiAvYXBpL2Z1bGZpbGxtZW50L3YxL3NlY3JldHMve2lkfWIGcHJvdG8z", [file_google_api_annotations, file_google_protobuf_field_mask, file_osac_public_v1_secret_type]);
+
+/**
+ * Request message for listing secrets.
+ *
+ * @generated from message osac.public.v1.SecretsListRequest
+ */
+export type SecretsListRequest = Message<"osac.public.v1.SecretsListRequest"> & {
+ /**
+ * Index of the first result. If not specified the default value will be zero.
+ *
+ * @generated from field: optional int32 offset = 1;
+ */
+ offset?: number | undefined;
+
+ /**
+ * Maximum number of results to be returned by the server. When not specified all the results will be returned. Note
+ * that there may not be enough results to return, and that the server may decide, for performance reasons, to return
+ * less results than requested.
+ *
+ * @generated from field: optional int32 limit = 2;
+ */
+ limit?: number | undefined;
+
+ /**
+ * Filter criteria.
+ *
+ * The value of this parameter is a [CEL](https://cel.dev) expression used to select which objects to return. The
+ * built-in `this` variable refers to the object being tested and `now` refers to the current date and time. If the
+ * expression evaluates to `true` the object is included in the results. For example, to retrieve all secrets with
+ * names starting with `tls`:
+ *
+ * this.metadata.name.startsWith("tls")
+ *
+ * If this isn't provided, or if the value is empty, then all the secrets that the user has permission to see will be
+ * returned. Not all CEL constructs are currently supported for implementation reasons; see the filter documentation
+ * (docs/FILTER.md) for the full details.
+ *
+ * @generated from field: optional string filter = 3;
+ */
+ filter?: string | undefined;
+
+ /**
+ * Order criteria.
+ *
+ * The syntax of this parameter is similar to the syntax of the _order by_ clause of a SQL statement, but using the
+ * names of the attributes of the secret instead of the names of the columns of a table. For example, in order to
+ * sort the secrets descending by name the value should be:
+ *
+ * metadata.name desc
+ *
+ * If the parameter isn't provided, or if the value is empty, then the order of the results is undefined.
+ *
+ * @generated from field: optional string order = 4;
+ */
+ order?: string | undefined;
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsListRequest.
+ * Use `create(SecretsListRequestSchema)` to create a new message.
+ */
+export const SecretsListRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 0);
+
+/**
+ * Response message for listing secrets.
+ *
+ * @generated from message osac.public.v1.SecretsListResponse
+ */
+export type SecretsListResponse = Message<"osac.public.v1.SecretsListResponse"> & {
+ /**
+ * Actual number of items returned. Note that this may be smaller than the value requested in the `limit` parameter
+ * of the request if there are not enough items, or if the system decides that returning that number of items isn't
+ * feasible or convenient for performance reasons.
+ *
+ * @generated from field: int32 size = 1;
+ */
+ size: number;
+
+ /**
+ * Total number of items of the collection that match the search criteria, regardless of the number of results
+ * requested with the `limit` parameter.
+ *
+ * @generated from field: int32 total = 2;
+ */
+ total: number;
+
+ /**
+ * List of results.
+ *
+ * @generated from field: repeated osac.public.v1.Secret items = 3;
+ */
+ items: Secret[];
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsListResponse.
+ * Use `create(SecretsListResponseSchema)` to create a new message.
+ */
+export const SecretsListResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 1);
+
+/**
+ * Request message for getting a single secret.
+ *
+ * @generated from message osac.public.v1.SecretsGetRequest
+ */
+export type SecretsGetRequest = Message<"osac.public.v1.SecretsGetRequest"> & {
+ /**
+ * Unique identifier of the secret to retrieve.
+ *
+ * @generated from field: string id = 1;
+ */
+ id: string;
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsGetRequest.
+ * Use `create(SecretsGetRequestSchema)` to create a new message.
+ */
+export const SecretsGetRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 2);
+
+/**
+ * Response message for getting a single secret.
+ *
+ * @generated from message osac.public.v1.SecretsGetResponse
+ */
+export type SecretsGetResponse = Message<"osac.public.v1.SecretsGetResponse"> & {
+ /**
+ * The requested secret object.
+ *
+ * @generated from field: osac.public.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsGetResponse.
+ * Use `create(SecretsGetResponseSchema)` to create a new message.
+ */
+export const SecretsGetResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 3);
+
+/**
+ * Request message for creating a new secret.
+ *
+ * @generated from message osac.public.v1.SecretsCreateRequest
+ */
+export type SecretsCreateRequest = Message<"osac.public.v1.SecretsCreateRequest"> & {
+ /**
+ * The secret object to create.
+ *
+ * @generated from field: osac.public.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsCreateRequest.
+ * Use `create(SecretsCreateRequestSchema)` to create a new message.
+ */
+export const SecretsCreateRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 4);
+
+/**
+ * Response message for creating a new secret.
+ *
+ * @generated from message osac.public.v1.SecretsCreateResponse
+ */
+export type SecretsCreateResponse = Message<"osac.public.v1.SecretsCreateResponse"> & {
+ /**
+ * The created secret object, including any server-generated fields.
+ *
+ * @generated from field: osac.public.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsCreateResponse.
+ * Use `create(SecretsCreateResponseSchema)` to create a new message.
+ */
+export const SecretsCreateResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 5);
+
+/**
+ * Request message for updating an existing secret.
+ *
+ * @generated from message osac.public.v1.SecretsUpdateRequest
+ */
+export type SecretsUpdateRequest = Message<"osac.public.v1.SecretsUpdateRequest"> & {
+ /**
+ * The secret object with updated fields.
+ *
+ * @generated from field: osac.public.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+
+ /**
+ * Field mask specifying which fields to update. If not provided, all fields will be updated.
+ *
+ * @generated from field: google.protobuf.FieldMask update_mask = 2;
+ */
+ updateMask?: FieldMask | undefined;
+
+ /**
+ * Lock enables optimistic locking. When set to true, the server verifies that the current version of the object
+ * matches the value of the metadata.version field of the submitted object. If they differ the update will be
+ * rejected. This is useful to prevent lost updates when multiple clients are modifying the same object concurrently.
+ *
+ * @generated from field: bool lock = 3;
+ */
+ lock: boolean;
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsUpdateRequest.
+ * Use `create(SecretsUpdateRequestSchema)` to create a new message.
+ */
+export const SecretsUpdateRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 6);
+
+/**
+ * Response message for updating an existing secret.
+ *
+ * @generated from message osac.public.v1.SecretsUpdateResponse
+ */
+export type SecretsUpdateResponse = Message<"osac.public.v1.SecretsUpdateResponse"> & {
+ /**
+ * The updated secret object.
+ *
+ * @generated from field: osac.public.v1.Secret object = 1;
+ */
+ object?: Secret | undefined;
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsUpdateResponse.
+ * Use `create(SecretsUpdateResponseSchema)` to create a new message.
+ */
+export const SecretsUpdateResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 7);
+
+/**
+ * Request message for deleting a secret.
+ *
+ * @generated from message osac.public.v1.SecretsDeleteRequest
+ */
+export type SecretsDeleteRequest = Message<"osac.public.v1.SecretsDeleteRequest"> & {
+ /**
+ * Unique identifier of the secret to delete.
+ *
+ * @generated from field: string id = 1;
+ */
+ id: string;
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsDeleteRequest.
+ * Use `create(SecretsDeleteRequestSchema)` to create a new message.
+ */
+export const SecretsDeleteRequestSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 8);
+
+/**
+ * Response message for deleting a secret.
+ *
+ * @generated from message osac.public.v1.SecretsDeleteResponse
+ */
+export type SecretsDeleteResponse = Message<"osac.public.v1.SecretsDeleteResponse"> & {
+};
+
+/**
+ * Describes the message osac.public.v1.SecretsDeleteResponse.
+ * Use `create(SecretsDeleteResponseSchema)` to create a new message.
+ */
+export const SecretsDeleteResponseSchema: GenMessage = /*@__PURE__*/
+ messageDesc(file_osac_public_v1_secrets_service, 9);
+
+/**
+ * Service for managing secrets.
+ *
+ * Secrets store sensitive key-value data such as TLS certificates, pull secrets, and credentials. They are scoped to
+ * a tenant and can be referenced by other resources that require sensitive configuration data.
+ *
+ * @generated from service osac.public.v1.Secrets
+ */
+export const Secrets: GenService<{
+ /**
+ * Retrieves the list of secrets.
+ *
+ * @generated from rpc osac.public.v1.Secrets.List
+ */
+ list: {
+ methodKind: "unary";
+ input: typeof SecretsListRequestSchema;
+ output: typeof SecretsListResponseSchema;
+ },
+ /**
+ * Retrieves the details of one specific secret.
+ *
+ * @generated from rpc osac.public.v1.Secrets.Get
+ */
+ get: {
+ methodKind: "unary";
+ input: typeof SecretsGetRequestSchema;
+ output: typeof SecretsGetResponseSchema;
+ },
+ /**
+ * Creates a new secret.
+ *
+ * @generated from rpc osac.public.v1.Secrets.Create
+ */
+ create: {
+ methodKind: "unary";
+ input: typeof SecretsCreateRequestSchema;
+ output: typeof SecretsCreateResponseSchema;
+ },
+ /**
+ * Updates an existing secret.
+ *
+ * @generated from rpc osac.public.v1.Secrets.Update
+ */
+ update: {
+ methodKind: "unary";
+ input: typeof SecretsUpdateRequestSchema;
+ output: typeof SecretsUpdateResponseSchema;
+ },
+ /**
+ * Deletes a secret.
+ *
+ * @generated from rpc osac.public.v1.Secrets.Delete
+ */
+ delete: {
+ methodKind: "unary";
+ input: typeof SecretsDeleteRequestSchema;
+ output: typeof SecretsDeleteResponseSchema;
+ },
+}> = /*@__PURE__*/
+ serviceDesc(file_osac_public_v1_secrets_service, 0);
+
diff --git a/libs/types/src/osac/public/v1/tenant_type_pb.ts b/libs/types/src/osac/public/v1/tenant_type_pb.ts
index 54588952..95403415 100644
--- a/libs/types/src/osac/public/v1/tenant_type_pb.ts
+++ b/libs/types/src/osac/public/v1/tenant_type_pb.ts
@@ -30,6 +30,8 @@ export const file_osac_public_v1_tenant_type: GenFile = /*@__PURE__*/
/**
* A tenant groups resources and users for a customer or business unit.
*
+ * buf:lint:ignore OSAC_OBJECT_SHAPE
+ *
* @generated from message osac.public.v1.Tenant
*/
export type Tenant = Message<"osac.public.v1.Tenant"> & {
diff --git a/libs/ui-components/package.json b/libs/ui-components/package.json
index b91f0175..9ceee3a5 100644
--- a/libs/ui-components/package.json
+++ b/libs/ui-components/package.json
@@ -19,6 +19,7 @@
"@xterm/addon-clipboard": "^0.1.0",
"@xterm/addon-fit": "^0.10.0",
"@xterm/xterm": "^5.5.0",
+ "ajv": "^8.20.0",
"formik": "^2.4.9",
"ip-address": "^10.2.0",
"react": "^19.2.4",
diff --git a/libs/ui-components/src/NetworkTopologyPage.tsx b/libs/ui-components/src/NetworkTopologyPage.tsx
index 5340a811..39d2abc7 100644
--- a/libs/ui-components/src/NetworkTopologyPage.tsx
+++ b/libs/ui-components/src/NetworkTopologyPage.tsx
@@ -62,12 +62,7 @@ const readSubnet = (vm: ComputeInstance): string => {
};
const readIpAddress = (vm: ComputeInstance): string | undefined => {
- return (
- vm.status?.publicIpAddress?.trim() ||
- vm.status?.internalIpAddress?.trim() ||
- wireStr(vm.status, 'public_ip_address', 'publicIpAddress') ||
- wireStr(vm.status, 'internal_ip_address', 'internalIpAddress', 'ipAddress')
- );
+ return vm.status?.externalIpAddress || vm.status?.internalIpAddress;
};
const groupBySubnet = (vms: ComputeInstance[]): SubnetGroup[] => {
diff --git a/libs/ui-components/src/api/v1/cluster-templates.ts b/libs/ui-components/src/api/v1/cluster-templates.ts
index da0f6746..8a7760be 100644
--- a/libs/ui-components/src/api/v1/cluster-templates.ts
+++ b/libs/ui-components/src/api/v1/cluster-templates.ts
@@ -1,15 +1,16 @@
import { ClusterTemplates } from '@osac/types';
import { useApiFetch } from '../api-context';
-import { apiQueryKey } from '../types';
+import { ListParams, apiQueryKey } from '../types';
import { useApiQuery } from '../use-api-query';
-export const useClusterTemplate = (id: string | undefined) => {
+export const useClusterTemplates = (params: ListParams = {}) => {
const client = useApiFetch(ClusterTemplates);
return useApiQuery({
- queryKey: apiQueryKey('v1/cluster_templates', id ? [id] : undefined),
- queryFn: () => client.get({ id: id ?? '' }),
- select: (data) => data.object,
- enabled: Boolean(id),
+ queryKey: apiQueryKey('v1/cluster_templates'),
+ queryFn: () => client.list(params),
+ select: (data) => {
+ return data.items;
+ },
});
};
diff --git a/libs/ui-components/src/api/v1/host-types.ts b/libs/ui-components/src/api/v1/host-types.ts
deleted file mode 100644
index 9931e90f..00000000
--- a/libs/ui-components/src/api/v1/host-types.ts
+++ /dev/null
@@ -1,33 +0,0 @@
-import { type HostType, HostTypes } from '@osac/types';
-
-import { useApiFetch } from '../api-context';
-import { type ListParams, apiQueryKey } from '../types';
-import { resourceDisplayName } from './networking';
-import { useApiQuery } from '../use-api-query';
-
-type HostTypesQueryOptions = {
- enabled?: boolean;
-};
-
-export const useHostTypes = (params: ListParams = {}, options: HostTypesQueryOptions = {}) => {
- const client = useApiFetch(HostTypes);
- return useApiQuery({
- queryKey: apiQueryKey('v1/host_types', undefined, params),
- queryFn: () => client.list(params),
- select: (data) => data.items,
- enabled: options.enabled ?? true,
- });
-};
-
-export const useHostType = (id: string | undefined) => {
- const client = useApiFetch(HostTypes);
- return useApiQuery({
- queryKey: apiQueryKey('v1/host_types', id ? [id] : undefined),
- queryFn: () => client.get({ id: id ?? '' }),
- select: (data) => data.object,
- enabled: Boolean(id),
- });
-};
-
-export const hostTypeDisplayName = (hostType: HostType): string =>
- hostType.title?.trim() || resourceDisplayName(hostType.metadata, hostType.id);
diff --git a/libs/ui-components/src/api/v1/networking.ts b/libs/ui-components/src/api/v1/networking.ts
index af421235..ec9416c9 100644
--- a/libs/ui-components/src/api/v1/networking.ts
+++ b/libs/ui-components/src/api/v1/networking.ts
@@ -69,6 +69,20 @@ export const useSecurityGroups = (
});
};
+const securityGroupIdsFilter = (ids: string[]): string =>
+ ids.map((id) => `this.id == "${escapeCelStringLiteral(id)}"`).join(' || ');
+
+export const useSecurityGroupsByIds = (ids: string[]) => {
+ const client = useApiFetch(SecurityGroups);
+ const hasIds = ids.length > 0;
+ return useApiQuery({
+ queryKey: apiQueryKey('v1/security_groups', ids),
+ queryFn: () => client.list({ filter: securityGroupIdsFilter(ids) }),
+ select: (data) => data.items,
+ enabled: hasIds,
+ });
+};
+
export const virtualNetworkFilterForSubnetList = (virtualNetworkId: string): string =>
combineListFilters(virtualNetworkScopeFilter(virtualNetworkId), SUBNET_READY_LIST_FILTER);
diff --git a/libs/ui-components/src/components/BareMetalInstance/CreateWizard/BareMetalInstanceCreateWizard.tsx b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/BareMetalInstanceCreateWizard.tsx
new file mode 100644
index 00000000..d74aca35
--- /dev/null
+++ b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/BareMetalInstanceCreateWizard.tsx
@@ -0,0 +1,149 @@
+import { useState } from 'react';
+import { useNavigate, useParams } from 'react-router-dom';
+import {
+ Breadcrumb,
+ BreadcrumbItem,
+ Bullseye,
+ Button,
+ Content,
+ PageSection,
+ PageSectionTypes,
+ Spinner,
+ Title,
+ Wizard,
+ WizardStep,
+ WizardStepType,
+} from '@patternfly/react-core';
+import { Formik } from 'formik';
+
+import { BareMetalInstanceCatalogItem } from '@osac/types';
+
+import { buildBmCreatePayload } from './payload';
+import BareMetalConfigurationStep from './steps/BareMetalConfigurationStep';
+import BareMetalGeneralStep from './steps/BareMetalGeneralStep';
+import { BareMetalReview } from './steps/BareMetalReview';
+import { bmStepHasErrors, buildFullBmSchema } from './validation';
+import { type BareMetalInstanceWizardValues, buildBmInitialValues } from './values';
+import {
+ useBareMetalInstanceCatalogItems,
+ useCreateBareMetalInstance,
+} from '../../../api/v1/baremetal-instance';
+import { useTranslation } from '../../../hooks/useTranslation';
+import { CatalogStepContent } from '../../catalogProvision/shared/CatalogStepContent';
+import { FieldValidationProvider } from '../../Form/FieldValidationContext';
+import { LeaveFormConfirmation } from '../../Form/LeaveFormConfirmation';
+import { OSACWizardFooter } from '../../Wizard/OSACWizardFooter';
+
+export const BareMetalInstanceCreateWizard = () => {
+ const { t } = useTranslation();
+ const { catalogItemId } = useParams<{ catalogItemId?: string }>();
+ const { data: catalogItems = [], isLoading, error, refetch } = useBareMetalInstanceCatalogItems();
+
+ const navigate = useNavigate();
+ const createBareMetalInstance = useCreateBareMetalInstance();
+ const [currentStep, setCurrentStep] = useState();
+
+ if (isLoading) {
+ return (
+
+
+
+ );
+ }
+
+ const initialItem = catalogItemId
+ ? catalogItems.find((item) => item.id === catalogItemId)
+ : undefined;
+
+ const initialValues = buildBmInitialValues(initialItem);
+
+ const onSubmit = async (
+ values: BareMetalInstanceWizardValues,
+ helpers: { setStatus: (status: unknown) => void },
+ ) => {
+ try {
+ const instance = await createBareMetalInstance.mutateAsync(buildBmCreatePayload(values));
+ navigate(`/bare-metal/${instance?.id}`);
+ } catch (err) {
+ helpers.setStatus({
+ provisionError:
+ err instanceof Error ? err.message : t('Provisioning failed. Please try again.'),
+ });
+ }
+ };
+
+ return (
+
+ {(formik) => (
+ <>
+
+
+
+
+
+ {t('Provision bare metal')}
+
+
+ {t('Provision bare metal')}
+
+
+ {t('Provision a bare metal instance from a catalog item.')}
+
+
+
+
+
+ navigate('/bare-metal')}
+ stepHasErrors={bmStepHasErrors}
+ />
+ }
+ onStepChange={(_, step) => {
+ setCurrentStep(step);
+ }}
+ >
+
+ {(!currentStep || currentStep?.id === 'catalog') && (
+
+ catalogItems={catalogItems}
+ error={error}
+ onRefetch={() => void refetch()}
+ onSelect={(item) => {
+ formik.resetForm({ values: buildBmInitialValues(item) });
+ }}
+ />
+ )}
+
+
+ {currentStep?.id === 'general' && }
+
+
+ {currentStep?.id === 'configuration' && }
+
+
+ {currentStep?.id === 'review' && }
+
+
+
+
+ >
+ )}
+
+ );
+};
+
+export default BareMetalInstanceCreateWizard;
diff --git a/libs/ui-components/src/components/BareMetalInstance/CreateWizard/payload.ts b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/payload.ts
new file mode 100644
index 00000000..af67047b
--- /dev/null
+++ b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/payload.ts
@@ -0,0 +1,33 @@
+import type { MessageInitShape } from '@bufbuild/protobuf';
+
+import { BareMetalInstanceSchema } from '@osac/types';
+
+import type { BareMetalInstanceWizardValues } from './values';
+import { isFieldEditable } from '../../catalogProvision/utils';
+
+export const buildBmCreatePayload = (
+ values: BareMetalInstanceWizardValues,
+): MessageInitShape => {
+ const fds = values.catalogItem?.fieldDefinitions || [];
+
+ const bmi: MessageInitShape = {
+ metadata: values.metadata,
+ spec: {
+ catalogItem: values.catalogItem?.id,
+ },
+ };
+
+ if (bmi.spec) {
+ if (isFieldEditable('ssh_public_key', fds)) {
+ bmi.spec.sshPublicKey = values.spec.sshPublicKey;
+ }
+ if (isFieldEditable('run_strategy', fds)) {
+ bmi.spec.runStrategy = values.spec.runStrategy;
+ }
+ if (isFieldEditable('user_data', fds)) {
+ bmi.spec.userData = values.spec.userData;
+ }
+ }
+
+ return bmi;
+};
diff --git a/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalConfigurationStep.tsx b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalConfigurationStep.tsx
new file mode 100644
index 00000000..78e54627
--- /dev/null
+++ b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalConfigurationStep.tsx
@@ -0,0 +1,51 @@
+import { useFormikContext } from 'formik';
+import { type TFunction } from 'i18next';
+
+import UserDataField from '@osac/ui-components/components/catalogProvision/UserDataField';
+import { isFieldEditable } from '@osac/ui-components/components/catalogProvision/utils';
+import OsacForm from '@osac/ui-components/components/Form/OsacForm';
+import { SelectField } from '@osac/ui-components/components/Form/SelectField';
+
+import { useTranslation } from '../../../../hooks/useTranslation';
+import { BareMetalInstanceWizardValues } from '../values';
+
+export const runStrategies = (t: TFunction) => [
+ {
+ label: t('Always'),
+ value: 1,
+ },
+ {
+ label: t('Halted'),
+ value: 2,
+ },
+ {
+ label: t('Unspecified'),
+ value: 0,
+ },
+];
+
+const BareMetalConfigurationStep = () => {
+ const { t } = useTranslation();
+ const { values } = useFormikContext();
+
+ if (!values.catalogItem) {
+ return null;
+ }
+
+ const runStrategyEditable = isFieldEditable('run_strategy', values.catalogItem.fieldDefinitions);
+ return (
+
+
+
+
+ );
+};
+
+export default BareMetalConfigurationStep;
diff --git a/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalGeneralStep.tsx b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalGeneralStep.tsx
new file mode 100644
index 00000000..a5999129
--- /dev/null
+++ b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalGeneralStep.tsx
@@ -0,0 +1,23 @@
+import { useFormikContext } from 'formik';
+
+import NameField from '@osac/ui-components/components/catalogProvision/NameField';
+import SshKeyField from '@osac/ui-components/components/catalogProvision/SshKeyField';
+import OsacForm from '@osac/ui-components/components/Form/OsacForm';
+
+import { BareMetalInstanceWizardValues } from '../values';
+
+const BareMetalGeneralStep = () => {
+ const { values } = useFormikContext();
+
+ if (!values.catalogItem) {
+ return null;
+ }
+ return (
+
+
+
+
+ );
+};
+
+export default BareMetalGeneralStep;
diff --git a/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalReview.tsx b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalReview.tsx
new file mode 100644
index 00000000..3624e26c
--- /dev/null
+++ b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalReview.tsx
@@ -0,0 +1,58 @@
+import {
+ DescriptionList,
+ DescriptionListDescription,
+ DescriptionListGroup,
+ DescriptionListTerm,
+} from '@patternfly/react-core';
+import { useFormikContext } from 'formik';
+
+import { useTranslation } from '../../../../hooks/useTranslation';
+import type { BareMetalInstanceWizardValues } from '../values';
+import { runStrategies } from './BareMetalConfigurationStep';
+
+export const BareMetalReview = () => {
+ const { t } = useTranslation();
+ const { values } = useFormikContext();
+
+ if (!values.catalogItem) {
+ return null;
+ }
+
+ const sections = [
+ {
+ title: t('General'),
+ rows: [
+ { label: t('Name'), value: values.metadata.name },
+ { label: t('SSH public key'), value: values.spec.sshPublicKey || '-' },
+ ],
+ },
+ {
+ title: t('Configuration'),
+ rows: [
+ {
+ label: t('Run strategy'),
+ value:
+ runStrategies(t).find(({ value }) => value === values.spec.runStrategy)?.label || '-',
+ },
+ { label: t('User data'), value: values.spec.userData || '-' },
+ ],
+ },
+ ];
+
+ const rows = sections.flatMap((section) => section.rows);
+
+ return (
+
+
+ {t('Catalog item')}
+ {values.catalogItem.title}
+
+ {rows.map((row) => (
+
+ {row.label}
+ {row.value}
+
+ ))}
+
+ );
+};
diff --git a/libs/ui-components/src/components/BareMetalInstance/CreateWizard/validation.ts b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/validation.ts
new file mode 100644
index 00000000..3689c16c
--- /dev/null
+++ b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/validation.ts
@@ -0,0 +1,49 @@
+import type { FormikErrors } from 'formik';
+import type { TFunction } from 'i18next';
+import * as Yup from 'yup';
+
+import { camelKeysToSnake } from '@osac/ui-components/utils/snakeCase';
+import { buildMetadataNameSchema } from '@osac/ui-components/validation/name';
+import { sshPublicKeySchema } from '@osac/ui-components/validation/ssh-public-key';
+import { userDataSchema } from '@osac/ui-components/validation/user-data';
+
+import { buildBmCreatePayload } from './payload';
+import type { BareMetalInstanceWizardValues } from './values';
+import { buildFieldSchema } from '../../catalogProvision/validation';
+
+export const buildFullBmSchema = (t: TFunction) => {
+ return Yup.lazy((values: BareMetalInstanceWizardValues) => {
+ const fds = values.catalogItem?.fieldDefinitions || [];
+ const payload = buildBmCreatePayload(values);
+ const snakeSpec = camelKeysToSnake(payload.spec ?? {}) as Record;
+ const fieldSchema = buildFieldSchema(snakeSpec, fds);
+
+ return Yup.object({
+ catalogItem: Yup.object().required(t('Catalog item is required')),
+ metadata: Yup.object({
+ name: buildMetadataNameSchema(t),
+ }),
+ spec: Yup.object({
+ runStrategy: fieldSchema('run_strategy'),
+ sshPublicKey: fieldSchema('ssh_public_key', sshPublicKeySchema(t)),
+ userData: fieldSchema('user_data', userDataSchema(t)),
+ }),
+ });
+ });
+};
+
+export const bmStepHasErrors = (
+ stepId: string,
+ errors: FormikErrors,
+): boolean => {
+ switch (stepId) {
+ case 'catalog':
+ return Boolean(errors.catalogItem);
+ case 'general':
+ return Boolean(errors.metadata?.name || errors.spec?.sshPublicKey);
+ case 'configuration':
+ return Boolean(errors.spec?.runStrategy || errors.spec?.userData);
+ default:
+ return false;
+ }
+};
diff --git a/libs/ui-components/src/components/BareMetalInstance/CreateWizard/values.ts b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/values.ts
new file mode 100644
index 00000000..1529c892
--- /dev/null
+++ b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/values.ts
@@ -0,0 +1,71 @@
+import { BareMetalInstanceCatalogItem, BareMetalInstanceRunStrategy } from '@osac/types';
+
+import { getNumberDefaultValue, getStringDefaultValue } from '../../catalogProvision/utils';
+import { clearSchemaCache } from '../../catalogProvision/validation';
+
+export interface BareMetalInstanceWizardValues {
+ catalogItem: BareMetalInstanceCatalogItem | undefined;
+ metadata: {
+ name: string;
+ };
+ spec: {
+ runStrategy: BareMetalInstanceRunStrategy | undefined;
+ sshPublicKey: string;
+ userData: string;
+ };
+}
+
+const getEmptyBareMetalInstanceValues = (
+ catalogItem: BareMetalInstanceCatalogItem | undefined,
+): BareMetalInstanceWizardValues => ({
+ catalogItem,
+ metadata: { name: '' },
+ spec: {
+ runStrategy: undefined,
+ sshPublicKey: '',
+ userData: '',
+ },
+});
+
+export const buildBmInitialValues = (
+ item: BareMetalInstanceCatalogItem | undefined,
+): BareMetalInstanceWizardValues => {
+ clearSchemaCache();
+ const base = getEmptyBareMetalInstanceValues(item);
+ if (!item) {
+ return base;
+ }
+
+ const sshDefault = getStringDefaultValue('ssh_public_key', item.fieldDefinitions);
+
+ if (sshDefault) {
+ base.spec.sshPublicKey = sshDefault;
+ }
+
+ const userDataDefault = getStringDefaultValue('user_data', item.fieldDefinitions);
+
+ if (userDataDefault) {
+ base.spec.userData = userDataDefault;
+ }
+
+ const runStrategyDefault =
+ getStringDefaultValue('run_strategy', item.fieldDefinitions) ||
+ getNumberDefaultValue('run_strategy', item.fieldDefinitions);
+
+ switch (runStrategyDefault) {
+ case 0:
+ case 'BARE_METAL_INSTANCE_RUN_STRATEGY_UNSPECIFIED':
+ base.spec.runStrategy = BareMetalInstanceRunStrategy.UNSPECIFIED;
+ break;
+ case 1:
+ case 'BARE_METAL_INSTANCE_RUN_STRATEGY_ALWAYS':
+ base.spec.runStrategy = BareMetalInstanceRunStrategy.ALWAYS;
+ break;
+ case 2:
+ case 'BARE_METAL_INSTANCE_RUN_STRATEGY_HALTED':
+ base.spec.runStrategy = BareMetalInstanceRunStrategy.HALTED;
+ break;
+ }
+
+ return base;
+};
diff --git a/libs/ui-components/src/components/Cluster/ClusterStatusLabel.tsx b/libs/ui-components/src/components/Cluster/ClusterStatusLabel.tsx
index 205691af..71903c13 100644
--- a/libs/ui-components/src/components/Cluster/ClusterStatusLabel.tsx
+++ b/libs/ui-components/src/components/Cluster/ClusterStatusLabel.tsx
@@ -11,23 +11,14 @@ const CLUSTER_STATUS_MAP: Record {
- switch (state) {
- case ClusterState.PROGRESSING:
- return CLUSTER_STATUS_MAP[ClusterState.PROGRESSING];
- case ClusterState.READY:
- return CLUSTER_STATUS_MAP[ClusterState.READY];
- case ClusterState.FAILED:
- return CLUSTER_STATUS_MAP[ClusterState.FAILED];
- default:
- return CLUSTER_STATUS_MAP[ClusterState.UNSPECIFIED];
- }
+ [ClusterState.DELETING]: { status: 'progressing', text: 'Deleting' },
+ [ClusterState.DELETE_FAILED]: { status: 'failed', text: 'Delete failed' },
};
export const ClusterStatusLabel = ({ state }: ClusterStatusLabelProps) => {
- const { status, text } = resolveClusterStatus(state);
+ const { status, text } = state
+ ? CLUSTER_STATUS_MAP[state]
+ : CLUSTER_STATUS_MAP[ClusterState.UNSPECIFIED];
return ;
};
diff --git a/libs/ui-components/src/pages/tenant/ClusterCreatePage.test.tsx b/libs/ui-components/src/components/Cluster/CreateWizard/ClusterCreateWizard.test.tsx
similarity index 66%
rename from libs/ui-components/src/pages/tenant/ClusterCreatePage.test.tsx
rename to libs/ui-components/src/components/Cluster/CreateWizard/ClusterCreateWizard.test.tsx
index 42371498..e9717d7c 100644
--- a/libs/ui-components/src/pages/tenant/ClusterCreatePage.test.tsx
+++ b/libs/ui-components/src/components/Cluster/CreateWizard/ClusterCreateWizard.test.tsx
@@ -1,13 +1,67 @@
-import { Route, Routes } from 'react-router-dom';
-import { fireEvent, screen, waitFor, within } from '@testing-library/react';
-import { UserEvent } from '@testing-library/user-event';
+import { I18nextProvider } from 'react-i18next';
+import { RouterProvider, createMemoryRouter } from 'react-router-dom';
+import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
+import { fireEvent, render, screen, waitFor, within } from '@testing-library/react';
+import type { UserEvent } from '@testing-library/user-event';
+import userEvent from '@testing-library/user-event';
+import i18n from 'i18next';
import { describe, expect, it, vi } from 'vitest';
import type { Cluster, ClusterCatalogItem, ClustersCreateResponse } from '@osac/types';
-import { ClusterCreatePage } from './ClusterCreatePage';
-import type { MockApiFixtures } from '../../test-utils/createMockConnectTransport';
-import { renderWithProviders } from '../../test-utils/TestProviders';
+import ClusterCreateWizard from './ClusterCreateWizard';
+import en from '../../../../../i18n/locales/en/translation.json';
+import { ApiProvider } from '../../../api/api-context';
+import { createMockConnectTransport } from '../../../test-utils/createMockConnectTransport';
+import type {
+ MockApiFixtures,
+ MockTransportOverrides,
+} from '../../../test-utils/createMockConnectTransport';
+
+const createTestI18n = () => {
+ const instance = i18n.createInstance();
+ instance.init({
+ initImmediate: false,
+ lng: 'en',
+ fallbackLng: 'en',
+ resources: { en: { translation: en } },
+ interpolation: { escapeValue: false },
+ });
+ return instance;
+};
+
+const renderWithDataRouter = (
+ apiFixtures?: MockApiFixtures,
+ transportOverrides?: MockTransportOverrides,
+) => {
+ const i18nInstance = createTestI18n();
+ const transport = createMockConnectTransport(apiFixtures, transportOverrides);
+ const queryClient = new QueryClient({
+ defaultOptions: {
+ queries: { retry: false, refetchOnWindowFocus: false, refetchInterval: false },
+ },
+ });
+
+ const router = createMemoryRouter(
+ [
+ { path: '/clusters/create', element: },
+ { path: '/clusters/:clusterId', element: