Skip to content

Commit a471c8b

Browse files
mnietojiclaude
authored andcommitted
[ci_gen_kustomize_values] Co-locate provisionserver with metal3 to prevent DHCP failures
When metal3-dnsmasq pod restarts during a node's DHCP lease renewal on the provisioning network (172.23.0.0/24), NetworkManager fails to renew and sets ipv4.method=disabled. NMState operator then preserves this disabled state, causing permanent loss of provisioning network connectivity on that node. The issue occurs when OpenStackProvisionServer and metal3 pods run on different nodes. If metal3 restarts while a node is attempting DHCP renewal, the temporary unavailability of metal3-dnsmasq causes the renewal to fail. Solution: Automatically detect the node running metal3 pod (via k8s-app=metal3 label) and configure provisionServerNodeSelector in baremetalSetTemplate to schedule OpenStackProvisionServer on the same node. This ensures provisioning network connectivity is maintained because metal3-static-ip-manager maintains a static IP (172.23.0.3) on the metal3 node regardless of dnsmasq restarts. Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com> Signed-off-by: Miguel Angel Nieto Jimenez <mnietoji@redhat.com>
1 parent 1cadf68 commit a471c8b

20 files changed

Lines changed: 95 additions & 0 deletions

File tree

docs/dictionary/en-custom.txt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,7 @@ dlrnapi
183183
dlrnrepo
184184
dm
185185
dnf
186+
DPDK
186187
dns
187188
dnsdata
188189
dnsmasq
@@ -283,6 +284,7 @@ ipmi
283284
ips
284285
iptables
285286
ipv
287+
IOV
286288
iscsi
287289
isdir
288290
itldwuw
@@ -391,6 +393,7 @@ networker
391393
networkmanager
392394
networktype
393395
nfs
396+
NFV
394397
nftables
395398
nhc
396399
nic
@@ -461,6 +464,7 @@ ovirt
461464
ovirtmgmt
462465
ovn
463466
ovnkubernetes
467+
OVS
464468
pablintino
465469
param
466470
params

roles/ci_gen_kustomize_values/README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ with a message.
3535
* `ci_gen_kustomize_fetch_ocp_state`: (Boolean) If true it enables generating CI templates based on the OCP state. Defaults to `true`.
3636
* `cifmw_ci_gen_kustomize_values_storage_class_prefix`: (String) Prefix for `storageClass` in generated values.yaml files. Defaults to `"lvms-"` only if `cifmw_use_lvms` is True, otherwise it defaults to `""`. The prefix is prepended to the `cifmw_ci_gen_kustomize_values_storage_class`. It is not recommended to override this value, instead set `cifmw_use_lvms` True or False.
3737
* `cifmw_ci_gen_kustomize_values_storage_class`: (String) Value for `storageClass` in generated values.yaml files. Defaults to `"lvms-local-storage"` only if `cifmw_use_lvms` is True, otherwise it defaults to `"local-storage"`.
38+
* `cifmw_ci_gen_kustomize_values_detect_metal3`: (Boolean) Enable metal3 node detection for baremetal nodeset provisioning. When enabled, detects the node where metal3 pod is running and sets `provisionServerNodeSelector` in `baremetalSetTemplate` to co-locate the provision server with metal3. This prevents DHCP conflicts during baremetal provisioning. Defaults to `false`. Set to `true` for baremetal deployment scenarios (NFV, OVS-DPDK, SR-IOV).
3839
* `cifmw_ci_gen_kustomize_values_remove_keys_expressions*`: (List) Remove keys matching the regular expressions from source ConfigMaps (values.yaml).
3940
Defaults to `["^nodes$", "^node(_[0-9]+)?$"]`. Accepts passing additional expressions by passing variables that matches `cifmw_ci_gen_kustomize_values_remove_keys_expressions.+`.
4041

roles/ci_gen_kustomize_values/defaults/main.yml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,9 @@ ci_gen_kustomize_fetch_ocp_state: true
6767
cifmw_ci_gen_kustomize_values_storage_class_prefix: "{{ 'lvms-' if cifmw_use_lvms | default(false) | bool else '' }}"
6868
cifmw_ci_gen_kustomize_values_storage_class: "{{ cifmw_ci_gen_kustomize_values_storage_class_prefix }}local-storage"
6969

