From 85de8a003b05d14100a3eff28eaefdd77fbf218c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Harald=20Jens=C3=A5s?= Date: Mon, 8 Apr 2024 17:20:26 +0200 Subject: [PATCH] Add IPv6 controlplane with Ironic DT --- .../dt/ipv6_ironic/.control-plane.yaml.swp | Bin 0 -> 16384 bytes examples/dt/ipv6_ironic/.gitignore | 3 + examples/dt/ipv6_ironic/README.md | 16 + examples/dt/ipv6_ironic/control-plane.md | 62 ++++ .../dt/ipv6_ironic/control-plane/.gitignore | 1 + .../control-plane/kustomization.yaml | 157 +++++++++ .../networking/kustomization.yaml | 13 + .../networking/metallb/ip_pools.yaml | 10 + .../networking/metallb/kustomization.yaml | 35 ++ .../networking/metallb/l2advertisement.yaml | 14 + .../networking/nad/kustomization.yaml | 18 + .../control-plane/networking/nad/nad.yaml | 11 + .../control-plane/networking/nncp/.gitignore | 1 + .../networking/nncp/kustomization.yaml | 311 ++++++++++++++++++ .../networking/nncp/ocp_node_template.yaml | 118 +++++++ .../networking/nncp/ocp_nodes_nncp.yaml | 7 + .../control-plane/networking/nncp/values.yaml | 209 ++++++++++++ .../control-plane/service-values.yaml | 42 +++ 18 files changed, 1028 insertions(+) create mode 100644 examples/dt/ipv6_ironic/.control-plane.yaml.swp create mode 100644 examples/dt/ipv6_ironic/.gitignore create mode 100644 examples/dt/ipv6_ironic/README.md create mode 100644 examples/dt/ipv6_ironic/control-plane.md create mode 100644 examples/dt/ipv6_ironic/control-plane/.gitignore create mode 100644 examples/dt/ipv6_ironic/control-plane/kustomization.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/kustomization.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/metallb/ip_pools.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/metallb/kustomization.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/metallb/l2advertisement.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/nad/kustomization.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/nad/nad.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/nncp/.gitignore create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/nncp/kustomization.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/nncp/ocp_node_template.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/nncp/ocp_nodes_nncp.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/networking/nncp/values.yaml create mode 100644 examples/dt/ipv6_ironic/control-plane/service-values.yaml diff --git a/examples/dt/ipv6_ironic/.control-plane.yaml.swp b/examples/dt/ipv6_ironic/.control-plane.yaml.swp new file mode 100644 index 0000000000000000000000000000000000000000..264863e61ff5c885834afd171ebbe6375a36f754 GIT binary patch literal 16384 zcmeI2S%@4(7{@D7qs9{@K1jea9uagdqY^s?o$M}gOlEeSO*U>&#+vS$ncnH??sWG| zvK!CngQzI_porjwBKQzcQHb~`c%b5gpeQ0LDxwI2PvZ5jK4yDnx_1KNgQg08+dEy= zUw!?rud2JNs-B-KmFd;l0zo>HkV|hpr*X0R6|o*UnY0$T=`vU3te6^HvmCZ!5kK>e z&|uDW)Lc{dTHSh9wK_S=Mm-)=+nM%eH-lde^DM{BF-L9b9#_4t!*l!q>(~Z&bDEda z?cP;2-LXtv&8e2@IhK*J4QBG}BI_9A9g!uZ0>`8Rr;$yU7xLoPFW7KCJ^QTP$D|7K zrlkT>0jYpgKq?>=kP1izqyopP0-k+5xf3_PIuzhgcw9Af{3}fNgy*AURPN6(zZ>SS z2{WSn=kP1izqyqnf0!$<1B-p(~ zOaNg0Kl=XvYyfM(?`sM99()Ae18;)E;4$EU zd9Vc(00n1))!>(t3HcJd4_*gPfxAHw{0SkBfEU0aV1g>R4qOJ-fmPs#6A5`690o6f zC&2xn2O3}+Tnn<`T(Anfvxbld!49wmtOsiW0Y9GrpTLLU4e&HL1lnK^xCWdD)`8=| zug4SeHTW330-ga6gMHu@Py$zg^F84%`Rs0v4!&9bgL( zF|iSdM3K13>IT;o+F*vu{Zo`WR@dVSJ$SqSTQwWSnbLHRJC3e#C9w>%^>~36XI@m$ z#l8>Lgy+H%6v^SXp{oof^0BibM|GOlY9Fur(N{0^{3V0rWbQY;|YV^p_+9BRxg+41eQSC~n|uN-rDeAc+^I^o!9RF%4C_M}jyF2ZP_eRu`%ou>QZr&pDZ$;(;en5b zrMTST+5QNgwVYa2kUh4d9efcl2qqs}u;lMqPQ9@p8?Q8Y3q`yi zZMmbYc5Jch@g|;Hr^q}i3&pP2nle>q(SMRb8iiJt<~PkRRgArp#X_Z1(dYL}EzK_& z?Y*73_WVL?q0*VZqP#Gt?_DU0M%nJa?WKAWWRLY_lDm4-#4BK`p?-<+w(3>OO4nxW z^%MSMH`S3Kd%TsAfpQ?Gg>*%&qo;Ko&3~zn4`;ms5#Rss<9k}e_qX`|r{ZG|>1TZ7 ze*!vS6IchtH~)9w3-BIz4LlAW0tZ10+yrg_o5984Z14xZ{l5k8fcwA{AmAs|`7U@3 zJP#fO2Y~QJ1u{tmqyka_sen{KDj*e*3P=T{0{=Y)XqZN)7+o>JF&ixUL=#GwebUWl zwZD=R&7S&YtH_EK94Qo4brg#|(R|VJCBc7UHs&8M^duSiA5J6sZ8GCn2Nr`yiOcotvuGij$M2U8U(tap3YcmjAfnU+SoIV~%@j&SCYs?sfL% Y;8RT)b<~YmSQ}RpH+!S5N46C5H)I;r3jhEB literal 0 HcmV?d00001 diff --git a/examples/dt/ipv6_ironic/.gitignore b/examples/dt/ipv6_ironic/.gitignore new file mode 100644 index 000000000..2f2fa945f --- /dev/null +++ b/examples/dt/ipv6_ironic/.gitignore @@ -0,0 +1,3 @@ +nncp.yaml +networking.yaml +control-plane.yaml diff --git a/examples/dt/ipv6_ironic/README.md b/examples/dt/ipv6_ironic/README.md new file mode 100644 index 000000000..91e40cbdf --- /dev/null +++ b/examples/dt/ipv6_ironic/README.md @@ -0,0 +1,16 @@ +# OpenStack IPv6 Controlplane with Ironic + +This is a collection of CR templates that represent a validated Red Hat OpenStack Services on OpenShift deployment that has the following characteristics: + +- 1 master/worker combo-node OpenShift cluster +- 1-replica Galera database +- RabbitMQ +- OVN networking +- Network isolation over two NICs + +## Stages + +All stages must be executed in the order listed below. Everything is required unless + +1. [Install the OpenStack K8S operators and their dependencies](../../common/) +2. [Configuring networking and deploy the OpenStack control plane](control-plane.md) diff --git a/examples/dt/ipv6_ironic/control-plane.md b/examples/dt/ipv6_ironic/control-plane.md new file mode 100644 index 000000000..2b3ed1163 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane.md @@ -0,0 +1,62 @@ +# Configuring networking and deploy the OpenStack control plane + +## Assumptions + +- Operators are already deployed +- A storage class called `local-storage` should already exist. + +## Initialize + +Switch to the "openstack" namespace +``` +oc project openstack +``` +Change to the ipv6_ironic directory +``` +cd architecture/examples/dt/ipv6_ironic +``` +Edit the [control-plane/networking/nncp/values.yaml](control-plane/neworking/nncp/values.yaml) file to suit your environment. +``` +vi control-plane/networking/nncp/values.yaml +``` + +## Apply node network configuration + +Generate the node network configuration +``` +kustomize build control-plane/networking/nncp > nncp.yaml +``` +Apply the NNCP CRs +``` +oc apply -f nncp.yaml +``` +Wait for NNCPs to be available +``` +oc wait nncp -l osp/nncm-config-type=standard --for jsonpath='{.status.conditions[0].reason}'=SuccessfullyConfigured --timeout=300s +``` + +## Apply networking and configuration + +Generate the networking CRs. +``` +kustomize build control-plane/networking > networking.yaml +``` +Apply the CRs +``` +oc apply -f networking.yaml +``` + +## Apply the control-plane configurastion + +Generate the control-plane CRs. +``` +kustomize build control-plane > control-plane.yaml +``` +Apply the CRs +``` +oc apply -f control-plane.yaml +``` +Wait for control plane to be available +``` +oc wait osctlplane controlplane --for condition=Ready --timeout=600s +``` diff --git a/examples/dt/ipv6_ironic/control-plane/.gitignore b/examples/dt/ipv6_ironic/control-plane/.gitignore new file mode 100644 index 000000000..3df8f53be --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/.gitignore @@ -0,0 +1 @@ +control-plane.yaml diff --git a/examples/dt/ipv6_ironic/control-plane/kustomization.yaml b/examples/dt/ipv6_ironic/control-plane/kustomization.yaml new file mode 100644 index 000000000..1d0d593a6 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/kustomization.yaml @@ -0,0 +1,157 @@ +--- +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/control-plane + +resources: + - networking/nncp/values.yaml + - service-values.yaml + +replacements: + # TODO: re-enabled horizon when OSPRH-6238 is fixed + - source: + kind: ConfigMap + name: service-values + fieldPath: data.horizon.enabled + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.horizon.enabled + options: + create: true + - source: + kind: ConfigMap + name: network-values + fieldPath: data.internalapi.endpoint_annotations + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.ironic.template.ironicAPI.override.service.internal.metadata.annotations + options: + create: true + - source: + kind: ConfigMap + name: network-values + fieldPath: data.lbServiceType + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.ironic.template.ironicAPI.override.service.internal.spec.type + options: + create: true + - source: + kind: ConfigMap + name: network-values + fieldPath: data.bmaas.bridgeName + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.ironic.template.ironicConductors.0.networkAttachments.0 + - spec.ironic.template.ironicConductors.0.provisionNetwork + - spec.ironic.template.ironicInspector.inspectionNetwork + - spec.ironic.template.ironicInspector.networkAttachments.0 + - spec.ovn.template.ovnController.nicMappings.bmaas + options: + create: true + - source: + kind: ConfigMap + name: service-values + fieldPath: data.ironic.enabled + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.ironic.enabled + options: + create: true + - source: + kind: ConfigMap + name: service-values + fieldPath: data.ironic.ironicConductors.0.customServiceConfig + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.ironic.template.ironicConductors.0.customServiceConfig + options: + create: true + - source: + kind: ConfigMap + name: service-values + fieldPath: data.nova.cellTemplates + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.nova.template.cellTemplates + options: + create: true + - source: + kind: ConfigMap + name: service-values + fieldPath: data.galera.replicas + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.galera.templates.openstack.replicas + - spec.galera.templates.openstack-cell1.replicas + options: + create: true + - source: + kind: ConfigMap + name: service-values + fieldPath: data.rabbitmq.replicas + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.rabbitmq.templates.rabbitmq.replicas + - spec.rabbitmq.templates.rabbitmq-cell1.replicas + options: + create: true + - source: + kind: ConfigMap + name: service-values + fieldPath: data.rabbitmq.erlangInetConfig + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.rabbitmq.templates.rabbitmq.rabbitmq.erlangInetConfig + - spec.rabbitmq.templates.rabbitmq-cell1.rabbitmq.erlangInetConfig + options: + create: true + - source: + kind: ConfigMap + name: service-values + fieldPath: data.rabbitmq.envConfig + targets: + - select: + kind: OpenStackControlPlane + fieldPaths: + - spec.rabbitmq.templates.rabbitmq.rabbitmq.envConfig + - spec.rabbitmq.templates.rabbitmq-cell1.rabbitmq.envConfig + options: + create: true diff --git a/examples/dt/ipv6_ironic/control-plane/networking/kustomization.yaml b/examples/dt/ipv6_ironic/control-plane/networking/kustomization.yaml new file mode 100644 index 000000000..9935f0240 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/kustomization.yaml @@ -0,0 +1,13 @@ +--- +apiVersion: kustomize.config.k8s.io/v1beta1 +kind: Kustomization + +components: + - ../../../../../lib/metallb + - ../../../../../lib/networking/metallb + - ../../../../../lib/networking/nad + - metallb + - nad + +resources: + - nncp/values.yaml diff --git a/examples/dt/ipv6_ironic/control-plane/networking/metallb/ip_pools.yaml b/examples/dt/ipv6_ironic/control-plane/networking/metallb/ip_pools.yaml new file mode 100644 index 000000000..b24d9ed39 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/metallb/ip_pools.yaml @@ -0,0 +1,10 @@ +--- +apiVersion: metallb.io/v1beta1 +kind: IPAddressPool +metadata: + namespace: metallb-system + name: bmaas + labels: + osp/lb-addresses-type: standard +spec: + addresses: [] diff --git a/examples/dt/ipv6_ironic/control-plane/networking/metallb/kustomization.yaml b/examples/dt/ipv6_ironic/control-plane/networking/metallb/kustomization.yaml new file mode 100644 index 000000000..ab51e3e67 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/metallb/kustomization.yaml @@ -0,0 +1,35 @@ +--- +apiVersion: kustomize.config.k8s.io/v1alpha1 +kind: Component + +resources: + - l2advertisement.yaml + - ip_pools.yaml + +replacements: + + # IPAddressPool addresses + - source: + kind: ConfigMap + name: network-values + fieldPath: data.bmaas.lb_addresses + targets: + - select: + group: metallb.io + kind: IPAddressPool + name: bmaas + fieldPaths: + - spec.addresses + + # Loadbalancer interfaces + - source: + kind: ConfigMap + name: network-values + fieldPath: data.bmaas.iface + targets: + - select: + group: metallb.io + kind: L2Advertisement + name: bmaas + fieldPaths: + - spec.interfaces.0 diff --git a/examples/dt/ipv6_ironic/control-plane/networking/metallb/l2advertisement.yaml b/examples/dt/ipv6_ironic/control-plane/networking/metallb/l2advertisement.yaml new file mode 100644 index 000000000..737d916e3 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/metallb/l2advertisement.yaml @@ -0,0 +1,14 @@ +# +# Additional advertisements can be added here if needed for other networks +# +--- +apiVersion: metallb.io/v1beta1 +kind: L2Advertisement +metadata: + name: bmaas + namespace: metallb-system +spec: + ipAddressPools: + - bmaas + interfaces: + - _replaced_ diff --git a/examples/dt/ipv6_ironic/control-plane/networking/nad/kustomization.yaml b/examples/dt/ipv6_ironic/control-plane/networking/nad/kustomization.yaml new file mode 100644 index 000000000..e3d28d666 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/nad/kustomization.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: kustomize.config.k8s.io/v1alpha1 +kind: Component + +resources: + - nad.yaml + +replacements: + - source: + kind: ConfigMap + name: network-values + fieldPath: data.bmaas.net-attach-def + targets: + - select: + kind: NetworkAttachmentDefinition + name: bmaas + fieldPaths: + - spec.config diff --git a/examples/dt/ipv6_ironic/control-plane/networking/nad/nad.yaml b/examples/dt/ipv6_ironic/control-plane/networking/nad/nad.yaml new file mode 100644 index 000000000..9626c7e85 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/nad/nad.yaml @@ -0,0 +1,11 @@ +--- +apiVersion: k8s.cni.cncf.io/v1 +kind: NetworkAttachmentDefinition +metadata: + name: bmaas + labels: + osp/net: bmaas + osp/net-attach-def-type: standard +spec: + config: | + _replaced_ diff --git a/examples/dt/ipv6_ironic/control-plane/networking/nncp/.gitignore b/examples/dt/ipv6_ironic/control-plane/networking/nncp/.gitignore new file mode 100644 index 000000000..51ed8a956 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/nncp/.gitignore @@ -0,0 +1 @@ +nncp.yaml diff --git a/examples/dt/ipv6_ironic/control-plane/networking/nncp/kustomization.yaml b/examples/dt/ipv6_ironic/control-plane/networking/nncp/kustomization.yaml new file mode 100644 index 000000000..47991d9cf --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/nncp/kustomization.yaml @@ -0,0 +1,311 @@ +--- +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 + +resources: + - ocp_nodes_nncp.yaml + - values.yaml + +patches: + - target: + kind: NodeNetworkConfigurationPolicy + labelSelector: "osp/nncm-config-type=standard" + path: ocp_node_template.yaml + +replacements: + # Common network interfaces and vlans + - source: + kind: ConfigMap + name: network-values + fieldPath: data.internalapi.base_iface + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.[name=internalapi].vlan.base-iface + - source: + kind: ConfigMap + name: network-values + fieldPath: data.internalapi.vlan + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.[name=internalapi].vlan.id + - source: + kind: ConfigMap + name: network-values + fieldPath: data.internalapi.mtu + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.[name=internalapi].mtu + - source: + kind: ConfigMap + name: network-values + fieldPath: data.tenant.base_iface + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.[name=tenant].vlan.base-iface + - source: + kind: ConfigMap + name: network-values + fieldPath: data.tenant.vlan + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.[name=tenant].vlan.id + - source: + kind: ConfigMap + name: network-values + fieldPath: data.tenant.mtu + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.[name=tenant].mtu + - source: + kind: ConfigMap + name: network-values + fieldPath: data.storage.base_iface + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.[name=storage].vlan.base-iface + - source: + kind: ConfigMap + name: network-values + fieldPath: data.storage.vlan + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.[name=storage].vlan.id + - source: + kind: ConfigMap + name: network-values + fieldPath: data.storage.mtu + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.[name=storage].mtu + # ctlplane type is ethernet (not vlan) + - source: + kind: ConfigMap + name: network-values + fieldPath: data.ctlplane.iface + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.0.name + - spec.desiredState.interfaces.1.bridge.port.0.name + - source: + kind: ConfigMap + name: network-values + fieldPath: data.ctlplane.mtu + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.0.mtu + - spec.desiredState.interfaces.1.mtu + # bmaas is ethernet + - source: + kind: ConfigMap + name: network-values + fieldPath: data.bmaas.iface + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.2.name + - spec.desiredState.interfaces.[name=bmaas].bridge.port.0.name + - source: + kind: ConfigMap + name: network-values + fieldPath: data.bmaas.mtu + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.interfaces.2.mtu + - spec.desiredState.interfaces.[name=bmaas].mtu + + # Static Node IPs: node-0 + - source: + kind: ConfigMap + name: network-values + fieldPath: data.node_0.internalapi_ip + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=internalapi].ipv6.address.0.ip + - source: + kind: ConfigMap + name: network-values + fieldPath: data.node_0.tenant_ip + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=tenant].ipv6.address.0.ip + - source: + kind: ConfigMap + name: network-values + fieldPath: data.node_0.ctlplane_ip + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=ospbr].ipv6.address.0.ip + - source: + kind: ConfigMap + name: network-values + fieldPath: data.node_0.bmaas_ip + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=bmaas].ipv6.address.0.ip + - source: + kind: ConfigMap + name: network-values + fieldPath: data.node_0.storage_ip + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=storage].ipv6.address.0.ip + + # prefix-length: node-0 + - source: + kind: ConfigMap + name: network-values + fieldPath: data.ctlplane.prefix-length + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=ospbr].ipv6.address.0.prefix-length + - source: + kind: ConfigMap + name: network-values + fieldPath: data.bmaas.prefix-length + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=bmaas].ipv6.address.0.prefix-length + - source: + kind: ConfigMap + name: network-values + fieldPath: data.internalapi.prefix-length + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=internalapi].ipv6.address.0.prefix-length + - source: + kind: ConfigMap + name: network-values + fieldPath: data.tenant.prefix-length + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=tenant].ipv6.address.0.prefix-length + - source: + kind: ConfigMap + name: network-values + fieldPath: data.storage.prefix-length + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - spec.desiredState.interfaces.[name=storage].ipv6.address.0.prefix-length + + # Node names + - source: + kind: ConfigMap + name: network-values + fieldPath: data.node_0.name + targets: + - select: + kind: NodeNetworkConfigurationPolicy + name: node-0 + fieldPaths: + - metadata.name + - spec.nodeSelector.[kubernetes.io/hostname] + + # DNS + - source: + kind: ConfigMap + name: network-values + fieldPath: data.dns-resolver.config + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.dns-resolver.config + + # Routes + - source: + kind: ConfigMap + name: network-values + fieldPath: data.routes.config.0.destination + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.routes.config.0.destination + - source: + kind: ConfigMap + name: network-values + fieldPath: data.routes.config.0.next-hop-address + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.routes.config.0.next-hop-address + - source: + kind: ConfigMap + name: network-values + fieldPath: data.bridgeName + targets: + - select: + kind: NodeNetworkConfigurationPolicy + fieldPaths: + - spec.desiredState.routes.config.0.next-hop-interface diff --git a/examples/dt/ipv6_ironic/control-plane/networking/nncp/ocp_node_template.yaml b/examples/dt/ipv6_ironic/control-plane/networking/nncp/ocp_node_template.yaml new file mode 100644 index 000000000..3f477df00 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/nncp/ocp_node_template.yaml @@ -0,0 +1,118 @@ +--- +apiVersion: nmstate.io/v1 +kind: NodeNetworkConfigurationPolicy +metadata: + name: _ignored_ +spec: + desiredState: + dns-resolver: + config: + search: [] + server: [] + routes: + config: + - destination: _replaced_ + next-hop-address: _replaced_ + next-hop-interface: _replaced_ + interfaces: + - description: ctlplane interface + name: _replaced_ + state: up + type: ethernet + mtu: 1500 + - description: linux-bridge over ctlplane interface + ipv4: + enabled: false + ipv6: + address: + - ip: _replaced_ + prefix-length: _replaced_ + enabled: true + dhcp: false + name: ospbr + state: up + type: linux-bridge + bridge: + options: + stp: + enabled: false + port: + - name: _replaced_ + vlan: {} + mtu: 1500 + - description: bmaas interface + name: _replaced_ + state: up + type: ethernet + mtu: 1500 + - description: linux-bridge over bmaas interface + ipv4: + enabled: false + ipv6: + address: + - ip: _replaced_ + prefix-length: _replaced_ + enabled: true + dhcp: false + name: bmaas + state: up + type: linux-bridge + bridge: + options: + stp: + enabled: false + port: + - name: _replaced_ + vlan: {} + mtu: 1500 + - description: internalapi vlan interface + ipv4: + enabled: false + ipv6: + address: + - ip: _replaced_ + prefix-length: _replaced_ + enabled: true + dhcp: false + name: internalapi + state: up + type: vlan + vlan: + base-iface: _replaced_ + id: _replaced_ + mtu: 1500 + - description: storage vlan interface + ipv4: + enabled: false + ipv6: + address: + - ip: _replaced_ + prefix-length: _replaced_ + enabled: true + dhcp: false + name: storage + state: up + type: vlan + vlan: + base-iface: _replaced_ + id: _replaced_ + mtu: 1500 + - description: tenant vlan interface + ipv4: + enabled: false + ipv6: + address: + - ip: _replaced_ + prefix-length: _replaced_ + enabled: true + dhcp: false + name: tenant + state: up + type: vlan + vlan: + base-iface: _replaced_ + id: _replaced_ + mtu: 1500 + nodeSelector: + kubernetes.io/hostname: _replaced_ + node-role.kubernetes.io/worker: "" diff --git a/examples/dt/ipv6_ironic/control-plane/networking/nncp/ocp_nodes_nncp.yaml b/examples/dt/ipv6_ironic/control-plane/networking/nncp/ocp_nodes_nncp.yaml new file mode 100644 index 000000000..75d1bd3f1 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/nncp/ocp_nodes_nncp.yaml @@ -0,0 +1,7 @@ +--- +apiVersion: nmstate.io/v1 +kind: NodeNetworkConfigurationPolicy +metadata: + name: node-0 + labels: + osp/nncm-config-type: standard diff --git a/examples/dt/ipv6_ironic/control-plane/networking/nncp/values.yaml b/examples/dt/ipv6_ironic/control-plane/networking/nncp/values.yaml new file mode 100644 index 000000000..cbe6751e5 --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/networking/nncp/values.yaml @@ -0,0 +1,209 @@ +# local-config: referenced, but not emitted by kustomize +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: network-values + annotations: + config.kubernetes.io/local-config: "true" +data: + # nodes + node_0: + name: api.sno.lab.example.com + internalapi_ip: "fd00:bbbb::5" + tenant_ip: "fd00:dddd::5" + ctlplane_ip: "fd00:aaaa::10" + storage_ip: "fd00:cccc::5" + bmaas_ip: "fd00:00aa::5" + + # networks + ctlplane: + dnsDomain: ctlplane.example.com + subnets: + - allocationRanges: + - end: "fd00:aaaa::120" + start: "fd00:aaaa::100" + - end: "fd00:aaaa::200" + start: "fd00:aaaa::150" + cidr: "fd00:aaaa::0/64" + gateway: "fd00:aaaa::1" + name: subnet1 + prefix-length: 64 + iface: enp7s0 + mtu: 9000 + lb_addresses: + - "fd00:aaaa::80-fd00:aaaa::90" + endpoint_annotations: + metallb.universe.tf/address-pool: ctlplane + metallb.universe.tf/allow-shared-ip: ctlplane + metallb.universe.tf/loadBalancerIPs: "fd00:aaaa::80" + net-attach-def: | + { + "cniVersion": "0.3.1", + "name": "ctlplane", + "type": "macvlan", + "master": "ospbr", + "ipam": { + "type": "whereabouts", + "range": "fd00:aaaa::0/64", + "range_start": "fd00:aaaa::30", + "range_end": "fd00:aaaa::70" + } + } + internalapi: + dnsDomain: internalapi.example.com + subnets: + - allocationRanges: + - end: "fd00:bbbb::250" + start: "fd00:bbbb::100" + cidr: "fd00:bbbb::0/64" + name: subnet1 + vlan: 20 + mtu: 1500 + prefix-length: 64 + iface: internalapi + vlan: 20 + base_iface: enp7s0 + lb_addresses: + - "fd00:bbbb::80-fd00:bbbb::90" + endpoint_annotations: + metallb.universe.tf/address-pool: internalapi + metallb.universe.tf/allow-shared-ip: internalapi + metallb.universe.tf/loadBalancerIPs: "fd00:bbbb::80" + net-attach-def: | + { + "cniVersion": "0.3.1", + "name": "internalapi", + "type": "macvlan", + "master": "internalapi", + "ipam": { + "type": "whereabouts", + "range": "fd00:bbbb::0/64", + "range_start": "fd00:bbbb::30", + "range_end": "fd00:bbbb::70" + } + } + storage: + dnsDomain: storage.example.com + subnets: + - allocationRanges: + - end: "fd00:cccc::250" + start: "fd00:cccc::100" + cidr: "fd00:cccc::0/64" + name: subnet1 + vlan: 21 + mtu: 9000 + prefix-length: 64 + iface: storage + vlan: 21 + base_iface: enp7s0 + lb_addresses: + - "fd00:cccc::80-fd00:cccc::90" + net-attach-def: | + { + "cniVersion": "0.3.1", + "name": "storage", + "type": "macvlan", + "master": "storage", + "ipam": { + "type": "whereabouts", + "range": "fd00:cccc::0/64", + "range_start": "fd00:cccc::30", + "range_end": "fd00:cccc::70" + } + } + tenant: + dnsDomain: tenant.example.com + subnets: + - allocationRanges: + - end: "fd00:dddd::250" + start: "fd00:dddd::100" + cidr: "fd00:dddd::0/64" + name: subnet1 + vlan: 22 + mtu: 1500 + prefix-length: 64 + iface: tenant + vlan: 22 + base_iface: enp7s0 + lb_addresses: + - "fd00:dddd::80-fd00:dddd::90" + net-attach-def: | + { + "cniVersion": "0.3.1", + "name": "tenant", + "type": "macvlan", + "master": "tenant", + "ipam": { + "type": "whereabouts", + "range": "fd00:dddd::0/64", + "range_start": "fd00:dddd::30", + "range_end": "fd00:dddd::70" + } + } + datacentre: + net-attach-def: | + { + "cniVersion": "0.3.1", + "name": "datacentre", + "type": "bridge", + "bridge": "ospbr", + "ipam": {} + } + bmaas: + bridgeName: bmaas + dnsDomain: bmaas.example.com + subnets: + - allocationRanges: + - end: "fd00:00aa::250" + start: "fd00:00aa::100" + cidr: "fd00:00aa::0/64" + name: subnet1 + vlan: 22 + mtu: 1500 + prefix-length: 64 + iface: enp8s0 + lb_addresses: + - "fd00:dddd::80-fd00:00aa::90" + net-attach-def: | + { + "cniVersion": "0.3.1", + "name": "bmaas", + "type": "macvlan", + "master": "bmaas", + "ipam": { + "type": "whereabouts", + "range": "fd00:00aa::0/64", + "range_start": "fd00:00aa::30", + "range_end": "fd00:00aa::70" + } + } + + dns-resolver: + config: + server: + - "fd00:aaaa::1" + search: [] + options: + - key: server + values: + - "fd00:aaaa::1" + + routes: + config: + - destination: "::/0" + next-hop-address: "fd00:aaaa::1" + next-hop-interface: enp6s0 + + rabbitmq: + endpoint_annotations: + metallb.universe.tf/address-pool: internalapi + metallb.universe.tf/loadBalancerIPs: "fd00:bbbb::81" + rabbitmq-cell1: + endpoint_annotations: + metallb.universe.tf/address-pool: internalapi + metallb.universe.tf/loadBalancerIPs: "fd00:bbbb::82" + + lbServiceType: LoadBalancer + storageClass: local-storage + bridgeName: ospbr diff --git a/examples/dt/ipv6_ironic/control-plane/service-values.yaml b/examples/dt/ipv6_ironic/control-plane/service-values.yaml new file mode 100644 index 000000000..e4e15a28a --- /dev/null +++ b/examples/dt/ipv6_ironic/control-plane/service-values.yaml @@ -0,0 +1,42 @@ +--- +apiVersion: v1 +kind: ConfigMap +metadata: + name: service-values + annotations: + config.kubernetes.io/local-config: "true" +data: + horizon: + enabled: false + rabbitmq: + replicas: 1 + erlangInetConfig: | + {inet6, true}. + envConfig: | + SERVER_ADDITIONAL_ERL_ARGS="-kernel inetrc '/etc/rabbitmq/erl_inetrc' -proto_dist inet6_tcp" + RABBITMQ_CTL_ERL_ARGS="-proto_dist inet6_tcp" + galera: + replicas: 1 + ironic: + enabled: true + ironicConductors: + - customServiceConfig: | + [neutron] + cleaning_network = provisioning + provisioning_network = provisioning + rescuing_network = provisioning + nova: + cellTemplates: + cell0: + cellDatabaseInstance: openstack + cellDatabaseAccount: nova-cell0 + cellMessageBusInstance: rabbitmq + hasAPIAccess: true + cell1: + cellDatabaseInstance: openstack-cell1 + cellDatabaseAccount: nova-cell1 + cellMessageBusInstance: rabbitmq-cell1 + hasAPIAccess: true + novaComputeTemplates: + compute-ironic: + computeDriver: ironic.IronicDriver