fe4876
From 836be9931cad907dc71fc9e769d185e09a33e120 Mon Sep 17 00:00:00 2001
fe4876
From: Emanuele Giuseppe Esposito <eesposit@redhat.com>
fe4876
Date: Tue, 31 Jan 2023 17:14:42 +0100
fe4876
Subject: [PATCH] cc_set_hostname: ignore /var/lib/cloud/data/set-hostname if
fe4876
 it's empty (#1967)
fe4876
fe4876
RH-Author: Emanuele Giuseppe Esposito <eesposit@redhat.com>
fe4876
RH-MergeRequest: 90: cc_set_hostname: ignore /var/lib/cloud/data/set-hostname if it's empty (#1967)
fe4876
RH-Bugzilla: 2165945
fe4876
RH-Acked-by: Mohamed Gamal Morsy <mmorsy@redhat.com>
fe4876
RH-Acked-by: Miroslav Rezanina <mrezanin@redhat.com>
fe4876
RH-Commit: [1/1] 2efa7c1ac15932be38bd86b9b76f8f3b18038de6
fe4876
fe4876
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2165945
fe4876
fe4876
commit 9c7502a801763520639c66125eb373123d1e4f44
fe4876
Author: Emanuele Giuseppe Esposito <eesposit@redhat.com>
fe4876
Date:   Wed Jan 18 17:55:16 2023 +0100
fe4876
fe4876
    cc_set_hostname: ignore /var/lib/cloud/data/set-hostname if it's empty (#1967)
fe4876
fe4876
    If the file exists but is empty, do nothing.
fe4876
    Otherwise cloud-init will crash because it does not handle the empty file.
fe4876
fe4876
    RHBZ: 2140893
fe4876
fe4876
    Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
fe4876
fe4876
Signed-off-by: Emanuele Giuseppe Esposito <eesposit@redhat.com>
fe4876
---
fe4876
 cloudinit/config/cc_set_hostname.py            |  2 +-
fe4876
 tests/unittests/config/test_cc_set_hostname.py | 17 +++++++++++++++++
fe4876
 2 files changed, 18 insertions(+), 1 deletion(-)
fe4876
fe4876
diff --git a/cloudinit/config/cc_set_hostname.py b/cloudinit/config/cc_set_hostname.py
fe4876
index eb0ca328..9d78f6ad 100644
fe4876
--- a/cloudinit/config/cc_set_hostname.py
fe4876
+++ b/cloudinit/config/cc_set_hostname.py
fe4876
@@ -86,7 +86,7 @@ def handle(name, cfg, cloud, log, _args):
fe4876
     # distro._read_hostname implementation so we only validate  one artifact.
fe4876
     prev_fn = os.path.join(cloud.get_cpath("data"), "set-hostname")
fe4876
     prev_hostname = {}
fe4876
-    if os.path.exists(prev_fn):
fe4876
+    if os.path.exists(prev_fn) and os.stat(prev_fn).st_size > 0:
fe4876
         prev_hostname = util.load_json(util.load_file(prev_fn))
fe4876
     hostname_changed = hostname != prev_hostname.get(
fe4876
         "hostname"
fe4876
diff --git a/tests/unittests/config/test_cc_set_hostname.py b/tests/unittests/config/test_cc_set_hostname.py
fe4876
index fd994c4e..a819039b 100644
fe4876
--- a/tests/unittests/config/test_cc_set_hostname.py
fe4876
+++ b/tests/unittests/config/test_cc_set_hostname.py
fe4876
@@ -5,6 +5,7 @@ import os
fe4876
 import shutil
fe4876
 import tempfile
fe4876
 from io import BytesIO
fe4876
+from pathlib import Path
fe4876
 from unittest import mock
fe4876
 
fe4876
 from configobj import ConfigObj
fe4876
@@ -204,5 +205,21 @@ class TestHostname(t_help.FilesystemMockingTestCase):
fe4876
             str(ctx_mgr.exception),
fe4876
         )
fe4876
 
fe4876
+    def test_ignore_empty_previous_artifact_file(self):
fe4876
+        cfg = {
fe4876
+            "hostname": "blah",
fe4876
+            "fqdn": "blah.blah.blah.yahoo.com",
fe4876
+        }
fe4876
+        distro = self._fetch_distro("debian")
fe4876
+        paths = helpers.Paths({"cloud_dir": self.tmp})
fe4876
+        ds = None
fe4876
+        cc = cloud.Cloud(ds, paths, {}, distro, None)
fe4876
+        self.patchUtils(self.tmp)
fe4876
+        prev_fn = Path(cc.get_cpath("data")) / "set-hostname"
fe4876
+        prev_fn.touch()
fe4876
+        cc_set_hostname.handle("cc_set_hostname", cfg, cc, LOG, [])
fe4876
+        contents = util.load_file("/etc/hostname")
fe4876
+        self.assertEqual("blah", contents.strip())
fe4876
+
fe4876
 
fe4876
 # vi: ts=4 expandtab
fe4876
-- 
fe4876
2.37.3
fe4876