# 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