Hello community,

here is the log from the commit of package yast2-nfs-client for 
openSUSE:Leap:15.2 checked in at 2020-02-04 17:54:22
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Leap:15.2/yast2-nfs-client (Old)
 and      /work/SRC/openSUSE:Leap:15.2/.yast2-nfs-client.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "yast2-nfs-client"

Tue Feb  4 17:54:22 2020 rev:40 rq:768913 version:4.2.6

Changes:
--------
--- /work/SRC/openSUSE:Leap:15.2/yast2-nfs-client/yast2-nfs-client.changes      
2020-01-17 11:58:52.112436115 +0100
+++ 
/work/SRC/openSUSE:Leap:15.2/.yast2-nfs-client.new.26092/yast2-nfs-client.changes
   2020-02-04 17:54:42.360759649 +0100
@@ -1,0 +2,16 @@
+Thu Jan 23 15:41:17 UTC 2020 - Josef Reidinger <jreidin...@suse.com>
+
+- fix return code for cli `yast2 nfs list` (bsc#1150070)
+- Add error message when delete failed due to not found entry
+- 4.2.6
+
+-------------------------------------------------------------------
+Fri Jan 17 12:49:20 UTC 2020 - José Iván López González <jlo...@suse.com>
+
+- Delegates mount/unmount actions to yast2-storage-ng.
+- Keeps mount point status for existing shares.
+- Adds an asterisk to mount point for unmounted entries.
+- Related to bsc#1006815, bsc#1151426, bsc#1060159.
+- 4.2.5
+
+-------------------------------------------------------------------

Old:
----
  yast2-nfs-client-4.2.4.tar.bz2

New:
----
  yast2-nfs-client-4.2.6.tar.bz2

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ yast2-nfs-client.spec ++++++
--- /var/tmp/diff_new_pack.Ixhkoc/_old  2020-02-04 17:54:43.044760062 +0100
+++ /var/tmp/diff_new_pack.Ixhkoc/_new  2020-02-04 17:54:43.044760062 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           yast2-nfs-client
-Version:        4.2.4
+Version:        4.2.6
 Release:        0
 Url:            https://github.com/yast/yast-nfs-client
 Summary:        YaST2 - NFS Configuration
@@ -37,8 +37,8 @@
 BuildRequires:  rubygem(%rb_default_ruby_abi:yast-rake)
 # path_matching (RSpec argument matcher)
 BuildRequires:  yast2-ruby-bindings >= 3.1.31
-# Y2Storage::MountPoint#active=
-BuildRequires:  yast2-storage-ng >= 4.0.180
+# Y2Storage::Filesystems::LegacyNfs#configure_from
+BuildRequires:  yast2-storage-ng >= 4.2.73
 # Unfortunately we cannot move this to macros.yast,
 # bcond within macros are ignored by osc/OBS.
 %bcond_with yast_run_ci_tests
@@ -52,9 +52,9 @@
 Requires:       yast2-nfs-common >= 2.24.0
 # showmount, #150382, #286300
 Recommends:     nfs-client
-# Y2Storage::MountPoint#active=
+# Y2Storage::Filesystems::LegacyNfs#configure_from
 Requires:       yast2-ruby-bindings >= 1.0.0
-Requires:       yast2-storage-ng >= 4.0.180
+Requires:       yast2-storage-ng >= 4.2.73
 
 Provides:       yast2-config-network:/usr/lib/YaST2/clients/lan_nfs_client.ycp
 Provides:       yast2-config-nfs

++++++ yast2-nfs-client-4.2.4.tar.bz2 -> yast2-nfs-client-4.2.6.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-nfs-client-4.2.4/package/yast2-nfs-client.changes 
new/yast2-nfs-client-4.2.6/package/yast2-nfs-client.changes
--- old/yast2-nfs-client-4.2.4/package/yast2-nfs-client.changes 2020-01-09 
16:00:38.000000000 +0100
+++ new/yast2-nfs-client-4.2.6/package/yast2-nfs-client.changes 2020-01-24 
14:43:03.000000000 +0100
@@ -1,4 +1,20 @@
 -------------------------------------------------------------------
+Thu Jan 23 15:41:17 UTC 2020 - Josef Reidinger <jreidin...@suse.com>
+
+- fix return code for cli `yast2 nfs list` (bsc#1150070)
+- Add error message when delete failed due to not found entry
+- 4.2.6
+
+-------------------------------------------------------------------
+Fri Jan 17 12:49:20 UTC 2020 - José Iván López González <jlo...@suse.com>
+
+- Delegates mount/unmount actions to yast2-storage-ng.
+- Keeps mount point status for existing shares.
+- Adds an asterisk to mount point for unmounted entries.
+- Related to bsc#1006815, bsc#1151426, bsc#1060159.
+- 4.2.5
+
+-------------------------------------------------------------------
 Wed Jan  8 22:49:11 UTC 2020 - David Diaz <dgonza...@suse.com>
 
 - Avoids displaying phantom NFS entries adding an action to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-nfs-client-4.2.4/package/yast2-nfs-client.spec 
new/yast2-nfs-client-4.2.6/package/yast2-nfs-client.spec
--- old/yast2-nfs-client-4.2.4/package/yast2-nfs-client.spec    2020-01-09 
16:00:38.000000000 +0100
+++ new/yast2-nfs-client-4.2.6/package/yast2-nfs-client.spec    2020-01-24 
14:43:03.000000000 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           yast2-nfs-client
-Version:        4.2.4
+Version:        4.2.6
 Release:        0
 Url:            https://github.com/yast/yast-nfs-client
 Summary:        YaST2 - NFS Configuration
@@ -37,8 +37,8 @@
 BuildRequires:  rubygem(%rb_default_ruby_abi:yast-rake)
 # path_matching (RSpec argument matcher)
 BuildRequires:  yast2-ruby-bindings >= 3.1.31
-# Y2Storage::MountPoint#active=
-BuildRequires:  yast2-storage-ng >= 4.0.180
+# Y2Storage::Filesystems::LegacyNfs#configure_from
+BuildRequires:  yast2-storage-ng >= 4.2.73
 # Unfortunately we cannot move this to macros.yast,
 # bcond within macros are ignored by osc/OBS.
 %bcond_with yast_run_ci_tests
@@ -52,8 +52,8 @@
 Requires:       yast2-nfs-common >= 2.24.0
 # showmount, #150382, #286300
 Recommends:     nfs-client
-# Y2Storage::MountPoint#active=
-Requires:       yast2-storage-ng >= 4.0.180
+# Y2Storage::Filesystems::LegacyNfs#configure_from
+Requires:       yast2-storage-ng >= 4.2.73
 Requires:       yast2-ruby-bindings >= 1.0.0
 
 Provides:       yast2-config-nfs
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-nfs-client-4.2.4/src/clients/nfs.rb 
new/yast2-nfs-client-4.2.6/src/clients/nfs.rb
--- old/yast2-nfs-client-4.2.4/src/clients/nfs.rb       2020-01-09 
16:00:38.000000000 +0100
+++ new/yast2-nfs-client-4.2.6/src/clients/nfs.rb       2020-01-24 
14:43:03.000000000 +0100
@@ -35,14 +35,15 @@
         "actions"    => {
           "list"   => {
             # TODO: summary is probably better...
-            "handler" => fun_ref(
+            "handler"  => fun_ref(
               method(:NfsListHandler),
               "boolean (map)"
             ),
             # command line action help
-            "help"    => _(
+            "help"     => _(
               "List configured NFS mounts"
-            )
+            ),
+            "readonly" => true
           },
           "add"    => {
             "handler" => fun_ref(method(:NfsAddHandler), "boolean (map)"),
@@ -133,12 +134,12 @@
     # CLI action handler.
     # Print summary in command line
     # @param [Hash] options command options
-    # @return false so that Write is not called in non-interactive mode
+    # @return true
     def NfsListHandler(_options)
       nfs_entries = deep_copy(Nfs.nfs_entries)
       if Ops.less_than(Builtins.size(nfs_entries), 1)
         CommandLine.Print(Summary.NotConfigured)
-        return false
+        return true
       end
       items = []
       Builtins.foreach(FstabTableItems(nfs_entries)) do |i|
@@ -165,7 +166,7 @@
           {}
         )
       )
-      false
+      true
     end
 
     # CLI action handler.
@@ -334,6 +335,12 @@
       end
 
       Nfs.nfs_entries = deep_copy(nfs_entries)
+
+      if !deleted
+        # TRANSLATORS %s is mountpoint that is not found in nfs client 
configuration.
+        CommandLine.Print(format(_("NFS mount '%s' not found."), spec == "" ? 
file : spec))
+      end
+
       deleted
     end
   end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-nfs-client-4.2.4/src/include/nfs/routines.rb 
new/yast2-nfs-client-4.2.6/src/include/nfs/routines.rb
--- old/yast2-nfs-client-4.2.4/src/include/nfs/routines.rb      2020-01-09 
16:00:38.000000000 +0100
+++ new/yast2-nfs-client-4.2.6/src/include/nfs/routines.rb      2020-01-24 
14:43:03.000000000 +0100
@@ -1,4 +1,21 @@
-# encoding: utf-8
+# Copyright (c) [2013-2020] SUSE LLC
+#
+# All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 of the GNU General Public License as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, contact SUSE LLC.
+#
+# To contact SUSE LLC about this file by physical or electronic mail, you may
+# find current contact information at www.suse.com.
 
 require "y2nfs_client/nfs_version"
 require "y2storage"
@@ -53,15 +70,18 @@
       count = 0
       Builtins.maplist(fstab) do |entry|
         sp = SpecToServPath(Ops.get_string(entry, "spec", ""))
+        mount_point = item_mount_point(entry)
         mntops = entry["mntops"] || ""
+
         it = Item(
           Id(count),
-          Ops.add(Ops.get_string(sp, 0, ""), " "),
-          Ops.add(Ops.get_string(sp, 1, ""), " "),
-          Ops.add(Ops.get_string(entry, "file", ""), " "),
-          "#{nfs_version_for_table(entry)} ",
-          "#{mntops} "
+          Ops.get_string(sp, 0, "") + " ",
+          Ops.get_string(sp, 1, "") + " ",
+          mount_point + " ",
+          nfs_version_for_table(entry) + " ",
+          mntops + " "
         )
+
         count = Ops.add(count, 1)
         deep_copy(it)
       end
@@ -233,6 +253,18 @@
       }
     end
 
+    # Creates a LegacyNfs object according to the given entry
+    #
+    # @param entry [Hash] NFS mount in the .etc.fstab format that uses keys 
such as "spec", "file", etc.
+    # @return [Y2Storage::Filesystems::LegacyNfs]
+    def to_legacy_nfs(entry)
+      storage_hash = fstab_to_storage(entry)
+      legacy = Y2Storage::Filesystems::LegacyNfs.new_from_hash(storage_hash)
+      legacy.default_devicegraph = working_graph
+
+      legacy
+    end
+
   private
 
     # @see #FstabTableItems
@@ -266,6 +298,13 @@
       storage_manager.staging
     end
 
+    # Devicegraph representing the current system status
+    #
+    # @return [Y2Storage::Devicegraph]
+    def system_graph
+      storage_manager.probed
+    end
+
     # Mount points present on /etc/fstab but not handled by the yast-nfs-client
     # module.
     #
@@ -275,5 +314,32 @@
         mp.mountable && !mp.mountable.is?(:nfs)
       end.map(&:path)
     end
+
+    # Mount point to show for the given entry
+    #
+    # Note that an asterisk could be appended to the mount path when the NFS 
share is not currently
+    # mounted.
+    #
+    # @param entry [Hash] NFS mount in the .etc.fstab format that uses keys 
such as "spec", "file", etc.
+    # @return [String]
+    def item_mount_point(entry)
+      mount_point = entry["file"].dup || ""
+
+      mount_point << "*" if unmounted_mark?(entry)
+
+      mount_point
+    end
+
+    # Whether a mark should be added to the mount path because the device is 
unmounted
+    #
+    # @param entry [Hash] NFS mount in the .etc.fstab format that uses keys 
such as "spec", "file", etc.
+    # @return [Boolean]
+    def unmounted_mark?(entry)
+      return false if entry["new"]
+
+      nfs = to_legacy_nfs(entry).find_nfs_device
+
+      nfs && nfs.mount_point && nfs.mount_point.active? ? false : true
+    end
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-nfs-client-4.2.4/src/include/nfs/ui.rb 
new/yast2-nfs-client-4.2.6/src/include/nfs/ui.rb
--- old/yast2-nfs-client-4.2.4/src/include/nfs/ui.rb    2020-01-09 
16:00:38.000000000 +0100
+++ new/yast2-nfs-client-4.2.6/src/include/nfs/ui.rb    2020-01-24 
14:43:03.000000000 +0100
@@ -1,4 +1,22 @@
-# encoding: utf-8
+# Copyright (c) [2013-2020] SUSE LLC
+#
+# All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 of the GNU General Public License as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, contact SUSE LLC.
+#
+# To contact SUSE LLC about this file by physical or electronic mail, you may
+# find current contact information at www.suse.com.
+
 require "y2firewall/firewalld"
 require "yast2/feedback"
 require "yast2/popup"
@@ -51,9 +69,12 @@
         # Help, part 2 of 4
         _(
           "<p>Each NFS share is identified by remote NFS server address and\n" 
\
-            "exported directory, local directory where the remote directory is 
mounted, \n" \
-            "version of the NFS protocol and mount options. For further 
information \n" \
-            "about mounting NFS and mount options, refer to <tt>man 
nfs.</tt></p>"
+          "exported directory, local directory where the remote directory is 
mounted, \n" \
+          "version of the NFS protocol and mount options. For further 
information \n" \
+          "about mounting NFS and mount options, refer to <tt>man 
nfs</tt>.</p>\n" \
+          "<p>An asterisk (*) after the mount point indicates a file system 
that is \n" \
+          "currently not mounted (for example, because it has the 
<tt>noauto</tt> \n" \
+          "option set in <tt>/etc/fstab</tt>).</p>"
         ) +
         # Help, part 3 of 4
         _(
@@ -219,6 +240,8 @@
       ret = nil
 
       if fstab_ent
+        new_entry = fstab_ent.fetch("new", false)
+
         couple = SpecToServPath(Ops.get_string(fstab_ent, "spec", ""))
         server = Ops.get_string(couple, 0, "")
         pth = Ops.get_string(couple, 1, "")
@@ -227,6 +250,8 @@
         servers = [server]
         old = Ops.get_string(fstab_ent, "spec", "")
       else
+        new_entry = true
+
         proposed_server = ProposeHostname()
         servers = [proposed_server] if HostnameExists(proposed_server)
       end
@@ -450,6 +475,11 @@
       UI.CloseDialog
       Wizard.RestoreScreenShotName
 
+      # New entries are identify by "new" key in the hash. This is useful to 
detect which entries are
+      # not created but updated. Note that this is important to keep the 
current mount point status of
+      # updated entries.
+      fstab_ent["new"] = new_entry
+
       return deep_copy(fstab_ent) if ret == :ok
       nil
     end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-nfs-client-4.2.4/src/modules/Nfs.rb 
new/yast2-nfs-client-4.2.6/src/modules/Nfs.rb
--- old/yast2-nfs-client-4.2.4/src/modules/Nfs.rb       2020-01-09 
16:00:38.000000000 +0100
+++ new/yast2-nfs-client-4.2.6/src/modules/Nfs.rb       2020-01-24 
14:43:03.000000000 +0100
@@ -1,4 +1,21 @@
-# encoding: utf-8
+# Copyright (c) [2013-2020] SUSE LLC
+#
+# All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 of the GNU General Public License as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, contact SUSE LLC.
+#
+# To contact SUSE LLC about this file by physical or electronic mail, you may
+# find current contact information at www.suse.com.
 
 require "yast"
 require "y2firewall/firewalld"
@@ -304,7 +321,8 @@
         "/usr/bin/cp /etc/fstab /etc/fstab.YaST2/save"
       )
 
-      if !write_fstab
+      # Perform a storage commit to write the fstab file and mount/unmount NFS 
shares.
+      if !storage_manager.commit
         # error popup message
         Report.Error(
           _(
@@ -317,10 +335,7 @@
       end
 
       @portmapper = FindPortmapper()
-      if !@nfs_entries.empty?
-        Service.Enable(@portmapper)
-        Service.Enable("nfs")
-      end
+      Service.Enable(@portmapper) unless @nfs_entries.empty?
 
       if @nfs4_enabled == true
         SCR.Write(path(".sysconfig.nfs.NFS4_SUPPORT"), "yes")
@@ -355,14 +370,10 @@
         2,
         [
           # progress stage label
-          _("Stop services"),
-          # progress stage label
           _("Start services")
         ],
         [
           # progress step label
-          _("Stopping services..."),
-          # progress step label
           _("Starting services..."),
           # final progress step label
           _("Finished")
@@ -373,12 +384,8 @@
       # help text
       Wizard.RestoreHelp(_("Writing NFS client settings. Please wait..."))
 
-      Progress.NextStage
-
-      Service.Stop("nfs")
-
-      Progress.NextStage
       if Ops.greater_than(Builtins.size(@nfs_entries), 0)
+        Progress.NextStage
         # portmap must not be started if it is running already (see bug # 9999)
         Service.Start(@portmapper) unless Service.active?(@portmapper)
 
@@ -386,15 +393,8 @@
           Report.Error(Message.CannotStartService(@portmapper))
           return false
         end
-
-        Service.Start("nfs")
-
-        unless Service.active?("nfs")
-          # error popup message
-          Report.Error(_("Unable to mount the NFS entries from /etc/fstab."))
-          return false
-        end
       end
+
       firewalld.reload
       Progress.NextStage
       true
@@ -653,46 +653,24 @@
       end
     end
 
-    # Commits storage changes to /etc/fstab
-    def write_fstab
-      # By default, libstorage-ng will umount active NFS shares found in
-      # probed and will mount active Nfs shares from staging.
-      # Let's prevent that since we don't want libstorage-ng to perform any
-      # mount/umount.
-      #
-      # TODO: this implies too much knowledge about how libstorage-ng works, it
-      # should be moved to yast2-storage-ng (e.g. as a :skip_mount flag to
-      # #commit).
-      deactivate_mount_points(storage_manager.probed)
-      deactivate_mount_points(storage_manager.staging)
-      storage_manager.commit
-    end
-
-    # See {#write_fstab}
-    #
-    # @param graph [Y2Storage::Devicegraph]
-    def deactivate_mount_points(graph)
-      graph.nfs_mounts.each do |nfs|
-        nfs.mount_point && nfs.mount_point.active = false
-      end
-    end
-
     # Creates a Y2Storage::Filesystems::Nfs device in the working devicegraph
     #
-    # @param entry [Hash] NFS mount in the .etc.fstab format that uses keys 
such
-    #   as "spec", "file", etc
+    # Note that for existing entries (no newly added), the NFS share will not 
be mounted if it is
+    # currently unmounted. Similarly, existing shares that are not included in 
the fstab will not be
+    # added to the fstab after committing the changes.
+    #
+    # @param entry [Hash] NFS mount in the .etc.fstab format that uses keys 
such as "spec", "file", etc.
+    # @return [Y2Partitioner::Filesystems::Nfs]
     def create_storage_device(entry)
-      to_legacy_nfs(entry).create_nfs_device
-    end
+      legacy_nfs = to_legacy_nfs(entry)
 
-    # @see #create_storage_device
-    #
-    # @param entry [Hash] see {#create_storage_device}
-    def to_legacy_nfs(entry)
-      storage_hash = fstab_to_storage(entry)
-      legacy = Y2Storage::Filesystems::LegacyNfs.new_from_hash(storage_hash)
-      legacy.default_devicegraph = working_graph
-      legacy
+      if !entry["new"]
+        probed_nfs = legacy_nfs.find_nfs_device(system_graph)
+
+        legacy_nfs.configure_from(probed_nfs) if probed_nfs
+      end
+
+      legacy_nfs.create_nfs_device
     end
 
     # Check that the required nfs-client packages are present adding them to
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-nfs-client-4.2.4/test/nfs_test.rb 
new/yast2-nfs-client-4.2.6/test/nfs_test.rb
--- old/yast2-nfs-client-4.2.4/test/nfs_test.rb 2020-01-09 16:00:38.000000000 
+0100
+++ new/yast2-nfs-client-4.2.6/test/nfs_test.rb 2020-01-24 14:43:03.000000000 
+0100
@@ -1,21 +1,23 @@
-#! /usr/bin/env rspec
-# Copyright (c) 2014 SUSE Linux.
-#  All Rights Reserved.
-
-#  This program is free software; you can redistribute it and/or
-#  modify it under the terms of version 2 or 3 of the GNU General
-#  Public License as published by the Free Software Foundation.
-
-#  This program is distributed in the hope that it will be useful,
-#  but WITHOUT ANY WARRANTY; without even the implied warranty of
-#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   See the
-#  GNU General Public License for more details.
+#!/usr/bin/env rspec
 
-#  You should have received a copy of the GNU General Public License
-#  along with this program; if not, contact SUSE LLC.
-
-#  To contact SUSE about this file by physical or electronic mail,
-#  you may find current contact information at www.suse.com
+# Copyright (c) [2015-2020] SUSE LLC
+#
+# All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 of the GNU General Public License as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, contact SUSE LLC.
+#
+# To contact SUSE LLC about this file by physical or electronic mail, you may
+# find current contact information at www.suse.com
 
 require_relative "spec_helper"
 require "yaml"
@@ -26,9 +28,6 @@
 Yast.import "Service"
 
 describe "Yast::Nfs" do
-  subject { Yast::Nfs }
-  let(:firewalld) { Y2Firewall::Firewalld.instance }
-
   def allow_read_side_effects
     allow(subject).to receive(:ReadNfs4)
     allow(subject).to receive(:ReadNfsGss)
@@ -39,7 +38,19 @@
     allow(subject).to receive(:check_and_install_required_packages)
   end
 
+  def add_nfs_devices
+    nfs1 = Y2Storage::Filesystems::Nfs.create(system_graph, "nfs.example.com", 
"/foo")
+    nfs1.mount_path = "/foo"
+
+    nfs2 = Y2Storage::Filesystems::Nfs.create(system_graph, "nfs.example.com", 
"/baz")
+    nfs2.mount_path = "/foo/bar/baz"
+
+    system_graph.copy(working_graph)
+  end
+
   def mock_entries
+    add_nfs_devices
+
     subject.skip_fstab = false
     subject.Read
   end
@@ -49,17 +60,21 @@
     sm = Y2Storage::StorageManager.create_test_instance
     sm.probe_from_yaml(File.join(DATA_PATH, "devicegraph.yaml"))
 
-    # Add NFS entries
-    Y2Storage::Filesystems::Nfs.create(sm.staging, "nfs.example.com", 
"/foo").mount_path = "/foo"
-    Y2Storage::Filesystems::Nfs.create(sm.staging, "nfs.example.com", 
"/baz").mount_path = "/foo/bar/baz"
-
     # Prevent further reprobing
     allow(sm).to receive(:probe).and_return true
 
     # prevent storage-commit
-    allow(subject).to receive(:write_fstab)
+    allow(sm).to receive(:commit)
   end
 
+  subject { Yast::Nfs }
+
+  let(:firewalld) { Y2Firewall::Firewalld.instance }
+
+  let(:working_graph) { Y2Storage::StorageManager.instance.staging }
+
+  let(:system_graph) { Y2Storage::StorageManager.instance.probed }
+
   describe ".Import" do
     let(:profile) do
       {
@@ -139,6 +154,13 @@
   end
 
   describe ".Export" do
+    before do
+      mock_entries
+      subject.nfs4_enabled = true
+      subject.nfs_gss_enabled = false
+      subject.idmapd_domain = "example.com"
+    end
+
     let(:expected_profile) do
       {
         "enable_nfs4"    => true,
@@ -160,12 +182,6 @@
         ]
       }
     end
-    before do
-      mock_entries
-      subject.nfs4_enabled = true
-      subject.nfs_gss_enabled = false
-      subject.idmapd_domain = "example.com"
-    end
 
     it "exports the current nfs settings as a map" do
       profile = subject.Export()
@@ -259,9 +275,31 @@
       mock_entries
     end
 
+    def nfs(share)
+      working_graph.nfs_mounts.find { |n| n.share == share }
+    end
+
+    def probed_nfs(share)
+      system_graph.nfs_mounts.find { |n| n.share == share }
+    end
+
+    def entry(spec)
+      subject.nfs_entries.find { |e| e["spec"] == spec }
+    end
+
+    def create_entry(spec)
+      {
+        "spec"    => spec,
+        "file"    => "/home/test",
+        "freq"    => 0,
+        "mntops"  => "defaults",
+        "passno"  => 0,
+        "vfstype" => "nfs"
+      }
+    end
+
     def find_mp(path)
-      staging = Y2Storage::StorageManager.instance.staging
-      staging.filesystems.find { |fs| fs.mount_path == path }.mount_point
+      working_graph.filesystems.find { |fs| fs.mount_path == path }.mount_point
     end
 
     it "ensures zero for the 'passno' field, only in nfs entries" do
@@ -281,22 +319,156 @@
       expect(find_mp("/foo").passno).to eq 0
       expect(find_mp("/foo/bar/baz").passno).to eq 0
     end
+
+    shared_examples "remove_entry" do
+      it "removes the existing NFS share" do
+        nfs_sid = nfs(spec).sid
+
+        subject.WriteOnly
+
+        expect(working_graph.find_device(nfs_sid)).to be_nil
+      end
+    end
+
+    context "when the entry is new" do
+      before do
+        entry = entry(spec)
+
+        if entry
+          entry["new"] = true
+        else
+          entry = create_entry(spec)
+          entry["new"] = true
+          subject.nfs_entries << entry
+        end
+      end
+
+      shared_examples "new_entry" do
+        it "creates a new NFS share for that entry" do
+          subject.WriteOnly
+
+          nfs = nfs(spec)
+
+          expect(nfs).to_not be_nil
+          expect(nfs.exists_in_probed?).to eq(false)
+        end
+
+        it "sets the NFS mount point as active" do
+          subject.WriteOnly
+
+          nfs = nfs(spec)
+
+          expect(nfs.mount_point.active?).to eq(true)
+        end
+
+        it "sets the NFS to be written to the fstab" do
+          subject.WriteOnly
+
+          nfs = nfs(spec)
+
+          expect(nfs.mount_point.in_etc_fstab?).to eq(true)
+        end
+      end
+
+      context "and the NFS share does no exist in the system yet" do
+        let(:spec) { "nfs.example.com:/home/test" }
+
+        include_examples "new_entry"
+      end
+
+      context "and the NFS share already exists in the system" do
+        let(:spec) { "nfs.example.com:/foo" }
+
+        before do
+          # Set mount point properties of the existing NFS share. This 
configuration should not be
+          # propagated to the new NFS share.
+          nfs = nfs(spec)
+          nfs.mount_point.active = false
+          nfs.mount_point.in_etc_fstab = false
+        end
+
+        include_examples "remove_entry"
+
+        include_examples "new_entry"
+      end
+    end
+
+    context "when the entry is not new" do
+      before do
+        entry = entry(spec)
+        entry["new"] = false
+      end
+
+      let(:spec) { "nfs.example.com:/foo" }
+
+      include_examples "remove_entry"
+
+      context "and the entry corresponds to a mounted NFS share" do
+        before do
+          probed_nfs(spec).mount_point.active = true
+        end
+
+        it "creates a NFS share with active mount point" do
+          subject.WriteOnly
+
+          expect(nfs(spec).mount_point.active?).to eq(true)
+        end
+      end
+
+      context "and the entry corresponds to an unmounted NFS share" do
+        before do
+          probed_nfs(spec).mount_point.active = false
+        end
+
+        it "creates a NFS share with inactive mount point" do
+          subject.WriteOnly
+
+          expect(nfs(spec).mount_point.active?).to eq(false)
+        end
+      end
+
+      context "and the entry corresponds to a NFS share included in the fstab" 
do
+        before do
+          probed_nfs(spec).mount_point.in_etc_fstab = true
+        end
+
+        it "creates a NFS share that would be written to the fstab" do
+          subject.WriteOnly
+
+          expect(nfs(spec).mount_point.in_etc_fstab?).to eq(true)
+        end
+      end
+
+      context "and the entry corresponds to a NFS that is not included in the 
fstab" do
+        before do
+          probed_nfs(spec).mount_point.in_etc_fstab = false
+        end
+
+        it "creates a NFS share that would not be written to the fstab" do
+          subject.WriteOnly
+
+          expect(nfs(spec).mount_point.in_etc_fstab?).to eq(false)
+        end
+      end
+    end
   end
 
   describe ".Write" do
-    let(:written) { false }
-    let(:portmapper) { "rpcbind" }
-
     before do
-      subject.instance_variable_set("@portmapper", portmapper)
       allow(subject).to receive(:WriteOnly).and_return(written)
+
       allow(Yast::Wizard)
       allow(Yast::Progress).to receive(:set)
       allow(Yast::Service).to receive(:Start)
       allow(Yast::Service).to receive(:Stop)
       allow(Yast::Service).to receive(:active?)
+
+      allow_read_side_effects
+      mock_entries
     end
 
+    let(:written) { false }
+
     it "writes the nfs configurations" do
       expect(subject).to receive(:WriteOnly)
       subject.Write()
@@ -305,14 +477,9 @@
     context "when the configuration is written correctly" do
       let(:written) { true }
 
-      it "stops the nfs service" do
-        expect(Yast::Service).to receive(:Stop).with("nfs")
-        subject.Write()
-      end
-
       it "tries to start the portmapper service if it is not running" do
-        expect(Yast::Service).to 
receive(:active?).with(portmapper).and_return(false)
-        expect(Yast::Service).to receive(:Start).with(portmapper)
+        expect(Yast::Service).to 
receive(:active?).with("rpcbind").and_return(false)
+        expect(Yast::Service).to receive(:Start).with("rpcbind")
         subject.Write()
       end
 
@@ -332,7 +499,6 @@
           expect(subject.Write).to eql(false)
         end
       end
-
     end
 
     context "when the configuration is not written correctly" do
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-nfs-client-4.2.4/test/routines_test.rb 
new/yast2-nfs-client-4.2.6/test/routines_test.rb
--- old/yast2-nfs-client-4.2.4/test/routines_test.rb    2020-01-09 
16:00:38.000000000 +0100
+++ new/yast2-nfs-client-4.2.6/test/routines_test.rb    2020-01-24 
14:43:03.000000000 +0100
@@ -1,4 +1,24 @@
-#! /usr/bin/env rspec
+#!/usr/bin/env rspec
+
+# Copyright (c) [2017-2020] SUSE LLC
+#
+# All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 of the GNU General Public License as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, contact SUSE LLC.
+#
+# To contact SUSE LLC about this file by physical or electronic mail, you may
+# find current contact information at www.suse.com
+
 require_relative "spec_helper"
 
 module Yast
@@ -139,6 +159,12 @@
   end
 
   describe "#FstabTableItems" do
+    before do
+      Y2Storage::StorageManager.create_test_instance
+    end
+
+    let(:working_graph) { Y2Storage::StorageManager.instance.staging }
+
     context "given a list of nfs fstab entries" do
       it "returns a list of ui table items" do
         items = subject.FstabTableItems(nfs_entries)
@@ -146,10 +172,88 @@
         expect(items.size).to eql(3)
         expect(items.first.params[1]).to eql("foo.bar.com ")
         expect(items.first.params[2]).to eql("/home ")
-        expect(items.first.params[2]).to eql("/home ")
+        expect(items.first.params[3]).to eql("/home* ")
         expect(items.first.params[4]).to eql("Any (Please Check) ")
         expect(items.first.params[5]).to eql("defaults ")
       end
+
+      context "and an entry corresponds to a mounted NFS share" do
+        before do
+          nfs = Y2Storage::Filesystems::Nfs.create(working_graph, "srv", 
"/home/test")
+          nfs.mount_path = "/home/test"
+          nfs.mount_point.active = true
+        end
+
+        let(:nfs_entries) do
+          [
+            {
+              "spec"    => "srv:/home/test",
+              "file"    => "/home/test",
+              "freq"    => 0,
+              "mntops"  => "defaults",
+              "passno"  => 0,
+              "vfstype" => "nfs"
+            }
+          ]
+        end
+
+        it "does not append an asterisk to the mount path of the mounted NFS 
share" do
+          # Note that the mount point of "srv:/home/test" is active
+          items = subject.FstabTableItems(nfs_entries)
+
+          expect(items.first.params[1]).to eql("srv ")
+          expect(items.first.params[2]).to eql("/home/test ")
+          expect(items.first.params[3]).to eql("/home/test ")
+        end
+      end
+
+      context "and an entry corresponds to an unmounted NFS share" do
+        before do
+          nfs = Y2Storage::Filesystems::Nfs.create(working_graph, "srv", 
"/home/test")
+          nfs.mount_path = "/home/test"
+          nfs.mount_point.active = false
+        end
+
+        let(:nfs_entries) do
+          [
+            {
+              "spec"    => "srv:/home/test",
+              "file"    => "/home/test",
+              "freq"    => 0,
+              "mntops"  => "defaults",
+              "passno"  => 0,
+              "vfstype" => "nfs",
+              "new"     => new_entry
+            }
+          ]
+        end
+
+        context "and the entry is new" do
+          let(:new_entry) { true }
+
+          it "does not append an asterisk to the mount path of the new NFS 
share" do
+            # Note that the mount point of "srv:/home/test" is inactive
+            items = subject.FstabTableItems(nfs_entries)
+
+            expect(items.first.params[1]).to eql("srv ")
+            expect(items.first.params[2]).to eql("/home/test ")
+            expect(items.first.params[3]).to eql("/home/test ")
+          end
+        end
+
+        context "and the entry is not new" do
+          let(:new_entry) { false }
+
+          it "appends an asterisk to the mount path of the unmounted NFS 
share" do
+            # Note that the mount point of "srv:/home/a" is inactive
+            items = subject.FstabTableItems(nfs_entries)
+
+            expect(items.first.params[1]).to eql("srv ")
+            expect(items.first.params[2]).to eql("/home/test ")
+            expect(items.first.params[3]).to eql("/home/test* ")
+          end
+        end
+      end
     end
   end
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-nfs-client-4.2.4/test/ui_test.rb 
new/yast2-nfs-client-4.2.6/test/ui_test.rb
--- old/yast2-nfs-client-4.2.4/test/ui_test.rb  2020-01-09 16:00:38.000000000 
+0100
+++ new/yast2-nfs-client-4.2.6/test/ui_test.rb  2020-01-24 14:43:03.000000000 
+0100
@@ -1,4 +1,24 @@
-#! /usr/bin/env rspec
+#!/usr/bin/env rspec
+
+# Copyright (c) [2018-2020] SUSE LLC
+#
+# All Rights Reserved.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of version 2 of the GNU General Public License as published
+# by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, contact SUSE LLC.
+#
+# To contact SUSE LLC about this file by physical or electronic mail, you may
+# find current contact information at www.suse.com
+
 require_relative "spec_helper"
 
 module Yast


Reply via email to