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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9d98309744c225528a19bef7390b48890aee53ba
4
- data.tar.gz: 67303b911ade251ff41855276d4f320b0cbc0950
3
+ metadata.gz: 6d6273df41a1db4583c88e2b1139acf836f78983
4
+ data.tar.gz: 94c0f08587030e100ed9d6dd534769b876516165
5
5
  SHA512:
6
- metadata.gz: 86e6da715493b630ff838740f3714906576e38055aeca7db687b3c38e164122d74599e7b041279835eae65b397a9736e81bfbb5c30bc644203037255d5f67154
7
- data.tar.gz: 01fd81fa9f2c94829e65c69c0b361757ebf0f99a2c50899647e170f40775f5d5ed8db7b50f50c51520fd354be832af5428b7c3043ee231a7cbb37f78db848326
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
@@ -1,3 +1,3 @@
1
1
  module VmShepherd
2
- VERSION = '0.1.1'.freeze
2
+ VERSION = '0.1.2'.freeze
3
3
  end
@@ -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
- raise ArgumentError unless folder_name_is_valid?(vsphere_config[:folder])
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
- tmp_dir = untar_vbox_ova(ova_path)
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
- reconfigure_vm(vm, vm_config)
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
- fail("#{folder_name.inspect} is not a valid folder name") unless folder_name_is_valid?(folder_name)
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
- return unless (folder = datacenter.vmFolder.traverse(folder_name))
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
- find_resource_pool(cluster(vsphere_config), vsphere_config[:resource_pool]) ||
277
- fail("ERROR finding resource_pool #{vsphere_config[:resource_pool].inspect}")
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.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-04 00:00:00.000000000 Z
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