Skip to content

OSAC-2675: Design for BareMetalInstanceTypes - #119

Merged
openshift-merge-bot[bot] merged 12 commits into
osac-project:mainfrom
ajamias:design/OSAC-1201
Jul 28, 2026
Merged

openshift-merge-bot[bot] merged 12 commits into
osac-project:mainfrom
ajamias:design/OSAC-1201

Conversation

@ajamias

@ajamias ajamias commented Jul 15, 2026 •

Copy link
Copy Markdown
Contributor

Introduces the BareMetalInstanceType design document covering:

  • Label-based host selection model (Cloud Infra Admin labels hosts, Cloud Provider Admin creates BareMetalInstanceTypes with host_label)
  • BMaaS operator maps host_label to inventory hosts at provisioning time
  • Public/private gRPC API design in fulfillment-service
  • BareMetalInstanceType proto schema with comprehensive hardware metadata
  • Integration with BareMetalInstance and Cluster creation workflows

Assisted-by: Claude Code noreply@anthropic.com

Summary by CodeRabbit

  • New Features
    • Added a design for tenant-discoverable bare metal instance types, including hardware specifications and host selection criteria.
    • Defined workflows for administrators to manage instance types and for tenants to discover and select them during provisioning.
    • Added the ability for bare metal instances to reference an instance type and use its resolved host-selection settings.
    • Documented validation, failure handling, security, observability, and compatibility requirements.

@coderabbitai

coderabbitai Bot commented Jul 15, 2026 •

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review

Walkthrough

Adds an OSAC-1201 design for tenant-discoverable bare-metal instance types, including public/private APIs, protobuf schemas, host-label-based provisioning, fulfillment-service storage and controllers, security, observability, testing, and rollout behavior.

Changes

Bare Metal Instance Types

Layer / File(s) Summary
Scope and provisioning workflows
enhancements/OSAC-1201-baremetal-instance-types/design.md
Defines terminology, goals, administrative setup, tenant discovery, host allocation, and failure handling.
API and resource integration
enhancements/OSAC-1201-baremetal-instance-types/design.md
Specifies public and private gRPC services, hardware protobuf structures, database storage, instance_type resolution, and host-label selection.
Security and operations
enhancements/OSAC-1201-baremetal-instance-types/design.md
Documents authorization, tenancy, validation, reconciliation, failure behavior, metrics, events, and logging.
Adoption and support planning
enhancements/OSAC-1201-baremetal-instance-types/design.md
Describes risks, alternatives, open questions, tests, compatibility, upgrade paths, support, infrastructure, and provenance.

Estimated code review effort: 2 (Simple) | ~10 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Tenant
  participant FulfillmentService
  participant BareMetalFulfillmentOperator
  participant InventoryBackend
  Tenant->>FulfillmentService: List and select BareMetalInstanceType
  Tenant->>FulfillmentService: Request BareMetalInstance
  FulfillmentService->>BareMetalFulfillmentOperator: Resolve instance_type
  BareMetalFulfillmentOperator->>InventoryBackend: FindFreeHost using host_label_selector
  InventoryBackend-->>BareMetalFulfillmentOperator: Return matching host
  BareMetalFulfillmentOperator-->>FulfillmentService: Report provisioning status
Loading

Possibly related PRs

Suggested labels: approved, lgtm

