diff --git a/changelog/62556.fixed b/changelog/62556.fixed new file mode 100644 index 000000000000..0dc3a7933ec2 --- /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 af1135a3fdad..76a52b89ea61 100644 --- a/salt/modules/mount.py +++ b/salt/modules/mount.py @@ -368,7 +368,12 @@ def match(self, line): """ 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 @@ def match(self, line): """ 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 @@ def match(self, fsys_view): 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 diff --git a/salt/states/mount.py b/salt/states/mount.py index 3e1a5690a7e8..db0753638986 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 4e233ec63c6b..c48886c24b7b 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 diff --git a/tests/pytests/unit/states/test_mount.py b/tests/pytests/unit/states/test_mount.py index 5f27b8b81533..f17541308add 100644 --- a/tests/pytests/unit/states/test_mount.py +++ b/tests/pytests/unit/states/test_mount.py @@ -238,12 +238,12 @@ def test_mounted(): ) == ret ) - # Test to check the options order #57520 + # Test to check the options order #57520, reverted in #62557 set_fstab_mock.assert_called_with( name2, "//SERVER/SHARE/", "cifs", - ["gid=group1", "uid=user1"], + ["uid=user1", "gid=group1"], 0, 0, "/etc/fstab",