70+
# Enable metal3 node detection for baremetal provisioning
71+
cifmw_ci_gen_kustomize_values_detect_metal3: false
72+
7073
cifmw_ci_gen_kustomize_values_primary_ip_version: 4
7174
cifmw_ci_gen_kustomize_values_remove_keys_expressions:
7275
- ^nodes$
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
---
2+
# Copyright Red Hat, Inc.
3+
# All Rights Reserved.
4+
#
5+
# Licensed under the Apache License, Version 2.0 (the "License"); you may
6+
# not use this file except in compliance with the License. You may obtain
7+
# a copy of the License at
8+
#
9+
# http://www.apache.org/licenses/LICENSE-2.0
10+
#
11+
# Unless required by applicable law or agreed to in writing, software
12+
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
13+
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
14+
# License for the specific language governing permissions and limitations
15+
# under the License.
16+
17+
- name: Get metal3 pod information
18+
kubernetes.core.k8s_info:
19+
kubeconfig: "{{ cifmw_openshift_kubeconfig }}"
20+
kind: Pod
21+
namespace: openshift-machine-api
22+
label_selectors:
23+
- k8s-app=metal3
24+
register: _cifmw_kustomize_deploy_metal3_pod_info
25+
26+
- name: Set metal3 node for provisionserver nodeSelector
27+
ansible.builtin.set_fact:
28+
cifmw_kustomize_deploy_metal3_node: "{{ _cifmw_kustomize_deploy_metal3_pod_info.resources[0].spec.nodeName }}"
29+
cacheable: true
30+
when:
31+
- _cifmw_kustomize_deploy_metal3_pod_info.resources | default([]) | length > 0

roles/ci_gen_kustomize_values/tasks/main.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,12 @@
1414
# License for the specific language governing permissions and limitations
1515
# under the License.
1616

17+
- name: Detect metal3 node for baremetal nodeset provisioning
18+
when:
19+
- (cifmw_ci_gen_kustomize_values_detect_metal3 | default(false) | bool) and (cifmw_kustomize_deploy_metal3_node is not defined)
20+
- ('nodeset' in (cifmw_ci_gen_kustomize_values_dest_fname_prefix | default(cifmw_ci_gen_kustomize_values_name, true) | default('')))
21+
ansible.builtin.include_tasks: detect_metal3_node.yml
22+
1723
- name: Generate snippets files
1824
ansible.builtin.include_tasks: generate_snippets.yml
1925

roles/ci_gen_kustomize_values/templates/nfv-ovs-dpdk-sriov-hci/edpm-nodeset-values/values.yaml.j2

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,9 @@ data:
4444
- "{{ svc }}"
4545
{% endfor %}
4646
{% endif %}
47+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
48+
baremetalSetTemplate:
49+
{{ original_content.data.baremetalSetTemplate | default({}) | to_nice_yaml(indent=2) | indent(4, first=true) }}
50+
provisionServerNodeSelector:
51+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
52+
{% endif %}

roles/ci_gen_kustomize_values/templates/ovs-dpdk-sriov-2nodesets/edpm-nodeset-values/values.yaml.j2

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,9 @@ data:
5656
- "{{ svc }}"
5757
{% endfor %}
5858
{% endif %}
59+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
60+
baremetalSetTemplate:
61+
{{ original_content.data.baremetalSetTemplate | default({}) | to_nice_yaml(indent=2) | indent(4, first=true) }}
62+
provisionServerNodeSelector:
63+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
64+
{% endif %}

roles/ci_gen_kustomize_values/templates/ovs-dpdk-sriov-ipv6-2nodesets/edpm-nodeset-values/values.yaml.j2

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,9 @@ data:
5656
- "{{ svc }}"
5757
{% endfor %}
5858
{% endif %}
59+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
60+
baremetalSetTemplate:
61+
{{ original_content.data.baremetalSetTemplate | default({}) | to_nice_yaml(indent=2) | indent(4, first=true) }}
62+
provisionServerNodeSelector:
63+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
64+
{% endif %}

roles/ci_gen_kustomize_values/templates/ovs-dpdk-sriov-ipv6/edpm-nodeset-values/values.yaml.j2

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,9 @@ data:
4343
- "{{ svc }}"
4444
{% endfor %}
4545
{% endif %}
46+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
47+
baremetalSetTemplate:
48+
{{ original_content.data.baremetalSetTemplate | default({}) | to_nice_yaml(indent=2) | indent(4, first=true) }}
49+
provisionServerNodeSelector:
50+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
51+
{% endif %}

roles/ci_gen_kustomize_values/templates/ovs-dpdk-sriov/edpm-nodeset-values/values.yaml.j2

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,9 @@ data:
4343
- "{{ svc }}"
4444
{% endfor %}
4545
{% endif %}
46+
{% if cifmw_kustomize_deploy_metal3_node is defined %}
47+
baremetalSetTemplate:
48+
{{ original_content.data.baremetalSetTemplate | default({}) | to_nice_yaml(indent=2) | indent(4, first=true) }}
49+
provisionServerNodeSelector:
50+
kubernetes.io/hostname: "{{ cifmw_kustomize_deploy_metal3_node }}"
51+
{% endif %}

0 commit comments

Comments
 (0)