Skip to content

OSAC-1421: Tenant-managed cluster node_sets - #108

Merged
openshift-merge-bot[bot] merged 1 commit into
osac-project:mainfrom
batzionb:prd/OSAC-1421-cluster-node-sets
Jul 27, 2026
Merged

openshift-merge-bot[bot] merged 1 commit into
osac-project:mainfrom
batzionb:prd/OSAC-1421-cluster-node-sets

Conversation

@batzionb

@batzionb batzionb commented Jul 9, 2026 •

Copy link
Copy Markdown
Contributor

Summary

Updates the cluster and VM provisioning wizard PRD and design for tenant-managed spec.node_sets on the Configuration step:

  • Wizard does not load or apply ClusterTemplate.spec.node_sets
  • Tenants add/remove node set rows; each row collects host_type (dropdown from HostTypes.List) and size only (ClusterNodeSet)
  • Map key = host type id; duplicate host types blocked
  • v1: catalog item field_definitions defaults for spec.node_sets do not apply — table starts empty on catalog selection

Jira

OSAC-1421

Files

  • enhancements/cluster-and-vm-provisioning-wizard/prd.md — §2.1.1, §2.1.2, new §2.1.6, acceptance criteria, §5
  • enhancements/cluster-and-vm-provisioning-wizard/design.md — Cluster Configuration specifics, test plan, sequence diagram

Test plan

  • PRD and design are internally consistent
  • Reviewer confirms node_sets model matches API (ClusterNodeSet: host_type + size)
  • osac-ui OSAC-1892 implementation can be updated to match (follow-up)

Made with Cursor

Summary by CodeRabbit

  • Documentation
    • Updated provisioning wizard documentation to define a clear five-step flow: Catalog Item, General, Configuration, Networking, and Review.
    • Clarified field defaults, validation behavior, optional SSH key handling, catalog overlays, and payload rules.
    • Documented cluster host type selection and node set composition.
    • Expanded acceptance criteria, testing guidance, risks, and outstanding decisions.

@openshift-ci
openshift-ci Bot requested review from eliorerz and tzvatot July 9, 2026 09:53
@coderabbitai

coderabbitai Bot commented Jul 9, 2026 •

Copy link
Copy Markdown

Review Change Stack

Walkthrough

The design and PRD now define a five-step adapter-driven provisioning wizard, scoped catalog overlays, tenant-composed cluster node_sets, optional SSH key omission rules, revised API dependencies, Formik/Yup validation behavior, and expanded component and smoke-test scenarios.

Changes

Wizard specification updates

Layer / File(s) Summary
Wizard flow and catalog overlay semantics
enhancements/.../design.md, enhancements/.../prd.md
Defines the five-step flow, adapter-owned Configuration and Networking content, General field behavior, non-picker catalog overlays, optional SSH key semantics, and updated document metadata.
Cluster node_sets and adapter contracts
enhancements/.../design.md, enhancements/.../prd.md
Specifies tenant-managed node_sets, host type list usage, payload mapping, duplicate and size validation, removal of template fetching, the general-field resolver hook, and Formik/Yup orchestration.
Validation and test plan
enhancements/.../design.md
Adds Vitest, jsdom, and RTL harness details with scenarios for step gating, navigation state, cancel/discard behavior, review rendering, submission errors, and manual VM/cluster flows.

Estimated code review effort: 3 (Moderate) | ~20 minutes

Possibly related PRs

Suggested labels: lgtm

Suggested reviewers: eliorerz, tzvatot, tchughesiv

