mirror of
https://github.com/fog/fog.git
synced 2022-11-09 13:51:43 -05:00
208 lines
No EOL
6.1 KiB
Ruby
208 lines
No EOL
6.1 KiB
Ruby
require 'fog/cloudsigma/nested_model'
|
|
require 'fog/cloudsigma/models/mountpoint'
|
|
require 'fog/cloudsigma/models/nic'
|
|
|
|
module Fog
|
|
module Compute
|
|
class CloudSigma
|
|
class Server < Fog::CloudSigma::CloudsigmaModel
|
|
|
|
|
|
identity :uuid
|
|
|
|
attribute :status, :type => :string
|
|
attribute :vnc_password, :type => :string
|
|
attribute :name, :type => :string
|
|
attribute :cpus_instead_of_cores, :type => :boolean
|
|
attribute :tags
|
|
attribute :mem, :type => :integer
|
|
attribute :enable_numa, :type => :boolean
|
|
attribute :smp
|
|
attribute :hv_relaxed, :type => :boolean
|
|
attribute :hv_tsc, :type => :boolean
|
|
attribute :meta
|
|
attribute :owner
|
|
attribute :runtime
|
|
attribute :cpu, :type => :integer
|
|
attribute :resource_uri, :type => :string
|
|
model_attribute_array :volumes, MountPoint, :aliases => 'drives'
|
|
model_attribute_array :nics, Nic
|
|
|
|
|
|
def save
|
|
if persisted?
|
|
update
|
|
else
|
|
create
|
|
end
|
|
end
|
|
|
|
def create
|
|
requires :name, :cpu, :mem, :vnc_password
|
|
data = attributes
|
|
|
|
response = service.create_server(data)
|
|
new_attributes = response.body['objects'].first
|
|
merge_attributes(new_attributes)
|
|
end
|
|
|
|
def update
|
|
requires :identity, :name, :cpu, :mem, :vnc_password
|
|
|
|
data = attributes
|
|
|
|
response = service.update_server(identity, data)
|
|
new_attributes = response.body
|
|
merge_attributes(new_attributes)
|
|
|
|
end
|
|
|
|
def destroy
|
|
requires :identity
|
|
|
|
service.delete_server(identity)
|
|
true
|
|
end
|
|
|
|
alias :delete :destroy
|
|
|
|
def start(start_params={})
|
|
requires :identity
|
|
service.start_server(identity, start_params)
|
|
end
|
|
|
|
def stop
|
|
requires :identity
|
|
service.stop_server(identity)
|
|
end
|
|
|
|
def open_vnc
|
|
requires :identity
|
|
service.open_vnc(identity)
|
|
end
|
|
|
|
def close_vnc
|
|
requires :identity
|
|
service.close_vnc(identity)
|
|
end
|
|
|
|
def clone(clone_params={})
|
|
requires :identity
|
|
response = service.clone_server(identity, clone_params)
|
|
|
|
self.class.new(response.body)
|
|
end
|
|
|
|
def mount_volume(volume, device = 'virtio', dev_channel = nil, boot_order = nil)
|
|
unless dev_channel
|
|
specified_channels = self.volumes.map { |v| v.dev_channel }.sort
|
|
if specified_channels
|
|
controller, controller_channel = 0, 0
|
|
max_ctlr, max_chnl = case device
|
|
when 'ide'
|
|
[4, 2]
|
|
else
|
|
[1024, 5]
|
|
end
|
|
|
|
dev_channel = "#{controller}:#{controller_channel}"
|
|
while specified_channels.include? dev_channel
|
|
controller_channel += 1
|
|
if controller_channel >= max_chnl
|
|
controller_channel = 0
|
|
controller += 1
|
|
if controller >= max_ctlr
|
|
raise Fog::CloudSigma::Errors::Error.new("Max channel reached, cannot attach more")
|
|
end
|
|
end
|
|
dev_channel = "#{controller}:#{controller_channel}"
|
|
end
|
|
else # no other channels specified
|
|
dev_channel = '0:0'
|
|
end
|
|
end
|
|
|
|
|
|
vol_id = volume.kind_of?(String) ? volume : volume.identity
|
|
mountpoint_data = {
|
|
'drive' => vol_id,
|
|
'device' => device,
|
|
'dev_channel' => dev_channel,
|
|
}
|
|
|
|
if boot_order
|
|
mountpoint_data['boot_order'] = boot_order
|
|
end
|
|
|
|
self.volumes = self.volumes << MountPoint.new(mountpoint_data)
|
|
end
|
|
|
|
def unmount_volume(volume_or_position)
|
|
if volume_or_position.kind_of? Fixnum
|
|
self.volumes.delete_at(volume_or_position)
|
|
# assign to update attributes
|
|
return self.volumes = self.volumes
|
|
end
|
|
|
|
vol_id = volume_or_position.kind_of?(String) ? volume_or_position : volume_or_position.identity
|
|
self.volumes = self.volumes.reject do |v|
|
|
if v.volume.kind_of? Hash
|
|
v.volume['uuid'] == vol_id
|
|
else
|
|
v.volume == vol_id
|
|
end
|
|
end
|
|
end
|
|
|
|
def unmount_all_volumes
|
|
self.volumes = []
|
|
end
|
|
|
|
def add_nic(vlan=nil, ip_v4_conf=nil, ip_v6_conf=nil, model='virtio', boot_order=nil)
|
|
nic_data = {
|
|
'model' => model,
|
|
'vlan' => vlan,
|
|
'ip_v4_conf' => ip_v4_conf,
|
|
'ip_v6_conf' => ip_v6_conf
|
|
}
|
|
if boot_order
|
|
nic_data['boot_order'] = boot_order
|
|
end
|
|
|
|
self.nics = self.nics << Nic.new(nic_data)
|
|
end
|
|
|
|
def add_public_nic(ip_or_conf=:dhcp, model='virtio', boot_order=nil)
|
|
case ip_or_conf
|
|
when :dhcp
|
|
add_nic(nil, {:conf => :dhcp}, nil, model, boot_order)
|
|
when :manual
|
|
add_nic(nil, {:conf => :manual}, nil, model, boot_order)
|
|
else
|
|
ip = ip_or_conf.kind_of?(String) ? ip_or_conf : ip_or_conf.identity
|
|
add_nic(nil, {:conf => :static, :ip => ip}, nil, model, boot_order)
|
|
end
|
|
end
|
|
|
|
def add_private_nic(vlan, model='virtio', boot_order=nil)
|
|
vlan = vlan.kind_of?(String) ? vlan : vlan.identity
|
|
add_nic(vlan, nil, nil, model, boot_order)
|
|
end
|
|
|
|
def remove_nic(mac_or_position)
|
|
if mac_or_position.kind_of? Fixnum
|
|
self.nics.delete_at(mac_or_position)
|
|
# assign to update attributes
|
|
return self.nics = self.nics
|
|
end
|
|
|
|
self.nics = self.nics.reject { |n| n.mac == mac_or_position }
|
|
end
|
|
|
|
def remove_all_nics
|
|
self.nics = []
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end |