vm_shepherd 1.11.0 → 1.11.1

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.
@@ -2,7 +2,7 @@ module VmShepherd
2
2
  module Vcloud
3
3
  class Destroyer
4
4
  def initialize(client:, vdc_name:)
5
- @client = client
5
+ @client = client
6
6
  @vdc_name = vdc_name
7
7
  end
8
8
 
@@ -5,12 +5,12 @@ module VmShepherd
5
5
  attr_reader :name, :gateway, :dns, :ntp, :ip, :netmask, :catalog, :network
6
6
 
7
7
  def initialize(name:, ip:, gateway:, netmask:, dns:, ntp:, catalog:, network:)
8
- @name = name
9
- @ip = ip
8
+ @name = name
9
+ @ip = ip
10
10
  @gateway = gateway
11
11
  @netmask = netmask
12
- @dns = dns
13
- @ntp = ntp
12
+ @dns = dns
13
+ @ntp = ntp
14
14
  @catalog = catalog
15
15
  @network = network
16
16
  end
@@ -18,58 +18,58 @@ module VmShepherd
18
18
  def build_properties
19
19
  [
20
20
  {
21
- 'type' => 'string',
22
- 'key' => 'gateway',
23
- 'value' => gateway,
24
- 'password' => 'false',
21
+ 'type' => 'string',
22
+ 'key' => 'gateway',
23
+ 'value' => gateway,
24
+ 'password' => 'false',
25
25
  'userConfigurable' => 'true',
26
- 'Label' => 'Default Gateway',
27
- 'Description' => 'The default gateway address for the VM network. Leave blank if DHCP is desired.'
26
+ 'Label' => 'Default Gateway',
27
+ 'Description' => 'The default gateway address for the VM network. Leave blank if DHCP is desired.'
28
28
  },
29
29
  {
30
- 'type' => 'string',
31
- 'key' => 'DNS',
32
- 'value' => dns,
33
- 'password' => 'false',
30
+ 'type' => 'string',
31
+ 'key' => 'DNS',
32
+ 'value' => dns,
33
+ 'password' => 'false',
34
34
  'userConfigurable' => 'true',
35
- 'Label' => 'DNS',
36
- 'Description' => 'The domain name servers for the VM (comma separated). Leave blank if DHCP is desired.',
35
+ 'Label' => 'DNS',
36
+ 'Description' => 'The domain name servers for the VM (comma separated). Leave blank if DHCP is desired.',
37
37
  },
38
38
  {
39
- 'type' => 'string',
40
- 'key' => 'ntp_servers',
41
- 'value' => ntp,
42
- 'password' => 'false',
39
+ 'type' => 'string',
40
+ 'key' => 'ntp_servers',
41
+ 'value' => ntp,
42
+ 'password' => 'false',
43
43
  'userConfigurable' => 'true',
44
- 'Label' => 'NTP Servers',
45
- 'Description' => 'Comma-delimited list of NTP servers'
44
+ 'Label' => 'NTP Servers',
45
+ 'Description' => 'Comma-delimited list of NTP servers'
46
46
  },
47
47
  {
48
- 'type' => 'string',
49
- 'key' => 'admin_password',
50
- 'value' => 'tempest',
51
- 'password' => 'true',
48
+ 'type' => 'string',
49
+ 'key' => 'admin_password',
50
+ 'value' => 'tempest',
51
+ 'password' => 'true',
52
52
  'userConfigurable' => 'true',
53
- 'Label' => 'Admin Password',
54
- 'Description' => 'This password is used to SSH into the VM. The username is "tempest".',
53
+ 'Label' => 'Admin Password',
54
+ 'Description' => 'This password is used to SSH into the VM. The username is "tempest".',
55
55
  },
56
56
  {
57
- 'type' => 'string',
58
- 'key' => 'ip0',
59
- 'value' => ip,
60
- 'password' => 'false',
57
+ 'type' => 'string',
58
+ 'key' => 'ip0',
59
+ 'value' => ip,
60
+ 'password' => 'false',
61
61
  'userConfigurable' => 'true',
62
- 'Label' => 'IP Address',
63
- 'Description' => 'The IP address for the VM. Leave blank if DHCP is desired.',
62
+ 'Label' => 'IP Address',
63
+ 'Description' => 'The IP address for the VM. Leave blank if DHCP is desired.',
64
64
  },
65
65
  {
66
- 'type' => 'string',
67
- 'key' => 'netmask0',
68
- 'value' => netmask,
69
- 'password' => 'false',
66
+ 'type' => 'string',
67
+ 'key' => 'netmask0',
68
+ 'value' => netmask,
69
+ 'password' => 'false',
70
70
  'userConfigurable' => 'true',
71
- 'Label' => 'Netmask',
72
- 'Description' => 'The netmask for the VM network. Leave blank if DHCP is desired.'
71
+ 'Label' => 'Netmask',
72
+ 'Description' => 'The netmask for the VM network. Leave blank if DHCP is desired.'
73
73
  }
74
74
  ]
