esx 0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ lib/**/*.rb
2
+ bin/*
3
+ -
4
+ features/**/*.feature
5
+ LICENSE.txt
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ # Add dependencies to develop your gem here.
7
+ # Include everything needed to run rake, tests, features, etc.
8
+ group :development do
9
+ gem "shoulda", ">= 0"
10
+ gem "bundler", "~> 1.0.0"
11
+ gem "jeweler", "~> 1.5.2"
12
+ gem "rcov", ">= 0"
13
+ end
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2011 Sergio Rubio
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,83 @@
1
+ # ESX
2
+
3
+ Simple rbvmomi wrapper to manage VMWare ESX hosts
4
+
5
+ # Usage
6
+
7
+ ESX ruby library includes a script to print ESX host information.
8
+
9
+ Usage: esx my-esx-host-here
10
+
11
+ This will ask you for the username and password of the host.
12
+
13
+ Sample output:
14
+
15
+ *********
16
+ ESXHOST1
17
+ *********
18
+ Memory Size: 32756
19
+ Memory Usage: 7429
20
+ Cpu Cores: 8
21
+ Power State: poweredOn
22
+
23
+ Virtual Machines:
24
+ +-------------------------+--------+------+------+-------+
25
+ | NAME | MEMORY | CPUS | NICS | DISKS |
26
+ +-------------------------+--------+------+------+-------+
27
+ | foobar | 128 | 1 | 1 | 1 |
28
+ | foobar2 | 256 | 2 | 1 | 1 |
29
+ +-------------------------+--------+------+------+-------+
30
+
31
+ Datastores:
32
+ +------------+--------------+--------------+-----------+------+---------------------------------------------------+
33
+ | NAME | CAPACITY | FREESPACE | ACCESIBLE | TYPE | URL |
34
+ +------------+--------------+--------------+-----------+------+---------------------------------------------------+
35
+ | datastore2 | 146565758976 | 145547591680 | VMFS | true | /vmfs/volumes/4e611c69-16474ca5-d290-5ef3fc9a99c3 |
36
+ | datastore1 | 141465485312 | 20716716032 | VMFS | true | /vmfs/volumes/4e6117e7-35c82a3e-ba79-5cf3fc9699c2 |
37
+ +------------+--------------+--------------+-----------+------+---------------------------------------------------+
38
+
39
+
40
+ # Using the library
41
+
42
+ require 'rubygems'
43
+ require 'lib/esx.rb'
44
+
45
+
46
+ # Connect to the ESX Host
47
+ host = ESX::Host.connect 'my-esx-host', 'root', 'secret'
48
+
49
+ # Print hypervisor info
50
+ puts
51
+ name = host.name.upcase
52
+ puts "*" * name.size
53
+ puts name
54
+ puts "*" * name.size
55
+ puts "Memory Size: %s" % host.memory_size.bytes.to.megabytes.to_i
56
+ puts "Memory Usage: %s" % host.memory_usage.bytes.to.megabytes.to_i
57
+ puts "Cpu Cores: %s" % host.cpu_cores
58
+ puts "Power State: %s" % host.power_state
59
+
60
+ # Create a VM with 4GB disk, 128 MB mem, e1000 nic, 1CPU in datastore1
61
+ vm = host.create_vm :vm_name => 'foobar'
62
+
63
+ # Create a VM with 5GB disk, 256 MB mem, e1000 nic, 1CPU in datastore2
64
+ vm = host.create_vm :vm_name => 'foobar2', :disk_size => 5000, :cpus => 2, :memory => 256, :datastore => 'datastore2'
65
+
66
+
67
+ host.virtual_machines.each do |vm|
68
+
69
+ # PowerOff the VM if powered On
70
+ vm.power_off if (vm.name =~ /foobar/ and vm.power_state == 'poweredOn')
71
+
72
+ # Destroy the VM if name matches foobar
73
+ if vm.name =~ /foobar.*/
74
+ vm.destroy
75
+ end
76
+
77
+ end
78
+
79
+ # Copyright
80
+
81
+ Copyright (c) 2011 Sergio Rubio. See LICENSE.txt for
82
+ further details.
83
+
data/Rakefile ADDED
@@ -0,0 +1,41 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'lib/esx.rb'
4
+
5
+ require 'jeweler'
6
+ Jeweler::Tasks.new do |gem|
7
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
8
+ gem.version = ESX::VERSION
9
+ gem.name = "esx"
10
+ gem.homepage = "http://github.com/rubiojr/esx"
11
+ gem.license = "MIT"
12
+ gem.summary = %Q{Simple RbVmomi wrapper library to manage VMWare ESX hosts}
13
+ gem.description = %Q{Manage VMWare ESX hosts with ease}
14
+ gem.email = "rubiojr@frameos.org"
15
+ gem.authors = ["Sergio Rubio"]
16
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
17
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
18
+ gem.add_runtime_dependency 'alchemist'
19
+ gem.add_runtime_dependency 'rbvmomi'
20
+ gem.add_runtime_dependency 'terminal-table'
21
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
22
+ end
23
+ Jeweler::RubygemsDotOrgTasks.new
24
+
25
+ require 'rake/testtask'
26
+ Rake::TestTask.new(:test) do |test|
27
+ test.libs << 'lib' << 'test'
28
+ test.pattern = 'test/**/test_*.rb'
29
+ test.verbose = true
30
+ end
31
+
32
+ task :default => :build
33
+
34
+ require 'rdoc/task'
35
+ Rake::RDocTask.new do |rdoc|
36
+ version = ESX::VERSION
37
+ rdoc.rdoc_dir = 'rdoc'
38
+ rdoc.title = "esx #{version}"
39
+ rdoc.rdoc_files.include('README*')
40
+ rdoc.rdoc_files.include('lib/**/*.rb')
41
+ end
data/bin/esx ADDED
@@ -0,0 +1,62 @@
1
+ #!/usr/bin/env ruby
2
+ require 'rubygems'
3
+ require 'esx'
4
+ require 'terminal-table/import'
5
+
6
+ host_addr = ARGV[0]
7
+
8
+ if host_addr.nil?
9
+ $stderr.puts 'Usage: esx HOST'
10
+ exit 1
11
+ end
12
+
13
+ print "Username: "
14
+ user = $stdin.gets.strip.chomp
15
+
16
+
17
+ system "stty -echo"
18
+ print "Password: "
19
+ pass = $stdin.gets.strip.chomp
20
+ system "stty echo"
21
+ puts
22
+
23
+ begin
24
+
25
+ host = ESX::Host.connect(host_addr, user, pass)
26
+
27
+ puts
28
+ name = host.name.upcase
29
+ puts "*" * name.size
30
+ puts name
31
+ puts "*" * name.size
32
+ puts "Memory Size: %s" % host.memory_size.bytes.to.megabytes.to_i
33
+ puts "Memory Usage: %s" % host.memory_usage.bytes.to.megabytes.to_i
34
+ puts "Cpu Cores: %s" % host.cpu_cores
35
+ puts "Power State: %s" % host.power_state
36
+ puts "\nVirtual Machines:"
37
+ user_table = table do |t|
38
+ t.headings = "NAME","MEMORY","CPUS","NICS","DISKS"
39
+ host.virtual_machines.each do |vm|
40
+ t << [vm.name,vm.memory_size.bytes.to.megabytes.to_i, vm.cpus, vm.ethernet_cards_number, vm.virtual_disks_number]
41
+ end
42
+ end
43
+ puts user_table
44
+ puts "\nDatastores:"
45
+ user_table = table do |t|
46
+ t.headings = "NAME","CAPACITY","FREESPACE","ACCESIBLE","TYPE","URL"
47
+ host.datastores.each do |ds|
48
+ dsname = ds.name
49
+ if dsname.size > 20
50
+ dsname = dsname[0..19] + '...'
51
+ end
52
+ t << [dsname,ds.capacity, ds.free_space, ds.datastore_type, ds.accessible, ds.url]
53
+ end
54
+ end
55
+ puts user_table
56
+ puts
57
+
58
+ rescue Exception => e
59
+ puts "Error connecting to the ESX host"
60
+ puts "\n#{e.message}"
61
+ puts e.backtrace
62
+ end
@@ -0,0 +1,36 @@
1
+ require 'rubygems'
2
+ require 'lib/esx.rb'
3
+
4
+
5
+ # Connect to the ESX Host
6
+ host = ESX::Host.connect 'my-esx-host', 'root', 'secret'
7
+
8
+ # Print hypervisor info
9
+ puts
10
+ name = host.name.upcase
11
+ puts "*" * name.size
12
+ puts name
13
+ puts "*" * name.size
14
+ puts "Memory Size: %s" % host.memory_size.bytes.to.megabytes.to_i
15
+ puts "Memory Usage: %s" % host.memory_usage.bytes.to.megabytes.to_i
16
+ puts "Cpu Cores: %s" % host.cpu_cores
17
+ puts "Power State: %s" % host.power_state
18
+
19
+ # Create a VM with 4GB disk, 128 MB mem, e1000 nic, 1CPU in datastore1
20
+ vm = host.create_vm :vm_name => 'foobar'
21
+
22
+ # Create a VM with 5GB disk, 256 MB mem, e1000 nic, 1CPU in datastore2
23
+ vm = host.create_vm :vm_name => 'foobar2', :disk_size => 5000, :cpus => 2, :memory => 256, :datastore => 'datastore2'
24
+
25
+
26
+ host.virtual_machines.each do |vm|
27
+
28
+ # PowerOff the VM if powered On
29
+ vm.power_off if (vm.name =~ /foobar/ and vm.power_state == 'poweredOn')
30
+
31
+ # Destroy the VM if name matches foobar
32
+ if vm.name =~ /foobar.*/
33
+ vm.destroy
34
+ end
35
+
36
+ end
data/lib/esx.rb ADDED
@@ -0,0 +1,256 @@
1
+ require 'rubygems'
2
+ require 'rbvmomi'
3
+ require 'alchemist'
4
+
5
+ module ESX
6
+ VERSION = '0.1'
7
+
8
+ class Host
9
+
10
+ # Connect to a ESX host
11
+ #
12
+ # Requires hostname/ip, username and password
13
+ #
14
+ # Host connection is insecure by default
15
+ def self.connect(host, user, password, insecure=true)
16
+ vim = RbVmomi::VIM.connect :host => host, :user => 'root', :password => 'temporal', :insecure => insecure
17
+ host = Host.new
18
+ host.vim = vim
19
+ host
20
+ end
21
+
22
+ def vim=(vim)
23
+ @_vim = vim
24
+ @_datacenter = @_vim.serviceInstance.find_datacenter
25
+ @_host = @_datacenter.hostFolder.children.first.host.first
26
+ end
27
+
28
+ # Returns the name of this host
29
+ #
30
+ def name
31
+ @_host.summary.config.name
32
+ end
33
+
34
+ # Host memory size in bytes
35
+ #
36
+ def memory_size
37
+ @_host.hardware.memorySize
38
+ end
39
+
40
+ # Number of CPU cores available in this host
41
+ #
42
+ def cpu_cores
43
+ @_host.hardware.cpuInfo.numCpuCores
44
+ end
45
+
46
+ # Power state of this host
47
+ #
48
+ def power_state
49
+ @_host.summary.runtime.powerState
50
+ end
51
+
52
+ # Host memory usage in bytes
53
+ #
54
+ def memory_usage
55
+ @_host.summary.quickStats.overallMemoryUsage.megabytes.to.bytes.to_i
56
+ end
57
+
58
+
59
+ # Return a list of ESX::Datastore objects available in this host
60
+ #
61
+ def datastores
62
+ datastores = []
63
+ @_host.datastore.each do |ds|
64
+ datastores << Datastore.wrap(ds)
65
+ end
66
+ datastores
67
+ end
68
+
69
+ # Create a Virtual Machine
70
+ #
71
+ # Requires a Hash with the following keys:
72
+ #
73
+ # {
74
+ # :vm_name => name, (string, required)
75
+ # :cpus => 1, #(int, optional)
76
+ # :guest_id => 'otherGuest', #(string, optional)
77
+ # :disk_size => 4096, #(in MB, optional)
78
+ # :memory => 128, #(in MB, optional)
79
+ # :datastore => datastore1 #(string, optional)
80
+ # }
81
+ #
82
+ # Default values above.
83
+ def create_vm(specification)
84
+ spec = specification
85
+ spec[:cpus] = (specification[:cpus] || 1).to_i
86
+ spec[:guest_id] = specification[:guest_id] || 'otherGuest'
87
+ if specification[:disk_size]
88
+ spec[:disk_size] = (specification[:disk_size].to_i * 1024)
89
+ else
90
+ spec[:disk_size] = 4194304
91
+ end
92
+ spec[:memory] = (specification[:memory] || 128).to_i
93
+ if specification[:datastore]
94
+ spec[:datastore] = "[#{specification[:datastore]}]"
95
+ else
96
+ spec[:datastore] = '[datastore1]'
97
+ end
98
+ vm_cfg = {
99
+ :name => spec[:vm_name],
100
+ :guestId => spec[:guest_id],
101
+ :files => { :vmPathName => '[datastore1]' },
102
+ :numCPUs => spec[:cpus],
103
+ :memoryMB => spec[:memory],
104
+ :deviceChange => [
105
+ {
106
+ :operation => :add,
107
+ :device => RbVmomi::VIM.VirtualLsiLogicController(
108
+ :key => 1000,
109
+ :busNumber => 0,
110
+ :sharedBus => :noSharing)
111
+ },
112
+ {
113
+ :operation => :add,
114
+ :fileOperation => :create,
115
+ :device => RbVmomi::VIM.VirtualDisk(
116
+ :key => 0,
117
+ :backing => RbVmomi::VIM.VirtualDiskFlatVer2BackingInfo(
118
+ :fileName => spec[:datastore],
119
+ :diskMode => :persistent,
120
+ :thinProvisioned => true),
121
+ :controllerKey => 1000,
122
+ :unitNumber => 0,
123
+ :capacityInKB => spec[:disk_size])
124
+ },
125
+ {
126
+ :operation => :add,
127
+ :device => RbVmomi::VIM.VirtualE1000(
128
+ :key => 0,
129
+ :deviceInfo => {
130
+ :label => 'Network Adapter 1',
131
+ :summary => 'VM Network'
132
+ },
133
+ :backing => RbVmomi::VIM.VirtualEthernetCardNetworkBackingInfo(
134
+ :deviceName => 'VM Network'
135
+ ),
136
+ :addressType => 'generated')
137
+ }
138
+ ],
139
+ :extraConfig => [
140
+ {
141
+ :key => 'bios.bootOrder',
142
+ :value => 'ethernet0'
143
+ }
144
+ ]
145
+ }
146
+ VM.wrap(@_datacenter.vmFolder.CreateVM_Task(:config => vm_cfg, :pool => @_datacenter.hostFolder.children.first.resourcePool).wait_for_completion)
147
+ end
148
+
149
+ # Return product info as an array of strings containing
150
+ #
151
+ # fullName, apiType, apiVersion, osType, productLineId, vendor, version
152
+ #
153
+ def host_info
154
+ [
155
+ @_host.summary.config.product.fullName,
156
+ @_host.summary.config.product.apiType,
157
+ @_host.summary.config.product.apiVersion,
158
+ @_host.summary.config.product.osType,
159
+ @_host.summary.config.product.productLineId,
160
+ @_host.summary.config.product.vendor,
161
+ @_host.summary.config.product.version
162
+ ]
163
+ end
164
+
165
+ # Return a list of VM available in the inventory
166
+ #
167
+ def virtual_machines
168
+ vms = []
169
+ vm = @_datacenter.vmFolder.childEntity.each do |x|
170
+ vms << VM.wrap(x)
171
+ end
172
+ vms
173
+ end
174
+
175
+ end
176
+
177
+ class VM
178
+
179
+ attr_accessor :memory_size, :cpus, :ethernet_cards_number
180
+ attr_accessor :name, :virtual_disks_number, :vm_object
181
+
182
+ # Wraps a RbVmomi::VirtualMachine object
183
+ #
184
+ # **This method should never be called manually.**
185
+ #
186
+ def self.wrap(vm)
187
+ _vm = VM.new
188
+ _vm.name = vm.name
189
+ _vm.memory_size = vm.summary.config.memorySizeMB.megabytes.to.bytes
190
+ _vm.cpus = vm.summary.config.numCpu
191
+ _vm.ethernet_cards_number = vm.summary.config.numEthernetCards
192
+ _vm.virtual_disks_number = vm.summary.config.numVirtualDisks
193
+ _vm.vm_object = vm
194
+ _vm
195
+ end
196
+
197
+ # Returns the state of the VM as a string
198
+ # 'poweredOff', 'poweredOn'
199
+ #
200
+ def power_state
201
+ vm_object.summary.runtime.powerState
202
+ end
203
+
204
+ # Power On a VM
205
+ def power_on
206
+ vm_object.PowerOnVM_Task.wait_for_completion
207
+ end
208
+
209
+ # Power Off a VM
210
+ def power_off
211
+ vm_object.PowerOffVM_Task.wait_for_completion
212
+ end
213
+
214
+ # Destroy the VirtualMaching removing it from the inventory
215
+ #
216
+ # This operation does not destroy VM disks
217
+ #
218
+ def destroy
219
+ disks = vm_object.config.hardware.device.grep(RbVmomi::VIM::VirtualDisk)
220
+ #disks.select { |x| x.backing.parent == nil }.each do |disk|
221
+ # spec = {
222
+ # :deviceChange => [
223
+ # {
224
+ # :operation => :remove,
225
+ # :device => disk
226
+ # }
227
+ # ]
228
+ # }
229
+ # vm_object.ReconfigVM_Task(:spec => spec).wait_for_completion
230
+ #end
231
+ vm_object.Destroy_Task.wait_for_completion
232
+ end
233
+
234
+ end
235
+
236
+ class Datastore
237
+
238
+ attr_accessor :name, :capacity, :datastore_type, :free_space, :accessible
239
+ attr_accessor :url
240
+
241
+ #
242
+ # Internal method. Do not use
243
+ #
244
+ def self.wrap(ds)
245
+ @_datastore = ds
246
+ _ds = Datastore.new
247
+ _ds.name = ds.summary.name
248
+ _ds.capacity = ds.summary.capacity
249
+ _ds.free_space = ds.summary.freeSpace
250
+ _ds.datastore_type = ds.summary.type
251
+ _ds.accessible = ds.summary.accessible
252
+ _ds.url = ds.summary.url
253
+ _ds
254
+ end
255
+ end
256
+ end
data/test/helper.rb ADDED
@@ -0,0 +1,18 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'test/unit'
11
+ require 'shoulda'
12
+
13
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
14
+ $LOAD_PATH.unshift(File.dirname(__FILE__))
15
+ require 'esx'
16
+
17
+ class Test::Unit::TestCase
18
+ end
data/test/test_esx.rb ADDED
@@ -0,0 +1,7 @@
1
+ require 'helper'
2
+
3
+ class TestEsx < Test::Unit::TestCase
4
+ should "probably rename this file and start testing for real" do
5
+ flunk "hey buddy, you should probably rename this file and start testing for real"
6
+ end
7
+ end
metadata ADDED
@@ -0,0 +1,177 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: esx
3
+ version: !ruby/object:Gem::Version
4
+ hash: 9
5
+ prerelease:
6
+ segments:
7
+ - 0
8
+ - 1
9
+ version: "0.1"
10
+ platform: ruby
11
+ authors:
12
+ - Sergio Rubio
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2011-09-06 00:00:00 Z
18
+ dependencies:
19
+ - !ruby/object:Gem::Dependency
20
+ requirement: &id001 !ruby/object:Gem::Requirement
21
+ none: false
22
+ requirements:
23
+ - - ">="
24
+ - !ruby/object:Gem::Version
25
+ hash: 3
26
+ segments:
27
+ - 0
28
+ version: "0"
29
+ version_requirements: *id001
30
+ name: shoulda
31
+ prerelease: false
32
+ type: :development
33
+ - !ruby/object:Gem::Dependency
34
+ requirement: &id002 !ruby/object:Gem::Requirement
35
+ none: false
36
+ requirements:
37
+ - - ~>
38
+ - !ruby/object:Gem::Version
39
+ hash: 23
40
+ segments:
41
+ - 1
42
+ - 0
43
+ - 0
44
+ version: 1.0.0
45
+ version_requirements: *id002
46
+ name: bundler
47
+ prerelease: false
48
+ type: :development
49
+ - !ruby/object:Gem::Dependency
50
+ requirement: &id003 !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ~>
54
+ - !ruby/object:Gem::Version
55
+ hash: 7
56
+ segments:
57
+ - 1
58
+ - 5
59
+ - 2
60
+ version: 1.5.2
61
+ version_requirements: *id003
62
+ name: jeweler
63
+ prerelease: false
64
+ type: :development
65
+ - !ruby/object:Gem::Dependency
66
+ requirement: &id004 !ruby/object:Gem::Requirement
67
+ none: false
68
+ requirements:
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ hash: 3
72
+ segments:
73
+ - 0
74
+ version: "0"
75
+ version_requirements: *id004
76
+ name: rcov
77
+ prerelease: false
78
+ type: :development
79
+ - !ruby/object:Gem::Dependency
80
+ requirement: &id005 !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ">="
84
+ - !ruby/object:Gem::Version
85
+ hash: 3
86
+ segments:
87
+ - 0
88
+ version: "0"
89
+ version_requirements: *id005
90
+ name: alchemist
91
+ prerelease: false
92
+ type: :runtime
93
+ - !ruby/object:Gem::Dependency
94
+ requirement: &id006 !ruby/object:Gem::Requirement
95
+ none: false
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ hash: 3
100
+ segments:
101
+ - 0
102
+ version: "0"
103
+ version_requirements: *id006
104
+ name: rbvmomi
105
+ prerelease: false
106
+ type: :runtime
107
+ - !ruby/object:Gem::Dependency
108
+ requirement: &id007 !ruby/object:Gem::Requirement
109
+ none: false
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ hash: 3
114
+ segments:
115
+ - 0
116
+ version: "0"
117
+ version_requirements: *id007
118
+ name: terminal-table
119
+ prerelease: false
120
+ type: :runtime
121
+ description: Manage VMWare ESX hosts with ease
122
+ email: rubiojr@frameos.org
123
+ executables:
124
+ - esx
125
+ extensions: []
126
+
127
+ extra_rdoc_files:
128
+ - LICENSE.txt
129
+ - README.md
130
+ files:
131
+ - .document
132
+ - Gemfile
133
+ - LICENSE.txt
134
+ - README.md
135
+ - Rakefile
136
+ - bin/esx
137
+ - examples/basics.rb
138
+ - lib/esx.rb
139
+ - test/helper.rb
140
+ - test/test_esx.rb
141
+ homepage: http://github.com/rubiojr/esx
142
+ licenses:
143
+ - MIT
144
+ post_install_message:
145
+ rdoc_options: []
146
+
147
+ require_paths:
148
+ - lib
149
+ required_ruby_version: !ruby/object:Gem::Requirement
150
+ none: false
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ hash: 3
155
+ segments:
156
+ - 0
157
+ version: "0"
158
+ required_rubygems_version: !ruby/object:Gem::Requirement
159
+ none: false
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ hash: 3
164
+ segments:
165
+ - 0
166
+ version: "0"
167
+ requirements: []
168
+
169
+ rubyforge_project:
170
+ rubygems_version: 1.7.2
171
+ signing_key:
172
+ specification_version: 3
173
+ summary: Simple RbVmomi wrapper library to manage VMWare ESX hosts
174
+ test_files:
175
+ - examples/basics.rb
176
+ - test/helper.rb
177
+ - test/test_esx.rb