lib/dcmgr/models/instance_spec.rb in wakame-vdc-agents-11.06.0 vs lib/dcmgr/models/instance_spec.rb in wakame-vdc-agents-11.12.0
- old
+ new
@@ -2,56 +2,188 @@
module Dcmgr::Models
class InstanceSpec < AccountResource
taggable 'is'
- inheritable_schema do
- String :name, :null=>false
- String :hypervisor, :null=>false
- String :arch, :null=>false
-
- Fixnum :cpu_cores, :null=>false, :unsigned=>true
- Fixnum :memory_size, :null=>false, :unsigned=>true
- Float :quota_weight, :null=>false, :default=>1.0
- Text :config, :null=>false, :default=>''
- Text :storage, :null=>false, :default=>''
-
- index [:account_id, :name], {:unique=>true}
- end
- with_timestamps
-
# serialization plugin must be defined at the bottom of all class
# method calls.
- # Possible column data:
- # hypervisor=kvm:
- # {:block_driver=>'virtio', :nic_driver=>'virtio'}
plugin :serialization
serialize_attributes :yaml, :config
- # hypervisor=kvm:
- # { 'sdc' => {:type=>:vdcvol, :size=>100, :dev=>'/dev/sdc'},
- # 'eph1' => {:type=>:ephemeral, :size=>1000, :dev=>'/dev/sdb'}}
- serialize_attributes :yaml, :storage
+ # initial attached virtual interface definition:
+ # {
+ # 'vif1' => {
+ # :index => 0, # (>=0) required and unique
+ # :bandwidth=>512, # (kbps) required
+ # },
+ # 'vif2' => {
+ # :index => 10, # (>=0) required and unique
+ # :bandwidth=>50000, # (kbps) required
+ # },
+ # }
+ serialize_attributes :yaml, :vifs
+ # initial attached disk definition:
+ # {
+ # # blank disk image file on host OS for swap device.
+ # 'swap1' => {
+ # :index => 0, # (>=0) required and unique
+ # :type => :local, # required
+ # :size => 100, # (MB) required
+ # },
+ # # attach volume disk from snapshot.
+ # 'volume1' => {
+ # :index => 1, # (>=0) required and unique
+ # :type => :volume, # required
+ # :snapshot_id => 'snap-xxxxxx', # required
+ # },
+ # # attach blank volume disk.
+ # 'volume2' => {
+ # :index => 5, # (>=0) required and unique
+ # :type => :volume, # required
+ # :size => 100, # (MB) required
+ # },
+ # }
+ serialize_attributes :yaml, :drives
- def before_validate
- default_config =
- case self.hypervisor
- when HostPool::HYPERVISOR_KVM
- {:block_driver=>'virtio', :nic_driver=>'virtio'}
- end
+ def before_validation
+ default_config = {}
self.config = default_config.merge(self.config || {})
+
+ # Set empty hash for
+ self.vifs ||= {}
+ self.drives ||= {}
super
end
+ def validate
+ super
+
+ # uniquness check for :index
+ unless self.vifs.values.map {|i| i[:index] }.uniq.size == self.vifs.size
+ errors.add(:vifs, "duplicate index value.")
+ end
+ unless self.drives.values.map {|i| i[:index] }.uniq.size == self.drives.size
+ errors.add(:drives, "duplicate index value.")
+ end
+ end
+
+ def before_destroy
+ if !Instance.alives.filter(:instance_spec_id=>self.id).empty?
+ raise "There are one or more running instances refers this record."
+ end
+
+ super
+ end
+
def to_hash
super.merge({:config=>self.config, # yaml -> Hash
- :storage => self.storage, # yaml -> Hash
+ :vifs => self.vifs, # yaml -> Hash
+ :drives => self.drives, # yaml -> Hash
})
end
def to_api_document
- doc = to_hash
+ doc = super()
doc.delete(:config)
doc
end
+
+ # Modify methods for vifs,drives hash parameters.
+ def add_vif(name, index, bandwidth)
+ raise "Duplicate interface name: #{name}" if self.vifs.has_key?(name)
+ self.vifs[name]={
+ :index => index,
+ :bandwidth => bandwidth,
+ }
+ self.changed_columns << :vifs
+ self
+ end
+
+ def update_vif_index(name, new_index)
+ raise "Unknown interface name: #{name}" if !self.vifs.has_key?(name)
+ self.vifs[name][:index]=new_index
+ self.changed_columns << :vifs
+ self
+ end
+
+ def update_vif_bandwidth(name, bandwidth)
+ raise "Unknown interface name: #{name}" if !self.vifs.has_key?(name)
+ self.vifs[name][:bandwidth]=bandwidth
+ self.changed_columns << :vifs
+ self
+ end
+
+ def remove_vif(name)
+ self.vifs.delete(name)
+ self.changed_columns << :vifs
+ self
+ end
+
+ def add_local_drive(name, index, size)
+ raise "Duplicate drive name: #{name}" if self.drives.has_key?(name)
+ self.drives[name] = {
+ :index => index,
+ :type => :local,
+ :size => size,
+ }
+ self.changed_columns << :drives
+ self
+ end
+
+ def add_volume_drive(name, index, size)
+ raise "Duplicate drive name: #{name}" if self.drives.has_key?(name)
+ self.drives[name] = {
+ :index => index,
+ :type => :volume,
+ :size => size,
+ }
+ self.changed_columns << :drives
+ self
+ end
+
+ def add_volume_drive_from_snapshot(name, index, snapshot_id)
+ raise "Duplicate drive name: #{name}" if self.drives.has_key?(name)
+ self.drives[name] = {
+ :index => index,
+ :type => :volume,
+ :snapshot_id => snapshot_id,
+ }
+ self.changed_columns << :drives
+ self
+ end
+
+ def update_drive_index(name, new_index)
+ raise "Unknown drive name: #{name}" if !self.drives.has_key?(name)
+ drive = self.drives[name]
+ drive[:index] = new_index
+ self.changed_columns << :drives
+ self
+ end
+
+ def update_drive_snapshot_id(name, snapshot_id)
+ raise "Unknown drive name: #{name}" if !self.drives.has_key?(name)
+ drive = self.drives[name]
+ raise "Snapshot ID can only be set to volume drive" if !(drive[:type] == :volume)
+ drive.delete(:size)
+ # TODO: syntax check for snapshot_id
+ drive[:snapshot_id] = snapshot_id
+ self.changed_columns << :drives
+ self
+ end
+
+ def update_drive_size(name, size)
+ raise "Unknown drive name: #{name}" if !self.drives.has_key?(name)
+ drive = self.drives[name]
+ drive.delete(:snapshot_id) if drive[:type] == :volume
+ drive[:size] = size
+ self.changed_columns << :drives
+ self
+ end
+
+ def remove_drive(name)
+ self.drives.delete(name)
+ self.changed_columns << :drives
+ self
+ end
+
end
end