lib/fog/opennebula/requests/compute/vm_allocate.rb

Summary

Maintainability
C
1 day
Test Coverage
module Fog
  module Compute
    class OpenNebula
      class Real
        def vm_allocate(attr={ })

          if(attr[:flavor].nil?)
            raise(ArgumentError.new("Attribute flavor is nil! #{attr.inspect}"))
          end
          if(attr[:name].nil? || attr[:name].empty?)
            raise(ArgumentError.new("Attribute name is nil or empty! #{attr.inspect}"))
          end

          xml = ::OpenNebula::VirtualMachine.build_xml
          vm  = ::OpenNebula::VirtualMachine.new(xml, client)
          rc = vm.allocate(attr[:flavor].to_s + "\nNAME=\"" + attr[:name] + "\"") 

          # irb(main):050:0> vm.allocate(s.flavor.to_s + "\nNAME=altest5")
          # => #<OpenNebula::Error:0x00000002a50760 @message="[VirtualMachineAllocate] User [42] : Not authorized to perform CREATE VM.", @errno=512>
          # irb(main):051:0> a = vm.allocate(s.flavor.to_s + "\nNAME=altest5")
          # => #<OpenNebula::Error:0x00000002ac0998 @message="[VirtualMachineAllocate] User [42] : Not authorized to perform CREATE VM.", @errno=512>
          # irb(main):052:0> a.class

          if(rc.is_a? ::OpenNebula::Error) 
            raise(rc)
          end


          # -1 - do not change the owner
          vm.chown(-1,attr[:gid].to_i) unless attr[:gid].nil?

          # TODO
          # check if vm is created vmid.class == One error class
          vm.info!

          one = vm.to_hash
          data = {}
          data["onevm_object"] = vm
          data["status"] =  vm.state
          data["state"]  =  vm.lcm_state_str
          data["id"]     =  vm.id
          data["uuid"]   =  vm.id
          data["gid"]    =  vm.gid
          data["name"]   =  one["VM"]["NAME"] unless one["VM"]["NAME"].nil?
          data["user"]   =  one["VM"]["UNAME"] unless one["VM"]["UNAME"].nil?
          data["group"]  =  one["VM"]["GNAME"] unless one["VM"]["GNAME"].nil?

          unless ( one["VM"]["TEMPLATE"].nil? ) then
            temp = one["VM"]["TEMPLATE"]
            data["cpu"]    =  temp["VCPU"]     unless temp["VCPU"].nil?
            data["memory"] =  temp["MEMORY"]     unless temp["MEMORY"].nil?
            unless (temp["NIC"].nil?) then
              if one["VM"]["TEMPLATE"]["NIC"].is_a?(Array)
                data["mac"]    =    temp["NIC"][0]["MAC"]     unless temp["NIC"][0]["MAC"].nil?
                data["ip"]    =    temp["NIC"][0]["IP"]     unless temp["NIC"][0]["IP"].nil?
              else
                data["mac"]    =    temp["NIC"]["MAC"]     unless temp["NIC"]["MAC"].nil?
                data["ip"]    =    temp["NIC"]["IP"]     unless temp["NIC"]["IP"].nil?
              end
            end
          end

          data
        rescue => err
          raise(err)
        end
      end

      class Mock
        def vm_allocate(attr={ })
          response = Excon::Response.new
          response.status = 200

          id = rand(1000)
          ids = []

          self.data['vms'].each do |vm|
            ids << vm['id']
            if vm['id'] == id
              while ids.include?(id)
                id = rand(1000)
              end
              break
            end
          end

          data = {}
          data['id'] = id
                    data['flavor'] = attr[:flavor]
                    data['name'] = attr[:name]
          data['state'] = 'RUNNING'
          data['status'] = 3
          self.data['vms'] << data
                    data
        end
      end
    end
  end
end