Skip to content

Commit afc0f8d

Browse files
Merge pull request #593 from abays/OSPRH-18411-2
Refactor HCI VA to use single NIC instead of bridged control plane Implements OSPRH-18411 by refactoring the HCI VA from a bridged control plane network to a dual NIC architecture with dedicated interfaces. Major Changes: Created lib/nncp-single-nic/ for single NIC node network configuration Assigns control plane IP directly to physical interface Eliminates linux-bridge creation over physical interface Refactored lib/control-plane/ into modular components: base/: Core OpenStackControlPlane resources and secrets service-endpoints/: Network endpoint annotations and service types dns/: DNS resolver configuration storage/: Storage class configuration ovn-bridge/: Traditional bridge-based OVN (backward compatibility) ovn-nic/: Single NIC OVN configuration (new approach) job-settings/: Service preservation job configuration Refactored lib/networking/metallb/ into modular components: base/: Core IPAddressPool and L2Advertisement resources ip-addresses/: IP address pool configurations l2-bridge/: Bridge-based L2Advertisement interfaces (backward compatibility) l2-single-nic/: Single NIC L2Advertisement interfaces (new approach) Updated HCI VA to use single NIC components: va/hci/: Uses ovn-nic and l2-single-nic components va/hci/networking/: Uses modular metallb components va/hci/edpm-post-ceph/: Uses modular control-plane components Updated network configuration for dual NIC architecture: enp6s0: Control plane, internal API, storage, tenant networks enp8s0: Datacentre/external network for OVN connectivity Removed bridgeName references from HCI VA configuration Updated dataplane node comments for interface connectivity Updated examples/va/hci/ configuration: Network attachment definitions use physical interfaces Documentation reflects dual NIC requirements Values.yaml includes interface specifications Architecture Benefits: Maintains full backward compatibility for all existing VAs and DTs Provides clean separation between control plane and external networks Eliminates bridge-related complexity for HCI deployments Enables modular component reuse across different VA architectures Supports both traditional bridge and modern single NIC approaches Co-authored-by: Claude (AI Assistant) [email protected] Depends-On: openstack-k8s-operators/ci-framework#3170 Reviewed-by: John Fulton <[email protected]>
2 parents fa83f31 + e1e96ca commit afc0f8d

File tree

27 files changed

+1387
-316
lines changed

27 files changed

+1387
-316
lines changed

examples/va/hci/control-plane/networking/nncp/kustomization.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ transformers:
1818
create: true
1919
2020
components:
21-
- ../../../../../../lib/nncp
21+
- ../../../../../../lib/nncp-single-nic
2222

2323
resources:
2424
- values.yaml

