vm_shepherd 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
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