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 [
