rbvmomi 1.11.3 → 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (52) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +2 -2
  3. data/exe/rbvmomish +5 -5
  4. data/lib/rbvmomi/connection.rb +13 -13
  5. data/lib/rbvmomi/deserialization.rb +1 -2
  6. data/lib/rbvmomi/{trollop.rb → optimist.rb} +7 -7
  7. data/lib/rbvmomi/pbm.rb +1 -1
  8. data/lib/rbvmomi/sms.rb +1 -1
  9. data/lib/rbvmomi/sso.rb +313 -0
  10. data/lib/rbvmomi/trivial_soap.rb +8 -5
  11. data/lib/rbvmomi/type_loader.rb +1 -1
  12. data/lib/rbvmomi/utils/deploy.rb +1 -1
  13. data/lib/rbvmomi/version.rb +2 -2
  14. data/lib/rbvmomi/vim/Folder.rb +1 -1
  15. data/lib/rbvmomi/vim/HostSystem.rb +2 -2
  16. data/lib/rbvmomi/vim/ManagedObject.rb +1 -1
  17. data/lib/rbvmomi/vim/OvfManager.rb +1 -1
  18. data/lib/rbvmomi/vim/VirtualMachine.rb +9 -11
  19. data/lib/rbvmomi/vim.rb +9 -10
  20. data/lib/rbvmomi.rb +11 -9
  21. data/vmodl.db +0 -0
  22. metadata +45 -61
  23. data/.gitignore +0 -13
  24. data/.travis.yml +0 -11
  25. data/.yardopts +0 -6
  26. data/CONTRIBUTORS.md +0 -42
  27. data/Gemfile +0 -10
  28. data/Rakefile +0 -16
  29. data/devel/analyze-vim-declarations.rb +0 -217
  30. data/devel/analyze-xml.rb +0 -49
  31. data/devel/benchmark.rb +0 -121
  32. data/devel/collisions.rb +0 -22
  33. data/devel/merge-internal-vmodl.rb +0 -63
  34. data/devel/merge-manual-vmodl.rb +0 -36
  35. data/examples/annotate.rb +0 -57
  36. data/examples/cached_ovf_deploy.rb +0 -124
  37. data/examples/clone_vm.rb +0 -88
  38. data/examples/create_vm-1.9.rb +0 -97
  39. data/examples/create_vm.rb +0 -97
  40. data/examples/extraConfig.rb +0 -57
  41. data/examples/lease_tool.rb +0 -106
  42. data/examples/logbundle.rb +0 -66
  43. data/examples/logtail.rb +0 -63
  44. data/examples/nfs_datastore.rb +0 -99
  45. data/examples/power.rb +0 -62
  46. data/examples/readme-1.rb +0 -38
  47. data/examples/readme-2.rb +0 -54
  48. data/examples/run.sh +0 -41
  49. data/examples/screenshot.rb +0 -51
  50. data/examples/vdf.rb +0 -84
  51. data/examples/vm_drs_behavior.rb +0 -80
  52. data/rbvmomi.gemspec +0 -33
