Darryl L. Pierce
2008-Oct-17 21:11 UTC
[Ovirt-devel] [PATCH server] Introduces a new IP address model. Moves IP addressing to a separate
You will need to run a migration after this patch to create the
ip_addresses table and massage the bondings and nics tables to
reference it.
NEW CLASSES:
IpAddress: base class for addresses
IpV4Address: represents an IPv4 address
IpV6Address: represents an IPv6 address
Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>
---
src/app/models/bonding.rb | 1 +
src/app/models/ip_address.rb | 25 +++++
src/app/models/ip_v4_address.rb | 46 +++++++++
src/app/models/ip_v6_address.rb | 40 ++++++++
src/app/models/nic.rb | 2 +
src/db/migrate/025_create_ip_addresses.rb | 46 +++++++++
...026_move_nic_addresses_to_ip_addresses_table.rb | 56 +++++++++++
...7_move_bonding_address_to_ip_addresses_table.rb | 54 +++++++++++
src/host-browser/host-browser.rb | 17 ++--
src/lib/managed_node_configuration.rb | 8 +-
src/test/fixtures/bondings.yml | 4 +-
src/test/fixtures/ip_addresses.yml | 55 +++++++++++
src/test/fixtures/nics.yml | 82 ++++++++--------
.../functional/managed_node_configuration_test.rb | 26 +++---
src/test/unit/ip_address_test.rb | 8 ++
src/test/unit/ip_v4_address_test.rb | 99 ++++++++++++++++++++
src/test/unit/ip_v6_address_test.rb | 82 ++++++++++++++++
src/test/unit/nic_test.rb | 1 +
18 files changed, 584 insertions(+), 68 deletions(-)
create mode 100644 src/app/models/ip_address.rb
create mode 100644 src/app/models/ip_v4_address.rb
create mode 100644 src/app/models/ip_v6_address.rb
create mode 100644 src/db/migrate/025_create_ip_addresses.rb
create mode 100644
src/db/migrate/026_move_nic_addresses_to_ip_addresses_table.rb
create mode 100644
src/db/migrate/027_move_bonding_address_to_ip_addresses_table.rb
create mode 100644 src/test/fixtures/ip_addresses.yml
create mode 100644 src/test/unit/ip_address_test.rb
create mode 100644 src/test/unit/ip_v4_address_test.rb
create mode 100644 src/test/unit/ip_v6_address_test.rb
diff --git a/src/app/models/bonding.rb b/src/app/models/bonding.rb
index 006c261..2fa4aa8 100644
--- a/src/app/models/bonding.rb
+++ b/src/app/models/bonding.rb
@@ -51,6 +51,7 @@ class Bonding < ActiveRecord::Base
belongs_to :host
belongs_to :bonding_type
belongs_to :boot_type
+ belongs_to :ip_address
has_and_belongs_to_many :nics,
:join_table => 'bondings_nics',
diff --git a/src/app/models/ip_address.rb b/src/app/models/ip_address.rb
new file mode 100644
index 0000000..f48cd4e
--- /dev/null
+++ b/src/app/models/ip_address.rb
@@ -0,0 +1,25 @@
+#
+# ip_address.rb
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +IpAddress+ is the base class for all address related classes.
+#
+class IpAddress < ActiveRecord::Base
+
+end
diff --git a/src/app/models/ip_v4_address.rb b/src/app/models/ip_v4_address.rb
new file mode 100644
index 0000000..4495a13
--- /dev/null
+++ b/src/app/models/ip_v4_address.rb
@@ -0,0 +1,46 @@
+# ip_v4_address.rb
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +IpV4Address+ represents a single IPv4 address.
+#
+class IpV4Address < IpAddress
+ ADDRESS_TEST = %r{^(\d{1,3}\.){3}\d{1,3}$}
+
+ validates_presence_of :address,
+ :message => 'An address must be supplied.'
+ validates_format_of :address,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :netmask,
+ :message => 'A netmask must be supplied.'
+ validates_format_of :netmask,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :gateway,
+ :message => 'A gateway address must be supplied.'
+ validates_format_of :gateway,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :broadcast,
+ :message => 'A broadcast address must be supplied.'
+ validates_format_of :broadcast,
+ :with => ADDRESS_TEST
+
+end
diff --git a/src/app/models/ip_v6_address.rb b/src/app/models/ip_v6_address.rb
new file mode 100644
index 0000000..1395886
--- /dev/null
+++ b/src/app/models/ip_v6_address.rb
@@ -0,0 +1,40 @@
+# ip_v6_address.rb
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +IpV6Address+ represents a single IPv6 address.
+#
+class IpV6Address < IpAddress
+ ADDRESS_TEST = %r{^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$}
+
+ validates_presence_of :address,
+ :message => 'An address must be provided.'
+ validates_format_of :address,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :gateway,
+ :message => 'A gateway address must be provided.'
+ validates_format_of :gateway,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :prefix,
+ :message => 'A prefix must be provided.'
+ validates_format_of :prefix,
+ :with => ADDRESS_TEST
+end
diff --git a/src/app/models/nic.rb b/src/app/models/nic.rb
index baf7095..69568a9 100644
--- a/src/app/models/nic.rb
+++ b/src/app/models/nic.rb
@@ -22,4 +22,6 @@ class Nic < ActiveRecord::Base
belongs_to :boot_type
has_and_belongs_to_many :bonding, :join_table => 'bondings_nics'
+
+ belongs_to :ip_address
end
diff --git a/src/db/migrate/025_create_ip_addresses.rb
b/src/db/migrate/025_create_ip_addresses.rb
new file mode 100644
index 0000000..0f528f4
--- /dev/null
+++ b/src/db/migrate/025_create_ip_addresses.rb
@@ -0,0 +1,46 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# Creates a single-inheritance table for both IPv4 and IPv6
+# addresses.
+#
+class CreateIpAddresses < ActiveRecord::Migration
+ def self.up
+ create_table :ip_addresses do |t|
+ t.string :type
+
+ # common attributes
+ t.string :address, :limit => 39
+ t.string :gateway, :limit => 39
+
+ # attributes for IPv4 (type=IpV4Address)
+ t.string :netmask, :limit => 15
+ t.string :broadcast, :limit => 15
+
+ # attributes for IPv6 (type=IpV6Address)
+ t.string :prefix, :limit => 39
+
+ t.timestamps
+ end
+ end
+
+ def self.down
+ drop_table :ip_addresses
+ end
+end
diff --git a/src/db/migrate/026_move_nic_addresses_to_ip_addresses_table.rb
b/src/db/migrate/026_move_nic_addresses_to_ip_addresses_table.rb
new file mode 100644
index 0000000..b873e4d
--- /dev/null
+++ b/src/db/migrate/026_move_nic_addresses_to_ip_addresses_table.rb
@@ -0,0 +1,56 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+class MoveNicAddressesToIpAddressesTable < ActiveRecord::Migration
+ def self.up
+ add_column :nics, :ip_address_id, :integer, :null => true
+
+ execute 'alter table nics add constraint fk_nic_ip_address
+ foreign key (ip_address_id) references ip_addresses(id)'
+
+ Nic.find(:all).each do |nic|
+ address = IpV4Address.new(:address => nic.ip_addr,
+ :netmask => nic.netmask,
+ :broadcast => nic.broadcast,
+ :gateway => nic.ip_addr)
+ nic.ip_address = address
+
+ nic.save!
+ address.save!
+ end
+
+ remove_column :nics, :ip_addr
+ remove_column :nics, :netmask
+ remove_column :nics, :broadcast
+ end
+
+ def self.down
+ add_column :nics, :ip_addr, :string, :limit => 16
+ add_column :nics, :netmask, :string, :limit => 16
+ add_column :nics, :broadcast, :string, :limit => 16
+
+ Nic.find(:all).each do |nic|
+ nic.ip_addr = nic.ip_address.address
+ nic.netmask = nic.ip_address.netmask
+ nic.broadcast = nic.ip_address.broadcast
+ end
+
+ remove_column :nics, :ip_address_id
+ end
+end
diff --git a/src/db/migrate/027_move_bonding_address_to_ip_addresses_table.rb
b/src/db/migrate/027_move_bonding_address_to_ip_addresses_table.rb
new file mode 100644
index 0000000..53f7058
--- /dev/null
+++ b/src/db/migrate/027_move_bonding_address_to_ip_addresses_table.rb
@@ -0,0 +1,54 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+class MoveBondingAddressToIpAddressesTable < ActiveRecord::Migration
+ def self.up
+ add_column :bondings, :ip_address_id, :integer, :null => true
+
+ execute 'alter table bondings add constraint fk_bonding_ip_address
+ foreign key (ip_address_id) references ip_addresses(id)'
+
+ Bonding.find(:all).each do |bonding|
+ ip_address = IpV4Address.new(:address => bonding.ip_addr,
+ :netmask => bonding.netmask,
+ :broadcast => bonding.broadcast,
+ :gateway => bonding.ip_addr)
+ end
+
+ remove_column :bondings, :ip_addr
+ remove_column :bondings, :netmask
+ remove_column :bondings, :broadcast
+ end
+
+ def self.down
+ t.string :ip_addr, :null => true, :limit => 15
+ t.string :netmask, :null => true, :limit => 15
+ t.string :broadcast, :null => true, :limit => 15
+
+ Bonding.each do |bonding|
+ bonding.ip_addr = bonding.ip_address.address
+ bonding.netmask = bonding.ip_address.netmask
+ bonding.broadcast = bonding.ip_address.broadcast
+
+ bonding.save!
+ end
+
+ remove_column :bondings, :ip_address_id
+ end
+end
diff --git a/src/host-browser/host-browser.rb b/src/host-browser/host-browser.rb
index 79d34e8..bbfbf3b 100755
--- a/src/host-browser/host-browser.rb
+++ b/src/host-browser/host-browser.rb
@@ -283,10 +283,10 @@ class HostBrowser
updated_nic = Nic.find_by_id(nic.id)
- updated_nic.bandwidth = detail['BANDWIDTH']
- updated_nic.ip_addr = detail['IP_ADDRESS']
- updated_nic.netmask = detail['NETMASK']
- updated_nic.broadcast = detail['BROADCAST']
+ updated_nic.bandwidth =
detail['BANDWIDTH']
+ updated_nic.ip_address.address =
detail['IP_ADDRESS']
+ updated_nic.ip_address.netmask =
detail['NETMASK']
+ updated_nic.ip_address.broadcast =
detail['BROADCAST']
updated_nic.save!
found=true
@@ -310,11 +310,14 @@ class HostBrowser
'mac' => nic['MAC'].upcase,
'bandwidth' => nic['BANDWIDTH'],
'usage_type' => 1,
- 'ip_addr' => nic['IP_ADDRESS'],
- 'netmask' => nic['NETMASK'],
- 'broadcast' => nic['BROADCAST'],
'boot_type_id' => boot_type.id)
+ ip_address = IpV4Address.new('address' =>
nic['IP_ADDRESS'],
+ 'netmask' => nic['NETMASK'],
+ 'broadcast' => nic['BROADCAST'],
+ 'gateway' => nic['GATEWAY'])
+ detail.ip_address = ip_address
+
host.nics << detail
end
diff --git a/src/lib/managed_node_configuration.rb
b/src/lib/managed_node_configuration.rb
index 93f8448..fff7914 100644
--- a/src/lib/managed_node_configuration.rb
+++ b/src/lib/managed_node_configuration.rb
@@ -51,7 +51,7 @@ class ManagedNodeConfiguration
host.bondings.each do |bonding|
result.puts "rm
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}"
result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/DEVICE
#{bonding.interface_name}"
- result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/IPADDR
#{bonding.ip_addr}" if bonding.ip_addr
+ result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/IPADDR
#{bonding.ip_address.address}" if bonding.ip_address
result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/ONBOOT yes"
bonding.nics.each do |nic|
@@ -97,9 +97,9 @@ class ManagedNodeConfiguration
result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/BOOTPROTO
#{nic.boot_type.proto}"
if nic.boot_type.proto == 'static'
- result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/IPADDR
#{nic.ip_addr}"
- result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/NETMASK
#{nic.netmask}"
- result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/BROADCAST #{nic.broadcast}"
+ result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/IPADDR
#{nic.ip_address.address}"
+ result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/NETMASK
#{nic.ip_address.netmask}"
+ result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/BROADCAST
#{nic.ip_address.broadcast}"
end
if bridged
diff --git a/src/test/fixtures/bondings.yml b/src/test/fixtures/bondings.yml
index 29473c7..1a74f42 100644
--- a/src/test/fixtures/bondings.yml
+++ b/src/test/fixtures/bondings.yml
@@ -4,8 +4,6 @@ mailservers_managed_node_bonding:
bonding_type_id: <%= Fixtures.identify(:link_aggregation_bonding_type)
%>
host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
boot_type_id: <%= Fixtures.identify(:boot_type_static) %>
- ip_addr: 172.31.0.15
- netmask: 255.255.255.
- broadcast: 172.31.0.255
+ ip_address_id: <%=
Fixtures.identify(:ip_v4_mailservers_managed_node_bonding) %>
arp_ping_address: 172.31.0.100
arp_interval: 0
diff --git a/src/test/fixtures/ip_addresses.yml
b/src/test/fixtures/ip_addresses.yml
new file mode 100644
index 0000000..0472669
--- /dev/null
+++ b/src/test/fixtures/ip_addresses.yml
@@ -0,0 +1,55 @@
+ip_v4_one:
+ type: IpV4Address
+ address: 1.2.3.4
+ netmask: 255.255.255.0
+ gateway: 1.2.3.1
+ broadcast: 1.2.3.255
+
+ip_v4_two:
+ type: IpV4Address
+ address: 2.3.4.5
+ netmask: 255.255.255.0
+ gateway: 1.2.3.1
+ broadcast: 2.3.4.255
+
+ip_v4_three:
+ type: IpV4Address
+ address: 3.4.5.6
+ netmask: 255.255.255.0
+ gateway: 3.4.5.1
+ broadcast: 3.4.5.255
+
+ip_v4_four:
+ type: IpV4Address
+ address: 3.4.5.6
+ netmask: 255.255.255.0
+ gateway: 3.4.5.1
+ broadcast: 3.4.5.255
+
+ip_v4_mailserver_nic_one:
+ type: IpV4Address
+ address: 172.31.0.15
+ netmask: 255.255.255.0
+ gateway: 172.31.0.1
+ broadcast: 172.31.0.255
+
+ip_v4_ldapserver_nic_one:
+ type: IpV4Address
+ address: 172.31.0.25
+ netmask: 255.255.255.0
+ gateway: 172.31.0.1
+ broadcast: 172.31.0.255
+
+ip_v4_buildserver_nic_two:
+ type: IpV4Address
+ address: 172.31.0.31
+ netmask: 255.255.255.0
+ gateway: 172.31.0.1
+ broadcast: 172.31.0.255
+
+ip_v4_mailservers_managed_node_bonding:
+ type: IpV4Address
+ address: 192.168.50.100
+ netmask: 255.255.255.0
+ gateway: 192.168.50.1
+ broadcast: 192.168.50.255
diff --git a/src/test/fixtures/nics.yml b/src/test/fixtures/nics.yml
index ccf71d2..dbbc511 100644
--- a/src/test/fixtures/nics.yml
+++ b/src/test/fixtures/nics.yml
@@ -1,80 +1,80 @@
one:
id: 1
mac: '00:11:22:33:44:55'
- ip_addr: '1.2.3.4'
- usage_type: '1'
+ ip_address_id: <%= Fixtures.identify(:ip_v4_one) %>
bandwidth: 100
host_id: 10
boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+
two:
id: 2
mac: 'AA:BB:CC:DD:EE:FF'
- ip_addr: '2.3.4.5'
+ ip_address_id: <%= Fixtures.identify(:ip_v4_two) %>
usage_type: '2'
bandwidth: 1000
host_id: 10
boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+
three:
id: 3
mac: '00:FF:11:EE:22:DD'
- ip_addr: '3.4.5.6'
+ ip_address_id: <%= Fixtures.identify(:ip_v4_three) %>
usage_type: '1'
bandwidth: 10
host_id: 10
boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+
four:
id: 4
mac: '00:FF:11:EE:22:DD'
- ip_addr: '3.4.5.6'
+ ip_address: <%= Fixtures.identify(:ip_v4_four) %>
usage_type: '1'
bandwidth: 10
host_id: 10
boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
mailserver_nic_one:
- mac: '00:11:22:33:44:55'
- usage_type: '1'
- bandwidth: 100
- ip_addr: '172.31.0.15'
- host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+ mac: '00:11:22:33:44:55'
+ ip_address: <%= Fixtures.identify(:ip_v4_mailserver_nic_one) %>
+ usage_type: '1'
+ bandwidth: 100
+ host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
mailserver_nic_two:
- mac: '22:11:33:66:44:55'
- usage_type: '1'
- bandwidth: 100
- host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
+ mac: '22:11:33:66:44:55'
+ usage_type: '1'
+ bandwidth: 100
+ host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
fileserver_nic_one:
- mac: '00:99:00:99:13:07'
- usage_type: '1'
- bandwidth: 100
- host_id: <%= Fixtures.identify(:fileserver_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
+ mac: '00:99:00:99:13:07'
+ usage_type: '1'
+ bandwidth: 100
+ host_id: <%= Fixtures.identify(:fileserver_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
ldapserver_nic_one:
- mac: '00:03:02:00:09:06'
- usage_type: '1'
- bandwidth: 100
- bridge: 'ovirtbr0'
- ip_addr: '172.31.0.25'
- host_id: <%= Fixtures.identify(:ldapserver_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+ mac: '00:03:02:00:09:06'
+ usage_type: '1'
+ bandwidth: 100
+ bridge: 'ovirtbr0'
+ ip_address_id: <%= Fixtures.identify(:ip_v4_ldapserver_nic_one) %>
+ host_id: <%= Fixtures.identify(:ldapserver_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
buildserver_nic_one:
- mac: '07:17:19:65:03:38'
- usage_type: '1'
- bandwidth: 100
- host_id: <%= Fixtures.identify(:buildserver_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
+ mac: '07:17:19:65:03:38'
+ usage_type: '1'
+ bandwidth: 100
+ host_id: <%= Fixtures.identify(:buildserver_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
buildserver_nic_two:
- mac: '07:17:19:65:03:39'
- usage_type: '1'
- bandwidth: 100
- ip_addr: '172.31.0.31'
- netmask: '255.255.255.0'
- broadcast: '172.31.0.255'
- host_id: <%= Fixtures.identify(:buildserver_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+ mac: '07:17:19:65:03:39'
+ usage_type: '1'
+ bandwidth: 100
+ ip_address_id: <%= Fixtures.identify(:ip_v4_buildserver_nic_two) %>
+ host_id: <%= Fixtures.identify(:buildserver_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
diff --git a/src/test/functional/managed_node_configuration_test.rb
b/src/test/functional/managed_node_configuration_test.rb
index d0d8aa3..2158c8d 100644
--- a/src/test/functional/managed_node_configuration_test.rb
+++ b/src/test/functional/managed_node_configuration_test.rb
@@ -83,17 +83,17 @@ cat <<\EOF > /var/tmp/node-augtool
rm /files/etc/sysconfig/network-scripts/ifcfg-eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/DEVICE eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BOOTPROTO
#{nic.boot_type.proto}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR #{nic.ip_addr}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK #{nic.netmask}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST #{nic.broadcast}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR
#{nic.ip_address.address}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK
#{nic.ip_address.netmask}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST
#{nic.ip_address.broadcast}
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BRIDGE ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/ONBOOT yes
rm /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DEVICE ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BOOTPROTO
#{nic.boot_type.proto}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR #{nic.ip_addr}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK #{nic.netmask}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST
#{nic.broadcast}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR
#{nic.ip_address.address}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK
#{nic.ip_address.netmask}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST
#{nic.ip_address.broadcast}
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/TYPE bridge
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/PEERNTP yes
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DELAY 0
@@ -123,17 +123,17 @@ cat <<\EOF > /var/tmp/node-augtool
rm /files/etc/sysconfig/network-scripts/ifcfg-eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/DEVICE eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BOOTPROTO
#{nic1.boot_type.proto}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR #{nic1.ip_addr}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK #{nic1.netmask}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST #{nic1.broadcast}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR
#{nic1.ip_address.address}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK
#{nic1.ip_address.netmask}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST
#{nic1.ip_address.broadcast}
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BRIDGE ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/ONBOOT yes
rm /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DEVICE ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BOOTPROTO
#{nic1.boot_type.proto}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR #{nic1.ip_addr}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK #{nic1.netmask}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST
#{nic1.broadcast}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR
#{nic1.ip_address.address}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK
#{nic1.ip_address.netmask}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST
#{nic1.ip_address.broadcast}
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/TYPE bridge
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/PEERNTP yes
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DELAY 0
@@ -177,7 +177,7 @@ EOF
cat <<\EOF > /var/tmp/node-augtool
rm /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}
set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/DEVICE
#{bonding.interface_name}
-set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/IPADDR
172.31.0.15
+set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/IPADDR
#{bonding.ip_address.address}
set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/ONBOOT
yes
rm /files/etc/sysconfig/network-scripts/ifcfg-eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/DEVICE eth0
diff --git a/src/test/unit/ip_address_test.rb b/src/test/unit/ip_address_test.rb
new file mode 100644
index 0000000..152578e
--- /dev/null
+++ b/src/test/unit/ip_address_test.rb
@@ -0,0 +1,8 @@
+require 'test_helper'
+
+class IpAddressTest < ActiveSupport::TestCase
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff --git a/src/test/unit/ip_v4_address_test.rb
b/src/test/unit/ip_v4_address_test.rb
new file mode 100644
index 0000000..14f0175
--- /dev/null
+++ b/src/test/unit/ip_v4_address_test.rb
@@ -0,0 +1,99 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class IpV4AddressTest < ActiveSupport::TestCase
+ def setup
+ @address = IpV4Address.new(:address => '192.168.50.2',
+ :netmask => '255.255.255.0',
+ :gateway => '192.168.50.1',
+ :broadcast => '192.168.50.255')
+ end
+
+ # Ensures that an address must be supplied.
+ #
+ def test_valid_fails_without_address
+ @address.address = nil
+
+ flunk "An address must be present." if @address.valid?
+ end
+
+ # Ensures that an address has to be in the correct format.
+ #
+ def test_valid_fails_with_bad_address
+ @address.address = '192.168'
+
+ flunk "An address must be in the format ##.##.##.##." if
@address.valid?
+ end
+
+ # Ensures that a netmask must be supplied.
+ #
+ def test_valid_fails_without_netmask
+ @address.netmask = nil
+
+ flunk "An address must have a netmask." if @address.valid?
+ end
+
+ # Ensures that a netmask must have the correct format.
+ #
+ def test_valid_fails_with_bad_netmask
+ @address.netmask = 'farkle'
+
+ flunk "A netmask must be in the format ##.##.##.##." if
@address.valid?
+ end
+
+ # Ensures that a gateway must be supplied.
+ #
+ def test_valid_fails_without_gateway
+ @address.gateway = nil
+
+ flunk "A gateway address must be supplied." if @address.valid?
+ end
+
+ # Ensures that a gateway must be in the correct format.
+ #
+ def test_valid_fails_with_bad_gateway
+ @address.gateway = '-3.a2.0.8'
+
+ flunk "The gateway address must be in the format ##.##.##.##." if
@address.valid?
+ end
+
+ # Ensures that a broadcast must be supplied.
+ #
+ def test_valid_fails_without_broadcast
+ @address.broadcast = nil
+
+ flunk "A broadcast addres must be supplied." if @address.valid?
+ end
+
+ # Ensures that a broadcast must be in the correct format.
+ #
+ def test_valid_fails_with_bad_broadcast
+ @address.broadcast = '-3.2.0.8'
+
+ flunk "The broadcast address must be in the format ##.##.##.##."
if @address.valid?
+ end
+
+ # Ensures that a well-formed address is valid.
+ #
+ def test_valid
+ flunk "There is an error with validation." unless @address.valid?
+ end
+end
diff --git a/src/test/unit/ip_v6_address_test.rb
b/src/test/unit/ip_v6_address_test.rb
new file mode 100644
index 0000000..a2be85f
--- /dev/null
+++ b/src/test/unit/ip_v6_address_test.rb
@@ -0,0 +1,82 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class IpV6AddressTest < ActiveSupport::TestCase
+ def setup
+ @address = IpV6Address.new(:address =>
'fe80:0:0:0:200:f8ff:fe21:67cf',
+ :gateway => ':::::::717',
+ :prefix => '0000:0000:0000:0000:1234:1234:1234:1234')
+ end
+
+ # Ensures that the address must be provided.
+ #
+ def test_valid_fails_without_address
+ @address.address = nil
+
+ flunk "An address must be provided." if @address.valid?
+ end
+
+ # Ensures that the address must be in the correct format.
+ #
+ def test_valid_fails_with_bad_address
+ @address.address = "farkle"
+
+ flunk "The address must be in the correct format." if
@address.valid?
+ end
+
+ # Ensures that the gateway must be provided.
+ #
+ def test_valid_fails_without_gateway
+ @address.gateway = nil
+
+ flunk "The gateway address must be provided." if @address.valid?
+ end
+
+ # Ensures that the gateway address is in the correct format.
+ #
+ def test_valid_fails_with_bad_gateway
+ @address.gateway = '0-:::::::717'
+
+ flunk "The gateway address must be in the correct format." if
@address.valid?
+ end
+
+ # Ensures that the prefix must be provided.
+ #
+ def test_valid_fails_without_prefix
+ @address.prefix = nil
+
+ flunk "The prefix must be provided." if @address.valid?
+ end
+
+ # Ensures that the prefix is in the correct format.
+ #
+ def test_valid_fails_with_invalid_prefix
+ @address.prefix = 'whoops'
+
+ flunk "The prefix must be in the correct format." if
@address.valid?
+ end
+
+ # Ensures that a well-formed address is considered valid.
+ #
+ def test_valid
+ flunk "There is an problem with address validation." unless
@address.valid?
+ end
+end
diff --git a/src/test/unit/nic_test.rb b/src/test/unit/nic_test.rb
index a0776a2..1de1e00 100644
--- a/src/test/unit/nic_test.rb
+++ b/src/test/unit/nic_test.rb
@@ -20,6 +20,7 @@
require File.dirname(__FILE__) + '/../test_helper'
class NicTest < Test::Unit::TestCase
+ fixtures :ip_addresses
fixtures :nics
# Replace this with your real tests.
--
1.5.5.1
Darryl Pierce
2008-Oct-20 14:44 UTC
[Ovirt-devel] Re: [PATCH server] Introduces a new IP address model. Moves IP addressing to a separate
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Darryl L. Pierce wrote:> You will need to run a migration after this patch to create the > ip_addresses table and massage the bondings and nics tables to > reference it. > > NEW CLASSES: > > IpAddress: base class for addresses > IpV4Address: represents an IPv4 address > IpV6Address: represents an IPv6 address > > Signed-off-by: Darryl L. Pierce <dpierce at redhat.com> > ---Mo, can you review this patch and give ms feedkbac? - -- Darryl L. Pierce <dpierce at redhat.com> : GPG KEYID: 6C4E7F1B -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.9 (GNU/Linux) Comment: Using GnuPG with Fedora - http://enigmail.mozdev.org iEYEARECAAYFAkj8mV0ACgkQjaT4DmxOfxs7PACg2ZqxdS1eJLzvqK0vzC+6DMWL 79gAnApw0RXsM6UEDaVGLbPT37NHcbMJ =r04J -----END PGP SIGNATURE----- -------------- next part -------------- A non-text attachment was scrubbed... Name: dpierce.vcf Type: text/x-vcard Size: 319 bytes Desc: not available URL: <http://listman.redhat.com/archives/ovirt-devel/attachments/20081020/e866e435/attachment.vcf>
Mohammed Morsi
2008-Oct-21 20:54 UTC
[Ovirt-devel] [PATCH server] Introduces a new IP address model. Moves IP addressing to a separate
NACK. Applies nicely (albeit with whitespace complaints) and everything seems to work with a few caveats as described below / inline. Darryl L. Pierce wrote:> You will need to run a migration after this patch to create the > ip_addresses table and massage the bondings and nics tables to > reference it. > > NEW CLASSES: > > IpAddress: base class for addresses > IpV4Address: represents an IPv4 address > IpV6Address: represents an IPv6 address > > Signed-off-by: Darryl L. Pierce <dpierce at redhat.com> > --- > src/app/models/bonding.rb | 1 + > src/app/models/ip_address.rb | 25 +++++ > src/app/models/ip_v4_address.rb | 46 +++++++++ > src/app/models/ip_v6_address.rb | 40 ++++++++ > src/app/models/nic.rb | 2 + > src/db/migrate/025_create_ip_addresses.rb | 46 +++++++++ >It seems since you've sent this out, migration 025 has been committed, so you'll need to start at 026> ...026_move_nic_addresses_to_ip_addresses_table.rb | 56 +++++++++++ > ...7_move_bonding_address_to_ip_addresses_table.rb | 54 +++++++++++ > src/host-browser/host-browser.rb | 17 ++-- > src/lib/managed_node_configuration.rb | 8 +- > src/test/fixtures/bondings.yml | 4 +- > src/test/fixtures/ip_addresses.yml | 55 +++++++++++ > src/test/fixtures/nics.yml | 82 ++++++++-------- > .../functional/managed_node_configuration_test.rb | 26 +++--- > src/test/unit/ip_address_test.rb | 8 ++ > src/test/unit/ip_v4_address_test.rb | 99 ++++++++++++++++++++ > src/test/unit/ip_v6_address_test.rb | 82 ++++++++++++++++ > src/test/unit/nic_test.rb | 1 + > 18 files changed, 584 insertions(+), 68 deletions(-) > create mode 100644 src/app/models/ip_address.rb > create mode 100644 src/app/models/ip_v4_address.rb > create mode 100644 src/app/models/ip_v6_address.rb > create mode 100644 src/db/migrate/025_create_ip_addresses.rb > create mode 100644 src/db/migrate/026_move_nic_addresses_to_ip_addresses_table.rb > create mode 100644 src/db/migrate/027_move_bonding_address_to_ip_addresses_table.rb > create mode 100644 src/test/fixtures/ip_addresses.yml > create mode 100644 src/test/unit/ip_address_test.rb > create mode 100644 src/test/unit/ip_v4_address_test.rb > create mode 100644 src/test/unit/ip_v6_address_test.rb > > diff --git a/src/app/models/bonding.rb b/src/app/models/bonding.rb > index 006c261..2fa4aa8 100644 > --- a/src/app/models/bonding.rb > +++ b/src/app/models/bonding.rb > @@ -51,6 +51,7 @@ class Bonding < ActiveRecord::Base > belongs_to :host > belongs_to :bonding_type > belongs_to :boot_type > + belongs_to :ip_address > > has_and_belongs_to_many :nics, > :join_table => 'bondings_nics', > diff --git a/src/app/models/ip_address.rb b/src/app/models/ip_address.rb > new file mode 100644 > index 0000000..f48cd4e > --- /dev/null > +++ b/src/app/models/ip_address.rb > @@ -0,0 +1,25 @@ > +# > +# ip_address.rb > +# Copyright (C) 2008 Red Hat, Inc. > +# Written by Darryl L. Pierce <dpierce at redhat.com> > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; version 2 of the License. > +# > +# 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, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > +# MA 02110-1301, USA. A copy of the GNU General Public License is > +# also available at http://www.gnu.org/copyleft/gpl.html. > + > +# +IpAddress+ is the base class for all address related classes. > +# > +class IpAddress < ActiveRecord::Base > + > +end >Why isn't there a "has_many :nics" and a "has_many :bonding" relationship in the IpAddress table. We wont be able to lookup nics / bondings from an ip address otherwise.> diff --git a/src/app/models/ip_v4_address.rb b/src/app/models/ip_v4_address.rb > new file mode 100644 > index 0000000..4495a13 > --- /dev/null > +++ b/src/app/models/ip_v4_address.rb > @@ -0,0 +1,46 @@ > +# ip_v4_address.rb > +# > +# Copyright (C) 2008 Red Hat, Inc. > +# Written by Darryl L. Pierce <dpierce at redhat.com> > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; version 2 of the License. > +# > +# 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, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > +# MA 02110-1301, USA. A copy of the GNU General Public License is > +# also available at http://www.gnu.org/copyleft/gpl.html. > + > +# +IpV4Address+ represents a single IPv4 address. > +# > +class IpV4Address < IpAddress > + ADDRESS_TEST = %r{^(\d{1,3}\.){3}\d{1,3}$} > + > + validates_presence_of :address, > + :message => 'An address must be supplied.' > + validates_format_of :address, > + :with => ADDRESS_TEST > + > + validates_presence_of :netmask, > + :message => 'A netmask must be supplied.' > + validates_format_of :netmask, > + :with => ADDRESS_TEST > + > + validates_presence_of :gateway, > + :message => 'A gateway address must be supplied.' > + validates_format_of :gateway, > + :with => ADDRESS_TEST > + > + validates_presence_of :broadcast, > + :message => 'A broadcast address must be supplied.' > + validates_format_of :broadcast, > + :with => ADDRESS_TEST > + > +end > diff --git a/src/app/models/ip_v6_address.rb b/src/app/models/ip_v6_address.rb > new file mode 100644 > index 0000000..1395886 > --- /dev/null > +++ b/src/app/models/ip_v6_address.rb > @@ -0,0 +1,40 @@ > +# ip_v6_address.rb > +# > +# Copyright (C) 2008 Red Hat, Inc. > +# Written by Darryl L. Pierce <dpierce at redhat.com> > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; version 2 of the License. > +# > +# 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, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > +# MA 02110-1301, USA. A copy of the GNU General Public License is > +# also available at http://www.gnu.org/copyleft/gpl.html. > + > +# +IpV6Address+ represents a single IPv6 address. > +# > +class IpV6Address < IpAddress > + ADDRESS_TEST = %r{^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$} > + > + validates_presence_of :address, > + :message => 'An address must be provided.' > + validates_format_of :address, > + :with => ADDRESS_TEST > + > + validates_presence_of :gateway, > + :message => 'A gateway address must be provided.' > + validates_format_of :gateway, > + :with => ADDRESS_TEST > + > + validates_presence_of :prefix, > + :message => 'A prefix must be provided.' > + validates_format_of :prefix, > + :with => ADDRESS_TEST > +end > diff --git a/src/app/models/nic.rb b/src/app/models/nic.rb > index baf7095..69568a9 100644 > --- a/src/app/models/nic.rb > +++ b/src/app/models/nic.rb > @@ -22,4 +22,6 @@ class Nic < ActiveRecord::Base > belongs_to :boot_type > > has_and_belongs_to_many :bonding, :join_table => 'bondings_nics' > + > + belongs_to :ip_address > end > diff --git a/src/db/migrate/025_create_ip_addresses.rb b/src/db/migrate/025_create_ip_addresses.rb > new file mode 100644 > index 0000000..0f528f4 > --- /dev/null > +++ b/src/db/migrate/025_create_ip_addresses.rb > @@ -0,0 +1,46 @@ > +# > +# Copyright (C) 2008 Red Hat, Inc. > +# Written by Darryl L. Pierce <dpierce at redhat.com> > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; version 2 of the License. > +# > +# 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, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > +# MA 02110-1301, USA. A copy of the GNU General Public License is > +# also available at http://www.gnu.org/copyleft/gpl.html. > + > +# Creates a single-inheritance table for both IPv4 and IPv6 > +# addresses. > +# > +class CreateIpAddresses < ActiveRecord::Migration > + def self.up > + create_table :ip_addresses do |t| > + t.string :type > + > + # common attributes > + t.string :address, :limit => 39 > + t.string :gateway, :limit => 39 > + > + # attributes for IPv4 (type=IpV4Address) > + t.string :netmask, :limit => 15 > + t.string :broadcast, :limit => 15 > + > + # attributes for IPv6 (type=IpV6Address) > + t.string :prefix, :limit => 39 > + > + t.timestamps > + end > + end > + > + def self.down > + drop_table :ip_addresses > + end > +end > diff --git a/src/db/migrate/026_move_nic_addresses_to_ip_addresses_table.rb b/src/db/migrate/026_move_nic_addresses_to_ip_addresses_table.rb > new file mode 100644 > index 0000000..b873e4d > --- /dev/null > +++ b/src/db/migrate/026_move_nic_addresses_to_ip_addresses_table.rb > @@ -0,0 +1,56 @@ > +# > +# Copyright (C) 2008 Red Hat, Inc. > +# Written by Darryl L. Pierce <dpierce at redhat.com> > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; version 2 of the License. > +# > +# 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, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > +# MA 02110-1301, USA. A copy of the GNU General Public License is > +# also available at http://www.gnu.org/copyleft/gpl.html. > + > +class MoveNicAddressesToIpAddressesTable < ActiveRecord::Migration > + def self.up > + add_column :nics, :ip_address_id, :integer, :null => true > + > + execute 'alter table nics add constraint fk_nic_ip_address > + foreign key (ip_address_id) references ip_addresses(id)' > + > + Nic.find(:all).each do |nic| > + address = IpV4Address.new(:address => nic.ip_addr, > + :netmask => nic.netmask, > + :broadcast => nic.broadcast, > + :gateway => nic.ip_addr) > + nic.ip_address = address > + > + nic.save! > + address.save! > + end > + > + remove_column :nics, :ip_addr > + remove_column :nics, :netmask > + remove_column :nics, :broadcast > + end > + > + def self.down > + add_column :nics, :ip_addr, :string, :limit => 16 > + add_column :nics, :netmask, :string, :limit => 16 > + add_column :nics, :broadcast, :string, :limit => 16 > + > + Nic.find(:all).each do |nic| > + nic.ip_addr = nic.ip_address.address > + nic.netmask = nic.ip_address.netmask > + nic.broadcast = nic.ip_address.broadcast > + end > + > + remove_column :nics, :ip_address_id > + end > +end > diff --git a/src/db/migrate/027_move_bonding_address_to_ip_addresses_table.rb b/src/db/migrate/027_move_bonding_address_to_ip_addresses_table.rb > new file mode 100644 > index 0000000..53f7058 > --- /dev/null > +++ b/src/db/migrate/027_move_bonding_address_to_ip_addresses_table.rb > @@ -0,0 +1,54 @@ > +# > +# Copyright (C) 2008 Red Hat, Inc. > +# Written by Darryl L. Pierce <dpierce at redhat.com> > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; version 2 of the License. > +# > +# 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, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > +# MA 02110-1301, USA. A copy of the GNU General Public License is > +# also available at http://www.gnu.org/copyleft/gpl.html. > + > +class MoveBondingAddressToIpAddressesTable < ActiveRecord::Migration > + def self.up > + add_column :bondings, :ip_address_id, :integer, :null => true > + > + execute 'alter table bondings add constraint fk_bonding_ip_address > + foreign key (ip_address_id) references ip_addresses(id)' > + > + Bonding.find(:all).each do |bonding| > + ip_address = IpV4Address.new(:address => bonding.ip_addr, > + :netmask => bonding.netmask, > + :broadcast => bonding.broadcast, > + :gateway => bonding.ip_addr) > + end > + > + remove_column :bondings, :ip_addr > + remove_column :bondings, :netmask > + remove_column :bondings, :broadcast > + end > + > + def self.down > + t.string :ip_addr, :null => true, :limit => 15 > + t.string :netmask, :null => true, :limit => 15 > + t.string :broadcast, :null => true, :limit => 15 > + > + Bonding.each do |bonding| > + bonding.ip_addr = bonding.ip_address.address > + bonding.netmask = bonding.ip_address.netmask > + bonding.broadcast = bonding.ip_address.broadcast > + > + bonding.save! > + end > + > + remove_column :bondings, :ip_address_id > + end > +end > diff --git a/src/host-browser/host-browser.rb b/src/host-browser/host-browser.rb > index 79d34e8..bbfbf3b 100755 > --- a/src/host-browser/host-browser.rb > +++ b/src/host-browser/host-browser.rb > @@ -283,10 +283,10 @@ class HostBrowser > > updated_nic = Nic.find_by_id(nic.id) > > - updated_nic.bandwidth = detail['BANDWIDTH'] >Did you really mean to remove bandwidth here? I still see it in the db table after the migrations and this seems to be the only place that a change to it occurs.> - updated_nic.ip_addr = detail['IP_ADDRESS'] > - updated_nic.netmask = detail['NETMASK'] > - updated_nic.broadcast = detail['BROADCAST'] > + updated_nic.bandwidth = detail['BANDWIDTH'] > + updated_nic.ip_address.address = detail['IP_ADDRESS'] > + updated_nic.ip_address.netmask = detail['NETMASK'] > + updated_nic.ip_address.broadcast = detail['BROADCAST'] > > updated_nic.save! > found=true > @@ -310,11 +310,14 @@ class HostBrowser > 'mac' => nic['MAC'].upcase, > 'bandwidth' => nic['BANDWIDTH'], > 'usage_type' => 1, > - 'ip_addr' => nic['IP_ADDRESS'], > - 'netmask' => nic['NETMASK'], > - 'broadcast' => nic['BROADCAST'], > 'boot_type_id' => boot_type.id) > > + ip_address = IpV4Address.new('address' => nic['IP_ADDRESS'], > + 'netmask' => nic['NETMASK'], > + 'broadcast' => nic['BROADCAST'], > + 'gateway' => nic['GATEWAY']) > + detail.ip_address = ip_address > + > host.nics << detail > end > > diff --git a/src/lib/managed_node_configuration.rb b/src/lib/managed_node_configuration.rb > index 93f8448..fff7914 100644 > --- a/src/lib/managed_node_configuration.rb > +++ b/src/lib/managed_node_configuration.rb > @@ -51,7 +51,7 @@ class ManagedNodeConfiguration > host.bondings.each do |bonding| > result.puts "rm #{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}" > result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/DEVICE #{bonding.interface_name}" > - result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/IPADDR #{bonding.ip_addr}" if bonding.ip_addr > + result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/IPADDR #{bonding.ip_address.address}" if bonding.ip_address > result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/ONBOOT yes" > > bonding.nics.each do |nic| > @@ -97,9 +97,9 @@ class ManagedNodeConfiguration > result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/BOOTPROTO #{nic.boot_type.proto}" > > if nic.boot_type.proto == 'static' > - result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/IPADDR #{nic.ip_addr}" > - result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/NETMASK #{nic.netmask}" > - result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/BROADCAST #{nic.broadcast}" > + result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/IPADDR #{nic.ip_address.address}" > + result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/NETMASK #{nic.ip_address.netmask}" > + result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/BROADCAST #{nic.ip_address.broadcast}" > end > > if bridged >The host-browser and managed_node_configuration are the bits I'm least familiar with. That being said, after applying your patch and rebooting, everything seems to work. I also went through the changes above and everything looks good (besides the aformentioned note on bandwidth).> diff --git a/src/test/fixtures/bondings.yml b/src/test/fixtures/bondings.yml > index 29473c7..1a74f42 100644 > --- a/src/test/fixtures/bondings.yml > +++ b/src/test/fixtures/bondings.yml > @@ -4,8 +4,6 @@ mailservers_managed_node_bonding: > bonding_type_id: <%= Fixtures.identify(:link_aggregation_bonding_type) %> > host_id: <%= Fixtures.identify(:mailservers_managed_node) %> > boot_type_id: <%= Fixtures.identify(:boot_type_static) %> > - ip_addr: 172.31.0.15 > - netmask: 255.255.255. > - broadcast: 172.31.0.255 > + ip_address_id: <%= Fixtures.identify(:ip_v4_mailservers_managed_node_bonding) %> > arp_ping_address: 172.31.0.100 > arp_interval: 0 > diff --git a/src/test/fixtures/ip_addresses.yml b/src/test/fixtures/ip_addresses.yml > new file mode 100644 > index 0000000..0472669 > --- /dev/null > +++ b/src/test/fixtures/ip_addresses.yml > @@ -0,0 +1,55 @@ > +ip_v4_one: > + type: IpV4Address > + address: 1.2.3.4 > + netmask: 255.255.255.0 > + gateway: 1.2.3.1 > + broadcast: 1.2.3.255 > + > +ip_v4_two: > + type: IpV4Address > + address: 2.3.4.5 > + netmask: 255.255.255.0 > + gateway: 1.2.3.1 > + broadcast: 2.3.4.255 > + > +ip_v4_three: > + type: IpV4Address > + address: 3.4.5.6 > + netmask: 255.255.255.0 > + gateway: 3.4.5.1 > + broadcast: 3.4.5.255 > + > +ip_v4_four: > + type: IpV4Address > + address: 3.4.5.6 > + netmask: 255.255.255.0 > + gateway: 3.4.5.1 > + broadcast: 3.4.5.255 > + > +ip_v4_mailserver_nic_one: > + type: IpV4Address > + address: 172.31.0.15 > + netmask: 255.255.255.0 > + gateway: 172.31.0.1 > + broadcast: 172.31.0.255 > + > +ip_v4_ldapserver_nic_one: > + type: IpV4Address > + address: 172.31.0.25 > + netmask: 255.255.255.0 > + gateway: 172.31.0.1 > + broadcast: 172.31.0.255 > + > +ip_v4_buildserver_nic_two: > + type: IpV4Address > + address: 172.31.0.31 > + netmask: 255.255.255.0 > + gateway: 172.31.0.1 > + broadcast: 172.31.0.255 > + > +ip_v4_mailservers_managed_node_bonding: > + type: IpV4Address > + address: 192.168.50.100 > + netmask: 255.255.255.0 > + gateway: 192.168.50.1 > + broadcast: 192.168.50.255 > diff --git a/src/test/fixtures/nics.yml b/src/test/fixtures/nics.yml > index ccf71d2..dbbc511 100644 > --- a/src/test/fixtures/nics.yml > +++ b/src/test/fixtures/nics.yml > @@ -1,80 +1,80 @@ > one: > id: 1 > mac: '00:11:22:33:44:55' > - ip_addr: '1.2.3.4' > - usage_type: '1' > + ip_address_id: <%= Fixtures.identify(:ip_v4_one) %> > bandwidth: 100 > host_id: 10 > boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > + > two: > id: 2 > mac: 'AA:BB:CC:DD:EE:FF' > - ip_addr: '2.3.4.5' > + ip_address_id: <%= Fixtures.identify(:ip_v4_two) %> > usage_type: '2' > bandwidth: 1000 > host_id: 10 > boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > + > three: > id: 3 > mac: '00:FF:11:EE:22:DD' > - ip_addr: '3.4.5.6' > + ip_address_id: <%= Fixtures.identify(:ip_v4_three) %> > usage_type: '1' > bandwidth: 10 > host_id: 10 > boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > + > four: > id: 4 > mac: '00:FF:11:EE:22:DD' > - ip_addr: '3.4.5.6' > + ip_address: <%= Fixtures.identify(:ip_v4_four) %> > usage_type: '1' > bandwidth: 10 > host_id: 10 > boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > > mailserver_nic_one: > - mac: '00:11:22:33:44:55' > - usage_type: '1' > - bandwidth: 100 > - ip_addr: '172.31.0.15' > - host_id: <%= Fixtures.identify(:mailservers_managed_node) %> > - boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > + mac: '00:11:22:33:44:55' > + ip_address: <%= Fixtures.identify(:ip_v4_mailserver_nic_one) %> > + usage_type: '1' > + bandwidth: 100 > + host_id: <%= Fixtures.identify(:mailservers_managed_node) %> > + boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > > mailserver_nic_two: > - mac: '22:11:33:66:44:55' > - usage_type: '1' > - bandwidth: 100 > - host_id: <%= Fixtures.identify(:mailservers_managed_node) %> > - boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %> > + mac: '22:11:33:66:44:55' > + usage_type: '1' > + bandwidth: 100 > + host_id: <%= Fixtures.identify(:mailservers_managed_node) %> > + boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %> > > fileserver_nic_one: > - mac: '00:99:00:99:13:07' > - usage_type: '1' > - bandwidth: 100 > - host_id: <%= Fixtures.identify(:fileserver_managed_node) %> > - boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %> > + mac: '00:99:00:99:13:07' > + usage_type: '1' > + bandwidth: 100 > + host_id: <%= Fixtures.identify(:fileserver_managed_node) %> > + boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %> > > ldapserver_nic_one: > - mac: '00:03:02:00:09:06' > - usage_type: '1' > - bandwidth: 100 > - bridge: 'ovirtbr0' > - ip_addr: '172.31.0.25' > - host_id: <%= Fixtures.identify(:ldapserver_managed_node) %> > - boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > + mac: '00:03:02:00:09:06' > + usage_type: '1' > + bandwidth: 100 > + bridge: 'ovirtbr0' > + ip_address_id: <%= Fixtures.identify(:ip_v4_ldapserver_nic_one) %> > + host_id: <%= Fixtures.identify(:ldapserver_managed_node) %> > + boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > > buildserver_nic_one: > - mac: '07:17:19:65:03:38' > - usage_type: '1' > - bandwidth: 100 > - host_id: <%= Fixtures.identify(:buildserver_managed_node) %> > - boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %> > + mac: '07:17:19:65:03:38' > + usage_type: '1' > + bandwidth: 100 > + host_id: <%= Fixtures.identify(:buildserver_managed_node) %> > + boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %> > > buildserver_nic_two: > - mac: '07:17:19:65:03:39' > - usage_type: '1' > - bandwidth: 100 > - ip_addr: '172.31.0.31' > - netmask: '255.255.255.0' > - broadcast: '172.31.0.255' > - host_id: <%= Fixtures.identify(:buildserver_managed_node) %> > - boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > + mac: '07:17:19:65:03:39' > + usage_type: '1' > + bandwidth: 100 > + ip_address_id: <%= Fixtures.identify(:ip_v4_buildserver_nic_two) %> > + host_id: <%= Fixtures.identify(:buildserver_managed_node) %> > + boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %> > diff --git a/src/test/functional/managed_node_configuration_test.rb b/src/test/functional/managed_node_configuration_test.rb > index d0d8aa3..2158c8d 100644 > --- a/src/test/functional/managed_node_configuration_test.rb > +++ b/src/test/functional/managed_node_configuration_test.rb > @@ -83,17 +83,17 @@ cat <<\EOF > /var/tmp/node-augtool > rm /files/etc/sysconfig/network-scripts/ifcfg-eth0 > set /files/etc/sysconfig/network-scripts/ifcfg-eth0/DEVICE eth0 > set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BOOTPROTO #{nic.boot_type.proto} > -set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR #{nic.ip_addr} > -set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK #{nic.netmask} > -set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST #{nic.broadcast} > +set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR #{nic.ip_address.address} > +set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK #{nic.ip_address.netmask} > +set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST #{nic.ip_address.broadcast} > set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BRIDGE ovirtbr0 > set /files/etc/sysconfig/network-scripts/ifcfg-eth0/ONBOOT yes > rm /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0 > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DEVICE ovirtbr0 > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BOOTPROTO #{nic.boot_type.proto} > -set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR #{nic.ip_addr} > -set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK #{nic.netmask} > -set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST #{nic.broadcast} > +set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR #{nic.ip_address.address} > +set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK #{nic.ip_address.netmask} > +set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST #{nic.ip_address.broadcast} > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/TYPE bridge > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/PEERNTP yes > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DELAY 0 > @@ -123,17 +123,17 @@ cat <<\EOF > /var/tmp/node-augtool > rm /files/etc/sysconfig/network-scripts/ifcfg-eth0 > set /files/etc/sysconfig/network-scripts/ifcfg-eth0/DEVICE eth0 > set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BOOTPROTO #{nic1.boot_type.proto} > -set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR #{nic1.ip_addr} > -set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK #{nic1.netmask} > -set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST #{nic1.broadcast} > +set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR #{nic1.ip_address.address} > +set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK #{nic1.ip_address.netmask} > +set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST #{nic1.ip_address.broadcast} > set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BRIDGE ovirtbr0 > set /files/etc/sysconfig/network-scripts/ifcfg-eth0/ONBOOT yes > rm /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0 > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DEVICE ovirtbr0 > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BOOTPROTO #{nic1.boot_type.proto} > -set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR #{nic1.ip_addr} > -set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK #{nic1.netmask} > -set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST #{nic1.broadcast} > +set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR #{nic1.ip_address.address} > +set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK #{nic1.ip_address.netmask} > +set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST #{nic1.ip_address.broadcast} > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/TYPE bridge > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/PEERNTP yes > set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DELAY 0 > @@ -177,7 +177,7 @@ EOF > cat <<\EOF > /var/tmp/node-augtool > rm /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name} > set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/DEVICE #{bonding.interface_name} > -set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/IPADDR 172.31.0.15 > +set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/IPADDR #{bonding.ip_address.address} > set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/ONBOOT yes > rm /files/etc/sysconfig/network-scripts/ifcfg-eth0 > set /files/etc/sysconfig/network-scripts/ifcfg-eth0/DEVICE eth0 > diff --git a/src/test/unit/ip_address_test.rb b/src/test/unit/ip_address_test.rb > new file mode 100644 > index 0000000..152578e > --- /dev/null > +++ b/src/test/unit/ip_address_test.rb > @@ -0,0 +1,8 @@ > +require 'test_helper' > + > +class IpAddressTest < ActiveSupport::TestCase > + # Replace this with your real tests. > + def test_truth > + assert true > + end > +end > diff --git a/src/test/unit/ip_v4_address_test.rb b/src/test/unit/ip_v4_address_test.rb > new file mode 100644 > index 0000000..14f0175 > --- /dev/null > +++ b/src/test/unit/ip_v4_address_test.rb > @@ -0,0 +1,99 @@ > +# > +# Copyright (C) 2008 Red Hat, Inc. > +# Written by Darryl L. Pierce <dpierce at redhat.com> > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; version 2 of the License. > +# > +# 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, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > +# MA 02110-1301, USA. A copy of the GNU General Public License is > +# also available at http://www.gnu.org/copyleft/gpl.html. > + > +require File.dirname(__FILE__) + '/../test_helper' > + > +class IpV4AddressTest < ActiveSupport::TestCase > + def setup > + @address = IpV4Address.new(:address => '192.168.50.2', > + :netmask => '255.255.255.0', > + :gateway => '192.168.50.1', > + :broadcast => '192.168.50.255') > + end > + > + # Ensures that an address must be supplied. > + # > + def test_valid_fails_without_address > + @address.address = nil > + > + flunk "An address must be present." if @address.valid? > + end > + > + # Ensures that an address has to be in the correct format. > + # > + def test_valid_fails_with_bad_address > + @address.address = '192.168' > + > + flunk "An address must be in the format ##.##.##.##." if @address.valid? > + end > + > + # Ensures that a netmask must be supplied. > + # > + def test_valid_fails_without_netmask > + @address.netmask = nil > + > + flunk "An address must have a netmask." if @address.valid? > + end > + > + # Ensures that a netmask must have the correct format. > + # > + def test_valid_fails_with_bad_netmask > + @address.netmask = 'farkle' > + > + flunk "A netmask must be in the format ##.##.##.##." if @address.valid? > + end > + > + # Ensures that a gateway must be supplied. > + # > + def test_valid_fails_without_gateway > + @address.gateway = nil > + > + flunk "A gateway address must be supplied." if @address.valid? > + end > + > + # Ensures that a gateway must be in the correct format. > + # > + def test_valid_fails_with_bad_gateway > + @address.gateway = '-3.a2.0.8' > + > + flunk "The gateway address must be in the format ##.##.##.##." if @address.valid? > + end > + > + # Ensures that a broadcast must be supplied. > + # > + def test_valid_fails_without_broadcast > + @address.broadcast = nil > + > + flunk "A broadcast addres must be supplied." if @address.valid? > + end > + > + # Ensures that a broadcast must be in the correct format. > + # > + def test_valid_fails_with_bad_broadcast > + @address.broadcast = '-3.2.0.8' > + > + flunk "The broadcast address must be in the format ##.##.##.##." if @address.valid? > + end > + > + # Ensures that a well-formed address is valid. > + # > + def test_valid > + flunk "There is an error with validation." unless @address.valid? > + end > +end > diff --git a/src/test/unit/ip_v6_address_test.rb b/src/test/unit/ip_v6_address_test.rb > new file mode 100644 > index 0000000..a2be85f > --- /dev/null > +++ b/src/test/unit/ip_v6_address_test.rb > @@ -0,0 +1,82 @@ > +# > +# Copyright (C) 2008 Red Hat, Inc. > +# Written by Darryl L. Pierce <dpierce at redhat.com> > +# > +# This program is free software; you can redistribute it and/or modify > +# it under the terms of the GNU General Public License as published by > +# the Free Software Foundation; version 2 of the License. > +# > +# 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, write to the Free Software > +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, > +# MA 02110-1301, USA. A copy of the GNU General Public License is > +# also available at http://www.gnu.org/copyleft/gpl.html. > + > +require File.dirname(__FILE__) + '/../test_helper' > + > +class IpV6AddressTest < ActiveSupport::TestCase > + def setup > + @address = IpV6Address.new(:address => 'fe80:0:0:0:200:f8ff:fe21:67cf', > + :gateway => ':::::::717', > + :prefix => '0000:0000:0000:0000:1234:1234:1234:1234') > + end > + > + # Ensures that the address must be provided. > + # > + def test_valid_fails_without_address > + @address.address = nil > + > + flunk "An address must be provided." if @address.valid? > + end > + > + # Ensures that the address must be in the correct format. > + # > + def test_valid_fails_with_bad_address > + @address.address = "farkle" > + > + flunk "The address must be in the correct format." if @address.valid? > + end > + > + # Ensures that the gateway must be provided. > + # > + def test_valid_fails_without_gateway > + @address.gateway = nil > + > + flunk "The gateway address must be provided." if @address.valid? > + end > + > + # Ensures that the gateway address is in the correct format. > + # > + def test_valid_fails_with_bad_gateway > + @address.gateway = '0-:::::::717' > + > + flunk "The gateway address must be in the correct format." if @address.valid? > + end > + > + # Ensures that the prefix must be provided. > + # > + def test_valid_fails_without_prefix > + @address.prefix = nil > + > + flunk "The prefix must be provided." if @address.valid? > + end > + > + # Ensures that the prefix is in the correct format. > + # > + def test_valid_fails_with_invalid_prefix > + @address.prefix = 'whoops' > + > + flunk "The prefix must be in the correct format." if @address.valid? > + end > + > + # Ensures that a well-formed address is considered valid. > + # > + def test_valid > + flunk "There is an problem with address validation." unless @address.valid? > + end > +end > diff --git a/src/test/unit/nic_test.rb b/src/test/unit/nic_test.rb > index a0776a2..1de1e00 100644 > --- a/src/test/unit/nic_test.rb > +++ b/src/test/unit/nic_test.rb > @@ -20,6 +20,7 @@ > require File.dirname(__FILE__) + '/../test_helper' > > class NicTest < Test::Unit::TestCase > + fixtures :ip_addresses > fixtures :nics > > # Replace this with your real tests. >I ran these tests and everything succeeded flawlessly. For the most part, besides the mentioned items, everything seemed to come together and work nicely. Good job. -Mo
Darryl L. Pierce
2008-Oct-23 11:59 UTC
[Ovirt-devel] [PATCH server] Introduces a new IP address model. Moves IP addressing to a separate
(NOTE: I checked and I believe the BANDWIDTH line that Mo saw previously is just
showing where
that line and those around it were reformatted to keep the code readable)
You will need to run a migration after this patch to create the
ip_addresses table and massage the bondings and nics tables to
reference it.
NEW CLASSES:
IpAddress: base class for addresses
IpV4Address: represents an IPv4 address
IpV6Address: represents an IPv6 address
Signed-off-by: Darryl L. Pierce <dpierce at redhat.com>
---
src/app/models/bonding.rb | 1 +
src/app/models/ip_address.rb | 25 +++++
src/app/models/ip_v4_address.rb | 46 +++++++++
src/app/models/ip_v6_address.rb | 40 ++++++++
src/app/models/nic.rb | 2 +
src/db/migrate/026_create_ip_addresses.rb | 46 +++++++++
...027_move_nic_addresses_to_ip_addresses_table.rb | 56 +++++++++++
...8_move_bonding_address_to_ip_addresses_table.rb | 54 +++++++++++
src/host-browser/host-browser.rb | 17 ++--
src/lib/managed_node_configuration.rb | 8 +-
src/test/fixtures/bondings.yml | 4 +-
src/test/fixtures/ip_addresses.yml | 55 +++++++++++
src/test/fixtures/nics.yml | 82 ++++++++--------
.../functional/managed_node_configuration_test.rb | 26 +++---
src/test/unit/ip_address_test.rb | 8 ++
src/test/unit/ip_v4_address_test.rb | 99 ++++++++++++++++++++
src/test/unit/ip_v6_address_test.rb | 82 ++++++++++++++++
src/test/unit/nic_test.rb | 1 +
18 files changed, 584 insertions(+), 68 deletions(-)
create mode 100644 src/app/models/ip_address.rb
create mode 100644 src/app/models/ip_v4_address.rb
create mode 100644 src/app/models/ip_v6_address.rb
create mode 100644 src/db/migrate/026_create_ip_addresses.rb
create mode 100644
src/db/migrate/027_move_nic_addresses_to_ip_addresses_table.rb
create mode 100644
src/db/migrate/028_move_bonding_address_to_ip_addresses_table.rb
create mode 100644 src/test/fixtures/ip_addresses.yml
create mode 100644 src/test/unit/ip_address_test.rb
create mode 100644 src/test/unit/ip_v4_address_test.rb
create mode 100644 src/test/unit/ip_v6_address_test.rb
diff --git a/src/app/models/bonding.rb b/src/app/models/bonding.rb
index 006c261..2fa4aa8 100644
--- a/src/app/models/bonding.rb
+++ b/src/app/models/bonding.rb
@@ -51,6 +51,7 @@ class Bonding < ActiveRecord::Base
belongs_to :host
belongs_to :bonding_type
belongs_to :boot_type
+ belongs_to :ip_address
has_and_belongs_to_many :nics,
:join_table => 'bondings_nics',
diff --git a/src/app/models/ip_address.rb b/src/app/models/ip_address.rb
new file mode 100644
index 0000000..f48cd4e
--- /dev/null
+++ b/src/app/models/ip_address.rb
@@ -0,0 +1,25 @@
+#
+# ip_address.rb
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +IpAddress+ is the base class for all address related classes.
+#
+class IpAddress < ActiveRecord::Base
+
+end
diff --git a/src/app/models/ip_v4_address.rb b/src/app/models/ip_v4_address.rb
new file mode 100644
index 0000000..4495a13
--- /dev/null
+++ b/src/app/models/ip_v4_address.rb
@@ -0,0 +1,46 @@
+# ip_v4_address.rb
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +IpV4Address+ represents a single IPv4 address.
+#
+class IpV4Address < IpAddress
+ ADDRESS_TEST = %r{^(\d{1,3}\.){3}\d{1,3}$}
+
+ validates_presence_of :address,
+ :message => 'An address must be supplied.'
+ validates_format_of :address,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :netmask,
+ :message => 'A netmask must be supplied.'
+ validates_format_of :netmask,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :gateway,
+ :message => 'A gateway address must be supplied.'
+ validates_format_of :gateway,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :broadcast,
+ :message => 'A broadcast address must be supplied.'
+ validates_format_of :broadcast,
+ :with => ADDRESS_TEST
+
+end
diff --git a/src/app/models/ip_v6_address.rb b/src/app/models/ip_v6_address.rb
new file mode 100644
index 0000000..1395886
--- /dev/null
+++ b/src/app/models/ip_v6_address.rb
@@ -0,0 +1,40 @@
+# ip_v6_address.rb
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# +IpV6Address+ represents a single IPv6 address.
+#
+class IpV6Address < IpAddress
+ ADDRESS_TEST = %r{^([0-9a-fA-F]{0,4}|0)(\:([0-9a-fA-F]{0,4}|0)){7}$}
+
+ validates_presence_of :address,
+ :message => 'An address must be provided.'
+ validates_format_of :address,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :gateway,
+ :message => 'A gateway address must be provided.'
+ validates_format_of :gateway,
+ :with => ADDRESS_TEST
+
+ validates_presence_of :prefix,
+ :message => 'A prefix must be provided.'
+ validates_format_of :prefix,
+ :with => ADDRESS_TEST
+end
diff --git a/src/app/models/nic.rb b/src/app/models/nic.rb
index baf7095..69568a9 100644
--- a/src/app/models/nic.rb
+++ b/src/app/models/nic.rb
@@ -22,4 +22,6 @@ class Nic < ActiveRecord::Base
belongs_to :boot_type
has_and_belongs_to_many :bonding, :join_table => 'bondings_nics'
+
+ belongs_to :ip_address
end
diff --git a/src/db/migrate/026_create_ip_addresses.rb
b/src/db/migrate/026_create_ip_addresses.rb
new file mode 100644
index 0000000..0f528f4
--- /dev/null
+++ b/src/db/migrate/026_create_ip_addresses.rb
@@ -0,0 +1,46 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+# Creates a single-inheritance table for both IPv4 and IPv6
+# addresses.
+#
+class CreateIpAddresses < ActiveRecord::Migration
+ def self.up
+ create_table :ip_addresses do |t|
+ t.string :type
+
+ # common attributes
+ t.string :address, :limit => 39
+ t.string :gateway, :limit => 39
+
+ # attributes for IPv4 (type=IpV4Address)
+ t.string :netmask, :limit => 15
+ t.string :broadcast, :limit => 15
+
+ # attributes for IPv6 (type=IpV6Address)
+ t.string :prefix, :limit => 39
+
+ t.timestamps
+ end
+ end
+
+ def self.down
+ drop_table :ip_addresses
+ end
+end
diff --git a/src/db/migrate/027_move_nic_addresses_to_ip_addresses_table.rb
b/src/db/migrate/027_move_nic_addresses_to_ip_addresses_table.rb
new file mode 100644
index 0000000..b873e4d
--- /dev/null
+++ b/src/db/migrate/027_move_nic_addresses_to_ip_addresses_table.rb
@@ -0,0 +1,56 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+class MoveNicAddressesToIpAddressesTable < ActiveRecord::Migration
+ def self.up
+ add_column :nics, :ip_address_id, :integer, :null => true
+
+ execute 'alter table nics add constraint fk_nic_ip_address
+ foreign key (ip_address_id) references ip_addresses(id)'
+
+ Nic.find(:all).each do |nic|
+ address = IpV4Address.new(:address => nic.ip_addr,
+ :netmask => nic.netmask,
+ :broadcast => nic.broadcast,
+ :gateway => nic.ip_addr)
+ nic.ip_address = address
+
+ nic.save!
+ address.save!
+ end
+
+ remove_column :nics, :ip_addr
+ remove_column :nics, :netmask
+ remove_column :nics, :broadcast
+ end
+
+ def self.down
+ add_column :nics, :ip_addr, :string, :limit => 16
+ add_column :nics, :netmask, :string, :limit => 16
+ add_column :nics, :broadcast, :string, :limit => 16
+
+ Nic.find(:all).each do |nic|
+ nic.ip_addr = nic.ip_address.address
+ nic.netmask = nic.ip_address.netmask
+ nic.broadcast = nic.ip_address.broadcast
+ end
+
+ remove_column :nics, :ip_address_id
+ end
+end
diff --git a/src/db/migrate/028_move_bonding_address_to_ip_addresses_table.rb
b/src/db/migrate/028_move_bonding_address_to_ip_addresses_table.rb
new file mode 100644
index 0000000..b0fed99
--- /dev/null
+++ b/src/db/migrate/028_move_bonding_address_to_ip_addresses_table.rb
@@ -0,0 +1,54 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+class MoveBondingAddressToIpAddressesTable < ActiveRecord::Migration
+ def self.up
+ add_column :bondings, :ip_address_id, :integer, :null => true
+
+ execute 'alter table bondings add constraint fk_bonding_ip_address
+ foreign key (ip_address_id) references ip_addresses(id)'
+
+ Bonding.find(:all).each do |bonding|
+ ip_address = IpV4Address.new(:address => bonding.ip_addr,
+ :netmask => bonding.netmask,
+ :broadcast => bonding.broadcast,
+ :gateway => bonding.ip_addr)
+ end
+
+ remove_column :bondings, :ip_addr
+ remove_column :bondings, :netmask
+ remove_column :bondings, :broadcast
+ end
+
+ def self.down
+ t.string :ip_addr, :null => true, :limit => 15
+ t.string :netmask, :null => true, :limit => 15
+ t.string :broadcast, :null => true, :limit => 15
+
+ Bonding.each do |bonding|
+ bonding.ip_addr = bonding.ip_address.address
+ bonding.netmask = bonding.ip_address.netmask
+ bonding.broadcast = bonding.ip_address.broadcast
+
+ bonding.save!
+ end
+
+ remove_column :bondings, :ip_address_id
+ end
+end
diff --git a/src/host-browser/host-browser.rb b/src/host-browser/host-browser.rb
index 79d34e8..bbfbf3b 100755
--- a/src/host-browser/host-browser.rb
+++ b/src/host-browser/host-browser.rb
@@ -283,10 +283,10 @@ class HostBrowser
updated_nic = Nic.find_by_id(nic.id)
- updated_nic.bandwidth = detail['BANDWIDTH']
- updated_nic.ip_addr = detail['IP_ADDRESS']
- updated_nic.netmask = detail['NETMASK']
- updated_nic.broadcast = detail['BROADCAST']
+ updated_nic.bandwidth =
detail['BANDWIDTH']
+ updated_nic.ip_address.address =
detail['IP_ADDRESS']
+ updated_nic.ip_address.netmask =
detail['NETMASK']
+ updated_nic.ip_address.broadcast =
detail['BROADCAST']
updated_nic.save!
found=true
@@ -310,11 +310,14 @@ class HostBrowser
'mac' => nic['MAC'].upcase,
'bandwidth' => nic['BANDWIDTH'],
'usage_type' => 1,
- 'ip_addr' => nic['IP_ADDRESS'],
- 'netmask' => nic['NETMASK'],
- 'broadcast' => nic['BROADCAST'],
'boot_type_id' => boot_type.id)
+ ip_address = IpV4Address.new('address' =>
nic['IP_ADDRESS'],
+ 'netmask' => nic['NETMASK'],
+ 'broadcast' => nic['BROADCAST'],
+ 'gateway' => nic['GATEWAY'])
+ detail.ip_address = ip_address
+
host.nics << detail
end
diff --git a/src/lib/managed_node_configuration.rb
b/src/lib/managed_node_configuration.rb
index 93f8448..fff7914 100644
--- a/src/lib/managed_node_configuration.rb
+++ b/src/lib/managed_node_configuration.rb
@@ -51,7 +51,7 @@ class ManagedNodeConfiguration
host.bondings.each do |bonding|
result.puts "rm
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}"
result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/DEVICE
#{bonding.interface_name}"
- result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/IPADDR
#{bonding.ip_addr}" if bonding.ip_addr
+ result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/IPADDR
#{bonding.ip_address.address}" if bonding.ip_address
result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{bonding.interface_name}/ONBOOT yes"
bonding.nics.each do |nic|
@@ -97,9 +97,9 @@ class ManagedNodeConfiguration
result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/BOOTPROTO
#{nic.boot_type.proto}"
if nic.boot_type.proto == 'static'
- result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/IPADDR
#{nic.ip_addr}"
- result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/NETMASK
#{nic.netmask}"
- result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/BROADCAST #{nic.broadcast}"
+ result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/IPADDR
#{nic.ip_address.address}"
+ result.puts "set #{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/NETMASK
#{nic.ip_address.netmask}"
+ result.puts "set
#{NIC_ENTRY_PREFIX}/ifcfg-#{iface_name}/BROADCAST
#{nic.ip_address.broadcast}"
end
if bridged
diff --git a/src/test/fixtures/bondings.yml b/src/test/fixtures/bondings.yml
index 29473c7..1a74f42 100644
--- a/src/test/fixtures/bondings.yml
+++ b/src/test/fixtures/bondings.yml
@@ -4,8 +4,6 @@ mailservers_managed_node_bonding:
bonding_type_id: <%= Fixtures.identify(:link_aggregation_bonding_type)
%>
host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
boot_type_id: <%= Fixtures.identify(:boot_type_static) %>
- ip_addr: 172.31.0.15
- netmask: 255.255.255.
- broadcast: 172.31.0.255
+ ip_address_id: <%=
Fixtures.identify(:ip_v4_mailservers_managed_node_bonding) %>
arp_ping_address: 172.31.0.100
arp_interval: 0
diff --git a/src/test/fixtures/ip_addresses.yml
b/src/test/fixtures/ip_addresses.yml
new file mode 100644
index 0000000..0472669
--- /dev/null
+++ b/src/test/fixtures/ip_addresses.yml
@@ -0,0 +1,55 @@
+ip_v4_one:
+ type: IpV4Address
+ address: 1.2.3.4
+ netmask: 255.255.255.0
+ gateway: 1.2.3.1
+ broadcast: 1.2.3.255
+
+ip_v4_two:
+ type: IpV4Address
+ address: 2.3.4.5
+ netmask: 255.255.255.0
+ gateway: 1.2.3.1
+ broadcast: 2.3.4.255
+
+ip_v4_three:
+ type: IpV4Address
+ address: 3.4.5.6
+ netmask: 255.255.255.0
+ gateway: 3.4.5.1
+ broadcast: 3.4.5.255
+
+ip_v4_four:
+ type: IpV4Address
+ address: 3.4.5.6
+ netmask: 255.255.255.0
+ gateway: 3.4.5.1
+ broadcast: 3.4.5.255
+
+ip_v4_mailserver_nic_one:
+ type: IpV4Address
+ address: 172.31.0.15
+ netmask: 255.255.255.0
+ gateway: 172.31.0.1
+ broadcast: 172.31.0.255
+
+ip_v4_ldapserver_nic_one:
+ type: IpV4Address
+ address: 172.31.0.25
+ netmask: 255.255.255.0
+ gateway: 172.31.0.1
+ broadcast: 172.31.0.255
+
+ip_v4_buildserver_nic_two:
+ type: IpV4Address
+ address: 172.31.0.31
+ netmask: 255.255.255.0
+ gateway: 172.31.0.1
+ broadcast: 172.31.0.255
+
+ip_v4_mailservers_managed_node_bonding:
+ type: IpV4Address
+ address: 192.168.50.100
+ netmask: 255.255.255.0
+ gateway: 192.168.50.1
+ broadcast: 192.168.50.255
diff --git a/src/test/fixtures/nics.yml b/src/test/fixtures/nics.yml
index ccf71d2..dbbc511 100644
--- a/src/test/fixtures/nics.yml
+++ b/src/test/fixtures/nics.yml
@@ -1,80 +1,80 @@
one:
id: 1
mac: '00:11:22:33:44:55'
- ip_addr: '1.2.3.4'
- usage_type: '1'
+ ip_address_id: <%= Fixtures.identify(:ip_v4_one) %>
bandwidth: 100
host_id: 10
boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+
two:
id: 2
mac: 'AA:BB:CC:DD:EE:FF'
- ip_addr: '2.3.4.5'
+ ip_address_id: <%= Fixtures.identify(:ip_v4_two) %>
usage_type: '2'
bandwidth: 1000
host_id: 10
boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+
three:
id: 3
mac: '00:FF:11:EE:22:DD'
- ip_addr: '3.4.5.6'
+ ip_address_id: <%= Fixtures.identify(:ip_v4_three) %>
usage_type: '1'
bandwidth: 10
host_id: 10
boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+
four:
id: 4
mac: '00:FF:11:EE:22:DD'
- ip_addr: '3.4.5.6'
+ ip_address: <%= Fixtures.identify(:ip_v4_four) %>
usage_type: '1'
bandwidth: 10
host_id: 10
boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
mailserver_nic_one:
- mac: '00:11:22:33:44:55'
- usage_type: '1'
- bandwidth: 100
- ip_addr: '172.31.0.15'
- host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+ mac: '00:11:22:33:44:55'
+ ip_address: <%= Fixtures.identify(:ip_v4_mailserver_nic_one) %>
+ usage_type: '1'
+ bandwidth: 100
+ host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
mailserver_nic_two:
- mac: '22:11:33:66:44:55'
- usage_type: '1'
- bandwidth: 100
- host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
+ mac: '22:11:33:66:44:55'
+ usage_type: '1'
+ bandwidth: 100
+ host_id: <%= Fixtures.identify(:mailservers_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
fileserver_nic_one:
- mac: '00:99:00:99:13:07'
- usage_type: '1'
- bandwidth: 100
- host_id: <%= Fixtures.identify(:fileserver_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
+ mac: '00:99:00:99:13:07'
+ usage_type: '1'
+ bandwidth: 100
+ host_id: <%= Fixtures.identify(:fileserver_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
ldapserver_nic_one:
- mac: '00:03:02:00:09:06'
- usage_type: '1'
- bandwidth: 100
- bridge: 'ovirtbr0'
- ip_addr: '172.31.0.25'
- host_id: <%= Fixtures.identify(:ldapserver_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+ mac: '00:03:02:00:09:06'
+ usage_type: '1'
+ bandwidth: 100
+ bridge: 'ovirtbr0'
+ ip_address_id: <%= Fixtures.identify(:ip_v4_ldapserver_nic_one) %>
+ host_id: <%= Fixtures.identify(:ldapserver_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
buildserver_nic_one:
- mac: '07:17:19:65:03:38'
- usage_type: '1'
- bandwidth: 100
- host_id: <%= Fixtures.identify(:buildserver_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
+ mac: '07:17:19:65:03:38'
+ usage_type: '1'
+ bandwidth: 100
+ host_id: <%= Fixtures.identify(:buildserver_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_dhcp) %>
buildserver_nic_two:
- mac: '07:17:19:65:03:39'
- usage_type: '1'
- bandwidth: 100
- ip_addr: '172.31.0.31'
- netmask: '255.255.255.0'
- broadcast: '172.31.0.255'
- host_id: <%= Fixtures.identify(:buildserver_managed_node) %>
- boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
+ mac: '07:17:19:65:03:39'
+ usage_type: '1'
+ bandwidth: 100
+ ip_address_id: <%= Fixtures.identify(:ip_v4_buildserver_nic_two) %>
+ host_id: <%= Fixtures.identify(:buildserver_managed_node) %>
+ boot_type_id: <%= Fixtures.identify(:boot_type_static_ip) %>
diff --git a/src/test/functional/managed_node_configuration_test.rb
b/src/test/functional/managed_node_configuration_test.rb
index d0d8aa3..2158c8d 100644
--- a/src/test/functional/managed_node_configuration_test.rb
+++ b/src/test/functional/managed_node_configuration_test.rb
@@ -83,17 +83,17 @@ cat <<\EOF > /var/tmp/node-augtool
rm /files/etc/sysconfig/network-scripts/ifcfg-eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/DEVICE eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BOOTPROTO
#{nic.boot_type.proto}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR #{nic.ip_addr}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK #{nic.netmask}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST #{nic.broadcast}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR
#{nic.ip_address.address}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK
#{nic.ip_address.netmask}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST
#{nic.ip_address.broadcast}
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BRIDGE ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/ONBOOT yes
rm /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DEVICE ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BOOTPROTO
#{nic.boot_type.proto}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR #{nic.ip_addr}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK #{nic.netmask}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST
#{nic.broadcast}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR
#{nic.ip_address.address}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK
#{nic.ip_address.netmask}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST
#{nic.ip_address.broadcast}
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/TYPE bridge
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/PEERNTP yes
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DELAY 0
@@ -123,17 +123,17 @@ cat <<\EOF > /var/tmp/node-augtool
rm /files/etc/sysconfig/network-scripts/ifcfg-eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/DEVICE eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BOOTPROTO
#{nic1.boot_type.proto}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR #{nic1.ip_addr}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK #{nic1.netmask}
-set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST #{nic1.broadcast}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/IPADDR
#{nic1.ip_address.address}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/NETMASK
#{nic1.ip_address.netmask}
+set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BROADCAST
#{nic1.ip_address.broadcast}
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/BRIDGE ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/ONBOOT yes
rm /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DEVICE ovirtbr0
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BOOTPROTO
#{nic1.boot_type.proto}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR #{nic1.ip_addr}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK #{nic1.netmask}
-set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST
#{nic1.broadcast}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/IPADDR
#{nic1.ip_address.address}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/NETMASK
#{nic1.ip_address.netmask}
+set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/BROADCAST
#{nic1.ip_address.broadcast}
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/TYPE bridge
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/PEERNTP yes
set /files/etc/sysconfig/network-scripts/ifcfg-ovirtbr0/DELAY 0
@@ -177,7 +177,7 @@ EOF
cat <<\EOF > /var/tmp/node-augtool
rm /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}
set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/DEVICE
#{bonding.interface_name}
-set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/IPADDR
172.31.0.15
+set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/IPADDR
#{bonding.ip_address.address}
set /files/etc/sysconfig/network-scripts/ifcfg-#{bonding.interface_name}/ONBOOT
yes
rm /files/etc/sysconfig/network-scripts/ifcfg-eth0
set /files/etc/sysconfig/network-scripts/ifcfg-eth0/DEVICE eth0
diff --git a/src/test/unit/ip_address_test.rb b/src/test/unit/ip_address_test.rb
new file mode 100644
index 0000000..152578e
--- /dev/null
+++ b/src/test/unit/ip_address_test.rb
@@ -0,0 +1,8 @@
+require 'test_helper'
+
+class IpAddressTest < ActiveSupport::TestCase
+ # Replace this with your real tests.
+ def test_truth
+ assert true
+ end
+end
diff --git a/src/test/unit/ip_v4_address_test.rb
b/src/test/unit/ip_v4_address_test.rb
new file mode 100644
index 0000000..14f0175
--- /dev/null
+++ b/src/test/unit/ip_v4_address_test.rb
@@ -0,0 +1,99 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class IpV4AddressTest < ActiveSupport::TestCase
+ def setup
+ @address = IpV4Address.new(:address => '192.168.50.2',
+ :netmask => '255.255.255.0',
+ :gateway => '192.168.50.1',
+ :broadcast => '192.168.50.255')
+ end
+
+ # Ensures that an address must be supplied.
+ #
+ def test_valid_fails_without_address
+ @address.address = nil
+
+ flunk "An address must be present." if @address.valid?
+ end
+
+ # Ensures that an address has to be in the correct format.
+ #
+ def test_valid_fails_with_bad_address
+ @address.address = '192.168'
+
+ flunk "An address must be in the format ##.##.##.##." if
@address.valid?
+ end
+
+ # Ensures that a netmask must be supplied.
+ #
+ def test_valid_fails_without_netmask
+ @address.netmask = nil
+
+ flunk "An address must have a netmask." if @address.valid?
+ end
+
+ # Ensures that a netmask must have the correct format.
+ #
+ def test_valid_fails_with_bad_netmask
+ @address.netmask = 'farkle'
+
+ flunk "A netmask must be in the format ##.##.##.##." if
@address.valid?
+ end
+
+ # Ensures that a gateway must be supplied.
+ #
+ def test_valid_fails_without_gateway
+ @address.gateway = nil
+
+ flunk "A gateway address must be supplied." if @address.valid?
+ end
+
+ # Ensures that a gateway must be in the correct format.
+ #
+ def test_valid_fails_with_bad_gateway
+ @address.gateway = '-3.a2.0.8'
+
+ flunk "The gateway address must be in the format ##.##.##.##." if
@address.valid?
+ end
+
+ # Ensures that a broadcast must be supplied.
+ #
+ def test_valid_fails_without_broadcast
+ @address.broadcast = nil
+
+ flunk "A broadcast addres must be supplied." if @address.valid?
+ end
+
+ # Ensures that a broadcast must be in the correct format.
+ #
+ def test_valid_fails_with_bad_broadcast
+ @address.broadcast = '-3.2.0.8'
+
+ flunk "The broadcast address must be in the format ##.##.##.##."
if @address.valid?
+ end
+
+ # Ensures that a well-formed address is valid.
+ #
+ def test_valid
+ flunk "There is an error with validation." unless @address.valid?
+ end
+end
diff --git a/src/test/unit/ip_v6_address_test.rb
b/src/test/unit/ip_v6_address_test.rb
new file mode 100644
index 0000000..a2be85f
--- /dev/null
+++ b/src/test/unit/ip_v6_address_test.rb
@@ -0,0 +1,82 @@
+#
+# Copyright (C) 2008 Red Hat, Inc.
+# Written by Darryl L. Pierce <dpierce at redhat.com>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; version 2 of the License.
+#
+# 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, write to the Free Software
+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
+# MA 02110-1301, USA. A copy of the GNU General Public License is
+# also available at http://www.gnu.org/copyleft/gpl.html.
+
+require File.dirname(__FILE__) + '/../test_helper'
+
+class IpV6AddressTest < ActiveSupport::TestCase
+ def setup
+ @address = IpV6Address.new(:address =>
'fe80:0:0:0:200:f8ff:fe21:67cf',
+ :gateway => ':::::::717',
+ :prefix => '0000:0000:0000:0000:1234:1234:1234:1234')
+ end
+
+ # Ensures that the address must be provided.
+ #
+ def test_valid_fails_without_address
+ @address.address = nil
+
+ flunk "An address must be provided." if @address.valid?
+ end
+
+ # Ensures that the address must be in the correct format.
+ #
+ def test_valid_fails_with_bad_address
+ @address.address = "farkle"
+
+ flunk "The address must be in the correct format." if
@address.valid?
+ end
+
+ # Ensures that the gateway must be provided.
+ #
+ def test_valid_fails_without_gateway
+ @address.gateway = nil
+
+ flunk "The gateway address must be provided." if @address.valid?
+ end
+
+ # Ensures that the gateway address is in the correct format.
+ #
+ def test_valid_fails_with_bad_gateway
+ @address.gateway = '0-:::::::717'
+
+ flunk "The gateway address must be in the correct format." if
@address.valid?
+ end
+
+ # Ensures that the prefix must be provided.
+ #
+ def test_valid_fails_without_prefix
+ @address.prefix = nil
+
+ flunk "The prefix must be provided." if @address.valid?
+ end
+
+ # Ensures that the prefix is in the correct format.
+ #
+ def test_valid_fails_with_invalid_prefix
+ @address.prefix = 'whoops'
+
+ flunk "The prefix must be in the correct format." if
@address.valid?
+ end
+
+ # Ensures that a well-formed address is considered valid.
+ #
+ def test_valid
+ flunk "There is an problem with address validation." unless
@address.valid?
+ end
+end
diff --git a/src/test/unit/nic_test.rb b/src/test/unit/nic_test.rb
index a0776a2..1de1e00 100644
--- a/src/test/unit/nic_test.rb
+++ b/src/test/unit/nic_test.rb
@@ -20,6 +20,7 @@
require File.dirname(__FILE__) + '/../test_helper'
class NicTest < Test::Unit::TestCase
+ fixtures :ip_addresses
fixtures :nics
# Replace this with your real tests.
--
1.5.5.1