75
75
  end
@@ -6,8 +6,8 @@ module VmShepherd
6
6
  class VcloudManager
7
7
  def initialize(login_info, vdc_name, logger)
8
8
  @login_info = login_info
9
- @vdc_name = vdc_name
10
- @logger = logger
9
+ @vdc_name = vdc_name
10
+ @logger = logger
11
11
  end
12
12
 
13
13
  def deploy(vapp_template_tar_path, vapp_config)
@@ -18,10 +18,10 @@ module VmShepherd
18
18
  untar_vapp_template_tar(File.expand_path(vapp_template_tar_path), tmpdir)
19
19
 
20
20
  VmShepherd::Vcloud::Deployer.deploy_and_power_on_vapp(
21
- client: client,
22
- ovf_dir: tmpdir,
21
+ client: client,
22
+ ovf_dir: tmpdir,
23
23
  vapp_config: vapp_config,
24
- vdc_name: @vdc_name,
24
+ vdc_name: @vdc_name,
25
25
  )
26
26
  rescue => e
27
27
  logger.error(e.http_body) if e.respond_to?(:http_body)
@@ -1,3 +1,3 @@
1
1
  module VmShepherd
2
- VERSION = '1.11.0'.freeze
2
+ VERSION = '1.11.1'.freeze
3
3
  end
@@ -3,16 +3,16 @@ require 'rbvmomi'
3
3
 
4
4
  module VmShepherd
5
5
  class VsphereManager
6
- TEMPLATE_PREFIX = 'tpl'.freeze
7
- VALID_FOLDER_REGEX = /\A([\w-]{1,80}\/)*[\w-]{1,80}\/?\z/
6
+ TEMPLATE_PREFIX = 'tpl'.freeze
7
+ VALID_FOLDER_REGEX = /\A([\w-]{1,80}\/)*[\w-]{1,80}\/?\z/
8
8
  VALID_DISK_FOLDER_REGEX = /\A[\w-]{1,80}\z/
9
9
 
10
10
  def initialize(host, username, password, datacenter_name, logger)
11
- @host = host
12
- @username = username
13
- @password = password
11
+ @host = host
12
+ @username = username
13
+ @password = password
14
14
  @datacenter_name = datacenter_name
15
- @logger = logger
15
+ @logger = logger
16
16
  end
17
17
 
18
18
  def deploy(ova_path, vm_config, vsphere_config)
@@ -43,7 +43,7 @@ module VmShepherd
43
43
 
44
44
  file_manager.DeleteDatastoreFile_Task(
45
45
  datacenter: datacenter,
46
- name: "[#{datastore}] #{folder_name}"
46
+ name: "[#{datastore}] #{folder_name}"
47
47
  ).wait_for_completion
48
48
 
49
49
  logger.info("END datastore_folder.destroy_task folder=#{folder_name}")
@@ -114,7 +114,7 @@ module VmShepherd
114
114
  def boot_vm(ovf_file_path, vm_config, vsphere_config)
115
115
  datacenter.vmFolder.traverse(vsphere_config[:folder], RbVmomi::VIM::Folder, true)
116
116
  template = deploy_ovf_template(ovf_file_path, vsphere_config)
117
- vm = create_vm_from_template(template, vsphere_config)
117
+ vm = create_vm_from_template(template, vsphere_config)
118
118
 