🚥 Pre-merge checks | ✅ 10 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Ai-Attribution ⚠️ Warning HEAD mentions Cursor and includes a Co-authored-by trailer for Cursor, even though Assisted-by is present. Remove the AI Co-authored-by trailer and use only Red Hat attribution (Assisted-by or Generated-by) for AI tool assistance.
✅ Passed checks (10 passed)
Check name Status Explanation
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 No hardcoded secrets, embedded-credential URLs, or base64-like literals were found in the changed docs; matches were ordinary secret-related wording only.
No-Weak-Crypto ✅ Passed Only PRD/design docs changed; targeted scan found no MD5/SHA1/DES/RC4/3DES/Blowfish/ECB, custom crypto, or secret/token comparison code.
No-Injection-Vectors ✅ Passed Only PRD/design markdown changed; scans found no eval/shell/yaml.load/pickle.loads/dangerouslySetInnerHTML or similar code paths.
Container-Privileges ✅ Passed Only markdown docs changed; no container/K8s manifests or privileged settings were introduced.
No-Sensitive-Data-In-Logs ✅ Passed Docs-only PR; scanned both files and found no log statements or examples exposing secrets/PII.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly captures the main change: tenant-managed cluster node_sets for the provisioning wizard.
✨ 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

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown

AI EP Review: EP-108

Score: 8/10 | Verdict: PASS

