diff --git a/changelog/62556.fixed b/changelog/62556.fixed new file mode 100644 index 00000000000..0dc3a7933ec --- /dev/null +++ b/changelog/62556.fixed @@ -0,0 +1 @@ +Fix order specific mount.mounted options for persist diff --git a/salt/modules/mount.py b/salt/modules/mount.py index af1135a3fda..54a8f6cb84f 100644 --- a/salt/modules/mount.py +++ b/salt/modules/mount.py @@ -368,7 +368,12 @@ class _fstab_entry: """ entry = self.dict_from_line(line) for key, value in self.criteria.items(): - if entry[key] != value: + if key == "opts": + ex_opts = sorted(entry.get(key, "").split(",")) + cr_opts = sorted(value.split(",")) + if ex_opts != cr_opts: + return False + elif entry[key] != value: return False return True @@ -467,7 +472,12 @@ class _vfstab_entry: """ entry = self.dict_from_line(line) for key, value in self.criteria.items(): - if entry[key] != value: + if key == "opts": + ex_opts = sorted(entry.get(key, "").split(",")) + cr_opts = sorted(value.split(",")) + if ex_opts != cr_opts: + return False + elif entry[key] != value: return False return True @@ -628,7 +638,12 @@ class _FileSystemsEntry: evalue_dict = fsys_view[1] for key, value in self.criteria.items(): if key in evalue_dict: - if evalue_dict[key] != value: + if key == "opts": + ex_opts = sorted(evalue_dict.get(key, "").split(",")) + cr_opts = sorted(value.split(",")) + if ex_opts != cr_opts: + return False + elif evalue_dict[key] != value: return False else: return False @@ -867,6 +882,9 @@ def set_fstab( line = salt.utils.stringutils.to_unicode(line) try: if criteria.match(line): + log.debug( + "Checking ( %s ) against current line ( %s )", entry, line + ) # Note: If ret isn't None here, # we've matched multiple lines ret = "present" diff --git a/salt/states/mount.py b/salt/states/mount.py index a7af284c679..c6657a80114 100644 --- a/salt/states/mount.py +++ b/salt/states/mount.py @@ -222,8 +222,6 @@ def mounted( # string if isinstance(opts, str): opts = opts.split(",") - if opts: - opts.sort() if isinstance(hidden_opts, str): hidden_opts = hidden_opts.split(",") @@ -345,8 +343,6 @@ def mounted( if label_device and label_device not in device_list: device_list.append(label_device) if opts: - opts.sort() - mount_invisible_options = [ "_netdev", "actimeo", diff --git a/tests/pytests/unit/modules/test_mount.py b/tests/pytests/unit/modules/test_mount.py index 4e233ec63c6..784b6b411dd 100644 --- a/tests/pytests/unit/modules/test_mount.py +++ b/tests/pytests/unit/modules/test_mount.py @@ -137,6 +137,18 @@ def test_active(): assert mount.active() == {} +def test_fstab_entry_ignores_opt_ordering(): + entry = mount._fstab_entry( + name="/tmp", + device="tmpfs", + fstype="tmpfs", + opts="defaults,nodev,noexec", + dump=0, + pass_num=0, + ) + assert entry.match("tmpfs\t\t/tmp\ttmpfs\tnodev,defaults,noexec\t0 0\n") + + def test_fstab(): """ List the content of the fstab