Sophie

Sophie

distrib > Fedora > 15 > i386 > by-pkgid > 4b137326f38b5adf1f9ffd3dbbb48a7b > files > 523

deltacloud-core-doc-0.4.0-4.fc15.noarch.rpm

<?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>create_instance (Deltacloud::Drivers::VSphere::VSphereDriver)</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/vsphere/vsphere_driver.rb, line 205</span>
    <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">create_instance</span>(<span class="ruby-identifier">credentials</span>, <span class="ruby-identifier">image_id</span>, <span class="ruby-identifier">opts</span>)
      <span class="ruby-identifier">vsphere</span> = <span class="ruby-identifier">new_client</span>(<span class="ruby-identifier">credentials</span>)
      <span class="ruby-identifier">safely</span> <span class="ruby-keyword kw">do</span>
        <span class="ruby-identifier">rootFolder</span> = <span class="ruby-identifier">vsphere</span>.<span class="ruby-identifier">serviceInstance</span>.<span class="ruby-identifier">content</span>.<span class="ruby-identifier">rootFolder</span>
        <span class="ruby-identifier">vm</span> = <span class="ruby-identifier">find_vm</span>(<span class="ruby-identifier">credentials</span>, <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:image_id</span>])
        <span class="ruby-comment cmt"># New instance need valid resource pool and datastore to be placed.</span>
        <span class="ruby-comment cmt"># For this reason, realm_id **needs** to be set.</span>
        <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">opts</span> <span class="ruby-keyword kw">and</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:realm_id</span>]
          <span class="ruby-identifier">resourcePool</span> = <span class="ruby-identifier">find_resource_pool</span>(<span class="ruby-identifier">credentials</span>, <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:realm_id</span>])
          <span class="ruby-identifier">datastore</span> = <span class="ruby-identifier">find_datastore</span>(<span class="ruby-identifier">credentials</span>, <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:realm_id</span>])
        <span class="ruby-keyword kw">else</span>
          <span class="ruby-identifier">resourcePool</span> = <span class="ruby-identifier">find_resource_pool</span>(<span class="ruby-identifier">credentials</span>, <span class="ruby-identifier">vm</span>[<span class="ruby-identifier">:datastore</span>])
          <span class="ruby-identifier">datastore</span> = <span class="ruby-identifier">find_datastore</span>(<span class="ruby-identifier">credentials</span>, <span class="ruby-identifier">vm</span>[<span class="ruby-identifier">:datastore</span>])
        <span class="ruby-keyword kw">end</span>
        <span class="ruby-identifier">relocate</span> = { <span class="ruby-identifier">:pool</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">resourcePool</span>, <span class="ruby-identifier">:datastore</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">datastore</span> }
        <span class="ruby-identifier">relocateSpec</span> = <span class="ruby-constant">RbVmomi</span><span class="ruby-operator">::</span><span class="ruby-constant">VIM</span>.<span class="ruby-constant">VirtualMachineRelocateSpec</span>(<span class="ruby-identifier">relocate</span>)
        <span class="ruby-comment cmt"># Set extra configuration for VM, like template_id</span>
        <span class="ruby-identifier">machine_config</span> = {
          <span class="ruby-identifier">:memoryMB</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:hwp_memory</span>],
          <span class="ruby-identifier">:numCPUs</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:hwp_cpu</span>],
          <span class="ruby-identifier">:extraConfig</span> =<span class="ruby-operator">&gt;</span> [
            { <span class="ruby-identifier">:key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'template_id'</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">image_id</span> },
          ]
        }
        <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_data</span>] <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">not</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_data</span>].<span class="ruby-identifier">empty?</span>) <span class="ruby-keyword kw">and</span> (<span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_iso</span>] <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">not</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_iso</span>].<span class="ruby-identifier">empty?</span>)
          <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;ERROR: You cannot use user_data and user_iso features together&quot;</span>
        <span class="ruby-keyword kw">end</span>
        <span class="ruby-comment cmt"># If user wants to inject data into instance he need to submit a Base64</span>
        <span class="ruby-comment cmt"># encoded gzipped ISO image.</span>
        <span class="ruby-comment cmt"># This image will be uplaoded to the Datastore given in 'realm_id'</span>
        <span class="ruby-comment cmt"># parameter and them attached to instance.</span>
        <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_data</span>] <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">not</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_data</span>].<span class="ruby-identifier">empty?</span>
          <span class="ruby-identifier">device</span> = <span class="ruby-identifier">vm</span>[<span class="ruby-identifier">:instance</span>].<span class="ruby-identifier">config</span>.<span class="ruby-identifier">hardware</span>.<span class="ruby-identifier">device</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">hw</span><span class="ruby-operator">|</span> <span class="ruby-identifier">hw</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">RbVmomi</span><span class="ruby-operator">::</span><span class="ruby-constant">VIM</span><span class="ruby-operator">::</span><span class="ruby-constant">VirtualCdrom</span> }.<span class="ruby-identifier">first</span>
          <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">device</span>
            <span class="ruby-constant">VSphere</span><span class="ruby-operator">::</span><span class="ruby-constant">FileManager</span><span class="ruby-operator">::</span><span class="ruby-identifier">user_data!</span>(<span class="ruby-identifier">datastore</span>, <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_data</span>], <span class="ruby-node">&quot;#{opts[:name]}.iso&quot;</span>)
            <span class="ruby-identifier">machine_config</span>[<span class="ruby-identifier">:extraConfig</span>] <span class="ruby-operator">&lt;&lt;</span> {
              <span class="ruby-identifier">:key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'user_data_file'</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;#{opts[:name]}.iso&quot;</span>
            }
            <span class="ruby-identifier">device</span>.<span class="ruby-identifier">backing</span> = <span class="ruby-constant">RbVmomi</span><span class="ruby-operator">::</span><span class="ruby-constant">VIM</span>.<span class="ruby-constant">VirtualCdromIsoBackingInfo</span>(<span class="ruby-identifier">:fileName</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;[#{opts[:realm_id] || vm[:datastore]}] &quot;</span><span class="ruby-operator">+</span>
                                                                     <span class="ruby-node">&quot;/#{VSphere::FileManager::DIRECTORY_PATH}/#{opts[:name]}.iso&quot;</span>)
            <span class="ruby-identifier">machine_config</span>.<span class="ruby-identifier">merge!</span>({
              <span class="ruby-identifier">:deviceChange</span> =<span class="ruby-operator">&gt;</span> [{
                <span class="ruby-identifier">:operation</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:edit</span>,
                <span class="ruby-identifier">:device</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">device</span>
              }]
            })
          <span class="ruby-keyword kw">else</span>
            <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Failed to inject data to device because there is no CD-ROM drive defined in given template&quot;</span>
          <span class="ruby-keyword kw">end</span>
        <span class="ruby-keyword kw">end</span>
        <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_iso</span>] <span class="ruby-keyword kw">and</span> <span class="ruby-keyword kw">not</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_iso</span>].<span class="ruby-identifier">empty?</span>
          <span class="ruby-identifier">device</span> = <span class="ruby-identifier">vm</span>[<span class="ruby-identifier">:instance</span>].<span class="ruby-identifier">config</span>.<span class="ruby-identifier">hardware</span>.<span class="ruby-identifier">device</span>.<span class="ruby-identifier">select</span> { <span class="ruby-operator">|</span><span class="ruby-identifier">hw</span><span class="ruby-operator">|</span> <span class="ruby-identifier">hw</span>.<span class="ruby-identifier">class</span> <span class="ruby-operator">==</span> <span class="ruby-constant">RbVmomi</span><span class="ruby-operator">::</span><span class="ruby-constant">VIM</span><span class="ruby-operator">::</span><span class="ruby-constant">VirtualCdrom</span> }.<span class="ruby-identifier">first</span>
          <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">device</span>
            <span class="ruby-constant">VSphere</span><span class="ruby-operator">::</span><span class="ruby-constant">FileManager</span><span class="ruby-operator">::</span><span class="ruby-identifier">store_iso!</span>(<span class="ruby-identifier">datastore</span>, <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:user_iso</span>], <span class="ruby-node">&quot;#{opts[:name]}.iso&quot;</span>)
            <span class="ruby-identifier">machine_config</span>[<span class="ruby-identifier">:extraConfig</span>] <span class="ruby-operator">&lt;&lt;</span> {
              <span class="ruby-identifier">:key</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'user_iso_file'</span>, <span class="ruby-identifier">:value</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;#{opts[:name]}.iso&quot;</span>
            }
            <span class="ruby-identifier">device</span>.<span class="ruby-identifier">backing</span> = <span class="ruby-constant">RbVmomi</span><span class="ruby-operator">::</span><span class="ruby-constant">VIM</span>.<span class="ruby-constant">VirtualCdromIsoBackingInfo</span>(<span class="ruby-identifier">:fileName</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;[#{opts[:realm_id] || vm[:datastore]}] &quot;</span><span class="ruby-operator">+</span>
                                                                     <span class="ruby-node">&quot;/#{VSphere::FileManager::DIRECTORY_PATH}/#{opts[:name]}.iso&quot;</span>)
            <span class="ruby-identifier">machine_config</span>.<span class="ruby-identifier">merge!</span>({
              <span class="ruby-identifier">:deviceChange</span> =<span class="ruby-operator">&gt;</span> [{
                <span class="ruby-identifier">:operation</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">:edit</span>,
                <span class="ruby-identifier">:device</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">device</span>
              }]
            })
          <span class="ruby-keyword kw">else</span>
            <span class="ruby-identifier">raise</span> <span class="ruby-value str">&quot;Failed to inject data to device because there is no CD-ROM drive defined in given template&quot;</span>
          <span class="ruby-keyword kw">end</span>
        <span class="ruby-keyword kw">end</span>
        <span class="ruby-identifier">spec</span> = <span class="ruby-constant">RbVmomi</span><span class="ruby-operator">::</span><span class="ruby-constant">VIM</span>.<span class="ruby-constant">VirtualMachineCloneSpec</span>(
          <span class="ruby-identifier">:location</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">relocateSpec</span>,
          <span class="ruby-identifier">:powerOn</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">true</span>,
          <span class="ruby-identifier">:template</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">false</span>,
          <span class="ruby-identifier">:config</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-constant">RbVmomi</span><span class="ruby-operator">::</span><span class="ruby-constant">VIM</span>.<span class="ruby-constant">VirtualMachineConfigSpec</span>(<span class="ruby-identifier">machine_config</span>)
        )
        <span class="ruby-identifier">instance_profile</span> = <span class="ruby-constant">InstanceProfile</span><span class="ruby-operator">::</span><span class="ruby-identifier">new</span>(<span class="ruby-value str">'default'</span>, <span class="ruby-identifier">:hwp_memory</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:hwp_memory</span>], <span class="ruby-identifier">:hwp_cpu</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:hwp_cpu</span>])
        <span class="ruby-identifier">task</span> = <span class="ruby-identifier">vm</span>[<span class="ruby-identifier">:instance</span>].<span class="ruby-constant">CloneVM_Task</span>(<span class="ruby-identifier">:folder</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">vm</span>[<span class="ruby-identifier">:instance</span>].<span class="ruby-identifier">parent</span>, <span class="ruby-identifier">:name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:name</span>], <span class="ruby-identifier">:spec</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">spec</span>)
        <span class="ruby-identifier">new_instance</span> = <span class="ruby-constant">Instance</span><span class="ruby-operator">::</span><span class="ruby-identifier">new</span>(
          <span class="ruby-identifier">:id</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:name</span>],
          <span class="ruby-identifier">:name</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:name</span>],
          <span class="ruby-identifier">:description</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:name</span>],
          <span class="ruby-identifier">:owner_id</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">credentials</span>.<span class="ruby-identifier">user</span>,
          <span class="ruby-identifier">:image_id</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:image_id</span>],
          <span class="ruby-identifier">:realm_id</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">opts</span>[<span class="ruby-identifier">:realm_id</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">vm</span>[<span class="ruby-identifier">:datastore</span>],
          <span class="ruby-identifier">:state</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'PENDING'</span>,
          <span class="ruby-identifier">:public_addresses</span> =<span class="ruby-operator">&gt;</span> [],
          <span class="ruby-identifier">:private_addresses</span> =<span class="ruby-operator">&gt;</span> [],
          <span class="ruby-identifier">:instance_profile</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">instance_profile</span>,
          <span class="ruby-identifier">:actions</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">instance_actions_for</span>( <span class="ruby-value str">'PENDING'</span> ),
          <span class="ruby-identifier">:create_image</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">false</span>
        )
        <span class="ruby-comment cmt"># This will 'serialize' instance to YAML file and map it to the task.</span>
        <span class="ruby-comment cmt"># Ussualy it takes like 2-3 minutes (depending on storage size) to</span>
        <span class="ruby-comment cmt"># complete instance cloning process.</span>
        <span class="ruby-identifier">map_task_to_instance</span>(<span class="ruby-identifier">datastore</span>, <span class="ruby-identifier">task</span>.<span class="ruby-identifier">info</span>.<span class="ruby-identifier">key</span>, <span class="ruby-identifier">new_instance</span>)
      <span class="ruby-keyword kw">end</span>
    <span class="ruby-keyword kw">end</span></pre>
</body>
</html>