class Fog::Proxmox::Compute::Server

Server model

Public Class Methods

new(new_attributes = {}) click to toggle source
Calls superclass method
# File lib/fog/proxmox/compute/models/server.rb, line 63
def initialize(new_attributes = {})
  prepare_service_value(new_attributes)
  Fog::Proxmox::Attributes.set_attr_and_sym('node_id', attributes, new_attributes)
  Fog::Proxmox::Attributes.set_attr_and_sym('type', attributes, new_attributes)
  Fog::Proxmox::Attributes.set_attr_and_sym('vmid', attributes, new_attributes)
  requires :node_id, :type, :vmid
  initialize_config(new_attributes)
  initialize_snapshots
  initialize_tasks
  super(new_attributes)
end

Public Instance Methods

action(action, options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 118
def action(action, options = {})
  action_known = %w[start stop resume suspend shutdown reset].include? action
  message = "Action #{action} not implemented"
  raise Fog::Errors::Error, message unless action_known

  request(:action_server, options, action: action, vmid: vmid)
  reload
end
attach(disk, options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 177
def attach(disk, options = {})
  disk_hash = Fog::Proxmox::DiskHelper.flatten(disk.merge(options: options))
  update(disk_hash)
end
backup(options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 131
def backup(options = {})
  request(:create_backup, options.merge(vmid: vmid))
  reload
end
backups() click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 224
def backups
  list 'backup'
end
clone(newid, options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 145
def clone(newid, options = {})
  request(:clone_server, options.merge(newid: newid), vmid: vmid)
  reload
end
connect_vnc(options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 218
def connect_vnc(options = {})
  path_params = { node: node_id, type: type, vmid: vmid }
  query_params = { port: options['port'], vncticket: options['ticket'] }
  service.get_vnc(path_params, query_params)
end
container?() click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 75
def container?
  type == 'lxc'
end
create_template(options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 150
def create_template(options = {})
  service.template_server({ node: node_id, type: type, vmid: vmid }, options)
  reload
end
destroy(options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 114
def destroy(options = {})
  request(:delete_server, options, vmid: vmid)
end
detach(diskid) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 182
def detach(diskid)
  update(delete: diskid)
end
extend(disk, size, options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 159
def extend(disk, size, options = {})
  if container?
    request(:resize_container, options.merge(disk: disk, size: size), vmid: vmid)
  else
    service.resize_server({ vmid: vmid, node: node_id }, options.merge(disk: disk, size: size))
  end
  reload
end
images() click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 228
def images
  list 'images'
end
list(content) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 232
def list(content)
  storages = node.storages.list_by_content_type content
  volumes = []
  storages.each { |storage| volumes += storage.volumes.list_by_content_type_and_by_server(content, identity) }
  volumes
end
migrate(target, options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 155
def migrate(target, options = {})
  request(:migrate_server, options.merge(target: target), vmid: vmid)
end
move(volume, storage, options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 168
def move(volume, storage, options = {})
  if container?
    request(:move_volume, options.merge(volume: volume, storage: storage), vmid: vmid)
  else
    request(:move_disk, options.merge(disk: volume, storage: storage), vmid: vmid)
  end
  reload
end
persisted?() click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 79
def persisted?
  service.next_vmid(vmid: vmid)
  false
rescue Excon::Error::InternalServerError
  false
rescue Excon::Error::BadRequest
  true
end
ready?() click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 127
def ready?
  status == 'running'
end
request(name, body_params = {}, path_params = {}) click to toggle source

request with async task

# File lib/fog/proxmox/compute/models/server.rb, line 89
def request(name, body_params = {}, path_params = {})
  requires :node_id, :type
  path = path_params.merge(node: node_id, type: type)
  task_upid = service.send(name, path, body_params)
  tasks.wait_for(task_upid)
end
restore(backup, options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 136
def restore(backup, options = {})
  attr_hash = if container?
                options.merge(ostemplate: backup.volid, force: 1, restore: 1)
              else
                options.merge(archive: backup.volid, force: 1)
              end
  save(attr_hash)
end
save(new_attributes = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 96
def save(new_attributes = {})
  body_params = new_attributes.merge(vmid: vmid)
  body_params = body_params.merge(config.flatten) unless persisted?
  request(:create_server, body_params)
  reload
end
start_console(options = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 186
def start_console(options = {})
  unless ready?
    raise ::Fog::Proxmox::Errors::ServiceError,
          'Unable to start console because server not running.'
  end

  if container?
    type_console = options[:console]
    options.delete_if { |option| [:console].include? option }
    unless type_console
      raise ::Fog::Proxmox::Errors::ServiceError,
            'Unable to start console because console container config is not set or unknown.'
    end
  else
    type_console = config.type_console
    unless type_console
      raise ::Fog::Proxmox::Errors::ServiceError,
            'Unable to start console because VGA display server config is not set or unknown.'
    end
  end
  requires :vmid, :node_id, :type
  path_params = { node: node_id, type: type, vmid: vmid }
  body_params = options
  data = service.send(('create_' + type_console).to_sym, path_params, body_params)
  task_upid = data['upid']
  if task_upid
    task = tasks.get(task_upid)
    task.wait_for { running? }
  end
  data
end
update(new_attributes = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 103
def update(new_attributes = {})
  if container?
    path_params = { node: node_id, type: type, vmid: vmid }
    body_params = new_attributes
    service.update_server(path_params, body_params)
  else
    request(:update_server, new_attributes, vmid: vmid)
  end
  reload
end

Protected Instance Methods

initialize_config(new_attributes = {}) click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 241
def initialize_config(new_attributes = {})
  options = { service: service, vmid: vmid }
  attributes[:config] = Fog::Proxmox::Compute::ServerConfig.new(options.merge(new_attributes))
end

Private Instance Methods

initialize_snapshots() click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 248
def initialize_snapshots
  attributes[:snapshots] =
    Fog::Proxmox::Compute::Snapshots.new(service: service, server_id: vmid, server_type: type, node_id: node_id)
end
initialize_tasks() click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 253
def initialize_tasks
  attributes[:tasks] = Fog::Proxmox::Compute::Tasks.new(service: service, node_id: node_id).select do |task|
    task.id == vmid
  end
end
node() click to toggle source
# File lib/fog/proxmox/compute/models/server.rb, line 259
def node
  Fog::Proxmox::Compute::Node.new(service: service, node: node_id)
end