@@ -1,217 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright (c) 2010-2017 VMware, Inc. All Rights Reserved.
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'nokogiri'
7
- require 'pp'
8
- # :usage => analyze-vim-declarations.rb vim-declarations.xml foo-declarations.xml vmodl.db
9
-
10
- XML_FNS = ARGV[0...-1]
11
- abort "must specify path to vim-declarations.xml" if XML_FNS.empty?
12
- OUT_FN = ARGV[-1] or abort "must specify path to output database"
13
-
14
- XML_FNS.each do |x|
15
- abort "XML file #{x} does not exist" unless File.exists? x
16
- end
17
-
18
- TYPES = {}
19
- VERSIONS = []
20
-
21
- ID2NAME = Hash.new { |h,k| fail "unknown type-id #{k.inspect}" }
22
-
23
- ID2NAME.merge!({
24
- 'java.lang.String' => 'xsd:string',
25
- 'BOOLEAN' => 'xsd:boolean',
26
- 'BYTE' => 'xsd:byte',
27
- 'SHORT' => 'xsd:short',
28
- 'INT' => 'xsd:int',
29
- 'LONG' => 'xsd:long',
30
- 'FLOAT' => 'xsd:float',
31
- 'DOUBLE' => 'xsd:double',
32
- 'vmodl.DateTime' => 'xsd:dateTime',
33
- 'vmodl.Binary' => 'xsd:base64Binary',
34
- 'vmodl.Any' => 'xsd:anyType',
35
- 'vmodl.URI' => 'xsd:anyURI',
36
- 'void' => nil,
37
- })
38
-
39
- %w(DataObject ManagedObject MethodFault MethodName
40
- PropertyPath RuntimeFault TypeName).each do |x|
41
- ID2NAME['vmodl.' + x] = x
42
- end
43
-
44
- def handle_data_object node
45
- if TYPES[node['name']]
46
- puts "Type #{node['name']} already exists"
47
- return
48
- end
49
-
50
- ID2NAME[node['type-id']] = node['name']
51
- TYPES[node['name']] = {
52
- 'kind' => 'data',
53
- 'base-type-id' => node['base-type-id'],
54
- 'props' => node.children.select { |x| x.name == 'property' }.map do |property|
55
- {
56
- 'name' => property['name'],
57
- 'type-id-ref' => property['type-id-ref'],
58
- 'is-optional' => property['is-optional'] ? true : false,
59
- 'is-array' => property['is-array'] ? true : false,
60
- 'version-id-ref' => property['version-id-ref'],
61
- }
62
- end
63
- }
64
- end
65
-
66
- def handle_managed_object node
67
- if TYPES[node['name']]
68
- puts "Type #{node['name']} already exists"
69
- return
70
- end
71
- ID2NAME[node['type-id']] = node['name']
72
- TYPES[node['name']] = {
73
- 'kind' => 'managed',
74
- 'base-type-id' => node['base-type-id'],
75
- 'props' => node.children.select { |x| x.name == 'property' }.map do |property|
76
- {
77
- 'name' => property['name'],
78
- 'type-id-ref' => property['type-id-ref'],
79
- 'is-optional' => property['is-optional'] ? true : false,
80
- 'is-array' => property['is-array'] ? true : false,
81
- 'version-id-ref' => property['version-id-ref'],
82
- }
83
- end,
84
- 'methods' => Hash[
85
- node.children.select { |x| x.name == 'method' }.map do |method|
86
- [method['is-task'] ? "#{method['name']}_Task" : method['name'],
87
- {
88
- 'params' => method.children.select { |x| x.name == 'parameter' }.map do |param|
89
- {
90
- 'name' => param['name'],
91
- 'type-id-ref' => param['type-id-ref'],
92
- 'is-array' => param['is-array'] ? true : false,
93
- 'is-optional' => param['is-optional'] ? true : false,
94
- 'version-id-ref' => param['version-id-ref'],
95
- }
96
- end,
97
- 'result' => {
98
- 'type-id-ref' => method['type-id-ref'],
99
- 'is-array' => method['is-array'] ? true : false,
100
- 'is-optional' => method['is-optional'] ? true : false,
101
- 'is-task' => method['is-task'] ? true : false,
102
- 'version-id-ref' => method['version-id-ref'],
103
- }
104
- }
105
- ]
106
- end
107
- ]
108
- }
109
- end
110
-
111
- def handle_enum node
112
- if TYPES[node['name']]
113
- puts "Type #{node['name']} already exists"
114
- return
115
- end
116
-
117
- ID2NAME[node['type-id']] = node['name']
118
- TYPES[node['name']] = {
119
- 'kind' => 'enum',
120
- 'values' => node.children.map { |child| child['name'] },
121
- }
122
- end
123
-
124
- def handle_fault node
125
- handle_data_object node
126
- end
127
-
128
- def handle_version x
129
- attrs = %w(display-name name service-namespace type-id version-id vmodl-name)
130
- h = Hash[attrs.map { |k| [k, x[k]] }]
131
- h['compatible'] = x.children.select(&:element?).map { |y| y.text }
132
- VERSIONS << h
133
- end
134
-
135
- XML_FNS.each do |fn|
136
- puts "parsing #{fn} ..."
137
- xml_str = File.read(fn)
138
- xml_str = xml_str.gsub(/\<description-html\>(.*?)\<\/description-html\>/m, "")
139
- xml = Nokogiri.parse(xml_str, nil, nil, Nokogiri::XML::ParseOptions::NOBLANKS)
140
- xml.root.at('enums').children.each { |x| handle_enum x }
141
- xml.root.at('managed-objects').children.each { |x| handle_managed_object x }
142
- xml.root.at('data-objects').children.each { |x| handle_data_object x }
143
- xml.root.at('faults').children.each { |x| handle_fault x }
144
- #xml.root.at('definitions').at('version-types').children.each { |x| handle_version x }
145
- end
146
-
147
- #pp ID2NAME
148
-
149
- munge_fault = lambda { |x| true }
150
-
151
- TYPES.each do |k,t|
152
- case t['kind']
153
- when 'data'
154
- t['wsdl_base'] = t['base-type-id'] ? ID2NAME[t['base-type-id']] : 'DataObject'
155
- t.delete 'base-type-id'
156
- t['props'].each do |x|
157
- x['wsdl_type'] = ID2NAME[x['type-id-ref']]
158
- x.delete 'type-id-ref'
159
- munge_fault[x]
160
- end
161
- when 'managed'
162
- t['wsdl_base'] = t['base-type-id'] ? ID2NAME[t['base-type-id']] : 'ManagedObject'
163
- t.delete 'base-type-id'
164
- t['props'].each do |x|
165
- x['wsdl_type'] = ID2NAME[x['type-id-ref']]
166
- x.delete 'type-id-ref'
167
- munge_fault[x]
168
- end
169
- t['methods'].each do |mName,x|
170
- if y = x['result']
171
- begin
172
- y['wsdl_type'] = ID2NAME[y['type-id-ref']]
173
- rescue Exception => ex
174
- pp ex
175
- end
176
- y.delete 'type-id-ref'
177
- munge_fault[y]
178
- end
179
- x['params'].each do |r|
180
- begin
181
- r['wsdl_type'] = ID2NAME[r['type-id-ref']]
182
- rescue Exception => ex
183
- pp ex
184
- end
185
- r.delete 'type-id-ref'
186
- munge_fault[r]
187
- end
188
- end
189
- when 'enum'
190
- else fail
191
- end
192
- end
193
-
194
- db = {}
195
-
196
- TYPES.each do |k,t|
197
- db[k] = t
198
- end
199
-
200
- db['_typenames'] = TYPES.keys
201
- db['_versions'] = VERSIONS
202
-
203
- File.open(OUT_FN, 'w') { |io| Marshal.dump db, io }
204
-
205
- if filename = ENV['VERSION_GRAPH']
206
- File.open(filename, 'w') do |io|
207
- io.puts "digraph versions\n{"
208
- VERSIONS.each do |h|
209
- io.puts "\"#{h['vmodl-name']}\" [label=\"#{h['vmodl-name']} (#{h['version-id']})\"]"
210
- h['compatible'].each do |x|
211
- x =~ /^interface / or fail x
212
- io.puts "\"#{h['vmodl-name']}\" -> \"#{$'}\""
213
- end
214
- end
215
- io.puts "}\n"
216
- end
217
- end
data/devel/analyze-xml.rb DELETED
@@ -1,49 +0,0 @@
1
- # Copyright (c) 2010-2017 VMware, Inc. All Rights Reserved.
2
- # SPDX-License-Identifier: MIT
3
-
4
- require 'nokogiri'
5
-
6
- # removes line breaks and whitespace between xml nodes.
7
- def prepare_xml(xml)
8
- xml = xml.gsub(/\n+/, "")
9
- xml = xml.gsub(/(>)\s*(<)/, '\1\2')
10
- end
11
-
12
- def analyze_xml x, tree
13
- subtree = (tree[x.name] ||= { :attributes => [], :min_occur => nil, :max_occur => nil })
14
- attrs = x.attributes.keys.sort
15
- subtree[:attributes] << attrs unless subtree[:attributes].member? attrs
16
-
17
- child_occurs = Hash.new 0
18
- x.children.select(&:element?).each do |c|
19
- child_occurs[c.name] += 1
20
- analyze_xml c, subtree
21
- end
22
-
23
- subtree.select { |k,v| k.is_a? String }.each do |k,v|
24
- v[:min_occur] = [v[:min_occur], child_occurs[k]].compact.min
25
- v[:max_occur] = [v[:max_occur], child_occurs[k]].compact.max
26
- end
27
- end
28
-
29
- def print_tree tree, indent=0
30
- tree.select { |k,v| k.is_a? String }.sort.each do |k,v|
31
- attrs = v[:attributes] || []
32
- min, max = v[:min_occur], v[:max_occur]
33
- numsym = if min == 0 and max == 0 then fail
34
- elsif min == 0 and max == 1 then '?'
35
- elsif min == 0 then '*'
36
- elsif min == 1 and max == 1 then ''
37
- else '+'
38
- end
39
- puts "#{' '*indent}#{k}#{numsym}: #{attrs.sort.map { |a| "[#{a * ' '}]"} * ', '} {#{min},#{max}}"
40
- print_tree v, (indent+1)
41
- end
42
- end
43
-
44
- tree = {}
45
- ARGV.each do |fn|
46
- nk = Nokogiri(prepare_xml(File.read fn))
47
- analyze_xml nk.root, tree
48
- end
49
- print_tree tree
data/devel/benchmark.rb DELETED
@@ -1,121 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'tempfile'
7
-
8
- if ENV['RBVMOMI_COVERAGE'] == '1'
9
- require 'simplecov'
10
- SimpleCov.start
11
- end
12
-
13
- require 'rbvmomi'
14
- require 'rbvmomi/deserialization'
15
- require 'benchmark'
16
- require 'libxml'
17
-
18
- NS_XSI = 'http://www.w3.org/2001/XMLSchema-instance'
19
-
20
- VIM = RbVmomi::VIM
21
- $conn = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
22
- raw = File.read(ARGV[0])
23
-
24
- def diff a, b
25
- a_io = Tempfile.new 'rbvmomi-diff-a'
26
- b_io = Tempfile.new 'rbvmomi-diff-b'
27
- PP.pp a, a_io
28
- PP.pp b, b_io
29
- a_io.close
30
- b_io.close
31
- system("diff -u #{a_io.path} #{b_io.path}")
32
- a_io.unlink
33
- b_io.unlink
34
- end
35
-
36
- begin
37
- deserializer = RbVmomi::OldDeserializer.new($conn)
38
- end_time = Time.now + 1
39
- n = 0
40
- while n == 0 or end_time > Time.now
41
- deserializer.deserialize Nokogiri::XML(raw).root
42
- n += 1
43
- end
44
- N = n*10
45
- end
46
-
47
- puts "iterations: #{N}"
48
-
49
- parsed_nokogiri = Nokogiri::XML(raw)
50
- parsed_libxml = LibXML::XML::Parser.string(raw).parse
51
-
52
- if true
53
- nokogiri_xml = parsed_nokogiri.root
54
- libxml_xml = parsed_libxml.root
55
-
56
- old_nokogiri_result = RbVmomi::OldDeserializer.new($conn).deserialize nokogiri_xml
57
- new_nokogiri_result = RbVmomi::NewDeserializer.new($conn).deserialize nokogiri_xml
58
- new_libxml_result = RbVmomi::NewDeserializer.new($conn).deserialize libxml_xml
59
-
60
- if new_nokogiri_result != old_nokogiri_result
61
- puts "new_nokogiri_result doesnt match old_nokogiri_result"
62
- puts "old_nokogiri_result:"
63
- pp old_nokogiri_result
64
- puts "new_nokogiri_result:"
65
- pp new_nokogiri_result
66
- puts "diff:"
67
- diff old_nokogiri_result, new_nokogiri_result
68
- exit 1
69
- end
70
-
71
- if new_libxml_result != old_nokogiri_result
72
- puts "new_libxml_result doesnt match old_nokogiri_result"
73
- puts "old_nokogiri_result:"
74
- pp old_nokogiri_result
75
- puts "new_libxml_result:"
76
- pp new_libxml_result
77
- puts "diff:"
78
- diff old_nokogiri_result, new_libxml_result
79
- exit 1
80
- end
81
-
82
- puts "all results match"
83
- end
84
-
85
- Benchmark.bmbm do|b|
86
- GC.start
87
- b.report("nokogiri parsing") do
88
- N.times { Nokogiri::XML(raw) }
89
- end
90
-
91
- GC.start
92
- b.report("libxml parsing") do
93
- N.times do
94
- LibXML::XML::Parser.string(raw).parse
95
- end
96
- end
97
-
98
- GC.start
99
- b.report("old deserialization (nokogiri)") do
100
- deserializer = RbVmomi::OldDeserializer.new($conn)
101
- N.times do
102
- deserializer.deserialize Nokogiri::XML(raw).root
103
- end
104
- end
105
-
106
- GC.start
107
- b.report("new deserialization (nokogiri)") do
108
- deserializer = RbVmomi::NewDeserializer.new($conn)
109
- N.times do
110
- deserializer.deserialize Nokogiri::XML(raw).root
111
- end
112
- end
113
-
114
- GC.start
115
- b.report("new deserialization (libxml)") do
116
- deserializer = RbVmomi::NewDeserializer.new($conn)
117
- N.times do
118
- deserializer.deserialize LibXML::XML::Parser.string(raw).parse.root
119
- end
120
- end
121
- end
data/devel/collisions.rb DELETED
@@ -1,22 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
4
- # SPDX-License-Identifier: MIT
5
-
6
- # Find collisions between VMODL property names and Ruby methods
7
- require 'rbvmomi'
8
- VIM = RbVmomi::VIM
9
-
10
- conn = VIM.new(:ns => 'urn:vim25', :rev => '4.0')
11
-
12
- VIM.loader.typenames.each do |name|
13
- klass = VIM.loader.get name
14
- next unless klass.respond_to? :kind and [:managed, :data].member? klass.kind
15
- methods = klass.kind == :managed ?
16
- RbVmomi::BasicTypes::ObjectWithMethods.instance_methods :
17
- RbVmomi::BasicTypes::ObjectWithProperties.instance_methods
18
- klass.props_desc.each do |x|
19
- name = x['name']
20
- puts "collision: #{klass}##{name}" if methods.member? name.to_sym
21
- end
22
- end
@@ -1,63 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
4
- # SPDX-License-Identifier: MIT
5
-
6
- # These types are not public and so may change between releases. Do not
7
- # use them directly.
8
-
9
- public_vmodl_filename = ARGV[0] or abort "public vmodl filename required"
10
- internal_vmodl_filename = ARGV[1] or abort "internal vmodl filename required"
11
- output_vmodl_filename = ARGV[2] or abort "output vmodl filename required"
12
-
13
- TYPES = %w(
14
- DVSKeyedOpaqueData
15
- DVSOpaqueDataConfigSpec
16
- DVPortgroupSelection
17
- DVPortSelection
18
- DVSSelection
19
- DynamicTypeEnumTypeInfo
20
- DynamicTypeMgrAllTypeInfo
21
- DynamicTypeMgrAnnotation
22
- DynamicTypeMgrDataTypeInfo
23
- DynamicTypeMgrFilterSpec
24
- DynamicTypeMgrManagedTypeInfo
25
- DynamicTypeMgrMethodTypeInfo
26
- DynamicTypeMgrMethodTypeInfoAnnotationType
27
- DynamicTypeMgrMoFilterSpec
28
- DynamicTypeMgrMoInstance
29
- DynamicTypeMgrParamTypeInfo
30
- DynamicTypeMgrParamTypeInfoAnnotationType
31
- DynamicTypeMgrPropertyTypeInfo
32
- DynamicTypeMgrPropertyTypeInfoAnnotationType
33
- DynamicTypeMgrTypeFilterSpec
34
- InternalDynamicTypeManager
35
- ReflectManagedMethodExecuter
36
- ReflectManagedMethodExecuterSoapArgument
37
- ReflectManagedMethodExecuterSoapFault
38
- ReflectManagedMethodExecuterSoapResult
39
- SelectionSet
40
- )
41
-
42
- METHODS = %w(
43
- DistributedVirtualSwitchManager.UpdateDvsOpaqueData_Task
44
- HostSystem.RetrieveDynamicTypeManager
45
- HostSystem.RetrieveManagedMethodExecuter
46
- )
47
-
48
- public_vmodl = File.open(public_vmodl_filename, 'r') { |io| Marshal.load io }
49
- internal_vmodl = File.open(internal_vmodl_filename, 'r') { |io| Marshal.load io }
50
-
51
- TYPES.each do |k|
52
- puts "Merging in #{k}"
53
- fail "Couldn't find type #{k} in internal VMODL" unless internal_vmodl.member? k
54
- public_vmodl[k] = internal_vmodl[k]
55
- end
56
-
57
- METHODS.each do |x|
58
- puts "Merging in #{x}"
59
- type, method = x.split '.'
60
- public_vmodl[type]['methods'][method] = internal_vmodl[type]['methods'][method] or fail
61
- end
62
-
63
- File.open(output_vmodl_filename, 'w') { |io| Marshal.dump public_vmodl, io }
@@ -1,36 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright (c) 2013-2017 VMware, Inc. All Rights Reserved.
4
- # SPDX-License-Identifier: MIT
5
-
6
- # Manually merge two versions of vmodl.db
7
-
8
- public_vmodl_filename = ARGV[0] or abort "public vmodl filename required"
9
- internal_vmodl_filename = ARGV[1] or abort "internal vmodl filename required"
10
- output_vmodl_filename = ARGV[2] or abort "output vmodl filename required"
11
-
12
- public_vmodl = File.open(public_vmodl_filename, 'r') { |io| Marshal.load io }
13
- internal_vmodl = File.open(internal_vmodl_filename, 'r') { |io| Marshal.load io }
14
-
15
- db = {}
16
- tn = {}
17
- public_vmodl.each do |k,v|
18
- unless k == '_typenames'
19
- db[k] = v
20
- else
21
- tn['_typenames'] = v
22
- end
23
- end
24
-
25
- internal_vmodl.each do |k, v|
26
- unless k == '_typenames'
27
- db[k] = v unless db[k]
28
- else
29
- tn['_typenames'] = tn['_typenames'] + v
30
- end
31
- end
32
-
33
- db['_typenames'] = tn
34
-
35
-
36
- File.open(output_vmodl_filename, 'w') { |io| Marshal.dump db, io }
data/examples/annotate.rb DELETED
@@ -1,57 +0,0 @@
1
- # Copyright (c) 2011-2017 VMware, Inc. All Rights Reserved.
2
- # SPDX-License-Identifier: MIT
3
-
4
- require 'trollop'
5
- require 'rbvmomi'
6
- require 'rbvmomi/trollop'
7
-
8
- VIM = RbVmomi::VIM
9
- CMDS = %w(get set)
10
-
11
- opts = Trollop.options do
12
- banner <<-EOS
13
- Annotate a VM.
14
-
15
- Usage:
16
- annotate.rb [options] VM get
17
- annotate.rb [options] VM set annotation
18
-
19
- Commands: #{CMDS * ' '}
20
-
21
- VIM connection options:
22
- EOS
23
-
24
- rbvmomi_connection_opts
25
-
26
- text <<-EOS
27
-
28
- VM location options:
29
- EOS
30
-
31
- rbvmomi_datacenter_opt
32
-
33
- text <<-EOS
34
-
35
- Other options:
36
- EOS
37
-
38
- stop_on CMDS
39
- end
40
-
41
- vm_name = ARGV[0] or Trollop.die("no VM name given")
42
- cmd = ARGV[1] or Trollop.die("no command given")
43
- abort "invalid command" unless CMDS.member? cmd
44
- Trollop.die("must specify host") unless opts[:host]
45
-
46
- vim = VIM.connect opts
47
-
48
- dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found"
49
- vm = dc.find_vm(vm_name) or abort "VM not found"
50
-
51
- case cmd
52
- when 'get'
53
- puts vm.config.annotation
54
- when 'set'
55
- value = ARGV[2] or Trollop.die("no annotation given")
56
- vm.ReconfigVM_Task(:spec => VIM.VirtualMachineConfigSpec(:annotation => value)).wait_for_completion
57
- end
@@ -1,124 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- # Copyright (c) 2012-2017 VMware, Inc. All Rights Reserved.
4
- # SPDX-License-Identifier: MIT
5
-
6
- require 'trollop'
7
- require 'rbvmomi'
8
- require 'rbvmomi/trollop'
9
- require 'rbvmomi/utils/deploy'
10
- require 'rbvmomi/utils/admission_control'
11
- require 'yaml'
12
-
13
- VIM = RbVmomi::VIM
14
-
15
- opts = Trollop.options do
16
- banner <<-EOS
17
- Deploy an OVF to a cluster, using a cached template if available.
18
-
19
- Usage:
20
- cached_ovf_deploy.rb [options] <vmname> <ovfurl>
21
-
22
- VIM connection options:
23
- EOS
24
-
25
- rbvmomi_connection_opts
26
-
27
- text <<-EOS
28
-
29
- VM location options:
30
- EOS
31
-
32
- rbvmomi_datacenter_opt
33
- rbvmomi_datastore_opt
34
-
35
- text <<-EOS
36
-
37
- Other options:
38
- EOS
39
-
40
- opt :template_name, "Name to give to the (cached) template", :type => :string
41
- opt :template_path, "Path where templates are stored", :default => 'templates', :type => :string
42
- opt :computer_path, "Path to the cluster to deploy into", :type => :string
43
- opt :network, "Name of the network to attach template to", :type => :string
44
- opt :vm_folder_path, "Path to VM folder to deploy VM into", :type => :string
45
- opt :lease, "Lease in days", :type => :int, :default => 3
46
- end
47
-
48
- Trollop.die("must specify host") unless opts[:host]
49
- Trollop.die("no cluster path given") unless opts[:computer_path]
50
- template_folder_path = opts[:template_path]
51
- template_name = opts[:template_name] or Trollop.die("no template name given")
52
- vm_name = ARGV[0] or Trollop.die("no VM name given")
53
- ovf_url = ARGV[1] or Trollop.die("No OVF URL given")
54
-
55
- vim = VIM.connect opts
56
- dc = vim.serviceInstance.find_datacenter(opts[:datacenter]) or abort "datacenter not found"
57
-
58
- root_vm_folder = dc.vmFolder
59
- vm_folder = root_vm_folder
60
- if opts[:vm_folder_path]
61
- vm_folder = root_vm_folder.traverse(opts[:vm_folder_path], VIM::Folder)
62
- end
63
- template_folder = root_vm_folder.traverse!(template_folder_path, VIM::Folder)
64
-
65
- scheduler = AdmissionControlledResourceScheduler.new(
66
- vim,
67
- :datacenter => dc,
68
- :computer_names => [opts[:computer_path]],
69
- :vm_folder => vm_folder,
70
- :rp_path => '/',
71
- :datastore_paths => [opts[:datastore]],
72
- :max_vms_per_pod => nil, # No limits
73
- :min_ds_free => nil, # No limits
74
- )
75
- scheduler.make_placement_decision
76
-
77
- datastore = scheduler.datastore
78
- computer = scheduler.pick_computer
79
- # XXX: Do this properly
80
- if opts[:network]
81
- network = computer.network.find{|x| x.name == opts[:network]}
82
- else
83
- network = computer.network[0]
84
- end
85
-
86
- lease_tool = LeaseTool.new
87
- lease = opts[:lease] * 24 * 60 * 60
88
- deployer = CachedOvfDeployer.new(
89
- vim, network, computer, template_folder, vm_folder, datastore
90
- )
91
- template = deployer.lookup_template template_name
92
-
93
- if !template
94
- puts "#{Time.now}: Uploading/Preparing OVF template ..."
95
-
96
- template = deployer.upload_ovf_as_template(
97
- ovf_url, template_name,
98
- :run_without_interruptions => true,
99
- :config => lease_tool.set_lease_in_vm_config({}, lease)
100
- )
101
- end
102
-
103
- puts "#{Time.now}: Cloning template ..."
104
- config = {
105
- :numCPUs => opts[:cpus],
106
- :memoryMB => opts[:memory],
107
- }
108
- config = lease_tool.set_lease_in_vm_config(config, lease)
109
- vm = deployer.linked_clone template, vm_name, config
110
-
111
- puts "#{Time.now}: Powering On VM ..."
112
- # XXX: Add a retrying version?
113
- vm.PowerOnVM_Task.wait_for_completion
114
-
115
- puts "#{Time.now}: Waiting for VM to be up ..."
116
- ip = nil
117
- while !(ip = vm.guest_ip)
118
- sleep 5
119
- end
120
-
121
- puts "#{Time.now}: VM got IP: #{ip}"
122
-
123
- puts "#{Time.now}: Done"
124
-