Skip to content

Commit

Permalink
Merge 04eb764 into 58e1de5
Browse files Browse the repository at this point in the history
  • Loading branch information
imobachgs committed Jul 31, 2019
2 parents 58e1de5 + 04eb764 commit cfa3339
Show file tree
Hide file tree
Showing 13 changed files with 170 additions and 160 deletions.
15 changes: 12 additions & 3 deletions src/lib/y2network/connection_config/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,10 @@ class Base
attr_accessor :interface
# @return [BootProtocol] Bootproto
attr_accessor :bootproto
# @return [Array<IPConfig>]
attr_accessor :ip_configs
# @return [IPConfig] Primary IP configuration
attr_accessor :ip
# @return [Array<IPConfig>] Additional IP configurations (also known as 'aliases')
attr_accessor :ip_aliases
# @return [Integer, nil]
attr_accessor :mtu
# @return [Startmode, nil]
Expand All @@ -53,7 +55,7 @@ class Base

# Constructor
def initialize
@ip_configs = []
@ip_aliases = []
@bootproto = BootProtocol::STATIC
@startmode = Startmode.create("manual")
end
Expand All @@ -75,6 +77,13 @@ def type
def virtual?
false
end

# Returns all IP configurations
#
# @return [Array<IPConfig>]
def all_ips
([ip] + ip_aliases).compact
end
end
end
end
31 changes: 10 additions & 21 deletions src/lib/y2network/interface_config_builder.rb
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ def aliases
}
end

