class Vcloud::Core::Vapp

Attributes

id[R]

Public Class Methods

get_by_child_vm_id(vm_id) click to toggle source

Return the ID of the vApp which contains a particular VM

@param vm_id [String] the ID of the VM to find the parent for @return [String] the vApp ID

# File lib/vcloud/core/vapp.rb, line 41
def self.get_by_child_vm_id(vm_id)
  raise ArgumentError, "Must supply a valid Vm id" unless vm_id =~ /^vm-[-0-9a-f]+$/
  vm_body = Vcloud::Core::Fog::ServiceInterface.new.get_vapp(vm_id)
  parent_vapp_link = vm_body.fetch(:Link).detect do |link|
    link[:rel] == Fog::RELATION::PARENT && link[:type] == Fog::ContentTypes::VAPP
  end
  unless parent_vapp_link
    raise RuntimeError, "Could not find parent vApp for VM '#{vm_id}'"
  end
  return self.new(parent_vapp_link.fetch(:href).split('/').last)
end
get_by_name(name) click to toggle source

Return the ID of a named vApp

@param name [String] the name of the vApp to find @return [String] the vApp ID

# File lib/vcloud/core/vapp.rb, line 23
def self.get_by_name(name)
  q = Vcloud::Core::QueryRunner.new
  query_results = q.run('vApp', :filter => "name==#{name}")
  raise "Error finding vApp by name #{name}" unless query_results
  case query_results.size
  when 0
    raise "vApp #{name} not found"
  when 1
    return self.new(query_results.first[:href].split('/').last)
  else
    raise "found multiple vApp entities with name #{name}!"
  end
end
get_by_name_and_vdc_name(name, vdc_name) click to toggle source

Find a vApp by name and vDC

@param name [String] name of the vApp to find @param vdc_name [String] name of the vDC @return [String] the ID of the instance

# File lib/vcloud/core/vapp.rb, line 106
def self.get_by_name_and_vdc_name(name, vdc_name)
  fog_interface = Vcloud::Core::Fog::ServiceInterface.new
  attrs = fog_interface.get_vapp_by_name_and_vdc_name(name, vdc_name)
  self.new(attrs[:href].split('/').last) if attrs && attrs.key?(:href)
end
id_prefix() click to toggle source
# File lib/vcloud/core/vapp.rb, line 167
def self.id_prefix
  'vapp'
end
instantiate(name, network_names, template_id, vdc_name) click to toggle source

Instantiate a vApp

@param name [String] Name to use when creating the vApp @param network_names [Array] Array of Strings with names of Networks to connect to the vApp @param template_id [String] The ID of the template to use when creating the vApp @param vdc_name [String] The name of the vDC to create vApp in @return [String] the id of the created vApp

# File lib/vcloud/core/vapp.rb, line 119
def self.instantiate(name, network_names, template_id, vdc_name)
  Vcloud::Core.logger.info("Instantiating new vApp #{name} in vDC '#{vdc_name}'")
  fog_interface = Vcloud::Core::Fog::ServiceInterface.new
  networks = get_networks(network_names, vdc_name)

  attrs = fog_interface.post_instantiate_vapp_template(
      fog_interface.vdc(vdc_name),
      template_id,
      name,
      InstantiationParams: build_network_config(networks)
  )
  self.new(attrs[:href].split('/').last) if attrs and attrs.key?(:href)
end
new(id) click to toggle source

Initialize a Vcloud::Core::Vapp

@param id [String] the vApp ID @return [Vcloud::Core::Vapp]

# File lib/vcloud/core/vapp.rb, line 12
def initialize(id)
  unless id =~ /^#{self.class.id_prefix}-[-0-9a-f]+$/
    raise "#{self.class.id_prefix} id : #{id} is not in correct format"
  end
  @id = id
end

Private Class Methods

