From bbc20004486f54b74d4d1e90f54f65fca3421fa8 Mon Sep 17 00:00:00 2001
From: Andre Kantek <andrefernandozanella.kantek@windriver.com>
Date: Mon, 1 Jul 2024 09:23:58 -0300
Subject: [PATCH] Exit network config apply if puppet provides empty
 configuration

It was observed that if sysinv-conductor generates, for some reason,
hieradata for controller-1 (or other nodes) between the host-add
operation but before the new node's sysinv-agent send the first
inventory report an empty network config will be generated.

The script apply_network_config.sh isn't prepared for this case and
was removing existing configuration without adding another one,
isolating the node.

This change adds protection for this case, if an empty configuration
is detected (only contains the loopback) it will exit with success,
preserving the current configuration.

To simulate the problem, after controller-1 was added (with
system host-update 2 personality=controller) an empty controller-1
hieradata was generated with "/usr/bin/sysinv-puppet
 create-host-config" in /opt/platform/puppet/24.09/hieradata/. This
file contained a "network_config" with just the loopback interface.

Test Plan:

[PASS] with the empty network_config hieradata observe that the
        network config left by kickstart is preserved, no network
        interruption is detected
[PASS] after sysinv-agent inventory report proceed with
        controller-1 configuration and unlock the system, the unlock
        operation finishes with success.

Closes-Bug: 2071619

Change-Id: Ibb732d1f57e036740a7140c6014328f8a6de0fe5
Signed-off-by: Andre Kantek <andrefernandozanella.kantek@windriver.com>
---
 .../src/bin/apply_network_config.sh           | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

diff --git a/puppet-manifests/src/bin/apply_network_config.sh b/puppet-manifests/src/bin/apply_network_config.sh
index cecbe2607..5eed7dd39 100755
--- a/puppet-manifests/src/bin/apply_network_config.sh
+++ b/puppet-manifests/src/bin/apply_network_config.sh
@@ -358,18 +358,27 @@ else
             exit 1
         fi
 
+        log_network_info
+
+        parse_interface_stanzas
+
+        auto_intf=$(grep -v HEADER ${PUPPET_DIR}/auto)
+        log_it info "auto interfaces='${auto_intf}'"
+        if [ "${auto_intf}" == "auto lo" ]; then
+            # if an empty configuration is provided by puppet we should ignore it, otherwise
+            # it will remove the present network configuration and put nothing back in its place
+            log_it info "generated ${PUPPET_FILE} with empty configuration:'${auto_intf}', exiting"
+            exit 0
+        fi
+
         if [ -f /etc/network/interfaces.d/ifcfg-pxeboot ]; then
             iface_name=$( cat /etc/network/interfaces.d/ifcfg-pxeboot | grep iface | awk '{print $2}' )
-            log_it "turn off pxeboot install config, will be turned on later"
+            log_it "turn off pxeboot install config for ${iface_name}, will be turned on later"
             do_if_down ${iface_name}
             log_it "remove ifcfg-pxeboot, left from pxeboot install phase"
             rm /etc/network/interfaces.d/ifcfg-pxeboot
         fi
 
-        log_network_info
-
-        parse_interface_stanzas
-
         upgr_bootstrap=1
 
         if [ -f /var/run/.network_upgrade_bootstrap ]; then