Skip to content

Commit 77f321f

Browse files
committed
generate: Don't run during netplan try
Generate may be called by NetworkManager (via Dbus) in Ubuntu >23.10. While `netplan try` is waiting for revert, there is no situation where the generator should be called. Signed-off-by: Wesley Hershberger <wesley.hershberger@canonical.com>
1 parent 0e1601a commit 77f321f

File tree

3 files changed

+24
-0
lines changed

3 files changed

+24
-0
lines changed

src/generate.c

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,7 @@ int main(int argc, char** argv)
208208
/* are we being called as systemd generator? */
209209
gboolean called_as_generator = (strstr(argv[0], "systemd/system-generators/") != NULL);
210210
g_autofree char* generator_run_stamp = NULL;
211+
g_autofree char* netplan_try_stamp = NULL;
211212
glob_t gl;
212213
int error_code = 0;
213214
char* ignore_errors_env = NULL;
@@ -243,6 +244,22 @@ int main(int argc, char** argv)
243244
}
244245
}
245246

247+
// The file at netplan_try_stamp is created while `netplan try` is waiting
248+
// for user confirmation. If generate is triggered while netplan try is
249+
// running, we shouldn't regenerate the configuration.
250+
// We can be called by either systemd (as a generator during daemon-reload)
251+
// or by NetworkManager when it is reloading configuration (Ubuntu >23.10),
252+
// see https://netplan.readthedocs.io/en/stable/netplan-everywhere/.
253+
// LP #2083029
254+
netplan_try_stamp = g_build_path(G_DIR_SEPARATOR_S,
255+
rootdir != NULL ? rootdir : G_DIR_SEPARATOR_S,
256+
"run/netplan/netplan-try.ready",
257+
NULL);
258+
if (g_access(netplan_try_stamp, F_OK) == 0) {
259+
g_fprintf(stderr, "'netplan try' is restoring configuration, remove %s to force re-run.\n", netplan_try_stamp);
260+
return 1;
261+
}
262+
246263
if ((ignore_errors_env = getenv("NETPLAN_PARSER_IGNORE_ERRORS"))) {
247264
// This is used mostly by autopkgtests
248265
// LCOV_EXCL_START

tests/generator/base.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,7 @@ class TestBase(unittest.TestCase):
261261
def setUp(self):
262262
self.workdir = tempfile.TemporaryDirectory()
263263
self.confdir = os.path.join(self.workdir.name, 'etc', 'netplan')
264+
self.rundir = os.path.join(self.workdir.name, 'run', 'netplan')
264265
self.nm_enable_all_conf = os.path.join(
265266
self.workdir.name, 'run', 'NetworkManager', 'conf.d', '10-globally-managed-devices.conf')
266267
self.maxDiff = None

tests/generator/test_args.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,12 @@ def test_empty_config(self):
5454
self.assert_nm_udev(None)
5555
self.assert_ovs({'cleanup.service': OVS_CLEANUP % {'iface': 'cleanup'}})
5656

57+
def test_generate_fails_during_try(self):
58+
os.makedirs(self.rundir, mode=0o700, exist_ok=True)
59+
open(os.path.join(self.rundir, "netplan-try.ready"), "w").close()
60+
61+
self.generate('network:\n version: 2', expect_fail=True)
62+
5763
def test_file_args(self):
5864
conf = os.path.join(self.workdir.name, 'config')
5965
with open(conf, 'w') as f:

0 commit comments

Comments
 (0)