Skip to content

[OSAC-3833] PRD: CaaS Bare Metal Worker Node Provisioning - #58

Closed
forgeSmith-bot wants to merge 656 commits into
ItzikEzra-rh:mainfrom
forgeSmith-bot:forge/prd/osac-3833
Closed

forgeSmith-bot wants to merge 656 commits into
ItzikEzra-rh:mainfrom
forgeSmith-bot:forge/prd/osac-3833

Conversation

@forgeSmith-bot

Copy link
Copy Markdown

PRD for OSAC-3833

The PRD document is in enhancements/OSAC-3833/prd.md on this branch.

Review the file changes for the latest version. Leave comments on this PR to provide feedback — Forge will regenerate the PRD and push updated commits.

tchughesiv and others added 30 commits July 24, 2026 10:58
design_guide.md's Review section paraphrased two of the four
design-review criteria (substituted 'tenant isolation' for 'terminology'
under Architecture, and 'PRD reference' for 'persona coverage' under
Scope) instead of quoting skills/design-review/SKILL.md's summary table.
prd_guide.md's equivalent line used 'testable requirements' where the
prd-review rubric says 'verifiable requirements'. Both corrected to
match the live rubrics exactly.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
Address reviewer feedback about file naming convention.
Files should be named design.md per enhancement-proposals pattern.

