[Ovirt-devel] [PATCH server] missing ovirt wui validations

Jason Guiditta jguiditt at redhat.com
Wed Dec 10 22:25:47 UTC 2008


Coming along nicely, some comments/corrections inline.
There are some whitespace errors with the patch:

Applying missing ovirt wui validations
.dotest/patch:44: trailing whitespace.
       unless item_class.find(x).movable? 
.dotest/patch:81: trailing whitespace.
        :success => false, 
.dotest/patch:474: trailing whitespace.
  validates_numericality_of :size, 
.dotest/patch:496: trailing whitespace.
     if vms.size > 0 or 
.dotest/patch:498: trailing whitespace.
           return false 
warning: 5 lines add whitespace errors.

On Tue, 2008-12-09 at 11:00 -0500, Mohammed Morsi wrote:
> this patch is now syntactically correct and will run when invoking
> db:migrate or when running the tests. several tests now fail though
> and need to be debugged / possibly changed
> 
> Attached is additional validations, added to the rails model
> and controller layers verifying:
>   bondings: arp related fields
>   boot_types: label uniqueness and proto inclusion
>   cpus: various fields are set and min values
>   help_sections: presence and uniqueness of fields
>   hosts: presence and format of various fields
>   ip_addresses: fk existance / integrity
>   nics: mac address format
>   permissions: presence / inclusion of various fields
>   pools: fields requied for tree present
>   quotas: minimum values
>   smart_pool_tags: tagged_id / type fk present
>   storage_pools: type, state field inclusion, min values
>   storage_volumes: various fields, subclasses w/ various fields
>   tasks: various fields present and consistensy maintained
>   usages: label, other fields present, unique
>   vms: uuid of correct format, min values, various fields present
> 
>   can only add / move host and storage volumes and pools to / from pools
>   when you have sufficient permissions and target entities don't have
>   associated vms
> 
>   can only destroy storage volumes / pools if there are no attached vms
> ---
>  src/app/controllers/hardware_controller.rb |   28 +++++++++++++++++++++-
>  src/app/controllers/storage_controller.rb  |    7 +++++
>  src/app/models/bonding.rb                  |   11 +++++++++
>  src/app/models/boot_type.rb                |    5 ++++
>  src/app/models/cpu.rb                      |   23 +++++++++++++++++++
>  src/app/models/help_section.rb             |   34 ++++++++++++++++++++++++++++
>  src/app/models/host.rb                     |   21 +++++++++++++++++
>  src/app/models/ip_address.rb               |    4 +++
>  src/app/models/iscsi_storage_volume.rb     |    2 +
>  src/app/models/lvm_storage_volume.rb       |    6 +++++
>  src/app/models/nfs_storage_pool.rb         |    3 ++
>  src/app/models/nic.rb                      |   11 +++++++++
>  src/app/models/permission.rb               |    7 +++++
>  src/app/models/pool.rb                     |    7 +++++
>  src/app/models/quota.rb                    |   22 ++++++++++++++++++
>  src/app/models/smart_pool_tag.rb           |    5 ++++
>  src/app/models/storage_pool.rb             |   17 ++++++++++++++
>  src/app/models/storage_volume.rb           |   21 +++++++++++++++++
>  src/app/models/task.rb                     |   15 ++++++++++++
>  src/app/models/usage.rb                    |    6 +++++
>  src/app/models/vm.rb                       |   34 ++++++++++++++++++++++++++-
>  21 files changed, 285 insertions(+), 4 deletions(-)
> 
> diff --git a/src/app/controllers/hardware_controller.rb b/src/app/controllers/hardware_controller.rb
> index 4dda736..cf45c49 100644
> --- a/src/app/controllers/hardware_controller.rb
> +++ b/src/app/controllers/hardware_controller.rb
> @@ -303,15 +303,39 @@ class HardwareController < PoolController
>      resource_ids_str = params[:resource_ids]
>      resource_ids = resource_ids_str.split(",").collect {|x| x.to_i}
>  
> +    # if user doesn't have modify permission on both source and destination
> +    unless @pool.can_modify(@user) and Pool.find(params[:target_pool_id]).can_modify(@user)
> +        render :json => { :success => false,
> +               :alert => "Cannot #{item_action.to_s} #{item_class.table_name.humanize} without admin permissions on both pools" }
> +        return
> +    end
> +
> +    # relay error message if movable check fails for any resource
> +    success = true
> +    failed_resources = ""
> +    resource_ids.each {|x|
> +       unless item_class.find(x).movable? 
> +         success = false
> +         failed_resources += x.to_s + " "
> +       end
> +    }
> +    resource_ids.delete_if { |x| ! item_class.find(x).movable? }
> +
>      begin
>        @pool.transaction do
>          @pool.send(item_method, resource_ids, target_pool_id)
>        end
> +    rescue
> +      success = false
> +    end
> +
> +    if success
>        render :json => { :success => true,
>          :alert => "#{item_action.to_s} #{item_class.table_name.humanize} successful." }
> -    rescue
> +    else
>        render :json => { :success => false,
> -        :alert => "#{item_action.to_s} #{item_class.table_name.humanize} failed." }
> +         :alert => "#{item_action.to_s} #{item_class.table_name.humanize} failed" +
> +                   (failed_resources == "" ? "." : " for " + failed_resources) }
>      end
>    end
Very nice, I like this much better than the first rev.