new_aliases = @connection_config.ip_configs.select { |c| c.id != "" }.map do |data|
new_aliases = @connection_config.ip_aliases.map do |data|
{
label: data.label,
ip: data.address.address,
Expand All @@ -269,17 +269,15 @@ def aliases
def aliases=(value)
@aliases = value

# connection config
# keep only default as aliases does not handle default ip config
@connection_config.ip_configs.delete_if { |c| c.id != "" }
@connection_config.ip_aliases.clear
value.each_with_index do |h, i|
ip_addr = IPAddress.from_string(h[:ip])
if h[:prefixlen] && !h[:prefixlen].empty?
ip_addr.prefix = h[:prefixlen].delete("/").to_i
elsif h[:mask] && !h[:mask].empty?
ip.netmask = h[:mask]
end
@connection_config.ip_configs << ConnectionConfig::IPConfig.new(
@connection_config.ip_aliases << ConnectionConfig::IPConfig.new(
ip_addr,
label: h[:label],
id: "_#{i}" # TODO: remember original prefixes
Expand Down Expand Up @@ -308,8 +306,7 @@ def ethtool_options=(value)
def ip_address
old = @config["IPADDR"]

# FIXME: workaround to remove when primary ip config is separated from the rest
default = (@connection_config.ip_configs || []).find { |c| c.id == "" }
default = @connection_config.ip
new_ = if default
default.address.address
else
Expand All @@ -321,11 +318,8 @@ def ip_address
# @param [String] value
def ip_address=(value)
@config["IPADDR"] = value

# connection_config
if value.nil? || value.empty?
# in such case remove default config
@connection_config.ip_configs.delete_if { |c| c.id == "" }
@connection_config.ip = nil
else
ip_config_default.address.address = value
end
Expand All @@ -338,9 +332,8 @@ def subnet_prefix
else
@config["NETMASK"] || ""
end
default = (@connection_config.ip_configs || []).find { |c| c.id == "" }
new_ = if default
"/" + default.address.prefix.to_s
new_ = if @connection_config.ip
"/" + @connection_config.ip.address.prefix.to_s
else
""
end
Expand Down Expand Up @@ -384,7 +377,7 @@ def hostname=(value)
# @return [String]
def remote_ip
old = @config["REMOTEIP"]
default = @connection_config.ip_configs.find { |c| c.id == "" }
default = @connection_config.ip
new_ = if default
default.remote_address.to_s
else
Expand Down Expand Up @@ -576,12 +569,8 @@ def save_aliases
end

def ip_config_default
default = @connection_config.ip_configs.find { |c| c.id == "" }
if !default
default = ConnectionConfig::IPConfig.new(IPAddress.new("0.0.0.0")) # fake ip as it will be replaced soon
@connection_config.ip_configs << default
end
default
return @connection_config.ip if @connection_config.ip
@connection_config.ip = ConnectionConfig::IPConfig.new(IPAddress.new("0.0.0.0"))
end

# method that allows easy change of backend for providing data
Expand Down
11 changes: 5 additions & 6 deletions src/lib/y2network/sysconfig/connection_config_readers/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ def connection_config
conn.bootproto = BootProtocol.from_name(file.bootproto || "static")
conn.description = file.name
conn.interface = file.interface
conn.ip_configs = ip_configs
conn.ip = all_ips.find { |i| i.id.empty? }
conn.ip_aliases = all_ips.reject { |i| i.id.empty? }
conn.name = file.interface
conn.startmode = Startmode.create(file.startmode || "manual")
conn.startmode.priority = file.ifplugd_priority if conn.startmode.name == "ifplugd"
Expand Down Expand Up @@ -81,20 +82,18 @@ def update_connection_config(_conn)
#
# @return [Array<Y2Network::ConnectionConfig::IPAdress>] IP addresses configuration
# @see Y2Network::ConnectionConfig::IPConfig
def ip_configs
configs = file.ipaddrs.map do |id, ip|
def all_ips
@all_ips ||= file.ipaddrs.each_with_object([]) do |(id, ip), all|
next unless ip.is_a?(Y2Network::IPAddress)
ip_address = build_ip(ip, file.prefixlens[id], file.netmasks[id])
Y2Network::ConnectionConfig::IPConfig.new(
all << Y2Network::ConnectionConfig::IPConfig.new(
ip_address,
id: id,
label: file.labels[id],
remote_address: file.remote_ipaddrs[id],
broadcast: file.broadcasts[id]
)
end
# The one without suffix comes first.
configs.compact.sort_by { |c| c.id.nil? ? -1 : 0 }
end

# Builds an IP address
Expand Down
28 changes: 18 additions & 10 deletions src/lib/y2network/sysconfig/connection_config_writers/base.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ def write(conn)
file.name = conn.description
file.startmode = conn.startmode.to_s
file.ifplugd_priority = conn.startmode.priority if conn.startmode.name == "ifplugd"
write_ip_configs(conn.ip_configs)
add_ips(conn)
update_file(conn)
end

Expand All @@ -59,16 +59,24 @@ def update_file(_conn)
raise NotImplementedError
end

# Write IP configuration
# Adds IP addresses
#
# @param ip_configs [Array<Y2Network::ConnectionConfig::IPConfig>] IPs configuration
def write_ip_configs(ip_configs)
ip_configs.each do |ip_config|
file.ipaddrs[ip_config.id] = ip_config.address
file.labels[ip_config.id] = ip_config.label
file.remote_ipaddrs[ip_config.id] = ip_config.remote_address
file.broadcasts.merge!(ip_config.id => ip_config.broadcast)
end
# @param conn [Y2Network::ConnectionConfig::Base] Connection to take settings from
def add_ips(conn)
file.ipaddrs.clear
ips_to_add = conn.ip_aliases.clone
ips_to_add << conn.ip if conn.ip && !conn.bootproto.dhcp?
ips_to_add.each { |i| add_ip(i) }
end

# Adds a single IP to the file
#
# @param ip [Y2Network::IPAddress] IP address to add
def add_ip(ip)
file.ipaddrs[ip.id] = ip.address
file.labels[ip.id] = ip.label
file.remote_ipaddrs[ip.id] = ip.remote_address
file.broadcasts[ip.id] = ip.broadcast
end
end
end
Expand Down
4 changes: 2 additions & 2 deletions test/y2network/sysconfig/config_writer_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,13 @@
)
end
let(:old_config) { instance_double(Y2Network::Config, dns: double("dns"), interfaces: nil) }
let(:ip_config) { Y2Network::ConnectionConfig::IPConfig.new(address: IPAddr.new("192.168.122.2")) }
let(:ip) { Y2Network::ConnectionConfig::IPConfig.new(address: IPAddr.new("192.168.122.2")) }
let(:eth0) { Y2Network::Interface.new("eth0") }
let(:eth0_conn) do
Y2Network::ConnectionConfig::Ethernet.new.tap do |conn|
conn.interface = "eth0"
conn.bootproto = :static
conn.ip_configs = [ip_config]
conn.ip = ip
end
end
let(:route) do
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
it "returns a dummy connection config object" do
dummy_conn = handler.connection_config
expect(dummy_conn.interface).to eq("dummy0")
expect(dummy_conn.ip_configs.map(&:address)).to eq([ip_address])
expect(dummy_conn.ip.address).to eq(ip_address)
expect(dummy_conn.bootproto).to eq(Y2Network::BootProtocol::STATIC)
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
it "returns an ethernet connection config object" do
eth = handler.connection_config
expect(eth.interface).to eq("eth0")
expect(eth.ip_configs.map(&:address)).to eq([Y2Network::IPAddress.from_string("192.168.123.1/24")])
expect(eth.ip.address).to eq(Y2Network::IPAddress.from_string("192.168.123.1/24"))
expect(eth.bootproto).to eq(Y2Network::BootProtocol::STATIC)
end

Expand All @@ -49,7 +49,7 @@

it "uses the prefixlen as the address prefix" do
eth = handler.connection_config
expect(eth.ip_configs.map(&:address)).to eq([Y2Network::IPAddress.from_string("172.16.0.1/12")])
expect(eth.ip.address).to eq(Y2Network::IPAddress.from_string("172.16.0.1/12"))
end
end

Expand All @@ -58,7 +58,7 @@

it "uses the netmask to set the address prefix" do
eth = handler.connection_config
expect(eth.ip_configs.map(&:address)).to eq([Y2Network::IPAddress.from_string("10.0.0.1/8")])
expect(eth.ip.address).to eq(Y2Network::IPAddress.from_string("10.0.0.1/8"))
end
end
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
infiniband_conn = handler.connection_config
expect(infiniband_conn.interface).to eq("ib0")
expect(infiniband_conn.ipoib_mode).to eq(Y2Network::IpoibMode::DATAGRAM)
expect(infiniband_conn.ip_configs.map(&:address)).to eq([ip_address])
expect(infiniband_conn.all_ips.map(&:address)).to eq([ip_address])
expect(infiniband_conn.bootproto).to eq(Y2Network::BootProtocol::STATIC)
end
end
Expand Down
25 changes: 10 additions & 15 deletions test/y2network/sysconfig/connection_config_writers/dummy_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -39,24 +39,19 @@
end
end

let(:ip_configs) do
[
Y2Network::ConnectionConfig::IPConfig.new(
Y2Network::IPAddress.from_string("10.0.0.100/24")
)
]
let(:ip) do
Y2Network::ConnectionConfig::IPConfig.new(Y2Network::IPAddress.from_string("10.0.0.100/24"))
end

let(:conn) do
instance_double(
Y2Network::ConnectionConfig::Dummy,
name: "dummy1",
interface: "dummy1",
description: "",
bootproto: Y2Network::BootProtocol::STATIC,
ip_configs: ip_configs,
startmode: Y2Network::Startmode.create("auto")
)
Y2Network::ConnectionConfig::Dummy.new.tap do |c|
c.name = "dummy1"
c.interface = "dummy1"
c.description = ""
c.ip = ip
c.bootproto = Y2Network::BootProtocol::STATIC
c.startmode = Y2Network::Startmode.create("auto")
end
end

let(:file) { Y2Network::Sysconfig::InterfaceFile.new(conn.name) }
Expand Down
61 changes: 38 additions & 23 deletions test/y2network/sysconfig/connection_config_writers/ethernet_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -40,31 +40,34 @@
end
end

let(:ip_configs) do
[
Y2Network::ConnectionConfig::IPConfig.new(
Y2Network::IPAddress.from_string("192.168.122.1/24"),
id: "", broadcast: Y2Network::IPAddress.from_string("192.168.122.255")
),
Y2Network::ConnectionConfig::IPConfig.new(
Y2Network::IPAddress.from_string("10.0.0.1/8"),
id: "_0", label: "my-label", remote_address: Y2Network::IPAddress.from_string("10.0.0.2")
)
]
let(:ip) do
Y2Network::ConnectionConfig::IPConfig.new(
Y2Network::IPAddress.from_string("192.168.122.1/24"),
id: "", broadcast: Y2Network::IPAddress.from_string("192.168.122.255")
)
end

let(:conn) do
instance_double(
Y2Network::ConnectionConfig::Ethernet,
name: "eth0",
interface: "eth0",
description: "Ethernet Card 0",
bootproto: Y2Network::BootProtocol::STATIC,
ip_configs: ip_configs,
startmode: Y2Network::Startmode.create("auto")
let(:ip_alias) do
Y2Network::ConnectionConfig::IPConfig.new(
Y2Network::IPAddress.from_string("10.0.0.1/8"),
id: "_0", label: "my-label", remote_address: Y2Network::IPAddress.from_string("10.0.0.2")
)
end

let(:all_ips) { [ip, ip_alias] }

let(:conn) do
Y2Network::ConnectionConfig::Ethernet.new.tap do |c|
c.name = "eth0"
c.interface = "eth0"
c.description = "Ethernet Card 0"
c.bootproto = Y2Network::BootProtocol::STATIC
c.ip = ip
c.ip_aliases = [ip_alias]
c.startmode = Y2Network::Startmode.create("auto")
end
end

let(:file) { Y2Network::Sysconfig::InterfaceFile.find(conn.interface) }

describe "#write" do
Expand All @@ -80,11 +83,23 @@
it "sets IP configuration attributes" do
handler.write(conn)
expect(file).to have_attributes(
ipaddrs: { "" => ip_configs[0].address, "_0" => ip_configs[1].address },
broadcasts: { "" => ip_configs[0].broadcast, "_0" => nil },
remote_ipaddrs: { "" => nil, "_0" => ip_configs[1].remote_address },
ipaddrs: { "" => ip.address, "_0" => ip_alias.address },
broadcasts: { "" => ip.broadcast, "_0" => nil },
remote_ipaddrs: { "" => nil, "_0" => ip_alias.remote_address },
labels: { "" => nil, "_0" => "my-label" }
)
end

context "when using dhcp" do
before do
conn.bootproto = Y2Network::BootProtocol::DHCP
end

it "only writes ip aliases" do
handler.write(conn)
expect(file.ipaddrs[""]).to be_nil
expect(file.ipaddrs["_0"]).to eq(ip_alias.address)
end
end
end
end

0 comments on commit cfa3339

Please sign in to comment.