Assisted-by: Claude Code <noreply@anthropic.com>
skills/prd-review/SKILL.md and skills/design-review/SKILL.md in
osac-workspace resolve the canonical PRD/design templates and author
guides from enhancement-proposals/guidelines/*.md, falling back to
.ai-workflows/{prd,design}/templates only if that path is missing.
design-review also references enhancement-proposals/enhancements/ as a
calibration reference library (review-patterns.md's "EP Reference
Library"). The ep-review review job only cloned osac-workspace into
/opt/skills, so neither path was reachable there — the bot silently
fell back to the vendored template, losing OSAC-specific structural
checks, guide cross-links, and calibration references, with no hard CI
failure to signal the gap.

Rather than a second, independent git clone of enhancement-proposals'
mutable default branch (flagged by automated review on a prior version
of this fix as an unnecessary trust-boundary expansion given this job's
pull-requests:write/issues:write permissions), reuse the repo this same
job already checked out in its first step, at the resolved base_ref.
Copy guidelines/ and enhancements/ from that existing checkout into
/opt/skills/enhancement-proposals — no new clone, no new ref to pin.

Also guard against a ghost self-reference: if a PR updates an existing
enhancement, the pre-PR version of that same document would otherwise
sit in the staged enhancements/ reference library right alongside
.context/pr-diff.txt's new version, and could get cited by
design-review's "Comparison with Similar Designs" step as a "similar
past design" — a stale copy of the very document under review, not a
real precedent. ep_review.py now excludes the current PR's own
enhancement directory (derived from its changed files) from the staged
reference library before running each skill.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
- design_template.md: API Extensions definition omitted gRPC services,
  even though design_guide.md's own guidance for the same section
  already names them explicitly ('API Extensions names new gRPC
  services (fulfillment-service), new CRDs (osac-operator), webhooks,
  and finalizers'). Add gRPC services to the template's definition to
  match. This wording predates this PR (inherited byte-for-byte from
  osac-workspace's original .design/templates/design.md), but this PR
  makes guidelines/design_template.md the sole canonical copy going
  forward, so this is the last point to fix it.

- prd_template.md: add a top-level '# PRD Template' heading before the
  getting-started instructions (markdownlint MD041). Unlike
  design_template.md, which satisfies MD041 via its YAML frontmatter's
  title: field, prd_template.md has no frontmatter and the
  getting-started preamble is new content added by this PR (the
  original osac-workspace prd.md had no such preamble), so this is a
  gap introduced here, not a pre-existing one.

- .github/scripts/ep_review.py: add test_ep_review.py covering
  pr_enhancement_slugs and exclude_own_slug_from_reference_library —
  repeated files under one slug, multiple slugs, unrelated paths, a
  missing reference root, and an absent slug directory. Follows the
  existing test_check_ep_naming.py unittest.TestCase pattern.

Not applied: CodeRabbit's suggestion to strip the manual-authoring
'getting started' instructions from README.md, prd_guide.md,
prd_template.md, design_guide.md, and design_template.md as
contradicting AGENTS.md's 'do not create PRDs or design documents
directly in this repo' rule. That rule is AI-agent-scoped (AGENTS.md's
own framing: 'Use the osac-workspace AI workflows instead', and it
explicitly allows the guides to 'support a human author on the manual
workflow'). Every flagged location already presents the manual path as
an explicit, clearly-labeled secondary option behind 'Recommended:
AI-assisted workflow', and the pattern predates this PR (present in
osac-workspace's original design.md since the repo's initial commit).
Removing it would drop support for human contributors without
osac-workspace/AI-tooling access.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
- Fix inconsistency between embedded host_label_selector approach vs. Get RPC approach
- Clarify that operator reads host_label_selector from BareMetalInstance spec (embedded during creation)
- Remove all cluster integration content as it's out of scope per PRD
- Fix FR references to match PRD: FR-3→FR-2 (selection), FR-7→FR-5 (provisioning)
- Align authorization table with embedded approach (no service account RPC calls during provisioning)

Addresses review feedback on single host-label resolution path alignment.

Assisted-by: Claude Code <noreply@anthropic.com>
- Clarify operator extracts match_labels map from host_label_selector and passes directly to FindFreeHost
- Require hostType as canonical selector key in match_labels with validation before persistence
- Add min_pairs=1 validation to prevent empty selectors
- Update all examples to use hostType key instead of hardware-profile
- Remove match_expressions alternative to simplify API surface
- Ensure consistent data flow: BareMetalLabelSelector → extract match_labels → validate hostType → pass to inventory client

Addresses review feedback on explicit selector conversion and validation requirements.

Assisted-by: Claude Code <noreply@anthropic.com>
OSAC-2589 - PRD: ComputeInstance StorageTier Selection
Document the mapping from VolumeStatus fields to volume_context keys
in the CSI driver controller section: backend_id -> osac.backend,
vendor_volume_id -> osac.volume-id, protocol -> osac.protocol.

Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
Assisted-by: Cursor/Claude
Signed-off-by: akshaynadkarni <25892229+akshaynadkarni@users.noreply.github.com>
- 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>
Replace template-driven node_sets with tenant-composed rows: host type
dropdown from HostTypes.List, size per row, map key = host type id,
unique host types only, no catalog defaults in v1.

Assisted-by: Claude Code <noreply@anthropic.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…sue-solver/OSAC-3123

OSAC-3123: Align EP Review Bot PRD rubric with prd-review skill criteria
…Public API, and Consistency (osac-project#152)

* Add PRD for OSAC-1577: API Quality — Declarative Validation, Auto-Generated Public API, and Consistency

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Haim Tayrie <htayrie@htayrie-thinkpadt14gen5.raanaii.csb>

* PRD OSAC-1577: revise — correct OSAC-1331 scope to safe deletion

OSAC-1331 is about preventing relationships to soft-deleted objects,
not general uniqueness or referential integrity constraints.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Haim Tayrie <htayrie@htayrie-thinkpadt14gen5.raanaii.csb>

* PRD OSAC-1577: address review feedback

- Move OSAC-1275 to Prior Work section (already complete)
- Remove "at the database level" design detail from OSAC-1331 scope

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Haim Tayrie <htayrie@htayrie-thinkpadt14gen5.raanaii.csb>

---------

Signed-off-by: Haim Tayrie <htayrie@htayrie-thinkpadt14gen5.raanaii.csb>
Co-authored-by: Haim Tayrie <htayrie@htayrie-thinkpadt14gen5.raanaii.csb>
Add PRD for network bandwidth metering covering per-tenant
ingress/egress GiB transferred with consumption-based metering
model dependent on networking vendor integration.

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>
detect_skills() used endswith("design.md") which incorrectly matched
ui-design.md and ux-design.md. Switch to os.path.basename exact match.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Itzik Ezra <iezra@redhat.com>
…etect-skills-basename

OSAC-3153: fix detect_skills matching ui-design.md as design.md
Apply the same terminology cleanup as sibling metering PRDs: fix
broken Part 1 links to OSAC-985 renamed path, replace pricing/costing
language with metering equivalents, rename "Charge Calculation Model"
to "Usage Calculation Model" with pure accumulation rules (no dollar
amounts), inline Part 1 cross-cutting ACs, and add UI out-of-scope
statement consistent with other metering PRDs.

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>
Clarify Risk 10.1 per avishayt's review comment: the risk is not
that no vendor has been selected, but that it has not been confirmed
whether the vendors already integrated with OSAC (Netris,
OVN-Kubernetes) expose per-tenant traffic counter APIs that OSAC
can consume for metering.

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>
…tcomes

Address AI review feedback: rewrite CAP-3 from deployment constraint to
user-observable outcome, replace internal acceptance criteria (deduplication,
retention windows, deployment independence) with PM-verifiable criteria,
and move deployment detail to Assumptions.

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>
OSAC-3149: PRD: Metering for Network Bandwidth
Rename README.md → design.md, move PRD into same directory.
Follows the project design/prd skill template conventions.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
- Add dispatcher scope clarification (networking resources only)
- Fix interface validation: HostType's NetworkInterface list, not BMaaS
- Fix interface discovery: HostType API, not BMaaS
- Fix IPAM table: DHCP or static, not DHCP only
- Update cluster flow: CaaS BM-only for v0.2, system resolves
  fabric_interface, operator handles agent selection + networking
- Add HostType + NetworkInterface to API Extensions
- Add fabric_interface to ClusterNetworkAttachment

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
Convert from EP-style YAML frontmatter to ai-workflows PRD template:
- Metadata table replaces YAML frontmatter
- Requirements renumbered R1-R7 → FR-1 through FR-7
- Acceptance criteria consolidated in dedicated section with checkboxes
- Dependencies section added
- Section numbering aligned with PRD template

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
Detailed design for ComputeInstance unified networking integration.
ComputeNetworkAttachment with primary field, optional network_attachments
with defaults, auto ExternalIP/NATGateway, multi-NIC KubeVirt support.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
Detailed design for Cluster unified networking integration.
ClusterNetworkAttachment with node_set + fabric_interface resolution
from HostType. Operator handles agent selection and network attachment.
Step collections removed. CaaS BM-only for v0.2. Auto ExternalIP/NATGateway.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
Detailed design for BaremetalInstance unified networking integration.
BareMetalNetworkAttachment with interface + primary fields. Operator
reconcileNetworking calls dispatcher for switch port config. HostType
interface validation. Two-operator architecture. Auto ExternalIP/NATGateway.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
Remove all implementation details (proto messages, field names, CRD,
operator internals, AAP/Ansible references, component names) from
VMaaS, CaaS, and BMaaS networking PRDs. Requirements now describe
what users can do, not how it's implemented. Implementation details
belong in the design.md files.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
…er stories to VMaaS PRD

All four OSAC personas now have user stories: Tenant User, Tenant Admin,
Cloud Infrastructure Admin, Cloud Provider Admin.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
Each per-service PRD/EP now notes it is an expansion of the unified
networking PRD/EP. Fixed HostType proto comment inconsistency across
CaaS and BMaaS designs to match unified EP.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
Align with networking EP naming convention ({qualifier}-networking).

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Dan Manor <dmanor@redhat.com>
slintes and others added 28 commits August 5, 2026 17:48
Expand GuestOSFamily description in Key design points: clarify it
replaces is_windows (not new), explain enum-over-boolean rationale,
trace data flow from DiskImage through reconciler/CRD/AAP to KubeVirt
domain config, add KubeVirt docs links.

Addresses review comment by mhrivnak on PR osac-project#145.

Signed-off-by: Marc Sluiter <msluiter@redhat.com>
Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Marc Sluiter <msluiter@redhat.com>
Document user-visible differences between LINUX and WINDOWS guest OS
families: firmware, TPM, initialization method, ports, disk size, etc.
Point to ocp_virt_vm AAP role as source of truth. Note that API docs
must describe these effects for users.

Addresses review comment by mhrivnak on PR osac-project#145.

Signed-off-by: Marc Sluiter <msluiter@redhat.com>
Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Marc Sluiter <msluiter@redhat.com>
Update PRD and design per Slack agreement: all authenticated users
can create, update, and delete tenant-scoped DiskImages. Move
DiskImages CRUD to has_client_permissions in OPA policy. Add Tenant
User stories, update workflow actors, add E2E test case.

Signed-off-by: Marc Sluiter <msluiter@redhat.com>
Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Marc Sluiter <msluiter@redhat.com>
Publish the Cloud Provider Admin instance type UI design under the existing OSAC-46 enhancement path so reviewers can evaluate the proposed navigation, create flow, and lifecycle actions.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: batzionb <brotman@redhat.com>
Apply the formatting cleanup required by the enhancement-proposals pre-commit checks so the published UI design passes CI unchanged in meaning.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: batzionb <brotman@redhat.com>
Update the published design to avoid introducing a second useInstanceTypes hook name and instead call for a distinct admin/private list hook.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: batzionb <brotman@redhat.com>
Update the published design to distinguish failed instance type fetches from empty results and to use the existing list-page retry pattern for load failures.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: batzionb <brotman@redhat.com>
Adjust the list-page failure-handling text to match the current non-loading list error pattern without claiming an existing retry action.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: batzionb <brotman@redhat.com>
Clarify integer-only validation, numeric field step behavior, request conversion, and field-level backend error mapping for the instance type create flow.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: batzionb <brotman@redhat.com>
Match the existing create-route convention and simplify lifecycle action labels
so the UI design stays consistent with current patterns and reviewer feedback.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: batzionb <brotman@redhat.com>
Update the UI design so obsolete instance types can be deleted from the admin
list page while keeping delete unavailable for active and deprecated entries.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: batzionb <brotman@redhat.com>
Align the lifecycle-state color wording with the latest UX discussion by
changing the deprecated state color from gold to orange in the published design.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: batzionb <brotman@redhat.com>
OSAC-3586: UI Design - VM Instance Types UI
32 behavioral test cases covering DiskImage CRUD, lifecycle management,
tenant isolation, ComputeInstance/Template/CatalogItem integration,
and deletion protection. Mapped to PRD requirements FR-1 through FR-13
and NFR-2.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Marc Sluiter <msluiter@redhat.com>
The design document referenced synthesized FR-N and NFR-N requirement IDs
that do not exist in the PRD. The PRD uses only CAP-N and D-N prefixes.
Replace all FR/NFR references with the corresponding CAP/D equivalents:
- NFR-12 (air-gap) → CAP-14 (independent deployment)
- NFR-1 (HA) → D-2 (metering unavailability must not affect provisioning)
- NFR-2, NFR-4 (perf targets) → dropped (design targets, not PRD requirements)

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>
…ment-id-alignment

OSAC-985: align design requirement references with PRD convention
Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Avishay Traeger <atraeger@redhat.com>
- Image is mandatory and always locked during provisioning; owner can update it
- Added tenant assignment and publish/unpublish story
- Added pre-GA assumption (no migration needed)
- Added catalog item reference mandatory assumption
- Connected deletion blocking to lifecycle out-of-scope
- Added billing constraint note to cost metadata out-of-scope
- Added tenant-provided images out-of-scope with link to PR osac-project#145
- Cleaned up design leakage and removed [User] markers

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Avishay Traeger <atraeger@redhat.com>
Adds BCM (NVIDIA Base Command Manager) as a pluggable inventory
backend for bare-metal-fulfillment-operator using a hybrid
architecture: BCM for inventory, Metal3 for power management.

Key design decisions:
- BMH lifecycle interface decouples on-demand BMH creation/deletion
  from inventory backends, auto-wired when management is Metal3
- Stable ExternalHostID in namespace/name format from FindFreeHost,
  consistent with existing backends
- BMH readiness handled via existing IsTransitioning in PowerStatus,
  no new sentinel errors or controller changes needed
- Metal3 namespace sourced from management config (single source of
  truth), no duplication in inventory config
- BCM API concurrency handled via process-local mutex + leader
  election + verify-after-write defense-in-depth

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: MENNY ABOUSH <maboush@maboush-thinkpadt14gen5.raanaii.csb>
OSAC-2645: Design — BCM Backend Integration for BMaaS
- Clarify image is mandatory for VM/BM only, not clusters
- Specify only governance-relevant spec fields are exposed
- Note template parameters governed via key-value map
- Expand Tenant Admin story to cover update/unpublish/delete

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Avishay Traeger <atraeger@redhat.com>
…tems

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Avishay Traeger <atraeger@redhat.com>
OSAC-3538: PRD - Catalog Items v2 — Field Governance Redesign
OSAC-3254: PRD - Expose NIC MAC Addresses in BareMetalInstance Status
OSAC-1269: update ClusterVersion PRD and design
@ItzikEzra-rh

Copy link
Copy Markdown
Owner

Run 3 artifact saved. Closing.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.