Criterion Score Notes
What 2/2 Clear, specific user-observable capabilities: tenant-composed node sets with add/remove rows, host type picker with unique constraint, catalog overlay on General basics fields, detailed field tables p
Why 1/2 The diff updates an existing PRD to resolve open decisions (SSH key optionality, cluster node_sets composition model). Business justification for the overall provisioning wizard feature is presumably
How 1/2 Mostly user-focused with specific field tables, validation rules, and observable wizard behavior. Minor design leakage in the PRD: references to 'applyFieldDefinitions' (internal function name), 'clus
Task 2/2 Clearly an enhancement — a new provisioning wizard feature with five-step flow, adapter pattern for VM/cluster resources, catalog overlay system, and picker APIs. Not a bug fix, operational task, or i
Size 2/2 Focused on one coherent feature: a provisioning wizard with shared step infrastructure and per-resource-type adapters. The shared framework (step model, catalog overlay, validation) and adapters (VM,

Verdict: The PRD update is well-structured with clear user-observable capabilities and focused scope, held back slightly by absent business justification for the design changes and minor design leakage (internal function/proto references) in what should be a user-facing document.

Feedback: Move the three internal implementation references out of prd.md into design.md: 'applyFieldDefinitions' (line referencing fulfillment server-side behavior), 'cluster_type.proto', and 'Per ClusterNodeSet in cluster_type.proto' — restate these as user-observable behaviors instead (e.g., 'fulfillment may still apply the catalog default server-side when defined' without naming the internal function). Add a brief rationale in the PRD for why cluster node_sets shifted from template-driven to tenant-composed — what user problem or product constraint motivated this change? This strengthens the WHY for reviewers evaluating the design shift.

Critical (0)

None.

Important (2)

  1. PRD references internal implementation details: 'applyFieldDefinitions' (fulfillment internal function), 'cluster_type.proto', and 'Per ClusterNodeSet in cluster_type.proto' are design-level references that belong in design.md. Rewrite as user-observable statements — e.g., replace 'fulfillment may still apply the catalog default server-side via applyFieldDefinitions' with 'fulfillment may still apply the catalog default server-side when defined'.
  2. No business justification visible for the node_sets design change from template-driven to tenant-composed. The PRD resolves this as a decision but doesn't explain WHY tenant-composed is the right model — what user pain or product constraint drove this shift? Adding 1-2 sentences of rationale would strengthen the PRD for reviewers.

Suggestions (2)

  1. Explicitly map affected OSAC personas (Tenant User for provisioning, Tenant Admin for pull secret management) in the PRD summary or requirements section to improve clarity for cross-team reviewers.
  2. The resolved open decision for SSH key/public key optionality is well-documented in §5 but the resolution rationale is absent — a brief note on why optional-with-catalog-default was chosen over required would help future readers.

Review cost

Model: claude-opus-4-6
Cost: $0.6356
Tokens: 6.1k in / 6.3k out
Cache: 87.3k read
Active time: 2m 17s
API calls: 0

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

github-actions Bot commented Jul 9, 2026

Copy link
Copy Markdown

AI Design Review: EP-108

Score: 8/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 All API dependencies are concrete and named (HostTypes.List, existing create APIs). The shift from ClusterTemplates.Get to tenant-composed node_sets simplifies the data flow. Payload format is fully s
Testability 2/2 Comprehensive three-tier test plan: unit tests for pure logic (validateStep, buildCreatePayload, Yup fragments), component tests with Vitest + jsdom + Testing Library (validation gating, back-navigati
Scope 2/2 Changes are well-bounded: tenant-composed node_sets replaces template-driven flow (removes ClusterTemplates.Get dependency), General basics overlay is a limited extension to three specific paths (ssh_
Architecture 2/2 Adapter pattern cleanly extended with optional resolveGeneralFields. Single Formik/Yup schema preserved. The unique-host-type-per-row constraint with host_type_id as map key is consistent with Cluster

Verdict: A well-structured design revision that simplifies cluster node_sets to tenant-composed rows, extends catalog overlay to General basics fields, resolves open optionality decisions, and adds a thorough component test plan — all changes are consistent across PRD and design doc with clear API contracts.

Feedback: The resolveGeneralFields optional adapter method appears alongside the existing static generalFields property, but the design doesn't specify resolution priority or when to use one vs the other — a one-line note on fallback behavior would prevent implementer confusion. Consider specifying the UX for a failed HostTypes.List load on the cluster Configuration step (empty table? retry button? inline error?), since the test plan references 'picker hook error' generically but the design doesn't describe this failure mode. The server-side applyFieldDefinitions fallback for omitted basics fields is mentioned once — confirm with the fulfillment team that this contract is stable, since the wizard's omit-when-blank behavior depends on it.

Critical (0)

None.

Important (1)

  1. The resolveGeneralFields? adapter method and static generalFields property coexist on the CatalogProvisionAdapter interface without documented resolution priority — implementers need to know whether resolveGeneralFields replaces or augments generalFields when both are present.

Suggestions (3)

  1. Specify the UX for HostTypes.List API failure on cluster Configuration (error state, retry affordance, whether the table renders empty or shows an error banner) — the test plan references this scenario but the design leaves the behavior implicit.
  2. The applyFieldDefinitions server-side fallback for omitted optional basics fields is load-bearing for the wizard's omit-when-blank contract — worth a brief note confirming this is a stable fulfillment-service guarantee rather than incidental behavior.
  3. The unique-host-type-per-row constraint (map key = host_type_id) precludes multiple node sets of the same host type. This is fine for v1 but could be called out explicitly as a known v1 limitation if the API proto doesn't enforce this constraint server-side.

Review cost

Model: claude-opus-4-6
Cost: $0.4951
Tokens: 6.1k in / 2.8k out
Cache: 82.8k read
Active time: 1m 13s
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: 1

🤖 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/cluster-and-vm-provisioning-wizard/prd.md`:
- Around line 94-99: The validation matrix for the wizard currently implies
read-only fields still use validation_schema, which conflicts with the
field-definition contract. Update the PRD entry around the wizard field mapping
so validation only applies to editable fields, and ensure any field with
editable: false is either excluded from Yup validation or required to have a
default. Reference the matching-entry rules for Label, Editable, Default, and
Validation in the provisioning wizard section when making the fix.
🪄 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: 9f8dcca2-59b7-49b0-b53d-a720d4900914

📥 Commits

Reviewing files that changed from the base of the PR and between d9151eb and 5662f32.

📒 Files selected for processing (2)
  • enhancements/cluster-and-vm-provisioning-wizard/design.md
  • enhancements/cluster-and-vm-provisioning-wizard/prd.md

Comment thread enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/prd.md
@vladikr

vladikr commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

+1 looks good to me as well
/lgtm

@openshift-ci

openshift-ci Bot commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

@vladikr: changing LGTM is restricted to collaborators

Details

In response to this:

+1 looks good to me as well
/lgtm

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 kubernetes-sigs/prow repository.


**Cluster Networking specifics:** `spec.network.pod_cidr` and `spec.network.service_cidr` are optional — omit from payload when empty. Yup validates format only when a value is present.

**Step validation:** Next is always enabled. On click, run the step Yup schema, `setTouched` for all step fields, surface inline errors for untouched fields, and show an alert if invalid; do not advance until the step passes.

### API Extensions

No API extensions. The wizard consumes existing `ComputeInstanceCatalogItems`, `ClusterCatalogItems`, `InstanceTypes`, networking list APIs (`GET /api/fulfillment/v1/virtual_networks`, `.../subnets`, `.../security_groups`), `ClusterTemplates`, `HostTypes`, and create APIs. Server-side catalog validation (`catalog_item_validation.go`) is unchanged.
No API extensions to create payloads. The wizard consumes existing `ComputeInstanceCatalogItems`, `ClusterCatalogItems`, `InstanceTypes`, networking list APIs (`GET /api/fulfillment/v1/virtual_networks`, `.../subnets`, `.../security_groups`), `HostTypes.List` (`GET /api/fulfillment/v1/host_types`), and create APIs. Server-side catalog validation (`catalog_item_validation.go` / `applyFieldDefinitions`) still applies catalog `field_definitions` on create when the client omits a field the wizard left blank. The wizard does **not** use `ClusterTemplates.Get` for Configuration `node_sets`.

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

if the tenant user won't put any value in the nodeset then it will be taken by the BE from the catalog item. And if the catalog item don't have nodeset as well, it will be taken from the template default. So why not showing it in the UI?
like any other editable/non editable field we show

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.

Why do we need two levels of defaults? Why not just have default values in the catalog item?
If we want to show default values for node sets we need to define what happens if it contains a none existing host type.

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.

We agreed to wait for API so let's just merge this now as this was implementation for 0.1

@AlonaKaplan

Copy link
Copy Markdown

Concern: UI duplicating backend default-resolution logic

The current design has the UI reimplementing the backend's default-resolution pipeline — reading field_definitions, applying defaults, deciding editable vs. read-only per field. This is the same logic the server already owns in applyFieldDefinitions + validateAndTransformCluster.

The node_sets gap illustrates the problem: the UI can't fully replicate the backend's fallback chain (catalog field_definitions defaults → template defaults) without also calling ClusterTemplates.Get, at which point it's truly duplicating server-side business logic. As a result, node_sets is carved out as a special case — the table starts empty even though the server may apply catalog or template defaults on create. Every other overlaid field shows catalog defaults to the tenant, but node_sets doesn't, and template defaults are invisible for all fields.

This will keep accumulating inconsistencies as new fields or overlay rules are added.

Suggestion: backend-owned default resolution

Instead of the UI maintaining a parallel overlay implementation, consider a "resolve defaults" endpoint — e.g. POST /api/fulfillment/v1/clusters/resolve — that takes a catalog item ID (and optionally a partial spec with tenant edits) and returns:

  1. The fully merged spec (catalog defaults + template defaults applied)
  2. Per-field editability metadata (editable/read-only, display_name, validation_schema)

The UI becomes a renderer: call resolve on catalog selection, populate the form with what comes back, mark fields editable or read-only based on the response metadata. No client-side overlay logic, no need to know about templates or field_definitions parsing.

Benefits:

  • Single source of truth for default resolution (server)
  • UI doesn't drift from server behavior
  • Template defaults become visible to the tenant automatically
  • node_sets just works — the backend returns resolved rows and the UI shows them like any other field
  • Adding new overlay rules or field types doesn't require UI-side changes

This could be a v2 improvement — not necessarily blocking this PR — but worth considering before the UI overlay logic grows further.

tchughesiv added a commit to tchughesiv/enhancement-proposals that referenced this pull request Jul 22, 2026
… main pass

These 3 directories were missed by the original OSAC-2870 naming
cleanup (osac-project#139/osac-project#144) specifically because they had active, unmerged PRs
against them at the time the plan was drafted, so their Jira keys and
directory names were still moving targets:

- storage-control-plane-osac-2872 -> OSAC-2872-storage-control-plane
  (Jira key existed, but was still on an open PR (osac-project#134) that hadn't
  merged to main yet when osac-project#139 was planned/built)
- cluster-and-vm-provisioning-wizard -> OSAC-1421-cluster-and-vm-provisioning-wizard
  (key OSAC-1421 has been in the doc's tracking-link since June; PR osac-project#108
  was open against it at audit time)
- metering-and-usage-tracking -> OSAC-985-metering-and-usage-tracking
  (key OSAC-985 has been in the doc's tracking-link for weeks; PRs osac-project#131
  and osac-project#143 were open against it at audit time)

Updated the one cross-reference found repo-wide pointing at the old
cluster-and-vm-provisioning-wizard path (in
OSAC-1319-bare-metal-instance-ui/design.md). No cross-references found
for the other two.

Note: PR osac-project#131 (open, adds a new metering-and-usage-tracking/design.md)
will need to retarget to the new path when it rebases, since it adds a
file git has no rename history for -- flagging this on that PR
separately.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.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>
@batzionb
batzionb force-pushed the prd/OSAC-1421-cluster-node-sets branch from 5662f32 to ac10ca0 Compare July 26, 2026 07:28
@github-actions

Copy link
Copy Markdown

AI EP Review: EP-108

Score: 9/10 | Verdict: PASS

Criterion Score Notes
What 2/2 Excellent clarity. The PRD describes a five-step wizard (Catalog Item → General → Configuration → Networking → Review) for provisioning VMs and clusters with detailed per-resource field tables, exact paths, widgets, and required status. Tenant persona is clearly identified. The node_sets changes are well-specified: tenant-composed rows with host_type picker (§2.1.6) and size input, unique host type validation, and explicit payload structure with JSON example. Catalog overlay rules for General ba
Why 1/2 Business justification is implicit but not explicitly argued in the visible changes. The PRD summary states tenants provision VMs and clusters via a wizard, and the changes resolve open decisions (ssh_key optionality, node_sets composition approach), but the diff does not show a problem statement or impact rationale for the shift from template-driven to tenant-composed node_sets. The WHY likely exists in unchanged sections of the PRD, but within the changes reviewed, the motivation is assumed ra
How 2/2 Highly specific and measurable. Field tables define exact paths, labels, widgets, and required status. Catalog overlay rules are tabulated (display_name, editable, default, validation_schema). New §2.1.6 specifies the host type picker API with REST/gRPC endpoints, option labels, selected values, payload structure, and a concrete JSON example. Validation rules are explicit (unique host types, size > 0, at least one row). Edge cases are addressed: blank optional fields omitted from payload, catalo
Task 2/2 This is clearly a product feature enhancement — a multi-step provisioning wizard requiring new UI components, API integration, form validation, catalog overlay logic, and adapter-specific configuration steps. Not documentation, content, or a bug fix.
Size 2/2 Well-scoped to a single wizard feature. The two adapters (VM and cluster) share wizard infrastructure (steps, catalog overlay, validation, navigation) and cannot ship independently — provisioning without catalog selection is meaningless, and catalog overlay without the wizard steps has no surface. The changes refine existing scope (resolving node_sets composition, extending overlay to General basics) without introducing separable capabilities.

Verdict: Strong PRD with clear user-observable capabilities, detailed field specifications, and well-resolved open decisions; the only gap is that the business justification for the node_sets approach shift is not explicitly stated in the changed sections.

Feedback: The shift from template-driven to tenant-composed node_sets is a significant design decision — add a sentence in the summary or §2.1.1 notes explaining why this better serves tenants (e.g., flexibility, no dependency on pre-configured templates). Remove the 'applyFieldDefinitions' function name from §2.1.2 and the 'ClusterNodeSet in cluster_type.proto' reference from §2.1.6 — these are server-side implementation details; describe the payload contract in user-facing terms only. Two open '?' fields remain unresolved in the cluster table (pod_cidr, service_cidr, boot_disk.size_gib) — consider resolving them in this revision to avoid blocking implementation.

Critical (0)

None.

Important (2)

  1. Business justification for the template-to-tenant-composed node_sets shift is absent — the PRD resolves the open decision but does not explain why tenant-managed rows are preferable to template-driven defaults, making the rationale opaque to reviewers.
  2. Minor design leakage: §2.1.2 references 'applyFieldDefinitions' (a server-side Go function), and §2.1.6 references 'ClusterNodeSet in cluster_type.proto' — both are implementation details that should be expressed as payload contracts or user-observable behavior instead.

Suggestions (2)

  1. Three '?' fields remain unresolved in the open decisions table (spec.boot_disk.size_gib, spec.network.pod_cidr, spec.network.service_cidr) — resolving them in this revision would prevent implementation ambiguity.
  2. The non-goals entry for cluster template node_sets defaults could briefly note the alternative that was rejected and why, so future readers understand the decision without checking git history.

Review cost

Model: claude-opus-4-6
Cost: $0.6962
Tokens: 6 in / 5.2k out
Cache: 182.0k read
Active time: 1m 57s
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: 3

🤖 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/OSAC-1421-cluster-and-vm-provisioning-wizard/design.md`:
- Line 73: Update adapter.getReviewSections() so the Review step redacts the
pull_secret value rather than exposing the raw secret, while preserving the
existing wizard field labels and values for other fields. Add coverage verifying
the raw pull_secret never appears in the rendered Review sections.
- Line 88: Resolve the inconsistency between tenant-cleared optional basics
fields and fulfillment defaults by choosing and documenting an explicit
suppression/null contract or fallback-to-default semantics. Update
enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/design.md lines 88 and
101, enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/design.md lines
292-293, and enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/prd.md
line 101 so the applyFieldDefinitions behavior, acceptance language, and payload
tests all reflect the chosen backend behavior.

In `@enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/prd.md`:
- Around line 244-247: Resolve the requiredness contradiction by marking
spec.boot_disk.size_gib, spec.network.pod_cidr, and spec.network.service_cidr as
optional in the acceptance criteria and removing their entries from §5 Open
Decisions. Keep the claim that all requiredness decisions are resolved.
🪄 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: Pro Plus

Run ID: a8830ca3-94e0-4b7a-b478-b7f54a3d7898

📥 Commits

Reviewing files that changed from the base of the PR and between 5662f32 and ac10ca0.

📒 Files selected for processing (2)
  • enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/design.md
  • enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/prd.md

Comment thread enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/design.md
Comment thread enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/design.md
Comment thread enhancements/OSAC-1421-cluster-and-vm-provisioning-wizard/prd.md
@github-actions

Copy link
Copy Markdown

AI Design Review: EP-108

Score: 7/8 | Verdict: PASS

Criterion Score Notes
Feasibility 2/2 Very specific implementation details: CatalogProvisionAdapter TypeScript interface spelled out, Formik/Yup single-schema strategy with per-step validation, concrete JSON payload examples for node_sets, shared helpers named, catalog overlay edge cases (editable/read-only with/without defaults) fully specified. Risks are specific with concrete mitigations (e.g., jsdom limitations mitigated by shared test helpers and mocks). No hand-waving on hard parts.
Testability 2/2 Excellent test plan with 30+ concrete scenarios across unit tests (validateStep, wizardBuild, adapter schemas), component tests (Vitest + jsdom + Testing Library covering validation/step-gating, back navigation/state, cancel/discard, forward/review, submit/API errors, adapter-specific), i18n/lint gates, and manual smoke testing. Shared test infrastructure specified (fixtures, flow helpers, render wrapper, mock API). 'Component tests are required for merge' is a concrete graduation condition.
Scope 1/2 Clear boundaries with specific non-goals (no ClusterTemplate node_sets defaults, no Multi-NIC, no BareMetalInstance, no additional_disks). PRD referenced via frontmatter. Open decisions resolved (ssh_key/ssh_public_key as Optional, node_sets as tenant-composed). However, E2E testing (osac-test-infra or Cypress) and Documentation dimensions from osac-dimensions.md are neither addressed nor explicitly deferred — silence on relevant dimensions is a gap.
Architecture 2/2 UI-only design — CRD/controller/tenant-isolation checks are N/A. For applicable checks: dependencies well-identified (fulfillment-service PRs #734/#735, HostTypes.List, catalog item APIs), cross-repo impact noted (osac-installer image pins), adapter pattern cleanly isolates VM/cluster divergence, terminology consistent throughout. The shift from template-driven to tenant-composed node sets is architecturally sound and aligned with ClusterNodeSet contract.

Verdict: Strong UI design revision with excellent implementation specificity and test coverage; held back from a perfect score only by silent gaps on E2E testing and documentation cross-cutting dimensions.

Feedback: Address the E2E testing and Documentation dimensions from osac-dimensions.md — either describe what's needed (e.g., Cypress E2E scenarios in osac-test-infra, user-facing doc updates for the new wizard) or explicitly defer them with a rationale. This is the only gap preventing a top score. Consider also noting what happens when the HostTypes.List returns an empty list (no available host types) — the current design specifies 'at least one row required' validation but doesn't address the case where the host type picker has no options to offer.

Critical (0)

None.

Important (2)

  1. E2E testing dimension (osac-dimensions.md) not addressed: the design specifies component tests and manual smoke but is silent on whether osac-test-infra pytest E2E tests or Cypress UI E2E tests are needed for the wizard provisioning flow. Address or explicitly defer.
  2. Documentation dimension (osac-dimensions.md) not addressed: no mention of whether user-facing documentation needs updating for the new wizard behavior (tenant-composed node sets, catalog overlay on General basics). Address or explicitly defer.

Suggestions (3)

  1. Consider documenting the empty host-type-list edge case: if HostTypes.List returns zero results, the tenant cannot add any node set rows and cannot proceed past Configuration. The design should specify the UX for this state (e.g., empty state message, link to admin).
  2. The test plan could mention accessibility testing for wizard keyboard navigation and screen reader compatibility, which is relevant for PatternFly compliance.
  3. Graduation criteria could be strengthened beyond 'component tests required for merge' — e.g., 'all validation, navigation, and submit scenarios pass component tests; pnpm lint and pnpm i18n pass; manual smoke on both VM and cluster create paths verified.'

Review cost

Model: claude-opus-4-6
Cost: $0.4952
Tokens: 6 in / 5.0k out
Cache: 204.1k read
Active time: 1m 50s
API calls: 0

@batzionb
batzionb dismissed AlonaKaplan’s stale review July 26, 2026 07:39

Now that we have API this will change, but for now we should get this merged to match the implementation we have for 0.1

@openshift-ci

openshift-ci Bot commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

[APPROVALNOTIFIER] This PR is APPROVED

This pull-request has been approved by: batzionb, danmanor, ElayAharoni

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

@batzionb batzionb changed the title PRD: Tenant-managed cluster node_sets (OSAC-1421) OSAC-1421: Tenant-managed cluster node_sets Jul 27, 2026
@openshift-ci-robot

openshift-ci-robot commented Jul 27, 2026 •

Copy link
Copy Markdown

@batzionb: This pull request references OSAC-1421 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:

Summary

Updates the cluster and VM provisioning wizard PRD and design for tenant-managed spec.node_sets on the Configuration step:

  • Wizard does not load or apply ClusterTemplate.spec.node_sets
  • Tenants add/remove node set rows; each row collects host_type (dropdown from HostTypes.List) and size only (ClusterNodeSet)
  • Map key = host type id; duplicate host types blocked
  • v1: catalog item field_definitions defaults for spec.node_sets do not apply — table starts empty on catalog selection

Jira

OSAC-1421

Files

  • enhancements/cluster-and-vm-provisioning-wizard/prd.md — §2.1.1, §2.1.2, new §2.1.6, acceptance criteria, §5
  • enhancements/cluster-and-vm-provisioning-wizard/design.md — Cluster Configuration specifics, test plan, sequence diagram

Test plan

  • PRD and design are internally consistent
  • Reviewer confirms node_sets model matches API (ClusterNodeSet: host_type + size)
  • osac-ui OSAC-1892 implementation can be updated to match (follow-up)

Made with Cursor

Summary by CodeRabbit

  • Documentation
  • Updated provisioning wizard documentation to define a clear five-step flow: Catalog Item, General, Configuration, Networking, and Review.
  • Clarified field defaults, validation behavior, optional SSH key handling, catalog overlays, and payload rules.
  • Documented cluster host type selection and node set composition.
  • Expanded acceptance criteria, testing guidance, risks, and outstanding decisions.

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.

@openshift-merge-bot
openshift-merge-bot Bot merged commit 19e28b3 into osac-project:main Jul 27, 2026
5 checks passed
slintes pushed a commit to slintes/enhancement-proposals that referenced this pull request Jul 27, 2026
… main pass

These 3 directories were missed by the original OSAC-2870 naming
cleanup (osac-project#139/osac-project#144) specifically because they had active, unmerged PRs
against them at the time the plan was drafted, so their Jira keys and
directory names were still moving targets:

- storage-control-plane-osac-2872 -> OSAC-2872-storage-control-plane
  (Jira key existed, but was still on an open PR (osac-project#134) that hadn't
  merged to main yet when osac-project#139 was planned/built)
- cluster-and-vm-provisioning-wizard -> OSAC-1421-cluster-and-vm-provisioning-wizard
  (key OSAC-1421 has been in the doc's tracking-link since June; PR osac-project#108
  was open against it at audit time)
- metering-and-usage-tracking -> OSAC-985-metering-and-usage-tracking
  (key OSAC-985 has been in the doc's tracking-link for weeks; PRs osac-project#131
  and osac-project#143 were open against it at audit time)

Updated the one cross-reference found repo-wide pointing at the old
cluster-and-vm-provisioning-wizard path (in
OSAC-1319-bare-metal-instance-ui/design.md). No cross-references found
for the other two.

Note: PR osac-project#131 (open, adds a new metering-and-usage-tracking/design.md)
will need to retarget to the new path when it rebases, since it adds a
file git has no rename history for -- flagging this on that PR
separately.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@redhat.com>
empovit pushed a commit to empovit/osac-enhancement-proposals that referenced this pull request Aug 2, 2026
… main pass

These 3 directories were missed by the original OSAC-2870 naming
cleanup (osac-project#139/osac-project#144) specifically because they had active, unmerged PRs
against them at the time the plan was drafted, so their Jira keys and
directory names were still moving targets:

- storage-control-plane-osac-2872 -> OSAC-2872-storage-control-plane
  (Jira key existed, but was still on an open PR (osac-project#134) that hadn't
  merged to main yet when osac-project#139 was planned/built)
- cluster-and-vm-provisioning-wizard -> OSAC-1421-cluster-and-vm-provisioning-wizard
  (key OSAC-1421 has been in the doc's tracking-link since June; PR osac-project#108
  was open against it at audit time)
- metering-and-usage-tracking -> OSAC-985-metering-and-usage-tracking
  (key OSAC-985 has been in the doc's tracking-link for weeks; PRs osac-project#131
  and osac-project#143 were open against it at audit time)

Updated the one cross-reference found repo-wide pointing at the old
cluster-and-vm-provisioning-wizard path (in
OSAC-1319-bare-metal-instance-ui/design.md). No cross-references found
for the other two.

Note: PR osac-project#131 (open, adds a new metering-and-usage-tracking/design.md)
will need to retarget to the new path when it rebases, since it adds a
file git has no rename history for -- flagging this on that PR
separately.

Assisted-by: Claude Code <noreply@anthropic.com>
Signed-off-by: Tommy Hughes <tohughes@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.

6 participants