vmonkey 0.4.0 → 0.5.0
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.
- checksums.yaml +7 -0
- data/lib/vmonkey.rb +9 -7
- data/lib/vmonkey/version.rb +1 -1
- data/lib/vmonkey/vim/VirtualApp.rb +99 -0
- data/lib/vmonkey/vim/VirtualMachine.rb +2 -0
- data/lib/vmonkey/vim/vim.rb +8 -0
- data/spec/spec_helper.rb +6 -3
- data/spec/vapp_spec.rb +48 -3
- data/spec/vim_spec.rb +14 -0
- data/spec/virtualmachine_spec.rb +6 -5
- data/vmonkey.gemspec +2 -1
- metadata +25 -29
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0b377b2e2e04e33a7e11a78bfdba2a9359e2f7a6
|
4
|
+
data.tar.gz: 69f2335719ab9d9fde2e4a7a2b1d91a86567c06d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: e24027bf933a229dedc82fe9958b0e1b57ca9eb79fff135d358805f5ab372d0946d0215af39c06f554b9c4cbe3366a49b9f4b6ecff85d8003f9fc9a2cc73ef20
|
7
|
+
data.tar.gz: d5812887c249c9cca6cbc72ae0985b7eb9b46776615b64a9c5edd9819a2862957109cd917f68de5287b2eccd0807e84436c563eda58fea1eb0ebcfebea13ef24
|
data/lib/vmonkey.rb
CHANGED
@@ -15,14 +15,16 @@ module VMonkey
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
module VMonkey
|
19
|
+
refine String do
|
20
|
+
def parent
|
21
|
+
p = self.split('/')[0...-1].join('/')
|
22
|
+
p == '' ? '/' : p
|
23
|
+
end
|
23
24
|
|
24
|
-
|
25
|
-
|
25
|
+
def basename
|
26
|
+
p = self.split('/').last
|
27
|
+
end
|
26
28
|
end
|
27
29
|
end
|
28
30
|
|
data/lib/vmonkey/version.rb
CHANGED
@@ -1,4 +1,12 @@
|
|
1
|
+
using VMonkey
|
2
|
+
|
1
3
|
class RbVmomi::VIM::VirtualApp
|
4
|
+
|
5
|
+
def destroy
|
6
|
+
self.PowerOffVApp_Task( force: true ).wait_for_completion unless summary.vAppState.downcase == 'stopped'
|
7
|
+
self.Destroy_Task( force: true ).wait_for_completion
|
8
|
+
end
|
9
|
+
|
2
10
|
def vm_pool
|
3
11
|
self
|
4
12
|
end
|
@@ -10,6 +18,97 @@ class RbVmomi::VIM::VirtualApp
|
|
10
18
|
def find_vm(vm_name)
|
11
19
|
vm.find { |vm| vm.name == vm_name }
|
12
20
|
end
|
21
|
+
|
22
|
+
def annotation
|
23
|
+
vAppConfig.annotation
|
24
|
+
end
|
25
|
+
|
26
|
+
def annotation=(value)
|
27
|
+
UpdateVAppConfig(spec: {annotation: value})
|
28
|
+
end
|
29
|
+
|
30
|
+
def properties
|
31
|
+
vAppConfig.property
|
32
|
+
end
|
33
|
+
|
34
|
+
def property(*args)
|
35
|
+
case args.size
|
36
|
+
when 1
|
37
|
+
read_property(*args)
|
38
|
+
when 2
|
39
|
+
set_property(*args)
|
40
|
+
else
|
41
|
+
raise ArgumentError.new("wrong number of arguments (#{args.size} for 1 or 2)")
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def property!(name)
|
46
|
+
read_property(name) || raise("vApp Property not found. [#{name}]")
|
47
|
+
end
|
48
|
+
|
49
|
+
def clone_to(path, opts = {})
|
50
|
+
dest = monkey.get(path.parent)
|
51
|
+
unless dest.is_a? RbVmomi::VIM::Folder or dest.is_a? RbVmomi::VIM::VirtualApp
|
52
|
+
raise "Cannot clone_to [#{path.parent}] - destination must specify a Folder or VirtualApp"
|
53
|
+
end
|
54
|
+
|
55
|
+
if opts[:datastore].nil?
|
56
|
+
opts[:datastore] = datastore.first #take the first datastore on the vApp to be cloned
|
57
|
+
end
|
58
|
+
|
59
|
+
params = _clone_params(path.basename, dest, opts)
|
60
|
+
|
61
|
+
self.CloneVApp_Task(params).wait_for_completion
|
62
|
+
end
|
63
|
+
|
64
|
+
def find_property(name)
|
65
|
+
vAppConfig.property.find { |p| p.props[:id] == name.to_s }
|
66
|
+
end
|
67
|
+
|
68
|
+
def read_property(name)
|
69
|
+
p = find_property(name)
|
70
|
+
p.nil? ? nil : p[:value]
|
71
|
+
end
|
72
|
+
|
73
|
+
def set_property(name, value)
|
74
|
+
if vAppConfig.property
|
75
|
+
existing_property = find_property(name)
|
76
|
+
end
|
77
|
+
|
78
|
+
if existing_property
|
79
|
+
operation = 'edit'
|
80
|
+
property_key = existing_property.props[:key]
|
81
|
+
else
|
82
|
+
operation = 'add'
|
83
|
+
property_key = name.object_id
|
84
|
+
end
|
85
|
+
|
86
|
+
vm_config_spec = RbVmomi::VIM.VAppConfigSpec(
|
87
|
+
property: [
|
88
|
+
RbVmomi::VIM.VAppPropertySpec(
|
89
|
+
operation: operation,
|
90
|
+
info: {
|
91
|
+
key: property_key,
|
92
|
+
id: name.to_s,
|
93
|
+
type: 'string',
|
94
|
+
userConfigurable: true,
|
95
|
+
value: value
|
96
|
+
})])
|
97
|
+
|
98
|
+
UpdateVAppConfig( spec: vm_config_spec )
|
99
|
+
end
|
100
|
+
|
101
|
+
def _clone_params(vapp_name, dest, opts)
|
102
|
+
{
|
103
|
+
name: vapp_name,
|
104
|
+
target: monkey.cluster.resourcePool,
|
105
|
+
spec: RbVmomi::VIM.VAppCloneSpec(
|
106
|
+
location: opts[:datastore],
|
107
|
+
vmFolder: dest
|
108
|
+
)
|
109
|
+
}
|
110
|
+
end
|
111
|
+
|
13
112
|
end
|
14
113
|
|
15
114
|
|
data/lib/vmonkey/vim/vim.rb
CHANGED
@@ -65,6 +65,14 @@ module RbVmomi
|
|
65
65
|
dc.vmFolder.traverse path
|
66
66
|
end
|
67
67
|
|
68
|
+
def datastore(datastore_name)
|
69
|
+
dc.datastore.find { |ds| ds.info.name.to_s == datastore_name.to_s }
|
70
|
+
end
|
71
|
+
|
72
|
+
def datastore!(datastore_name)
|
73
|
+
datastore(datastore_name) || raise("Datastore not found. [#{datastore_name}]")
|
74
|
+
end
|
75
|
+
|
68
76
|
def customization_spec(spec_name)
|
69
77
|
return nil if spec_name.nil?
|
70
78
|
serviceContent.customizationSpecManager.GetCustomizationSpec(name: spec_name).spec
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative '../lib/vmonkey'
|
2
|
+
require 'rspec/its'
|
2
3
|
|
3
4
|
instructions = "
|
4
5
|
For the integration tests to run, you need:
|
@@ -28,6 +29,7 @@ instructions = "
|
|
28
29
|
:vapp_pool_path: /cluster_name/monkey_vapp
|
29
30
|
:vapp_path: /path/to/a/vapp
|
30
31
|
:customization_spec: name-of-a-cust-spec
|
32
|
+
:datastore: name-of-a-datastore
|
31
33
|
"
|
32
34
|
|
33
35
|
raise instructions unless File.exists? ENV['VMONKEY_YML']
|
@@ -40,9 +42,10 @@ raise instructions unless monkey.vm VM_SPEC_OPTS[:template_path]
|
|
40
42
|
raise instructions unless monkey.vapp VM_SPEC_OPTS[:vapp_path]
|
41
43
|
raise instructions unless monkey.dc.find_pool VM_SPEC_OPTS[:vapp_pool_path]
|
42
44
|
raise instructions unless monkey.customization_spec VM_SPEC_OPTS[:customization_spec]
|
45
|
+
raise instructions unless monkey.datastore VM_SPEC_OPTS[:datastore]
|
43
46
|
|
44
47
|
RSpec.configure do |config|
|
45
|
-
config.
|
46
|
-
config.tty
|
47
|
-
config.formatter
|
48
|
+
config.color = true
|
49
|
+
config.tty = true
|
50
|
+
config.formatter = :documentation
|
48
51
|
end
|
data/spec/vapp_spec.rb
CHANGED
@@ -1,14 +1,59 @@
|
|
1
1
|
require_relative 'spec_helper'
|
2
|
+
using VMonkey
|
2
3
|
|
3
|
-
describe RbVmomi::VIM::
|
4
|
+
describe RbVmomi::VIM::VirtualApp do
|
4
5
|
|
5
6
|
before :all do
|
6
|
-
@monkey
|
7
|
-
@vapp
|
7
|
+
@monkey ||= VMonkey.connect
|
8
|
+
@vapp ||= @monkey.vapp VM_SPEC_OPTS[:vapp_path]
|
9
|
+
@spec_vapp_path = "#{VM_SPEC_OPTS[:working_folder]}/vmonkey_spec_vapp"
|
8
10
|
end
|
9
11
|
|
10
12
|
describe '#vm_pool' do
|
11
13
|
subject { @vapp.vm_pool }
|
12
14
|
it { should_not be_nil }
|
13
15
|
end
|
16
|
+
|
17
|
+
describe '#_clone_params' do
|
18
|
+
context 'with Folder destination' do
|
19
|
+
subject { @params ||= @vapp._clone_params(@spec_vapp_path.basename, @monkey.get(@spec_vapp_path.parent), {}) }
|
20
|
+
|
21
|
+
it { expect(subject[:name]).to eq @spec_vapp_path.basename }
|
22
|
+
it { expect(subject[:spec].location).to be_nil }
|
23
|
+
it { expect(subject[:spec].vmFolder.name).to eql @spec_vapp_path.parent.basename }
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
context 'with a cloned vapp' do
|
28
|
+
before(:all) { @spec_vapp = @vapp.clone_to @spec_vapp_path }
|
29
|
+
after(:all) { @spec_vapp.destroy }
|
30
|
+
|
31
|
+
describe '#clone' do
|
32
|
+
context 'to a Folder' do
|
33
|
+
subject { @monkey.vapp @spec_vapp_path }
|
34
|
+
it { should_not be_nil }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe '#annotation=' do
|
39
|
+
it 'sets the annotation' do
|
40
|
+
@spec_vapp.annotation = 'xyzzy'
|
41
|
+
expect(@spec_vapp.annotation).to eq 'xyzzy'
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#property' do
|
46
|
+
before(:all) do
|
47
|
+
@spec_vapp.property :prop, 'xyzzy'
|
48
|
+
@spec_vapp.property :prop2, 'abc123'
|
49
|
+
@spec_vapp.property :prop2, 'abc456'
|
50
|
+
end
|
51
|
+
|
52
|
+
it { expect(@spec_vapp.property :prop).to eq 'xyzzy' }
|
53
|
+
it { expect(@spec_vapp.property :prop2).to eq 'abc456' }
|
54
|
+
it { expect(@spec_vapp.property :xyzzy).to be_nil }
|
55
|
+
end
|
56
|
+
|
57
|
+
end
|
58
|
+
|
14
59
|
end
|
data/spec/vim_spec.rb
CHANGED
@@ -108,7 +108,21 @@ describe RbVmomi::VIM do
|
|
108
108
|
|
109
109
|
it { should be_nil }
|
110
110
|
end
|
111
|
+
end
|
111
112
|
|
113
|
+
describe '#datastore' do
|
114
|
+
context 'given an existing datastore' do
|
115
|
+
subject { @ds ||= @monkey.datastore VM_SPEC_OPTS[:datastore] }
|
116
|
+
it { should_not be_nil }
|
117
|
+
its(:name) { should == VM_SPEC_OPTS[:datastore] }
|
118
|
+
end
|
112
119
|
end
|
113
120
|
|
121
|
+
describe '#datastore!' do
|
122
|
+
it 'should raise a RuntimeError given a non-existent datastore' do
|
123
|
+
expect { @monkey.datastore! '/xyzzy' }.to raise_error RuntimeError
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
|
114
128
|
end
|
data/spec/virtualmachine_spec.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require_relative 'spec_helper'
|
2
|
+
using VMonkey
|
2
3
|
|
3
4
|
describe RbVmomi::VIM::VirtualMachine do
|
4
5
|
before :all do
|
@@ -167,7 +168,7 @@ describe RbVmomi::VIM::VirtualMachine do
|
|
167
168
|
|
168
169
|
describe '#port_ready?' do
|
169
170
|
it 'should be false when the VM is powered off' do
|
170
|
-
expect( @spec_vm.port_ready? 22 ).to
|
171
|
+
expect( @spec_vm.port_ready? 22 ).to be_falsey
|
171
172
|
end
|
172
173
|
end
|
173
174
|
|
@@ -177,13 +178,13 @@ describe RbVmomi::VIM::VirtualMachine do
|
|
177
178
|
context 'immediately following start' do
|
178
179
|
describe '#ready?' do
|
179
180
|
it 'should be false' do
|
180
|
-
expect(@spec_vm.ready?).to
|
181
|
+
expect(@spec_vm.ready?).to be_falsey
|
181
182
|
end
|
182
183
|
end
|
183
184
|
|
184
185
|
describe '#port_ready?' do
|
185
186
|
it 'should be false' do
|
186
|
-
expect(@spec_vm.port_ready? 22).to
|
187
|
+
expect(@spec_vm.port_ready? 22).to be_falsey
|
187
188
|
end
|
188
189
|
end
|
189
190
|
end
|
@@ -193,13 +194,13 @@ describe RbVmomi::VIM::VirtualMachine do
|
|
193
194
|
|
194
195
|
describe '#ready?' do
|
195
196
|
it 'should be true' do
|
196
|
-
expect(@spec_vm.ready?).to
|
197
|
+
expect(@spec_vm.ready?).to be_truthy
|
197
198
|
end
|
198
199
|
end
|
199
200
|
|
200
201
|
describe '#port_ready?' do
|
201
202
|
it 'should be true' do
|
202
|
-
expect(@spec_vm.port_ready? 22).to
|
203
|
+
expect(@spec_vm.port_ready? 22).to be_truthy
|
203
204
|
end
|
204
205
|
end
|
205
206
|
end
|
data/vmonkey.gemspec
CHANGED
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
|
|
10
10
|
spec.email = ['brian@duprasville.com', 'dsmith@rallydev.com']
|
11
11
|
spec.summary = %q{ simple to use vsphere methods }
|
12
12
|
spec.description = %q{ simple to use vsphere methods }
|
13
|
-
spec.homepage = 'https://github.com/
|
13
|
+
spec.homepage = 'https://github.com/vmtricks/vmonkey'
|
14
14
|
spec.license = 'MIT'
|
15
15
|
|
16
16
|
spec.files = `git ls-files -z`.split("\x0")
|
@@ -24,4 +24,5 @@ Gem::Specification.new do |spec|
|
|
24
24
|
spec.add_development_dependency 'bundler', '~> 1.6'
|
25
25
|
spec.add_development_dependency 'rake'
|
26
26
|
spec.add_development_dependency 'rspec', '~> 2.14'
|
27
|
+
spec.add_development_dependency 'rspec-its'
|
27
28
|
end
|
metadata
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vmonkey
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
5
|
-
prerelease:
|
4
|
+
version: 0.5.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Brian Dupras
|
@@ -10,12 +9,11 @@ authors:
|
|
10
9
|
autorequire:
|
11
10
|
bindir: bin
|
12
11
|
cert_chain: []
|
13
|
-
date: 2014-07
|
12
|
+
date: 2014-08-07 00:00:00.000000000 Z
|
14
13
|
dependencies:
|
15
14
|
- !ruby/object:Gem::Dependency
|
16
15
|
name: nokogiri
|
17
16
|
requirement: !ruby/object:Gem::Requirement
|
18
|
-
none: false
|
19
17
|
requirements:
|
20
18
|
- - '='
|
21
19
|
- !ruby/object:Gem::Version
|
@@ -23,7 +21,6 @@ dependencies:
|
|
23
21
|
type: :runtime
|
24
22
|
prerelease: false
|
25
23
|
version_requirements: !ruby/object:Gem::Requirement
|
26
|
-
none: false
|
27
24
|
requirements:
|
28
25
|
- - '='
|
29
26
|
- !ruby/object:Gem::Version
|
@@ -31,7 +28,6 @@ dependencies:
|
|
31
28
|
- !ruby/object:Gem::Dependency
|
32
29
|
name: rbvmomi
|
33
30
|
requirement: !ruby/object:Gem::Requirement
|
34
|
-
none: false
|
35
31
|
requirements:
|
36
32
|
- - ~>
|
37
33
|
- !ruby/object:Gem::Version
|
@@ -39,7 +35,6 @@ dependencies:
|
|
39
35
|
type: :runtime
|
40
36
|
prerelease: false
|
41
37
|
version_requirements: !ruby/object:Gem::Requirement
|
42
|
-
none: false
|
43
38
|
requirements:
|
44
39
|
- - ~>
|
45
40
|
- !ruby/object:Gem::Version
|
@@ -47,7 +42,6 @@ dependencies:
|
|
47
42
|
- !ruby/object:Gem::Dependency
|
48
43
|
name: bundler
|
49
44
|
requirement: !ruby/object:Gem::Requirement
|
50
|
-
none: false
|
51
45
|
requirements:
|
52
46
|
- - ~>
|
53
47
|
- !ruby/object:Gem::Version
|
@@ -55,7 +49,6 @@ dependencies:
|
|
55
49
|
type: :development
|
56
50
|
prerelease: false
|
57
51
|
version_requirements: !ruby/object:Gem::Requirement
|
58
|
-
none: false
|
59
52
|
requirements:
|
60
53
|
- - ~>
|
61
54
|
- !ruby/object:Gem::Version
|
@@ -63,23 +56,20 @@ dependencies:
|
|
63
56
|
- !ruby/object:Gem::Dependency
|
64
57
|
name: rake
|
65
58
|
requirement: !ruby/object:Gem::Requirement
|
66
|
-
none: false
|
67
59
|
requirements:
|
68
|
-
- -
|
60
|
+
- - '>='
|
69
61
|
- !ruby/object:Gem::Version
|
70
62
|
version: '0'
|
71
63
|
type: :development
|
72
64
|
prerelease: false
|
73
65
|
version_requirements: !ruby/object:Gem::Requirement
|
74
|
-
none: false
|
75
66
|
requirements:
|
76
|
-
- -
|
67
|
+
- - '>='
|
77
68
|
- !ruby/object:Gem::Version
|
78
69
|
version: '0'
|
79
70
|
- !ruby/object:Gem::Dependency
|
80
71
|
name: rspec
|
81
72
|
requirement: !ruby/object:Gem::Requirement
|
82
|
-
none: false
|
83
73
|
requirements:
|
84
74
|
- - ~>
|
85
75
|
- !ruby/object:Gem::Version
|
@@ -87,12 +77,25 @@ dependencies:
|
|
87
77
|
type: :development
|
88
78
|
prerelease: false
|
89
79
|
version_requirements: !ruby/object:Gem::Requirement
|
90
|
-
none: false
|
91
80
|
requirements:
|
92
81
|
- - ~>
|
93
82
|
- !ruby/object:Gem::Version
|
94
83
|
version: '2.14'
|
95
|
-
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: rspec-its
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :development
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
description: ' simple to use vsphere methods '
|
96
99
|
email:
|
97
100
|
- brian@duprasville.com
|
98
101
|
- dsmith@rallydev.com
|
@@ -121,36 +124,29 @@ files:
|
|
121
124
|
- spec/virtualmachine_spec.rb
|
122
125
|
- spec/vmonkey_spec.rb
|
123
126
|
- vmonkey.gemspec
|
124
|
-
homepage: https://github.com/
|
127
|
+
homepage: https://github.com/vmtricks/vmonkey
|
125
128
|
licenses:
|
126
129
|
- MIT
|
130
|
+
metadata: {}
|
127
131
|
post_install_message:
|
128
132
|
rdoc_options: []
|
129
133
|
require_paths:
|
130
134
|
- lib
|
131
135
|
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
-
none: false
|
133
136
|
requirements:
|
134
|
-
- -
|
137
|
+
- - '>='
|
135
138
|
- !ruby/object:Gem::Version
|
136
139
|
version: '0'
|
137
|
-
segments:
|
138
|
-
- 0
|
139
|
-
hash: 683573069034948857
|
140
140
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
141
|
-
none: false
|
142
141
|
requirements:
|
143
|
-
- -
|
142
|
+
- - '>='
|
144
143
|
- !ruby/object:Gem::Version
|
145
144
|
version: '0'
|
146
|
-
segments:
|
147
|
-
- 0
|
148
|
-
hash: 683573069034948857
|
149
145
|
requirements: []
|
150
146
|
rubyforge_project:
|
151
|
-
rubygems_version:
|
147
|
+
rubygems_version: 2.0.14
|
152
148
|
signing_key:
|
153
|
-
specification_version:
|
149
|
+
specification_version: 4
|
154
150
|
summary: simple to use vsphere methods
|
155
151
|
test_files:
|
156
152
|
- spec/datacenter_spec.rb
|