vm_shepherd 0.1.1 → 0.1.2
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 +4 -4
- data/lib/vm_shepherd/openstack_manager.rb +6 -0
- data/lib/vm_shepherd/version.rb +1 -1
- data/lib/vm_shepherd/vsphere_manager.rb +54 -60
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6d6273df41a1db4583c88e2b1139acf836f78983
|
4
|
+
data.tar.gz: 94c0f08587030e100ed9d6dd534769b876516165
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d03b514667b963aa9f8e15a377258a49fc8d68bf32a806203e3996549bce3ac3d6642dbd04145d71a9688843e86fb0a5f268a796c1da4be20473a8f35c4396d1
|
7
|
+
data.tar.gz: 8559843b647a40f7c09a5ecd95f1063999592e60eb9628a5e0f9cc0718680da97e268ef871000d17f99f2c5c7b4e47cdcdbf8c021775037e6eaa774579a7b2a7
|
@@ -45,14 +45,20 @@ module VmShepherd
|
|
45
45
|
end
|
46
46
|
|
47
47
|
def destroy(vm_options)
|
48
|
+
say('Destroying Ops Manager instances')
|
48
49
|
ip = service.addresses.find { |address| address.ip == vm_options[:public_ip] }
|
49
50
|
server = service.servers.get(ip.instance_id)
|
50
51
|
if server
|
52
|
+
say("Found running Ops Manager instance #{server.id}")
|
51
53
|
image = image_service.images.get(server.image['id'])
|
54
|
+
say("Found Ops Manager image #{image.id}")
|
52
55
|
|
53
56
|
server.destroy
|
57
|
+
say('Ops Manager instance destroyed')
|
54
58
|
image.destroy
|
59
|
+
say('Ops Manager image destroyed')
|
55
60
|
end
|
61
|
+
say('Done destroying Ops Manager instances')
|
56
62
|
end
|
57
63
|
|
58
64
|
def service
|
data/lib/vm_shepherd/version.rb
CHANGED
@@ -4,6 +4,7 @@ require 'rbvmomi'
|
|
4
4
|
module VmShepherd
|
5
5
|
class VsphereManager
|
6
6
|
TEMPLATE_PREFIX = 'tpl'.freeze
|
7
|
+
VALID_FOLDER_REGEX = /\A([\w-]{1,80}\/)*[\w-]{1,80}\/?\z/
|
7
8
|
|
8
9
|
def initialize(host, username, password, datacenter_name)
|
9
10
|
@host = host
|
@@ -14,45 +15,77 @@ module VmShepherd
|
|
14
15
|
end
|
15
16
|
|
16
17
|
def deploy(ova_path, vm_config, vsphere_config)
|
17
|
-
|
18
|
+
validate_folder_name!(vsphere_config[:folder])
|
18
19
|
|
19
|
-
ova_path = File.expand_path(ova_path.strip)
|
20
20
|
ensure_no_running_vm(vm_config)
|
21
21
|
|
22
|
-
|
23
|
-
ovf_file_path = ovf_file_path_from_dir(tmp_dir)
|
24
|
-
|
25
|
-
template = deploy_ovf_template(ovf_file_path, vsphere_config)
|
26
|
-
vm = create_vm_from_template(template, vsphere_config)
|
22
|
+
ovf_file_path = extract_ovf_from(ova_path)
|
27
23
|
|
28
|
-
|
29
|
-
power_on_vm(vm)
|
24
|
+
boot_vm(ovf_file_path, vm_config, vsphere_config)
|
30
25
|
ensure
|
31
26
|
FileUtils.remove_entry_secure(ovf_file_path, force: true) unless ovf_file_path.nil?
|
32
27
|
end
|
33
28
|
|
34
29
|
def destroy(folder_name)
|
35
|
-
|
30
|
+
validate_folder_name!(folder_name)
|
36
31
|
|
37
32
|
delete_folder_and_vms(folder_name)
|
38
|
-
|
39
|
-
fail("#{folder_name.inspect} already exists") unless datacenter.vmFolder.traverse(folder_name).nil?
|
40
|
-
|
41
|
-
datacenter.vmFolder.traverse(folder_name, RbVmomi::VIM::Folder, true)
|
42
33
|
end
|
43
34
|
|
44
35
|
private
|
45
36
|
|
46
37
|
attr_reader :host, :username, :password, :datacenter_name, :logger
|
47
38
|
|
39
|
+
def validate_folder_name!(folder_name)
|
40
|
+
VALID_FOLDER_REGEX.match(folder_name) || fail("#{folder_name.inspect} is not a valid folder name")
|
41
|
+
end
|
42
|
+
|
43
|
+
def ensure_no_running_vm(vm_config)
|
44
|
+
ip_port = "#{vm_config.fetch(:ip)} #{vm_config.fetch(:external_port, 443)}"
|
45
|
+
logger.info("BEGIN checking for VM at #{ip_port}")
|
46
|
+
fail("VM exists at #{ip_port}") if system("nc -z -w 5 #{ip_port}")
|
47
|
+
logger.info("END checking for VM at #{ip_port}")
|
48
|
+
end
|
49
|
+
|
50
|
+
def extract_ovf_from(ova_path)
|
51
|
+
logger.info("BEGIN extract_ovf_from #{ova_path}")
|
52
|
+
ova_path = File.expand_path(ova_path.strip)
|
53
|
+
|
54
|
+
untar_dir = Dir.mktmpdir
|
55
|
+
|
56
|
+
system("cd #{untar_dir} && tar xfv '#{ova_path}'") || fail("ERROR: Untarring #{ova_path}")
|
57
|
+
|
58
|
+
Dir["#{untar_dir}/*.ovf"].first.tap { logger.info("END extract_ovf_from #{ova_path}") } ||
|
59
|
+
fail('Failed to find ovf')
|
60
|
+
end
|
61
|
+
|
62
|
+
def create_network_mappings(ovf_file_path, vsphere_config)
|
63
|
+
ovf = Nokogiri::XML(File.read(ovf_file_path))
|
64
|
+
ovf.remove_namespaces!
|
65
|
+
networks = ovf.xpath('//NetworkSection/Network').map { |x| x['name'] }
|
66
|
+
Hash[networks.map { |ovf_network| [ovf_network, network(vsphere_config)] }]
|
67
|
+
end
|
68
|
+
|
69
|
+
def boot_vm(ovf_file_path, vm_config, vsphere_config)
|
70
|
+
datacenter.vmFolder.traverse(vsphere_config[:folder], RbVmomi::VIM::Folder, true)
|
71
|
+
template = deploy_ovf_template(ovf_file_path, vsphere_config)
|
72
|
+
vm = create_vm_from_template(template, vsphere_config)
|
73
|
+
|
74
|
+
reconfigure_vm(vm, vm_config)
|
75
|
+
power_on_vm(vm)
|
76
|
+
end
|
77
|
+
|
48
78
|
def delete_folder_and_vms(folder_name)
|
49
|
-
|
79
|
+
folder = datacenter.vmFolder.traverse(folder_name) ||
|
80
|
+
fail("ERROR no folder found with name=#{folder_name.inspect}")
|
50
81
|
|
51
82
|
find_vms(folder).each { |vm| power_off(vm) }
|
52
83
|
|
53
84
|
logger.info("BEGIN folder.destroy_task folder=#{folder_name}")
|
54
85
|
folder.Destroy_Task.wait_for_completion
|
55
86
|
logger.info("END folder.destroy_task folder=#{folder_name}")
|
87
|
+
|
88
|
+
fail("#{folder_name.inspect} already exists") unless datacenter.vmFolder.traverse(folder_name).nil?
|
56
89
|
rescue RbVmomi::Fault => e
|
57
90
|
logger.info("ERROR folder.destroy_task folder=#{folder_name}", e)
|
58
91
|
raise
|
@@ -79,28 +112,6 @@ module VmShepherd
|
|
79
112
|
end
|
80
113
|
end
|
81
114
|
|
82
|
-
def folder_name_is_valid?(folder_name)
|
83
|
-
/\A([\w-]{1,80}\/)*[\w-]{1,80}\/?\z/.match(folder_name)
|
84
|
-
end
|
85
|
-
|
86
|
-
def ensure_no_running_vm(ova_config)
|
87
|
-
logger.info('--- Running: Checking for existing VM')
|
88
|
-
ip = ova_config[:external_ip] || ova_config[:ip]
|
89
|
-
port = ova_config[:external_port] || 443
|
90
|
-
fail("VM exists at #{ip}") if system("nc -z -w 5 #{ip} #{port}")
|
91
|
-
end
|
92
|
-
|
93
|
-
def untar_vbox_ova(ova_path)
|
94
|
-
logger.info("--- Running: Untarring #{ova_path}")
|
95
|
-
Dir.mktmpdir.tap do |dir|
|
96
|
-
system_or_exit("cd #{dir} && tar xfv '#{ova_path}'")
|
97
|
-
end
|
98
|
-
end
|
99
|
-
|
100
|
-
def ovf_file_path_from_dir(dir)
|
101
|
-
Dir["#{dir}/*.ovf"].first || fail('Failed to find ovf')
|
102
|
-
end
|
103
|
-
|
104
115
|
def deploy_ovf_template(ovf_file_path, vsphere_config)
|
105
116
|
template_name = [TEMPLATE_PREFIX, Time.new.strftime('%F-%H-%M'), cluster(vsphere_config).name].join('-')
|
106
117
|
logger.info("BEGIN deploy_ovf ovf_file=#{ovf_file_path} template_name=#{template_name}")
|
@@ -139,13 +150,6 @@ module VmShepherd
|
|
139
150
|
end || fail('ERROR finding host to upload OVF to')
|
140
151
|
end
|
141
152
|
|
142
|
-
def create_network_mappings(ovf_file_path, vsphere_config)
|
143
|
-
ovf = Nokogiri::XML(File.read(ovf_file_path))
|
144
|
-
ovf.remove_namespaces!
|
145
|
-
networks = ovf.xpath('//NetworkSection/Network').map { |x| x['name'] }
|
146
|
-
Hash[networks.map { |ovf_network| [ovf_network, network(vsphere_config)] }]
|
147
|
-
end
|
148
|
-
|
149
153
|
def create_vm_from_template(template, vsphere_config)
|
150
154
|
logger.info("BEGIN clone_vm_task tempalte=#{template.name}")
|
151
155
|
template.CloneVM_Task(
|
@@ -273,27 +277,17 @@ module VmShepherd
|
|
273
277
|
end
|
274
278
|
|
275
279
|
def resource_pool(vsphere_config)
|
276
|
-
|
277
|
-
|
280
|
+
cluster = cluster(vsphere_config)
|
281
|
+
if vsphere_config[:resource_pool]
|
282
|
+
cluster.resourcePool.resourcePool.find { |rp| rp.name == vsphere_config[:resource_pool] }
|
283
|
+
else
|
284
|
+
cluster.resourcePool
|
285
|
+
end || fail("ERROR finding resource_pool #{vsphere_config[:resource_pool].inspect}")
|
278
286
|
end
|
279
287
|
|
280
288
|
def datastore(vsphere_config)
|
281
289
|
datacenter.find_datastore(vsphere_config[:datastore]) ||
|
282
290
|
fail("ERROR finding datastore #{vsphere_config[:datastore].inspect}")
|
283
291
|
end
|
284
|
-
|
285
|
-
def find_resource_pool(cluster, resource_pool_name)
|
286
|
-
if resource_pool_name
|
287
|
-
cluster.resourcePool.resourcePool.find { |rp| rp.name == resource_pool_name }
|
288
|
-
else
|
289
|
-
cluster.resourcePool
|
290
|
-
end
|
291
|
-
end
|
292
|
-
|
293
|
-
def system_or_exit(command)
|
294
|
-
logger.info("BEGIN running #{command.inspect}")
|
295
|
-
system(command) || fail("ERROR running #{command.inspect}")
|
296
|
-
logger.info("END running #{command.inspect}")
|
297
|
-
end
|
298
292
|
end
|
299
293
|
end
|
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: 0.1.
|
4
|
+
version: 0.1.2
|
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: 2015-04-
|
11
|
+
date: 2015-04-08 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: aws-sdk-v1
|