>  
> diff --git a/src/app/controllers/storage_controller.rb b/src/app/controllers/storage_controller.rb
> index 148d1be..47e9e14 100644
> --- a/src/app/controllers/storage_controller.rb
> +++ b/src/app/controllers/storage_controller.rb
> @@ -310,6 +310,13 @@ class StorageController < ApplicationController
>    end
>  
>    def destroy
> +    unless @storage_pool.movable?
> +     format.json { render :json => { :object => "storage_pool",
> +        :success => false, 
> +        :alert => "Cannot delete storage with associated vms" } }
> +     return
> +    end
> +
>      pool = @storage_pool.hardware_pool
>      if @storage_pool.destroy
>        alert="Storage Pool was successfully deleted."
> diff --git a/src/app/models/bonding.rb b/src/app/models/bonding.rb
> index c9af38c..fabdb67 100644
> --- a/src/app/models/bonding.rb
> +++ b/src/app/models/bonding.rb
> @@ -30,6 +30,8 @@
>  # interface. They can be ignored if not used.
>  #
>  class Bonding < ActiveRecord::Base
> +
> +
>    belongs_to :host
>    belongs_to :bonding_type
>    belongs_to :vlan
> @@ -58,6 +60,15 @@ class Bonding < ActiveRecord::Base
>    validates_presence_of :vlan_id,
>      :message => 'A vlan must be specified.'
>  
> +  # verify arp ping address to be ipv4 if set
> +  validates_format_of :arp_ping_address,
> +     :with => %r{^(\d{1,3}\.){3}\d{1,3}$},
> +     :unless => Proc.new { |bonding| bonding.arp_ping_address.nil? }
> +
> +  validates_numericality_of :arp_interval,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new { |bonding| bonding.arp_interval.nil? }
> +
>   protected
>    def validate
>      if vlan.boot_type.proto == 'static' and ip_addresses.size == 0
> diff --git a/src/app/models/boot_type.rb b/src/app/models/boot_type.rb
> index 8ffbe67..6cfdb04 100644
> --- a/src/app/models/boot_type.rb
> +++ b/src/app/models/boot_type.rb
> @@ -18,4 +18,9 @@
>  # also available at http://www.gnu.org/copyleft/gpl.html.
>  
>  class BootType < ActiveRecord::Base
> +  validates_presence_of :label
> +  validates_uniqueness_of :label,
> +    :message => 'Label must be unique'
> +  validates_inclusion_of :proto,
> +    :in => %w( static dhcp bootp )
>  end
> diff --git a/src/app/models/cpu.rb b/src/app/models/cpu.rb
> index 1a7d3cf..714a8ed 100644
> --- a/src/app/models/cpu.rb
> +++ b/src/app/models/cpu.rb
> @@ -21,4 +21,27 @@
>  #
>  class Cpu < ActiveRecord::Base
>      belongs_to :host
> +
> +    validates_presence_of :host_id,
> +        :message => 'A host must be specified.'
> +
> +    validates_numericality_of :cpu_number,
> +        :greater_than_or_equal_to => 0
> +
> +    validates_numericality_of :core_number,
> +        :greater_than_or_equal_to => 0
> +
> +    validates_numericality_of :number_of_cores,
> +        :greater_than_or_equal_to => 1
> +
> +    validates_numericality_of :cpuid_level,
> +        :greater_than_or_equal_to => 0
> +
> +    validates_numericality_of :speed,
> +        :greater_than => 0
> +    # also verify speed in MHz ?
> +
> +    validates_presence_of :vendor
> +    validates_presence_of :model
> +    validates_presence_of :family
>  end
> diff --git a/src/app/models/help_section.rb b/src/app/models/help_section.rb
> index a891383..1de1e5a 100644
> --- a/src/app/models/help_section.rb
> +++ b/src/app/models/help_section.rb
> @@ -1,2 +1,36 @@
> +# Copyright (C) 2008 Red Hat, Inc.
> +# Written by Mohammed Morsi <mmorsi 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.
> +#
> +# +HelpSection+ defines a section of the web help document to be
> +# available for a specific controller / action
> +#
>  class HelpSection < ActiveRecord::Base
> +
> +    validates_uniqueness_of :action,
> +        :scope => :controller
Missing ',' on above line
> +        :message => 'Controller / Action must be unique'
> +
> +    validates_presence_of :controller,
> +        :message => 'A controller must be specified.'
> +
> +    validates_presence_of :action,
> +        :message => 'An action must be specified.'
> +
> +    validates_presence_of :section,
> +        :message => 'A section must be specified.'
>  end
> diff --git a/src/app/models/host.rb b/src/app/models/host.rb
> index 640782d..ef495ff 100644
> --- a/src/app/models/host.rb
> +++ b/src/app/models/host.rb
> @@ -51,6 +51,17 @@ class Host < ActiveRecord::Base
>                               [ :search_users, 'U', "search_users" ] ],
>                   :eager_load => :smart_pools
>  
> +  validates_presence_of :hardware_pool_id,
> +     :message => 'A hardware pool id must be specified.'
> +
> +  validates_presence_of :uuid,
> +     :message => 'A uuid must be specified.'
> +
> +  validates_presence_of :hostname,
> +     :message => 'A hostname must be specified.'
> +
> +  validates_presence_of :arch,
> +     :message => 'An arch must be specified.'
>  
>    KVM_HYPERVISOR_TYPE = "KVM"
>    HYPERVISOR_TYPES = [KVM_HYPERVISOR_TYPE]
> @@ -58,6 +69,12 @@ class Host < ActiveRecord::Base
>    STATE_AVAILABLE   = "available"
>    STATES = [STATE_UNAVAILABLE, STATE_AVAILABLE]
>  
> +  validates_inclusion_of :hypervisor_type,
> +     :in => HYPERVISOR_TYPES
> +
> +  validates_inclusion_of :state,
> +     :in => STATES + Task::COMPLETED_STATES + TASK::WORKING_STATES
2nd 'Task' should not be all caps
> +
>    def memory_in_mb
>      kb_to_mb(memory)
>    end
> @@ -99,4 +116,8 @@ class Host < ActiveRecord::Base
>      hardware_pool.search_users
>    end
>  
> +  def movable?
> +     return vms.size == 0
> +  end
> +
>  end
> diff --git a/src/app/models/ip_address.rb b/src/app/models/ip_address.rb
> index 5d2e6af..3f246b1 100644
> --- a/src/app/models/ip_address.rb
> +++ b/src/app/models/ip_address.rb
> @@ -24,4 +24,8 @@ class IpAddress < ActiveRecord::Base
>     belongs_to :network
>     belongs_to :nic
>     belongs_to :bonding
> +
> +   def validate
> +     errors.add("id", "ip must be associated with foreign entity") if network_id.nil? and nic_id.nil? and bonding_id.nil?
> +   end
>  end
> diff --git a/src/app/models/iscsi_storage_volume.rb b/src/app/models/iscsi_storage_volume.rb
> index 48edbd8..fe2cbf5 100644
> --- a/src/app/models/iscsi_storage_volume.rb
> +++ b/src/app/models/iscsi_storage_volume.rb
> @@ -31,4 +31,6 @@ class IscsiStorageVolume < StorageVolume
>      return true
>    end
>  
> +  validates_presence_of :lun
> +
>  end
> diff --git a/src/app/models/lvm_storage_volume.rb b/src/app/models/lvm_storage_volume.rb
> index 8eb1f0e..38949ce 100644
> --- a/src/app/models/lvm_storage_volume.rb
> +++ b/src/app/models/lvm_storage_volume.rb
> @@ -29,4 +29,10 @@ class LvmStorageVolume < StorageVolume
>    def volume_create_params
>      return lv_name, size, lv_owner_perms, lv_group_perms, lv_mode_perms
>    end
> +
> +  validates_presence_of :lv_name
> +  validates_presence_of :lv_owner_perms
> +  validates_presence_of :lv_group_perms
> +  validates_presence_of :lv_mode_perms
> +
>  end
> diff --git a/src/app/models/nfs_storage_pool.rb b/src/app/models/nfs_storage_pool.rb
> index 398e3f9..da0d4b4 100644
> --- a/src/app/models/nfs_storage_pool.rb
> +++ b/src/app/models/nfs_storage_pool.rb
> @@ -29,4 +29,7 @@ class NfsStoragePool < StoragePool
>    def user_subdividable
>      true
>    end
> +
> +  validates_presence_of :filename
> +
>  end
> diff --git a/src/app/models/nic.rb b/src/app/models/nic.rb
> index 5649763..aa9c740 100644
> --- a/src/app/models/nic.rb
> +++ b/src/app/models/nic.rb
> @@ -24,12 +24,23 @@ class Nic < ActiveRecord::Base
>  
>    has_and_belongs_to_many :bondings, :join_table => 'bondings_nics'
>  
> +  validates_presence_of :mac,
> +    :message => 'A mac must be specified.'
> +
> +  validates_format_of :mac,
> +    :with => %r{^([0-9a-f]{2}([:-]|$)){6}$}
> +
>    validates_presence_of :host_id,
>      :message => 'A host must be specified.'
>  
>    validates_presence_of :physical_network_id,
>      :message => 'A network must be specified.'
>  
> +  validates_numericality_of :bandwidth,
> +     :greater_than_or_equal_to => 0
> +
> +  # validate 'bridge' or 'usage_type' attribute ?
> +
>    protected
>     def validate
>      if physical_network.boot_type.proto == 'static' and ip_addresses.size == 0
> diff --git a/src/app/models/permission.rb b/src/app/models/permission.rb
> index ece3da5..b3929ad 100644
> --- a/src/app/models/permission.rb
> +++ b/src/app/models/permission.rb
> @@ -24,9 +24,12 @@ class Permission < ActiveRecord::Base
>    has_many   :child_permissions, :dependent => :destroy,
>               :class_name => "Permission", :foreign_key => "inherited_from_id"
>  
> +  validates_presence_of :pool_id
>  
> +  validates_presence_of :uid
>    validates_uniqueness_of :uid, :scope => [:pool_id, :inherited_from_id]
>  
> +
>    ROLE_SUPER_ADMIN = "Super Admin"
>    ROLE_ADMIN       = "Administrator"
>    ROLE_USER        = "User"
> @@ -44,6 +47,10 @@ class Permission < ActiveRecord::Base
>              ROLE_USER        => [PRIV_VIEW, PRIV_VM_CONTROL],
>              ROLE_MONITOR     => [PRIV_VIEW]}
>   
> +
> +  validates_inclusion_of :user_role,
> +     :in => ROLES.keys
> +
>    def self.invert_roles
>      return_hash = {}
>      ROLES.each do |role, privs|
> diff --git a/src/app/models/pool.rb b/src/app/models/pool.rb
> index 7034e79..5cfc947 100644
> --- a/src/app/models/pool.rb
> +++ b/src/app/models/pool.rb
> @@ -52,6 +52,13 @@ class Pool < ActiveRecord::Base
>    validates_presence_of :name
>    validates_uniqueness_of :name, :scope => :parent_id
>  
> +  validates_presence_of :parent_id
> +  validates_presence_of :lft
> +  validates_presence_of :rgt
> +
> +  validates_inclusion_of :type,
> +    :in => %w( DirectoryPool HardwarePool VmResourcePool SmartPool )
> +
>    # overloading this method such that we can use permissions.admins to get all the admins for an object
>    has_many :permissions, :dependent => :destroy, :order => "id ASC" do
>      def super_admins
> diff --git a/src/app/models/quota.rb b/src/app/models/quota.rb
> index fc52177..2a9e0f0 100644
> --- a/src/app/models/quota.rb
> +++ b/src/app/models/quota.rb
> @@ -22,6 +22,28 @@ require 'util/ovirt'
>  class Quota < ActiveRecord::Base
>    belongs_to :pool
>  
> +  validates_presence_of :pool_id
> +
> +
> +  validates_numericality_of :total_vcpus,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new{ |quota| quota.total_vcpus.nil? }
> +
> +  validates_numericality_of :total_vmemory,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new{ |quota| quota.total_vmemory.nil? }
> +
> +  validates_numericality_of :total_vnics,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new{ |quota| quota.total_vnics.nil? }
> +
> +  validates_numericality_of :total_storage,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new{ |quota| quota.total_storage.nil? }
> +
> +  validates_numericality_of :total_vms,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new{ |quota| quota.total_vms.nil? }
>  
>    def total_vmemory_in_mb
>      kb_to_mb(total_vmemory)
> diff --git a/src/app/models/smart_pool_tag.rb b/src/app/models/smart_pool_tag.rb
> index e135ddf..00bb5a7 100644
> --- a/src/app/models/smart_pool_tag.rb
> +++ b/src/app/models/smart_pool_tag.rb
> @@ -31,6 +31,11 @@ class SmartPoolTag < ActiveRecord::Base
>  
>    validates_uniqueness_of :smart_pool_id, :scope => [:tagged_id, :tagged_type]
>  
> +  validates_presence_of :tagged_id
> +
> +  validates_inclusion_of :tagged_type,
> +    :in => %w( Pool StoragePool Host Vm )
> +
>    def tagged_type=(sType)
>      super(sType.to_s.classify.constantize.base_class.to_s)
>    end
> diff --git a/src/app/models/storage_pool.rb b/src/app/models/storage_pool.rb
> index bab7031..f9abb55 100644
> --- a/src/app/models/storage_pool.rb
> +++ b/src/app/models/storage_pool.rb
> @@ -39,6 +39,13 @@ class StoragePool < ActiveRecord::Base
>  
>    validates_presence_of :hardware_pool_id
>  
> +  validates_inclusion_of :type,
> +    :in => %w( IscsiStoragePool LvmStoragePool NfsStoragePool )
> +
> +
> +  validates_numericality_of :capacity,
> +     :greater_than_or_equal_to => 0
> +
>    acts_as_xapian :texts => [ :ip_addr, :target, :export_path, :type ],
>                   :terms => [ [ :search_users, 'U', "search_users" ] ],
>                   :eager_load => :smart_pools
> @@ -54,6 +61,9 @@ class StoragePool < ActiveRecord::Base
>    STATE_PENDING_DELETION = "pending_deletion"
>    STATE_AVAILABLE        = "available"
>  
> +  validates_inclusion_of :state,
> +    :in => [ STATE_PENDING_SETUP, STATE_PENDING_DELETION, STATE_AVAILABLE]
> +
>    def self.factory(type, params = {})
>      params[:state] = STATE_PENDING_SETUP unless params[:state]
>      case type
> @@ -121,4 +131,11 @@ class StoragePool < ActiveRecord::Base
>      end
>      return_hash
>    end
> +
> +  def movable?
> +    storage_volumes.each{ |x|
> +       return false unless x.movable?
> +    }
> +    return true
> +  end
>  end
> diff --git a/src/app/models/storage_volume.rb b/src/app/models/storage_volume.rb
> index 39b72d5..385c126 100644
> --- a/src/app/models/storage_volume.rb
> +++ b/src/app/models/storage_volume.rb
> @@ -32,10 +32,23 @@ class StorageVolume < ActiveRecord::Base
>      end
>    end
>  
> +  validates_presence_of :storage_pool_id
> +
> +
> +  validates_numericality_of :size, 
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new { |storage_volume| storage_volume.nil? }
> +
> +  validates_inclusion_of :type,
> +    :in => %w( IscsiStorageVolume LvmStorageVolume NfsStorageVolume )
> +
>    STATE_PENDING_SETUP    = "pending_setup"
>    STATE_PENDING_DELETION = "pending_deletion"
>    STATE_AVAILABLE        = "available"
>  
> +  validates_inclusion_of :state,
> +    :in => [ STATE_PENDING_SETUP, STATE_PENDING_DELETION, STATE_AVAILABLE]
> +
>    def self.factory(type, params = {})
>      params[:state] = STATE_PENDING_SETUP unless params[:state]
>      case type
> @@ -131,4 +144,12 @@ class StorageVolume < ActiveRecord::Base
>      return_hash
>    end
>  
> +  def movable?
> +     if vms.size > 0 or 
> +         (not lvm_storage_pool.nil? and not lvm_stoage_pool.movable?)
typo lvm_stoage_pool [unless that was an elmer fudd ref?  ;) ]
and shouldn't it be '!' rather than 'not'?
> +           return false 
> +     end
> +     return true
> +  end
> +
>  end
> diff --git a/src/app/models/task.rb b/src/app/models/task.rb
> index f231c18..e6b9079 100644
> --- a/src/app/models/task.rb
> +++ b/src/app/models/task.rb
> @@ -45,6 +45,16 @@ class Task < ActiveRecord::Base
>    COMPLETED_STATES = [STATE_FINISHED, STATE_FAILED, STATE_CANCELED]
>    WORKING_STATES   = [STATE_QUEUED, STATE_RUNNING, STATE_PAUSED]
>  
> +  validates_inclusion_of :type,
> +    :in => %w( HostTask StorageTask StorageVolumeTask VmTask )
> +
> +  validates_inclusion_of :state,
> +    :in => COMPLETED_STATES + WORKING_STATES
> +
> +  # FIXME validate action depending on type / subclass
> +  # validate task_target_id, task_type_id, arg, message
> +  #   depending on subclass, action, state
> +
>    def cancel
>      self[:state] = STATE_CANCELED
>      save!
> @@ -71,4 +81,9 @@ class Task < ActiveRecord::Base
>      ""
>    end
>  
> +  def validate
> +    errors.add("time_ended", "Tasks ends before its started") unless time_ended > time_started
> +    errors.add("time_started", "Tasks starts before its created") unless time_started > time_created
> +  end
> +
>  end
> diff --git a/src/app/models/usage.rb b/src/app/models/usage.rb
> index 353e8f4..59b0e48 100644
> --- a/src/app/models/usage.rb
> +++ b/src/app/models/usage.rb
> @@ -18,4 +18,10 @@
>  
>  class Usage < ActiveRecord::Base
>    has_and_belongs_to_many :networks, :join_table => 'networks_usages'
> +
> +  validates_presence_of :label
> +  validates_presence_of :usage
> +
> +  validates_uniqueness_of :usage
> +
>  end
> diff --git a/src/app/models/vm.rb b/src/app/models/vm.rb
> index 227f343..4d66c63 100644
> --- a/src/app/models/vm.rb
> +++ b/src/app/models/vm.rb
> @@ -34,7 +34,32 @@ class Vm < ActiveRecord::Base
>  
>    validates_presence_of :uuid, :description, :num_vcpus_allocated,
>                          :boot_device, :memory_allocated_in_mb,
> -                        :memory_allocated, :vnic_mac_addr
> +                        :memory_allocated, :vnic_mac_addr,
> +                        :vm_resource_pool_id
> +
> +  validates_format_of :uuid,
> +     :with => %r([a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12})
> +
> +  validates_numericality_of :needs_restart,
> +     :greater_than_or_equal_to => 0,
> +     :less_than_or_equal_to => 1,
> +     :unless => Proc.new{ |vm| vm.needs_restart.nil? }
> +
> +  validates_numericality_of :memory_used,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new{ |vm| vm.memory_used.nil? }
> +
> +  validates_numericality_of :vnc_port,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new{ |vm| vm.vnc_port.nil? }
> +
> +  validates_numericality_of :num_vcpus_allocated,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new{ |vm| vm.num_vcpus_allocated.nil? }
> +
> +  validates_numericality_of :memory_allocated,
> +     :greater_than_or_equal_to => 0,
> +     :unless => Proc.new{ |vm| vm.memory_allocated.nil? }
>  
>    acts_as_xapian :texts => [ :uuid, :description, :vnic_mac_addr, :state ],
>                   :terms => [ [ :search_users, 'U', "search_users" ] ],
> @@ -117,9 +142,14 @@ class Vm < ActiveRecord::Base
>                         STATE_SAVED         => STATE_SAVED,
>                         STATE_RESTORING     => STATE_RUNNING,
>                         STATE_MIGRATING     => STATE_RUNNING,
> -                       STATE_CREATE_FAILED => STATE_CREATE_FAILED}
> +                       STATE_CREATE_FAILED => STATE_CREATE_FAILED,
> +                       STATE_INVALID       => STATE_INVALID}
>    TASK_STATE_TRANSITIONS = []
>  
> +  validates_inclusion_of :state,
> +     :in => EFFECTIVE_STATE.keys
> +
> +
>    def get_hardware_pool
>      pool = vm_resource_pool
>      pool = pool.get_hardware_pool if pool




More information about the ovirt-devel mailing list