vm_shepherd 3.4.3 → 3.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE.txt +1 -1
- data/lib/vm_shepherd/shepherd.rb +11 -1
- data/lib/vm_shepherd/version.rb +1 -1
- data/lib/vm_shepherd/vsphere_manager.rb +9 -0
- data/spec/fixtures/shepherd/vsphere.yml +1 -0
- data/spec/vm_shepherd/shepherd_spec.rb +93 -1
- data/spec/vm_shepherd/vsphere_manager_spec.rb +21 -0
- data/vm_shepherd.gemspec +2 -2
- metadata +10 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a056d918fa69521babd0636b90a36bbc4e75a9bc
|
4
|
+
data.tar.gz: 23ec4f0d83d118542fc213139604efaaa5b52fd2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce2cf10d6f705dd3633ec9d3c537c97131568ca6d91f5692a3c887d2f42fb44ffbd28ed854814f0d953a842f4424fcad651410c0b0b436a7b8af26dba7ab3a0d
|
7
|
+
data.tar.gz: be9a971752b45af0359c8bd41825ef85f545ba97a1f69b29119a96816e4821de46ee7e43aeca36705127d99551860c932da318aa5b6c89df0a81fb33b9e586f3
|
data/LICENSE.txt
CHANGED
data/lib/vm_shepherd/shepherd.rb
CHANGED
@@ -8,10 +8,11 @@ module VmShepherd
|
|
8
8
|
class InvalidIaas < StandardError;
|
9
9
|
end
|
10
10
|
|
11
|
-
def initialize(settings:)
|
11
|
+
def initialize(settings:,system_env:)
|
12
12
|
@iaas_type = settings.dig('iaas_type')
|
13
13
|
@configs = settings.dig('vm_shepherd', 'vm_configs') || []
|
14
14
|
@env_config = settings.dig('vm_shepherd', 'env_config')
|
15
|
+
@system_env = system_env
|
15
16
|
end
|
16
17
|
|
17
18
|
def deploy(paths:)
|
@@ -190,12 +191,21 @@ module VmShepherd
|
|
190
191
|
cpus: input_config.dig('vm', 'cpus'),
|
191
192
|
ram_mb: input_config.dig('vm', 'ram_mb'),
|
192
193
|
vm_password: (input_config.dig('vm', 'vm_password') || 'tempest'),
|
194
|
+
public_ssh_key: read_assets_home(input_config.dig('vm', 'public_ssh_key')),
|
193
195
|
}.tap do |result|
|
194
196
|
hostname = input_config.dig('vm', 'custom_hostname')
|
195
197
|
result[:custom_hostname] = hostname unless hostname.nil?
|
196
198
|
end
|
197
199
|
end
|
198
200
|
|
201
|
+
def read_assets_home(path_or_value)
|
202
|
+
assets_home = @system_env.to_h.dig('ASSETS_HOME')
|
203
|
+
return path_or_value if path_or_value.nil? || assets_home.nil?
|
204
|
+
|
205
|
+
file_path = File.join(assets_home, path_or_value)
|
206
|
+
File.read(file_path)
|
207
|
+
end
|
208
|
+
|
199
209
|
def vcloud_deploy_options(vm_shepherd_config)
|
200
210
|
VmShepherd::Vcloud::VappConfig.new(
|
201
211
|
name: vm_shepherd_config.dig('vapp', 'ops_manager_name'),
|
data/lib/vm_shepherd/version.rb
CHANGED
@@ -296,6 +296,15 @@ module VmShepherd
|
|
296
296
|
spec.operation = 'edit'
|
297
297
|
spec.info = RbVmomi::VIM::VAppPropertyInfo.new.tap do |p|
|
298
298
|
p.key = 6 # ditto. see above. it makes me sad, too.
|
299
|
+
p.label = 'public_ssh_key'
|
300
|
+
p.value = vm_config[:public_ssh_key]
|
301
|
+
end
|
302
|
+
end
|
303
|
+
|
304
|
+
vapp_property_specs << RbVmomi::VIM::VAppPropertySpec.new.tap do |spec|
|
305
|
+
spec.operation = 'edit'
|
306
|
+
spec.info = RbVmomi::VIM::VAppPropertyInfo.new.tap do |p|
|
307
|
+
p.key = 7 # ditto. see above. it makes me sad, too.
|
299
308
|
p.label = 'custom_hostname'
|
300
309
|
p.value = vm_config[:custom_hostname]
|
301
310
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
#require 'tmpdir'
|
2
|
+
#require 'fileutils'
|
1
3
|
require 'vm_shepherd/backport_refinements'
|
2
4
|
using VmShepherd::BackportRefinements
|
3
5
|
|
@@ -5,7 +7,8 @@ require 'vm_shepherd/shepherd'
|
|
5
7
|
|
6
8
|
module VmShepherd
|
7
9
|
RSpec.describe Shepherd do
|
8
|
-
subject(:manager) { Shepherd.new(settings: settings) }
|
10
|
+
subject(:manager) { Shepherd.new(settings: settings, system_env: system_env) }
|
11
|
+
let(:system_env) { {} }
|
9
12
|
let(:first_config) { settings.dig('vm_shepherd', 'vm_configs').first }
|
10
13
|
let(:last_config) { settings.dig('vm_shepherd', 'vm_configs').last }
|
11
14
|
let(:settings) { YAML.load_file(File.join(SPEC_ROOT, 'fixtures', 'shepherd', settings_fixture_name)) }
|
@@ -151,6 +154,7 @@ module VmShepherd
|
|
151
154
|
cpus: first_config.dig('vm', 'cpus'),
|
152
155
|
ram_mb: first_config.dig('vm', 'ram_mb'),
|
153
156
|
vm_password: first_config.dig('vm', 'vm_password'),
|
157
|
+
public_ssh_key: first_config.dig('vm', 'public_ssh_key'),
|
154
158
|
custom_hostname: first_config.dig('vm', 'custom_hostname')
|
155
159
|
},
|
156
160
|
{
|
@@ -171,6 +175,7 @@ module VmShepherd
|
|
171
175
|
dns: last_config.dig('vm', 'dns'),
|
172
176
|
ntp_servers: last_config.dig('vm', 'ntp_servers'),
|
173
177
|
vm_password: 'tempest',
|
178
|
+
public_ssh_key: nil,
|
174
179
|
cpus: last_config.dig('vm', 'cpus'),
|
175
180
|
ram_mb: last_config.dig('vm', 'ram_mb'),
|
176
181
|
},
|
@@ -189,6 +194,93 @@ module VmShepherd
|
|
189
194
|
it 'fails if improper paths are given' do
|
190
195
|
expect { manager.deploy(paths: ['FIRST_FAKE_PATH']) }.to raise_error(ArgumentError)
|
191
196
|
end
|
197
|
+
|
198
|
+
context 'when the ASSETS_HOME path is available' do
|
199
|
+
let(:first_config) do
|
200
|
+
settings.dig('vm_shepherd', 'vm_configs').first.tap do |vm_config|
|
201
|
+
vm_config.dig('vm').merge!({ 'public_ssh_key' => 'subdir/pub.key' })
|
202
|
+
end
|
203
|
+
end
|
204
|
+
let(:system_env) { { 'ASSETS_HOME' => assets_home } }
|
205
|
+
let(:assets_home) { Dir.mktmpdir }
|
206
|
+
|
207
|
+
before do
|
208
|
+
assets_subdir = File.join(assets_home, 'subdir')
|
209
|
+
Dir.mkdir(assets_subdir)
|
210
|
+
File.open(File.join(assets_subdir, 'pub.key'), 'w') do |f|
|
211
|
+
f.write('public key contents')
|
212
|
+
end
|
213
|
+
end
|
214
|
+
|
215
|
+
after do
|
216
|
+
FileUtils.rm_rf(assets_home)
|
217
|
+
end
|
218
|
+
|
219
|
+
it 'reads the value from the relative path in ASSETS_HOME' do
|
220
|
+
expect(VsphereManager).to receive(:new).with(
|
221
|
+
first_config.dig('vcenter_creds', 'ip'),
|
222
|
+
first_config.dig('vcenter_creds', 'username'),
|
223
|
+
first_config.dig('vcenter_creds', 'password'),
|
224
|
+
first_config.dig('vsphere', 'datacenter'),
|
225
|
+
instance_of(Logger),
|
226
|
+
).and_return(first_ova_manager)
|
227
|
+
|
228
|
+
expect(VsphereManager).to receive(:new).with(
|
229
|
+
last_config.dig('vcenter_creds', 'ip'),
|
230
|
+
last_config.dig('vcenter_creds', 'username'),
|
231
|
+
last_config.dig('vcenter_creds', 'password'),
|
232
|
+
last_config.dig('vsphere', 'datacenter'),
|
233
|
+
instance_of(Logger),
|
234
|
+
).and_return(last_ova_manager)
|
235
|
+
|
236
|
+
expect(first_ova_manager).to receive(:deploy).with(
|
237
|
+
'FIRST_FAKE_PATH',
|
238
|
+
{
|
239
|
+
ip: first_config.dig('vm', 'ip'),
|
240
|
+
gateway: first_config.dig('vm', 'gateway'),
|
241
|
+
netmask: first_config.dig('vm', 'netmask'),
|
242
|
+
dns: first_config.dig('vm', 'dns'),
|
243
|
+
ntp_servers: first_config.dig('vm', 'ntp_servers'),
|
244
|
+
cpus: first_config.dig('vm', 'cpus'),
|
245
|
+
ram_mb: first_config.dig('vm', 'ram_mb'),
|
246
|
+
vm_password: first_config.dig('vm', 'vm_password'),
|
247
|
+
public_ssh_key: 'public key contents',
|
248
|
+
custom_hostname: first_config.dig('vm', 'custom_hostname')
|
249
|
+
},
|
250
|
+
{
|
251
|
+
cluster: first_config.dig('vsphere', 'cluster'),
|
252
|
+
resource_pool: first_config.dig('vsphere', 'resource_pool'),
|
253
|
+
datastore: first_config.dig('vsphere', 'datastore'),
|
254
|
+
network: first_config.dig('vsphere', 'network'),
|
255
|
+
folder: first_config.dig('vsphere', 'folder'),
|
256
|
+
},
|
257
|
+
)
|
258
|
+
|
259
|
+
expect(last_ova_manager).to receive(:deploy).with(
|
260
|
+
'LAST_FAKE_PATH',
|
261
|
+
{
|
262
|
+
ip: last_config.dig('vm', 'ip'),
|
263
|
+
gateway: last_config.dig('vm', 'gateway'),
|
264
|
+
netmask: last_config.dig('vm', 'netmask'),
|
265
|
+
dns: last_config.dig('vm', 'dns'),
|
266
|
+
ntp_servers: last_config.dig('vm', 'ntp_servers'),
|
267
|
+
vm_password: 'tempest',
|
268
|
+
public_ssh_key: nil,
|
269
|
+
cpus: last_config.dig('vm', 'cpus'),
|
270
|
+
ram_mb: last_config.dig('vm', 'ram_mb'),
|
271
|
+
},
|
272
|
+
{
|
273
|
+
cluster: last_config.dig('vsphere', 'cluster'),
|
274
|
+
resource_pool: last_config.dig('vsphere', 'resource_pool'),
|
275
|
+
datastore: last_config.dig('vsphere', 'datastore'),
|
276
|
+
network: last_config.dig('vsphere', 'network'),
|
277
|
+
folder: last_config.dig('vsphere', 'folder'),
|
278
|
+
},
|
279
|
+
)
|
280
|
+
|
281
|
+
manager.deploy(paths: ['FIRST_FAKE_PATH', 'LAST_FAKE_PATH'])
|
282
|
+
end
|
283
|
+
end
|
192
284
|
end
|
193
285
|
|
194
286
|
context 'with AWS settings' do
|
@@ -97,6 +97,27 @@ module VmShepherd
|
|
97
97
|
subject.deploy(ova_path, vm_config, vsphere_config)
|
98
98
|
end
|
99
99
|
end
|
100
|
+
|
101
|
+
context 'when the ssh key is set' do
|
102
|
+
let(:vm_config) { { ip: '10.0.0.1', public_ssh_key: 'ssh-key-contents' } }
|
103
|
+
it 'sets the ssh key' do
|
104
|
+
expect(vsphere_manager).to receive(:create_vm_from_template).and_return(vm1)
|
105
|
+
allow(subject).to receive(:power_on_vm)
|
106
|
+
allow(task).to receive(:wait_for_completion)
|
107
|
+
|
108
|
+
expect(vm1).to receive(:ReconfigVM_Task) do |options|
|
109
|
+
ssh_key_property = options[:spec].vAppConfig.property.find do |prop|
|
110
|
+
prop.instance_variable_get(:@props)[:info].instance_variable_get(:@props)[:label] == 'public_ssh_key'
|
111
|
+
end
|
112
|
+
expect(ssh_key_property).to_not be_nil
|
113
|
+
ssh_key_value = ssh_key_property.instance_variable_get(:@props)[:info].instance_variable_get(:@props)[:value]
|
114
|
+
expect(ssh_key_value).to eq('ssh-key-contents')
|
115
|
+
task
|
116
|
+
end
|
117
|
+
|
118
|
+
subject.deploy(ova_path, vm_config, vsphere_config)
|
119
|
+
end
|
120
|
+
end
|
100
121
|
end
|
101
122
|
|
102
123
|
describe 'clean_environment' do
|
data/vm_shepherd.gemspec
CHANGED
@@ -19,11 +19,11 @@ Gem::Specification.new do |spec|
|
|
19
19
|
|
20
20
|
spec.add_dependency 'aws-sdk-v1'
|
21
21
|
spec.add_dependency 'fog', '1.34.0'
|
22
|
-
spec.add_dependency 'net-ssh' # because fog uses this but doesn't require it
|
22
|
+
spec.add_dependency 'net-ssh', '4.2.0' # because fog uses this but doesn't require it
|
23
23
|
|
24
24
|
spec.add_dependency 'ruby_vcloud_sdk', '0.7.4'
|
25
25
|
|
26
|
-
spec.add_dependency 'rbvmomi'
|
26
|
+
spec.add_dependency 'rbvmomi', '1.11.3'
|
27
27
|
|
28
28
|
spec.add_development_dependency 'bundler'
|
29
29
|
spec.add_development_dependency 'rake'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vm_shepherd
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.
|
4
|
+
version: 3.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ops Manager Team
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-08-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-v1
|
@@ -42,16 +42,16 @@ dependencies:
|
|
42
42
|
name: net-ssh
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
47
|
+
version: 4.2.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version:
|
54
|
+
version: 4.2.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: ruby_vcloud_sdk
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -70,16 +70,16 @@ dependencies:
|
|
70
70
|
name: rbvmomi
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- -
|
73
|
+
- - '='
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version:
|
75
|
+
version: 1.11.3
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- -
|
80
|
+
- - '='
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version:
|
82
|
+
version: 1.11.3
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: bundler
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|