119
119
  reconfigure_vm(vm, vm_config)
120
120
  power_on_vm(vm)
@@ -168,13 +168,13 @@ module VmShepherd
168
168
  template_name = [TEMPLATE_PREFIX, Time.new.strftime('%F-%H-%M'), cluster(vsphere_config).name].join('-')
169
169
  logger.info("BEGIN deploy_ovf ovf_file=#{ovf_file_path} template_name=#{template_name}")
170
170
  connection.serviceContent.ovfManager.deployOVF(
171
- uri: ovf_file_path,
172
- vmName: template_name,
173
- vmFolder: target_folder(vsphere_config),
174
- host: find_deploy_host(vsphere_config),
175
- resourcePool: resource_pool(vsphere_config),
176
- datastore: datastore(vsphere_config),
177
- networkMappings: create_network_mappings(ovf_file_path, vsphere_config),
171
+ uri: ovf_file_path,
172
+ vmName: template_name,
173
+ vmFolder: target_folder(vsphere_config),
174
+ host: find_deploy_host(vsphere_config),
175
+ resourcePool: resource_pool(vsphere_config),
176
+ datastore: datastore(vsphere_config),
177
+ networkMappings: create_network_mappings(ovf_file_path, vsphere_config),
178
178
  propertyMappings: {},
179
179
  ).tap do |ovf_template|
180
180
  ovf_template.add_delta_disk_layer_on_all_disks
@@ -185,7 +185,7 @@ module VmShepherd
185
185
  def find_deploy_host(vsphere_config)
186
186
  property_collector = connection.serviceContent.propertyCollector
187
187
 
188
- hosts = cluster(vsphere_config).host
188
+ hosts = cluster(vsphere_config).host
189
189
  host_properties_by_host =
