class VCloudSdk::VApp

Public Class Methods

new(session, link) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 11
def initialize(session, link)
  @session = session
  @link = link
end

Public Instance Methods

add_network_by_name( network_name, vapp_net_name = nil, fence_mode = Xml::FENCE_MODES[:BRIDGED]) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 103
def add_network_by_name(
    network_name,
    vapp_net_name = nil,
    fence_mode = Xml::FENCE_MODES[:BRIDGED])
  fail CloudError,
       "Invalid fence mode '#{fence_mode}'" unless Xml::FENCE_MODES
                                                     .each_value
                                                     .any? { |m| m == fence_mode }
  network = find_network_by_name(network_name)
  new_vapp_net_name = vapp_net_name.nil? ? network.name : vapp_net_name
  network_config_param = network_config_param(
                           network,
                           new_vapp_net_name,
                           fence_mode)
  payload = entity_xml.network_config_section
  payload.add_network_config(network_config_param)
  task = connection.put(payload.href,
                        payload,
                        Xml::MEDIA_TYPE[:NETWORK_CONFIG_SECTION])
  monitor_task(task)
  self
end
delete() click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 20
def delete
  vapp = entity_xml
  vapp_name = name

  if is_status?(vapp, :POWERED_ON)
    fail CloudError,
         "vApp #{vapp_name} is powered on, power-off before deleting."
  end

  wait_for_running_tasks(vapp, "VApp #{vapp_name}")

  Config.logger.info "Deleting vApp #{vapp_name}."
  monitor_task(connection.delete(vapp.remove_link.href),
               @session.time_limit[:delete_vapp]) do |task|
    Config.logger.info "vApp #{vapp_name} deleted."
    return
  end

  fail ApiRequestError,
       "Fail to delete vApp #{vapp_name}"
end
delete_network_by_name(name) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 126
def delete_network_by_name(name)
  unless list_networks.any? { |network_name| network_name == name }
    fail ObjectNotFoundError,
         "Network '#{name}' is not found"
  end

  fail CloudError,
       %Q{
           Network '#{name}' is being used by one or more VMs.
           Please remove the NIC(s) in VM(s) that are in use of the network.
           Check logs for details.
         } if network_in_use?(name)

  payload = entity_xml.network_config_section
  payload.delete_network_config(name)
  task = connection.put(payload.href,
                        payload,
                        Xml::MEDIA_TYPE[:NETWORK_CONFIG_SECTION])
  monitor_task(task)
  self
end
find_vm_by_name(name) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 76
def find_vm_by_name(name)
  entity_xml.vms.each do |vm|
    return VCloudSdk::VM.new(@session, vm.href) if vm.name == name
  end

  fail ObjectNotFoundError, "VM '#{name}' is not found"
end
list_networks() click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 96
def list_networks
  entity_xml
    .network_config_section
    .network_configs
    .map { |network_config| network_config.network_name }
end
list_vms() click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 64
def list_vms
  entity_xml.vms.map do |vm|
    vm.name
  end
end
name() click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 16
def name
  entity_xml.name
end
recompose_from_vapp_template(catalog_name, template_name) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 42
def recompose_from_vapp_template(catalog_name, template_name)
  recompose_vapp_link = get_recompose_vapp_link

  Config.logger.info "Recomposing from template '#{template_name}' in catalog '#{catalog_name}'."
  catalog = find_catalog_by_name catalog_name

  template = catalog.find_vapp_template_by_name template_name

  task = connection.post recompose_vapp_link.href,
                         recompose_from_vapp_template_param(template)

  monitor_task task, @session.time_limit[:recompose_vapp]
  Config.logger.info "vApp #{name} is recomposed."
  self
end
remove_vm_by_name(vm_name) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 84
def remove_vm_by_name(vm_name)
  target_vm = find_vm_by_name vm_name
  recompose_vapp_link = get_recompose_vapp_link

  task = connection.post recompose_vapp_link.href,
                         remove_vm_param(target_vm)

  monitor_task task, @session.time_limit[:recompose_vapp]
  Config.logger.info "VM #{vm_name} is removed."
  self
end
vm_exists?(name) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 70
def vm_exists?(name)
  entity_xml.vms.any? do |vm|
    vm.name == name
  end
end
vms() click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 58
def vms
  entity_xml.vms.map do |vm|
    VCloudSdk::VM.new(@session, vm.href)
  end
end

Private Instance Methods

network_config_param( network, vapp_net_name, fence_mode) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 181
def network_config_param(
    network,
    vapp_net_name,
    fence_mode)
  Xml::WrapperFactory.create_instance("NetworkConfig").tap do |params|
    network_entity_xml = connection.get(network.href)
    params.ip_scope.tap do |ip_scope|
      net_ip_scope = network_entity_xml.ip_scope
      ip_scope.is_inherited = net_ip_scope.is_inherited?
      ip_scope.gateway = net_ip_scope.gateway
      ip_scope.netmask = net_ip_scope.netmask
      ip_scope.ip_ranges.add_ranges(net_ip_scope.ip_ranges.ranges)
    end
    params.fence_mode = fence_mode
    params.parent_network["name"] = network_entity_xml["name"]
    params.parent_network["href"] = network_entity_xml["href"]
    params["networkName"] = vapp_net_name
  end
end
network_in_use?(network_name) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 201
def network_in_use?(network_name)
  network_in_use = false
  vms.each do |vm|
    vm.list_networks.each do |net_name|
      if net_name == network_name
        network_in_use = true
        Config.logger.error "VM #{vm.name} is using network #{network_name}"
      end
    end
  end

  network_in_use
end
recompose_from_vapp_template_param(template) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 150
def recompose_from_vapp_template_param(template)
  Xml::WrapperFactory.create_instance("RecomposeVAppParams").tap do |params|
    params.name = name
    params.all_eulas_accepted = true
    params.add_source_item template.href
  end
end
remove_vm_param(vm) click to toggle source
# File lib/ruby_vcloud_sdk/vapp.rb, line 173
def remove_vm_param(vm)
  Xml::WrapperFactory.create_instance("RecomposeVAppParams").tap do |params|
    params.name = name
    params.all_eulas_accepted = true
    params.add_delete_item vm.href
  end
end