Module: RbVmomi::VIM

Defined in:
lib/rbvmomi/types.rb,
lib/rbvmomi/extensions.rb

Defined Under Namespace

Classes: Base, ComputeResource, DataObject, Datacenter, Datastore, Enum, Folder, LocalizedMethodFault, ManagedEntity, ManagedObject, ManagedObjectReference, MethodFault, MethodName, ObjectContent, ObjectWithMethods, ObjectWithProperties, OvfManager, PropertyPath, RuntimeFault, ServiceInstance, Task, TypeName, VirtualMachine

Constant Summary collapse

BUILTIN_TYPES =
%w(ManagedObject TypeName PropertyPath ManagedObjectReference MethodName MethodFault LocalizedMethodFault)

Class Method Summary collapse

Class Method Details

.const_missing(sym) ⇒ Object



42
43
44
45
46
47
48
# File 'lib/rbvmomi/types.rb', line 42

def self.const_missing sym
  if @typenames.member? sym.to_s
    load_type sym
  else
    super
  end
end

.has_type?(name) ⇒ Boolean

Returns:



30
31
32
# File 'lib/rbvmomi/types.rb', line 30

def self.has_type? name
  @typenames.member? name.to_s
end

.load(fn) ⇒ Object



20
21
22
23
24
25
26
27
28
# File 'lib/rbvmomi/types.rb', line 20

def self.load fn
  @db = HDB.new
  if !@db.open(fn, HDB::OREADER | HDB::ONOLCK)
    raise "VMODL db open error: #{@db.errmsg(@db.ecode)}"
  end
  @vmodl = Hash.new { |h,k| if e = @db[k] then h[k] = Marshal.load(e) end }
  @typenames = Marshal.load(@db['_typenames']) + BUILTIN_TYPES
  Object.constants.select { |x| @typenames.member? x.to_s }.each { |x| load_type x }
end

.load_type(sym) ⇒ Object



58
59
60
# File 'lib/rbvmomi/types.rb', line 58

def self.load_type sym
  const_set sym, make_type(sym)
end

.make_data_type(name, desc) ⇒ Object



73
74
75
76
77
78
# File 'lib/rbvmomi/types.rb', line 73

def self.make_data_type name, desc
  superclass = const_get(desc['wsdl_base'].to_sym)
  Class.new(superclass).tap do |klass|
    klass.initialize name, desc['props']
  end
end

.make_enum_type(name, desc) ⇒ Object



87
88
89
90
91
# File 'lib/rbvmomi/types.rb', line 87

def self.make_enum_type name, desc
  Class.new(Enum).tap do |klass|
    klass.initialize name, desc['values']
  end
end

.make_managed_type(name, desc) ⇒ Object



80
81
82
83
84
85
# File 'lib/rbvmomi/types.rb', line 80

def self.make_managed_type name, desc
  superclass = const_get(desc['wsdl_base'].to_sym)
  Class.new(superclass).tap do |klass|
    klass.initialize name, desc['props'], desc['methods']
  end
end

.make_type(name) ⇒ Object



62
63
64
65
66
67
68
69
70
71
# File 'lib/rbvmomi/types.rb', line 62

def self.make_type name
  name = name.to_s
  desc = @vmodl[name] or fail "unknown VIM type #{name}"
  case desc['kind']
  when 'data' then make_data_type name, desc
  when 'managed' then make_managed_type name, desc
  when 'enum' then make_enum_type name, desc
  else fail desc.inspect
  end
end

.method_missing(sym, *a) ⇒ Object



50
51
52
53
54
55
56
# File 'lib/rbvmomi/types.rb', line 50

def self.method_missing sym, *a
  if @typenames.member? sym.to_s
    const_get(sym).new *a
  else
    super
  end
end

.type(name) ⇒ Object



34
35
36
37
38
39
40
# File 'lib/rbvmomi/types.rb', line 34

def self.type name
  if has_type? name
    const_get(name.to_sym)
  else
    fail "no such type #{name.inspect}"
  end
end