Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merge SLE-12-SP4 into SLE-15-GA #833

Merged
merged 12 commits into from Jun 12, 2019
11 changes: 11 additions & 0 deletions package/yast2-network.changes
@@ -1,3 +1,14 @@
-------------------------------------------------------------------
Mon Jun 10 11:55:48 UTC 2019 - Knut Anderssen <kanderssen@suse.com>

- bsc#1136929
- Use the hwinfo permanent mac address instead of the current mac
which could be wrong in case of an enslaved interface.
- bsc#1137324
- Do not create duplicate udev rule attributes when editing an
interface name.
- 4.0.50

-------------------------------------------------------------------
Mon May 20 14:04:47 UTC 2019 - Michal Filka <mfilka@suse.com>

Expand Down
2 changes: 1 addition & 1 deletion package/yast2-network.spec
Expand Up @@ -17,7 +17,7 @@


Name: yast2-network
Version: 4.0.49
Version: 4.0.50
Release: 0
BuildArch: noarch

Expand Down
5 changes: 3 additions & 2 deletions src/include/network/lan/complex.rb
Expand Up @@ -309,8 +309,9 @@ def UpdateSlaves
case LanItems.GetDeviceType(current)
when "bond"
LanItems.startmode = "hotplug"

LanItems.update_item_udev_rule!(:bus_id)
if LanItems.current_udev_rule.empty? || LanItems.GetItemUdev("KERNELS").empty?
LanItems.update_item_udev_rule!(:bus_id)
end
when "br"
LanItems.ipaddr = ""
end
Expand Down
1 change: 1 addition & 0 deletions src/include/network/routines.rb
Expand Up @@ -629,6 +629,7 @@ def ReadHardware(hwtype)
one["parent_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
one["link"] = Ops.get(resource, ["link", 0, "state"])

Expand Down
25 changes: 15 additions & 10 deletions src/lib/network/edit_nic_name.rb
Expand Up @@ -14,6 +14,11 @@ class EditNicName
include UIShortcuts
include I18n

# @return [String] current udev name before modifying it
attr_reader :old_name
# @return [String] current udev match criteria
attr_reader :old_key

# udev rule attribute for MAC address
MAC_UDEV_ATTR = "ATTR{address}".freeze

Expand All @@ -26,13 +31,16 @@ def initialize
Yast.include self, "network/routines.rb"

current_item = LanItems.getCurrentItem
current_rule = LanItems.current_udev_rule

@old_name = LanItems.current_udev_name
@old_key = MAC_UDEV_ATTR unless LanItems.GetItemUdev(MAC_UDEV_ATTR).empty?
@old_key = BUSID_UDEV_ATTR unless LanItems.GetItemUdev(BUSID_UDEV_ATTR).empty?
unless current_rule.empty?
@old_key = :mac unless LanItems.GetItemUdev(MAC_UDEV_ATTR).empty?
@old_key = :bus_id unless LanItems.GetItemUdev(BUSID_UDEV_ATTR).empty?
end

if current_item["hwinfo"]
@mac = current_item["hwinfo"]["mac"]
@mac = current_item["hwinfo"]["permanent_mac"]
@bus_id = current_item["hwinfo"]["busid"]
else
@mac = ""
Expand Down Expand Up @@ -67,12 +75,12 @@ def run

# FIXME: it changes udev key used for device identification
# and / or its value only, name is changed elsewhere
LanItems.update_item_udev_rule!(udev_type)
LanItems.update_item_udev_rule!(udev_type) if udev_type && (old_key != udev_type)
end

close

new_name || @old_name
new_name || old_name
end

private
Expand Down Expand Up @@ -118,11 +126,8 @@ def open
)
)

case @old_key
when MAC_UDEV_ATTR
UI.ChangeWidget(Id(:udev_type), :CurrentButton, :mac)
when BUSID_UDEV_ATTR
UI.ChangeWidget(Id(:udev_type), :CurrentButton, :bus_id)
if old_key
UI.ChangeWidget(Id(:udev_type), :CurrentButton, old_key)
else
Builtins.y2error("Unknown udev rule.")
end
Expand Down
2 changes: 1 addition & 1 deletion src/lib/network/network_autoyast.rb
Expand Up @@ -339,7 +339,7 @@ def assign_udevs_to_devs(udev_rules)
busid = i["hwinfo"]["busid"]
# Match also parent busid if exist (bsc#1129012)
parent_busid = i["hwinfo"]["parent_busid"] || busid
mac = i["hwinfo"]["mac"]
mac = i["hwinfo"]["permanent_mac"]