🚥 Pre-merge checks | ✅ 11
✅ Passed checks (11 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly matches the main change: a design document for BareMetalInstanceTypes.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
No-Hardcoded-Secrets ✅ Passed Reviewed the only changed design doc and found no hardcoded secrets, credential literals, private keys, or embedded-credential URLs.
No-Weak-Crypto ✅ Passed The only changed file is a design doc, and searches found no MD5/SHA1/DES/RC4/3DES/Blowfish/ECB, custom crypto, or secret-comparison code.
No-Injection-Vectors ✅ Passed Diff is documentation-only; no SQL concatenation, eval/exec, shell=True, yaml.load, os.system, or innerHTML patterns found.
Container-Privileges ✅ Passed No container/K8s manifests were changed, and no privileged/hostNetwork/SYS_ADMIN/allowPrivilegeEscalation settings were found in the diff.
No-Sensitive-Data-In-Logs ✅ Passed The doc’s only log fields are type name and label selector; no passwords, tokens, PII, hostnames, or customer data are logged.
Ai-Attribution ✅ Passed AI use is acknowledged with Assisted-by trailers in the PR commits/description, and no Co-Authored-By AI trailer was found.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-119

Score: 8/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Highly feasible. The design reuses existing OSAC patterns (DAO, gRPC, CEL filtering, tenant isolation) and the inventory.Client interface already supports matchExpressions in FindFreeHost, requiring n
Testability 2/2 Comprehensive multi-level test plan covering unit tests (CRUD, validation, reconciler with mocked inventory, status conditions), integration tests (end-to-end provisioning, invalid references, host se
Scope 2/2 Well-defined boundaries with clear goals and explicit non-goals (no auto-discovery, no billing, no multi-backend collision handling, no deprecation workflows). The enhancement is focused on a single p
Architecture 2/2 Sound architecture following established OSAC resource management patterns. Clean separation of concerns: type catalog lives in fulfillment-service, host selection logic stays in the operator where it

Verdict: A well-structured, thorough enhancement proposal that follows established OSAC patterns, provides detailed proto schemas and workflow descriptions, and addresses error handling, version skew, and security comprehensively—minor gaps in template conformance (missing User Stories section) and a field requiredness ambiguity do not undermine the design's overall quality.

Feedback: Clarify the validation semantics for the instance_type field on BareMetalInstanceSpec: the proposal states it is 'required' while also promising backward compatibility with existing catalog_item-only workflows—specify whether this is enforced at the API layer (proto validation, admission) or only at the operator level, and what happens when an older client omits it. Add explicit User Stories in the standard 'As a [role], I want to [action] so that [goal]' format as the template expects—the workflow descriptions are good but user stories help reviewers quickly validate that all personas' needs are met. Resolve Open Question #1 (label format: free-form string vs namespaced key-value) before finalizing the proto schema, since changing host_label semantics after GA would be a breaking change.

Critical (0)

None.

Important (3)

  1. The instance_type field is described as 'required' in BareMetalInstanceSpec (line 219) while backward compatibility with existing catalog_item-only creation is a stated goal (line 44). The proposal needs to specify the exact validation behavior: is instance_type enforced at API admission (breaking existing clients) or only at the operator level (allowing API creation without it)? This ambiguity could lead to inconsistent implementations across fulfillment-service and operator.
  2. Open Question Bump actions/setup-python from 5 to 6 #1 (label format, lines 417-419) has significant API implications: the host_label field type, the FindFreeHost matchExpression format, and all inventory backend implementations depend on whether labels are free-form strings or namespaced key-value pairs. This should be resolved before the proto schema is finalized since changing it post-GA would be a breaking change.
  3. The User Stories section required by the template is absent. While the Workflow Description section effectively describes actor interactions, formal user stories ('As a [role], I want to [action] so that [goal]') are expected by the template and help reviewers quickly validate that all personas' needs are addressed.

Suggestions (3)

  1. Consider adding an explicit 'Operational Aspects of API Extensions' section as referenced in the template—operational impact details are currently scattered across multiple sections (lines 132-135, 335-350, 489-499) and consolidating them would improve reviewability.
  2. The BareMetalAcceleratorSpec (lines 191-196) includes an optional count field in the YAML example (line 256) but not in the proto definition. If count is needed to represent multi-GPU configurations, add it to the proto; if not, remove it from the example to avoid confusion.
  3. Document the expected behavior when a BareMetalInstanceType is updated (e.g., host_label changed) while BareMetalInstances referencing it are already provisioned or mid-provisioning. The proposal covers deletion during provisioning (Test Plan, line 453) but not updates.

Review cost

Model: claude-opus-4-6
Cost: $0.3541
Tokens: 6.1k in / 3.6k out
Cache: 100.6k read
Active time: 1m 24s
API calls: 0

@github-actions github-actions Bot added the rfe-creator-auto-reviewed EP was reviewed by AI label Jul 15, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 9

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@enhancements/baremetal-instance-types/README.md`:
- Around line 199-214: The BareMetalInstanceSpec proposal must define a single
compatibility contract for instance_type rather than relying on proto3
requiredness. Update the BareMetalInstance integration documentation and
corresponding sections around the operator behavior to specify explicit
validation and precedence: use catalog-item-only provisioning only when
instance_type is absent, and reject or hold requests that require label
selection when the operator does not support instance_type.
- Around line 185-190: Update BareMetalAcceleratorSpec and its README example
consistently so dual accelerators can be represented: add a validated count
field to the schema and use it for the documented A100 example, or model
accelerators as repeated entries. Ensure the chosen representation is valid in
the schema and matches the example’s API usage.
- Around line 126-128: Update the Operational Impact statements in the README to
remove the claim that Fulfillment Service downtime never affects in-flight
provisioning. Either narrow the guarantee to listing and new instance creation,
or document and implement a durably persisted/cached resolved selector with
explicit recovery behavior across reconciliation and operator restart.
- Around line 76-81: Update the Tenant Usage Workflow and the related
ClusterTemplateNodeSet documentation to designate one canonical field for
cluster node-set selection. Explicitly document how legacy host_type and
bare_metal_instance_type inputs translate to that field, including precedence
when multiple fields are supplied, and ensure the client and catalog-item
guidance uses the same contract.
- Around line 143-160: Add explicit validation invariants for
BareMetalInstanceTypeSpec, BareMetalHardwareSpec, and the related CPU, memory,
storage, accelerator, and network-port fields: require non-empty host_label,
enforce positive capacities and valid core counts, and constrain architecture,
device, and interface values to supported enums. Apply the same validation rules
to selector fields referenced around the additional section, and ensure
malformed data is rejected as promised by the security documentation.
- Around line 410-420: Add a blank line immediately after each Open Questions
subsection heading in the README, including “1. Label Format and Namespace,” “2.
Label Validation at Type Creation Time,” and “3. Integration Simplification
Strategy,” while leaving the surrounding question content unchanged.
- Around line 217-226: Define the canonical selector contract before documenting
the label-based flow: reconcile the proposed {"label": host_label} usage with
the existing FindFreeHost match-expression keys, including hostType and
backend-specific mappings. Explicitly specify the supported selector key and its
exact translation in both OpenStack and Metal3, then update the affected README
sections so the API and backend behavior are consistent.
- Around line 275-284: Update the Security Considerations section to specify
Fulfillment Service-owned authentication and per-RPC authorization, including
method-specific permissions for listing, selecting, creating, updating, and
deleting BareMetalInstanceTypes. Document tenant filtering for global versus
tenant-scoped types and validation of referenced resources during create
operations, and state that these controls are enforced in the Fulfillment
Service rather than relying solely on annotations, RBAC, or OPA policies.
- Around line 306-309: Update the host-selection flow described under
“Idempotency Guarantees” to make claiming crash-safe across retries: introduce a
durable idempotency key or lease lookup that recovers an existing assignment
before calling FindFreeHost or AssignHost, and persist or make immutable the
resolved host_label for each BareMetalInstance so retries reuse the original
host.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 15ddb21a-0c12-481c-ac14-a9e67a0b9621

📥 Commits

Reviewing files that changed from the base of the PR and between 376f6a2 and 2f38e00.

📒 Files selected for processing (1)
  • enhancements/baremetal-instance-types/README.md

Comment thread enhancements/baremetal-instance-types/README.md Outdated
Comment thread enhancements/OSAC-1201-baremetal-instance-types/design.md
Comment thread enhancements/OSAC-1201-baremetal-instance-types/design.md
Comment thread enhancements/OSAC-1201-baremetal-instance-types/design.md
Comment thread enhancements/OSAC-1201-baremetal-instance-types/design.md
Comment thread enhancements/baremetal-instance-types/README.md Outdated
Comment thread enhancements/baremetal-instance-types/README.md Outdated
Comment thread enhancements/OSAC-1201-baremetal-instance-types/README.md Outdated
Comment thread enhancements/OSAC-1201-baremetal-instance-types/README.md Outdated
@ajamias ajamias changed the title Design: Bare Metal Instance Types (OSAC-1201) OSAC-1201: Design for BareMetalInstanceTypes Jul 15, 2026
@openshift-ci-robot

openshift-ci-robot commented Jul 15, 2026 •

Copy link
Copy Markdown

@ajamias: This pull request references OSAC-1201 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the feature to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Introduces the BareMetalInstanceType design document covering:

  • Label-based host selection model (Cloud Infra Admin labels hosts, Cloud Provider Admin creates BareMetalInstanceTypes with host_label)
  • BMaaS operator maps host_label to inventory hosts at provisioning time
  • Public/private gRPC API design in fulfillment-service
  • BareMetalInstanceType proto schema with comprehensive hardware metadata
  • Integration with BareMetalInstance and Cluster creation workflows

Assisted-by: Claude Code noreply@anthropic.com

Summary by CodeRabbit

  • Documentation
  • Added comprehensive documentation for the bare-metal instance types enhancement.
  • Described tenant-discoverable hardware catalogs and provisioning workflows.
  • Documented API, storage, operator behavior, security, observability, testing, and upgrade considerations.
  • Defined terminology, resource schemas, host selection, failure handling, and reconciliation expectations.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-119

Score: 8/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Design reuses existing inventory client interface (FindFreeHost already supports matchExpressions), follows established DAO/gRPC patterns, and provides a fully specified proto schema with validation a
Testability 2/2 Comprehensive test strategy covering unit tests (CRUD, validation, reconciler with mocks), integration tests (end-to-end provisioning, error cases, invalid references), and E2E tests via osac-test-inf
Scope 2/2 Well-bounded scope introducing one new resource type (BareMetalInstanceType) with clear CRUD surface. Goals and non-goals are explicit — auto-discovery, billing, multi-backend collision, and complex l
Architecture 2/2 Follows established OSAC resource-oriented patterns with clean separation of concerns: fulfillment-service for CRUD/discovery, operator for provisioning, inventory backends for host management. Securi

Verdict: A thorough, well-structured design document that introduces BareMetalInstanceType resources with a clean label-based host selection model, comprehensive failure handling, strong security controls, and full backward compatibility — all built on established OSAC patterns.

Feedback: Consider adding a formal User Stories section per the template to make the enhancement more accessible to product reviewers who scan for role-based narratives. The open question on label format (free-form vs. namespaced) should be resolved before implementation since it affects the proto schema, inventory client matchExpression format, and operational documentation — leaning toward namespaced labels (e.g., 'osac.openshift.io/hardware-profile=gpu-large') would prevent collisions with other inventory host labels. Finally, consider briefly addressing whether host_label should support multi-label selection in the future, as the current single-string design would require a schema change to support composite hardware profiles.

Critical (0)

None.

Important (2)

  1. Missing User Stories section: the template requires explicit 'As a , I want so that ' stories. The Workflow Description covers the substance but product reviewers expect the standard format for traceability to requirements.
  2. Open question Bump actions/setup-python from 5 to 6 #1 (label format) has proto schema impact: if the answer changes host_label from a free-form string to a namespaced key-value pair, the BareMetalInstanceTypeSpec proto, FindFreeHost matchExpression construction, and all operational documentation change. Resolving this before implementation avoids a breaking schema revision.

Suggestions (3)

  1. Add negative/security test scenarios to the test plan — e.g., tenant isolation violation attempts (Tenant A referencing Tenant B's scoped type), unauthorized private API access from tenant service accounts.
  2. Consider whether host_label should evolve to support multiple labels (e.g., repeated string or map) for composite hardware profiles. Even if not implemented now, a forward-compatibility note would help avoid a breaking change later.
  3. The idempotent AssignHost requirement on inventory backends is flagged as 'must be noted during implementation' — consider promoting this to a prerequisite with a compatibility matrix showing which backends support it today.

Review cost

Model: claude-opus-4-6
Cost: $0.5481
Tokens: 6.1k in / 3.6k out
Cache: 182.7k read
Active time: 1m 24s
API calls: 0

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@enhancements/baremetal-instance-types/README.md`:
- Around line 232-233: Update the operator authorization table to explicitly
permit the private Get/read RPC used in the fulfillment workflow for retrieving
BareMetalInstanceType and host_label, or document that the operator performs
this read through the public API. Keep the existing Create, Update, Delete, and
Signal permissions unchanged and ensure the authorization guidance matches the
workflow steps.
- Around line 343-349: The idempotent host-claiming design requires inventory
assignment support that is absent from the current AssignHost contract. Update
AssignHost and every inventory backend implementation to accept the
BareMetalInstance ID as an idempotency key and return the existing assignment
for repeated keys, or introduce and use a durable assignment lookup before
creating a new claim; ensure the crash-before-status-persist path cannot
double-claim a host.
- Around line 162-166: Update the documented gpu-large CPU example to include a
positive threads_per_core value, ensuring it satisfies BareMetalCPUSpec
validation; do not leave the field at its default zero value.
- Around line 280-295: Define validation on the ClusterTemplate and
ClusterCatalogItem create paths so every ClusterTemplateNodeSet has at least one
non-empty field between instance_type and host_type. Reject requests before
persistence or publication when both are empty, while preserving the documented
precedence of instance_type over host_type.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: d4b51ee2-35f1-40c9-aa6e-2025c4e5eda3

📥 Commits

Reviewing files that changed from the base of the PR and between 2f38e00 and e634f9d.

📒 Files selected for processing (1)
  • enhancements/baremetal-instance-types/README.md

Comment thread enhancements/OSAC-1201-baremetal-instance-types/design.md
Comment thread enhancements/baremetal-instance-types/README.md Outdated
Comment thread enhancements/OSAC-1201-baremetal-instance-types/README.md Outdated
Comment thread enhancements/baremetal-instance-types/README.md Outdated
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-119

Score: 8/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Design is fully implementable on existing OSAC infrastructure. Reuses DAO pattern, CEL filtering, public/private gRPC split, and the inventory.Client.FindFreeHost interface which already supports matc
Testability 2/2 Comprehensive three-tier test plan: unit tests for CRUD and validation, integration tests for end-to-end provisioning with label selection and failure scenarios, E2E tests via osac-test-infra covering
Scope 2/2 Sharp boundaries with explicit non-goals (auto-discovery, billing, multi-backend collision, complex lifecycle). Three focused components: gRPC services in fulfillment-service, label-based selection in
Architecture 2/2 Follows established OSAC patterns: public/private API split, DAO with JSON-serialized protobuf, tenant-scoped visibility via TenancyLogic and AttributionLogic, OPA as defense-in-depth. Clean separatio

Verdict: A thorough, well-structured design that follows established OSAC patterns, provides complete proto schemas with validation, handles edge cases (idempotency, crash recovery, version skew) rigorously, and defines a comprehensive test strategy across all tiers.

Feedback: The document is strong overall. Two minor improvements: (1) add formal 'User Stories' in the 'As a [role], I want [action] so that [goal]' format under Motivation to match the template structure — the workflow descriptions are excellent but the user-story framing helps reviewers quickly validate that all personas' needs are met. (2) Consider resolving the label format open question (free-form vs. namespaced) before merge, as it affects the proto schema definition and inventory client integration — deferring it risks a breaking change later.

Critical (0)

None.

Important (1)

  1. Missing formal 'User Stories' section under Motivation as required by the enhancement template — the workflow descriptions cover the same ground but the template-mandated format aids quick review and ensures all persona goals are explicitly validated.

Suggestions (2)

  1. Resolve open question Bump actions/setup-python from 5 to 6 #1 (label format: free-form string vs. namespaced key-value) before merge, as the choice affects the host_label proto field definition and FindFreeHost matchExpression format — deferring this risks a breaking API change after initial implementation.
  2. Consider adding a brief note on what happens when a Cloud Provider Admin deletes a BareMetalInstanceType that is still referenced by existing BareMetalInstances — the test plan mentions this as a challenging area but the design doesn't specify the expected behavior (block deletion, orphan instances, or cascade status update).

Review cost

Model: claude-opus-4-6
Cost: $0.5396
Tokens: 6.1k in / 3.3k out
Cache: 181.3k read
Active time: 1m 11s
API calls: 0

tzumainn
tzumainn previously approved these changes Jul 15, 2026

@tzumainn tzumainn left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

/lgtm

@openshift-ci openshift-ci Bot added the lgtm label Jul 15, 2026
@tzumainn
tzumainn dismissed their stale review July 15, 2026 21:07

Oh, this isn't the PRD - will take a closer look!

@ajamias ajamias changed the title OSAC-1201: Design for BareMetalInstanceTypes OSAC-2675: Design for BareMetalInstanceTypes Jul 16, 2026
@openshift-ci-robot

Copy link
Copy Markdown

@ajamias: This pull request references OSAC-2675 which is a valid jira issue.

Warning: The referenced jira issue has an invalid target version for the target branch this PR targets: expected the task to target the "5.0.0" version, but no target version was set.

Details

In response to this:

Introduces the BareMetalInstanceType design document covering:

  • Label-based host selection model (Cloud Infra Admin labels hosts, Cloud Provider Admin creates BareMetalInstanceTypes with host_label)
  • BMaaS operator maps host_label to inventory hosts at provisioning time
  • Public/private gRPC API design in fulfillment-service
  • BareMetalInstanceType proto schema with comprehensive hardware metadata
  • Integration with BareMetalInstance and Cluster creation workflows

Assisted-by: Claude Code noreply@anthropic.com

Summary by CodeRabbit

  • Documentation
  • Added comprehensive documentation for the bare-metal instance types enhancement.
  • Describes tenant-discoverable hardware catalogs and end-to-end provisioning workflows.
  • Covers API and storage changes, operator/controller reconciliation behavior, security/authorization model, observability, failure handling, test plan, and upgrade/version-skew considerations.
  • Defines host-label selection expectations, key terminology, risks/mitigations, and graduation criteria.

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the openshift-eng/jira-lifecycle-plugin repository.


### Goals

- Reuse the existing resource management patterns for consistency with OSAC's architecture

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What does this mean? I think it would be better to state the use case directly rather than referencing other implementation that might change in the future or the reader might not be familiar with.

- Reuse the existing resource management patterns for consistency with OSAC's architecture
- Support both direct BareMetalInstance and Cluster creation, integrating their catalog items with hardware types
- Enable Cloud Provider Admins to define BareMetalInstanceTypes with host label selectors that the BMaaS operator uses to claim matching inventory hosts during provisioning
- Maintain backward compatibility with existing catalog_item-based bare metal instance creation

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure I understand this. You will continue to create bare metal instances through catalog items so what does this compatibility really require?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We talked about this and I think the goal should be to have the type be mandatory. That can be achieved in multiple steps to make sure CI and such stays green, but the goal of this proposal should be to require users to select a valid instance type.

- Storage inventory beyond basic local storage metadata
- Multi-backend inventory collision handling (single backend per deployment)
- Automatic discovery and creation of BareMetalInstanceTypes from inventory backends
- Complex lifecycle management with deprecation workflows

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I would call out that this is lifecycle management of instance types

Operator->>Inventory: FindFreeHost(matchExpressions={"hostType":"gpu-large"})
Inventory-->>Operator: Return matching host
Operator->>Inventory: AssignHost(host, labels)
Operator->>FS: Update BareMetalInstance status (provisioned)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This isn't really provisioned yet, right?

Comment thread enhancements/OSAC-1201-baremetal-instance-types/design.md
Comment thread enhancements/OSAC-1201-baremetal-instance-types/design.md
| RPC | Service | Authorization |
|-----|---------|---------------|
| List, Get | Public | Any authenticated tenant; results filtered by TenancyLogic to globally-visible types plus caller's tenant-scoped types |
| Get | Private | Operator service account; used during BareMetalInstance provisioning to retrieve the `host_label` |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think we want to introduce this. I would rather see whatever is required to do provisioning be in the BareMetalInstance CR.

BMF operator's API is the CR. I don't think it should also have to query the database to do its job.

| Create, Update, Delete | Private | Cloud Provider Admin role enforced via AttributionLogic; tenant service accounts cannot call private RPCs |
| Signal | Private | Operator service account only; enforced by private API transport |

**Tenant filtering:** Globally-visible BareMetalInstanceTypes (empty tenant annotation) are returned to all authenticated callers. Tenant-scoped types are returned only to the owning tenant. This filtering is applied by the public server's TenancyLogic before returning results — not delegated to the caller or to OPA alone.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we think instance types will ever be scoped to a tenant?

cc @adriengentil

@adriengentil adriengentil Jul 21, 2026 •

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see the need for tenant-scoped instance types, they are derived from the inventory so they are defined by the system (and end-up in "shared" tenant?). Maybe we would need to restrict tenants to use some instance types in the future, but that should be an RBAC rule, no? I think it's out of scope for the moment.


**Tenant Isolation Requirements:**
All BareMetalInstanceType resources include required tenant isolation metadata:
- `osac.openshift.io/tenant`: Tenant scoping (often empty for globally-visible types)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are these osac DB metadata fields? They look like kubernetes labels or annotations, but we're not creating a CR.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to Claude:

Based on my research in the fulfillment-service code, here's how the tenant system actually works:

  The osac.openshift.io/tenant Annotation

  1. Storage: The tenant value is stored in a tenant column in the database, not just as an annotation
  2. Values:
    - "shared" - Globally visible to all authenticated users
    - "system" - Only visible to system/admin users
    - "<tenant-name>" - Only visible to users belonging to that specific tenant
    - Empty/missing - This is the key part!

  What Happens When the Annotation is Empty or Missing

  From the addTenancyFilter logic in the DAO layer:

  1. Admin users (who have universal tenant access): See everything regardless of tenant value - no filtering is applied
  2. Regular tenant users: The filtering logic is tenant = any($tenant_list) where $tenant_list includes:
    - The user's specific tenant(s)
    - Always includes "shared" (via SharedTenants.Union(result) in DetermineVisibleTenants)

  This means:
  - Empty/null tenant = NOT visible to regular users, only to admins
  - "shared" tenant = Visible to all authenticated users
  - Specific tenant = Only visible to users in that tenant (plus admins)

  For BareMetalInstanceTypes

  So when we say "globally-visible" with "empty tenant annotation", that actually means:
  - Only admins can see them (Cloud Provider Admins)
  - Regular tenant users cannot see them

  If we want regular tenant users to see BareMetalInstanceTypes, we need to set the tenant to "shared", not empty!


### 2. Label Validation at Type Creation Time

**Question:** Should the fulfillment-service (or operator) validate that the `host_label` on a new BareMetalInstanceType matches at least one actual inventory host at creation time? This would catch coordination errors early but requires the API server to query the inventory backend at write time.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't think it's currently possible for fulfillment-service to do this. We should leave it to BMF operator I think.

@openshift-ci openshift-ci Bot removed the lgtm label Jul 20, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (3)
enhancements/baremetal-instance-types/README.md (3)

148-152: 🎯 Functional Correctness | 🟠 Major | ⚡ Quick win

Validate MatchExpression operator/value combinations.

The schema allows In or NotIn with no values and allows values for Exists or DoesNotExist, despite claiming malformed selectors are rejected. Add cross-field validation: require non-empty values for In/NotIn and forbid values for Exists/DoesNotExist.

Also applies to: 321-321

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@enhancements/baremetal-instance-types/README.md` around lines 148 - 152,
Update the MatchExpression schema validation to enforce operator/value
combinations: require at least one value when operator is In or NotIn, and
require values to be empty when operator is Exists or DoesNotExist. Use the
schema’s cross-field validation mechanism while preserving the existing key and
operator constraints.

144-152: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Reconcile MatchExpression with the inventory selector contract.

host_label is a repeated Kubernetes-style MatchExpression, but FindFreeHost is documented as accepting map[string]string; the two representations cannot be passed directly. The example also uses hardware-profile, while the backend contract requires canonical hostType. Define the conversion, supported operators, multi-value semantics, and backend translation—or change the schema/API to one canonical representation.

#!/bin/bash
set -euo pipefail
rg -n 'FindFreeHost|matchExpressions|hostType|resource_class|osac.openshift.io/instance-type' \
  enhancements/bare-metal-fulfillment enhancements/baremetal-instance-types/README.md

Also applies to: 232-245

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@enhancements/baremetal-instance-types/README.md` around lines 144 - 152,
Reconcile the MatchExpression schema and examples with the FindFreeHost
inventory-selector contract by choosing one canonical representation. If
retaining MatchExpression, document and implement its conversion to
map[string]string, including supported operators, multi-value semantics, and
translation of hardware-profile to canonical hostType; otherwise change
host_label and related examples/API usage to use the map representation
directly.

349-354: 🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift

Expose the crash-recovery lookup through the inventory contract.

Recovery step 3 requires finding an existing assignment by bareMetalInstanceID, but the documented inventory.Client only exposes FindFreeHost and explicitly claims no interface changes are needed. Add a backend-neutral lookup such as FindAssignedHost, or define how the operator invokes backend-native recovery logic; otherwise crash-before-persist recovery is not implementable.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@enhancements/baremetal-instance-types/README.md` around lines 349 - 354, The
documented inventory contract must expose crash-recovery lookup by
bareMetalInstanceID. Update the inventory.Client interface near FindFreeHost to
add a backend-neutral FindAssignedHost operation, or explicitly define an
equivalent operator-level mechanism, then ensure both OpenStack and Metal3
implementations support querying their existing assignment markers and returning
the assigned host ID.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@enhancements/baremetal-instance-types/README.md`:
- Line 37: Update the wording in the bare-metal hardware selection description
to hyphenate “bare-metal” when it is used as a compound adjective.
- Line 279: Align the “Provisioning Label Lookup” documentation and the
authorization table’s provisioning entries on a single host-label resolution
path: either remove the Fulfillment Service private Get/RPC dependency and
describe provisioning as using persisted BareMetalInstance host_label
matchExpressions, or explicitly document the lookup’s timing and purpose. Update
the related outage and recovery guarantees consistently.

---

Duplicate comments:
In `@enhancements/baremetal-instance-types/README.md`:
- Around line 148-152: Update the MatchExpression schema validation to enforce
operator/value combinations: require at least one value when operator is In or
NotIn, and require values to be empty when operator is Exists or DoesNotExist.
Use the schema’s cross-field validation mechanism while preserving the existing
key and operator constraints.
- Around line 144-152: Reconcile the MatchExpression schema and examples with
the FindFreeHost inventory-selector contract by choosing one canonical
representation. If retaining MatchExpression, document and implement its
conversion to map[string]string, including supported operators, multi-value
semantics, and translation of hardware-profile to canonical hostType; otherwise
change host_label and related examples/API usage to use the map representation
directly.
- Around line 349-354: The documented inventory contract must expose
crash-recovery lookup by bareMetalInstanceID. Update the inventory.Client
interface near FindFreeHost to add a backend-neutral FindAssignedHost operation,
or explicitly define an equivalent operator-level mechanism, then ensure both
OpenStack and Metal3 implementations support querying their existing assignment
markers and returning the assigned host ID.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: osac-project/coderabbit/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Enterprise

Run ID: 49f3b18a-6672-450a-9928-c49d73fcfadd

📥 Commits

Reviewing files that changed from the base of the PR and between e634f9d and c89c6b0.

📒 Files selected for processing (1)
  • enhancements/baremetal-instance-types/README.md

Comment thread enhancements/OSAC-1201-baremetal-instance-types/README.md Outdated
Comment thread enhancements/baremetal-instance-types/README.md Outdated
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-119

Score: 7/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Deep technical detail throughout. Full proto schemas with buf.validate annotations, explicit field types and constraints. All CRUD lifecycle operations covered via public (List/Get) and private (full CRUD + Signal) APIs. Error handling is thorough with a dedicated 'Failure Handling and Recovery' section covering no-matching-hosts, invalid references, label mismatches, and reconciliation behavior. The idempotency guarantees section is particularly strong with a 4-step guard against double-claimin
Testability 2/2 Test plan specifies concrete scenarios at each level. Unit: CRUD operations, malformed input validation, host_label selection logic with mocked inventory clients, status condition updates. Integration: end-to-end provisioning workflow, invalid instance_type reference, host selection failure, ClusterCatalogItem integration. E2E: complete multi-persona workflow from host labeling through provisioning, concurrent provisioning with multiple types, backend-specific filtering. 'Challenging Test Areas'
Scope 1/2 Summary is well-structured and informative. Non-goals are specific (5 enumerated items). Alternatives section is strong with 4 real alternatives and clear rejection rationale. However, the design is missing a formal User Stories section under Motivation — the template explicitly requires persona-based 'As a [role]...' stories. While the Workflow Description covers actors adequately, the structural omission matters. Several cross-cutting dimensions from osac-dimensions.md are not addressed or def
Architecture 2/2 Follows all major OSAC patterns: standard object shape (id, Metadata, Spec, Status), tenant isolation annotations (osac.openshift.io/tenant and osac.openshift.io/owner-reference) on new resources, conditions for lifecycle state (HostSelectionFailed, HostSelectionSucceeded), and spec/status ownership is correct. Cross-repo impacts are clearly enumerated (fulfillment-service proto + bare-metal-fulfillment-operator controller + inventory backends). Terminology is defined upfront and used consistent

Verdict: A strong, well-detailed design that follows OSAC patterns and provides deep technical specificity, held back from a perfect score by a missing User Stories section and unaddressed cross-cutting dimensions (Installation, Documentation, UI, Tenant Onboarding).

Feedback: Add a formal User Stories section under Motivation with 'As a [role], I want...' stories for Cloud Provider Admin, Cloud Infrastructure Admin, and Tenant User — the Workflow Description covers these actors well but the template requires explicit user stories. Address the cross-cutting dimensions from osac-dimensions.md that are currently silent: state whether Installation changes, Documentation, and UI support are in scope or explicitly deferred for this milestone. Fix the proto-vs-example inconsistency where the YAML example shows accelerator 'count: 2' but BareMetalAcceleratorSpec lacks a count field.

Critical (0)

None.

Important (4)

  1. Missing User Stories section under Motivation — template requires persona-based 'As a [role], I want to [action] so that I can [goal]' stories. The Workflow Description covers the actors but the formal section is absent.
  2. Cross-cutting dimensions not addressed: Installation (does deploying enhanced fulfillment-service/operator require osac-installer changes?), Documentation (what user-facing docs are needed?), UI (design references UI discovery but doesn't state whether UI support is in scope or deferred), Tenant Onboarding (RBAC implications for the new BareMetalInstanceType resource).
  3. Proto schema vs example inconsistency: the YAML example (line ~278) shows 'count: 2' for accelerators, but BareMetalAcceleratorSpec in the proto schema has no 'count' field — either add 'int32 count' to the proto or remove it from the example.
  4. Integration test infrastructure not described — unit tests mention 'mocked inventory clients' but integration tests don't specify what test setup is needed (kind cluster? mocked inventory backend? test database?).

Suggestions (3)

  1. Consider replacing 'map capabilities' in BareMetalHardwareSpec with a repeated list of named subobjects (e.g., 'repeated Capability capabilities') per OSAC convention of avoiding maps in resource schemas.
  2. Graduation criteria would benefit from concrete measurable conditions (e.g., 'All CRUD operations pass e2e, host selection succeeds with both OpenStack and Metal3 backends, no regressions in existing BMaaS tests') even if the target release is not yet determined.
  3. Open Question Bump actions/setup-python from 5 to 6 #1 (label format: free-form vs namespaced) directly affects the proto schema definition — resolving this before implementation would prevent rework on the MatchExpression structure and inventory client integration.

Review cost

Model: claude-opus-4-6
Cost: $0.8117
Tokens: 5.3k in / 6.5k out
Cache: 313.2k read
Active time: 2m 38s
API calls: 0

@tchughesiv tchughesiv left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for this proposal! Per the naming convention in CONTRIBUTING.md, new enhancement directories must follow OSAC-NNNN-feature-slug/ (with lowercase prd.md/design.md), where OSAC-NNNN is the Jira Feature-level key.

This PR adds enhancements/baremetal-instance-types/, which doesn't match that pattern yet, and will fail the check-ep-naming CI check once this branch is rebased onto latest main (the check merged in #133, after this PR was opened).

Could you rename enhancements/baremetal-instance-types/ → enhancements/OSAC-1201-baremetal-instance-types/ (and update the tracking-link in the frontmatter if needed)? Happy to help if you have questions about the convention.

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-119

Score: 5/8 | Verdict: PASS

Criterion Score Notes
Feasibility 1/2 Strong proto schemas with validation annotations, specific controller logic with Go code snippets, and detailed failure handling. However, the BareMetalAcceleratorSpec proto is missing a 'count' field that appears in the YAML example (count: 2). The instance_type field on BareMetalInstanceSpec has min_len=1 validation (making it required), which contradicts the stated incremental adoption and backward compatibility with the existing catalog_item workflow. The Signal RPC on PrivateBareMetalInstan
Testability 1/2 Test plan is well-structured across unit, integration, and E2E levels with concrete scenarios (CRUD validation, host selection failure, concurrent provisioning, cross-backend correctness). The 'Challenging Test Areas' section shows thoughtful edge-case consideration. However, graduation criteria are fully deferred ('will be defined when targeting a release') with no provisional conditions, and integration tests don't specify the test infrastructure (kind cluster setup, mocked vs real backends).
Scope 1/2 Clear 3-sentence summary, specific non-goals with rationale (billing, auto-discovery, deprecation workflows), 4 real alternatives with substantive rejection reasons, and PRD referenced in frontmatter. However, the UI dimension is not addressed or explicitly deferred despite being clearly relevant (tenant users discover and select BareMetalInstanceTypes, and the E2E test plan itself mentions 'UI and CLI workflows'). The Documentation dimension is also silent. Per osac-dimensions.md, silence on re
Architecture 2/2 Follows OSAC patterns thoroughly: standard object shape (id, Metadata, Spec, Status), spec/status ownership separation, tenant isolation with shared annotations and owner-reference, conditions for lifecycle state (HostSelectionFailed, HostSelectionSucceeded), clear cross-component dependency ordering (fulfillment-service controller -> bare-metal-fulfillment-operator -> inventory backend). Dependencies are explicitly mapped with backend translation tables (OpenStack ResourceClass, Metal3 BareMeta

Verdict: A well-structured design that follows OSAC architectural patterns and provides detailed proto schemas with specific implementation logic, but is held back by a proto/example inconsistency, a backward compatibility contradiction around mandatory instance_type, unaddressed UI and Documentation dimensions, and fully deferred graduation criteria.

Feedback: Fix the BareMetalAcceleratorSpec proto to include the 'count' field shown in the YAML example, and resolve the tension between instance_type being required (min_len=1 validation) and the stated incremental adoption path from catalog_item — either make instance_type optional with a oneof or document the breaking change explicitly. Address the UI dimension (what UI changes are needed for BareMetalInstanceType listing/selection, or explicitly defer to a later milestone) and the Documentation dimension. Add provisional graduation criteria with measurable conditions even if the target release is TBD.

Critical (0)

None.

Important (6)

  1. BareMetalAcceleratorSpec proto schema is missing a 'count' field that appears in the YAML example (count: 2 for dual A100 GPUs). Without this field, users cannot specify multi-accelerator configurations, which is a core use case for GPU hardware types.
  2. The instance_type field on BareMetalInstanceSpec has (buf.validate.field).string.min_len = 1 validation, making it required on all BareMetalInstances. This contradicts the Upgrade/Downgrade section which states 'Users can adopt BareMetalInstanceType references incrementally' and that 'catalog_item workflow remains fully functional.' A required field breaks backward compatibility for existing catalog_item-based workflows.
  3. UI dimension from osac-dimensions.md is not addressed or explicitly deferred. BareMetalInstanceType is a tenant-user-facing resource (the E2E test plan mentions 'UI and CLI workflows for BareMetalInstanceType listing and selection'), so the design should state what UI support is needed or explicitly defer it.
  4. Documentation dimension from osac-dimensions.md is not addressed. New API surfaces, admin workflows (host labeling, type creation), and persona-specific procedures need documentation planning.
  5. Graduation criteria are fully deferred ('will be defined when targeting a release') with no provisional measurable conditions. The rubric expects concrete graduation criteria rather than complete deferral.
  6. Signal RPC is listed for PrivateBareMetalInstanceTypes but never defined — its purpose, request/response schema, and behavior are absent from the design.

Suggestions (4)

  1. Clarify the coexistence model between catalog_item and instance_type fields on BareMetalInstanceSpec — can both be set simultaneously? Is there a validation rule that exactly one must be provided? A oneof or explicit mutual-exclusion rule would make the contract clearer.
  2. Specify integration test infrastructure explicitly: whether tests use a kind cluster with mocked inventory backends or real backend stubs, and what fixtures are needed for label-based host selection testing.
  3. Consider adding a count field to BareMetalNetworkPortSpec as well, since servers commonly have multiple ports of the same type/speed.
  4. The map capabilities field on BareMetalHardwareSpec is a freeform extension point with no structure. Consider documenting recommended capability keys or linking to a registry of known keys to improve discoverability and consistency across deployments.

Review cost

Model: claude-opus-4-6
Cost: $0.7332
Tokens: 8 in / 6.2k out
Cache: 299.0k read
Active time: 2m 28s
API calls: 0

- Use string reference for instance_type field in BareMetalInstanceSpec (follows catalog_item pattern)
- Remove custom BareMetalLabelSelector in favor of simple map<string,string> host_selector
- Clarify controller architecture: fulfillment-service resolves instance_type and sets CRD hostType
- Update flow to show proper separation: protobuf API → controller mapping → existing CRD schema
- Remove incorrect references to embedded selectors - controller resolves at creation time
- Document that existing CRD schema remains unchanged
- Focus on hostType field mapping without involving Selector.HostSelector

Addresses architectural alignment based on actual fulfillment-service controller patterns.

Assisted-by: Claude Code <noreply@anthropic.com>
@ajamias
ajamias force-pushed the design/OSAC-1201 branch from 3243d85 to 6c9f40c Compare July 24, 2026 20:57
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-119

Score: 7/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Deep technical detail with full proto schemas including validation annotations, specific Go controller mapping logic, concrete error codes (NOT_FOUND, HostSelectionFailed), compatibility matrix for version skew, and four specific technical risks with concrete mitigations. All CRUD lifecycle operations covered across public (List/Get) and private (full CRUD + Signal) APIs. Minor internal inconsistencies between code snippets and proto definitions (host_selector vs host_label_selector.match_labels
Testability 1/2 Test plan is solid with specific scenarios at each level: unit tests for CRUD, validation, reconciler logic, status conditions; integration tests for E2E provisioning, invalid references, failure scenarios; E2E tests for complete multi-persona workflow including concurrent provisioning and backend correctness. Challenging Test Areas section identifies edge cases (deletion during provisioning, race conditions). However, Graduation Criteria are effectively deferred — the section says 'will be defi
Scope 2/2 Clear boundaries with five specific non-goals (billing, storage inventory, multi-backend collision, auto-discovery, complex deprecation). Four real alternatives with thoughtful rejection rationale — well above typical depth. PRD referenced via frontmatter. Goals are user-visible outcomes. Cross-cutting dimensions mostly addressed: Inventory, Provisioning, E2E Testing covered; Storage explicitly deferred in non-goals. Minor gaps: Installation dimension not explicitly addressed (though 'no new inf
Architecture 2/2 Follows OSAC patterns consistently: standard object shape (id, Metadata, Spec, Status), spec/status ownership correct, public/private API split, tenant isolation annotations (osac.openshift.io/tenant = 'shared', osac.openshift.io/owner-reference), declarative design. Cross-repo impacts enumerated (fulfillment-service proto + controller, bare-metal-fulfillment-operator host selection). Backend translation table maps hostType to OpenStack resource_class and Metal3 labels. Terminology evolution sec

Verdict: A thorough, well-structured design that follows OSAC architectural patterns and provides deep implementation detail; the only significant gap is deferred graduation criteria which prevents a perfect score on testability.

Feedback: The graduation criteria section needs concrete, measurable conditions rather than deferring to a future release milestone — specify what 'done' looks like (e.g., 'all CRUD operations pass e2e, label-based provisioning succeeds on both OpenStack and Metal3 backends, no regressions in existing bare metal tests'). Fix the internal inconsistency between the Go code snippets and proto definitions: the code references HostSelector["hostType"] but the proto defines host_label_selector.match_labels — implementers will need to reconcile these. The YAML example for accelerators includes a count: 2 field that doesn't exist in the proto schema; either add it to the proto or remove it from the example.

Critical (0)

None.

Important (3)

  1. Graduation criteria are fully deferred ('will be defined when targeting a release') with no measurable conditions — this is effectively a placeholder that prevents testability from scoring 2/2. Add concrete criteria such as: all CRUD operations pass e2e, label-based provisioning works on both backends, error paths tested.
  2. Go code snippet shows instanceType.Spec.HostSelector["hostType"] (line 243) but the proto defines a nested BareMetalLabelSelector host_label_selector with map match_labels (lines 203-209). The correct Go path would be instanceType.Spec.HostLabelSelector.MatchLabels["hostType"]. This inconsistency will confuse implementers.
  3. YAML example (line 307) includes count: 2 on the accelerator entry, but the BareMetalAcceleratorSpec proto message (lines 188-191) has no count field — only type, model, vendor, and memory_gb. Either add a count field to the proto or remove it from the example.

Suggestions (4)

  1. Cross-cutting dimension gaps: UI is mentioned in E2E tests ('UI and CLI workflows for BareMetalInstanceType listing and selection') but not addressed as a design dimension — state whether UI changes are in scope or deferred. Documentation dimension is not mentioned at all.
  2. Installation dimension: while the design says no new infrastructure is needed, it should clarify whether osac-installer needs any updates (e.g., new image version, configuration) for the enhanced fulfillment-service.
  3. The private API mentions a 'Signal RPC' alongside CRUD operations but never explains what it does or when it's used — add a brief description.
  4. The map capabilities field in BareMetalHardwareSpec is a freeform map that could accumulate unbounded keys over time. Consider whether structured fields or a list of named capabilities would be more appropriate, consistent with the OSAC preference for lists of named subobjects over maps.

Review cost

Model: claude-opus-4-6
Cost: $0.7287
Tokens: 8 in / 6.1k out
Cache: 298.7k read
Active time: 2m 16s
API calls: 0

@danmanor

danmanor commented Jul 27, 2026 •

Copy link
Copy Markdown
Contributor

Networking EP alignment — BareMetalInstanceType needs network port name + role

We're working on the networking EPs (PR #107) which define how tenants attach resources to subnets. Our design currently uses HostType with a NetworkInterface list (name, role, description) for both BMaaS and CaaS. Since BareMetalInstanceType describes the same hardware, we'd like to align on it as the single hardware type resource.

What's needed for networking to work

The current BareMetalNetworkPortSpec has type (Ethernet/InfiniBand) and speed (1Gbps/100Gbps) — this is great for discovery but not enough for network attachment configuration. We need two additional fields:

message BareMetalNetworkPortSpec {
  string name = 1;   // e.g., "data-0", "mgmt-0" — unique identifier within the type
  string role = 2;   // e.g., "fabric", "management", "storage", "lifecycle"
  string type = 3;   // e.g., Ethernet, InfiniBand (existing)
  string speed = 4;  // e.g., 1Gbps, 100Gbps (existing)
}

Why name: BMaaS tenants specify which physical interface to attach to a subnet: osac create baremetalinstance --network-attachment interface=data-0,subnet=my-subnet. The name is the identifier they use.

Why role: The role identifies the NIC's purpose on the hardware — it's a general-purpose NIC classifier, not specific to any service type:

  • fabric — primary east-west tenant data traffic. Used by CaaS for automatic interface resolution (first fabric port), used by BMaaS tenants as the default attachment target when interface is omitted.
  • management — in-band control plane traffic
  • storage — storage fabric traffic (could be used in the future for storage network attachments)
  • lifecycle — out-of-band BMC/PXE. Excluded from tenant validation — not attachable. Prevents tenants from accidentally binding to management plane interfaces.

The role lets the system make intelligent defaults (e.g., "pick the first fabric port when the tenant doesn't specify") and enforce safety rules (e.g., "reject lifecycle ports in tenant requests") regardless of service type.

CaaS usage

CaaS cluster node_sets[].host_type currently references a HostType by name. We'd like this to reference a BareMetalInstanceType instead — CaaS cluster nodes ARE bare metal, so the same hardware catalog applies. The fulfillment-service resolves the first network port with role fabric for each node set's fabric_interface.

Additional conventions

  • Ordering: Ports should be ordered; when multiple ports share the same role, the first in the list is the default for that role.
  • Lifecycle exclusion: Ports with role lifecycle are not tenant-attachable and must be excluded from networking validation.

We'll update our networking EPs (PR #107) to reference BareMetalInstanceType instead of HostType. Would appreciate feedback on whether these additions work for your design.

danmanor added a commit to danmanor/enhancement-proposals that referenced this pull request Jul 27, 2026
…uture

BMaaS design: reverted to HostType for interface validation (v0.2).
Added "Future: BareMetalInstanceType Integration" section documenting
the migration plan when PR osac-project#119 lands with enhanced network_ports.

HostType is the system-level resource that exists today and works for
both CaaS and BMaaS. BareMetalInstanceType will be the tenant-facing
catalog once it's available.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
masayag pushed a commit to masayag/enhancement-proposals that referenced this pull request Jul 27, 2026
…uture

BMaaS design: reverted to HostType for interface validation (v0.2).
Added "Future: BareMetalInstanceType Integration" section documenting
the migration plan when PR osac-project#119 lands with enhanced network_ports.

HostType is the system-level resource that exists today and works for
both CaaS and BMaaS. BareMetalInstanceType will be the tenant-facing
catalog once it's available.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
- Add network port role documentation (fabric, management, storage, lifecycle)
- Document ordering conventions for default port resolution
- Clarify that lifecycle ports are excluded from tenant validation
- Support for BMaaS interface naming (data-0, mgmt-0) and CaaS fabric resolution
- Fix host_label_selector → host_selector reference consistency

Addresses networking EP coordination feedback for unified hardware type catalog.

Assisted-by: Claude Code <noreply@anthropic.com>

// New logic (resolved from BareMetalInstanceType)
instanceType, err := resolveBareMetalInstanceType(ctx, bareMetalInstance.Spec.InstanceType)
object.Spec.HostType = instanceType.Spec.HostSelector["hostType"]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This was called host_label_selector in the private API above. And it was a separate struct (BareMetalLabelSelector) with an entire map in it.

Should this reflect that setup or am I misunderstanding something?

Also what are we doing with the entries in this map that are not hostType? Are we also passing those to the BareMetalInstance.Spec.Selector field?

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Also by extension, why have separate fields on BareMetalInstance? Why not just use Selector for everything if the user is adding a map here?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll correct the inconsistency, and yes the entries in the map that are not hostType will be passed to the BareMetalInstance.Spec.Selector field

| Backend | `"hostType"` translation |
|---------|--------------------------|
| OpenStack (`openstack.go`) | Ironic node `ResourceClass` field |
| Metal3 (`metal3.go`) | `BareMetalHost` label `osac.openshift.io/instance-type` |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we prepend this same namespace for all the fields in BareMetalInstance.Spec.Selector? I would want to treat everything in the instanceType.Spec.HostSelector map the same way or just make a separate field.

Comment thread enhancements/OSAC-1201-baremetal-instance-types/design.md
@carbonin

Copy link
Copy Markdown

@danmanor I'm fine with adding the fields you need, but note that by design this type and the hardware it describes is not guaranteed to be exact. We can document the potential issues that could occur if the type doesn't match the actual hardware, but I'm curious how precisely these things need to match up?

The "name" field in particular ... does that need to reference something real on the host? How do you plan to know which discovered interface on the host matches the named ones in the instance type? For now we can model these fields, but as with all the others, we're not going to do anything other than display them just yet.

- Remove canonical hostType requirement and allow backends to use native label formats
- Labels pass through directly from BareMetalInstanceType to inventory backend
- Update examples to show Metal3 namespaced labels vs simple backend labels
- Resolve Open Question 1 about label format and namespace approach

Assisted-by: Claude Code <noreply@anthropic.com>
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-119

Score: 6/8 | Verdict: PASS

Criterion Score Notes
Feasibility 1/2 Proto schemas are detailed with validation constraints, error handling covers concrete failure modes (HostSelectionFailed, invalid reference, label mismatch), and risks name specific technical scenarios with concrete mitigations. However, a backward compatibility contradiction undermines implementation readiness: instance_type is marked required (min_len=1) in the proto but the Upgrade Strategy claims 'catalog_item workflow remains fully functional' for incremental adoption — these are mutually
Testability 2/2 Test plan specifies concrete scenarios at each level: unit tests for CRUD, validation, host_label_selector logic, and status conditions; integration tests for end-to-end provisioning, invalid references, and host selection failure; E2E tests for complete multi-persona workflows, concurrent provisioning, and backend filtering. The 'Challenging Test Areas' subsection identifies non-obvious testing difficulties (deletion mid-provisioning, race conditions). Graduation criteria are deferred per templ
Scope 1/2 Boundaries are well-defined with specific non-goals (billing, auto-discovery, complex lifecycle management) and a strong Alternatives section comparing four real approaches with detailed pros/cons/rejection rationale. PRD is referenced via frontmatter. However, two relevant cross-cutting dimensions from osac-dimensions.md are gaps: UI (test plan mentions 'UI and CLI workflows' but the proposal never addresses whether UI implementation is in scope or deferred) and Documentation (no mention of use
Architecture 2/2 Design follows all core OSAC patterns: standard object shape (id, Metadata, Spec, Status), clean spec/status ownership separation, tenant isolation via shared tenant annotation with owner-reference, status conditions for lifecycle state. Cross-repo dependencies are enumerated (fulfillment-service proto + bare-metal-fulfillment-operator controller). Terminology is defined upfront and used consistently. The match_labels map follows Kubernetes LabelSelector conventions. The capabilities map is a de

Verdict: A solid design that follows OSAC architectural patterns and provides detailed proto schemas, but is held back by a backward compatibility contradiction between the required instance_type field and the claimed incremental adoption path, plus missing coverage of UI and Documentation dimensions.

Feedback: Fix the backward compatibility gap: either make instance_type optional in the proto (allowing catalog_item-only creation to continue working) or update the Upgrade Strategy to acknowledge that instance_type becomes mandatory, breaking the incremental adoption claim. Add a count field to BareMetalAcceleratorSpec or remove count from the YAML example — the proto and examples must be consistent. Address the UI and Documentation cross-cutting dimensions explicitly, even if just to defer them to a later milestone.

Critical (0)

None.

Important (5)

  1. Backward compatibility contradiction: instance_type field uses (buf.validate.field).string.min_len = 1 (always required), but Upgrade Strategy says 'catalog_item workflow remains fully functional' with incremental adoption. A required instance_type breaks all existing BareMetalInstance creation paths that don't specify one. Either make instance_type optional or update the upgrade strategy to reflect the breaking change.
  2. Proto schema inconsistency: YAML example shows 'count: 2' for accelerators, but BareMetalAcceleratorSpec has no count field. The proto schema cannot represent the design's own example.
  3. UI dimension gap: Test plan references 'UI and CLI workflows for BareMetalInstanceType listing and selection' but the design never addresses whether UI support is in scope or deferred. This is a tenant-facing resource and UI coverage should be stated.
  4. Documentation dimension gap: No mention of what user-facing documentation is needed (API reference, admin guides for label coordination workflow) or whether docs are deferred.
  5. Graduation criteria are deferred without measurable conditions: only vague 'Dev Preview → Tech Preview → GA' staging is provided with no criteria defining transitions.

Suggestions (3)

  1. Clarify the public/private proto mechanism: the design shows two different BareMetalInstanceTypeSpec messages (public without host_label_selector, private with it) but doesn't explain the mechanism — separate proto packages, runtime field masking, or separate message types?
  2. Integration tests should explicitly name test infrastructure (e.g., kind cluster with mock inventory backend) per the test plan template requirements.
  3. Consider adding a count/quantity field to BareMetalAcceleratorSpec for hosts with multiple identical accelerators, rather than requiring repeated entries in the accelerators list.

Review cost

Model: claude-opus-4-6
Cost: $0.9156
Tokens: 10 in / 8.9k out
Cache: 441.4k read
Active time: 3m 18s
API calls: 0

FS-->>CloudProvider: BareMetalInstanceType created
```

Cloud Infrastructure Admins apply a label (e.g., `"gpu-large"`) to all inventory hosts that share that hardware profile. Cloud Provider Admins then create a corresponding BareMetalInstanceType in OSAC with the same label and the hardware metadata that describes those hosts. These two steps must be coordinated out-of-band — OSAC does not validate that the label on a BareMetalInstanceType matches any actual hosts at creation time.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nit: Could they apply more than one label? I think Nick has an example below with a BareMetalInstanceType with a host_label_selector that specifies two.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Clarified to say "one or more labels"

masayag added a commit to masayag/enhancement-proposals that referenced this pull request Jul 28, 2026
… add EP ref

- Remove Open Questions §11: reviewers confirmed the BMaaS operator never
  transitions to FAILED post-provisioning, so with metering starting at
  provisioning complete the question is moot
- Add BareMetalInstanceType EP (PR osac-project#119 / OSAC-2675) cross-reference to
  dependencies per carbonin's suggestion

Assisted-by: Claude Code <noreply@anthropic.com>
Co-Authored-By: Moti Asayag <masayag@redhat.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Moti Asayag <masayag@redhat.com>

@carbonin carbonin left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just one nit. Looks like something just got missed in some of the churn


## Summary

This enhancement introduces BareMetalInstanceType resources that provide a discoverable hardware type catalog for bare metal infrastructure provisioning. Cloud Provider Admins define BareMetalInstanceTypes via the OSAC API, specifying hardware metadata and a host selector using the canonical `hostType` key. Cloud Infrastructure Admins label inventory hosts to classify them by hardware profile. During provisioning, the fulfillment-service controller resolves the BareMetalInstanceType reference and sets the `hostType` in the CRD, which the bare-metal-fulfillment-operator uses for host selection.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

specifying hardware metadata and a host selector using the canonical hostType key

Is this still the case?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I updated it so it uses the labels instead of a dedicated hostType

@github-actions

Copy link
Copy Markdown

AI Design Review: EP-119

Score: 7/8 | Verdict: PASS

Criterion Score Notes
Feasibility 1/2 Strong overall detail with proto schemas, validation annotations, and specific controller mapping logic. However, three concrete gaps pull the score down: (1) BareMetalAcceleratorSpec proto is missing a 'count' field that appears in the YAML example (line 320 shows 'count: 2' but proto lines 188-192 have no count field); (2) 'instance_type' field uses min_len=1 validation on a non-optional string, making it effectively required and contradicting the backward compatibility claim that 'catalog_ite
Testability 2/2 Concrete test scenarios at all three levels: unit tests specify CRUD validation and status conditions, integration tests describe end-to-end provisioning with invalid-reference and host-failure cases, E2E tests walk through the full admin-to-tenant workflow including concurrent provisioning and multi-backend label filtering. Challenging test areas identify real edge cases (mid-provisioning type deletion, concurrent host claim races). Graduation criteria are deferred per template allowance but me
Scope 2/2 Clear boundaries with 5 specific non-goals (billing, storage inventory, multi-backend collision, auto-discovery, complex deprecation). Four real alternatives with substantive rejection rationale — especially strong. PRD referenced via frontmatter. Main dimensions (BMaaS, Inventory, Provisioning, Tenancy) thoroughly covered. Minor gaps: Documentation and UI dimensions not explicitly addressed or deferred, though UI is mentioned in the test plan.
Architecture 2/2 Follows OSAC patterns faithfully: standard object shape (id, Metadata, Spec, Status), tenant isolation annotations specified (shared tenant, owner-reference), controller reconciliation follows finalizer → status → provisioning pattern, conditions used for lifecycle state (HostSelectionFailed, HostSelectionSucceeded). Cross-component impacts clearly enumerated (fulfillment-service proto+server+controller, bare-metal-fulfillment-operator host selection). Terminology standardization from legacy hos

Verdict: A well-structured design that follows OSAC patterns and provides substantial implementation detail, held back from a perfect score by proto schema inconsistencies (missing accelerator count field, backward-incompatible instance_type validation) and an under-specified catalog item integration.

Feedback: Fix the proto/example discrepancy: BareMetalAcceleratorSpec needs a 'count' field to match the YAML example, or the example should show repeated entries instead. Make 'instance_type' an 'optional string' (or use a oneof with catalog_item) so existing clients that only set catalog_item aren't broken by the min_len=1 validation — this directly contradicts the backward compatibility guarantee in the Upgrade section. Describe what 'Enhanced to work with BareMetalInstanceType selection' means for BareMetalInstanceCatalogItems: what fields change, how does a catalog item reference an instance type, and what happens to existing catalog items that use opaque bareMetalInstanceType strings?

Critical (0)

None.

Important (4)

  1. Proto/example discrepancy: BareMetalAcceleratorSpec proto (lines 188-192) has no 'count' field, but the YAML example (line 320) uses 'count: 2'. Either add 'int32 count = 5' to the proto or fix the example to show repeated entries for multiple identical accelerators.
  2. Backward compatibility broken by validation: 'string instance_type = 20 [(buf.validate.field).string.min_len = 1]' makes instance_type effectively required on all Create requests. This contradicts the Upgrade Strategy claim that 'catalog_item workflow remains fully functional.' Use 'optional string instance_type' or a oneof to allow the transition period described in the migration path.
  3. BareMetalInstanceCatalogItems enhancement not described: The API Extensions section states catalog items are 'Enhanced to work with BareMetalInstanceType selection' but provides no detail on what changes — which fields, how the reference works, what happens to existing catalog items using opaque bareMetalInstanceType strings.
  4. The 'capabilities' map (map) in BareMetalHardwareSpec is freeform with no documented key conventions. Consider defining recommended keys or a registry pattern so that consumers (UI, CLI, tooling) can reliably interpret capability tags across different BareMetalInstanceTypes.

Suggestions (4)

  1. Documentation dimension from osac-dimensions.md is not addressed or deferred — add a sentence on whether user-facing docs (API reference, admin guide for label coordination) are in scope for this milestone.
  2. UI dimension is mentioned in the test plan (line 504: 'UI and CLI workflows for BareMetalInstanceType listing and selection') but not scoped in the design body — clarify whether UI work is in scope or deferred.
  3. The Signal RPC mentioned for PrivateBareMetalInstanceTypes ('Full CRUD + Signal RPC') is not defined — briefly describe what signals are supported and their purpose, even if the pattern mirrors existing OSAC resources.
  4. Consider adding a brief Terminology section (per reviewer expectations in review-patterns.md) to formally define BareMetalInstanceType, host_label_selector, and the relationship between labels on inventory hosts and labels in the type's match_labels map.

Review cost

Model: claude-opus-4-6
Cost: $0.9513
Tokens: 10 in / 9.9k out
Cache: 445.8k read
Active time: 3m 47s
API calls: 0

The fulfillment-service sets host selector labels (Spec.Selector.HostSelector)
not the hostType field. Updated all sections that incorrectly referenced
setting hostType in the CRD. Removed canonical hostType key validation
requirement since labels pass through without transformation.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Austin Jamias <ajamias@redhat.com>
@ajamias
ajamias force-pushed the design/OSAC-1201 branch from bda9fd9 to 0d5afa0 Compare July 28, 2026 20:27
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-119

Score: 7/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Full proto schemas provided for all messages with buf.validate annotations (required fields, min_len, gt constraints). All lifecycle operations covered: public List/Get, private CRUD + Signal RPC. Controller mapping logic shown with Go code snippets. Four specific technical risks with concrete mitigations (label coordination failure surfaced via status conditions, hardware metadata is informational-only, freeform capabilities for schema evolution, versioned private API for skew). Drawbacks secti
Testability 2/2 Test plan specifies concrete scenarios at all three levels. Unit tests: CRUD operations, hardware validation with malformed input, host_label_selector reconciler logic with mocked inventory clients, status condition updates. Integration tests: end-to-end provisioning workflow, invalid instance_type reference, host selection failure. E2E tests: full multi-persona workflow, UI/CLI workflows, concurrent provisioning, backend-specific filtering. Challenging test areas identified (mid-provisioning ty
Scope 1/2 Boundaries mostly clear with specific non-goals (billing, storage inventory, multi-backend collision, auto-discovery, deprecation workflows). Four real alternatives with pros/cons/rejection rationale — strongest alternatives section among recent designs. PRD referenced in frontmatter. However, several cross-cutting dimensions from osac-dimensions.md are not addressed or explicitly deferred: Documentation (new API and 3-persona workflows need user-facing docs), UI (test plan mentions 'UI and CLI
Architecture 2/2 All OSAC patterns followed: standard object shape (id, Metadata, Spec, Status), tenant isolation annotations (osac.openshift.io/tenant as 'shared', osac.openshift.io/owner-reference), public/private API split, controller reconciliation patterns, conditions for lifecycle state (HostSelectionFailed, UnsupportedOperation). Dependencies clearly enumerated across fulfillment-service, bare-metal-fulfillment-operator, and inventory backends. Terminology evolution from hostType/host_type/HostType to Bar

Verdict: A well-structured design document that follows OSAC architectural patterns, provides comprehensive proto schemas with validation, and includes a concrete multi-level test plan, but falls short on cross-cutting dimension coverage — Documentation, UI, and Installation dimensions are neither addressed nor explicitly deferred.

Feedback: Address the silent cross-cutting dimension gaps: explicitly state whether UI work, user-facing documentation, and osac-installer changes are in scope or deferred (with a tracking reference). Fix the proto/YAML inconsistency in BareMetalAcceleratorSpec — the YAML example includes 'count: 2' but the proto schema has no count field; clarify whether multiple accelerators of the same type are represented as repeated entries or via a count field. Elaborate on the BareMetalInstanceCatalogItems modification mentioned in API Extensions — it is listed as a modified service but the implementation details section does not describe the changes.

Critical (0)

None.

Important (3)

  1. Cross-cutting dimension gaps: Documentation dimension is relevant (new API, 3-persona workflows) but not addressed or deferred. UI dimension is relevant (test plan references 'UI and CLI workflows for BareMetalInstanceType listing and selection') but has no dimension discussion or explicit deferral. Installation dimension likely relevant (new database table, new API endpoints) but Infrastructure Needed says 'none' without explaining why no osac-installer changes are needed. Per osac-dimensions.m
  2. Proto/YAML inconsistency in BareMetalAcceleratorSpec: the proto schema defines 'repeated BareMetalAcceleratorSpec accelerators' with fields type, model, vendor, memory_gb — but the YAML example shows 'count: 2' as a field. Either the proto needs a count field or the example should show two separate list entries. This affects how implementers represent multi-GPU configurations.
  3. BareMetalInstanceCatalogItems listed as a modified service in API Extensions ('Enhanced to work with BareMetalInstanceType selection') but implementation details do not describe what changes are needed. This leaves a gap for implementers.

Suggestions (3)

  1. Clarify the purpose of the Signal RPC mentioned for the PrivateBareMetalInstanceTypes service — other OSAC resources use Signal for lifecycle transitions, but the design does not explain what signal operations apply to BareMetalInstanceType.
  2. Consider adding measurable graduation criteria even at this stage — e.g., 'All CRUD operations pass e2e, label-based provisioning succeeds with both OpenStack and Metal3 backends, no regressions in existing bare metal tests' — to avoid deferred criteria becoming forgotten criteria.
  3. The networking port roles section (fabric, management, storage, lifecycle) is well-defined but could benefit from a brief note on how these port roles interact with existing networking API resources (VirtualNetwork, Subnet) when a BareMetalInstance is provisioned — especially the fabric port default selection logic for BMaaS and CaaS.

Review cost

Model: claude-opus-4-6
Cost: $0.6134
Tokens: 8 in / 6.9k out
Cache: 323.1k read
Active time: 2m 37s
API calls: 0

@openshift-ci

openshift-ci Bot commented Jul 28, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: ajamias, carbonin, tzumainn

The full list of commands accepted by this bot can be found here.

The pull request process is described here

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@openshift-merge-bot
openshift-merge-bot Bot merged commit 17ec270 into osac-project:main Jul 28, 2026
5 checks passed
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 2, 2026
…uture

BMaaS design: reverted to HostType for interface validation (v0.2).
Added "Future: BareMetalInstanceType Integration" section documenting
the migration plan when PR osac-project#119 lands with enhanced network_ports.

HostType is the system-level resource that exists today and works for
both CaaS and BMaaS. BareMetalInstanceType will be the tenant-facing
catalog once it's available.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 2, 2026
… add EP ref

- Remove Open Questions §11: reviewers confirmed the BMaaS operator never
  transitions to FAILED post-provisioning, so with metering starting at
  provisioning complete the question is moot
- Add BareMetalInstanceType EP (PR osac-project#119 / OSAC-2675) cross-reference to
  dependencies per carbonin's suggestion

Assisted-by: Claude Code <noreply@anthropic.com>
Co-Authored-By: Moti Asayag <masayag@redhat.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Signed-off-by: Moti Asayag <masayag@redhat.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

7 participants