examples/va/hci/control-plane/networking/nncp/values.yaml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ data:
5353
"cniVersion": "0.3.1",
5454
"name": "ctlplane",
5555
"type": "macvlan",
56-
"master": "ospbr",
56+
"master": "enp6s0",
5757
"ipam": {
5858
"type": "whereabouts",
5959
"range": "192.168.122.0/24",
@@ -173,12 +173,13 @@ data:
173173
name: subnet1
174174
mtu: 1500
175175
datacentre:
176+
iface: enp8s0
176177
net-attach-def: |
177178
{
178179
"cniVersion": "0.3.1",
179180
"name": "datacentre",
180-
"type": "bridge",
181-
"bridge": "ospbr",
181+
"type": "host-device",
182+
"device": "enp8s0",
182183
"ipam": {}
183184
}
184185
@@ -206,4 +207,3 @@ data:
206207

207208
lbServiceType: LoadBalancer
208209
storageClass: local-storage
209-
bridgeName: ospbr

examples/va/hci/edpm-pre-ceph/nodeset/values.yaml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ data:
3030
edpm_network_config_hide_sensitive_logs: false
3131
edpm_network_config_os_net_config_mappings:
3232
edpm-compute-0:
33-
nic2: 6a:fe:54:3f:8a:02 # CHANGEME
33+
nic2: 6a:fe:54:3f:8a:02 # CHANGEME - should connect to same network as control plane enp6s0
3434
edpm-compute-1:
35-
nic2: 6b:fe:54:3f:8a:02 # CHANGEME
35+
nic2: 6b:fe:54:3f:8a:02 # CHANGEME - should connect to same network as control plane enp6s0
3636
edpm-compute-2:
37-
nic2: 6c:fe:54:3f:8a:02 # CHANGEME
37+
nic2: 6c:fe:54:3f:8a:02 # CHANGEME - should connect to same network as control plane enp6s0
3838
edpm_network_config_template: |
3939
---
4040
{% set mtu_list = [ctlplane_mtu] %}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
---
2+
apiVersion: kustomize.config.k8s.io/v1alpha1
3+
kind: Component
4+
5+
secretGenerator:
6+
- name: osp-secret
7+
behavior: create
8+
envs:
9+
- osp-secrets.env
10+
options:
11+
disableNameSuffixHash: true
12+
13+
resources:
14+
- openstackcontrolplane.yaml
Lines changed: 294 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,294 @@
1+
---
2+
apiVersion: core.openstack.org/v1beta1
3+
kind: OpenStackControlPlane
4+
metadata:
5+
name: controlplane
6+
spec:
7+
barbican:
8+
apiOverride:
9+
route: {}
10+
template:
11+
databaseInstance: openstack
12+
secret: osp-secret
13+
barbicanAPI:
14+
replicas: 3
15+
barbicanWorker:
16+
replicas: 3
17+
barbicanKeystoneListener:
18+
replicas: 1
19+
ceilometer:
20+
template:
21+
passwordSelector:
22+
service: CeilometerPassword
23+
secret: osp-secret
24+
serviceUser: ceilometer
25+
cinder:
26+
uniquePodNames: true
27+
apiOverride:
28+
route: {"haproxy.router.openshift.io/timeout": "60s"}
29+
template:
30+
cinderAPI:
31+
replicas: 3
32+
customServiceConfig: |
33+
# Debug logs by default, jobs can override as needed.
34+
[DEFAULT]
35+
debug = true
36+
cinderBackup:
37+
networkAttachments:
38+
- storage
39+
replicas: 0
40+
cinderScheduler:
41+
replicas: 1
42+
cinderVolumes: {}
43+
databaseInstance: openstack
44+
secret: osp-secret
45+
designate:
46+
enabled: false
47+
template:
48+
customServiceConfig: |
49+
[DEFAULT]
50+
debug = true
51+
designateAPI:
52+
replicas: 3
53+
designateBackendbind9:
54+
networkAttachments:
55+
- designate
56+
replicas: 3
57+
storageClass: _replaced_
58+
storageRequest: 10G
59+
designateCentral:
60+
replicas: 1
61+
designateMdns:
62+
replicas: 3
63+
networkAttachments:
64+
- designate
65+
designateProducer:
66+
replicas: 2
67+
networkAttachments:
68+
- designate
69+
designateWorker:
70+
replicas: 3
71+
networkAttachments:
72+
- designate
73+
designateUnbound:
74+
replicas: 1
75+
networkAttachments:
76+
- designate
77+
nsRecords:
78+
- hostname: ns1.example.org.
79+
priority: 1
80+
- hostname: ns2.example.org.
81+
priority: 2
82+
dns:
83+
template:
84+
options: []
85+
replicas: 2
86+
galera:
87+
enabled: true
88+
templates:
89+
openstack:
90+
replicas: 3
91+
secret: osp-secret
92+
storageRequest: 5G
93+
openstack-cell1:
94+
replicas: 3
95+
secret: osp-secret
96+
storageRequest: 5G
97+
glance:
98+
uniquePodNames: true
99+
apiOverrides:
100+
default:
101+
route: {"haproxy.router.openshift.io/timeout": "60s"}
102+
template:
103+
databaseInstance: openstack
104+
glanceAPIs:
105+
default:
106+
replicas: 0
107+
networkAttachments:
108+
- storage
109+
storage:
110+
storageClass: _replaced_
111+
storageRequest: 10G
112+
heat:
113+
apiOverride:
114+
route: {}
115+
cnfAPIOverride:
116+
route: {}
117+
enabled: false
118+
template:
119+
databaseInstance: openstack
120+
heatAPI:
121+
replicas: 1
122+
heatEngine:
123+
replicas: 1
124+
secret: osp-secret
125+
horizon:
126+
apiOverride:
127+
route: {}
128+
template:
129+
replicas: 1
130+
secret: osp-secret
131+
enabled: true
132+
ironic:
133+
enabled: false
134+
template:
135+
databaseInstance: openstack
136+
ironicAPI:
137+
replicas: 1
138+
ironicConductors:
139+
- replicas: 1
140+
storageRequest: 10G
141+
ironicInspector:
142+
replicas: 1
143+
ironicNeutronAgent:
144+
replicas: 1
145+
secret: osp-secret
146+
keystone:
147+
apiOverride:
148+
route: {}
149+
template:
150+
databaseInstance: openstack
151+
secret: osp-secret
152+
replicas: 3
153+
manila:
154+
apiOverride:
155+
route: {"haproxy.router.openshift.io/timeout": "60s"}
156+
enabled: false
157+
template:
158+
manilaAPI:
159+
networkAttachments:
160+
- internalapi
161+
replicas: 1
162+
manilaScheduler:
163+
replicas: 1
164+
manilaShares:
165+
share1:
166+
networkAttachments:
167+
- storage
168+
replicas: 1
169+
memcached:
170+
templates:
171+
memcached:
172+
replicas: 3
173+
neutron:
174+
apiOverride:
175+
route: {}
176+
template:
177+
databaseInstance: openstack
178+
networkAttachments:
179+
- internalapi
180+
secret: osp-secret
181+
replicas: 3
182+
nova:
183+
apiOverride:
184+
route: {}
185+
template:
186+
secret: osp-secret
187+
apiServiceTemplate:
188+
replicas: 3
189+
metadataServiceTemplate:
190+
replicas: 3
191+
schedulerServiceTemplate:
192+
replicas: 3
193+
cellTemplates:
194+
cell0:
195+
cellDatabaseAccount: nova-cell0
196+
cellDatabaseInstance: openstack
197+
cellMessageBusInstance: rabbitmq
198+
conductorServiceTemplate:
199+
replicas: 1
200+
hasAPIAccess: true
201+
cell1:
202+
cellDatabaseAccount: nova-cell1
203+
cellDatabaseInstance: openstack-cell1
204+
cellMessageBusInstance: rabbitmq-cell1
205+
conductorServiceTemplate:
206+
replicas: 1
207+
hasAPIAccess: true
208+
octavia:
209+
enabled: false
210+
template:
211+
databaseInstance: openstack
212+
octaviaAPI:
213+
replicas: 1
214+
octaviaHousekeeping: {}
215+
octaviaWorker: {}
216+
octaviaHealthManager: {}
217+
secret: osp-secret
218+
ovn:
219+
template:
220+
ovnController:
221+
networkAttachment: tenant
222+
nicMappings:
223+
datacentre: _replaced_
224+
ovnDBCluster:
225+
ovndbcluster-nb:
226+
dbType: NB
227+
networkAttachment: internalapi
228+
storageRequest: 10G
229+
replicas: 3
230+
ovndbcluster-sb:
231+
dbType: SB
232+
networkAttachment: internalapi
233+
storageRequest: 10G
234+
replicas: 3
235+
ovnNorthd:
236+
logLevel: info
237+
nThreads: 1
238+
replicas: 1
239+
resources: {}
240+
tls: {}
241+
placement:
242+
apiOverride:
243+
route: {}
244+
template:
245+
databaseInstance: openstack
246+
secret: osp-secret
247+
replicas: 3
248+
rabbitmq:
249+
templates:
250+
rabbitmq:
251+
replicas: 3
252+
rabbitmq-cell1:
253+
replicas: 3
254+
secret: osp-secret
255+
storageClass: _replaced_
256+
swift:
257+
enabled: false
258+
proxyOverride:
259+
route: {}
260+
template:
261+
swiftProxy:
262+
replicas: 1
263+
swiftRing:
264+
ringReplicas: 1
265+
swiftStorage:
266+
replicas: 1
267+
telemetry:
268+
enabled: false
269+
template:
270+
metricStorage:
271+
enabled: false
272+
monitoringStack:
273+
alertingEnabled: true
274+
scrapeInterval: 30s
275+
storage:
276+
strategy: persistent
277+
retention: 24h
278+
persistent:
279+
pvcStorageRequest: 10Gi
280+
pvcStorageClass: _replaced_
281+
autoscaling:
282+
enabled: false
283+
aodh:
284+
passwordSelectors:
285+
databaseInstance: openstack
286+
memcachedInstance: memcached
287+
secret: osp-secret
288+
heatInstance: heat
289+
ceilometer:
290+
enabled: false
291+
secret: osp-secret
292+
logging:
293+
enabled: false
294+
port: 10514

0 commit comments

Comments
 (0)