vsimple 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: bb6e9a72ac2427c4a20d503989bd1aeb0eedf6c9
4
+ data.tar.gz: 754cf76fbfa08a93b7985d7d49019a97ccf4ba75
5
+ SHA512:
6
+ metadata.gz: 4f84bee0f2e0dcaac067efd5ed13a7e76250365eefa9a40bc8d2e7a30c6b7a071946a6ebfc5d9d4278d64e66c470fe8dcaeaeea67dd6dbb3dc218205cd79e8e7
7
+ data.tar.gz: e0c5392bf93754501447615f8ada3fc94f66631553f2c04d9956842d0c3a9cd227071b449b81feb5d7a76b383a8587af12fc9b461d3f57dfc6af2d052e3a8fb3
data/.gitignore ADDED
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in vsimple.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,66 @@
1
+ # Vsimple
2
+
3
+ Simple version of rbvmomi easy to use vpshere.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'vsimple'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ Or install it yourself as:
18
+
19
+ $ gem install vsimple
20
+
21
+ ## Usage
22
+
23
+ ```
24
+ require "vsimple"
25
+
26
+ config = {
27
+ :host => "172.16.1.1",
28
+ :user => "USER",
29
+ :pass => "PASS"
30
+ }
31
+
32
+ Vsimple.connect(config)
33
+
34
+ Vsimple.set_dc("DATACENTER")
35
+ Vsimple.set_cluster("cluster")
36
+
37
+ vm = Vsimple::VM.new("template/debian-7.3-amd64")
38
+ begin
39
+ vm.clone("vms/new_vm.vsimple.fr", {
40
+ :powerOn => true,
41
+ :network => {
42
+ "Network adapter 1" => {
43
+ :port_group => "ext",
44
+ :ip => "192.168.42.42/24",
45
+ :gw => "192.168.42.254",
46
+ }
47
+ }
48
+ })
49
+ rescue Vsimple::Error => e
50
+ puts e.msg
51
+ end
52
+ ```
53
+
54
+ ## Development
55
+
56
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/console` for an interactive prompt that will allow you to experiment.
57
+
58
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
59
+
60
+ ## Contributing
61
+
62
+ 1. Fork it ( https://github.com/etna-alternance/vsimple )
63
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
64
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
65
+ 4. Push to the branch (`git push origin my-new-feature`)
66
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "vsimple"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start
data/bin/setup ADDED
@@ -0,0 +1,7 @@
1
+ #!/bin/bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+
5
+ bundle install
6
+
7
+ # Do any other automated setup that you need to do here
data/lib/vsimple.rb ADDED
@@ -0,0 +1,33 @@
1
+ require "rbvmomi"
2
+ require "vsimple/version"
3
+ require "vsimple/error"
4
+ require "vsimple/config"
5
+
6
+ require "vsimple/vm"
7
+
8
+ class Vsimple
9
+
10
+ def self.connect(opts)
11
+ Vsimple::Config[:auth] = {
12
+ :path => "/sdk",
13
+ :port => 443,
14
+ :use_ssl => true,
15
+ :insecure => "USE_INSECURE_SSL"
16
+ }
17
+ Vsimple::Config[:auth].merge! opts
18
+ Vsimple::Config[:vim] = RbVmomi::VIM.connect Vsimple::Config[:auth]
19
+ end
20
+
21
+ def self.set_dc(dcname)
22
+ Vsimple::Config[:dc_name] = dcname
23
+ Vsimple::Config[:dc] = Vsimple::Config[:vim].serviceInstance.find_datacenter(Vsimple::Config[:dc_name])
24
+ raise Vsimple::Error.new "Datacenter #{dcname} not found" unless Vsimple::Config[:dc]
25
+ end
26
+
27
+ def self.set_cluster(c_name)
28
+ Vsimple::Config[:cluster_name] = c_name
29
+ Vsimple::Config[:cluster] = Vsimple::Config[:dc].hostFolder.childEntity.grep(RbVmomi::VIM::ClusterComputeResource).find { |x| x.name == Vsimple::Config[:cluster_name] }
30
+ raise Vsimple::Error.new "Cluster #{Config[:c_name]} not found" unless Vsimple::Config[:cluster]
31
+ end
32
+
33
+ end
@@ -0,0 +1,13 @@
1
+ require 'mixlib/config'
2
+
3
+ class Vsimple
4
+ class Config
5
+
6
+ extend Mixlib::Config
7
+
8
+ def self.inspect
9
+ configuration.inspect
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,11 @@
1
+ class Vsimple
2
+ class Error < RuntimeError
3
+
4
+ attr :msg
5
+
6
+ def initialize(msg)
7
+ @msg = msg
8
+ end
9
+
10
+ end
11
+ end
@@ -0,0 +1,3 @@
1
+ class Vsimple
2
+ VERSION = "0.1.1"
3
+ end
data/lib/vsimple/vm.rb ADDED
@@ -0,0 +1,375 @@
1
+ require 'netaddr'
2
+
3
+ class Vsimple
4
+ class VM
5
+
6
+ def initialize(path)
7
+ @vm = Vsimple::Config[:dc].vmFolder.traverse(path, RbVmomi::VIM::VirtualMachine)
8
+ raise Vsimple::Error.new "VM #{path} not found" unless @vm
9
+ end
10
+
11
+ def name
12
+ @vm.name
13
+ end
14
+
15
+ def self.exist?(path)
16
+ if Vsimple::Config[:dc].vmFolder.traverse(path, RbVmomi::VIM::VirtualMachine)
17
+ true
18
+ else
19
+ false
20
+ end
21
+ end
22
+
23
+ def powerOn
24
+ begin
25
+ @vm.PowerOnVM_Task.wait_for_completion
26
+ rescue => e
27
+ raise Vsimple::Error.new "Power on vm #{@vm.name}: #{e.message}"
28
+ end
29
+ end
30
+
31
+ def poweredOff
32
+ begin
33
+ @vm.PowerOffVM_Task.wait_for_completion
34
+ rescue => e
35
+ raise Vsimple::Error.new "Power off vm #{@vm.name}: #{e.message}"
36
+ end
37
+ end
38
+
39
+ def shutdownGuest
40
+ begin
41
+ @vm.ShutdownGuest
42
+ rescue => e
43
+ raise Vsimple::Error.new "Shutdown vm #{@vm.name}: #{e.message}"
44
+ end
45
+ end
46
+
47
+ def powerState
48
+ @vm.summary.runtime.powerState
49
+ end
50
+
51
+ def rebootGuest
52
+ begin
53
+ @vm.RebootGuest
54
+ rescue => e
55
+ raise Vsimple::Error.new "RebootGuest vm #{@vm.name}: #{e.message}"
56
+ end
57
+ end
58
+
59
+ def guestToolsReady?
60
+ @vm.guest.toolsRunningStatus == "guestToolsRunning"
61
+ end
62
+
63
+ # Clone the VirtualMachine.
64
+ #
65
+ # == Parameters:
66
+ # name::
67
+ # Name of the machine. Can be the FQDN.
68
+ #
69
+ # vm_config::
70
+ # machine_options:
71
+ # * :path => Path of the VM
72
+ # * :hostname => Hostname of the VM
73
+ # * :domain => Domain name of the VM
74
+ # * :powerOn => Flags to start the VM after the clone (true or false)
75
+ # * :ip_dns => IP separed by commate of the DNS server
76
+ # * :network => Network configuration. exemple:
77
+ # vm_config[:network] = {
78
+ # "Network adapter 1" => {
79
+ # :port_group => "port_group_name",
80
+ # :ip => "172.16.1.1/24",
81
+ # :gw => "172.16.1.254"
82
+ # }
83
+ # }
84
+ # Windows only:
85
+ # * :commandList
86
+ # * :password
87
+ # * :timeZone
88
+ # * :identification_domainAdmin
89
+ # * :identification_domainAdminPassword
90
+ # * :identification_joinDomain
91
+ # * :identification_joinWorkgroup
92
+ # * :userData_orgName
93
+ # * :userData_productId
94
+ #
95
+ def clone(name, vm_config={})
96
+ unless vm_config[:path]
97
+ if name.include?('/')
98
+ vm_config[:path] = File.dirname(name)
99
+ else
100
+ vm_config[:path] = ""
101
+ end
102
+ end
103
+ name = File.basename(name)
104
+
105
+ vm_config[:hostname] ||= name[/^([^.]*)/, 1]
106
+ vm_config[:domain] ||= name[/^[^.]*.(.*)$/, 1]
107
+
108
+ clone_spec = generate_clone_spec(vm_config)
109
+ dest_folder = Vsimple::Config[:dc].vmFolder.traverse!(vm_config[:path], RbVmomi::VIM::Folder)
110
+
111
+ begin
112
+ @vm.CloneVM_Task(
113
+ :folder => dest_folder,
114
+ :name => name,
115
+ :spec => clone_spec
116
+ ).wait_for_completion
117
+ rescue => e
118
+ raise Vsimple::Error.new "Clone vm #{@vm.name}: #{e.message}"
119
+ end
120
+
121
+ Vsimple::VM.new("#{vm_config[:path]}/#{name}")
122
+ end
123
+
124
+ # Check if the machine is a windows
125
+ #
126
+ # == Parameters:
127
+ # vm::
128
+ # VM instance given by rbvmomi
129
+ def is_windows?
130
+ @vm.summary.config.guestFullName =~ /^Microsoft Windows/
131
+ end
132
+
133
+ # Wait until the guest tools of the machine is start or until timeout if given.
134
+ #
135
+ # == Parameters:
136
+ # server::
137
+ # VM instance given by rbvmomi
138
+ #
139
+ # timeout::
140
+ # Timeout
141
+ def wait_guest_tools_ready(timeout=nil)
142
+ wait = 1
143
+ while @vm.guest.toolsRunningStatus != "guestToolsRunning" && (!timeout || wait < timeout)
144
+ sleep 1
145
+ wait += 1
146
+ end
147
+ @vm.guest.toolsRunningStatus == "guestToolsRunning"
148
+ end
149
+
150
+ # Wait until the machine stop or until timeout if given
151
+ #
152
+ # == Parameters:
153
+ # server::
154
+ # VM instance given by rbvmomi
155
+ #
156
+ # timeout::
157
+ # Timeout
158
+ def wait_to_stop(timeout=nil)
159
+ wait = 1
160
+ while @vm.summary.runtime.powerState != "poweredOff" && (!timeout || wait < timeout)
161
+ sleep 1
162
+ wait += 1
163
+ end
164
+ @vm.summary.runtime.powerState == "poweredOff"
165
+ end
166
+
167
+
168
+ protected
169
+
170
+
171
+ # Generate the adaptater mapping for a network card
172
+ #
173
+ # == Parameters:
174
+ # ip::
175
+ # The ip. If not given, use the dhcp configuration
176
+ # gw::
177
+ # The gateway.
178
+ def generate_adapter_map(ip=nil, gw=nil)
179
+ settings = RbVmomi::VIM.CustomizationIPSettings
180
+
181
+ if ip.nil?
182
+ settings.ip = RbVmomi::VIM::CustomizationDhcpIpGenerator
183
+ else
184
+ cidr_ip = NetAddr::CIDR.create(ip)
185
+ settings.ip = RbVmomi::VIM::CustomizationFixedIp(:ipAddress => cidr_ip.ip)
186
+ settings.subnetMask = cidr_ip.netmask_ext
187
+ unless gw.nil?
188
+ gw_cidr = NetAddr::CIDR.create(gw)
189
+ settings.gateway = [gw_cidr.ip]
190
+ end
191
+ end
192
+
193
+ adapter_map = RbVmomi::VIM.CustomizationAdapterMapping
194
+ adapter_map.adapter = settings
195
+ adapter_map
196
+ end
197
+
198
+ # Find a network with a name.
199
+ #
200
+ # == Parameters:
201
+ # networkName::
202
+ # The network name.
203
+ #
204
+ # == Return Value:
205
+ # Network instance given by rbvmomi. If the network doesn't exists, an exception will rise.
206
+ #
207
+ def find_network(networkName)
208
+ baseEntity = Vsimple::Config[:dc].network
209
+ baseEntity.find { |f| f.name == networkName } or raise Vsimple::Error.new "no such network #{networkName}"
210
+ end
211
+
212
+ # Generate the clone specification.
213
+ #
214
+ # == Parameters:
215
+ # vm_config::
216
+ # The vm configuration for the new VM.
217
+ def generate_clone_spec(vm_config)
218
+ rp = Vsimple::Config[:cluster].resourcePool
219
+ rspec = RbVmomi::VIM.VirtualMachineRelocateSpec(:pool => rp)
220
+ vm_config[:powerOn] ||= false
221
+ clone_spec = RbVmomi::VIM.VirtualMachineCloneSpec({
222
+ :location => rspec,
223
+ :powerOn => vm_config[:powerOn],
224
+ :template => false
225
+ })
226
+
227
+ clone_spec.config = RbVmomi::VIM.VirtualMachineConfigSpec(:deviceChange => Array.new)
228
+ clone_spec.customization = generate_custom_spec(clone_spec, vm_config)
229
+
230
+ clone_spec
231
+ end
232
+
233
+ # Generate the Customization Specification.
234
+ #
235
+ # == Parameters:
236
+ # clone_spec::
237
+ # the clone specification passed by #generate_clone_spec.
238
+ #
239
+ # vm_config::
240
+ # The vm configuration for the new VM.
241
+ #
242
+ def generate_custom_spec(clone_spec, vm_config)
243
+ src_config = @vm.config
244
+
245
+ global_ipset = RbVmomi::VIM.CustomizationGlobalIPSettings
246
+ cust_spec = RbVmomi::VIM.CustomizationSpec(:globalIPSettings => global_ipset)
247
+
248
+ cust_spec.globalIPSettings.dnsServerList = vm_config[:ip_dns].split(',') if vm_config[:ip_dns]
249
+ cust_spec.globalIPSettings.dnsSuffixList = vm_config[:domain].split(',')
250
+
251
+ nicSettingMap = []
252
+ src_cards = []
253
+ src_config.hardware.device.each do |dev|
254
+ if dev.deviceInfo.label =~ /^Network adapter/
255
+ src_cards << dev.deviceInfo.label
256
+ end
257
+ end
258
+
259
+ src_cards.each do |name|
260
+ if vm_config[:network]
261
+ config = vm_config[:network][name]
262
+ else
263
+ config = nil
264
+ end
265
+
266
+ card = src_config.hardware.device.find { |d| d.deviceInfo.label == name }
267
+ unless card
268
+ raise Vsimple::Error.new "Can't find source network card #{name} to customize"
269
+ end
270
+
271
+ if config && config[:port_group]
272
+ network = find_network(config[:port_group])
273
+ begin
274
+ switch_port = RbVmomi::VIM.DistributedVirtualSwitchPortConnection(
275
+ :switchUuid => network.config.distributedVirtualSwitch.uuid,
276
+ :portgroupKey => network.key
277
+ )
278
+ card.backing.port = switch_port
279
+ rescue
280
+ card.backing.deviceName = network.name
281
+ end
282
+ else
283
+ switch_port = RbVmomi::VIM.DistributedVirtualSwitchPortConnection(
284
+ :switchUuid => card.backing.port.switchUuid,
285
+ :portgroupKey => card.backing.port.portgroupKey
286
+ )
287
+ card.backing.port = switch_port
288
+ end
289
+
290
+ clone_spec.config.deviceChange.push RbVmomi::VIM.VirtualDeviceConfigSpec(
291
+ :device => card,
292
+ :operation => "edit"
293
+ )
294
+
295
+ if config && config[:ip]
296
+ nicSettingMap << generate_adapter_map(config[:ip], config[:gw])
297
+ else
298
+ cam = RbVmomi::VIM.CustomizationAdapterMapping
299
+ cam.adapter = RbVmomi::VIM.CustomizationIPSettings
300
+ cam.adapter.ip = RbVmomi::VIM.CustomizationDhcpIpGenerator
301
+ nicSettingMap << cam
302
+ end
303
+
304
+ end
305
+
306
+ cust_spec.nicSettingMap = nicSettingMap
307
+ if is_windows?
308
+ cust_spec.identity = generate_win_ident(vm_config)
309
+ cust_spec.options = generate_win_opts
310
+ else
311
+ cust_spec.identity = generate_linux_ident(vm_config)
312
+ end
313
+
314
+ cust_spec
315
+ end
316
+
317
+ def generate_win_ident(vm_config)
318
+ ident = RbVmomi::VIM.CustomizationSysprep
319
+
320
+ if vm_config[:commandList]
321
+ guiRunOnce = RbVmomi::VIM.CustomizationGuiRunOnce
322
+ guiRunOnce.commandList = vm_config[:commandList]
323
+ ident.guiRunOnce = guiRunOnce
324
+ else
325
+ ident.guiRunOnce = nil
326
+ end
327
+
328
+ guiUnattended = RbVmomi::VIM.CustomizationGuiUnattended
329
+ guiUnattended.autoLogon = false
330
+ guiUnattended.autoLogonCount = 1
331
+ password = RbVmomi::VIM.CustomizationPassword
332
+ password.plainText = true
333
+ password.value = vm_config[:password]
334
+ guiUnattended.password = password
335
+ guiUnattended.timeZone = "#{vm_config[:timeZone]}"
336
+ ident.guiUnattended = guiUnattended
337
+
338
+ identification = RbVmomi::VIM.CustomizationIdentification
339
+ identification.domainAdmin = vm_config[:identification_domainAdmin]
340
+ identification.domainAdminPassword = vm_config[:identification_domainAdminPassword]
341
+ identification.joinDomain = vm_config[:identification_joinDomain]
342
+ identification.joinWorkgroup = vm_config[:identification_joinWorkgroup]
343
+ ident.identification = identification
344
+
345
+ userData = RbVmomi::VIM.CustomizationUserData
346
+
347
+ computerName = RbVmomi::VIM.CustomizationFixedName
348
+ computerName.name = vm_config[:hostname].upcase
349
+
350
+ userData.computerName = computerName
351
+ userData.fullName = "#{vm_config[:hostname]}.#{vm_config[:domain]}"
352
+ userData.orgName = vm_config[:userData_orgName]
353
+ userData.productId = vm_config[:userData_productId]
354
+ ident.userData = userData
355
+ ident
356
+ end
357
+
358
+ def generate_win_opts()
359
+ new_windowsOptions = RbVmomi::VIM.CustomizationWinOptions
360
+ new_windowsOptions.changeSID = true
361
+ new_windowsOptions.deleteAccounts = false
362
+ new_windowsOptions
363
+ end
364
+
365
+ def generate_linux_ident(vm_config)
366
+ ident = RbVmomi::VIM.CustomizationLinuxPrep
367
+
368
+ ident.hostName = RbVmomi::VIM.CustomizationFixedName
369
+ ident.hostName.name = vm_config[:hostname]
370
+ ident.domain = vm_config[:domain]
371
+ ident
372
+ end
373
+
374
+ end
375
+ end
data/vsimple.gemspec ADDED
@@ -0,0 +1,27 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'vsimple/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "vsimple"
8
+ spec.version = Vsimple::VERSION
9
+ spec.authors = ["Steven Pojer"]
10
+ spec.email = ["steven.pojer@etna-alternance.net"]
11
+
12
+ spec.summary = "Simple version of rbvmomi easy to use vpshere."
13
+ spec.description = spec.summary
14
+ spec.homepage = "https://github.com/etna-alternance/vsimple"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = "exe"
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_runtime_dependency "rbvmomi", "~> 1.6"
22
+ spec.add_runtime_dependency "netaddr", "~> 1.5"
23
+ spec.add_runtime_dependency "mixlib-config", "~> 2.0"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.9"
26
+ spec.add_development_dependency "rake", "~> 10.0"
27
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vsimple
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Steven Pojer
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2015-07-21 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rbvmomi
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ~>
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ~>
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: netaddr
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ~>
32
+ - !ruby/object:Gem::Version
33
+ version: '1.5'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ~>
39
+ - !ruby/object:Gem::Version
40
+ version: '1.5'
41
+ - !ruby/object:Gem::Dependency
42
+ name: mixlib-config
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ~>
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ~>
53
+ - !ruby/object:Gem::Version
54
+ version: '2.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ~>
60
+ - !ruby/object:Gem::Version
61
+ version: '1.9'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ~>
67
+ - !ruby/object:Gem::Version
68
+ version: '1.9'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ description: Simple version of rbvmomi easy to use vpshere.
84
+ email:
85
+ - steven.pojer@etna-alternance.net
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - .gitignore
91
+ - .travis.yml
92
+ - Gemfile
93
+ - README.md
94
+ - Rakefile
95
+ - bin/console
96
+ - bin/setup
97
+ - lib/vsimple.rb
98
+ - lib/vsimple/config.rb
99
+ - lib/vsimple/error.rb
100
+ - lib/vsimple/version.rb
101
+ - lib/vsimple/vm.rb
102
+ - vsimple.gemspec
103
+ homepage: https://github.com/etna-alternance/vsimple
104
+ licenses: []
105
+ metadata: {}
106
+ post_install_message:
107
+ rdoc_options: []
108
+ require_paths:
109
+ - lib
110
+ required_ruby_version: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - '>='
113
+ - !ruby/object:Gem::Version
114
+ version: '0'
115
+ required_rubygems_version: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - '>='
118
+ - !ruby/object:Gem::Version
119
+ version: '0'
120
+ requirements: []
121
+ rubyforge_project:
122
+ rubygems_version: 2.4.6
123
+ signing_key:
124
+ specification_version: 4
125
+ summary: Simple version of rbvmomi easy to use vpshere.
126
+ test_files: []