190
190
  property_collector.collectMultiple(
191
191
  hosts,
@@ -206,16 +206,16 @@ module VmShepherd
206
206
  logger.info("BEGIN clone_vm_task tempalte=#{template.name}")
207
207
  template.CloneVM_Task(
208
208
  folder: target_folder(vsphere_config),
209
- name: "#{template.name}-vm",
210
- spec: {
209
+ name: "#{template.name}-vm",
210
+ spec: {
211
211
  location: {
212
- pool: resource_pool(vsphere_config),
213
- datastore: datastore(vsphere_config),
212
+ pool: resource_pool(vsphere_config),
213
+ datastore: datastore(vsphere_config),
214
214
  diskMoveType: :moveChildMostDiskBacking,
215
215
  },
216
- powerOn: false,
216
+ powerOn: false,
217
217
  template: false,
218
- config: {numCPUs: 2, memoryMB: 2048},
218
+ config: {numCPUs: 2, memoryMB: 2048},
219
219
  }
220
220
  ).wait_for_completion.tap {
221
221
  logger.info("END clone_vm_task tempalte=#{template.name}")
@@ -237,7 +237,7 @@ module VmShepherd
237
237
  vm_config_spec =
238
238
  RbVmomi::VIM::VmConfigSpec.new.tap do |vcs|
239
239
  vcs.ovfEnvironmentTransport = ['com.vmware.guestInfo']
240
- vcs.property = create_vapp_property_specs(vm_config)
240
+ vcs.property = create_vapp_property_specs(vm_config)
241
241
  end
242
242
  logger.info("END VmConfigSpec creation: #{vm_config_spec.inspect}")
243
243
 
@@ -250,10 +250,10 @@ module VmShepherd
250
250
 
251
251
  def create_vapp_property_specs(vm_config)
252
252
  ip_configuration = {
253
- 'ip0' => vm_config[:ip],
254
- 'netmask0' => vm_config[:netmask],
255
- 'gateway' => vm_config[:gateway],
256
- 'DNS' => vm_config[:dns],
253
+ 'ip0' => vm_config[:ip],
254
+ 'netmask0' => vm_config[:netmask],
255
+ 'gateway' => vm_config[:gateway],
256
+ 'DNS' => vm_config[:dns],
257
257
  'ntp_servers' => vm_config[:ntp_servers],
258
258
  }
259
259
 
@@ -264,8 +264,8 @@ module VmShepherd
264
264
  ip_configuration.each_with_index do |(key, value), i|
265
265
  vapp_property_specs << RbVmomi::VIM::VAppPropertySpec.new.tap do |spec|
266
266
  spec.operation = 'edit'
267
- spec.info = RbVmomi::VIM::VAppPropertyInfo.new.tap do |p|
268
- p.key = i
267
+ spec.info = RbVmomi::VIM::VAppPropertyInfo.new.tap do |p|
268
+ p.key = i
269
269
  p.label = key
270
270
  p.value = value
271
271
  end
@@ -274,8 +274,8 @@ module VmShepherd
274
274
 
275
275
  vapp_property_specs << RbVmomi::VIM::VAppPropertySpec.new.tap do |spec|
276
276
  spec.operation = 'edit'
277
- spec.info = RbVmomi::VIM::VAppPropertyInfo.new.tap do |p|
278
- p.key = ip_configuration.length
277
+ spec.info = RbVmomi::VIM::VAppPropertyInfo.new.tap do |p|
278
+ p.key = ip_configuration.length
279
279
  p.label = 'admin_password'
280
280
  p.value = vm_config[:vm_password]
281
281
  end
@@ -300,10 +300,10 @@ module VmShepherd
300
300
 
301
301
  def connection
302
302
  RbVmomi::VIM.connect(
303
- host: host,
304
- user: username,
303
+ host: host,
304
+ user: username,
305
305
  password: password,
306
- ssl: true,
306
+ ssl: true,
307
307
  insecure: true,
308
308
  )
309
309
  end
@@ -16,20 +16,20 @@ module VmShepherd
16
16
 
17
17
  let(:env_config) do
18
18
  {
19
- stack_name: 'aws-stack-name',
19
+ stack_name: 'aws-stack-name',
20
20
  aws_access_key: 'aws-access-key',
21
21
  aws_secret_key: 'aws-secret-key',
22
- region: 'us-east-1',
23
- json_file: 'cloudformation.json',
24
- parameters: {
22
+ region: 'us-east-1',
23
+ json_file: 'cloudformation.json',
24
+ parameters: {
25
25
  'some_parameter' => 'some-answer',
26
26
  },
27
- outputs: {
28
- ssh_key_name: 'ssh-key-name',
29
- security_group: 'security-group-id',
30
- public_subnet_id: 'public-subnet-id',
31
- private_subnet_id: 'private-subnet-id',
32
- }.merge(extra_outputs),
27
+ outputs: {
28
+ ssh_key_name: 'ssh-key-name',
29
+ security_group: 'security-group-id',
30
+ public_subnet_id: 'public-subnet-id',
31
+ private_subnet_id: 'private-subnet-id',
32
+ }.merge(extra_outputs),
33
33
  }.merge(extra_configs)
34
34
  end
35
35
 
@@ -47,9 +47,9 @@ module VmShepherd
47
47
 
48
48
  before do
49
49
  expect(AWS).to receive(:config).with(
50
- access_key_id: env_config.fetch(:aws_access_key),
50
+ access_key_id: env_config.fetch(:aws_access_key),
51
51
  secret_access_key: env_config.fetch(:aws_secret_key),
52
- region: env_config.fetch(:region),
52
+ region: env_config.fetch(:region),
53
53
  )
54
54
 
55
55
  allow(AWS).to receive(:ec2).and_return(ec2)
@@ -75,7 +75,7 @@ module VmShepherd
75
75
  expect(stack_collection).to receive(:create).with(
76
76
  'aws-stack-name',
77
77
  '{}',
78
- parameters: {
78
+ parameters: {
79
79
  'some_parameter' => 'some-answer',
80
80
  },
81
81
  capabilities: ['CAPABILITY_IAM']
@@ -110,18 +110,18 @@ module VmShepherd
110
110
  {
111
111
  elbs: [
112
112
  {
113
- name: 'elb-1-name',
114
- port_mappings: [[1111, 11]],
113
+ name: 'elb-1-name',
114
+ port_mappings: [[1111, 11]],
115
115
  stack_output_keys: {
116
- vpc_id: 'vpc_id',
116
+ vpc_id: 'vpc_id',
117
117
  subnet_id: 'private_subnet',
118
118
  },
119
119
  },
120
120
  {
121
- name: 'elb-2-name',
122
- port_mappings: [[2222, 22]],
121
+ name: 'elb-2-name',
122
+ port_mappings: [[2222, 22]],
123
123
  stack_output_keys: {
124
- vpc_id: 'vpc_id',
124
+ vpc_id: 'vpc_id',
125
125
  subnet_id: 'private_subnet',
126
126
  },
127
127
  }
@@ -130,10 +130,10 @@ module VmShepherd
130
130
  end
131
131
  let(:stack) do
132
132
  instance_double(AWS::CloudFormation::Stack,
133
- name: 'fake-stack-name',
133
+ name: 'fake-stack-name',
134
134
  creation_time: Time.utc(2015, 5, 29),
135
- status: 'CREATE_COMPLETE',
136
- outputs: stack_outputs
135
+ status: 'CREATE_COMPLETE',
136
+ outputs: stack_outputs
137
137
  )
138
138
  end
139
139
  let(:stack_outputs) do
@@ -172,17 +172,17 @@ module VmShepherd
172
172
 
173
173
  it 'creates and attaches a security group for the ELBs' do
174
174
  elb_1_security_group_args = {
175
- group_name: 'fake-stack-name_elb-1-name',
175
+ group_name: 'fake-stack-name_elb-1-name',
176
176
  description: 'ELB Security Group',
177
- vpc_id: 'fake-vpc-id',
177
+ vpc_id: 'fake-vpc-id',
178
178
  }
179
179
  expect(ec2_client).to receive(:create_security_group).with(elb_1_security_group_args).and_return(create_security_group_response_1)
180
180
  expect(elb_1_security_group).to receive(:authorize_ingress).with(:tcp, 1111, '0.0.0.0/0')
181
181
 
182
182
  elb_2_security_group_args = {
183
- group_name: 'fake-stack-name_elb-2-name',
183
+ group_name: 'fake-stack-name_elb-2-name',
184
184
  description: 'ELB Security Group',
185
- vpc_id: 'fake-vpc-id',
185
+ vpc_id: 'fake-vpc-id',
186
186
  }
187
187
  expect(ec2_client).to receive(:create_security_group).with(elb_2_security_group_args).and_return(create_security_group_response_2)
188
188
  expect(elb_2_security_group).to receive(:authorize_ingress).with(:tcp, 2222, '0.0.0.0/0')
@@ -193,16 +193,16 @@ module VmShepherd
193
193
  it 'attaches an elb with the name of the stack for the ELBs' do
194
194
  elb_1_params = {
195
195
  load_balancer_name: 'elb-1-name',
196
- listeners: [{protocol: 'TCP', load_balancer_port: 1111, instance_protocol: 'TCP', instance_port: 11}],
197
- subnets: ['fake-subnet-id'],
198
- security_groups: ['elb-1-security-group-id']
196
+ listeners: [{protocol: 'TCP', load_balancer_port: 1111, instance_protocol: 'TCP', instance_port: 11}],
197
+ subnets: ['fake-subnet-id'],
198
+ security_groups: ['elb-1-security-group-id']
199
199
  }
200
200
  expect(elb_client).to receive(:create_load_balancer).with(elb_1_params)
201
201
  elb_2_params = {
202
202
  load_balancer_name: 'elb-2-name',
203
- listeners: [{protocol: 'TCP', load_balancer_port: 2222, instance_protocol: 'TCP', instance_port: 22}],
204
- subnets: ['fake-subnet-id'],
205
- security_groups: ['elb-2-security-group-id']
203
+ listeners: [{protocol: 'TCP', load_balancer_port: 2222, instance_protocol: 'TCP', instance_port: 22}],
204
+ subnets: ['fake-subnet-id'],
205
+ security_groups: ['elb-2-security-group-id']
206
206
  }
207
207
  expect(elb_client).to receive(:create_load_balancer).with(elb_2_params)
208
208
 
@@ -220,15 +220,16 @@ module VmShepherd
220
220
  before do
221
221
  allow(ec2).to receive(:instances).and_return(instances)
222
222
  allow(ec2).to receive(:elastic_ips).and_return(elastic_ips)
223
+ allow(elastic_ip).to receive(:exists?).and_return(true)
223
224
  end
224
225
 
225
226
  it 'creates an instance using AWS SDK v1' do
226
227
  expect(ec2).to receive_message_chain(:instances, :create).with(
227
- image_id: ami_id,
228
- key_name: 'ssh-key-name',
228
+ image_id: ami_id,
229
+ key_name: 'ssh-key-name',
229
230
  security_group_ids: ['security-group-id'],
230
- subnet: 'public-subnet-id',
231
- instance_type: 'm3.medium').and_return(instance)
231
+ subnet: 'public-subnet-id',
232
+ instance_type: 'm3.medium').and_return(instance)
232
233
 
233
234
  ami_manager.deploy(ami_file_path: ami_file_path, vm_config: vm_config)
234
235
  end
@@ -271,9 +272,25 @@ module VmShepherd
271
272
  end
272
273
 
273
274
  context 'vm configuration does not contain an elastic IP' do
275
+ before do
276
+ allow(ec2).to receive_message_chain(:elastic_ips, :create).and_return(elastic_ip)
277
+ end
278
+
279
+ it 'waits for the Elastic IP to be created' do
280
+ expect(elastic_ip).to receive(:exists?).exactly(AwsManager::RETRY_LIMIT - 1).times.and_return(false)
281
+ expect(elastic_ip).to receive(:exists?).exactly(1).times.and_return(true)
282
+
283
+ ami_manager.deploy(ami_file_path: ami_file_path, vm_config: vm_config)
284
+ end
285
+
286
+ it 'fails if the Elastic IP is not created in time' do
287
+ expect(elastic_ip).to receive(:exists?).exactly(AwsManager::RETRY_LIMIT).times.and_return(false)
288
+
289
+ expect { ami_manager.deploy(ami_file_path: ami_file_path, vm_config: vm_config) }.to raise_error(AwsManager::RetryLimitExceeded)
290
+ end
291
+
274
292
  it 'creates and attaches an elastic IP' do
275
- expect(ec2).to receive_message_chain(:elastic_ips, :create).with(
276
- vpc: true).and_return(elastic_ip)
293
+ expect(ec2).to receive_message_chain(:elastic_ips, :create).with(vpc: true).and_return(elastic_ip)
277
294
 
278
295
  expect(instance).to receive(:associate_elastic_ip).with(elastic_ip)
279
296
 
@@ -284,7 +301,7 @@ module VmShepherd
284
301
  context 'vm configuration contains an elastic IP' do
285
302
  let(:vm_config) do
286
303
  {
287
- vm_name: 'some-vm-name',
304
+ vm_name: 'some-vm-name',
288
305
  vm_ip_address: 'some-ip-address'
289
306
  }
290
307
  end
@@ -424,18 +441,18 @@ module VmShepherd
424
441
  {
425
442
  elbs: [
426
443
  {
427
- name: 'elb-1-name',
428
- port_mappings: [[1111, 11]],
444
+ name: 'elb-1-name',
445
+ port_mappings: [[1111, 11]],
429
446
  stack_output_keys: {
430
- vpc_id: 'vpc_id',
447
+ vpc_id: 'vpc_id',
431
448
  subnet_id: 'private_subnet',
432
449
  },
433
450
  },
434
451
  {
435
- name: 'elb-2-name',
436
- port_mappings: [[2222, 22]],
452
+ name: 'elb-2-name',
453
+ port_mappings: [[2222, 22]],
437
454
  stack_output_keys: {
438
- vpc_id: 'vpc_id',
455
+ vpc_id: 'vpc_id',
439
456
  subnet_id: 'private_subnet',
440
457
  },
441
458
  }
@@ -446,16 +463,16 @@ module VmShepherd
446
463
  let(:elb) { instance_double(AWS::ELB, load_balancers: [load_balancer_1_to_delete, load_balancer_2_to_delete, other_load_balancer]) }
447
464
  let(:load_balancer_1_to_delete) do
448
465
  instance_double(AWS::ELB::LoadBalancer,
449
- name: 'elb-1-name',
466
+ name: 'elb-1-name',
450
467
  security_groups: [elb_1_security_group],
451
- exists?: false,
468
+ exists?: false,
452
469
  )
453
470
  end
454
471
  let(:load_balancer_2_to_delete) do
455
472
  instance_double(AWS::ELB::LoadBalancer,
456
- name: 'elb-2-name',
473
+ name: 'elb-2-name',
457
474
  security_groups: [elb_2_security_group],
458
- exists?: false,
475
+ exists?: false,
459
476
  )
460
477
  end
461
478
  let(:other_load_balancer) { instance_double(AWS::ELB::LoadBalancer, name: 'other-elb-name') }
@@ -464,25 +481,25 @@ module VmShepherd
464
481
  let(:network_interface_1_elb_1) do
465
482
  instance_double(AWS::EC2::NetworkInterface,
466
483
  security_groups: [elb_1_security_group],
467
- exists?: false,
484
+ exists?: false,
468
485
  )
469
486
  end
470
487
  let(:network_interface_2_elb_1) do
471
488
  instance_double(AWS::EC2::NetworkInterface,
472
489
  security_groups: [elb_1_security_group],
473
- exists?: false,
490
+ exists?: false,
474
491
  )
475
492
  end
476
493
  let(:network_interface_1_elb_2) do
477
494
  instance_double(AWS::EC2::NetworkInterface,
478
495
  security_groups: [elb_2_security_group],
479
- exists?: false,
496
+ exists?: false,
480
497
  )
481
498
  end
482
499
  let(:network_interface_2_elb_2) do
483
500
  instance_double(AWS::EC2::NetworkInterface,
484
501
  security_groups: [elb_2_security_group],
485
- exists?: false,
502
+ exists?: false,
486
503
  )
487
504
  end
488
505
 
@@ -596,7 +613,7 @@ module VmShepherd
596
613
  context 'when there is an s3 bucket configuration' do
597
614
  let(:bucket_1) { instance_double(AWS::S3::Bucket) }
598
615
  let(:bucket_2) { instance_double(AWS::S3::Bucket) }
599
- let(:extra_outputs) { { s3_bucket_names: [bucket_name_1, bucket_name_2] } }
616
+ let(:extra_outputs) { {s3_bucket_names: [bucket_name_1, bucket_name_2]} }
600
617
  let(:bucket_name_1) { 'bucket-name-1' }
601
618
  let(:bucket_name_2) { 'bucket-name-2' }
602
619
 
@@ -646,7 +663,7 @@ module VmShepherd
646
663
 
647
664
  context 'and the bucket name is empty' do
648
665
  let(:bucket_name_3) { '' }
649
- let(:extra_outputs) { { s3_bucket_names: [bucket_name_3, bucket_name_1, bucket_name_2] } }
666
+ let(:extra_outputs) { {s3_bucket_names: [bucket_name_3, bucket_name_1, bucket_name_2]} }
650
667
 
651
668
  before do
652
669
  allow(bucket_1).to receive(:exists?).and_return(true)
@@ -663,7 +680,7 @@ module VmShepherd
663
680
 
664
681
  context 'and the bucket name is null' do
665
682
  let(:bucket_name_3) { nil }
666
- let(:extra_outputs) { { s3_bucket_names: [bucket_name_3, bucket_name_1, bucket_name_2] } }
683
+ let(:extra_outputs) { {s3_bucket_names: [bucket_name_3, bucket_name_1, bucket_name_2]} }
667
684
 
668
685
  before do
669
686
  allow(bucket_1).to receive(:exists?).and_return(true)
@@ -725,7 +742,7 @@ module VmShepherd
725
742
  let(:elastic_ip) { instance_double(AWS::EC2::ElasticIp) }
726
743
  let(:vm_config) do
727
744
  {
728
- vm_name: 'some-vm-name',
745
+ vm_name: 'some-vm-name',
729
746
  vm_ip_address: 'some-ip-address'
730
747
  }
731
748
  end