build_network_config(networks) click to toggle source
# File lib/vcloud/core/vapp.rb, line 178
                     def self.build_network_config(networks)
  return {} unless networks
  instantiation = { NetworkConfigSection: {NetworkConfig: []} }
  networks.compact.each do |network|
    instantiation[:NetworkConfigSection][:NetworkConfig] << {
        networkName: network[:name],
        Configuration: {
            ParentNetwork: {href: network[:href]},
            FenceMode: 'bridged',
        }
    }
  end
  instantiation
end
get_networks(network_names, vdc_name) click to toggle source
# File lib/vcloud/core/vapp.rb, line 193
                     def self.get_networks(network_names, vdc_name)
  fsi = Vcloud::Core::Fog::ServiceInterface.new
  fsi.find_networks(network_names, vdc_name) if network_names
end

Public Instance Methods

href() click to toggle source

Return the href of vApp

@return [String] the href of instance

# File lib/vcloud/core/vapp.rb, line 75
def href
  vcloud_attributes[:href]
end
name() click to toggle source

Return the name of vApp

@return [String] the name of instance

# File lib/vcloud/core/vapp.rb, line 68
def name
  vcloud_attributes[:name]
end
networks() click to toggle source

Return the networks connected to vApp

@return [Hash] a hash describing the networks

# File lib/vcloud/core/vapp.rb, line 97
def networks
  vcloud_attributes[:'ovf:NetworkSection'][:'ovf:Network']
end
power_on() click to toggle source

Power on vApp

@return [Boolean] Returns true if the VM is running, false otherwise

# File lib/vcloud/core/vapp.rb, line 160
def power_on
  raise "Cannot power on a missing vApp." unless id
  return true if running?
  Vcloud::Core::Fog::ServiceInterface.new.power_on_vapp(id)
  running?
end
update_custom_fields(custom_fields) click to toggle source

Update custom_fields for vApp

@param custom_fields [Array] Array of Hashes describing the custom fields @return [Boolean] return true or throws error

# File lib/vcloud/core/vapp.rb, line 137
def update_custom_fields(custom_fields)
  return if custom_fields.nil?
  fields = custom_fields.collect do |field|
    user_configurable = field[:user_configurable] || true
    type              = field[:type] || 'string'
    password          = field[:password] || false

    {
      :id                => field[:name],
      :value             => field[:value],
      :user_configurable => user_configurable,
      :type              => type,
      :password          => password
    }
  end

  Vcloud::Core.logger.debug("adding custom fields #{fields.inspect} to vapp #{@id}")
  Vcloud::Core::Fog::ServiceInterface.new.put_product_sections(@id, fields)
end
vcloud_attributes() click to toggle source

Return the vCloud data associated with vApp

@return [Hash] the complete vCloud data for vApp

# File lib/vcloud/core/vapp.rb, line 56
def vcloud_attributes
  Vcloud::Core::Fog::ServiceInterface.new.get_vapp(id)
end
vdc_id() click to toggle source

Return the ID of the vDC containing vApp

@return [String] the ID of the vDC containing vApp

# File lib/vcloud/core/vapp.rb, line 82
def vdc_id
  link = vcloud_attributes[:Link].detect { |l| l[:rel] == Fog::RELATION::PARENT && l[:type] == Fog::ContentTypes::VDC }
  link ? link[:href].split('/').last : raise('a vapp without parent vdc found')
end
vms() click to toggle source

Return the VMs within vApp

@return [Hash] the VMs contained in the vApp

# File lib/vcloud/core/vapp.rb, line 90
def vms
  vcloud_attributes[:Children][:Vm]
end

Private Instance Methods

running?() click to toggle source
# File lib/vcloud/core/vapp.rb, line 172
def running?
  raise "Cannot call running? on a missing vApp." unless id
  vapp = Vcloud::Core::Fog::ServiceInterface.new.get_vapp(id)
  vapp[:status].to_i == STATUS::RUNNING ? true : false
end