[busid, parent_busid, mac].any? { |v| v.casecmp(key).zero? }
end
Expand Down
35 changes: 22 additions & 13 deletions src/modules/LanItems.rb
Expand Up @@ -258,6 +258,13 @@ def GetDeviceName(item_id)
"" # this should never happen
end

# Convenience method to obtain the current Item udev rule
#
# @return [Array<String>] Item udev rule
def current_udev_rule
LanItems.GetItemUdevRule(LanItems.current)
end

# Returns name which is going to be used in the udev rule
def current_udev_name
if LanItems.current_renamed?
Expand Down Expand Up @@ -355,7 +362,7 @@ def InitItemUdevRule(item_id)
udev = GetItemUdevRule(item_id)
return udev if !udev.empty?

default_mac = GetLanItem(item_id).fetch("hwinfo", {})["mac"]
default_mac = GetLanItem(item_id).fetch("hwinfo", {})["permanent_mac"]
raise ArgumentError, "Cannot propose udev rule - NIC not present" if !default_mac

default_udev = GetDefaultUdevRule(
Expand Down Expand Up @@ -415,7 +422,7 @@ def getUdevFallback
if IsEmpty(udev_rules)
udev_rules = GetDefaultUdevRule(
GetCurrentName(),
Ops.get_string(getCurrentItem, ["hwinfo", "mac"], "")
Ops.get_string(getCurrentItem, ["hwinfo", "permanent_mac"], "")
)
Builtins.y2milestone(
"No Udev rules found, creating default: %1",
Expand All @@ -437,13 +444,11 @@ def GetItemUdev(key)
# @return [Object, nil] the current item's udev rule without the given key; nil if
# there is not udev rules for the current item
def RemoveItemUdev(key)
current_rule = LanItems.GetItemUdevRule(LanItems.current)
return nil if current_udev_rule.empty?

return nil if current_rule.empty?

log.info("Removing #{key} from #{current_rule}")
log.info("Removing #{key} from #{current_udev_rule}")
Items()[@current]["udev"]["net"] =
LanItems.RemoveKeyFromUdevRule(current_rule, key)
LanItems.RemoveKeyFromUdevRule(current_udev_rule, key)
end

# Updates the udev rule of the current Lan Item based on the key given
Expand All @@ -456,8 +461,13 @@ def RemoveItemUdev(key)
# @param based_on [Symbol] principal key to be matched, `:mac` or `:bus_id`
# @return [void]
def update_item_udev_rule!(based_on = :mac)
new_rule = current_udev_rule.empty?
LanItems.InitItemUdevRule(LanItems.current) if new_rule

case based_on
when :mac
return if new_rule

LanItems.RemoveItemUdev("ATTR{dev_port}")

# FIXME: While the user is able to modify the udev rule using the
Expand All @@ -467,7 +477,7 @@ def update_item_udev_rule!(based_on = :mac)
LanItems.ReplaceItemUdev(
"KERNELS",
"ATTR{address}",
LanItems.getCurrentItem.fetch("hwinfo", {}).fetch("mac", "")
LanItems.getCurrentItem.fetch("hwinfo", {}).fetch("permanent_mac", "")
)
when :bus_id
# Update or insert the dev_port if the sysfs dev_port attribute is present
Expand Down Expand Up @@ -506,7 +516,6 @@ def ReplaceItemUdev(replace_key, new_key, new_val)
# = for assignment
# == for equality checks
operator = new_key == "NAME" ? "=" : "=="
current_rule = GetItemUdevRule(@current)
rule = RemoveKeyFromUdevRule(getUdevFallback, replace_key)

# NAME="devname" has to be last in the rule.
Expand All @@ -516,7 +525,7 @@ def ReplaceItemUdev(replace_key, new_key, new_val)
new_rule = AddToUdevRule(rule, "#{new_key}#{operator}\"#{new_val}\"")
new_rule.push(name_tuple)

if current_rule.sort != new_rule.sort
if current_udev_rule.sort != new_rule.sort
SetModified()

log.info("ReplaceItemUdev: new udev rule = #{new_rule}")
Expand Down Expand Up @@ -1052,7 +1061,7 @@ def getDeviceName(oldname)

hardware.each do |hw|
hw_dev_name = hw["dev_name"] || ""
hw_dev_mac = hw["mac"] || ""
hw_dev_mac = hw["permanent_mac"] || ""
hw_dev_busid = hw["busid"] || ""

case oldname
Expand Down Expand Up @@ -1522,11 +1531,11 @@ def BuildLanOverview
conn = HTML.Bold(format("(%s)", _("Not connected"))) if !item_hwinfo["link"]
conn = HTML.Bold(format("(%s)", _("No hwinfo"))) if item_hwinfo.empty?

mac_dev = HTML.Bold("MAC : ") + item_hwinfo["mac"].to_s + "<br>"
mac_dev = HTML.Bold("MAC : ") + item_hwinfo["permanent_mac"].to_s + "<br>"
bus_id = HTML.Bold("BusID : ") + item_hwinfo["busid"].to_s + "<br>"
physical_port_id = HTML.Bold("PhysicalPortID : ") + physical_port_id(ifcfg_name) + "<br>"

rich << " " << conn << "<br>" << mac_dev if IsNotEmpty(item_hwinfo["mac"])
rich << " " << conn << "<br>" << mac_dev if IsNotEmpty(item_hwinfo["permanent_mac"])
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

NP: i know it is a merge but may be that we can start droping these IsNotEmptyhelpers

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

network-ng will kill it :P

rich << bus_id if IsNotEmpty(item_hwinfo["busid"])
rich << physical_port_id if physical_port_id?(ifcfg_name)
# display it only if we need it, don't duplicate "ifcfg_name" above
Expand Down
32 changes: 31 additions & 1 deletion test/edit_nic_name_test.rb
Expand Up @@ -19,7 +19,7 @@ module Yast
stub_const("NetworkInterfaces", double(adapt_old_config!: nil))

# mock devices configuration
allow(LanItems).to receive(:ReadHardware) { [{ "dev_name" => CURRENT_NAME, "mac" => "00:01:02:03:04:05" }] }
allow(LanItems).to receive(:ReadHardware) { [{ "dev_name" => CURRENT_NAME, "permanent_mac" => "00:01:02:03:04:05" }] }
allow(LanItems).to receive(:getNetworkInterfaces) { [CURRENT_NAME] }
allow(LanItems).to receive(:GetItemUdev) { "" }
allow(LanItems).to receive(:GetItemUdev).with("NAME") { CURRENT_NAME }
Expand Down Expand Up @@ -57,6 +57,10 @@ module Yast

expect(@edit_name_dlg.run).to be_equal CURRENT_NAME
end

it "does not touch the current udev rule" do
expect(Yast::LanItems).to_not receive(:update_item_udev_rule!)
end
end

context "when closed after name change" do
Expand Down Expand Up @@ -104,6 +108,32 @@ module Yast

expect(@edit_name_dlg.run).to eql NEW_NAME
end

context "but used the same matching udev key" do
it "does not touch the current udev rule" do
expect(Yast::LanItems).to_not receive(:update_item_udev_rule!)
end
end
end

context "when closed without changing the match selection" do
before(:each) do
# emulate UI work
allow(UI).to receive(:QueryWidget).with(:dev_name, :Value) { CURRENT_NAME }
allow(UI).to receive(:QueryWidget).with(:udev_type, :CurrentButton) { :mac }
end
end

context "when modified the matching udev key" do
before(:each) do
# emulate UI work
allow(UI).to receive(:QueryWidget).with(:dev_name, :Value) { CURRENT_NAME }
allow(UI).to receive(:QueryWidget).with(:udev_type, :CurrentButton) { :bus_id }
end

it "updates the current udev rule with the key used" do
expect(Yast::LanItems).to_not receive(:update_item_udev_rule!).with(:bus_id)
end
end
end
end
24 changes: 20 additions & 4 deletions test/lan_items_helpers_test.rb
Expand Up @@ -149,8 +149,8 @@ def udev_rule(mac, name)
},
1 => {
"hwinfo" => {
"mac" => "00:00:00:00:00:01",
"dev_name" => "eth1"
"permanent_mac" => "00:00:00:00:00:01",
"dev_name" => "eth1"
},
# always exists
"udev" => {
Expand Down Expand Up @@ -198,7 +198,7 @@ def check_GetItemUdev(key, expected_value)
before(:each) do
allow(Yast::LanItems)
.to receive(:GetLanItem)
.and_return("hwinfo" => { "mac" => MAC }, "ifcfg" => "eth0")
.and_return("hwinfo" => { "permanent_mac" => MAC }, "ifcfg" => "eth0")
end

it "returns proper value when key exists" do
Expand Down Expand Up @@ -242,8 +242,24 @@ def check_GetItemUdev(key, expected_value)
end
end

describe "#current_udev_rule" do
let(:busid) { "0000:08:00.0" }
let(:hwinfo) { { "dev_name" => "test0", "busid" => busid, "permanent_mac" => "24:be:05:ce:1e:91" } }
let(:udev_net) { ["KERNELS==\"#{busid}\"", "NAME=\"test0\""] }
let(:rule) { { 0 => { "hwinfo" => hwinfo, "udev" => { "net" => udev_net } } } }

before do
Yast::LanItems.Items = rule
Yast::LanItems.current = 0
end

it "returns the current item udev rule" do
expect(Yast::LanItems.current_udev_rule).to contain_exactly("KERNELS==\"#{busid}\"", "NAME=\"test0\"")
end
end

describe "#update_item_udev_rule!" do
let(:hwinfo) { { "dev_name" => "test0", "busid" => "0000:08:00.0", "mac" => "24:be:05:ce:1e:91" } }
let(:hwinfo) { { "dev_name" => "test0", "busid" => "0000:08:00.0", "permanent_mac" => "24:be:05:ce:1e:91" } }
let(:udev_net) { ["ATTR{address}==\"24:be:05:ce:1e:91\"", "KERNEL==\"eth*\"", "NAME=\"test0\""] }
let(:rule) { { 0 => { "hwinfo" => hwinfo, "udev" => { "net" => udev_net } } } }

Expand Down
7 changes: 4 additions & 3 deletions test/lan_udev_auto_test.rb
Expand Up @@ -26,9 +26,10 @@
allow(lan_items).to receive(:ReadHardware) {
[
{
"dev_name" => NEW_STYLE_NAME,
"mac" => "00:11:22:33:44:FF",
"busid" => "0000:00:19.0"
"dev_name" => NEW_STYLE_NAME,
"mac" => "00:11:22:33:44:FF",
"permanent_mac" => "00:11:22:33:44:FF",
"busid" => "0000:00:19.0"
}
]
}
Expand Down
1 change: 1 addition & 0 deletions test/netcard_test.rb
Expand Up @@ -40,6 +40,7 @@
"bus" => HWINFO_DEVICE_BUS,
"busid" => HWINFO_DEVICE_BUSID,
"mac" => HWINFO_DEVICE_MAC,
"permanent_mac" => HWINFO_DEVICE_MAC,
"link" => nil,
"wl_channels" => nil,
"wl_bitrates" => nil,
Expand Down
21 changes: 12 additions & 9 deletions test/network_autoyast_test.rb
Expand Up @@ -486,19 +486,22 @@ def mock_lan_item(renamed_to: nil)
let(:hw_netcard) do
[
{
"dev_name" => "eth0",
"busid" => "0000:01:00.0",
"mac" => "00:00:00:00:00:00"
"dev_name" => "eth0",
"busid" => "0000:01:00.0",
"mac" => "00:00:00:00:00:00",
"permanent_mac" => "00:00:00:00:00:00"
},
{
"dev_name" => "eth1",
"busid" => "0000:01:00.1",
"mac" => "00:00:00:00:00:01"
"dev_name" => "eth1",
"busid" => "0000:01:00.1",
"mac" => "00:00:00:00:00:01",
"permanent_mac" => "00:00:00:00:00:01"
},
{
"dev_name" => "eth2",
"busid" => "0000:01:00.2",
"mac" => "00:00:00:00:00:02"
"dev_name" => "eth2",
"busid" => "0000:01:00.2",
"mac" => "00:00:00:00:00:02",
"permanent_mac" => "00:00:00:00:00:02"
}
]
end
Expand Down