Skip to content
Merged
Show file tree
Hide file tree
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 Jul 8, 2026
e2a3941
OSAC-1029: fix contradictions in unified networking EP
danmanor Jul 8, 2026
148e700
OSAC-1029: restructure unified networking PRD to skill template format
danmanor Jul 8, 2026
f6f5949
OSAC-1435: add VMaaS networking EP and PRD
danmanor Jul 8, 2026
42d9346
OSAC-1436: add CaaS networking EP and PRD
danmanor Jul 8, 2026
4d23259
OSAC-1437: add BMaaS networking EP and PRD
danmanor Jul 8, 2026
d078d0c
OSAC-1029: rewrite per-service PRDs to be user-facing only
danmanor Jul 8, 2026
a4e1bce
OSAC-1029: fix trailing whitespace
danmanor Jul 8, 2026
3dc059b
OSAC-1435: add missing Tenant Admin and Cloud Infrastructure Admin us…
danmanor Jul 8, 2026
d91e036
OSAC-1029: add expansion-of references and fix proto comment consistency
danmanor Jul 8, 2026
b6c4fd4
OSAC-1029: rename simplified-resource-creation to default-networking
danmanor Jul 8, 2026
8f7fe5c
OSAC-1029: add default-networking design.md, update all references
danmanor Jul 8, 2026
2f50d4e
OSAC-1029: update dispatcher contract params in BMaaS and CaaS designs
danmanor Jul 9, 2026
6486166
OSAC-1029: clarify fabric manager vs provisioning template responsibi…
danmanor Jul 9, 2026
2b0e4ee
OSAC-1029: remove IPAM from fabric manager scope in BMaaS and CaaS de…
danmanor Jul 9, 2026
8476715
OSAC-1029: clarify auto-provisioning lifecycle, controller preconditi…
danmanor Jul 9, 2026
38f2af7
OSAC-1029: fix review findings — controller preconditions, cleanup or…
danmanor Jul 9, 2026
727e5b5
OSAC-1029: move subnet IPAM to operator, resolve IP allocation archit…
danmanor Jul 9, 2026
1d92385
OSAC-1029: fix 13 stale references after operator IPAM architectural …
danmanor Jul 9, 2026
08ebd72
OSAC-1029: fix final consistency issues — stale refs, labels, concurr…
danmanor Jul 9, 2026
eb5b113
OSAC-1029: resolve MetalLB IPAddressPool ownership (CaaS OQ#3)
danmanor Jul 9, 2026
bb36e94
OSAC-1029: fix default networking — fulfillment-service creates defau…
danmanor Jul 9, 2026
de9a010
OSAC-1029: final consistency fixes — region refs, default creation, C…
danmanor Jul 9, 2026
bd0b245
OSAC-1029: add gateway, prefixLength, dnsServers to host networking c…
danmanor Jul 9, 2026
531e80e
OSAC-1029: fix stale BMaaS YAML example — add gateway/prefixLength/dn…
danmanor Jul 9, 2026
779ced7
OSAC-1029: fix deletion flows — cleanup ownership, IP release, agent …
danmanor Jul 9, 2026
813c7ba
OSAC-1029: CaaS single-subnet model — one attachment per cluster
danmanor Jul 9, 2026
42a4f58
OSAC-1029: replace operator IPAM with DHCP for host-side networking
danmanor Jul 10, 2026
5c2ce0a
OSAC-1029: fix 4 stale "or static" references — DHCP only
danmanor Jul 10, 2026
41e9658
OSAC-1029: add Agent Pool Model — parking network and port transition…
danmanor Jul 10, 2026
24731ce
OSAC-1029: fix stale 'pinned VIPs' in CaaS resolved OQ#3
danmanor Jul 10, 2026
db43a04
OSAC-1029: fix cross-document consistency — singular attachment, fiel…
danmanor Jul 12, 2026
5d958cd
OSAC-1029: add ComputeNetworkAttachmentStatus for VMaaS IP discovery
danmanor Jul 12, 2026
bfb6a1f
OSAC-1029: flag BMaaS IP discovery as open question
danmanor Jul 12, 2026
19726af
OSAC-1029: fix 9 cross-document consistency issues
danmanor Jul 12, 2026
7190931
OSAC-1029: fix proto field numbers, PRD alignment, and architecture gaps
danmanor Jul 12, 2026
7b0cf81
OSAC-1029: remove design leakage from all PRDs
danmanor Jul 12, 2026
4f04a26
OSAC-1029: add CRD Go struct for ComputeNetworkAttachmentStatus
danmanor Jul 12, 2026
bbb62bd
OSAC-1029: resolve NATGateway reuse, mandatory defaults, address all …
danmanor Jul 13, 2026
11fced0
OSAC-1029: fix field 15→18 text refs, NATGateway cleanup gaps, step n…
danmanor Jul 13, 2026
2092058
OSAC-1029: clarify inter-subnet routing as fabric manager responsibility
danmanor Jul 13, 2026
4d12805
OSAC-1029: simplify external access — single flag + NATGateway as VN …
danmanor Jul 13, 2026
b0e444d
OSAC-1029: add NATGateway to default resources not-cleaned-up list
danmanor Jul 14, 2026
d52a0ae
OSAC-1029: resolve all open questions, add dual-stack default subnets
danmanor Jul 14, 2026
4cf62a1
OSAC-1029: fix stale body text after OQ resolutions, step numbering
danmanor Jul 14, 2026
ceff097
OSAC-1029: fix BMaaS IP discovery timing — separate query_dhcp_lease …
danmanor Jul 14, 2026
b276d98
OSAC-1029: add NATGateway VN readiness precondition + MetalLB VIP field
danmanor Jul 14, 2026
2a8cc84
OSAC-1029: fix end-of-file newline
danmanor Jul 14, 2026
74b5dad
OSAC-1029: replace HostType with BareMetalInstanceType, fix EP naming
danmanor Jul 27, 2026
a392d41
OSAC-1029: fix metallb field placement, VMaaS struct prefix, CaaS IP …
danmanor Jul 27, 2026
c11b358
OSAC-1029: rename unified-networking to OSAC-1433-unified-networking
danmanor Jul 27, 2026
cd1cd44
OSAC-1029: rename default-networking to OSAC-1433-default-networking
danmanor Jul 27, 2026
4bd3534
OSAC-1029: fix k8sManager CaaS dependency, parking network config, br…
danmanor Jul 27, 2026
d4462a4
OSAC-1029: revert CaaS to HostType, keep BareMetalInstanceType for BMaaS
danmanor Jul 27, 2026
ccd1b2e
OSAC-1029: align Jira tracking links with directory names (OSAC-1433)
danmanor Jul 27, 2026
5a625f9
OSAC-1029: fix remaining low-severity cosmetic issues
danmanor Jul 27, 2026
5028518
OSAC-1029: use HostType for v0.2, document BareMetalInstanceType as f…
danmanor Jul 27, 2026
af573e1
OSAC-1029: fix ExternalIPPool prerequisite contradiction, add migrati…
danmanor Jul 27, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
703 changes: 703 additions & 0 deletions enhancements/OSAC-1433-default-networking/design.md

Large diffs are not rendered by default.

234 changes: 234 additions & 0 deletions enhancements/OSAC-1433-default-networking/prd.md
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

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.

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.

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.

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.
Loading
Loading