[Ovirt-devel] [PATCH server] Introduces a new IP address model. Moves IP addressing to a separate

Darryl L. Pierce dpierce at redhat.com
Fri Oct 17 21:11:04 UTC 2008


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




More information about the ovirt-devel mailing list