1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134
|
# Copyright (c) 2011 VMware, Inc. All Rights Reserved.
require 'rbvmomi'
module RbVmomi
# A connection to one vSphere SDK endpoint.
# @see #serviceInstance
class VIM < Connection
# Connect to a vSphere SDK endpoint
#
# @param [Hash] opts The options hash.
# @option opts [String] :host Host to connect to.
# @option opts [Numeric] :port (443) Port to connect to.
# @option opts [Boolean] :ssl (true) Whether to use SSL.
# @option opts [Boolean] :insecure (false) If true, ignore SSL certificate errors.
# @option opts [String] :cookie If set, use cookie to connect instead of user/password
# @option opts [String] :user (root) Username.
# @option opts [String] :password Password.
# @option opts [String] :path (/sdk) SDK endpoint path.
# @option opts [Boolean] :debug (false) If true, print SOAP traffic to stderr.
def self.connect opts
fail unless opts.is_a? Hash
fail "host option required" unless opts[:host]
opts[:cookie] ||= nil
opts[:user] ||= 'root'
opts[:password] ||= ''
opts[:ssl] = true unless opts.member? :ssl or opts[:"no-ssl"]
opts[:insecure] ||= false
opts[:port] ||= (opts[:ssl] ? 443 : 80)
opts[:path] ||= '/sdk'
opts[:ns] ||= 'urn:vim25'
rev_given = opts[:rev] != nil
opts[:rev] = '4.0' unless rev_given
opts[:debug] = (!ENV['RBVMOMI_DEBUG'].empty? rescue false) unless opts.member? :debug
new(opts).tap do |vim|
unless opts[:cookie]
vim.serviceContent.sessionManager.Login :userName => opts[:user], :password => opts[:password]
end
unless rev_given
rev = vim.serviceContent.about.apiVersion
vim.rev = [rev, '5.5'].min
end
end
end
def close
VIM::SessionManager(self, 'SessionManager').Logout rescue RbVmomi::Fault
self.cookie = nil
super
end
def rev= x
super
@serviceContent = nil
end
# Return the ServiceInstance
#
# The ServiceInstance is the root of the vSphere inventory.
# @see http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.ServiceInstance.html
def serviceInstance
VIM::ServiceInstance self, 'ServiceInstance'
end
# Alias to serviceInstance.RetrieveServiceContent
def serviceContent
@serviceContent ||= serviceInstance.RetrieveServiceContent
end
# Alias to serviceContent.rootFolder
def rootFolder
serviceContent.rootFolder
end
alias root rootFolder
# Alias to serviceContent.propertyCollector
def propertyCollector
serviceContent.propertyCollector
end
# Alias to serviceContent.searchIndex
def searchIndex
serviceContent.searchIndex
end
# @private
def pretty_print pp
pp.text "VIM(#{@opts[:host]})"
end
def instanceUuid
serviceContent.about.instanceUuid
end
def get_log_lines logKey, lines=5, start=nil, host=nil
diagMgr = self.serviceContent.diagnosticManager
if !start
log = diagMgr.BrowseDiagnosticLog(:host => host, :key => logKey, :start => 999999999)
lineEnd = log.lineEnd
start = lineEnd - lines
end
start = start < 0 ? 0 : start
log = diagMgr.BrowseDiagnosticLog(:host => host, :key => logKey, :start => start)
if log.lineText.size > 0
[log.lineText.slice(-lines, log.lineText.size), log.lineEnd]
else
[log.lineText, log.lineEnd]
end
end
def get_log_keys host=nil
diagMgr = self.serviceContent.diagnosticManager
keys = []
diagMgr.QueryDescriptions(:host => host).each do |desc|
keys << "#{desc.key}"
end
keys
end
add_extension_dir File.join(File.dirname(__FILE__), "vim")
(ENV['RBVMOMI_VIM_EXTENSION_PATH']||'').split(':').each { |dir| add_extension_dir dir }
if File.exist?("/usr/share/ruby-rbvmomi/vmodl.db")
load_vmodl(ENV['VMODL'] || "/usr/share/ruby-rbvmomi/vmodl.db")
elsif File.exist?(File.join(File.dirname(__FILE__), "../../../../share/ruby-rbvmomi/vmodl.db"))
load_vmodl(ENV['VMODL'] || File.join(File.dirname(__FILE__), "../../../../share/ruby-rbvmomi/vmodl.db"))
else
load_vmodl(ENV['VMODL'] || File.join(File.dirname(__FILE__), "../../vmodl.db"))
end
end
end
|