Revision 1c9af75a
Added by Ohad Levy over 11 years ago
- ID 1c9af75a932ba38ed98beb3830b841daca7a8066
lib/foreman/model/vmware.rb | ||
---|---|---|
module Foreman::Model
|
||
class Vmware < ComputeResource
|
||
|
||
validates_presence_of :user, :password, :server
|
||
NETWORK_INTERFACE_TYPES = %w(VirtualE1000)
|
||
validates_presence_of :user, :password, :server, :datacenter
|
||
before_create :update_public_key
|
||
|
||
def self.model_name
|
||
... | ... | |
end
|
||
|
||
def capabilities
|
||
[:build, :image]
|
||
[:build]
|
||
end
|
||
|
||
#FIXME
|
||
def max_cpu_count
|
||
8
|
||
def provided_attributes
|
||
super.merge({ :mac => :mac })
|
||
end
|
||
|
||
def max_cpu_count (cluster = nil)
|
||
return 8 unless cluster
|
||
cluster.num_cpu_cores
|
||
end
|
||
|
||
def max_memory
|
||
... | ... | |
end
|
||
|
||
def datacenters
|
||
client.datacenters
|
||
client.datacenters.all
|
||
end
|
||
|
||
def clusters
|
||
dc.clusters
|
||
end
|
||
|
||
def folders
|
||
dc.vm_folders.sort_by{|f| f.path}
|
||
end
|
||
|
||
def networks
|
||
dc.networks.all(:accessible => true)
|
||
end
|
||
|
||
def datastores
|
||
dc.datastores.all(:accessible => true)
|
||
end
|
||
|
||
def test_connection
|
||
... | ... | |
errors[:base] << e.message
|
||
end
|
||
|
||
def new_vm attr={ }
|
||
opts = vm_instance_defaults.merge(attr.to_hash).symbolize_keys
|
||
|
||
# convert rails nested_attributes into a plain hash
|
||
[:interfaces, :volumes].each do |collection|
|
||
nested_attrs = opts.delete("#{collection}_attributes".to_sym)
|
||
opts[collection] = nested_attributes_for(collection, nested_attrs) if nested_attrs
|
||
end
|
||
|
||
opts.reject! { |k, v| v.nil? }
|
||
|
||
client.servers.new opts
|
||
end
|
||
|
||
def create_vm args = { }
|
||
vm = new_vm(args)
|
||
|
||
vm.save
|
||
rescue Fog::Errors::Error => e
|
||
logger.debug e.backtrace
|
||
errors.add(:base, e.to_s)
|
||
false
|
||
end
|
||
|
||
def server
|
||
url
|
||
end
|
||
... | ... | |
self.url = value
|
||
end
|
||
|
||
def datacenter
|
||
uuid
|
||
end
|
||
|
||
def datacenter= value
|
||
self.uuid = value
|
||
end
|
||
|
||
def console uuid
|
||
vm = find_vm_by_uuid(uuid)
|
||
raise "VM is not running!" unless vm.ready?
|
||
#TOOD port, password
|
||
#NOTE this requires the following port to be open on your ESXi FW
|
||
values = {:port => unused_vnc_port(vm.hypervisor), :password => random_password, :enabled => true}
|
||
values = { :port => unused_vnc_port(vm.hypervisor), :password => random_password, :enabled => true }
|
||
vm.config_vnc(values)
|
||
VNCProxy.start :host => vm.hypervisor, :host_port => values[:port], :password => values[:password]
|
||
end
|
||
|
||
def new_interface attr = { }
|
||
client.interfaces.new attr
|
||
end
|
||
|
||
def new_volume attr = { }
|
||
client.volumes.new attr.merge(:size_gb => 10)
|
||
end
|
||
|
||
private
|
||
|
||
def dc
|
||
client.datacenters.get(datacenter)
|
||
end
|
||
|
||
def update_public_key
|
||
return unless pubkey_hash.blank?
|
||
client
|
||
... | ... | |
|
||
def unused_vnc_port ip
|
||
10.times do
|
||
port = 5901 + rand(64)
|
||
port = 5901 + rand(64)
|
||
unused = (TCPSocket.connect(ip, port).close rescue true)
|
||
return port if unused
|
||
end
|
||
raise "no unused port found"
|
||
end
|
||
|
||
def vm_instance_defaults
|
||
{
|
||
:memory_mb => 768,
|
||
:interfaces => [new_interface],
|
||
:volumes => [new_volume],
|
||
:datacenter => datacenter,
|
||
}.merge(super)
|
||
end
|
||
|
||
end
|
||
end
|
Also available in: Unified diff
fixes #1589 provisioning vmware support