summaryrefslogtreecommitdiff
path: root/debian/patches/cpick-c9c9197-mounts-use-mount-a-again-to-accomplish-mounts
blob: 3dd0e3cb6ae0c8ae50d1124374187f5a145e0d39 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
From c9c9197a3210ac24a039a4096214150d0e8cebb8 Mon Sep 17 00:00:00 2001
From: Scott Moser <smoser@ubuntu.com>
Date: Wed, 7 Dec 2016 09:44:41 +0100
Subject: [PATCH] mounts: use mount -a again to accomplish mounts

During recent changes to cc_mounts, on systemd systems, we started using
  systemctl daemon-reload
rather than 'mount -a' to get mounts done.

The belief was that since entries in /etc/fstab would be written
to tell systemd that they should be after cloud-init
(x-systemd.requires=cloud-init.service) that the reload would then
let systemd mount the units as expected.

That doesn't seem to work, and new mount entries end up not getting
mounted.  The change here moves back to using 'mount -a', but
then also does a systemctl daemon-reload.

LP: #1647708
---
 cloudinit/config/cc_mounts.py | 52 ++++++++++++++++++++++++++++---------------
 1 file changed, 34 insertions(+), 18 deletions(-)

--- a/cloudinit/config/cc_mounts.py
+++ b/cloudinit/config/cc_mounts.py
@@ -327,6 +327,8 @@ def handle(_name, cfg, cloud, log, _args
     if "mounts" in cfg:
         cfgmnt = cfg["mounts"]
 
+    LOG.debug("mounts configuration is %s", cfgmnt)
+
     for i in range(len(cfgmnt)):
         # skip something that wasn't a list
         if not isinstance(cfgmnt[i], list):
@@ -423,37 +425,51 @@ def handle(_name, cfg, cloud, log, _args
         cc_lines.append('\t'.join(line))
 
     fstab_lines = []
+    removed = []
     for line in util.load_file(FSTAB_PATH).splitlines():
         try:
             toks = WS.split(line)
             if toks[3].find(comment) != -1:
+                removed.append(line)
                 continue
         except Exception:
             pass
         fstab_lines.append(line)
 
+    for d in dirs:
+        try:
+            util.ensure_dir(d)
+        except Exception:
+            util.logexc(log, "Failed to make '%s' config-mount", d)
+
+    sadds = [WS.sub(" ", n) for n in cc_lines]
+    sdrops = [WS.sub(" ", n) for n in removed]
+
+    sops = (["- " + drop for drop in sdrops if drop not in sadds] +
+            ["+ " + add for add in sadds if add not in sdrops])
+
     fstab_lines.extend(cc_lines)
     contents = "%s\n" % ('\n'.join(fstab_lines))
     util.write_file(FSTAB_PATH, contents)
 
+    activate_cmds = []
     if needswap:
-        try:
-            util.subp(("swapon", "-a"))
-        except Exception:
-            util.logexc(log, "Activating swap via 'swapon -a' failed")
+        activate_cmds.append(["swapon", "-a"])
 
-    for d in dirs:
+    if len(sops) == 0:
+        log.debug("No changes to /etc/fstab made.")
+    else:
+        log.debug("Changes to fstab: %s", sops)
+        activate_cmds.append(["mount", "-a"])
+        if uses_systemd:
+            activate_cmds.append(["systemctl", "daemon-reload"])
+
+    fmt = "Activating swap and mounts with: %s"
+    for cmd in activate_cmds:
+        fmt = "Activate mounts: %s:" + ' '.join(cmd)
         try:
-            util.ensure_dir(d)
-        except Exception:
-            util.logexc(log, "Failed to make '%s' config-mount", d)
-
-    activate_cmd = ["mount", "-a"]
-    if uses_systemd:
-        activate_cmd = ["systemctl", "daemon-reload"]
-    fmt = "Activate mounts: %s:" + ' '.join(activate_cmd)
-    try:
-        util.subp(activate_cmd)
-        LOG.debug(fmt, "PASS")
-    except util.ProcessExecutionError:
-        util.logexc(log, fmt, "FAIL")
+            util.subp(cmd)
+            log.debug(fmt, "PASS")
+        except util.ProcessExecutionError:
+            log.warn(fmt, "FAIL")
+            util.logexc(log, fmt, "FAIL")