Hello community,

here is the log from the commit of package yast2-network for openSUSE:Factory 
checked in at 2020-01-17 16:03:44
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/yast2-network (Old)
 and      /work/SRC/openSUSE:Factory/.yast2-network.new.26092 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "yast2-network"

Fri Jan 17 16:03:44 2020 rev:417 rq:765175 version:4.2.45

Changes:
--------
--- /work/SRC/openSUSE:Factory/yast2-network/yast2-network.changes      
2020-01-11 14:47:43.469366874 +0100
+++ /work/SRC/openSUSE:Factory/.yast2-network.new.26092/yast2-network.changes   
2020-01-17 16:03:50.484396171 +0100
@@ -1,0 +2,18 @@
+Wed Jan 15 09:55:05 UTC 2020 - Knut Anderssen <[email protected]>
+
+- bsc#1158025
+  - When touching existent udev rules, modify only the parts that
+    are relevant or have changed.
+  - When the hardware is read, use the parent_bus_id as the busid
+    for virtio netcards.
+- 4.2.45
+
+-------------------------------------------------------------------
+Wed Jan 15 08:14:48 UTC 2020 - Knut Anderssen <[email protected]>
+
+- bsc#1156106
+  - Fixed the initialization of DNS.dhcp_hostname by the
+    inst_setup_dhcp client
+- 4.2.44
+
+-------------------------------------------------------------------

Old:
----
  yast2-network-4.2.43.tar.bz2

New:
----
  yast2-network-4.2.45.tar.bz2

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

Other differences:
------------------
++++++ yast2-network.spec ++++++
--- /var/tmp/diff_new_pack.2iV8Pq/_old  2020-01-17 16:03:51.636396716 +0100
+++ /var/tmp/diff_new_pack.2iV8Pq/_new  2020-01-17 16:03:51.648396721 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           yast2-network
-Version:        4.2.43
+Version:        4.2.45
 Release:        0
 Summary:        YaST2 - Network Configuration
 License:        GPL-2.0-only

++++++ yast2-network-4.2.43.tar.bz2 -> yast2-network-4.2.45.tar.bz2 ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-network-4.2.43/.rubocop.yml 
new/yast2-network-4.2.45/.rubocop.yml
--- old/yast2-network-4.2.43/.rubocop.yml       2020-01-10 11:27:21.000000000 
+0100
+++ new/yast2-network-4.2.45/.rubocop.yml       2020-01-17 10:56:01.000000000 
+0100
@@ -14,6 +14,7 @@
   Max: 86
   Exclude:
     - "test/**/*"
+    - "src/include/network/routines.rb"
 
 # Offense count: 5
 # Configuration parameters: CountComments.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-network-4.2.43/package/yast2-network.changes 
new/yast2-network-4.2.45/package/yast2-network.changes
--- old/yast2-network-4.2.43/package/yast2-network.changes      2020-01-10 
11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/package/yast2-network.changes      2020-01-17 
10:56:01.000000000 +0100
@@ -1,4 +1,22 @@
 -------------------------------------------------------------------
