-
Notifications
You must be signed in to change notification settings - Fork 93
OSAC-1029: Per-service networking EPs and unified EP restructuring #107
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Merged
openshift-merge-bot
merged 58 commits into
osac-project:main
from
danmanor:OSAC-1029/restructure-unified-networking
Jul 27, 2026
+3,922
−475
Merged
Changes from all commits
Commits
Show all changes
58 commits
Select commit
Hold shift + click to select a range
628f6d0
OSAC-1029: rename unified networking EP/PRD files
danmanor e2a3941
OSAC-1029: fix contradictions in unified networking EP
danmanor 148e700
OSAC-1029: restructure unified networking PRD to skill template format
danmanor f6f5949
OSAC-1435: add VMaaS networking EP and PRD
danmanor 42d9346
OSAC-1436: add CaaS networking EP and PRD
danmanor 4d23259
OSAC-1437: add BMaaS networking EP and PRD
danmanor d078d0c
OSAC-1029: rewrite per-service PRDs to be user-facing only
danmanor a4e1bce
OSAC-1029: fix trailing whitespace
danmanor 3dc059b
OSAC-1435: add missing Tenant Admin and Cloud Infrastructure Admin us…
danmanor d91e036
OSAC-1029: add expansion-of references and fix proto comment consistency
danmanor b6c4fd4
OSAC-1029: rename simplified-resource-creation to default-networking
danmanor 8f7fe5c
OSAC-1029: add default-networking design.md, update all references
danmanor 2f50d4e
OSAC-1029: update dispatcher contract params in BMaaS and CaaS designs
danmanor 6486166
OSAC-1029: clarify fabric manager vs provisioning template responsibi…
danmanor 2b0e4ee
OSAC-1029: remove IPAM from fabric manager scope in BMaaS and CaaS de…
danmanor 8476715
OSAC-1029: clarify auto-provisioning lifecycle, controller preconditi…
danmanor 38f2af7
OSAC-1029: fix review findings — controller preconditions, cleanup or…
danmanor 727e5b5
OSAC-1029: move subnet IPAM to operator, resolve IP allocation archit…
danmanor 1d92385
OSAC-1029: fix 13 stale references after operator IPAM architectural …
danmanor 08ebd72
OSAC-1029: fix final consistency issues — stale refs, labels, concurr…
danmanor eb5b113
OSAC-1029: resolve MetalLB IPAddressPool ownership (CaaS OQ#3)
danmanor bb36e94
OSAC-1029: fix default networking — fulfillment-service creates defau…
danmanor de9a010
OSAC-1029: final consistency fixes — region refs, default creation, C…
danmanor bd0b245
OSAC-1029: add gateway, prefixLength, dnsServers to host networking c…
danmanor 531e80e
OSAC-1029: fix stale BMaaS YAML example — add gateway/prefixLength/dn…
danmanor 779ced7
OSAC-1029: fix deletion flows — cleanup ownership, IP release, agent …
danmanor 813c7ba
OSAC-1029: CaaS single-subnet model — one attachment per cluster
danmanor 42a4f58
OSAC-1029: replace operator IPAM with DHCP for host-side networking
danmanor 5c2ce0a
OSAC-1029: fix 4 stale "or static" references — DHCP only
danmanor 41e9658
OSAC-1029: add Agent Pool Model — parking network and port transition…
danmanor 24731ce
OSAC-1029: fix stale 'pinned VIPs' in CaaS resolved OQ#3
danmanor db43a04
OSAC-1029: fix cross-document consistency — singular attachment, fiel…
danmanor 5d958cd
OSAC-1029: add ComputeNetworkAttachmentStatus for VMaaS IP discovery
danmanor bfb6a1f
OSAC-1029: flag BMaaS IP discovery as open question
danmanor 19726af
OSAC-1029: fix 9 cross-document consistency issues
danmanor 7190931
OSAC-1029: fix proto field numbers, PRD alignment, and architecture gaps
danmanor 7b0cf81
OSAC-1029: remove design leakage from all PRDs
danmanor 4f04a26
OSAC-1029: add CRD Go struct for ComputeNetworkAttachmentStatus
danmanor bbb62bd
OSAC-1029: resolve NATGateway reuse, mandatory defaults, address all …
danmanor 11fced0
OSAC-1029: fix field 15→18 text refs, NATGateway cleanup gaps, step n…
danmanor 2092058
OSAC-1029: clarify inter-subnet routing as fabric manager responsibility
danmanor 4d12805
OSAC-1029: simplify external access — single flag + NATGateway as VN …
danmanor b0e444d
OSAC-1029: add NATGateway to default resources not-cleaned-up list
danmanor d52a0ae
OSAC-1029: resolve all open questions, add dual-stack default subnets
danmanor 4cf62a1
OSAC-1029: fix stale body text after OQ resolutions, step numbering
danmanor ceff097
OSAC-1029: fix BMaaS IP discovery timing — separate query_dhcp_lease …
danmanor b276d98
OSAC-1029: add NATGateway VN readiness precondition + MetalLB VIP field
danmanor 2a8cc84
OSAC-1029: fix end-of-file newline
danmanor 74b5dad
OSAC-1029: replace HostType with BareMetalInstanceType, fix EP naming
danmanor a392d41
OSAC-1029: fix metallb field placement, VMaaS struct prefix, CaaS IP …
danmanor c11b358
OSAC-1029: rename unified-networking to OSAC-1433-unified-networking
danmanor cd1cd44
OSAC-1029: rename default-networking to OSAC-1433-default-networking
danmanor 4bd3534
OSAC-1029: fix k8sManager CaaS dependency, parking network config, br…
danmanor d4462a4
OSAC-1029: revert CaaS to HostType, keep BareMetalInstanceType for BMaaS
danmanor ccd1b2e
OSAC-1029: align Jira tracking links with directory names (OSAC-1433)
danmanor 5a625f9
OSAC-1029: fix remaining low-severity cosmetic issues
danmanor 5028518
OSAC-1029: use HostType for v0.2, document BareMetalInstanceType as f…
danmanor af573e1
OSAC-1029: fix ExternalIPPool prerequisite contradiction, add migrati…
danmanor File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,234 @@ | ||
| # Simplified Resource Creation — Default Networking and Auto ExternalIP | ||
|
|
||
| | Field | Value | | ||
| |-------------|---------| | ||
| | Author(s) | Dan Manor | | ||
| | Jira | https://redhat.atlassian.net/browse/OSAC-1433 | | ||
| | Date | 2026-07-02 | | ||
|
|
||
| ## 1. Problem Statement | ||
|
|
||
| Creating a reachable resource in OSAC requires 6+ sequential API calls: | ||
| VirtualNetwork, Subnet, SecurityGroup, the resource itself, ExternalIP, | ||
| and ExternalIPAttachment. Every tenant must understand the full networking | ||
| resource model before provisioning their first VM, cluster, or bare-metal | ||
| server. This friction slows onboarding, increases the chance of | ||
| misconfiguration, and makes OSAC harder to adopt compared to platforms | ||
| where a single create command produces a reachable instance. | ||
|
|
||
| ## 2. Goals and Non-Goals | ||
|
|
||
| ### 2.1 Goals | ||
|
|
||
| - A tenant can create a fully connected VM, bare-metal server, or cluster | ||
| (inbound + outbound) with a single API call, without pre-creating any | ||
| networking resources | ||
| - Tenants who need custom networking retain the full explicit workflow — | ||
| simplified creation is additive, not a replacement | ||
| - Auto-provisioned networking resources are visible, editable, and follow | ||
| the same lifecycle as manually created ones | ||
|
|
||
| ### 2.2 Non-Goals | ||
|
|
||
| - Custom default configurations per tenant (all tenants in a deployment | ||
| receive the same default CIDR and SecurityGroup rules) | ||
| - Auto-provisioning of VirtualNetworks or Subnets beyond the initial | ||
| default (tenants create additional VNs manually) | ||
| - UI support for simplified creation (deferred — API and CLI only for now) | ||
| - Automatic migration of existing tenants to receive default networking | ||
| resources (only new tenants get defaults at onboarding) | ||
|
|
||
| ## 3. User Stories | ||
|
|
||
| ### Tenant User Stories | ||
|
|
||
| - As a Tenant User, I want to create a resource (VM, cluster, or | ||
| bare-metal server) without pre-creating networking resources, so that | ||
| the system provides sensible defaults and I can get started quickly | ||
| - As a Tenant User, I want to create a resource with | ||
| `--external-ip-attachment` and have it externally reachable in a single | ||
| API call, without manually creating ExternalIP and ExternalIPAttachment | ||
| resources | ||
| - As a Tenant User, I want auto-provisioned ExternalIPs to be | ||
| automatically cleaned up when I delete the parent resource, so that I do | ||
| not accumulate orphaned resources | ||
| - As a Tenant User, I want to create a Cluster with | ||
| `--external-ip-attachment` and have the system automatically provision | ||
| ExternalIPs for both the API server and ingress endpoints before cluster | ||
| provisioning begins | ||
|
|
||
| ### Tenant Admin Stories | ||
|
|
||
| - As a Tenant Admin, I want to inspect and customize my default networking | ||
| resources (e.g., modify SecurityGroup rules) after they are auto-created | ||
|
|
||
| ### Cloud Infrastructure Admin Stories | ||
|
|
||
| - As a Cloud Infrastructure Admin, I want to configure a default CIDR | ||
| range and default SecurityGroup rules on the NetworkClass, so that the | ||
| system can auto-create default networking resources for tenants at | ||
| onboarding | ||
|
|
||
| ### Cloud Provider Admin Stories | ||
|
|
||
| - As a Cloud Provider Admin, I want visibility into whether a tenant's | ||
| default networking resources were successfully provisioned, so I can | ||
| troubleshoot onboarding failures | ||
|
|
||
| ## 4. Requirements | ||
|
|
||
| ### 4.1 Functional Requirements | ||
|
|
||
| #### Default Networking | ||
|
|
||
| - **FR-1:** At tenant onboarding, the system provisions a default | ||
| VirtualNetwork, IPv4 Subnet, IPv6 Subnet, and SecurityGroup for the | ||
| tenant (dual-stack). The tenant transitions to READY only after all | ||
| default networking resources are also READY. If default networking | ||
| provisioning fails, the tenant remains in a non-READY state with a | ||
| status condition describing the failure. The Cloud Provider Admin can | ||
| inspect the failure and retry by deleting and re-creating the tenant. | ||
| [User] | ||
| - **FR-2:** The Cloud Infrastructure Admin configures default networking | ||
| parameters (IPv4 CIDR, IPv6 CIDR, SecurityGroup rules) on the | ||
| NetworkClass. Defaults are required — a NetworkClass without defaults | ||
| is rejected at creation time. [User] | ||
| - **FR-3:** All tenants receive the same default CIDR ranges (IPv4 and | ||
| IPv6) as configured on the NetworkClass. Tenants are isolated at the | ||
| network level — the unified networking API provides VirtualNetworks | ||
| with any IP subnet, and the system enforces isolation regardless of | ||
| overlapping CIDRs between tenants. [User] | ||
| - **FR-4:** Default resources are labeled as defaults, visible in list | ||
| and detail views, and editable by the Tenant Admin (e.g., adding | ||
| SecurityGroup rules). Default resources cannot be deleted while any | ||
| resource depends on them. [User] | ||
| - **FR-5:** Creating custom VirtualNetworks does not affect default | ||
| resources — both coexist. [User] | ||
|
|
||
| #### Optional Network Attachments | ||
|
|
||
| - **FR-6:** The network attachment configuration on ComputeInstance, | ||
| Cluster, and BaremetalInstance is optional. When omitted, the system | ||
| populates it with the tenant's default Subnet and default SecurityGroup. | ||
| The resolved attachments are stored with the resource so the resource is | ||
| self-describing after creation. [User] | ||
| - **FR-7:** When a resource is created with explicit network attachments, | ||
| no defaults are applied. [User] | ||
|
|
||
| #### Auto ExternalIP | ||
|
|
||
| - **FR-8:** ComputeInstance and BaremetalInstance support | ||
| `--external-ip-attachment`. When enabled, the system selects the | ||
| available ExternalIPPool with the most capacity, allocates an | ||
| ExternalIP, and creates an ExternalIPAttachment binding it to the | ||
| resource. The system selects the pool with the most available capacity | ||
| matching the requested IP family (defaulting to IPv4). When multiple | ||
| pools have equal capacity, selection is deterministic but unspecified. | ||
| [User] | ||
| - **FR-9:** Cluster supports `--external-ip-attachment`. When enabled, | ||
| the system allocates two ExternalIPs and creates two | ||
| ExternalIPAttachments — one for the API server and one for ingress. | ||
| [User] | ||
| - **FR-10:** For clusters, ExternalIPs are allocated before provisioning | ||
| begins, resolving the ordering requirement that cluster nodes need | ||
| external access during setup. ExternalIPAttachments are created in an | ||
| inactive state and activate once the cluster's endpoint addresses are | ||
| available. [User] | ||
| - **FR-11:** Auto-created ExternalIP and ExternalIPAttachment resources | ||
| are labeled as auto-provisioned. When the parent resource is deleted, | ||
| the system deletes auto-created ExternalIPAttachments first, then | ||
| ExternalIPs, before the parent resource is removed. If cleanup of | ||
| auto-created resources fails permanently, the parent resource is still | ||
| deleted — orphaned ExternalIPs remain and must be cleaned up manually | ||
| by the Tenant Admin or Cloud Provider Admin. [User] | ||
|
|
||
| #### Default NATGateway | ||
|
|
||
| - **FR-12:** At tenant onboarding, the system also provisions a | ||
| NATGateway on the default VirtualNetwork with an automatically | ||
| allocated ExternalIP. The NATGateway provides outbound connectivity | ||
| for all resources on the default VirtualNetwork. [User] | ||
|
|
||
| ## 5. Acceptance Criteria | ||
|
|
||
| - [ ] A Tenant User can create a ComputeInstance with | ||
| `--external-ip-attachment` and no explicit network attachments — the VM | ||
| is created on the default subnet with an auto-provisioned ExternalIP | ||
| for inbound access | ||
| - [ ] A Tenant User can create a Cluster with `--external-ip-attachment` | ||
| and no explicit network attachments — the cluster is provisioned with | ||
| ExternalIPs for both API and ingress, all resolved automatically | ||
| - [ ] A Tenant User can create a BaremetalInstance with | ||
| `--external-ip-attachment` and no explicit network attachments — the | ||
| server is placed on the default subnet with an auto-provisioned | ||
| ExternalIP | ||
| - [ ] Default VirtualNetwork, Subnets (IPv4 + IPv6), and SecurityGroup | ||
| exist and are READY before the tenant's first resource creation | ||
| - [ ] Default resources appear in list views with a label identifying | ||
| them as defaults | ||
| - [ ] A Tenant Admin can modify default SecurityGroup rules (e.g., add | ||
| ingress rules) and the changes take effect | ||
| - [ ] Deleting a resource with auto-provisioned ExternalIP causes the | ||
| auto-created ExternalIP and ExternalIPAttachment to be cleaned up | ||
| automatically | ||
| - [ ] Creating a resource with explicit network attachments bypasses | ||
| defaults entirely — no default resources are referenced | ||
| - [ ] When no ExternalIPPool has available capacity, the create API call | ||
| returns an error and the resource is not persisted | ||
| - [ ] A resource created without explicit network attachments shows the | ||
| resolved default attachments when retrieved via the API | ||
|
|
||
| ## 6. Dependencies | ||
|
|
||
| - **Unified Networking EP** — this PRD builds on the unified networking | ||
| resource model (VirtualNetwork, Subnet, SecurityGroup, ExternalIP, | ||
| ExternalIPAttachment, NATGateway) defined in the | ||
| [Unified Networking EP](/enhancements/OSAC-1433-unified-networking) | ||
| - **OSAC-1712 (automatic pool selection)** — the auto ExternalIP pool | ||
| selection reuses the identical algorithm: pick the READY pool with the | ||
| most available capacity matching the IP family | ||
| - **Tenant onboarding flow** — default resource creation hooks into the | ||
| existing Tenant controller lifecycle | ||
| - **osac-installer** — NetworkClass default configuration must be included | ||
| in setup.sh and installation overlays | ||
|
|
||
| ## 7. Risks | ||
|
|
||
| ### 7.1 ExternalIPPool exhaustion | ||
|
|
||
| - **Owner:** Cloud Provider Admin | ||
| - **Mitigation:** Pool capacity visible in status; clear error directs | ||
| tenant to explicit allocation from another pool | ||
|
|
||
| ### 7.2 Default SecurityGroup too permissive | ||
|
|
||
| - **Owner:** Cloud Infrastructure Admin | ||
| - **Mitigation:** Cloud Infrastructure Admin configures default rules on | ||
| NetworkClass; Tenant Admin can tighten rules after creation | ||
|
|
||
| ### 7.3 Auto ExternalIP orphans on partial failure | ||
|
|
||
| - **Owner:** Platform | ||
| - **Mitigation:** Parent resource finalizer handles cleanup; controller | ||
| retries on transient failures. If cleanup permanently fails, the | ||
| finalizer is removed and the parent is deleted — orphaned ExternalIPs | ||
| must be cleaned up manually | ||
|
|
||
| ### 7.4 Deployment misconfiguration | ||
|
|
||
| - **Owner:** Cloud Infrastructure Admin | ||
| - **Mitigation:** Defaults are required — a NetworkClass without defaults | ||
| is rejected at creation time. This eliminates the scenario where tenant | ||
| onboarding succeeds but resource creation fails due to missing defaults. | ||
| osac-installer setup.sh includes NetworkClass default configuration in | ||
| installation overlays | ||
|
|
||
| ## 8. Open Questions | ||
|
|
||
| ### ~~8.1 Should capacity exhaustion return an API error or create a Failed resource?~~ — Resolved | ||
|
|
||
| Resolved: Return error, no resource persisted. | ||
|
|
||
| ### ~~8.2 E2E test coverage for simplified creation~~ — Resolved | ||
|
|
||
| Resolved: E2E tests for simplified creation are defined in each per-service design's test plan (VMaaS, CaaS, BMaaS). No separate test plan needed in the default networking EP. | ||
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is the answer to https://github.com/osac-project/enhancement-proposals/pull/107/changes#diff-065df6967226c35d8a614abd9ccc78bc4c6a38040d33af80cf985279a3206cedR231
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Acknowledged. The defaults are now mandatory — NetworkClass without defaults is rejected at creation time. Tenant READY requires DefaultNetworkingReady condition to be true. This answers the linked question.