This directory needs to be readable for user running Deltacloud API
You can use your own IP agent using :ip_agent option. IPAgent should have parent class set to 'IPAgent' and implement all methods from this class. You can pass options to ip_agent using :ip_agent_args hash.
# File lib/deltacloud/drivers/condor/condor_client.rb, line 54 def initialize(opts={}, &block) load_config! if opts[:ip_agent] @ip_agent = opts[:ip_agent] else default_ip_agent = CondorCloud::const_get(@config[:default_ip_agent]) @ip_agent = default_ip_agent.new(:config => @config) end yield self if block_given? self end
# File lib/deltacloud/drivers/condor/condor_client.rb, line 204 def destroy_instance(instance_id) bare_xml = Nokogiri::XML(`#{CONDOR_Q_CMD} -xml`) cluster_id = (bare_xml/'/classads/c/a[@n="GlobalJobId"]/s').collect do |id| id.text.split('#')[1] if id.text.split('#').last==instance_id end.compact.first `#{CONDOR_RM_CMD} #{cluster_id}` end
List hardware profiles available for Condor. Basically those profiles are static 'small', 'medium' and 'large'
Defined as:
when { :memory => '512', :cpus => '1' } then 'small' when { :memory => '1024', :cpus => '2' } then 'medium' when { :memory => '2047', :cpus => '4' } then 'large'
@opts - You can filter hardware_profiles using :id
# File lib/deltacloud/drivers/condor/condor_client.rb, line 223 def hardware_profiles(opts={}) return [ { :name => 'small', :cpus => 1, :memory => 512 }, { :name => 'medium', :cpus => 2, :memory => 1024 }, { :name => 'large', :cpus => 4, :memory => 2048 } ] end
List all files in ENV or fallback to '/home/cloud/images' Convert files to CondorCloud::Image class
@opts - This Hash can be used for filtering images using :id => 'SHA1 of name'
# File lib/deltacloud/drivers/condor/condor_client.rb, line 87 def images(opts={}) Dir["#{@config[:image_storage]}/*"].collect do |file| next unless File::file?(file) next unless File::readable?(file) image = Image.new( :name => File::basename(file).downcase.tr('.', '-'), :owner_id => Etc.getpwuid(File.stat(file).uid).name, :description => file ) next if opts[:id] and opts[:id]!=image.id image end.compact end
List instances using ENV command. Retrieve XML from this command and parse it using Nokogiri. Then this XML is converted to CondorCloud::Instance class
@opts - This Hash can be used for filtering instances using :id => 'instance_id'
# File lib/deltacloud/drivers/condor/condor_client.rb, line 76 def instances(opts={}) bare_xml = Nokogiri::XML(`#{CONDOR_Q_CMD} -xml`) parse_condor_q_output(bare_xml, opts) end
Launch a new instance in Condor cloud using ENV. Return CondorCloud::Instance.
@image - Expecting CondorCloud::Image here @hardware_profile - Expecting CondorCloud::HardwareProfile here
@opts - You can specify additional parameters like :name here
You can set additional parameters for libvirt using :user_data specified in JSON format. Parameters are: { 'bridge_dev' : 'br0' } { 'smbios' : 'sysinfo' } { 'vnc_port' : '5900' } { 'vnc_ip' : '0.0.0.0' } { 'features' : ['acpi', 'apic', 'pae'] } { 'sysinfo' : { 'bios_vendor' : 'Lenovo', 'system_manufacturer' : 'Virt', 'system_vendor' : 'IBM' } } Of course you can combine them as you want, like (:user_data => "{ 'bridge_dev' : 'br0', 'vnc_ip' : 127.0.0.1 }")
# File lib/deltacloud/drivers/condor/condor_client.rb, line 122 def launch_instance(image, hardware_profile, opts={}) raise "Image object must be not nil" unless image raise "HardwareProfile object must be not nil" unless hardware_profile opts[:name] ||= "i-#{Time.now.to_i}" # This needs to be determined by the mac/ip translation stuff. # We need to call into it and have it return these variables, or at least the MAC if not the IP. mac_addr = @ip_agent.find_free_mac ip_addr = @ip_agent.find_ip_by_mac(mac_addr) if mac_addr && !mac_addr.empty? libvirt_xml = "+VM_XML=\"<domain type='kvm'> <name>{NAME}</name> <memory>#{hardware_profile.memory.value.to_i * 1024}</memory> <vcpu>#{hardware_profile.cpu.value}</vcpu> <os> <type arch='x86_64'>hvm</type> <boot dev='hd'/> <smbios mode='sysinfo'/> </os> <sysinfo type='smbios'> <system> <entry name='manufacturer'>#{opts[:config_server_address]}</entry> <entry name='product'>#{opts[:uuid]}</entry> <entry name='serial'>#{opts[:otp]}</entry> </system> </sysinfo> <features> <acpi/><apic/><pae/> </features> <clock offset='utc'/> <on_poweroff>destroy</on_poweroff> <on_reboot>restart</on_reboot> <on_crash>restart</on_crash> <devices> <disk type='file' device='disk'> <source file='{DISK}'/> <target dev='vda' bus='virtio'/> <driver name='qemu' type='qcow2'/> </disk> <interface type='bridge'> #{"<mac address='" + mac_addr + "'/>" if mac_addr && !mac_addr.empty?} <source bridge='#{@config[:default_bridge]}'/> </interface> <graphics type='vnc' port='#{@config[:vnc_listen_port]}' autoport='yes' keymap='en-us' listen='#{@config[:vnc_listen_ip]}'/> </devices> </domain>\"".gsub(/(\s{2,})/, ' ').gsub(/\>\s\</, '><') # I use the 2>&1 to get stderr and stdout together because popen3 does not support # the ability to get the exit value of the command in ruby 1.8. pipe = IO.popen("#{CONDOR_SUBMIT_CMD} 2>&1", "w+") pipe.puts "universe=vm" pipe.puts "vm_type=kvm" pipe.puts "vm_memory=#{hardware_profile.memory.value}" pipe.puts "request_cpus=#{hardware_profile.cpu.value}" pipe.puts "vm_disk=#{image.description}:null:null" pipe.puts "executable=#{image.description}" pipe.puts "vm_macaddr=#{mac_addr}" # Only set the ip if it is available, and this should depend on the IP mapping used. # With the fixed mapping method we know the IP address right away before we start the # instance, so fill it in here. If it is not set I think we should set it to an empty # string and we'll fill it in later using a condor tool to update the job. pipe.puts "+vm_ipaddr=\"#{ip_addr}\"" pipe.puts '+HookKeyword="CLOUD"' pipe.puts "+Cmd=\"#{opts[:name]}\"" # Really the image should not be a full path to begin with I think.. pipe.puts "+cloud_image=\"#{File.basename(image.description)}\"" pipe.puts libvirt_xml pipe.puts "queue" pipe.puts "" pipe.close_write out = pipe.read pipe.close if $? != 0 raise "Error starting VM in condor_submit: #{out}" end bare_xml = Nokogiri::XML(`#{CONDOR_Q_CMD} -xml`) parse_condor_q_output(bare_xml, :name => opts[:name]) end
Generated with the Darkfish Rdoc Generator 2.