From cf4f639c5e66a4673a7d015d5f19698b22251ba9 Mon Sep 17 00:00:00 2001 From: rawagner Date: Fri, 24 Jul 2026 15:29:52 +0200 Subject: [PATCH 1/2] Refactor create vm/cluster/bm wizards - use JSX composition instead of adapter - fix field_definitions handling - due to BE breaking changes - only fields in field_definitions are allowed, all other must not be in the request - enable/disable wizard fields based on the presence of the field path + enabled=true - parse JSON Schema validation and add it to Yup schema - fix cluster node sets - only node sets defined in the cluster template are allowed - host type cannot be selected, only node set size can be adjusted (if field_definition allows it) - Add generic, reusable Wizard Footer component --- apps/app-frontend/src/main.tsx | 23 +- apps/app-frontend/src/shell/AppShell.tsx | 4 +- libs/i18n/locales/en/translation.json | 118 +- ...baremetal_instance_catalog_item_type_pb.ts | 2 + .../v1/baremetal_instance_template_type_pb.ts | 8 +- .../v1/cluster_catalog_item_type_pb.ts | 2 + .../private/v1/cluster_template_type_pb.ts | 2 + .../src/osac/private/v1/cluster_type_pb.ts | 12 +- .../private/v1/cluster_version_type_pb.ts | 10 +- .../compute_instance_catalog_item_type_pb.ts | 2 + .../v1/compute_instance_template_type_pb.ts | 2 + .../private/v1/compute_instance_type_pb.ts | 12 +- .../src/osac/private/v1/event_type_pb.ts | 10 +- .../src/osac/private/v1/host_type_type_pb.ts | 2 + .../osac/private/v1/network_class_type_pb.ts | 2 + .../private/v1/project_membership_type_pb.ts | 37 +- .../src/osac/private/v1/public_ip_type_pb.ts | 3 +- .../src/osac/private/v1/secret_type_pb.ts | 167 +++ .../src/osac/private/v1/secrets_service_pb.ts | 378 ++++++ ...baremetal_instance_catalog_item_type_pb.ts | 2 + .../v1/baremetal_instance_template_type_pb.ts | 2 + .../public/v1/cluster_catalog_item_type_pb.ts | 2 + .../public/v1/cluster_template_type_pb.ts | 2 + .../src/osac/public/v1/cluster_type_pb.ts | 21 +- .../osac/public/v1/cluster_version_type_pb.ts | 10 +- .../compute_instance_catalog_item_type_pb.ts | 2 + .../v1/compute_instance_template_type_pb.ts | 2 + .../public/v1/compute_instance_type_pb.ts | 12 +- .../types/src/osac/public/v1/event_type_pb.ts | 18 +- .../src/osac/public/v1/host_type_type_pb.ts | 2 + .../osac/public/v1/network_class_type_pb.ts | 2 + .../public/v1/project_membership_type_pb.ts | 28 +- .../src/osac/public/v1/public_ip_type_pb.ts | 3 +- .../src/osac/public/v1/secret_type_pb.ts | 120 ++ .../src/osac/public/v1/secrets_service_pb.ts | 373 ++++++ .../src/osac/public/v1/tenant_type_pb.ts | 2 + libs/ui-components/package.json | 1 + .../ui-components/src/NetworkTopologyPage.tsx | 7 +- .../src/api/v1/cluster-templates.ts | 13 +- libs/ui-components/src/api/v1/host-types.ts | 33 - libs/ui-components/src/api/v1/networking.ts | 14 + .../BareMetalInstanceCreateWizard.tsx | 160 +++ .../BareMetalInstance/CreateWizard/payload.ts | 33 + .../steps/BareMetalConfigurationStep.tsx | 51 + .../steps/BareMetalGeneralStep.tsx | 23 + .../CreateWizard/steps/BareMetalReview.tsx | 58 + .../CreateWizard/validation.ts | 49 + .../BareMetalInstance/CreateWizard/values.ts | 71 ++ .../components/Cluster/ClusterStatusLabel.tsx | 2 + .../ClusterCreateWizard.test.tsx} | 93 +- .../CreateWizard/ClusterCreateWizard.tsx | 157 +++ .../Cluster/CreateWizard/payload.ts | 74 ++ .../steps/ClusterConfigurationStep.tsx | 54 + .../CreateWizard/steps/ClusterGeneralStep.tsx | 52 + .../steps/ClusterNetworkingStep.tsx | 45 + .../CreateWizard/steps/ClusterReview.tsx | 49 + .../Cluster/CreateWizard/validation.ts | 117 ++ .../components/Cluster/CreateWizard/values.ts | 105 ++ .../Form/FieldValidationContext.tsx | 24 +- .../src/components/Form/InputField.tsx | 14 +- .../components/Form/LeaveFormConfirmation.tsx | 53 + .../src/components/Form/MultiSelectField.tsx | 35 +- .../src/components/Form/RadioButtonField.tsx | 4 +- .../src/components/Form/SelectField.test.tsx | 24 +- .../src/components/Form/SelectField.tsx | 51 +- .../src/components/Form/labeledResourceRef.ts | 22 - .../Form/labeledResourceRefSchema.ts | 20 - .../components/Wizard/OSACWizardFooter.tsx | 118 ++ .../components/catalog/CatalogItemCard.tsx | 25 +- .../catalog/CatalogItemDetailContent.tsx | 22 +- .../catalog/catalogItemDisplay.test.ts | 182 --- .../components/catalog/catalogItemDisplay.ts | 115 +- .../CatalogProvisionWizard.test.tsx | 1053 ----------------- .../CatalogProvisionWizard.tsx | 551 --------- .../{wizard/fields => }/NameField.tsx | 4 +- .../catalogProvision/SshKeyField.tsx | 45 + .../catalogProvision/UserDataField.tsx | 28 + .../catalogFieldDefinition.ts | 320 ----- .../catalogProvision/catalogProvisionTypes.ts | 17 - .../catalogProvision/protobuf-value.ts | 129 -- .../shared/CatalogStepContent.tsx | 116 ++ .../src/components/catalogProvision/utils.ts | 41 + .../components/catalogProvision/validation.ts | 80 ++ .../BareMetalConfigurationStep.tsx | 18 - .../BareMetalGeneralStep.tsx | 23 - .../adapters/bareMetalInstance/fields.ts | 65 - .../adapters/bareMetalInstance/payload.ts | 24 - .../adapters/bareMetalInstance/schemas.ts | 106 -- .../adapters/bareMetalInstanceAdapter.ts | 85 -- .../cluster/ClusterConfigurationStep.test.tsx | 120 -- .../cluster/ClusterConfigurationStep.tsx | 50 - .../adapters/cluster/ClusterGeneralStep.tsx | 25 - .../cluster/ClusterNetworkingStep.test.tsx | 68 -- .../cluster/ClusterNetworkingStep.tsx | 54 - .../cluster/ClusterNodeSetsArrayField.tsx | 129 -- .../adapters/cluster/applyCatalogDefaults.ts | 29 - .../cluster/applyCatalogGeneralDefaults.ts | 44 - .../cluster/applyCatalogNetworkingDefaults.ts | 40 - .../wizard/adapters/cluster/fields.ts | 54 - .../wizard/adapters/cluster/payload.test.ts | 132 --- .../wizard/adapters/cluster/payload.ts | 64 - .../wizard/adapters/cluster/schemas.test.ts | 330 ------ .../wizard/adapters/cluster/schemas.ts | 198 ---- .../wizard/adapters/clusterAdapter.ts | 155 --- .../computeInstance/VmConfigurationStep.tsx | 121 -- .../computeInstance/VmGeneralStep.tsx | 23 - .../computeInstance/applyCatalogDefaults.ts | 50 - .../applyCatalogGeneralDefaults.ts | 33 - .../wizard/adapters/computeInstance/fields.ts | 42 - .../computeInstance/generalFields.test.ts | 117 -- .../adapters/computeInstance/payload.ts | 66 -- .../adapters/computeInstance/schemas.test.ts | 230 ---- .../adapters/computeInstance/schemas.ts | 154 --- .../wizard/adapters/computeInstanceAdapter.ts | 152 --- .../catalogProvision/wizard/adapters/types.ts | 48 - .../wizard/catalogOverlay.test.ts | 115 -- .../catalogProvision/wizard/catalogOverlay.ts | 222 ---- .../catalogProvision/wizard/constants.ts | 5 - .../wizard/fields/ClusterPoolSizeField.tsx | 23 - .../wizard/fields/PullSecretField.tsx | 34 - .../wizard/fields/SshKeyField.tsx | 54 - .../wizard/fields/UserDataField.tsx | 39 - .../fields/credentialValidation.test.ts | 41 - .../wizard/fields/credentialValidation.ts | 33 - .../wizard/metadataNameSchema.test.ts | 44 - .../catalogProvision/wizard/stepIds.ts | 33 - .../wizard/steps/CatalogStep.tsx | 151 --- .../wizard/steps/ReviewStep.tsx | 46 - .../wizard/steps/WizardSteps.tsx | 2 - .../networking/SecurityGroupCreateModal.tsx | 16 +- .../networking/SecurityGroupRuleForm.tsx | 15 +- .../networking/SecurityGroupRuleModal.tsx | 18 +- .../ComputeInstanceProvisionWizard.tsx | 143 +++ .../src/components/vm/CreateWizard/payload.ts | 69 ++ .../src/components/vm/CreateWizard/schemas.ts | 86 ++ .../steps/VmConfigurationStep.tsx | 105 ++ .../vm/CreateWizard/steps/VmGeneralStep.tsx | 24 + .../CreateWizard/steps}/VmNetworkingStep.tsx | 62 +- .../vm/CreateWizard/steps/VmReview.tsx | 106 ++ .../src/components/vm/CreateWizard/values.ts | 94 ++ .../vm/DetailsPage/VmDetailsActionButtons.tsx | 2 +- .../vm/DetailsPage/VmDetailsCard.test.tsx | 34 +- .../vm/DetailsPage/VmDetailsCard.tsx | 103 +- .../vm/DetailsPage/VmDetailsSummary.test.tsx | 2 +- .../vm/DetailsPage/VmDetailsSummary.tsx | 2 +- .../vm/DetailsPage/VmNetworkingTab.test.tsx | 14 - .../vm/DetailsPage/VmUserDataCard.test.tsx | 37 +- .../vm/DetailsPage/VmUserDataCard.tsx | 4 +- .../vm/DetailsPage/useVmDetailsDisplay.ts | 39 - .../src/components/vm/VmTable.test.tsx | 2 +- .../src/components/vm/VmTable.tsx | 2 +- ...areMetalInstanceCatalogManagementPanel.tsx | 5 +- .../admin/ClusterCatalogManagementPanel.tsx | 6 +- .../ComputeInstanceCatalogManagementPanel.tsx | 5 +- .../src/pages/tenant/BareMetalCreatePage.tsx | 85 -- .../src/pages/tenant/BareMetalRoutes.tsx | 6 +- .../src/pages/tenant/CatalogPage.tsx | 5 +- .../src/pages/tenant/ClusterCreatePage.tsx | 89 -- .../src/pages/tenant/ClusterRoutes.tsx | 6 +- .../src/pages/tenant/VmCreatePage.tsx | 87 -- .../src/pages/tenant/VmListPage.test.tsx | 30 +- .../test-utils/createMockConnectTransport.ts | 1 + libs/ui-components/src/utils/snakeCase.ts | 4 +- .../name.ts} | 9 +- .../src/validation/ssh-public-key.ts | 12 + pnpm-lock.yaml | 29 + proxy/bridge/connectjson.go | 2 + 167 files changed, 3840 insertions(+), 6964 deletions(-) create mode 100644 libs/types/src/osac/private/v1/secret_type_pb.ts create mode 100644 libs/types/src/osac/private/v1/secrets_service_pb.ts create mode 100644 libs/types/src/osac/public/v1/secret_type_pb.ts create mode 100644 libs/types/src/osac/public/v1/secrets_service_pb.ts delete mode 100644 libs/ui-components/src/api/v1/host-types.ts create mode 100644 libs/ui-components/src/components/BareMetalInstance/CreateWizard/BareMetalInstanceCreateWizard.tsx create mode 100644 libs/ui-components/src/components/BareMetalInstance/CreateWizard/payload.ts create mode 100644 libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalConfigurationStep.tsx create mode 100644 libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalGeneralStep.tsx create mode 100644 libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalReview.tsx create mode 100644 libs/ui-components/src/components/BareMetalInstance/CreateWizard/validation.ts create mode 100644 libs/ui-components/src/components/BareMetalInstance/CreateWizard/values.ts rename libs/ui-components/src/{pages/tenant/ClusterCreatePage.test.tsx => components/Cluster/CreateWizard/ClusterCreateWizard.test.tsx} (66%) create mode 100644 libs/ui-components/src/components/Cluster/CreateWizard/ClusterCreateWizard.tsx create mode 100644 libs/ui-components/src/components/Cluster/CreateWizard/payload.ts create mode 100644 libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterConfigurationStep.tsx create mode 100644 libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterGeneralStep.tsx create mode 100644 libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterNetworkingStep.tsx create mode 100644 libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterReview.tsx create mode 100644 libs/ui-components/src/components/Cluster/CreateWizard/validation.ts create mode 100644 libs/ui-components/src/components/Cluster/CreateWizard/values.ts create mode 100644 libs/ui-components/src/components/Form/LeaveFormConfirmation.tsx delete mode 100644 libs/ui-components/src/components/Form/labeledResourceRef.ts delete mode 100644 libs/ui-components/src/components/Form/labeledResourceRefSchema.ts create mode 100644 libs/ui-components/src/components/Wizard/OSACWizardFooter.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/CatalogProvisionWizard.test.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/CatalogProvisionWizard.tsx rename libs/ui-components/src/components/catalogProvision/{wizard/fields => }/NameField.tsx (70%) create mode 100644 libs/ui-components/src/components/catalogProvision/SshKeyField.tsx create mode 100644 libs/ui-components/src/components/catalogProvision/UserDataField.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/catalogFieldDefinition.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/catalogProvisionTypes.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/protobuf-value.ts create mode 100644 libs/ui-components/src/components/catalogProvision/shared/CatalogStepContent.tsx create mode 100644 libs/ui-components/src/components/catalogProvision/utils.ts create mode 100644 libs/ui-components/src/components/catalogProvision/validation.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/bareMetalInstance/BareMetalConfigurationStep.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/bareMetalInstance/BareMetalGeneralStep.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/bareMetalInstance/fields.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/bareMetalInstance/payload.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/bareMetalInstance/schemas.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/bareMetalInstanceAdapter.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/ClusterConfigurationStep.test.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/ClusterConfigurationStep.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/ClusterGeneralStep.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/ClusterNetworkingStep.test.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/ClusterNetworkingStep.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/ClusterNodeSetsArrayField.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/applyCatalogDefaults.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/applyCatalogGeneralDefaults.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/applyCatalogNetworkingDefaults.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/fields.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/payload.test.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/payload.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/schemas.test.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/cluster/schemas.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/clusterAdapter.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstance/VmConfigurationStep.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstance/VmGeneralStep.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstance/applyCatalogDefaults.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstance/applyCatalogGeneralDefaults.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstance/fields.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstance/generalFields.test.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstance/payload.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstance/schemas.test.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstance/schemas.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/computeInstanceAdapter.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/adapters/types.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/catalogOverlay.test.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/catalogOverlay.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/constants.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/fields/ClusterPoolSizeField.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/fields/PullSecretField.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/fields/SshKeyField.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/fields/UserDataField.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/fields/credentialValidation.test.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/fields/credentialValidation.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/metadataNameSchema.test.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/stepIds.ts delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/steps/CatalogStep.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/steps/ReviewStep.tsx delete mode 100644 libs/ui-components/src/components/catalogProvision/wizard/steps/WizardSteps.tsx create mode 100644 libs/ui-components/src/components/vm/CreateWizard/ComputeInstanceProvisionWizard.tsx create mode 100644 libs/ui-components/src/components/vm/CreateWizard/payload.ts create mode 100644 libs/ui-components/src/components/vm/CreateWizard/schemas.ts create mode 100644 libs/ui-components/src/components/vm/CreateWizard/steps/VmConfigurationStep.tsx create mode 100644 libs/ui-components/src/components/vm/CreateWizard/steps/VmGeneralStep.tsx rename libs/ui-components/src/components/{catalogProvision/wizard/adapters/computeInstance => vm/CreateWizard/steps}/VmNetworkingStep.tsx (72%) create mode 100644 libs/ui-components/src/components/vm/CreateWizard/steps/VmReview.tsx create mode 100644 libs/ui-components/src/components/vm/CreateWizard/values.ts delete mode 100644 libs/ui-components/src/pages/tenant/BareMetalCreatePage.tsx delete mode 100644 libs/ui-components/src/pages/tenant/ClusterCreatePage.tsx delete mode 100644 libs/ui-components/src/pages/tenant/VmCreatePage.tsx rename libs/ui-components/src/{components/catalogProvision/wizard/metadataNameSchema.ts => validation/name.ts} (82%) create mode 100644 libs/ui-components/src/validation/ssh-public-key.ts 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..f52544d4 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}})", @@ -106,14 +56,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 +80,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 +102,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 +116,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 +141,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 +159,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 +177,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 +207,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 +247,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 +254,7 @@ "Stopped": "Stopped", "Stopping": "Stopping", "Subnet": "Subnet", + "Subnet is required": "Subnet is required", "Subnets": "Subnets", "Take over": "Take over", "TCP": "TCP", @@ -297,13 +268,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 +287,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..3f363b21 --- /dev/null +++ b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/BareMetalInstanceCreateWizard.tsx @@ -0,0 +1,160 @@ +import { useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { + Breadcrumb, + BreadcrumbItem, + Bullseye, + Button, + Content, + PageSection, + PageSectionTypes, + Spinner, + Stack, + 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; + + if (catalogItemId && isLoading) { + return ( + + + + ); + } + + 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..31addb53 --- /dev/null +++ b/libs/ui-components/src/components/BareMetalInstance/CreateWizard/steps/BareMetalConfigurationStep.tsx @@ -0,0 +1,51 @@ +import { useFormikContext } from 'formik'; +import { 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..a624befb 100644 --- a/libs/ui-components/src/components/Cluster/ClusterStatusLabel.tsx +++ b/libs/ui-components/src/components/Cluster/ClusterStatusLabel.tsx @@ -11,6 +11,8 @@ const CLUSTER_STATUS_MAP: Record { 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:
Cluster details route
}, + ], + { initialEntries: ['/clusters/create'] }, + ); + + const view = render( + + + + + + + , + ); + + return { ...view, user: userEvent.setup(), router }; +}; const fillClusterGeneralStep = async ( user: UserEvent, @@ -21,15 +75,11 @@ const fillClusterGeneralStep = async ( fireEvent.change(pullSecretInput, { target: { value: pullSecret } }); }; -const fillClusterNodeSetRow = async (user: UserEvent, hostTypeLabel = 'ACME 1TB', size = '3') => { +const fillClusterNodeSetRow = async (_user: UserEvent) => { await waitFor(() => { - expect(screen.getByText('Node set 1')).toBeInTheDocument(); + expect(screen.getByText('Node Sets')).toBeInTheDocument(); }); - await user.click(screen.getByLabelText(/^Host type/)); - await user.click(screen.getByRole('option', { name: hostTypeLabel })); - const sizeInput = screen.getByRole('spinbutton', { name: /^Nodes/ }); - await user.clear(sizeInput); - await user.type(sizeInput, size); + expect(screen.getByRole('spinbutton', { name: /compute size/ })).toBeInTheDocument(); }; const catalogItemGroup = () => screen.getByRole('radiogroup', { name: 'Catalog item' }); @@ -180,20 +230,7 @@ describe('ClusterCreatePage', () => { }; }); - const { user } = renderWithProviders( - - } /> - Cluster details {createdCluster.id}} - /> - , - { - routerEntries: ['/clusters/create'], - apiFixtures, - transportOverrides: { onClusterCreate }, - }, - ); + const { user } = renderWithDataRouter(apiFixtures, { onClusterCreate }); await selectCatalogItem(user, clusterCatalogItem.title); await clickWizardNext(user); @@ -208,7 +245,7 @@ describe('ClusterCreatePage', () => { await user.click(screen.getByRole('button', { name: 'Create' })); await waitFor(() => { - expect(screen.getByText(`Cluster details ${createdCluster.id}`)).toBeInTheDocument(); + expect(screen.getByText('Cluster details route')).toBeInTheDocument(); }); expect(onClusterCreate).toHaveBeenCalledTimes(1); diff --git a/libs/ui-components/src/components/Cluster/CreateWizard/ClusterCreateWizard.tsx b/libs/ui-components/src/components/Cluster/CreateWizard/ClusterCreateWizard.tsx new file mode 100644 index 00000000..0508e8c3 --- /dev/null +++ b/libs/ui-components/src/components/Cluster/CreateWizard/ClusterCreateWizard.tsx @@ -0,0 +1,157 @@ +import { useState } from 'react'; +import { useNavigate, useParams } from 'react-router-dom'; +import { + Breadcrumb, + BreadcrumbItem, + Bullseye, + Button, + Content, + PageSection, + PageSectionTypes, + Spinner, + Stack, + Title, + Wizard, + WizardStep, + WizardStepType, +} from '@patternfly/react-core'; +import { Formik } from 'formik'; + +import { useClusterTemplates } from '@osac/ui-components/api/v1/cluster-templates'; + +import { buildClusterCreatePayload } from './payload'; +import ClusterConfigurationStep from './steps/ClusterConfigurationStep'; +import ClusterGeneralStep from './steps/ClusterGeneralStep'; +import ClusterNetworkingStep from './steps/ClusterNetworkingStep'; +import { ClusterReview } from './steps/ClusterReview'; +import { buildFullClusterSchema, clusterStepHasErrors } from './validation'; +import { type ClusterWizardValues, buildClusterInitialValues } from './values'; +import { useProvisionCluster } from '../../../api/v1/cluster'; +import { useClusterCatalogItems } from '../../../api/v1/cluster-catalog-item'; +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'; + +const ClusterCreateWizard = () => { + const navigate = useNavigate(); + const { t } = useTranslation(); + const { catalogItemId } = useParams<{ catalogItemId?: string }>(); + const { data: catalogItems = [], isLoading, error, refetch } = useClusterCatalogItems(); + const provisionCluster = useProvisionCluster(); + const [currentStep, setCurrentStep] = useState(); + + const { data: clusterTemplates, isLoading: templatesLoading } = useClusterTemplates(); + + const initialItem = catalogItemId + ? catalogItems.find((item) => item.id === catalogItemId) + : undefined; + + if ((catalogItemId && isLoading) || templatesLoading) { + return ( + + + + ); + } + + const initialValues = buildClusterInitialValues(initialItem, clusterTemplates); + + const onSubmit = async ( + values: ClusterWizardValues, + helpers: { setStatus: (status: unknown) => void }, + ) => { + try { + const cluster = await provisionCluster.mutateAsync(buildClusterCreatePayload(values)); + navigate(`/clusters/${cluster?.id}`); + } catch (err) { + helpers.setStatus({ + provisionError: + err instanceof Error ? err.message : t('Provisioning failed. Please try again.'), + }); + } + }; + + return ( + + {(formik) => ( + <> + + + + + + + {t('Create cluster')} + + + {t('Create cluster')} + + + {t('Select a catalog item, configure, and provision an OpenShift cluster.')} + + + + + + + navigate('/clusters')} + stepHasErrors={clusterStepHasErrors} + /> + } + onStepChange={(_, step) => { + setCurrentStep(step); + }} + > + + {(!currentStep || currentStep?.id === 'catalog') && ( + void refetch()} + onSelect={(item) => { + formik.resetForm({ + values: buildClusterInitialValues(item, clusterTemplates), + }); + }} + /> + )} + + + {currentStep?.id === 'general' && } + + + {currentStep?.id === 'configuration' && } + + + {currentStep?.id === 'networking' && } + + + {currentStep?.id === 'review' && } + + + + + + )} + + ); +}; + +export default ClusterCreateWizard; diff --git a/libs/ui-components/src/components/Cluster/CreateWizard/payload.ts b/libs/ui-components/src/components/Cluster/CreateWizard/payload.ts new file mode 100644 index 00000000..56323b7f --- /dev/null +++ b/libs/ui-components/src/components/Cluster/CreateWizard/payload.ts @@ -0,0 +1,74 @@ +import type { MessageInitShape } from '@bufbuild/protobuf'; + +import { ClusterSchema } from '@osac/types'; + +import type { ClusterWizardValues } from './values'; +import { isFieldEditable } from '../../catalogProvision/utils'; + +export const buildClusterCreatePayload = ( + values: ClusterWizardValues, +): MessageInitShape => { + const fds = values.catalogItem?.fieldDefinitions || []; + + const cluster: MessageInitShape = { + metadata: { name: values.metadata.name }, + spec: { + catalogItem: values.catalogItem?.id, + }, + }; + + if (cluster.spec) { + if (isFieldEditable('release_image', fds)) { + cluster.spec.releaseImage = values.spec.releaseImage; + } + + if (isFieldEditable('pull_secret', fds)) { + cluster.spec.pullSecret = values.spec.pullSecret; + } + + if (isFieldEditable('ssh_public_key', fds)) { + cluster.spec.sshPublicKey = values.spec.sshPublicKey; + } + + if (isFieldEditable('network.pod_cidr', fds)) { + cluster.spec.network = { + ...cluster.spec.network, + podCidr: values.spec.network.podCidr, + }; + } + + if (isFieldEditable('network.service_cidr', fds)) { + cluster.spec.network = { + ...cluster.spec.network, + serviceCidr: values.spec.network.serviceCidr, + }; + } + + if (isFieldEditable('node_sets', fds)) { + const nodeSets = values.spec.nodeSetRows.reduce( + (acc, curr) => { + acc[curr.name] = { + size: curr.size, + }; + return acc; + }, + {} as { [key: string]: { size: number } }, + ); + + cluster.spec.nodeSets = nodeSets; + } + + for (const nodeSet of values.spec.nodeSetRows) { + if (isFieldEditable(`node_sets.${nodeSet.name}.size`, fds)) { + cluster.spec.nodeSets = { + ...(cluster.spec.nodeSets || {}), + [nodeSet.name]: { + size: nodeSet.size, + }, + }; + } + } + } + + return cluster; +}; diff --git a/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterConfigurationStep.tsx b/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterConfigurationStep.tsx new file mode 100644 index 00000000..7daf6e5e --- /dev/null +++ b/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterConfigurationStep.tsx @@ -0,0 +1,54 @@ +import { FormSection, Stack, StackItem } from '@patternfly/react-core'; +import { useFormikContext } from 'formik'; + +import { isFieldEditable } from '@osac/ui-components/components/catalogProvision/utils'; + +import { useTranslation } from '../../../../hooks/useTranslation'; +import { InputField } from '../../../Form/InputField'; +import OsacForm from '../../../Form/OsacForm'; +import { type ClusterWizardValues } from '../values'; + +const ClusterConfigurationStep = () => { + const { t } = useTranslation(); + const { values } = useFormikContext(); + + if (!values.catalogItem) { + return null; + } + + return ( + + + + + + {values.spec.nodeSetRows.map((ns, index) => ( + + ))} + + + + + ); +}; + +export default ClusterConfigurationStep; diff --git a/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterGeneralStep.tsx b/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterGeneralStep.tsx new file mode 100644 index 00000000..aab8ac99 --- /dev/null +++ b/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterGeneralStep.tsx @@ -0,0 +1,52 @@ +import { useFormikContext } from 'formik'; + +import { FieldDefinition } from '@osac/types'; +import NameField from '@osac/ui-components/components/catalogProvision/NameField'; +import SshKeyField from '@osac/ui-components/components/catalogProvision/SshKeyField'; +import { isFieldEditable } from '@osac/ui-components/components/catalogProvision/utils'; +import { InputField } from '@osac/ui-components/components/Form/InputField'; + +import { useTranslation } from '../../../../hooks/useTranslation'; +import OsacForm from '../../../Form/OsacForm'; +import { type ClusterWizardValues } from '../values'; + +interface PullSecretFieldProps { + fieldDefinitions: FieldDefinition[]; +} + +const PullSecretField = ({ fieldDefinitions }: PullSecretFieldProps) => { + const { t } = useTranslation(); + + return ( + + ); +}; + +const ClusterGeneralStep = () => { + const { values } = useFormikContext(); + if (!values.catalogItem) { + return null; + } + + return ( + + + + + + ); +}; + +export default ClusterGeneralStep; diff --git a/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterNetworkingStep.tsx b/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterNetworkingStep.tsx new file mode 100644 index 00000000..d9c4ccb1 --- /dev/null +++ b/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterNetworkingStep.tsx @@ -0,0 +1,45 @@ +import { Stack, StackItem } from '@patternfly/react-core'; +import { useFormikContext } from 'formik'; + +import { isFieldEditable } from '@osac/ui-components/components/catalogProvision/utils'; + +import { useTranslation } from '../../../../hooks/useTranslation'; +import { InputField } from '../../../Form/InputField'; +import OsacForm from '../../../Form/OsacForm'; +import { type ClusterWizardValues } from '../values'; + +const ClusterNetworkingStep = () => { + const { t } = useTranslation(); + const { values } = useFormikContext(); + + if (!values.catalogItem) { + return null; + } + + const fds = values.catalogItem.fieldDefinitions; + + return ( + + + + + + + + + ); +}; + +export default ClusterNetworkingStep; diff --git a/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterReview.tsx b/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterReview.tsx new file mode 100644 index 00000000..ff80132e --- /dev/null +++ b/libs/ui-components/src/components/Cluster/CreateWizard/steps/ClusterReview.tsx @@ -0,0 +1,49 @@ +import { + DescriptionList, + DescriptionListDescription, + DescriptionListGroup, + DescriptionListTerm, +} from '@patternfly/react-core'; +import { useFormikContext } from 'formik'; + +import { useTranslation } from '../../../../hooks/useTranslation'; +import type { ClusterWizardValues } from '../values'; + +const formatNodeSetsForReview = ( + nodeSetRows: ClusterWizardValues['spec']['nodeSetRows'], +): string => { + if (nodeSetRows.length === 0) { + return '-'; + } + return nodeSetRows.map((row) => `${row.name}: ${row.size}`).join(', '); +}; + +export const ClusterReview = () => { + const { t } = useTranslation(); + const { values } = useFormikContext(); + + const rows = [ + { label: t('Name'), value: values.metadata.name }, + { label: t('SSH public key'), value: values.spec.sshPublicKey || '-' }, + { label: t('Pull secret'), value: values.spec.pullSecret ? t('Pull secret set') : '-' }, + { label: t('Release image'), value: values.spec.releaseImage || '-' }, + { label: t('Node sets'), value: formatNodeSetsForReview(values.spec.nodeSetRows) }, + { label: t('Pod CIDR'), value: values.spec.network.podCidr || '-' }, + { label: t('Service CIDR'), value: values.spec.network.serviceCidr || '-' }, + ]; + + return ( + + + {t('Catalog item')} + {values.catalogItem?.title ?? '—'} + + {rows.map((row) => ( + + {row.label} + {row.value} + + ))} + + ); +}; diff --git a/libs/ui-components/src/components/Cluster/CreateWizard/validation.ts b/libs/ui-components/src/components/Cluster/CreateWizard/validation.ts new file mode 100644 index 00000000..6277930a --- /dev/null +++ b/libs/ui-components/src/components/Cluster/CreateWizard/validation.ts @@ -0,0 +1,117 @@ +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 { buildClusterCreatePayload } from './payload'; +import type { ClusterNodeSetRow, ClusterWizardValues } from './values'; +import { buildCidrSchema, cidrsOverlap, isValidCidr } from '../../../validation/cidr-validation'; +import { buildFieldSchema } from '../../catalogProvision/validation'; + +export const buildFullClusterSchema = (t: TFunction) => { + return Yup.lazy((values: ClusterWizardValues) => { + const fds = values.catalogItem?.fieldDefinitions || []; + const payload = buildClusterCreatePayload(values); + const snakeSpec = camelKeysToSnake(payload.spec ?? {}) as Record; + const fieldSchema = buildFieldSchema(snakeSpec, fds); + + return Yup.object({ + catalogItem: Yup.object().required(t('Select a catalog item')), + metadata: Yup.object({ + name: buildMetadataNameSchema(t), + }), + spec: Yup.object({ + sshPublicKey: fieldSchema('ssh_public_key', sshPublicKeySchema(t)), + pullSecret: fieldSchema( + 'pull_secret', + Yup.string() + .trim() + .required(t('Pull secret is required')) + .test( + 'pull-secret', + t( + 'Invalid pull secret format. Paste the complete JSON from your Red Hat account pull secret.', + ), + (value) => { + try { + const pullSecret = JSON.parse(value) as { auths?: unknown }; + return ( + pullSecret !== null && + typeof pullSecret === 'object' && + pullSecret.auths !== null && + typeof pullSecret.auths === 'object' + ); + } catch { + return false; + } + }, + ), + ), + releaseImage: fieldSchema( + 'release_image', + Yup.string().trim().required(t('Release image is required')), + ), + nodeSetRows: Yup.array().of( + Yup.lazy((row: ClusterNodeSetRow) => { + return Yup.object({ + name: Yup.string().trim().required(t('Node set name is required')), + size: fieldSchema( + `node_sets.${row.name}.size`, + Yup.number() + .min(1, t('Pool size must be greater than zero')) + .required(t('Pool size is required')), + ), + }); + }), + ), + network: Yup.object({ + podCidr: fieldSchema( + 'network.pod_cidr', + buildCidrSchema(t, 'ipv4').required(t('This field is required')), + ), + serviceCidr: fieldSchema( + 'network.service_cidr', + buildCidrSchema(t, 'ipv4') + .required(t('This field is required')) + .test( + 'service-cidr-no-overlap', + t('Service CIDR must not overlap the pod CIDR.'), + function (value) { + const parent = this.parent as { podCidr?: string } | undefined; + const podCidr = parent?.podCidr ?? ''; + if (!value?.trim() || !podCidr.trim()) { + return true; + } + if (!isValidCidr(value, 'ipv4') || !isValidCidr(podCidr, 'ipv4')) { + return true; + } + return !cidrsOverlap(podCidr, value, 'ipv4'); + }, + ), + ), + }), + }), + }); + }); +}; + +export const clusterStepHasErrors = ( + stepId: string, + errors: FormikErrors, +): boolean => { + switch (stepId) { + case 'catalog': + return Boolean(errors.catalogItem); + case 'general': + return Boolean(errors.metadata?.name || errors.spec?.sshPublicKey || errors.spec?.pullSecret); + case 'configuration': + return Boolean(errors.spec?.releaseImage || errors.spec?.nodeSetRows); + case 'networking': + return Boolean(errors.spec?.network); + default: + return false; + } +}; diff --git a/libs/ui-components/src/components/Cluster/CreateWizard/values.ts b/libs/ui-components/src/components/Cluster/CreateWizard/values.ts new file mode 100644 index 00000000..13ba7233 --- /dev/null +++ b/libs/ui-components/src/components/Cluster/CreateWizard/values.ts @@ -0,0 +1,105 @@ +import type { ClusterCatalogItem, ClusterTemplate } from '@osac/types'; + +import { getNumberDefaultValue, getStringDefaultValue } from '../../catalogProvision/utils'; +import { clearSchemaCache } from '../../catalogProvision/validation'; + +export interface ClusterNodeSetRow { + name: string; + size: number; +} + +export interface ClusterWizardValues { + catalogItem: ClusterCatalogItem | undefined; + metadata: { + name: string; + }; + spec: { + sshPublicKey: string; + pullSecret: string; + releaseImage: string; + nodeSetRows: ClusterNodeSetRow[]; + network: { + podCidr: string; + serviceCidr: string; + }; + }; +} + +export const createEmptyClusterValues = ( + catalogItem: ClusterCatalogItem | undefined, +): ClusterWizardValues => ({ + catalogItem, + metadata: { name: '' }, + spec: { + sshPublicKey: '', + pullSecret: '', + releaseImage: '', + nodeSetRows: [], + network: { + podCidr: '', + serviceCidr: '', + }, + }, +}); + +export const buildClusterInitialValues = ( + item: ClusterCatalogItem | undefined, + clusterTemplates: ClusterTemplate[] | undefined, +): ClusterWizardValues => { + clearSchemaCache(); + const base = createEmptyClusterValues(item); + if (!item) { + return base; + } + + const sshDefault = getStringDefaultValue('ssh_public_key', item.fieldDefinitions); + if (sshDefault) { + base.spec.sshPublicKey = sshDefault; + } + + const pullSecretDefault = getStringDefaultValue('pull_secret', item.fieldDefinitions); + if (pullSecretDefault) { + base.spec.pullSecret = pullSecretDefault; + } + + const releaseImageDefault = getStringDefaultValue('release_image', item.fieldDefinitions); + if (releaseImageDefault) { + base.spec.releaseImage = releaseImageDefault; + } + + const podCidrDefault = getStringDefaultValue('network.pod_cidr', item.fieldDefinitions); + if (podCidrDefault) { + base.spec.network.podCidr = podCidrDefault; + } + + const serviceCidrDefault = getStringDefaultValue('network.service_cidr', item.fieldDefinitions); + if (serviceCidrDefault) { + base.spec.network.serviceCidr = serviceCidrDefault; + } + + const clusterNodeSets = clusterTemplates?.find((t) => t.id === item.template)?.nodeSets || {}; + + const nodeSetRows: ClusterNodeSetRow[] = Object.keys(clusterNodeSets).map((nodeSet) => ({ + name: nodeSet, + size: clusterNodeSets[nodeSet].size, + })); + + for (const fd of item.fieldDefinitions) { + if (fd.path.startsWith('node_sets.')) { + const parts = fd.path.split('.'); + const nodeSetKey = parts[1]; + const defSize = getNumberDefaultValue(`node_sets.${nodeSetKey}.size`, item.fieldDefinitions); + + if (defSize !== undefined) { + const nodeSet = nodeSetRows.find(({ name }) => name === nodeSetKey); + if (nodeSet) { + nodeSet.size = defSize; + } + } + } + } + + base.spec.nodeSetRows = nodeSetRows; + + return base; +}; diff --git a/libs/ui-components/src/components/Form/FieldValidationContext.tsx b/libs/ui-components/src/components/Form/FieldValidationContext.tsx index 8ff9aa81..2b51c153 100644 --- a/libs/ui-components/src/components/Form/FieldValidationContext.tsx +++ b/libs/ui-components/src/components/Form/FieldValidationContext.tsx @@ -1,7 +1,23 @@ -import { createContext, useContext } from 'react'; +import type { ReactNode } from 'react'; +import { createContext, useContext, useState } from 'react'; -const FieldValidationContext = createContext(false); +interface FieldValidationContextValue { + showErrors: boolean; + setShowErrors: (show: boolean) => void; +} -export const FieldValidationProvider = FieldValidationContext.Provider; +const FieldValidationContext = createContext({ + showErrors: false, + setShowErrors: () => undefined, +}); -export const useShowFieldValidationErrors = (): boolean => useContext(FieldValidationContext); +export const useFieldValidation = () => useContext(FieldValidationContext); + +export const FieldValidationProvider = ({ children }: { children: ReactNode }) => { + const [showErrors, setShowErrors] = useState(false); + return ( + + {children} + + ); +}; diff --git a/libs/ui-components/src/components/Form/InputField.tsx b/libs/ui-components/src/components/Form/InputField.tsx index 696eedbb..5952c004 100644 --- a/libs/ui-components/src/components/Form/InputField.tsx +++ b/libs/ui-components/src/components/Form/InputField.tsx @@ -2,7 +2,7 @@ import { FormGroup, TextArea, TextInput } from '@patternfly/react-core'; import { useField } from 'formik'; import { getVisibleFieldError } from './fieldError'; -import { useShowFieldValidationErrors } from './FieldValidationContext'; +import { useFieldValidation } from './FieldValidationContext'; import { FormFieldHelper, getFormFieldHelperDescribedBy } from './FormFieldHelper'; interface InputFieldProps { @@ -32,8 +32,8 @@ export const InputField = ({ helperText, onBlur, }: InputFieldProps) => { - const [field, meta] = useField(name); - const showValidationErrors = useShowFieldValidationErrors(); + const [field, meta, { setValue }] = useField(name); + const { showErrors: showValidationErrors } = useFieldValidation(); const error = getVisibleFieldError(meta, showValidationErrors); const validated = error ? 'error' : 'default'; const helperDescribedBy = getFormFieldHelperDescribedBy(fieldId, error, helperText); @@ -48,7 +48,7 @@ export const InputField = ({ rows={rows} resizeOrientation={resizeOrientation} onChange={(_event, value) => { - void field.onChange({ target: { name, value } }); + setValue(value); }} onBlur={(event) => { field.onBlur(event); @@ -66,7 +66,11 @@ export const InputField = ({ type={type} value={field.value ?? ''} onChange={(_event, value) => { - void field.onChange({ target: { name, value } }); + if (type === 'number') { + setValue(Number(value)); + } else { + setValue(value); + } }} onBlur={(event) => { field.onBlur(event); diff --git a/libs/ui-components/src/components/Form/LeaveFormConfirmation.tsx b/libs/ui-components/src/components/Form/LeaveFormConfirmation.tsx new file mode 100644 index 00000000..904bf532 --- /dev/null +++ b/libs/ui-components/src/components/Form/LeaveFormConfirmation.tsx @@ -0,0 +1,53 @@ +import { useBlocker } from 'react-router-dom'; +import { + Button, + Content, + Modal, + ModalBody, + ModalFooter, + ModalHeader, +} from '@patternfly/react-core'; +import { useFormikContext } from 'formik'; + +import { useTranslation } from '../../hooks/useTranslation'; + +/** + * Placed inside a tree, blocks React Router navigation when the form is + * dirty and not submitting, and shows a confirmation modal letting the user + * either discard changes and proceed or stay on the page. + */ +export const LeaveFormConfirmation = () => { + const { t } = useTranslation(); + const { dirty, isSubmitting } = useFormikContext(); + + const blocker = useBlocker(({ currentLocation, nextLocation }) => { + return !isSubmitting && dirty && currentLocation.pathname !== nextLocation.pathname; + }); + + if (blocker.state !== 'blocked') { + return null; + } + + return ( + + + + + {t('Are you sure you want to cancel? Your selections and entered data will be lost.')} + + + + + + + + ); +}; diff --git a/libs/ui-components/src/components/Form/MultiSelectField.tsx b/libs/ui-components/src/components/Form/MultiSelectField.tsx index 43c2e706..50dfd799 100644 --- a/libs/ui-components/src/components/Form/MultiSelectField.tsx +++ b/libs/ui-components/src/components/Form/MultiSelectField.tsx @@ -1,12 +1,11 @@ -import { useEffect, useMemo } from 'react'; +import { useEffect, useMemo, useRef } from 'react'; import { FormGroup } from '@patternfly/react-core'; import { MultiTypeaheadSelect, type MultiTypeaheadSelectOption } from '@patternfly/react-templates'; import { useField } from 'formik'; import { getVisibleFieldError } from './fieldError'; -import { useShowFieldValidationErrors } from './FieldValidationContext'; +import { useFieldValidation } from './FieldValidationContext'; import { FormFieldHelper } from './FormFieldHelper'; -import { type LabeledResourceRef } from './labeledResourceRef'; import type { SelectFieldOption } from './SelectField'; interface MultiSelectFieldProps { @@ -37,46 +36,38 @@ export const MultiSelectField = ({ noOptionsFoundMessage = (filter) => `No options found for "${filter}"`, autoSelectSingleOption = false, }: MultiSelectFieldProps) => { - const [field, meta, helpers] = useField(name); - const showValidationErrors = useShowFieldValidationErrors(); + const [field, meta, helpers] = useField<(string | number)[] | undefined>(name); + const { showErrors: showValidationErrors } = useFieldValidation(); const error = getVisibleFieldError(meta, showValidationErrors); const validated = error ? 'error' : 'default'; const effectivePlaceholder = isLoading ? loadingPlaceholder : placeholder; const controlDisabled = isDisabled || isLoading; - const selectedValues = useMemo( - () => (Array.isArray(field.value) ? field.value : []), - [field.value], - ); + const defaultSelectedRef = useRef(false); useEffect(() => { if ( + defaultSelectedRef.current || !autoSelectSingleOption || isLoading || isDisabled || options.length !== 1 || - selectedValues.length > 0 + (field.value?.length || 0) > 0 ) { return; } - void helpers.setValue([{ value: options[0].value, label: options[0].label }], false); - }, [autoSelectSingleOption, helpers, isDisabled, isLoading, options, selectedValues.length]); + defaultSelectedRef.current = true; + void helpers.setValue([options[0].value], false); + }, [autoSelectSingleOption, helpers, isDisabled, isLoading, options, field.value?.length]); const initialOptions = useMemo(() => { return options.map((option) => ({ content: option.label, value: option.value, - selected: selectedValues.some((value) => value.value === option.value), + selected: field.value?.some((value) => value === option.value), isDisabled: option.isDisabled, })); - }, [options, selectedValues]); - - const toLabeledResourceRefs = (selections: (string | number)[]) => - selections.map((selection) => { - const value = String(selection); - const option = options.find((entry) => entry.value === value); - return option ? { value: option.value, label: option.label } : { value, label: value }; - }); + }, [options, field.value]); return ( @@ -87,7 +78,7 @@ export const MultiSelectField = ({ isDisabled={controlDisabled} noOptionsFoundMessage={noOptionsFoundMessage} onSelectionChange={(_event, selections) => { - void helpers.setValue(toLabeledResourceRefs(selections), true); + void helpers.setValue(selections, true); void helpers.setTouched(true); }} onToggle={(open) => { diff --git a/libs/ui-components/src/components/Form/RadioButtonField.tsx b/libs/ui-components/src/components/Form/RadioButtonField.tsx index 2b032462..0ec29c24 100644 --- a/libs/ui-components/src/components/Form/RadioButtonField.tsx +++ b/libs/ui-components/src/components/Form/RadioButtonField.tsx @@ -2,7 +2,7 @@ import { FormGroup, Radio } from '@patternfly/react-core'; import { useField } from 'formik'; import { getVisibleFieldError } from './fieldError'; -import { useShowFieldValidationErrors } from './FieldValidationContext'; +import { useFieldValidation } from './FieldValidationContext'; import { FormFieldHelper } from './FormFieldHelper'; export interface RadioButtonFieldOption { @@ -30,7 +30,7 @@ export const RadioButtonField = ({ isInline = false, }: RadioButtonFieldProps) => { const [field, meta] = useField(name); - const showValidationErrors = useShowFieldValidationErrors(); + const { showErrors: showValidationErrors } = useFieldValidation(); const error = getVisibleFieldError(meta, showValidationErrors); const stringValue = field.value === true ? 'true' : field.value === false ? 'false' : String(field.value ?? ''); diff --git a/libs/ui-components/src/components/Form/SelectField.test.tsx b/libs/ui-components/src/components/Form/SelectField.test.tsx index 72472499..3645e762 100644 --- a/libs/ui-components/src/components/Form/SelectField.test.tsx +++ b/libs/ui-components/src/components/Form/SelectField.test.tsx @@ -4,26 +4,24 @@ import { Formik, type FormikErrors } from 'formik'; import { describe, expect, it } from 'vitest'; import * as yup from 'yup'; -import { EMPTY_LABELED_RESOURCE_REF, type LabeledResourceRef } from './labeledResourceRef'; -import { labeledResourceRefSchema } from './labeledResourceRefSchema'; import { SelectField } from './SelectField'; const renderSelect = ({ autoSelectSingleOption = false, - initialValue = EMPTY_LABELED_RESOURCE_REF, + initialValue = '', isLoading = false, }: { autoSelectSingleOption?: boolean; - initialValue?: LabeledResourceRef; + initialValue?: string; isLoading?: boolean; } = {}) => { - let latestErrors: FormikErrors<{ kind: LabeledResourceRef }> = {}; + let latestErrors: FormikErrors<{ kind: string }> = {}; render( undefined} > @@ -39,7 +37,7 @@ const renderSelect = ({ placeholder="Select a kind" options={[{ value: 'only-option', label: 'Only option label' }]} /> - {values.kind.value || '(empty)'} + {values.kind || '(empty)'}