vm_shepherd 1.11.0 → 1.11.1

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