<?xml version="1.0" encoding="iso-8859-1"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <title>launch_instance (CondorCloud::DefaultExecutor)</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> <link rel="stylesheet" href="../../.././rdoc-style.css" type="text/css" media="screen" /> </head> <body class="standalone-code"> <pre><span class="ruby-comment cmt"># File lib/deltacloud/drivers/condor/condor_client.rb, line 122</span> <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">launch_instance</span>(<span class="ruby-identifier">image</span>, <span class="ruby-identifier">hardware_profile</span>, <span class="ruby-identifier">opts</span>={}) <span class="ruby-identifier">raise</span> <span class="ruby-value str">"Image object must be not nil"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">image</span> <span class="ruby-identifier">raise</span> <span class="ruby-value str">"HardwareProfile object must be not nil"</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">hardware_profile</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:name</span>] <span class="ruby-operator">||=</span> <span class="ruby-node">"i-#{Time.now.to_i}"</span> <span class="ruby-comment cmt"># This needs to be determined by the mac/ip translation stuff.</span> <span class="ruby-comment cmt"># We need to call into it and have it return these variables, or at least the MAC if not the IP.</span> <span class="ruby-identifier">mac_addr</span> = <span class="ruby-ivar">@ip_agent</span>.<span class="ruby-identifier">find_free_mac</span> <span class="ruby-identifier">ip_addr</span> = <span class="ruby-ivar">@ip_agent</span>.<span class="ruby-identifier">find_ip_by_mac</span>(<span class="ruby-identifier">mac_addr</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">mac_addr</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">mac_addr</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-identifier">libvirt_xml</span> = <span class="ruby-node">"+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>\""</span>.<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp re">/(\s{2,})/</span>, <span class="ruby-value str">' '</span>).<span class="ruby-identifier">gsub</span>(<span class="ruby-regexp re">/\>\s\</</span>, <span class="ruby-value str">'><'</span>) <span class="ruby-comment cmt"># I use the 2>&1 to get stderr and stdout together because popen3 does not support</span> <span class="ruby-comment cmt"># the ability to get the exit value of the command in ruby 1.8.</span> <span class="ruby-identifier">pipe</span> = <span class="ruby-constant">IO</span>.<span class="ruby-identifier">popen</span>(<span class="ruby-node">"#{CONDOR_SUBMIT_CMD} 2>&1"</span>, <span class="ruby-value str">"w+"</span>) <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">"universe=vm"</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">"vm_type=kvm"</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"vm_memory=#{hardware_profile.memory.value}"</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"request_cpus=#{hardware_profile.cpu.value}"</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"vm_disk=#{image.description}:null:null"</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"executable=#{image.description}"</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"vm_macaddr=#{mac_addr}"</span> <span class="ruby-comment cmt"># Only set the ip if it is available, and this should depend on the IP mapping used.</span> <span class="ruby-comment cmt"># With the fixed mapping method we know the IP address right away before we start the</span> <span class="ruby-comment cmt"># instance, so fill it in here. If it is not set I think we should set it to an empty</span> <span class="ruby-comment cmt"># string and we'll fill it in later using a condor tool to update the job.</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"+vm_ipaddr=\"#{ip_addr}\""</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">'+HookKeyword="CLOUD"'</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"+Cmd=\"#{opts[:name]}\""</span> <span class="ruby-comment cmt"># Really the image should not be a full path to begin with I think..</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-node">"+cloud_image=\"#{File.basename(image.description)}\""</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-identifier">libvirt_xml</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">"queue"</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">puts</span> <span class="ruby-value str">""</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">close_write</span> <span class="ruby-identifier">out</span> = <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">read</span> <span class="ruby-identifier">pipe</span>.<span class="ruby-identifier">close</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">$?</span> <span class="ruby-operator">!=</span> <span class="ruby-value">0</span> <span class="ruby-identifier">raise</span> <span class="ruby-node">"Error starting VM in condor_submit: #{out}"</span> <span class="ruby-keyword kw">end</span> <span class="ruby-identifier">bare_xml</span> = <span class="ruby-constant">Nokogiri</span><span class="ruby-operator">::</span><span class="ruby-constant">XML</span>(<span class="ruby-node">`#{CONDOR_Q_CMD} -xml`</span>) <span class="ruby-identifier">parse_condor_q_output</span>(<span class="ruby-identifier">bare_xml</span>, <span class="ruby-identifier">:name</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:name</span>]) <span class="ruby-keyword kw">end</span></pre> </body> </html>