+Wed Jan 15 09:55:05 UTC 2020 - Knut Anderssen <[email protected]>
+
+- bsc#1158025
+  - When touching existent udev rules, modify only the parts that
+    are relevant or have changed.
+  - When the hardware is read, use the parent_bus_id as the busid
+    for virtio netcards.
+- 4.2.45
+
+-------------------------------------------------------------------
+Wed Jan 15 08:14:48 UTC 2020 - Knut Anderssen <[email protected]>
+
+- bsc#1156106
+  - Fixed the initialization of DNS.dhcp_hostname by the
+    inst_setup_dhcp client
+- 4.2.44
+
+-------------------------------------------------------------------
 Mon Jan  6 11:54:00 UTC 2020 - Martin Vidner <[email protected]>
 
 - Add a sanity test for CLI error code reporting (bsc#1144351)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-network-4.2.43/package/yast2-network.spec 
new/yast2-network-4.2.45/package/yast2-network.spec
--- old/yast2-network-4.2.43/package/yast2-network.spec 2020-01-10 
11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/package/yast2-network.spec 2020-01-17 
10:56:01.000000000 +0100
@@ -17,7 +17,7 @@
 
 
 Name:           yast2-network
-Version:        4.2.43
+Version:        4.2.45
 Release:        0
 Summary:        YaST2 - Network Configuration
 License:        GPL-2.0-only
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-network-4.2.43/src/include/network/routines.rb 
new/yast2-network-4.2.45/src/include/network/routines.rb
--- old/yast2-network-4.2.43/src/include/network/routines.rb    2020-01-10 
11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/src/include/network/routines.rb    2020-01-17 
10:56:01.000000000 +0100
@@ -535,7 +535,12 @@
 
           one["bus"] = bus
           one["busid"] = card["sysfs_bus_id"] || ""
-          one["parent_busid"] = one["sysfs_id"].split("/")[-2] if 
one["busid"].start_with?("virtio")
+
+          if one["busid"].start_with?("virtio")
+            one["sub_device_busid"] = one["busid"]
+            one["busid"] = one["sysfs_id"].split("/")[-2]
+          end
+
           one["mac"] = Ops.get_string(resource, ["hwaddr", 0, "addr"], "")
           one["permanent_mac"] = Ops.get_string(resource, ["phwaddr", 0, 
"addr"], "")
           # is the cable plugged in? nil = don't know
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-network-4.2.43/src/lib/network/clients/inst_setup_dhcp.rb 
new/yast2-network-4.2.45/src/lib/network/clients/inst_setup_dhcp.rb
--- old/yast2-network-4.2.43/src/lib/network/clients/inst_setup_dhcp.rb 
2020-01-10 11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/src/lib/network/clients/inst_setup_dhcp.rb 
2020-01-17 10:56:01.000000000 +0100
@@ -62,13 +62,14 @@
     # linuxrc sethostname cmdline option if provided or the default value
     # defined in the control file if not.
     def set_dhcp_hostname!
-      DNS.dhcp_hostname =
+      set_dhcp_hostname =
         set_hostname_used? ? set_dhcp_hostname? : DNS.default_dhcp_hostname
 
-      log.info("Write dhcp hostname default: #{DNS.dhcp_hostname}")
+      log.info("Write dhcp hostname default: #{set_dhcp_hostname}")
+      DNS.dhcp_hostname = set_dhcp_hostname ? :any : :none
       SCR.Write(
         Yast::Path.new(".sysconfig.network.dhcp.DHCLIENT_SET_HOSTNAME"),
-        DNS.dhcp_hostname ? "yes" : "no"
+        (DNS.dhcp_hostname == :any) ? "yes" : "no"
       )
       # Flush cache
       SCR.Write(
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-network-4.2.43/src/lib/y2network/interface.rb 
new/yast2-network-4.2.45/src/lib/y2network/interface.rb
--- old/yast2-network-4.2.43/src/lib/y2network/interface.rb     2020-01-10 
11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/src/lib/y2network/interface.rb     2020-01-17 
10:56:01.000000000 +0100
@@ -19,6 +19,7 @@
 
 require "yast"
 require "y2network/interface_type"
+require "y2network/udev_rule"
 
 module Y2Network
   # Network interface.
@@ -45,6 +46,8 @@
     attr_accessor :type
     # @return [HwInfo]
     attr_reader :hardware
+    # @return [UdevRule]
+    attr_accessor :udev_rule
     # @return [Symbol] Mechanism to rename the interface (:none -no rename-, 
:bus_id or :mac)
     attr_accessor :renaming_mechanism
     # @return [String,nil]
@@ -109,5 +112,25 @@
       @name = new_name
       @renaming_mechanism = mechanism
     end
+
+    # Updates or creates the associated udev rule depending on the renaming
+    # mechanism selected
+    #
+    # @return [UdevRule] udev rule
+    def update_udev_rule
+      log.info("Updating udev rule for #{name} based on: 
#{renaming_mechanism.inspect}")
+
+      case renaming_mechanism
+      when :mac
+        udev_rule&.rename_by_mac(name, hardware.mac)
+
+        @udev_rule ||= Y2Network::UdevRule.new_mac_based_rename(name, 
hardware.mac)
+      when :bus_id
+        udev_rule&.rename_by_bus_id(name, hardware.busid, hardware.dev_port)
+
+        @udev_rule ||=
+          Y2Network::UdevRule.new_bus_id_based_rename(name, hardware.busid, 
hardware.dev_port)
+      end
+    end
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-network-4.2.43/src/lib/y2network/sysconfig/interfaces_reader.rb 
new/yast2-network-4.2.45/src/lib/y2network/sysconfig/interfaces_reader.rb
--- old/yast2-network-4.2.43/src/lib/y2network/sysconfig/interfaces_reader.rb   
2020-01-10 11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/src/lib/y2network/sysconfig/interfaces_reader.rb   
2020-01-17 10:56:01.000000000 +0100
@@ -124,6 +124,7 @@
       # @param hwinfo [Hash] hardware information
       def build_physical_interface(hwinfo)
         Y2Network::PhysicalInterface.new(hwinfo.dev_name, hardware: 
hwinfo).tap do |iface|
+          iface.udev_rule = UdevRule.find_for(iface.name)
           iface.renaming_mechanism = renaming_mechanism_for(iface)
           iface.custom_driver = custom_driver_for(iface)
           iface.type = InterfaceType.from_short_name(hwinfo.type) ||
@@ -154,7 +155,7 @@
       # @param iface [PhysicalInterface] Interface
       # @return [Symbol] :mac (MAC address), :bus_id (BUS ID) or :none (no 
renaming)
       def renaming_mechanism_for(iface)
-        rule = UdevRule.find_for(iface.name)
+        rule = iface.udev_rule
         return :none unless rule
 
         if rule.parts.any? { |p| p.key == "ATTR{address}" }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-network-4.2.43/src/lib/y2network/sysconfig/interfaces_writer.rb 
new/yast2-network-4.2.45/src/lib/y2network/sysconfig/interfaces_writer.rb
--- old/yast2-network-4.2.43/src/lib/y2network/sysconfig/interfaces_writer.rb   
2020-01-10 11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/src/lib/y2network/sysconfig/interfaces_writer.rb   
2020-01-17 10:56:01.000000000 +0100
@@ -44,20 +44,6 @@
 
     private
 
-      # Creates an udev rule to rename the given interface
-      #
-      # @param iface [Interface] Interface to generate the udev rule for
-      # @return [UdevRule,nil] udev rule or nil if it is not needed
-      def renaming_udev_rule_for(iface)
-        case iface.renaming_mechanism
-        when :mac
-          Y2Network::UdevRule.new_mac_based_rename(iface.name, 
iface.hardware.mac)
-        when :bus_id
-          Y2Network::UdevRule.new_bus_id_based_rename(iface.name, 
iface.hardware.busid,
-            iface.hardware.dev_port)
-        end
-      end
-
       # Creates an udev rule to set the driver for the given interface
       #
       # @param iface [Interface] Interface to generate the udev rule for
@@ -77,8 +63,13 @@
         reload_udev_rules
       end
 
+      # Writes down the current interfaces udev rules and the custom rules that
+      # were present when read and that are still valid
+      #
+      # @see Y2Network::UdevRule#write_net_rules
       def update_renaming_udev_rules(interfaces)
-        udev_rules = interfaces.map { |i| renaming_udev_rule_for(i) }.compact
+        udev_rules = interfaces.map(&:update_udev_rule).compact
+
         known_names = interfaces.known_names
         custom_rules = Y2Network::UdevRule.naming_rules.reject do |u|
           known_names.include?(u.device)
@@ -86,6 +77,7 @@
         Y2Network::UdevRule.write_net_rules(custom_rules + udev_rules)
       end
 
+      # @see Y2Network::UdevRule#write_drivers_rules
       def update_drivers_udev_rules(interfaces)
         udev_rules = interfaces.map { |i| driver_udev_rule_for(i) }.compact
         Y2Network::UdevRule.write_drivers_rules(udev_rules)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-network-4.2.43/src/lib/y2network/udev_rule.rb 
new/yast2-network-4.2.45/src/lib/y2network/udev_rule.rb
--- old/yast2-network-4.2.43/src/lib/y2network/udev_rule.rb     2020-01-10 
11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/src/lib/y2network/udev_rule.rb     2020-01-17 
10:56:01.000000000 +0100
@@ -169,7 +169,7 @@
       # @param udev_rules [Array<UdevRule>] List of udev rules
       def write_drivers_rules(udev_rules)
         rules_hash = udev_rules.each_with_object({}) do |rule, hash|
-          driver = rule.part_value_for("ENV{MODALIAS}", "=")
+          driver = rule.driver
           next unless driver
 
           hash[driver] = rule.parts.map(&:to_s)
@@ -252,6 +252,49 @@
       part_value_for("ATTR{address}")
     end
 
+    # Convenience method to replace a specific part by another one. In case
+    # that there is no part to be replaced then a new part is added.
+    #
+    # @param key      [String] Key name
+    # @param operator [String] Operator
+    # @param value    [String] Value to match or assign
+    # @see #add_part
+    def replace_part(key, operator, value)
+      part = part_by_key(key, operator)
+      if part
+        part.value = value
+      else
+        add_part(key, operator, value)
+      end
+    end
+
+    # Convenience method which takes care of modifing the udev rule using the
+    # MAC address as the naming mechanism
+    def rename_by_mac(name, address)
+      parts.delete_if(&:dev_port?)
+      part = part_by_key("KERNELS")
+      part.key = "ATTR{address}" if part
+
+      replace_part("ATTR{address}", "==", address) if mac != address
+      ## Ensure the name is always at the end of the rule
+      parts.delete_if { |p| p.dev_port? || p.name? }
+      add_part("NAME", "=", name)
+    end
+
+    # Convenience method which takes care of modifing the udev rule using the
+    # bus_id and the dev_port when needed as the naming mechanism
+    def rename_by_bus_id(name, bus_id_value, dev_port_value = nil)
+      parts.delete_if { |p| (p.dev_port? && dev_port_value.nil?) }
+      part = part_by_key("ATTR{address}")
+      part.key = "KERNELS" if part
+
+      replace_part("KERNELS", "==", bus_id_value) if bus_id != bus_id_value
+      replace_part("ATTR{dev_port}", "==", dev_port_value) if dev_port != 
dev_port_value
+      ## Ensure the name is always at the end of the rule
+      parts.delete_if(&:name?)
+      add_part("NAME", "=", name)
+    end
+
     # Returns the BUS ID in the udev rule
     #
     # @return [String,nil] BUS ID or nil if not found
@@ -288,5 +331,12 @@
     def driver
       part_value_for("ENV{MODALIAS}", "=")
     end
+
+    # Returns the drivers mentioned in the rule (if any)
+    #
+    # @return [String,nil] drivers or nil if not found
+    def drivers
+      part_value_for("DRIVERS", "==")
+    end
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-network-4.2.43/src/lib/y2network/udev_rule_part.rb 
new/yast2-network-4.2.45/src/lib/y2network/udev_rule_part.rb
--- old/yast2-network-4.2.43/src/lib/y2network/udev_rule_part.rb        
2020-01-10 11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/src/lib/y2network/udev_rule_part.rb        
2020-01-17 10:56:01.000000000 +0100
@@ -92,5 +92,32 @@
     def to_s
       "#{key}#{operator}\"#{value}\""
     end
+
+    # Return whether the udev rule part is the interface bus_id or not
+    # @return [Boolean]
+    def bus_id?
+      (key == "KERNELS") && (operator == "==")
+    end
+
+    # Return whether the udev rule part is the interface dev_port or not
+    #
+    # @return [Boolean]
+    def dev_port?
+      (key == "ATTR{dev_port}") && (operator == "==")
+    end
+
+    # Return whether the udev rule part is the interface MAC address or not
+    #
+    # @return [Boolean]
+    def mac?
+      (key == "ATTR{address}") && (operator == "==")
+    end
+
+    # Return whether the udev rule part is the interface name or not
+    #
+    # @return [Boolean]
+    def name?
+      (key == "NAME") && (operator == "=")
+    end
   end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-network-4.2.43/test/data/hardware.yml 
new/yast2-network-4.2.45/test/data/hardware.yml
--- old/yast2-network-4.2.43/test/data/hardware.yml     2020-01-10 
11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/test/data/hardware.yml     2020-01-17 
10:56:01.000000000 +0100
@@ -19,8 +19,8 @@
   module: virtio_net
   options: ''
   bus: Virtio
-  busid: virtio0
-  parent_busid: '0000:01:00.0'
+  busid: '0000:01:00.0'
+  sub_device_busid: virtio0
   mac: 52:54:00:68:54:fb
   permanent_mac: 52:54:00:68:54:fb
   link: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/yast2-network-4.2.43/test/inst_setup_dhcp_test.rb 
new/yast2-network-4.2.45/test/inst_setup_dhcp_test.rb
--- old/yast2-network-4.2.43/test/inst_setup_dhcp_test.rb       2020-01-10 
11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/test/inst_setup_dhcp_test.rb       2020-01-17 
10:56:01.000000000 +0100
@@ -121,7 +121,7 @@
 
       it "sets DNS.dhcp_hostname according to the linuxrc sethosname value" do
         expect(subject).to receive(:set_dhcp_hostname?).and_return(false)
-        expect(Yast::DNS).to receive(:dhcp_hostname=).with(false)
+        expect(Yast::DNS).to receive(:dhcp_hostname=).with(:none)
 
         subject.set_dhcp_hostname!
       end
@@ -132,22 +132,44 @@
         allow(subject).to receive(:set_hostname_used?).and_return(false)
       end
 
-      it "sets DNS.dhcp_hostname according to DNS.default_dhcp_hostname" do
-        expect(subject).to_not receive(:set_dhcp_hostname?)
-        expect(Yast::DNS).to receive(:default_dhcp_hostname).and_return(true)
-        expect(Yast::DNS).to receive(:dhcp_hostname=).with(true)
+      context "and the DNS.default_dhcp_hostname is true" do
+        it "sets the DNS.dhcp_hostname to :any" do
+          expect(subject).to_not receive(:set_dhcp_hostname?)
+          expect(Yast::DNS).to receive(:default_dhcp_hostname).and_return(true)
+          expect(Yast::DNS).to receive(:dhcp_hostname=).with(:any)
+          subject.set_dhcp_hostname!
+        end
+      end
 
-        subject.set_dhcp_hostname!
+      context "and the DNS.default_dhcp_hostname is false" do
+        it "sets the DNS.dhcp_hostname to :none" do
+          expect(subject).to_not receive(:set_dhcp_hostname?)
+          expect(Yast::DNS).to 
receive(:default_dhcp_hostname).and_return(false)
+          expect(Yast::DNS).to receive(:dhcp_hostname=).with(:none)
+          subject.set_dhcp_hostname!
+        end
       end
     end
 
     context "once initialized DNS.dhcp_hostname" do
-      it "writes global DHCLIENT_SET_HOSTNAME in /etc/sysconfig/network/dhcp 
with it" do
-        allow(Yast::DNS).to receive(:dhcp_hostname=)
-        allow(Yast::DNS).to receive(:dhcp_hostname).and_return(false)
-        expect(Yast::SCR).to receive(:Write).with(dhclient_set_hostname_path, 
"no")
+      context "when it is :any" do
+        it "writes global DHCLIENT_SET_HOSTNAME in /etc/sysconfig/network/dhcp 
as 'yes'" do
+          allow(Yast::DNS).to receive(:dhcp_hostname=)
+          allow(Yast::DNS).to receive(:dhcp_hostname).and_return(:any)
+          expect(Yast::SCR).to 
receive(:Write).with(dhclient_set_hostname_path, "yes")
 
-        subject.set_dhcp_hostname!
+          subject.set_dhcp_hostname!
+        end
+      end
+
+      context "when it is :none" do
+        it "writes global DHCLIENT_SET_HOSTNAME in /etc/sysconfig/network/dhcp 
as 'no'" do
+          allow(Yast::DNS).to receive(:dhcp_hostname=)
+          allow(Yast::DNS).to receive(:dhcp_hostname).and_return(:none)
+          expect(Yast::SCR).to 
receive(:Write).with(dhclient_set_hostname_path, "no")
+
+          subject.set_dhcp_hostname!
+        end
       end
     end
   end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-network-4.2.43/test/y2network/interface_test.rb 
new/yast2-network-4.2.45/test/y2network/interface_test.rb
--- old/yast2-network-4.2.43/test/y2network/interface_test.rb   2020-01-10 
11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/test/y2network/interface_test.rb   2020-01-17 
10:56:01.000000000 +0100
@@ -104,4 +104,55 @@
       expect(interface.drivers).to eq([driver])
     end
   end
+
+  describe "#update_udev_rule" do
+    let(:udev_rule) { Y2Network::UdevRule.new_mac_based_rename("eth0", 
"01:23:45:67:89:ab") }
+    let(:renaming_mechanism) { :mac }
+    let(:driver) { nil }
+    subject(:interface) do
+      Y2Network::PhysicalInterface.new("eth0", hardware: hardware).tap do |i|
+        i.renaming_mechanism = renaming_mechanism
+        i.custom_driver = driver
+        i.udev_rule = udev_rule
+      end
+    end
+
+    let(:hardware) do
+      instance_double(
+        Y2Network::Hwinfo, name: "Ethernet Card 0", busid: "00:1c.0", mac: 
"01:23:45:67:89:ab",
+        dev_port: "1", modalias: "virtio:d00000001v00001AF4"
+      )
+    end
+
+    context "when the interface renaming mechanism is changed" do
+      context "and the interface already has an udev rule" do
+        let(:udev_rule) do
+          rule = Y2Network::UdevRule.new_bus_id_based_rename("eth0", 
"00:1c.0", "1")
+          rule.replace_part("DRIVERS", "==", "e1000e")
+          rule
+        end
+
+        it "updates the udev rule parts that have changed" do
+          expect(interface.udev_rule.bus_id).to eq("00:1c.0")
+          interface.update_udev_rule
+          expect(interface.udev_rule.mac).to eq("01:23:45:67:89:ab")
+          expect(interface.udev_rule.bus_id).to be_nil
+          expect(interface.udev_rule.drivers).to eq("e1000e")
+        end
+      end
+
+      context "and the interface does not have an udev rule" do
+        let(:udev_rule) { nil }
+        let(:renaming_mechanism) { :bus_id }
+        let(:new_busid_udev_rule) do
+          Y2Network::UdevRule.new_bus_id_based_rename("eth0", "00:1c.0", "1")
+        end
+
+        it "assigns a new udev rule based on the selected renaming mechanism" 
do
+          expect { interface.update_udev_rule }.to change { 
interface.udev_rule.to_s }
+            .from("").to(new_busid_udev_rule.to_s)
+        end
+      end
+    end
+  end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-network-4.2.43/test/y2network/sysconfig/interfaces_reader_test.rb 
new/yast2-network-4.2.45/test/y2network/sysconfig/interfaces_reader_test.rb
--- old/yast2-network-4.2.43/test/y2network/sysconfig/interfaces_reader_test.rb 
2020-01-10 11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/test/y2network/sysconfig/interfaces_reader_test.rb 
2020-01-17 10:56:01.000000000 +0100
@@ -82,6 +82,11 @@
       expect(eth0.renaming_mechanism).to eq(:mac)
     end
 
+    it "sets each interface udev rule" do
+      eth0 = reader.interfaces.by_name("eth0")
+      expect(eth0.udev_rule).to eq(udev_rule)
+    end
+
     it "reads wifi interfaces"
     it "reads bridge interfaces"
     it "reads bonding interfaces"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-network-4.2.43/test/y2network/sysconfig/interfaces_writer_test.rb 
new/yast2-network-4.2.45/test/y2network/sysconfig/interfaces_writer_test.rb
--- old/yast2-network-4.2.43/test/y2network/sysconfig/interfaces_writer_test.rb 
2020-01-10 11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/test/y2network/sysconfig/interfaces_writer_test.rb 
2020-01-17 10:56:01.000000000 +0100
@@ -44,6 +44,7 @@
     end
     let(:renaming_mechanism) { :none }
     let(:driver) { nil }
+    let(:naming_rules) { [] }
     let(:scr_root) { Dir.mktmpdir }
 
     before do
@@ -51,7 +52,7 @@
       allow(writer).to receive(:sleep)
 
       # prevent collision with real hardware
-      allow(Y2Network::UdevRule).to receive(:naming_rules).and_return([])
+      allow(Y2Network::UdevRule).to 
receive(:naming_rules).and_return(naming_rules)
       allow(Y2Network::UdevRule).to receive(:drivers_rules).and_return([])
     end
 
@@ -98,6 +99,26 @@
           end
           subject.write(interfaces)
         end
+
+        context "and the interface already has an udev rule" do
+          let(:eth0_udev_rule) do
+            rule = Y2Network::UdevRule.new_bus_id_based_rename("eth0", 
"00:1c.0", "1")
+            rule.replace_part("DRIVERS", "==", "e1000e")
+            rule
+          end
+
+          it "touches only the udev keys affected by the change" do
+            eth0.udev_rule = eth0_udev_rule
+            expect(Y2Network::UdevRule).to receive(:write_net_rules) do |rules|
+              expect(rules.first.to_s).to eq(
+                "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"e1000e\", " \
+                  "ATTR{type}==\"1\", ATTR{address}==\"01:23:45:67:89:ab\", " \
+                  "NAME=\"eth1\""
+              )
+            end
+            subject.write(interfaces)
+          end
+        end
       end
 
       context "when the interface is renamed using the BUS ID" do
@@ -107,21 +128,41 @@
           expect(Y2Network::UdevRule).to receive(:write_net_rules) do |rules|
             expect(rules.first.to_s).to eq(
               "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"?*\", " \
-                "ATTR{type}==\"1\", KERNELS==\"00:1c.0\", 
ATTR{dev_port}==\"1\", NAME=\"eth1\""
+                "ATTR{type}==\"1\", KERNELS==\"00:1c.0\", 
ATTR{dev_port}==\"1\", " \
+                "NAME=\"eth1\""
             )
           end
           subject.write(interfaces)
         end
+
+        context "and the interface already has an udev rule" do
+          let(:eth0_udev_rule) do
+            rule = Y2Network::UdevRule.new_mac_based_rename("eth0", 
"00:11:22:33:44:55:66")
+            rule.replace_part("DRIVERS", "==", "e1000e")
+            rule
+          end
+
+          it "touches only the udev keys affected by the change" do
+            eth0.udev_rule = eth0_udev_rule
+            expect(Y2Network::UdevRule).to receive(:write_net_rules) do |rules|
+              expect(rules.first.to_s).to eq(
+                "SUBSYSTEM==\"net\", ACTION==\"add\", DRIVERS==\"e1000e\", " \
+                  "ATTR{type}==\"1\", ATTR{dev_id}==\"0x0\", 
KERNELS==\"00:1c.0\", " \
+                  "ATTR{dev_port}==\"1\", NAME=\"eth1\""
+              )
+            end
+
+            subject.write(interfaces)
+          end
+        end
+
       end
 
       context "when there is some rule for an unknown interface" do
         let(:unknown_rule) do
           Y2Network::UdevRule.new_mac_based_rename("unknown", 
"00:11:22:33:44:55:66")
         end
-
-        before do
-          allow(Y2Network::UdevRule).to 
receive(:naming_rules).and_return([unknown_rule])
-        end
+        let(:naming_rules) { [unknown_rule] }
 
         it "keeps the rule" do
           expect(Y2Network::UdevRule).to receive(:write_net_rules) do |rules|
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-network-4.2.43/test/y2network/udev_rule_part_test.rb 
new/yast2-network-4.2.45/test/y2network/udev_rule_part_test.rb
--- old/yast2-network-4.2.43/test/y2network/udev_rule_part_test.rb      
2020-01-10 11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/test/y2network/udev_rule_part_test.rb      
2020-01-17 10:56:01.000000000 +0100
@@ -80,4 +80,69 @@
       end
     end
   end
+
+  describe "#mac?" do
+    context "when the part is a MAC address" do
+      let(:key) { "ATTR{address}" }
+
+      it "returns true" do
+        expect(part.mac?).to eq(true)
+      end
+    end
+
+    context "otherwise" do
+      it "returns false" do
+        expect(part.mac?).to eq(false)
+      end
+    end
+  end
+
+  describe "#bus_id?" do
+    context "when the part is a BUS ID" do
+      let(:key) { "KERNELS" }
+
+      it "returns true" do
+        expect(part.bus_id?).to eq(true)
+      end
+    end
+
+    context "otherwise" do
+      it "returns false" do
+        expect(part.bus_id?).to eq(false)
+      end
+    end
+  end
+
+  describe "#dev_port?" do
+    context "when the part is a dev port" do
+      let(:key) { "ATTR{dev_port}" }
+
+      it "returns true" do
+        expect(part.dev_port?).to eq(true)
+      end
+    end
+
+    context "otherwise" do
+      it "returns false" do
+        expect(part.dev_port?).to eq(false)
+      end
+    end
+  end
+
+  describe "#name?" do
+    context "when the part is a device name" do
+      let(:key) { "NAME" }
+      let(:operator) { "=" }
+
+      it "returns true" do
+        expect(part.name?).to eq(true)
+      end
+    end
+
+    context "otherwise" do
+      it "returns false" do
+        expect(part.name?).to eq(false)
+      end
+    end
+  end
 end
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/yast2-network-4.2.43/test/y2network/udev_rule_test.rb 
new/yast2-network-4.2.45/test/y2network/udev_rule_test.rb
--- old/yast2-network-4.2.43/test/y2network/udev_rule_test.rb   2020-01-10 
11:27:21.000000000 +0100
+++ new/yast2-network-4.2.45/test/y2network/udev_rule_test.rb   2020-01-17 
10:56:01.000000000 +0100
@@ -152,6 +152,24 @@
     end
   end
 
+  describe "#replace_part" do
+    let(:rule_part) { Y2Network::UdevRulePart.new("ATTR{address}", "==", 
"01:23:45:67:89:ab") }
+    context "when there is no udev part for the given 'key' and 'operator'" do
+      it "adds a new part with the given options" do
+        expect { udev_rule.replace_part("ATTR{address}", "==", 
"01:23:45:67:89:ab") }
+          .to change { udev_rule.parts }.from([]).to([rule_part])
+      end
+    end
+
+    context "when there is a udev part to be replaced by" do
+      it "replaces  the value of the part with the one given" do
+        udev_rule.add_part("NAME", "=", "eth0")
+        udev_rule.replace_part("NAME", "=", "eth1")
+        expect(udev_rule.device).to eq("eth1")
+      end
+    end
+  end
+
   describe "#to_s" do
     let(:parts) do
       [


Reply via email to