diff --git a/automation/net-env/dcn.yaml b/automation/net-env/dcn.yaml
new file mode 100644
index 000000000..b6d14fb69
--- /dev/null
+++ b/automation/net-env/dcn.yaml
@@ -0,0 +1,1275 @@
+---
+instances:
+ compute-0:
+ hostname: compute-0
+ name: compute-0
+ networks:
+ ctlplane:
+ interface_name: eth1
+ ip_v4: 192.168.122.100
+ is_trunk_parent: true
+ mac_addr: 52:54:03:ac:01:f4
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplane
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapi:
+ interface_name: eth1.20
+ ip_v4: 172.17.0.100
+ is_trunk_parent: false
+ mac_addr: 52:54:00:3b:e1:d5
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapi
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 20
+ storage:
+ interface_name: eth1.21
+ ip_v4: 172.18.0.100
+ is_trunk_parent: false
+ mac_addr: 52:54:00:3c:f7:19
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storage
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 21
+ storagemgmt:
+ interface_name: eth1.23
+ ip_v4: 172.20.0.100
+ is_trunk_parent: false
+ mac_addr: 52:54:00:57:fd:4c
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storagemgmt
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 23
+ tenant:
+ interface_name: eth1.22
+ ip_v4: 172.19.0.100
+ is_trunk_parent: false
+ mac_addr: 52:54:00:45:99:a4
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenant
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 22
+ compute-1:
+ hostname: compute-1
+ name: compute-1
+ networks:
+ ctlplane:
+ interface_name: eth1
+ ip_v4: 192.168.122.101
+ is_trunk_parent: true
+ mac_addr: 52:54:04:e8:64:37
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplane
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapi:
+ interface_name: eth1.20
+ ip_v4: 172.17.0.101
+ is_trunk_parent: false
+ mac_addr: 52:54:00:11:59:d4
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapi
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 20
+ storage:
+ interface_name: eth1.21
+ ip_v4: 172.18.0.101
+ is_trunk_parent: false
+ mac_addr: 52:54:00:42:5f:7b
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storage
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 21
+ storagemgmt:
+ interface_name: eth1.23
+ ip_v4: 172.20.0.101
+ is_trunk_parent: false
+ mac_addr: 52:54:00:38:d4:7c
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storagemgmt
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 23
+ tenant:
+ interface_name: eth1.22
+ ip_v4: 172.19.0.101
+ is_trunk_parent: false
+ mac_addr: 52:54:00:6e:d5:28
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenant
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 22
+ compute-2:
+ hostname: compute-2
+ name: compute-2
+ networks:
+ ctlplane:
+ interface_name: eth1
+ ip_v4: 192.168.122.102
+ is_trunk_parent: true
+ mac_addr: 52:54:05:30:97:80
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplane
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapi:
+ interface_name: eth1.20
+ ip_v4: 172.17.0.102
+ is_trunk_parent: false
+ mac_addr: 52:54:00:6c:59:57
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapi
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 20
+ storage:
+ interface_name: eth1.21
+ ip_v4: 172.18.0.102
+ is_trunk_parent: false
+ mac_addr: 52:54:00:49:aa:16
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storage
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 21
+ storagemgmt:
+ interface_name: eth1.23
+ ip_v4: 172.20.0.102
+ is_trunk_parent: false
+ mac_addr: 52:54:00:0b:ee:4a
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storagemgmt
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 23
+ tenant:
+ interface_name: eth1.22
+ ip_v4: 172.19.0.102
+ is_trunk_parent: false
+ mac_addr: 52:54:00:60:be:e1
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenant
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 22
+ controller-0:
+ hostname: controller-0
+ name: controller-0
+ networks:
+ ctlplane:
+ interface_name: eth1
+ ip_v4: 192.168.122.9
+ mac_addr: 52:54:06:f2:16:04
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplane
+ prefix_length_v4: 24
+ skip_nm: false
+ dcn1-compute-0:
+ hostname: dcn1-compute-0
+ name: dcn1-compute-0
+ networks:
+ ctlplanedcn1:
+ interface_name: eth1
+ ip_v4: 192.168.133.111
+ is_trunk_parent: true
+ mac_addr: 52:54:07:7e:1b:ec
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplanedcn1
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapidcn1:
+ interface_name: eth1.30
+ ip_v4: 172.17.10.111
+ is_trunk_parent: false
+ mac_addr: 52:54:00:5c:b4:2c
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapidcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 30
+ storagedcn1:
+ interface_name: eth1.31
+ ip_v4: 172.18.10.111
+ is_trunk_parent: false
+ mac_addr: 52:54:00:63:94:25
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storagedcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 31
+ storagemgmtdcn1:
+ interface_name: eth1.33
+ ip_v4: 172.20.10.111
+ is_trunk_parent: false
+ mac_addr: 52:54:00:2b:ef:87
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: storagemgmtdcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 33
+ tenantdcn1:
+ interface_name: eth1.32
+ ip_v4: 172.19.10.111
+ is_trunk_parent: false
+ mac_addr: 52:54:00:69:37:d4
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenantdcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 32
+ dcn1-compute-1:
+ hostname: dcn1-compute-1
+ name: dcn1-compute-1
+ networks:
+ ctlplanedcn1:
+ interface_name: eth1
+ ip_v4: 192.168.133.112
+ is_trunk_parent: true
+ mac_addr: 52:54:08:6d:2a:68
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplanedcn1
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapidcn1:
+ interface_name: eth1.30
+ ip_v4: 172.17.10.112
+ is_trunk_parent: false
+ mac_addr: 52:54:00:53:f5:eb
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapidcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 30
+ storagedcn1:
+ interface_name: eth1.31
+ ip_v4: 172.18.10.112
+ is_trunk_parent: false
+ mac_addr: 52:54:00:05:ac:04
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storagedcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 31
+ storagemgmtdcn1:
+ interface_name: eth1.33
+ ip_v4: 172.20.10.112
+ is_trunk_parent: false
+ mac_addr: 52:54:00:08:03:dc
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: storagemgmtdcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 33
+ tenantdcn1:
+ interface_name: eth1.32
+ ip_v4: 172.19.10.112
+ is_trunk_parent: false
+ mac_addr: 52:54:00:22:d1:18
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenantdcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 32
+ dcn1-compute-2:
+ hostname: dcn1-compute-2
+ name: dcn1-compute-2
+ networks:
+ ctlplanedcn1:
+ interface_name: eth1
+ ip_v4: 192.168.133.113
+ is_trunk_parent: true
+ mac_addr: 52:54:09:2a:63:17
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplanedcn1
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapidcn1:
+ interface_name: eth1.30
+ ip_v4: 172.17.10.113
+ is_trunk_parent: false
+ mac_addr: 52:54:00:53:bc:3b
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapidcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 30
+ storagedcn1:
+ interface_name: eth1.31
+ ip_v4: 172.18.10.113
+ is_trunk_parent: false
+ mac_addr: 52:54:00:5b:29:28
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storagedcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 31
+ storagemgmtdcn1:
+ interface_name: eth1.33
+ ip_v4: 172.20.10.113
+ is_trunk_parent: false
+ mac_addr: 52:54:00:56:55:3c
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: storagemgmtdcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 33
+ tenantdcn1:
+ interface_name: eth1.32
+ ip_v4: 172.19.10.113
+ is_trunk_parent: false
+ mac_addr: 52:54:00:33:d3:fc
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenantdcn1
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn1
+ vlan_id: 32
+ dcn2-compute-0:
+ hostname: dcn2-compute-0
+ name: dcn2-compute-0
+ networks:
+ ctlplanedcn2:
+ interface_name: eth1
+ ip_v4: 192.168.144.121
+ is_trunk_parent: true
+ mac_addr: 52:54:10:7a:c8:2f
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplanedcn2
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapidcn2:
+ interface_name: eth1.40
+ ip_v4: 172.17.20.121
+ is_trunk_parent: false
+ mac_addr: 52:54:00:34:c1:ec
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapidcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 40
+ storagedcn2:
+ interface_name: eth1.41
+ ip_v4: 172.18.20.121
+ is_trunk_parent: false
+ mac_addr: 52:54:00:44:5f:22
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storagedcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 41
+ storagemgmtdcn2:
+ interface_name: eth1.43
+ ip_v4: 172.20.20.121
+ is_trunk_parent: false
+ mac_addr: 52:54:00:23:0d:a7
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: storagemgmtdcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 43
+ tenantdcn2:
+ interface_name: eth1.42
+ ip_v4: 172.19.20.121
+ is_trunk_parent: false
+ mac_addr: 52:54:00:00:0a:c3
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenantdcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 42
+ dcn2-compute-1:
+ hostname: dcn2-compute-1
+ name: dcn2-compute-1
+ networks:
+ ctlplanedcn2:
+ interface_name: eth1
+ ip_v4: 192.168.144.122
+ is_trunk_parent: true
+ mac_addr: 52:54:11:f1:b1:fc
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplanedcn2
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapidcn2:
+ interface_name: eth1.40
+ ip_v4: 172.17.20.122
+ is_trunk_parent: false
+ mac_addr: 52:54:00:1d:94:b3
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapidcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 40
+ storagedcn2:
+ interface_name: eth1.41
+ ip_v4: 172.18.20.122
+ is_trunk_parent: false
+ mac_addr: 52:54:00:64:45:b1
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storagedcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 41
+ storagemgmtdcn2:
+ interface_name: eth1.43
+ ip_v4: 172.20.20.122
+ is_trunk_parent: false
+ mac_addr: 52:54:00:44:09:b3
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: storagemgmtdcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 43
+ tenantdcn2:
+ interface_name: eth1.42
+ ip_v4: 172.19.20.122
+ is_trunk_parent: false
+ mac_addr: 52:54:00:66:5b:58
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenantdcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 42
+ dcn2-compute-2:
+ hostname: dcn2-compute-2
+ name: dcn2-compute-2
+ networks:
+ ctlplanedcn2:
+ interface_name: eth1
+ ip_v4: 192.168.144.123
+ is_trunk_parent: true
+ mac_addr: 52:54:12:21:7e:91
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplanedcn2
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapidcn2:
+ interface_name: eth1.40
+ ip_v4: 172.17.20.123
+ is_trunk_parent: false
+ mac_addr: 52:54:00:37:54:c8
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapidcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 40
+ storagedcn2:
+ interface_name: eth1.41
+ ip_v4: 172.18.20.123
+ is_trunk_parent: false
+ mac_addr: 52:54:00:79:45:dc
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storagedcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 41
+ storagemgmtdcn2:
+ interface_name: eth1.43
+ ip_v4: 172.20.20.123
+ is_trunk_parent: false
+ mac_addr: 52:54:00:7e:97:f4
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: storagemgmtdcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 43
+ tenantdcn2:
+ interface_name: eth1.42
+ ip_v4: 172.19.20.123
+ is_trunk_parent: false
+ mac_addr: 52:54:00:56:1d:fe
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenantdcn2
+ parent_interface: eth1
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplanedcn2
+ vlan_id: 42
+ ocp-master-0:
+ hostname: master-0
+ name: ocp-master-0
+ networks:
+ ctlplane:
+ interface_name: enp7s0
+ ip_v4: 192.168.122.10
+ is_trunk_parent: true
+ mac_addr: 52:54:00:e2:8a:66
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplane
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapi:
+ interface_name: enp7s0.20
+ ip_v4: 172.17.0.10
+ is_trunk_parent: false
+ mac_addr: 52:54:00:68:4b:ce
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapi
+ parent_interface: enp7s0
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 20
+ storage:
+ interface_name: enp7s0.21
+ ip_v4: 172.18.0.10
+ is_trunk_parent: false
+ mac_addr: 52:54:00:05:23:2c
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storage
+ parent_interface: enp7s0
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 21
+ tenant:
+ interface_name: enp7s0.22
+ ip_v4: 172.19.0.10
+ is_trunk_parent: false
+ mac_addr: 52:54:00:06:80:f0
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenant
+ parent_interface: enp7s0
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 22
+ ocp-master-1:
+ hostname: master-1
+ name: ocp-master-1
+ networks:
+ ctlplane:
+ interface_name: enp7s0
+ ip_v4: 192.168.122.11
+ is_trunk_parent: true
+ mac_addr: 52:54:01:60:ed:69
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplane
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapi:
+ interface_name: enp7s0.20
+ ip_v4: 172.17.0.11
+ is_trunk_parent: false
+ mac_addr: 52:54:00:71:78:e6
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapi
+ parent_interface: enp7s0
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 20
+ storage:
+ interface_name: enp7s0.21
+ ip_v4: 172.18.0.11
+ is_trunk_parent: false
+ mac_addr: 52:54:00:76:3d:ba
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storage
+ parent_interface: enp7s0
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 21
+ tenant:
+ interface_name: enp7s0.22
+ ip_v4: 172.19.0.11
+ is_trunk_parent: false
+ mac_addr: 52:54:00:7a:5d:1d
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenant
+ parent_interface: enp7s0
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 22
+ ocp-master-2:
+ hostname: master-2
+ name: ocp-master-2
+ networks:
+ ctlplane:
+ interface_name: enp7s0
+ ip_v4: 192.168.122.12
+ is_trunk_parent: true
+ mac_addr: 52:54:02:8b:28:77
+ mtu: 1500
+ netmask_v4: 255.255.255.0
+ network_name: ctlplane
+ prefix_length_v4: 24
+ skip_nm: false
+ internalapi:
+ interface_name: enp7s0.20
+ ip_v4: 172.17.0.12
+ is_trunk_parent: false
+ mac_addr: 52:54:00:66:a0:7c
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: internalapi
+ parent_interface: enp7s0
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 20
+ storage:
+ interface_name: enp7s0.21
+ ip_v4: 172.18.0.12
+ is_trunk_parent: false
+ mac_addr: 52:54:00:09:45:3b
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: storage
+ parent_interface: enp7s0
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 21
+ tenant:
+ interface_name: enp7s0.22
+ ip_v4: 172.19.0.12
+ is_trunk_parent: false
+ mac_addr: 52:54:00:22:70:9f
+ mtu: 1496
+ netmask_v4: 255.255.255.0
+ network_name: tenant
+ parent_interface: enp7s0
+ prefix_length_v4: 24
+ skip_nm: false
+ trunk_parent: ctlplane
+ vlan_id: 22
+networks:
+ ctlplane:
+ dns_v4:
+ - 192.168.122.1
+ dns_v6: []
+ gw_v4: 192.168.122.1
+ mtu: 1500
+ network_name: ctlplane
+ network_v4: 192.168.122.0/24
+ search_domain: ctlplane.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 192.168.122.90
+ end_host: 90
+ length: 11
+ start: 192.168.122.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 192.168.122.70
+ end_host: 70
+ length: 41
+ start: 192.168.122.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 192.168.122.120
+ end_host: 120
+ length: 21
+ start: 192.168.122.100
+ start_host: 100
+ - end: 192.168.122.170
+ end_host: 170
+ length: 21
+ start: 192.168.122.150
+ start_host: 150
+ ipv6_ranges: []
+ ctlplanedcn1:
+ dns_v4:
+ - 192.168.133.1
+ dns_v6: []
+ gw_v4: 192.168.133.1
+ mtu: 1500
+ network_name: ctlplanedcn1
+ network_v4: 192.168.133.0/24
+ search_domain: ctlplanedcn1.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 192.168.133.90
+ end_host: 90
+ length: 11
+ start: 192.168.133.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 192.168.133.70
+ end_host: 70
+ length: 41
+ start: 192.168.133.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 192.168.133.120
+ end_host: 120
+ length: 21
+ start: 192.168.133.100
+ start_host: 100
+ - end: 192.168.133.170
+ end_host: 170
+ length: 21
+ start: 192.168.133.150
+ start_host: 150
+ ipv6_ranges: []
+ ctlplanedcn2:
+ dns_v4:
+ - 192.168.144.1
+ dns_v6: []
+ gw_v4: 192.168.144.1
+ mtu: 1500
+ network_name: ctlplanedcn2
+ network_v4: 192.168.144.0/24
+ search_domain: ctlplanedcn2.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 192.168.144.90
+ end_host: 90
+ length: 11
+ start: 192.168.144.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 192.168.144.70
+ end_host: 70
+ length: 41
+ start: 192.168.144.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 192.168.144.120
+ end_host: 120
+ length: 21
+ start: 192.168.144.100
+ start_host: 100
+ - end: 192.168.144.170
+ end_host: 170
+ length: 21
+ start: 192.168.144.150
+ start_host: 150
+ ipv6_ranges: []
+ external:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1500
+ network_name: external
+ network_v4: 10.0.0.0/24
+ search_domain: external.example.com
+ tools:
+ netconfig:
+ ipv4_ranges:
+ - end: 10.0.0.250
+ end_host: 250
+ length: 151
+ start: 10.0.0.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 22
+ internalapi:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1496
+ network_name: internalapi
+ network_v4: 172.17.0.0/24
+ search_domain: internalapi.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 172.17.0.90
+ end_host: 90
+ length: 11
+ start: 172.17.0.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 172.17.0.70
+ end_host: 70
+ length: 41
+ start: 172.17.0.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 172.17.0.250
+ end_host: 250
+ length: 151
+ start: 172.17.0.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 20
+ internalapidcn1:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1496
+ network_name: internalapidcn1
+ network_v4: 172.17.10.0/24
+ search_domain: internalapidcn1.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 172.17.10.90
+ end_host: 90
+ length: 11
+ start: 172.17.10.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 172.17.10.70
+ end_host: 70
+ length: 41
+ start: 172.17.10.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 172.17.10.250
+ end_host: 250
+ length: 151
+ start: 172.17.10.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 30
+ internalapidcn2:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1496
+ network_name: internalapidcn2
+ network_v4: 172.17.20.0/24
+ search_domain: internalapidcn2.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 172.17.20.90
+ end_host: 90
+ length: 11
+ start: 172.17.20.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 172.17.20.70
+ end_host: 70
+ length: 41
+ start: 172.17.20.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 172.17.20.250
+ end_host: 250
+ length: 151
+ start: 172.17.20.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 40
+ storage:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1496
+ network_name: storage
+ network_v4: 172.18.0.0/24
+ search_domain: storage.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 172.18.0.90
+ end_host: 90
+ length: 11
+ start: 172.18.0.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 172.18.0.70
+ end_host: 70
+ length: 41
+ start: 172.18.0.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 172.18.0.250
+ end_host: 250
+ length: 151
+ start: 172.18.0.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 21
+ storagedcn1:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1496
+ network_name: storagedcn1
+ network_v4: 172.18.10.0/24
+ search_domain: storagedcn1.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 172.18.10.90
+ end_host: 90
+ length: 11
+ start: 172.18.10.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 172.18.10.70
+ end_host: 70
+ length: 41
+ start: 172.18.10.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 172.18.10.250
+ end_host: 250
+ length: 151
+ start: 172.18.10.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 31
+ storagedcn2:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1496
+ network_name: storagedcn2
+ network_v4: 172.18.20.0/24
+ search_domain: storagedcn2.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 172.18.20.90
+ end_host: 90
+ length: 11
+ start: 172.18.20.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 172.18.20.70
+ end_host: 70
+ length: 41
+ start: 172.18.20.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 172.18.20.250
+ end_host: 250
+ length: 151
+ start: 172.18.20.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 41
+ storagemgmt:
+ dns_v4: []
+ dns_v6: []
+ network_name: storagemgmt
+ network_v4: 172.20.0.0/24
+ search_domain: storagemgmt.example.com
+ tools:
+ netconfig:
+ ipv4_ranges:
+ - end: 172.20.0.250
+ end_host: 250
+ length: 151
+ start: 172.20.0.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 23
+ storagemgmtdcn1:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1500
+ network_name: storagemgmtdcn1
+ network_v4: 172.20.10.0/24
+ search_domain: storagemgmtdcn1.example.com
+ tools:
+ netconfig:
+ ipv4_ranges:
+ - end: 172.20.10.250
+ end_host: 250
+ length: 151
+ start: 172.20.10.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 33
+ storagemgmtdcn2:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1500
+ network_name: storagemgmtdcn2
+ network_v4: 172.20.20.0/24
+ search_domain: storagemgmtdcn2.example.com
+ tools:
+ netconfig:
+ ipv4_ranges:
+ - end: 172.20.20.250
+ end_host: 250
+ length: 151
+ start: 172.20.20.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 43
+ tenant:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1496
+ network_name: tenant
+ network_v4: 172.19.0.0/24
+ search_domain: tenant.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 172.19.0.90
+ end_host: 90
+ length: 11
+ start: 172.19.0.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 172.19.0.70
+ end_host: 70
+ length: 41
+ start: 172.19.0.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 172.19.0.250
+ end_host: 250
+ length: 151
+ start: 172.19.0.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 22
+ tenantdcn1:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1496
+ network_name: tenantdcn1
+ network_v4: 172.19.10.0/24
+ search_domain: tenantdcn1.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 172.19.10.90
+ end_host: 90
+ length: 11
+ start: 172.19.10.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 172.19.10.70
+ end_host: 70
+ length: 41
+ start: 172.19.10.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 172.19.10.250
+ end_host: 250
+ length: 151
+ start: 172.19.10.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 32
+ tenantdcn2:
+ dns_v4: []
+ dns_v6: []
+ mtu: 1496
+ network_name: tenantdcn2
+ network_v4: 172.19.20.0/24
+ search_domain: tenantdcn2.example.com
+ tools:
+ metallb:
+ ipv4_ranges:
+ - end: 172.19.20.90
+ end_host: 90
+ length: 11
+ start: 172.19.20.80
+ start_host: 80
+ ipv6_ranges: []
+ multus:
+ ipv4_ranges:
+ - end: 172.19.20.70
+ end_host: 70
+ length: 41
+ start: 172.19.20.30
+ start_host: 30
+ ipv4_routes: []
+ ipv6_ranges: []
+ ipv6_routes: []
+ netconfig:
+ ipv4_ranges:
+ - end: 172.19.20.250
+ end_host: 250
+ length: 151
+ start: 172.19.20.100
+ start_host: 100
+ ipv6_ranges: []
+ vlan_id: 42
+routers: {}
diff --git a/automation/vars/dcn.yaml b/automation/vars/dcn.yaml
new file mode 100644
index 000000000..84609c544
--- /dev/null
+++ b/automation/vars/dcn.yaml
@@ -0,0 +1,30 @@
+---
+vas:
+ dcn:
+ stages:
+ - path: examples/dt/dcn/control-plane/nncp
+ wait_conditions:
+ - >-
+ oc -n openstack wait nncp
+ -l osp/nncm-config-type=standard
+ --for jsonpath='{.status.conditions[0].reason}'=SuccessfullyConfigured
+ --timeout=60s
+ values:
+ - name: network-values
+ src_file: values.yaml
+ build_output: nncp.yaml
+
+ - path: examples/dt/dcn/control-plane
+ wait_conditions:
+ - >-
+ oc -n openstack wait osctlplane controlplane --for condition=Ready
+ --timeout=30m
+ values:
+ - name: network-values
+ src_file: nncp/values.yaml
+ build_output: ../control-plane.yaml
+ post_stage_run:
+ - name: Deploy DCN
+ type: playbook
+ source: "../../playbooks/dcn.yml"
+ inventory: "${HOME}/ci-framework-data/artifacts/zuul_inventory.yml"
diff --git a/dt/dcn/README.md b/dt/dcn/README.md
new file mode 100644
index 000000000..33e11e679
--- /dev/null
+++ b/dt/dcn/README.md
@@ -0,0 +1,11 @@
+# DT: DCN
+
+If you are looking for information on how to deploy the DCN DT, then
+please see the
+[DCN README in the examples directory](../../examples/dt/dcn/README.md).
+
+This directory, `architecture/dt/dcn/`, exists so that the
+[kustomization.yaml](../../examples/dt/dcn/kustomization.yaml)
+in the examples directory for the DCN DT, reference it by path as a
+component. Its contents are likely uninteresting unless you want to
+understand how kustomize was implemented in this repository.
diff --git a/dt/dcn/edpm-post-ceph/deployment/kustomization.yaml b/dt/dcn/edpm-post-ceph/deployment/kustomization.yaml
new file mode 100644
index 000000000..f4116afab
--- /dev/null
+++ b/dt/dcn/edpm-post-ceph/deployment/kustomization.yaml
@@ -0,0 +1,46 @@
+---
+apiVersion: kustomize.config.k8s.io/v1alpha1
+kind: Component
+
+transformers:
+ # Set namespace to OpenStack on all namespaced objects without a namespace
+ - |-
+ apiVersion: builtin
+ kind: NamespaceTransformer
+ metadata:
+ name: _ignored_
+ namespace: openstack
+ setRoleBindingSubjects: none
+ unsetOnly: true
+ fieldSpecs:
+ - path: metadata/name
+ kind: Namespace
+ create: true
+
+components:
+ - ../../../../lib/dataplane/deployment
+
+replacements:
+ - source:
+ kind: ConfigMap
+ name: edpm-deployment-values-post-ceph
+ fieldPath: data.deployment.name
+ targets:
+ - select:
+ kind: OpenStackDataPlaneDeployment
+ fieldPaths:
+ - metadata.name
+ options:
+ create: true
+
+ - source:
+ kind: ConfigMap
+ name: edpm-deployment-values-post-ceph
+ fieldPath: data.nodeset_name
+ targets:
+ - select:
+ kind: OpenStackDataPlaneDeployment
+ fieldPaths:
+ - spec.nodeSets.*
+ options:
+ create: true
diff --git a/dt/dcn/edpm-post-ceph/nodeset/ceph_secret.yaml b/dt/dcn/edpm-post-ceph/nodeset/ceph_secret.yaml
new file mode 100644
index 000000000..4d2073239
--- /dev/null
+++ b/dt/dcn/edpm-post-ceph/nodeset/ceph_secret.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: v1
+data:
+ ceph.client.openstack.keyring: _ignored_
+ ceph.conf: _ignored_
+kind: Secret
+metadata:
+ name: ceph-conf-files
+ namespace: openstack
+type: Opaque
diff --git a/dt/dcn/edpm-post-ceph/nodeset/extra_mounts.yaml b/dt/dcn/edpm-post-ceph/nodeset/extra_mounts.yaml
new file mode 100644
index 000000000..e814b3e8d
--- /dev/null
+++ b/dt/dcn/edpm-post-ceph/nodeset/extra_mounts.yaml
@@ -0,0 +1,17 @@
+---
+apiVersion: dataplane.openstack.org/v1beta1
+kind: OpenStackDataPlaneNodeSet
+metadata:
+ name: openstack-edpm
+spec:
+ nodeTemplate:
+ extraMounts:
+ - extraVolType: Ceph
+ mounts:
+ - mountPath: /etc/ceph
+ name: ceph
+ readOnly: true
+ volumes:
+ - name: ceph
+ secret:
+ secretName: ceph-conf-files
diff --git a/dt/dcn/edpm-post-ceph/nodeset/kustomization.yaml b/dt/dcn/edpm-post-ceph/nodeset/kustomization.yaml
new file mode 100644
index 000000000..0629a943c
--- /dev/null
+++ b/dt/dcn/edpm-post-ceph/nodeset/kustomization.yaml
@@ -0,0 +1,263 @@
+---
+apiVersion: kustomize.config.k8s.io/v1alpha1
+kind: Component
+
+transformers:
+ # Set namespace to OpenStack on all namespaced objects without a namespace
+ - |-
+ apiVersion: builtin
+ kind: NamespaceTransformer
+ metadata:
+ name: _ignored_
+ namespace: openstack
+ setRoleBindingSubjects: none
+ unsetOnly: true
+ fieldSpecs:
+ - path: metadata/name
+ kind: Namespace
+ create: true
+
+components:
+ - ../../../../lib/control-plane
+ - ../../../../lib/dataplane/nodeset
+
+resources:
+ - ceph_secret.yaml
+ - nova_ceph.yaml
+
+patches:
+ - target:
+ kind: OpenStackDataPlaneNodeSet
+ name: .*
+ path: extra_mounts.yaml
+
+replacements:
+ - source:
+ kind: ConfigMap
+ name: edpm-nodeset-values-post-ceph
+ fieldPath: data.nodeset_name
+ targets:
+ - select:
+ kind: OpenStackDataPlaneNodeSet
+ fieldPaths:
+ - metadata.name
+ options:
+ create: true
+
+ # Control plane custom service configs
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.nova.customServiceConfig
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.nova.template.apiServiceTemplate.customServiceConfig
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.neutron.template.customServiceConfig
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.neutron.template.customServiceConfig
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.cinderBackup.customServiceConfig
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.cinder.template.cinderBackup.customServiceConfig
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.cinderVolumes
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.cinder.template.cinderVolumes
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.cinderAPI.replicas
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.cinder.template.cinderAPI.replicas
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.cinderAPI.customServiceConfig
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.cinder.template.cinderAPI.customServiceConfig
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.cinderBackup.replicas
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.cinder.template.cinderBackup.replicas
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.glance.customServiceConfig
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.glance.template.customServiceConfig
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.glance.glanceAPIs
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.glance.template.glanceAPIs
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.manila.enabled
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.manila.enabled
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.manila.manilaAPI.customServiceConfig
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.manila.template.manilaAPI.customServiceConfig
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.manila.manilaShares.share1.customServiceConfig
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.manila.template.manilaShares.share1.customServiceConfig
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: service-values
+ fieldPath: data.extraMounts
+ targets:
+ - select:
+ kind: OpenStackControlPlane
+ fieldPaths:
+ - spec.extraMounts
+ options:
+ create: true
+ # Ceph keyring
+ - source:
+ kind: ConfigMap
+ name: edpm-nodeset-values-post-ceph
+ fieldPath: data.ceph_conf
+ targets:
+ - select:
+ kind: Secret
+ name: ceph-conf-files
+ fieldPaths:
+ - data
+ options:
+ create: true
+ # Nova Ceph conf
+ - source:
+ kind: ConfigMap
+ name: edpm-nodeset-values-post-ceph
+ fieldPath: data.nova.ceph.conf
+ targets:
+ - select:
+ kind: ConfigMap
+ name: ceph-nova
+ fieldPaths:
+ - data.03-ceph-nova\.conf
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: edpm-nodeset-values-post-ceph
+ fieldPath: data.nova.name
+ targets:
+ - select:
+ kind: ConfigMap
+ name: ceph-nova
+ fieldPaths:
+ - metadata.name
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: edpm-nodeset-values-post-ceph
+ fieldPath: data.nova.dataSources
+ targets:
+ - select:
+ kind: OpenStackDataPlaneService
+ fieldPaths:
+ - spec.dataSources
+ options:
+ create: true
+ # Dataplane services override (overrides ../../../lib/dataplane which
+ # is using edpm-nodeset-values ConfigMap)
+ - source:
+ kind: ConfigMap
+ name: edpm-nodeset-values-post-ceph
+ fieldPath: data.nodeset.services
+ targets:
+ - select:
+ kind: OpenStackDataPlaneNodeSet
+ fieldPaths:
+ - spec.services
+ options:
+ create: true
+ - source:
+ kind: ConfigMap
+ name: edpm-nodeset-values-post-ceph
+ fieldPath: data.customDataplanService.name
+ targets:
+ - select:
+ kind: OpenStackDataPlaneService
+ fieldPaths:
+ - metadata.name
+ options:
+ create: true
diff --git a/dt/dcn/edpm-post-ceph/nodeset/nova_ceph.yaml b/dt/dcn/edpm-post-ceph/nodeset/nova_ceph.yaml
new file mode 100644
index 000000000..3c53b200b
--- /dev/null
+++ b/dt/dcn/edpm-post-ceph/nodeset/nova_ceph.yaml
@@ -0,0 +1,33 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: ceph-nova
+data:
+ 03-ceph-nova.conf: _replaced_
+---
+apiVersion: dataplane.openstack.org/v1beta1
+kind: OpenStackDataPlaneService
+metadata:
+ name: nova-custom-ceph
+spec:
+ label: dataplane-deployment-nova-custom-ceph
+ dataSources:
+ - configMapRef:
+ name: ceph-nova
+ - secretRef:
+ name: nova-cell1-compute-config
+ - secretRef:
+ name: nova-migration-ssh-key
+ playbook: osp.edpm.nova
+ tlsCerts:
+ default:
+ contents:
+ - dnsnames
+ - ips
+ networks:
+ - ctlplane
+ issuer: osp-rootca-issuer-internal
+ edpmRoleServiceName: nova
+ caCerts: combined-ca-bundle
+ edpmServiceType: nova
diff --git a/dt/dcn/edpm-pre-ceph/deployment/kustomization.yaml b/dt/dcn/edpm-pre-ceph/deployment/kustomization.yaml
new file mode 100644
index 000000000..ae0bb3aad
--- /dev/null
+++ b/dt/dcn/edpm-pre-ceph/deployment/kustomization.yaml
@@ -0,0 +1,46 @@
+---
+apiVersion: kustomize.config.k8s.io/v1alpha1
+kind: Component
+
+transformers:
+ # Set namespace to OpenStack on all namespaced objects without a namespace
+ - |-
+ apiVersion: builtin
+ kind: NamespaceTransformer
+ metadata:
+ name: _ignored_
+ namespace: openstack
+ setRoleBindingSubjects: none
+ unsetOnly: true
+ fieldSpecs:
+ - path: metadata/name
+ kind: Namespace
+ create: true
+
+components:
+ - ../../../../lib/dataplane/deployment
+
+replacements:
+ - source:
+ kind: ConfigMap
+ name: edpm-deployment-values
+ fieldPath: data.deployment.name
+ targets:
+ - select:
+ kind: OpenStackDataPlaneDeployment
+ fieldPaths:
+ - metadata.name
+ options:
+ create: true
+
+ - source:
+ kind: ConfigMap
+ name: edpm-deployment-values
+ fieldPath: data.nodeset_name
+ targets:
+ - select:
+ kind: OpenStackDataPlaneDeployment
+ fieldPaths:
+ - spec.nodeSets.*
+ options:
+ create: true
diff --git a/dt/dcn/edpm-pre-ceph/nodeset/kustomization.yaml b/dt/dcn/edpm-pre-ceph/nodeset/kustomization.yaml
new file mode 100644
index 000000000..1ff411eed
--- /dev/null
+++ b/dt/dcn/edpm-pre-ceph/nodeset/kustomization.yaml
@@ -0,0 +1,34 @@
+---
+apiVersion: kustomize.config.k8s.io/v1alpha1
+kind: Component
+
+transformers:
+ # Set namespace to OpenStack on all namespaced objects without a namespace
+ - |-
+ apiVersion: builtin
+ kind: NamespaceTransformer
+ metadata:
+ name: _ignored_
+ namespace: openstack
+ setRoleBindingSubjects: none
+ unsetOnly: true
+ fieldSpecs:
+ - path: metadata/name
+ kind: Namespace
+ create: true
+
+components:
+ - ../../../../lib/dataplane/nodeset
+
+replacements:
+ - source:
+ kind: ConfigMap
+ name: edpm-nodeset-values
+ fieldPath: data.nodeset_name
+ targets:
+ - select:
+ kind: OpenStackDataPlaneNodeSet
+ fieldPaths:
+ - metadata.name
+ options:
+ create: true
diff --git a/dt/dcn/kustomization.yaml b/dt/dcn/kustomization.yaml
new file mode 100644
index 000000000..a9f72e689
--- /dev/null
+++ b/dt/dcn/kustomization.yaml
@@ -0,0 +1,73 @@
+---
+apiVersion: kustomize.config.k8s.io/v1alpha1
+kind: Component
+
+transformers:
+ # Set namespace to OpenStack on all namespaced objects without a namespace
+ - |-
+ apiVersion: builtin
+ kind: NamespaceTransformer
+ metadata:
+ name: _ignored_
+ namespace: openstack
+ setRoleBindingSubjects: none
+ unsetOnly: true
+ fieldSpecs:
+ - path: metadata/name
+ kind: Namespace
+ create: true
+
+components:
+ - ../../lib/networking/metallb
+ - ../../lib/networking/netconfig
+ - ../../lib/networking/nad
+ - ../../lib/control-plane
+
+# Add storagemgmt network template, as it is needed for CephHCI
+patches:
+ - target:
+ version: v1beta1
+ kind: NetConfig
+ name: netconfig
+ patch: |-
+ - op: add
+ path: /spec/networks/-
+ value:
+ dnsDomain: _replaced_
+ name: storagemgmt
+ subnets:
+ - _replaced_
+ mtu: 1500
+
+# Add storagemgmt network replacements
+replacements:
+ # NetConfig dnsDomain specific to this VA
+ - source:
+ kind: ConfigMap
+ name: network-values
+ fieldPath: data.storagemgmt.dnsDomain
+ targets:
+ - select:
+ kind: NetConfig
+ fieldPaths:
+ - spec.networks.[name=storagemgmt].dnsDomain
+ # NetConfig MTU specific to this VA
+ - source:
+ kind: ConfigMap
+ name: network-values
+ fieldPath: data.storagemgmt.mtu
+ targets:
+ - select:
+ kind: NetConfig
+ fieldPaths:
+ - spec.networks.[name=storagemgmt].mtu
+ # NetConfig subnets specific to this VA
+ - source:
+ kind: ConfigMap
+ name: network-values
+ fieldPath: data.storagemgmt.subnets
+ targets:
+ - select:
+ kind: NetConfig
+ fieldPaths:
+ - spec.networks.[name=storagemgmt].subnets
diff --git a/dt/dcn/namespace.yaml b/dt/dcn/namespace.yaml
new file mode 100644
index 000000000..60a6e8c42
--- /dev/null
+++ b/dt/dcn/namespace.yaml
@@ -0,0 +1,12 @@
+---
+apiVersion: builtin
+kind: NamespaceTransformer
+metadata:
+ name: _ignored_
+ namespace: openstack
+setRoleBindingSubjects: none
+unsetOnly: true
+fieldSpecs:
+ - path: metadata/name
+ kind: Namespace
+ create: true
diff --git a/examples/dt/dcn/.gitignore b/examples/dt/dcn/.gitignore
new file mode 100644
index 000000000..205810519
--- /dev/null
+++ b/examples/dt/dcn/.gitignore
@@ -0,0 +1,4 @@
+nncp.yaml
+control-plane.yaml
+dataplane-pre-ceph.yaml
+dataplane-post-ceph.yaml
diff --git a/examples/dt/dcn/README.md b/examples/dt/dcn/README.md
new file mode 100644
index 000000000..4e0ac44c4
--- /dev/null
+++ b/examples/dt/dcn/README.md
@@ -0,0 +1,45 @@
+# Distributed Compute Node (DCN) OpenStack Architecture with HCI and Ceph
+
+**Based on OpenStack K8S operators from the "main" branch of the [OpenStack Operator repo](https://github.com/openstack-k8s-operators/openstack-operator/commit/ec7210b825a3c355007d1f1fc11a2952ba4a9262) on Oct 22nd, 2024**
+
+
+
+This is a collection of CR templates that represent a Red Hat OpenStack Services on OpenShift deployment that has the following characteristics:
+
+- 3 master/worker combo-node OpenShift cluster
+- 3-replica Galera database
+- RabbitMQ
+- Spine and leaf network architecture
+- Network isolation
+- OVN networking
+- 9 compute nodes distributed across multiple DCN sites
+- CephHCI installed on compute nodes and used by various OSP services
+ - Cinder Volume using RBD for backend
+ - Cinder Backup using RBD for backend
+ - Glance using Multi Store Support and RBD for backend
+ - Nova using RBD for ephemeral storage
+
+## Considerations
+
+1. These CRs are validated for the overall functionality of the OSP cloud deployed, but they nonetheless require customization for the particular environment in which they are utilized. In this sense they are _templates_ meant to be consumed and tweaked to fit the specific constraints of the hardware available.
+
+2. The CRs are applied against an OpenShift cluster in _stages_. That is, there is an ordering in which each grouping of CRs is fed to the cluster. It is _not_ a case of simply taking all CRs from all stages and applying them all at once.
+
+3. In stages 1 and 2 [kustomize](https://kustomize.io/) is used to genereate the control plane CRs dynamically. The `control-plane/nncp/values.yaml` file(s) must be updated to fit your environment. kustomize version 5 or newer required.
+
+4. In stages 3 and 4 [kustomize](https://kustomize.io/) is used to generate the dataplane CRs dynamically. The `edpm-pre-ceph/values.yaml`, `values.yaml` and `service-values.yaml` files must be updated to fit your environment. kustomize version 5 or newer required.
+
+5. Between stages 3 and 4, _it is assumed that the user installs Ceph on the 3 OSP compute nodes._ OpenStack K8S CRDs do not provide a way to install Ceph via any sort of combination of CRs.
+
+Note: Steps 3 and 4, as well as the Ceph installation, must be completed for each DCN site.
+
+Additionally, the values yaml files can be reset and modified for each DCN site as needed.
+
+## Stages
+
+All stages must be executed in the order listed below. Everything is required unless otherwise indicated.
+
+1. [Install the OpenStack K8S operators and their dependencies](../../common/)
+2. [Configuring networking and deploy the OpenStack control plane](control-plane.md)
+3. [Configure and deploy the initial data plane to prepare for Ceph installation](dataplane-pre-ceph.md)
+4. [Update the control plane and finish deploying the data plane after Ceph has been installed](dataplane-post-ceph.md)
diff --git a/examples/dt/dcn/control-plane.md b/examples/dt/dcn/control-plane.md
new file mode 100644
index 000000000..baefd720e
--- /dev/null
+++ b/examples/dt/dcn/control-plane.md
@@ -0,0 +1,65 @@
+# Configuring networking and deploy the OpenStack control plane
+
+## Assumptions
+
+- A storage class called `lvms-local-storage` should already exist.
+
+## Initialize
+
+Switch to the "openstack" namespace
+
+```shell
+oc project openstack
+```
+
+Change to the dcn directory
+
+```shell
+cd architecture/examples/dt/dcn
+```
+
+Edit the [control-plane/nncp/values.yaml](control-plane/nncp/values.yaml) file to suit your environment.
+
+```shell
+vi control-plane/nncp/values.yaml
+```
+
+## Apply node network configuration
+
+Generate the node network configuration
+
+```shell
+kustomize build control-plane/nncp > nncp.yaml
+```
+
+Apply the NNCP CRs
+
+```shell
+oc apply -f nncp.yaml
+```
+
+Wait for NNCPs to be available
+
+```shell
+oc wait nncp -l osp/nncm-config-type=standard --for jsonpath='{.status.conditions[0].reason}'=SuccessfullyConfigured --timeout=300s
+```
+
+## Apply networking and control-plane configuration
+
+Generate the control-plane and networking CRs.
+
+```shell
+kustomize build control-plane > control-plane.yaml
+```
+
+Apply the CRs
+
+```shell
+oc apply -f control-plane.yaml
+```
+
+Wait for control plane to be available
+
+```shell
+oc wait osctlplane controlplane --for condition=Ready --timeout=600s
+```
diff --git a/examples/dt/dcn/control-plane/.gitignore b/examples/dt/dcn/control-plane/.gitignore
new file mode 100644
index 000000000..3df8f53be
--- /dev/null
+++ b/examples/dt/dcn/control-plane/.gitignore
@@ -0,0 +1 @@
+control-plane.yaml
diff --git a/examples/dt/dcn/control-plane/kustomization.yaml b/examples/dt/dcn/control-plane/kustomization.yaml
new file mode 100644
index 000000000..bab9b637a
--- /dev/null
+++ b/examples/dt/dcn/control-plane/kustomization.yaml
@@ -0,0 +1,10 @@
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+components:
+ - ../../../../dt/dcn/
+
+resources:
+ - nncp/values.yaml
+ - service-values.yaml
diff --git a/examples/dt/dcn/control-plane/nncp/.gitignore b/examples/dt/dcn/control-plane/nncp/.gitignore
new file mode 100644
index 000000000..51ed8a956
--- /dev/null
+++ b/examples/dt/dcn/control-plane/nncp/.gitignore
@@ -0,0 +1 @@
+nncp.yaml
diff --git a/examples/dt/dcn/control-plane/nncp/kustomization.yaml b/examples/dt/dcn/control-plane/nncp/kustomization.yaml
new file mode 100644
index 000000000..c92bc55fa
--- /dev/null
+++ b/examples/dt/dcn/control-plane/nncp/kustomization.yaml
@@ -0,0 +1,24 @@
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+transformers:
+ # Set namespace to OpenStack on all namespaced objects without a namespace
+ - |-
+ apiVersion: builtin
+ kind: NamespaceTransformer
+ metadata:
+ name: _ignored_
+ namespace: openstack
+ setRoleBindingSubjects: none
+ unsetOnly: true
+ fieldSpecs:
+ - path: metadata/name
+ kind: Namespace
+ create: true
+
+components:
+ - ../../../../../lib/nncp
+
+resources:
+ - values.yaml
diff --git a/examples/dt/dcn/control-plane/nncp/values.yaml b/examples/dt/dcn/control-plane/nncp/values.yaml
new file mode 100644
index 000000000..de497691b
--- /dev/null
+++ b/examples/dt/dcn/control-plane/nncp/values.yaml
@@ -0,0 +1,710 @@
+---
+apiVersion: v1
+data:
+ bridgeName: ospbr
+ ctlplane:
+ dnsDomain: ctlplane.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: ctlplane
+ metallb.universe.tf/allow-shared-ip: ctlplane
+ metallb.universe.tf/loadBalancerIPs: 192.168.122.80
+ iface: enp7s0
+ lb_addresses:
+ - 192.168.122.80-192.168.122.90
+ mtu: 1500
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "ctlplane",
+ "type": "macvlan",
+ "master": "ospbr",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "192.168.122.0/24",
+ "range_start": "192.168.122.30",
+ "range_end": "192.168.122.70",
+ "routes": [
+ {
+ "dst": "192.168.133.0/24",
+ "gw": "192.168.122.1"
+ },
+ {
+ "dst": "192.168.144.0/24",
+ "gw": "192.168.122.1"
+ }
+ ]
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 192.168.122.120
+ start: 192.168.122.100
+ - end: 192.168.122.170
+ start: 192.168.122.150
+ cidr: 192.168.122.0/24
+ gateway: 192.168.122.1
+ name: subnet1
+ routes:
+ - destination: 192.168.133.0/24
+ nexthop: 192.168.122.1
+ - destination: 192.168.144.0/24
+ nexthop: 192.168.122.1
+ - allocationRanges:
+ - end: 192.168.133.120
+ start: 192.168.133.100
+ - end: 192.168.133.170
+ start: 192.168.133.150
+ cidr: 192.168.133.0/24
+ gateway: 192.168.133.1
+ name: subnet2
+ routes:
+ - destination: 192.168.122.0/24
+ nexthop: 192.168.133.1
+ - destination: 192.168.144.0/24
+ nexthop: 192.168.133.1ØØ
+ - allocationRanges:
+ - end: 192.168.144.120
+ start: 192.168.144.100
+ - end: 192.168.144.170
+ start: 192.168.144.150
+ cidr: 192.168.144.0/24
+ gateway: 192.168.144.1
+ name: subnet3
+ routes:
+ - destination: 192.168.122.0/24
+ nexthop: 192.168.144.1
+ - destination: 192.168.133.0/24
+ nexthop: 192.168.144.1
+ ctlplanedcn1:
+ dnsDomain: ctlplanedcn1.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: ctlplanedcn1
+ metallb.universe.tf/allow-shared-ip: ctlplanedcn1
+ metallb.universe.tf/loadBalancerIPs: 192.168.133.80
+ iface: eth1
+ lb_addresses:
+ - 192.168.133.80-192.168.133.90
+ mtu: 1500
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "ctlplanedcn1",
+ "type": "macvlan",
+ "master": "eth1",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "192.168.133.0/24",
+ "range_start": "192.168.133.30",
+ "range_end": "192.168.133.70"
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 192.168.133.120
+ start: 192.168.133.100
+ - end: 192.168.133.170
+ start: 192.168.133.150
+ cidr: 192.168.133.0/24
+ gateway: 192.168.133.1
+ name: subnet1
+ ctlplanedcn2:
+ dnsDomain: ctlplanedcn2.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: ctlplanedcn2
+ metallb.universe.tf/allow-shared-ip: ctlplanedcn2
+ metallb.universe.tf/loadBalancerIPs: 192.168.144.80
+ iface: eth1
+ lb_addresses:
+ - 192.168.144.80-192.168.144.90
+ mtu: 1500
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "ctlplanedcn2",
+ "type": "macvlan",
+ "master": "eth1",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "192.168.144.0/24",
+ "range_start": "192.168.144.30",
+ "range_end": "192.168.144.70"
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 192.168.144.120
+ start: 192.168.144.100
+ - end: 192.168.144.170
+ start: 192.168.144.150
+ cidr: 192.168.144.0/24
+ gateway: 192.168.144.1
+ name: subnet1
+ datacentre:
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "datacentre",
+ "type": "bridge",
+ "bridge": "ospbr",
+ "ipam": {}
+ }
+ dns-resolver:
+ config:
+ search: []
+ server:
+ - 192.168.122.1
+ options:
+ - key: server
+ values:
+ - 192.168.122.1
+ external:
+ dnsDomain: external.example.com
+ mtu: 1500
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 10.0.0.250
+ start: 10.0.0.100
+ cidr: 10.0.0.0/24
+ name: subnet1
+ vlan: 22
+ vlan: 22
+ internalapi:
+ base_iface: enp7s0
+ dnsDomain: internalapi.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: internalapi
+ metallb.universe.tf/allow-shared-ip: internalapi
+ metallb.universe.tf/loadBalancerIPs: 172.17.0.80
+ iface: internalapi
+ lb_addresses:
+ - 172.17.0.80-172.17.0.90
+ mtu: 1496
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "internalapi",
+ "type": "macvlan",
+ "master": "internalapi",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "172.17.0.0/24",
+ "range_start": "172.17.0.30",
+ "range_end": "172.17.0.70",
+ "routes": [
+ {
+ "dst": "172.17.10.0/24",
+ "gw": "172.17.0.1"
+ },
+ {
+ "dst": "172.17.20.0/24",
+ "gw": "172.17.0.1"
+ }
+ ]
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.17.0.250
+ start: 172.17.0.100
+ cidr: 172.17.0.0/24
+ name: subnet1
+ routes:
+ - destination: 172.17.10.0/24
+ nexthop: 172.17.0.1
+ - destination: 172.17.20.0/24
+ nexthop: 172.17.0.1
+ vlan: 20
+ - allocationRanges:
+ - end: 172.17.10.250
+ start: 172.17.10.100
+ cidr: 172.17.10.0/24
+ name: subnet2
+ routes:
+ - destination: 172.17.0.0/24
+ nexthop: 172.17.10.1
+ - destination: 172.17.20.0/24
+ nexthop: 172.17.10.1
+ vlan: 30
+ - allocationRanges:
+ - end: 172.17.20.250
+ start: 172.17.20.100
+ cidr: 172.17.20.0/24
+ name: subnet3
+ routes:
+ - destination: 172.17.0.0/24
+ nexthop: 172.17.20.1
+ - destination: 172.17.10.0/24
+ nexthop: 172.17.20.1
+ vlan: 40
+ vlan: 20
+ internalapidcn1:
+ base_iface: eth1
+ dnsDomain: internalapidcn1.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: internalapidcn1
+ metallb.universe.tf/allow-shared-ip: internalapidcn1
+ metallb.universe.tf/loadBalancerIPs: 172.17.10.80
+ iface: internalapidcn1
+ lb_addresses:
+ - 172.17.10.80-172.17.10.90
+ mtu: 1496
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "internalapidcn1",
+ "type": "macvlan",
+ "master": "internalapidcn1",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "172.17.10.0/24",
+ "range_start": "172.17.10.30",
+ "range_end": "172.17.10.70"
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.17.10.250
+ start: 172.17.10.100
+ cidr: 172.17.10.0/24
+ name: subnet1
+ vlan: 30
+ vlan: 30
+ internalapidcn2:
+ base_iface: eth1
+ dnsDomain: internalapidcn2.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: internalapidcn2
+ metallb.universe.tf/allow-shared-ip: internalapidcn2
+ metallb.universe.tf/loadBalancerIPs: 172.17.20.80
+ iface: internalapidcn2
+ lb_addresses:
+ - 172.17.20.80-172.17.20.90
+ mtu: 1496
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "internalapidcn2",
+ "type": "macvlan",
+ "master": "internalapidcn2",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "172.17.20.0/24",
+ "range_start": "172.17.20.30",
+ "range_end": "172.17.20.70"
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.17.20.250
+ start: 172.17.20.100
+ cidr: 172.17.20.0/24
+ name: subnet1
+ vlan: 40
+ vlan: 40
+ lbServiceType: LoadBalancer
+ node_0:
+ ctlplane_ip: 192.168.122.10
+ internalapi_ip: 172.17.0.10
+ name: master-0
+ storage_ip: 172.18.0.10
+ tenant_ip: 172.19.0.10
+ node_1:
+ ctlplane_ip: 192.168.122.11
+ internalapi_ip: 172.17.0.11
+ name: master-1
+ storage_ip: 172.18.0.11
+ tenant_ip: 172.19.0.11
+ node_2:
+ ctlplane_ip: 192.168.122.12
+ internalapi_ip: 172.17.0.12
+ name: master-2
+ storage_ip: 172.18.0.12
+ tenant_ip: 172.19.0.12
+ rabbitmq:
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: internalapi
+ metallb.universe.tf/loadBalancerIPs: 172.17.0.85
+ rabbitmq-cell1:
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: internalapi
+ metallb.universe.tf/loadBalancerIPs: 172.17.0.86
+ routes:
+ config:
+ - destination: 192.168.133.0/24
+ next-hop-address: 192.168.122.1
+ next-hop-interface: ospbr
+ - destination: 192.168.144.0/24
+ next-hop-address: 192.168.122.1
+ next-hop-interface: ospbr
+ - destination: 172.17.10.0/24
+ next-hop-address: 172.17.0.1
+ next-hop-interface: internalapi
+ - destination: 172.18.10.0/24
+ next-hop-address: 172.18.0.1
+ next-hop-interface: storage
+ - destination: 172.19.10.0/24
+ next-hop-address: 172.19.0.1
+ next-hop-interface: tenant
+ - destination: 172.17.20.0/24
+ next-hop-address: 172.17.0.1
+ next-hop-interface: internalapi
+ - destination: 172.18.20.0/24
+ next-hop-address: 172.18.0.1
+ next-hop-interface: storage
+ - destination: 172.19.20.0/24
+ next-hop-address: 172.19.0.1
+ next-hop-interface: tenant
+ storage:
+ base_iface: enp7s0
+ dnsDomain: storage.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: storage
+ metallb.universe.tf/allow-shared-ip: storage
+ metallb.universe.tf/loadBalancerIPs: 172.18.0.80
+ iface: storage
+ lb_addresses:
+ - 172.18.0.80-172.18.0.90
+ mtu: 1496
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "storage",
+ "type": "macvlan",
+ "master": "storage",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "172.18.0.0/24",
+ "range_start": "172.18.0.30",
+ "range_end": "172.18.0.70",
+ "routes": [
+ {
+ "dst": "172.18.10.0/24",
+ "gw": "172.18.0.1"
+ },
+ {
+ "dst": "172.18.20.0/24",
+ "gw": "172.18.0.1"
+ }
+ ]
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.18.0.250
+ start: 172.18.0.100
+ cidr: 172.18.0.0/24
+ name: subnet1
+ routes:
+ - destination: 172.18.10.0/24
+ nexthop: 172.18.0.1
+ - destination: 172.18.20.0/24
+ nexthop: 172.18.0.1
+ vlan: 21
+ - allocationRanges:
+ - end: 172.18.10.250
+ start: 172.18.10.100
+ cidr: 172.18.10.0/24
+ name: subnet2
+ routes:
+ - destination: 172.18.0.0/24
+ nexthop: 172.18.10.1
+ - destination: 172.18.20.0/24
+ nexthop: 172.18.10.1
+ vlan: 31
+ - allocationRanges:
+ - end: 172.18.20.250
+ start: 172.18.20.100
+ cidr: 172.18.20.0/24
+ name: subnet3
+ routes:
+ - destination: 172.18.0.0/24
+ nexthop: 172.18.20.1
+ - destination: 172.18.10.0/24
+ nexthop: 172.18.20.1
+ vlan: 41
+ vlan: 21
+ storageClass: lvms-local-storage
+ storagedcn1:
+ base_iface: eth1
+ dnsDomain: storagedcn1.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: storagedcn1
+ metallb.universe.tf/allow-shared-ip: storagedcn1
+ metallb.universe.tf/loadBalancerIPs: 172.18.10.80
+ iface: storagedcn1
+ lb_addresses:
+ - 172.18.10.80-172.18.10.90
+ mtu: 1496
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "storagedcn1",
+ "type": "macvlan",
+ "master": "storagedcn1",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "172.18.10.0/24",
+ "range_start": "172.18.10.30",
+ "range_end": "172.18.10.70"
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.18.10.250
+ start: 172.18.10.100
+ cidr: 172.18.10.0/24
+ name: subnet1
+ vlan: 31
+ vlan: 31
+ storagedcn2:
+ base_iface: eth1
+ dnsDomain: storagedcn2.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: storagedcn2
+ metallb.universe.tf/allow-shared-ip: storagedcn2
+ metallb.universe.tf/loadBalancerIPs: 172.18.20.80
+ iface: storagedcn2
+ lb_addresses:
+ - 172.18.20.80-172.18.20.90
+ mtu: 1496
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "storagedcn2",
+ "type": "macvlan",
+ "master": "storagedcn2",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "172.18.20.0/24",
+ "range_start": "172.18.20.30",
+ "range_end": "172.18.20.70"
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.18.20.250
+ start: 172.18.20.100
+ cidr: 172.18.20.0/24
+ name: subnet1
+ vlan: 41
+ vlan: 41
+ storagemgmt:
+ base_iface: eth1
+ dnsDomain: storagemgmt.example.com
+ iface: storagemgmt
+ mtu: 1500
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.20.0.250
+ start: 172.20.0.100
+ cidr: 172.20.0.0/24
+ name: subnet1
+ routes:
+ - destination: 172.20.10.0/24
+ nexthop: 172.20.0.1
+ - destination: 172.20.20.0/24
+ nexthop: 172.20.0.1
+ vlan: 23
+ - allocationRanges:
+ - end: 172.20.10.250
+ start: 172.20.10.100
+ cidr: 172.20.10.0/24
+ name: subnet2
+ routes:
+ - destination: 172.20.0.0/24
+ nexthop: 172.20.10.1
+ - destination: 172.20.20.0/24
+ nexthop: 172.20.10.1
+ vlan: 33
+ - allocationRanges:
+ - end: 172.20.20.250
+ start: 172.20.20.100
+ cidr: 172.20.20.0/24
+ name: subnet3
+ routes:
+ - destination: 172.20.0.0/24
+ nexthop: 172.20.20.1
+ - destination: 172.20.10.0/24
+ nexthop: 172.20.20.1
+ vlan: 43
+ vlan: 23
+ storagemgmtdcn1:
+ base_iface: eth1
+ dnsDomain: storagemgmtdcn1.example.com
+ iface: storagemgmtdcn1
+ mtu: 1500
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.20.10.250
+ start: 172.20.10.100
+ cidr: 172.20.10.0/24
+ name: subnet1
+ vlan: 33
+ vlan: 33
+ storagemgmtdcn2:
+ base_iface: eth1
+ dnsDomain: storagemgmtdcn2.example.com
+ iface: storagemgmtdcn2
+ mtu: 1500
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.20.20.250
+ start: 172.20.20.100
+ cidr: 172.20.20.0/24
+ name: subnet1
+ vlan: 43
+ vlan: 43
+ tenant:
+ base_iface: enp7s0
+ dnsDomain: tenant.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: tenant
+ metallb.universe.tf/allow-shared-ip: tenant
+ metallb.universe.tf/loadBalancerIPs: 172.19.0.80
+ iface: tenant
+ lb_addresses:
+ - 172.19.0.80-172.19.0.90
+ mtu: 1496
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "tenant",
+ "type": "macvlan",
+ "master": "tenant",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "172.19.0.0/24",
+ "range_start": "172.19.0.30",
+ "range_end": "172.19.0.70",
+ "routes": [
+ {
+ "dst": "172.19.10.0/24",
+ "gw": "172.19.0.1"
+ },
+ {
+ "dst": "172.19.20.0/24",
+ "gw": "172.19.0.1"
+ }
+ ]
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.19.0.250
+ start: 172.19.0.100
+ cidr: 172.19.0.0/24
+ name: subnet1
+ routes:
+ - destination: 172.19.10.0/24
+ nexthop: 172.19.0.1
+ - destination: 172.19.20.0/24
+ nexthop: 172.19.0.1
+ vlan: 22
+ - allocationRanges:
+ - end: 172.19.10.250
+ start: 172.19.10.100
+ cidr: 172.19.10.0/24
+ name: subnet2
+ routes:
+ - destination: 172.19.0.0/24
+ nexthop: 172.19.10.1
+ - destination: 172.19.20.0/24
+ nexthop: 172.19.10.1
+ vlan: 32
+ - allocationRanges:
+ - end: 172.19.20.250
+ start: 172.19.20.100
+ cidr: 172.19.20.0/24
+ name: subnet3
+ routes:
+ - destination: 172.19.0.0/24
+ nexthop: 172.19.20.1
+ - destination: 172.19.10.0/24
+ nexthop: 172.19.20.1
+ vlan: 42
+ vlan: 22
+ tenantdcn1:
+ base_iface: eth1
+ dnsDomain: tenantdcn1.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: tenantdcn1
+ metallb.universe.tf/allow-shared-ip: tenantdcn1
+ metallb.universe.tf/loadBalancerIPs: 172.19.10.80
+ iface: tenantdcn1
+ lb_addresses:
+ - 172.19.10.80-172.19.10.90
+ mtu: 1496
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "tenantdcn1",
+ "type": "macvlan",
+ "master": "tenantdcn1",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "172.19.10.0/24",
+ "range_start": "172.19.10.30",
+ "range_end": "172.19.10.70"
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.19.10.250
+ start: 172.19.10.100
+ cidr: 172.19.10.0/24
+ name: subnet1
+ vlan: 32
+ vlan: 32
+ tenantdcn2:
+ base_iface: eth1
+ dnsDomain: tenantdcn2.example.com
+ endpoint_annotations:
+ metallb.universe.tf/address-pool: tenantdcn2
+ metallb.universe.tf/allow-shared-ip: tenantdcn2
+ metallb.universe.tf/loadBalancerIPs: 172.19.20.80
+ iface: tenantdcn2
+ lb_addresses:
+ - 172.19.20.80-172.19.20.90
+ mtu: 1496
+ net-attach-def: |
+ {
+ "cniVersion": "0.3.1",
+ "name": "tenantdcn2",
+ "type": "macvlan",
+ "master": "tenantdcn2",
+ "ipam": {
+ "type": "whereabouts",
+ "range": "172.19.20.0/24",
+ "range_start": "172.19.20.30",
+ "range_end": "172.19.20.70"
+ }
+ }
+ prefix-length: 24
+ subnets:
+ - allocationRanges:
+ - end: 172.19.20.250
+ start: 172.19.20.100
+ cidr: 172.19.20.0/24
+ name: subnet1
+ vlan: 42
+ vlan: 42
+kind: ConfigMap
+metadata:
+ annotations:
+ config.kubernetes.io/local-config: 'true'
+ name: network-values
diff --git a/examples/dt/dcn/control-plane/service-values.yaml b/examples/dt/dcn/control-plane/service-values.yaml
new file mode 100644
index 000000000..7d79a5db9
--- /dev/null
+++ b/examples/dt/dcn/control-plane/service-values.yaml
@@ -0,0 +1,9 @@
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: service-values
+ annotations:
+ config.kubernetes.io/local-config: "true"
+data:
+ preserveJobs: false
diff --git a/examples/dt/dcn/dataplane-post-ceph.md b/examples/dt/dcn/dataplane-post-ceph.md
new file mode 100644
index 000000000..fd38ccdee
--- /dev/null
+++ b/examples/dt/dcn/dataplane-post-ceph.md
@@ -0,0 +1,97 @@
+# Configuring and deploying the post-Ceph dataplane
+
+## Assumptions
+
+- The pre-Ceph [dataplane](dataplane-pre-ceph.md) was already deployed and Ceph was manually installed afterwords
+
+## Initialize post-Ceph
+
+Switch to the "openstack" namespace
+
+```shell
+oc project openstack
+```
+
+Change to the dcn directory
+
+```shell
+cd architecture/examples/dt/dcn
+```
+
+Edit the [values.yaml](values.yaml) and [service-values.yaml](service-values.yaml)
+files to suit your environment.
+
+```shell
+vi values.yaml
+vi service-values.yaml
+```
+
+Generate the post-Ceph dataplane nodeset CR.
+
+```shell
+kustomize build > nodeset-post-ceph.yaml
+```
+
+Generate the post-Ceph dataplane deployment CR.
+
+```shell
+kustomize build deployment > deployment-post-ceph.yaml
+```
+
+## Create post-Ceph CRs
+
+Create the nodeset CR
+
+```shell
+oc apply -f nodeset-post-ceph.yaml
+```
+
+Wait for post-Ceph dataplane nodeset setup to finish
+
+```shell
+oc wait osdpns openstack-edpm --for condition=SetupReady --timeout=1200s
+```
+
+Create the deployment CR
+
+```shell
+oc apply -f deployment-post-ceph.yaml
+```
+
+Wait for control plane to be available after updating
+
+```shell
+oc wait osctlplane controlplane --for condition=Ready --timeout=600s
+```
+
+Wait for post-Ceph dataplane deployment to finish
+
+```shell
+oc wait osdpd edpm-deployment-post-ceph --for condition=Ready --timeout=2800s
+```
+
+## Finalize Nova computes
+
+Ask Nova to discover all compute hosts
+
+```shell
+oc rsh nova-cell0-conductor-0 nova-manage cell_v2 discover_hosts --verbose
+```
+
+Create Host Aggregates. For example, to create a host aggregate with the name az0, use the following command:
+
+```shell
+oc rsh openstackclient openstack aggregate create --zone az0 az0
+```
+
+Add compute host to aggregate. To add a compute host to the aggregate, use the following command:
+
+```shell
+oc rsh openstackclient openstack aggregate add host az0 edpm-compute-0.ctlplane.example.com
+```
+
+## Additional Availability Zones
+
+The above will result in `az0` with 3 compute nodes and one ceph cluster being deployed. To deploy additional AZs, e.g. `az1` and `az2`, each with 3 more compute nodes and one more ceph cluster, create updated values files and re-apply the kustomizations. An Ansible role which does this in our CI system for testing is available to be reviewed for details.
+
+
diff --git a/examples/dt/dcn/dataplane-pre-ceph.md b/examples/dt/dcn/dataplane-pre-ceph.md
new file mode 100644
index 000000000..18d219eda
--- /dev/null
+++ b/examples/dt/dcn/dataplane-pre-ceph.md
@@ -0,0 +1,64 @@
+# Configuring and deploying the pre-Ceph dataplane
+
+## Assumptions
+
+- The [control plane](control-plane.md) has been created and successfully deployed
+
+## Initialize pre-Ceph
+
+Switch to the "openstack" namespace
+
+```shell
+oc project openstack
+```
+
+Change to the dcn directory
+
+```shell
+cd architecture/examples/dt/dcn
+```
+
+Edit the [edpm-pre-ceph/nodeset/values.yaml](edpm-pre-ceph/nodeset/values.yaml) file to suit
+your environment.
+
+```shell
+vi edpm-pre-ceph/nodeset/values.yaml
+```
+
+Generate the pre-Ceph dataplane nodeset CR.
+
+```shell
+kustomize build edpm-pre-ceph/nodeset > dataplane-nodeset-pre-ceph.yaml
+```
+
+Generate the pre-Ceph dataplane deployment CR.
+
+```shell
+kustomize build edpm-pre-ceph/deployment > dataplane-deployment-pre-ceph.yaml
+```
+
+## Create pre-Ceph CRs
+
+Create the nodeset CR
+
+```shell
+oc apply -f dataplane-nodeset-pre-ceph.yaml
+```
+
+Wait for pre-Ceph dataplane nodeset setup to finish
+
+```shell
+oc wait osdpns openstack-edpm --for condition=SetupReady --timeout=600s
+```
+
+Start the deployment
+
+```shell
+oc apply -f dataplane-deployment-pre-ceph.yaml
+```
+
+Wait for pre-Ceph dataplane deployment to finish
+
+```shell
+oc wait osdpd edpm-deployment-pre-ceph --for condition=Ready --timeout=1200s
+```
diff --git a/examples/dt/dcn/deployment/kustomization.yaml b/examples/dt/dcn/deployment/kustomization.yaml
new file mode 100644
index 000000000..0106926fd
--- /dev/null
+++ b/examples/dt/dcn/deployment/kustomization.yaml
@@ -0,0 +1,23 @@
+# This is the kustomization for the FINAL step, edpm-post-ceph
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+components:
+ - ../../../../dt/dcn/edpm-post-ceph/deployment
+
+resources:
+ - values.yaml
+
+replacements:
+ - source:
+ kind: ConfigMap
+ name: edpm-deployment-values-post-ceph
+ fieldPath: data.servicesOverride
+ targets:
+ - select:
+ kind: OpenStackDataPlaneDeployment
+ fieldPaths:
+ - spec.servicesOverride
+ options:
+ create: true
diff --git a/examples/dt/dcn/deployment/values.yaml b/examples/dt/dcn/deployment/values.yaml
new file mode 100644
index 000000000..94da3cc28
--- /dev/null
+++ b/examples/dt/dcn/deployment/values.yaml
@@ -0,0 +1,19 @@
+# local-config: referenced, but not emitted by kustomize
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: edpm-deployment-values-post-ceph
+ annotations:
+ config.kubernetes.io/local-config: "true"
+data:
+ nodeset_name: computes-edpm
+ deployment:
+ name: edpm-deployment-post-ceph
+ servicesOverride:
+ - install-certs
+ - ceph-client
+ - ovn
+ - neutron-metadata
+ - libvirt
+ - nova-custom-ceph-az0
diff --git a/examples/dt/dcn/edpm-pre-ceph/.gitignore b/examples/dt/dcn/edpm-pre-ceph/.gitignore
new file mode 100644
index 000000000..5f95f0e67
--- /dev/null
+++ b/examples/dt/dcn/edpm-pre-ceph/.gitignore
@@ -0,0 +1 @@
+dataplane-pre-ceph.yaml
diff --git a/examples/dt/dcn/edpm-pre-ceph/deployment/kustomization.yaml b/examples/dt/dcn/edpm-pre-ceph/deployment/kustomization.yaml
new file mode 100644
index 000000000..020980def
--- /dev/null
+++ b/examples/dt/dcn/edpm-pre-ceph/deployment/kustomization.yaml
@@ -0,0 +1,22 @@
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+components:
+ - ../../../../../dt/dcn/edpm-pre-ceph/deployment
+
+resources:
+ - values.yaml
+
+replacements:
+ - source:
+ kind: ConfigMap
+ name: edpm-deployment-values
+ fieldPath: data.servicesOverride
+ targets:
+ - select:
+ kind: OpenStackDataPlaneDeployment
+ fieldPaths:
+ - spec.servicesOverride
+ options:
+ create: true
diff --git a/examples/dt/dcn/edpm-pre-ceph/deployment/values.yaml b/examples/dt/dcn/edpm-pre-ceph/deployment/values.yaml
new file mode 100644
index 000000000..5905df09d
--- /dev/null
+++ b/examples/dt/dcn/edpm-pre-ceph/deployment/values.yaml
@@ -0,0 +1,23 @@
+# yamllint disable rule:line-length
+# local-config: referenced, but not emitted by kustomize
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: edpm-deployment-values
+ annotations:
+ config.kubernetes.io/local-config: "true"
+data:
+ nodeset_name: computes-edpm
+ deployment:
+ name: edpm-deployment-pre-ceph
+ servicesOverride:
+ - bootstrap
+ - configure-network
+ - validate-network
+ - install-os
+ - ceph-hci-pre
+ - configure-os
+ - ssh-known-hosts
+ - run-os
+ - reboot-os
diff --git a/examples/dt/dcn/edpm-pre-ceph/nodeset/kustomization.yaml b/examples/dt/dcn/edpm-pre-ceph/nodeset/kustomization.yaml
new file mode 100644
index 000000000..cb0e46c6a
--- /dev/null
+++ b/examples/dt/dcn/edpm-pre-ceph/nodeset/kustomization.yaml
@@ -0,0 +1,9 @@
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+components:
+ - ../../../../../dt/dcn/edpm-pre-ceph/nodeset
+
+resources:
+ - values.yaml
diff --git a/examples/dt/dcn/edpm-pre-ceph/nodeset/values.yaml b/examples/dt/dcn/edpm-pre-ceph/nodeset/values.yaml
new file mode 100644
index 000000000..327d68f32
--- /dev/null
+++ b/examples/dt/dcn/edpm-pre-ceph/nodeset/values.yaml
@@ -0,0 +1,185 @@
+# yamllint disable rule:line-length
+# local-config: referenced, but not emitted by kustomize
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: edpm-nodeset-values
+ annotations:
+ config.kubernetes.io/local-config: "true"
+data:
+ nodeset_name: computes-edpm
+ ssh_keys:
+ # Authorized keys that will have access to the dataplane computes via SSH
+ authorized: CHANGEME
+ # The private key that will have access to the dataplane computes via SSH
+ private: CHANGEME
+ # The public key that will have access to the dataplane computes via SSH
+ public: CHANGEME
+ nodeset:
+ ansible:
+ ansibleUser: cloud-admin
+ ansiblePort: 22
+ ansibleVars:
+ timesync_ntp_servers:
+ - hostname: clock.redhat.com
+ # CHANGEME -- see https://access.redhat.com/solutions/253273
+ # edpm_bootstrap_command: |
+ # subscription-manager register --username \
+ # --password
+ # podman login -u -p registry.redhat.io
+ edpm_network_config_hide_sensitive_logs: false
+ edpm_network_config_os_net_config_mappings:
+ edpm-compute-0:
+ nic1: "52:54:03:88:69:8f"
+ nic2: "52:54:03:fa:fd:1a"
+ edpm-compute-1:
+ nic1: "52:54:04:df:ec:df"
+ nic2: "52:54:04:c1:e2:8a"
+ edpm-compute-2:
+ nic1: "52:54:05:58:9f:66"
+ nic2: "52:54:05:da:10:54"
+ edpm_network_config_template: |
+ ---
+ {% set mtu_list = [ctlplane_mtu] %}
+ {% for network in nodeset_networks %}
+ {{ mtu_list.append(lookup('vars', networks_lower[network] ~ '_mtu')) }}
+ {%- endfor %}
+ {% set min_viable_mtu = mtu_list | max %}
+ network_config:
+ - type: ovs_bridge
+ name: br-ex
+ use_dhcp: false
+ members:
+ - type: interface
+ name: nic1
+ primary: false
+ - type: ovs_bridge
+ name: {{ neutron_physical_bridge_name }}
+ mtu: {{ min_viable_mtu }}
+ use_dhcp: false
+ dns_servers: {{ ctlplane_dns_nameservers }}
+ domain: {{ dns_search_domains }}
+ addresses:
+ - ip_netmask: {{ ctlplane_ip }}/{{ ctlplane_cidr }}
+ routes: {{ ctlplane_host_routes }}
+ members:
+ - type: interface
+ name: nic2
+ mtu: {{ min_viable_mtu }}
+ # force the MAC address of the bridge to this interface
+ primary: true
+ {% for network in nodeset_networks %}
+ - type: vlan
+ mtu: {{ lookup('vars', networks_lower[network] ~ '_mtu') }}
+ vlan_id: {{ lookup('vars', networks_lower[network] ~ '_vlan_id') }}
+ addresses:
+ - ip_netmask:
+ {{ lookup('vars', networks_lower[network] ~ '_ip') }}/{{ lookup('vars', networks_lower[network] ~ '_cidr') }}
+ routes: {{ lookup('vars', networks_lower[network] ~ '_host_routes') }}
+ {% endfor %}
+ edpm_nodes_validation_validate_controllers_icmp: false
+ edpm_nodes_validation_validate_gateway_icmp: false
+ edpm_sshd_allowed_ranges:
+ - 192.168.122.0/24
+ - 192.168.133.0/24
+ - 192.168.144.0/24
+ edpm_sshd_configure_firewall: true
+ gather_facts: false
+ neutron_physical_bridge_name: br-ctl
+ neutron_public_interface_name: eth0
+ edpm_ceph_hci_pre_enabled_services:
+ - ceph_mon
+ - ceph_mgr
+ - ceph_osd
+ - ceph_rgw
+ - ceph_nfs
+ - ceph_rgw_frontend
+ - ceph_nfs_frontend
+ storage_mtu: 9000
+ storage_mgmt_mtu: 9000
+ storage_mgmt_vlan_id: 23
+ storage_mgmt_cidr: "24"
+ storage_mgmt_host_routes: []
+ networks:
+ - defaultRoute: true
+ name: ctlplane
+ subnetName: subnet1
+ - name: internalapi
+ subnetName: subnet1
+ - name: storage
+ subnetName: subnet1
+ - name: tenant
+ subnetName: subnet1
+ nodes:
+ edpm-compute-0:
+ ansible:
+ ansibleHost: 192.168.122.100
+ hostName: edpm-compute-0
+ networks:
+ - defaultRoute: true
+ fixedIP: 192.168.122.100
+ name: ctlplane
+ subnetName: subnet1
+ - name: internalapi
+ subnetName: subnet1
+ - name: storage
+ subnetName: subnet1
+ - name: storagemgmt
+ subnetName: subnet1
+ - name: tenant
+ subnetName: subnet1
+ edpm-compute-1:
+ ansible:
+ ansibleHost: 192.168.122.101
+ hostName: edpm-compute-1
+ networks:
+ - defaultRoute: true
+ fixedIP: 192.168.122.101
+ name: ctlplane
+ subnetName: subnet1
+ - name: internalapi
+ subnetName: subnet1
+ - name: storage
+ subnetName: subnet1
+ - name: storagemgmt
+ subnetName: subnet1
+ - name: tenant
+ subnetName: subnet1
+ edpm-compute-2:
+ ansible:
+ ansibleHost: 192.168.122.102
+ hostName: edpm-compute-2
+ networks:
+ - defaultRoute: true
+ fixedIP: 192.168.122.102
+ name: ctlplane
+ subnetName: subnet1
+ - name: internalapi
+ subnetName: subnet1
+ - name: storage
+ subnetName: subnet1
+ - name: storagemgmt
+ subnetName: subnet1
+ - name: tenant
+ subnetName: subnet1
+ services:
+ - bootstrap
+ - configure-network
+ - validate-network
+ - install-os
+ - ceph-hci-pre
+ - configure-os
+ - ssh-known-hosts
+ - run-os
+ - reboot-os
+ - install-certs
+ - ceph-client
+ - ovn
+ - neutron-metadata
+ - libvirt
+ nova:
+ migration:
+ ssh_keys:
+ private: CHANGEME
+ public: CHANGEME
diff --git a/examples/dt/dcn/image.png b/examples/dt/dcn/image.png
new file mode 100644
index 000000000..f06cda3dd
Binary files /dev/null and b/examples/dt/dcn/image.png differ
diff --git a/examples/dt/dcn/kustomization.yaml b/examples/dt/dcn/kustomization.yaml
new file mode 100644
index 000000000..df1d8982e
--- /dev/null
+++ b/examples/dt/dcn/kustomization.yaml
@@ -0,0 +1,13 @@
+# This is the kustomization for the FINAL step, edpm-post-ceph
+---
+apiVersion: kustomize.config.k8s.io/v1beta1
+kind: Kustomization
+
+components:
+ - ../../../dt/dcn/edpm-post-ceph/nodeset
+
+resources:
+ - control-plane/nncp/values.yaml
+ - edpm-pre-ceph/nodeset/values.yaml
+ - service-values.yaml
+ - values.yaml
diff --git a/examples/dt/dcn/service-values.yaml b/examples/dt/dcn/service-values.yaml
new file mode 100644
index 000000000..35298e02b
--- /dev/null
+++ b/examples/dt/dcn/service-values.yaml
@@ -0,0 +1,237 @@
+# local-config: referenced, but not emitted by kustomize
+---
+apiVersion: v1
+kind: ConfigMap
+metadata:
+ name: service-values
+ annotations:
+ config.kubernetes.io/local-config: "true"
+data:
+ preserveJobs: false
+ cinderAPI:
+ replicas: 3
+ customServiceConfig: |
+ [DEFAULT]
+ default_availability_zone = az0
+ cinderBackup:
+ replicas: 3
+ customServiceConfig: |
+ [DEFAULT]
+ backup_driver = cinder.backup.drivers.ceph.CephBackupDriver
+ backup_ceph_pool = backups
+ backup_ceph_user = openstack
+ cinderVolumes:
+ az0:
+ customServiceConfig: |
+ [DEFAULT]
+ enabled_backends = ceph
+ [ceph]
+ volume_backend_name = ceph
+ volume_driver = cinder.volume.drivers.rbd.RBDDriver
+ rbd_ceph_conf = /etc/ceph/az0.conf
+ rbd_user = openstack
+ rbd_pool = volumes
+ rbd_flatten_volume_from_snapshot = False
+ rbd_secret_uuid = CHANGEME
+ rbd_cluster_name = az0
+ backend_availability_zone = az0
+ az1:
+ customServiceConfig: |
+ [DEFAULT]
+ enabled_backends = ceph
+ glance_api_servers = https://glance-az1-internal.openstack.svc:9292
+ [ceph]
+ volume_backend_name = ceph
+ volume_driver = cinder.volume.drivers.rbd.RBDDriver
+ rbd_ceph_conf = /etc/ceph/az1.conf
+ rbd_user = openstack
+ rbd_pool = volumes
+ rbd_flatten_volume_from_snapshot = False
+ rbd_secret_uuid = CHANGEME
+ rbd_cluster_name = az1
+ backend_availability_zone = az1
+ az2:
+ customServiceConfig: |
+ [DEFAULT]
+ enabled_backends = ceph
+ glance_api_servers = https://glance-az2-internal.openstack.svc:9292
+ [ceph]
+ volume_backend_name = ceph
+ volume_driver = cinder.volume.drivers.rbd.RBDDriver
+ rbd_ceph_conf = /etc/ceph/az2.conf
+ rbd_user = openstack
+ rbd_pool = volumes
+ rbd_flatten_volume_from_snapshot = False
+ rbd_secret_uuid = CHANGEME
+ rbd_cluster_name = az2
+ backend_availability_zone = az2
+ glance:
+ customServiceConfig: |
+ [DEFAULT]
+ enabled_backends = default_backend:rbd
+ [glance_store]
+ default_backend = default_backend
+ [default_backend]
+ rbd_store_ceph_conf = /etc/ceph/az0.conf
+ store_description = "RBD backend"
+ rbd_store_pool = images
+ rbd_store_user = openstack
+ rbd_thin_provisioning = True
+ glanceAPIs:
+ default:
+ customServiceConfig: |
+ [DEFAULT]
+ enabled_import_methods = [web-download,copy-image,glance-direct]
+ enabled_backends = az0:rbd,az1:rbd,az2:rbd
+ [glance_store]
+ default_backend = az0
+ [az0]
+ rbd_store_ceph_conf = /etc/ceph/az0.conf
+ store_description = "az0 RBD backend"
+ rbd_store_pool = images
+ rbd_store_user = openstack
+ rbd_thin_provisioning = True
+ [az1]
+ rbd_store_ceph_conf = /etc/ceph/az1.conf
+ store_description = "az1 RBD backend"
+ rbd_store_pool = images
+ rbd_store_user = openstack
+ rbd_thin_provisioning = True
+ [az2]
+ rbd_store_ceph_conf = /etc/ceph/az2.conf
+ store_description = "az2 RBD backend"
+ rbd_store_pool = images
+ rbd_store_user = openstack
+ rbd_thin_provisioning = True
+ networkAttachments:
+ - storage
+ override:
+ service:
+ internal:
+ metadata:
+ annotations:
+ metallb.universe.tf/address-pool: internalapi
+ metallb.universe.tf/allow-shared-ip: internalapi
+ metallb.universe.tf/loadBalancerIPs: 172.17.0.80
+ spec:
+ type: LoadBalancer
+ replicas: 3
+ type: split
+ az1:
+ customServiceConfig: |
+ [DEFAULT]
+ enabled_import_methods = [web-download,copy-image,glance-direct]
+ enabled_backends = az0:rbd,az1:rbd,az2:rbd
+ [glance_store]
+ default_backend = az1
+ [az1]
+ rbd_store_ceph_conf = /etc/ceph/az1.conf
+ store_description = "az1 RBD backend"
+ rbd_store_pool = images
+ rbd_store_user = openstack
+ rbd_thin_provisioning = True
+ [az0]
+ rbd_store_ceph_conf = /etc/ceph/az0.conf
+ store_description = "az0 RBD backend"
+ rbd_store_pool = images
+ rbd_store_user = openstack
+ rbd_thin_provisioning = True
+ networkAttachments:
+ - storage
+ override:
+ service:
+ internal:
+ metadata:
+ annotations:
+ metallb.universe.tf/address-pool: internalapi
+ metallb.universe.tf/allow-shared-ip: internalapi
+ metallb.universe.tf/loadBalancerIPs: 172.17.0.81
+ spec:
+ type: LoadBalancer
+ replicas: 3
+ type: edge
+ az2:
+ customServiceConfig: |
+ [DEFAULT]
+ enabled_import_methods = [web-download,copy-image,glance-direct]
+ enabled_backends = az0:rbd,az1:rbd,az2:rbd
+ [glance_store]
+ default_backend = az2
+ [az2]
+ rbd_store_ceph_conf = /etc/ceph/az2.conf
+ store_description = "az2 RBD backend"
+ rbd_store_pool = images
+ rbd_store_user = openstack
+ rbd_thin_provisioning = True
+ [az0]
+ rbd_store_ceph_conf = /etc/ceph/az0.conf
+ store_description = "az0 RBD backend"
+ rbd_store_pool = images
+ rbd_store_user = openstack
+ rbd_thin_provisioning = True
+ networkAttachments:
+ - storage
+ override:
+ service:
+ internal:
+ metadata:
+ annotations:
+ metallb.universe.tf/address-pool: internalapi
+ metallb.universe.tf/allow-shared-ip: internalapi
+ metallb.universe.tf/loadBalancerIPs: 172.17.0.82
+ spec:
+ type: LoadBalancer
+ replicas: 3
+ type: edge
+ manila:
+ enabled: false
+ manilaAPI:
+ customServiceConfig: |
+ [DEFAULT]
+ enabled_share_protocols=nfs,cephfs
+ manilaShares:
+ share1:
+ customServiceConfig: |
+ [DEFAULT]
+ enabled_share_backends = cephfs
+ enabled_share_protocols = cephfs
+ [cephfs]
+ driver_handles_share_servers = False
+ share_backend_name = cephfs
+ share_driver = manila.share.drivers.cephfs.driver.CephFSDriver
+ cephfs_conf_path = /etc/ceph/ceph.conf
+ cephfs_cluster_name = ceph
+ cephfs_auth_id=openstack
+ cephfs_volume_mode = 0755
+ cephfs_protocol_helper_type = CEPHFS
+ neutron:
+ template:
+ customServiceConfig: |
+ [ml2_type_vlan]
+ network_vlan_ranges = datacentre:1:1000,leaf1:1:1000,leaf2:1:1000
+ [neutron]
+ physnets = datacentre,leaf1,leaf2
+ nova:
+ customServiceConfig: |
+ [DEFAULT]
+ default_schedule_zone=az0
+ extraMounts:
+ - name: v1
+ region: r1
+ extraVol:
+ - propagation:
+ - CinderVolume
+ - CinderBackup
+ - GlanceAPI
+ - ManilaShare
+ extraVolType: Ceph
+ volumes:
+ - name: ceph
+ projected:
+ sources:
+ - secret:
+ name: ceph-conf-files
+ mounts:
+ - name: ceph
+ mountPath: /etc/ceph
+ readOnly: true
diff --git a/examples/dt/dcn/values.yaml b/examples/dt/dcn/values.yaml
new file mode 100644
index 000000000..271aa6c33
--- /dev/null
+++ b/examples/dt/dcn/values.yaml
@@ -0,0 +1,46 @@
+---
+apiVersion: v1
+data:
+ customDataplanService:
+ name: nova-custom-ceph
+ nodeset_name: computes-edpm
+ ceph_conf:
+ az0.client.openstack.keyring: CHANGEME_CEPH_CONF
+ az0.conf: CHANGEME_CEPH_KEYRING
+ az1.client.openstack.keyring: CHANGEME_CEPH_KEYRING
+ az1.conf: CHANGEME_CEPH_CONF
+ az2.client.openstack.keyring: CHANGEME_CEPH_KEYRING
+ az2.conf: CHANGEME_CEPH_CONF
+ nodeset:
+ services:
+ - bootstrap
+ - configure-network
+ - validate-network
+ - install-os
+ - ceph-hci-pre
+ - configure-os
+ - ssh-known-hosts
+ - run-os
+ - reboot-os
+ - install-certs
+ - ceph-client
+ - ovn
+ - neutron-metadata
+ - libvirt
+ - nova-custom-ceph
+ nova:
+ ceph:
+ conf: CHANGEME_NOVA_CEPH_CONF
+ name: ceph-nova
+ dataSources:
+ - configMapRef:
+ name: ceph-nova
+ - secretRef:
+ name: nova-cell1-compute-config
+ - secretRef:
+ name: nova-migration-ssh-key
+kind: ConfigMap
+metadata:
+ annotations:
+ config.kubernetes.io/local-config: 'true'
+ name: edpm-nodeset-values-post-ceph
diff --git a/zuul.d/projects.yaml b/zuul.d/projects.yaml
index 1a13477c6..ab6cb930c 100644
--- a/zuul.d/projects.yaml
+++ b/zuul.d/projects.yaml
@@ -4,6 +4,7 @@
- noop
- rhoso-architecture-validate-bgp
- rhoso-architecture-validate-bgp_dt01
+ - rhoso-architecture-validate-dcn
- rhoso-architecture-validate-hci
- rhoso-architecture-validate-nfv-ovs-dpdk-sriov-hci
- rhoso-architecture-validate-osasinfra
diff --git a/zuul.d/validations.yaml b/zuul.d/validations.yaml
index 0d0073cb0..f9e72470d 100644
--- a/zuul.d/validations.yaml
+++ b/zuul.d/validations.yaml
@@ -25,6 +25,18 @@
parent: rhoso-architecture-base-job
vars:
cifmw_architecture_scenario: bgp_dt01
+- job:
+ files:
+ - automation/net-env/dcn.yaml
+ - dt/dcn
+ - examples/dt/dcn/control-plane
+ - examples/dt/dcn/control-plane/nncp
+ - lib
+ name: rhoso-architecture-validate-dcn
+ parent: rhoso-architecture-base-job
+ vars:
+ cifmw_architecture_scenario: dcn
+ cifmw_networking_env_def_file: automation/net-env/dcn.yaml
- job:
files:
- examples/va/hci