fog-vsphere 2.1.1 → 2.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +8 -0
  3. data/.rubocop_todo.yml +217 -0
  4. data/.travis.yml +1 -0
  5. data/CHANGELOG.md +4 -0
  6. data/Rakefile +10 -1
  7. data/fog-vsphere.gemspec +2 -2
  8. data/lib/fog/bin/vsphere.rb +1 -1
  9. data/lib/fog/vsphere/compute.rb +320 -301
  10. data/lib/fog/vsphere/models/compute/cdrom.rb +10 -10
  11. data/lib/fog/vsphere/models/compute/cdroms.rb +2 -2
  12. data/lib/fog/vsphere/models/compute/cluster.rb +20 -20
  13. data/lib/fog/vsphere/models/compute/clusters.rb +1 -1
  14. data/lib/fog/vsphere/models/compute/customfields.rb +4 -4
  15. data/lib/fog/vsphere/models/compute/customvalues.rb +8 -8
  16. data/lib/fog/vsphere/models/compute/datacenter.rb +16 -16
  17. data/lib/fog/vsphere/models/compute/datastores.rb +1 -1
  18. data/lib/fog/vsphere/models/compute/folder.rb +2 -2
  19. data/lib/fog/vsphere/models/compute/folders.rb +2 -2
  20. data/lib/fog/vsphere/models/compute/hosts.rb +4 -4
  21. data/lib/fog/vsphere/models/compute/interface.rb +12 -12
  22. data/lib/fog/vsphere/models/compute/interfaces.rb +14 -16
  23. data/lib/fog/vsphere/models/compute/interfacetype.rb +2 -2
  24. data/lib/fog/vsphere/models/compute/interfacetypes.rb +6 -8
  25. data/lib/fog/vsphere/models/compute/networks.rb +1 -1
  26. data/lib/fog/vsphere/models/compute/resource_pools.rb +1 -1
  27. data/lib/fog/vsphere/models/compute/rule.rb +8 -9
  28. data/lib/fog/vsphere/models/compute/rules.rb +9 -10
  29. data/lib/fog/vsphere/models/compute/scsicontroller.rb +1 -1
  30. data/lib/fog/vsphere/models/compute/server.rb +68 -80
  31. data/lib/fog/vsphere/models/compute/servers.rb +12 -13
  32. data/lib/fog/vsphere/models/compute/servertype.rb +6 -6
  33. data/lib/fog/vsphere/models/compute/servertypes.rb +2 -2
  34. data/lib/fog/vsphere/models/compute/snapshot.rb +5 -6
  35. data/lib/fog/vsphere/models/compute/snapshots.rb +1 -1
  36. data/lib/fog/vsphere/models/compute/ticket.rb +0 -1
  37. data/lib/fog/vsphere/models/compute/volume.rb +12 -14
  38. data/lib/fog/vsphere/models/compute/volumes.rb +10 -10
  39. data/lib/fog/vsphere/requests/compute/cloudinit_to_customspec.rb +8 -8
  40. data/lib/fog/vsphere/requests/compute/create_folder.rb +5 -5
  41. data/lib/fog/vsphere/requests/compute/create_group.rb +16 -16
  42. data/lib/fog/vsphere/requests/compute/create_rule.rb +13 -13
  43. data/lib/fog/vsphere/requests/compute/create_vm.rb +117 -119
  44. data/lib/fog/vsphere/requests/compute/destroy_group.rb +8 -8
  45. data/lib/fog/vsphere/requests/compute/destroy_rule.rb +8 -8
  46. data/lib/fog/vsphere/requests/compute/folder_destroy.rb +3 -3
  47. data/lib/fog/vsphere/requests/compute/get_cluster.rb +2 -2
  48. data/lib/fog/vsphere/requests/compute/get_compute_resource.rb +16 -16
  49. data/lib/fog/vsphere/requests/compute/get_datacenter.rb +7 -7
  50. data/lib/fog/vsphere/requests/compute/get_datastore.rb +1 -2
  51. data/lib/fog/vsphere/requests/compute/get_folder.rb +24 -24
  52. data/lib/fog/vsphere/requests/compute/get_host.rb +2 -3
  53. data/lib/fog/vsphere/requests/compute/get_interface_type.rb +6 -6
  54. data/lib/fog/vsphere/requests/compute/get_network.rb +7 -10
  55. data/lib/fog/vsphere/requests/compute/get_resource_pool.rb +1 -2
  56. data/lib/fog/vsphere/requests/compute/get_server_type.rb +14 -14
  57. data/lib/fog/vsphere/requests/compute/get_storage_pod.rb +2 -2
  58. data/lib/fog/vsphere/requests/compute/get_template.rb +1 -2
  59. data/lib/fog/vsphere/requests/compute/get_virtual_machine.rb +26 -26
  60. data/lib/fog/vsphere/requests/compute/get_vm_first_scsi_controller.rb +6 -7
  61. data/lib/fog/vsphere/requests/compute/host_finish_maintenance.rb +1 -1
  62. data/lib/fog/vsphere/requests/compute/host_shutdown.rb +1 -1
  63. data/lib/fog/vsphere/requests/compute/host_start_maintenance.rb +1 -1
  64. data/lib/fog/vsphere/requests/compute/list_child_snapshots.rb +37 -39
  65. data/lib/fog/vsphere/requests/compute/list_clusters.rb +8 -9
  66. data/lib/fog/vsphere/requests/compute/list_compute_resources.rb +57 -59
  67. data/lib/fog/vsphere/requests/compute/list_customfields.rb +5 -6
  68. data/lib/fog/vsphere/requests/compute/list_datacenters.rb +17 -17
  69. data/lib/fog/vsphere/requests/compute/list_datastores.rb +16 -15
  70. data/lib/fog/vsphere/requests/compute/list_folders.rb +4 -4
  71. data/lib/fog/vsphere/requests/compute/list_groups.rb +5 -5
  72. data/lib/fog/vsphere/requests/compute/list_hosts.rb +30 -14
  73. data/lib/fog/vsphere/requests/compute/list_interface_types.rb +7 -7
  74. data/lib/fog/vsphere/requests/compute/list_networks.rb +12 -16
  75. data/lib/fog/vsphere/requests/compute/list_processes.rb +14 -14
  76. data/lib/fog/vsphere/requests/compute/list_resource_pools.rb +13 -14
  77. data/lib/fog/vsphere/requests/compute/list_rules.rb +4 -4
  78. data/lib/fog/vsphere/requests/compute/list_server_types.rb +24 -26
  79. data/lib/fog/vsphere/requests/compute/list_storage_pods.rb +8 -8
  80. data/lib/fog/vsphere/requests/compute/list_templates.rb +4 -5
  81. data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +15 -15
  82. data/lib/fog/vsphere/requests/compute/list_vm_cdroms.rb +16 -12
  83. data/lib/fog/vsphere/requests/compute/list_vm_customvalues.rb +3 -4
  84. data/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb +54 -56
  85. data/lib/fog/vsphere/requests/compute/list_vm_scsi_controllers.rb +7 -7
  86. data/lib/fog/vsphere/requests/compute/list_vm_snapshots.rb +36 -36
  87. data/lib/fog/vsphere/requests/compute/list_vm_volumes.rb +43 -36
  88. data/lib/fog/vsphere/requests/compute/modify_vm_cdrom.rb +4 -4
  89. data/lib/fog/vsphere/requests/compute/modify_vm_controller.rb +2 -2
  90. data/lib/fog/vsphere/requests/compute/modify_vm_interface.rb +26 -19
  91. data/lib/fog/vsphere/requests/compute/modify_vm_volume.rb +7 -7
  92. data/lib/fog/vsphere/requests/compute/revert_to_snapshot.rb +2 -2
  93. data/lib/fog/vsphere/requests/compute/set_vm_customvalue.rb +2 -2
  94. data/lib/fog/vsphere/requests/compute/update_vm.rb +111 -0
  95. data/lib/fog/vsphere/requests/compute/upload_iso.rb +10 -10
  96. data/lib/fog/vsphere/requests/compute/vm_acquire_ticket.rb +3 -3
  97. data/lib/fog/vsphere/requests/compute/vm_clone.rb +245 -247
  98. data/lib/fog/vsphere/requests/compute/vm_config_vnc.rb +15 -15
  99. data/lib/fog/vsphere/requests/compute/vm_destroy.rb +2 -2
  100. data/lib/fog/vsphere/requests/compute/vm_execute.rb +16 -16
  101. data/lib/fog/vsphere/requests/compute/vm_migrate.rb +11 -11
  102. data/lib/fog/vsphere/requests/compute/vm_power_off.rb +8 -8
  103. data/lib/fog/vsphere/requests/compute/vm_power_on.rb +2 -2
  104. data/lib/fog/vsphere/requests/compute/vm_reboot.rb +5 -5
  105. data/lib/fog/vsphere/requests/compute/vm_reconfig_cdrom.rb +11 -11
  106. data/lib/fog/vsphere/requests/compute/vm_reconfig_cpus.rb +8 -8
  107. data/lib/fog/vsphere/requests/compute/vm_reconfig_hardware.rb +6 -6
  108. data/lib/fog/vsphere/requests/compute/vm_reconfig_memory.rb +8 -8
  109. data/lib/fog/vsphere/requests/compute/vm_reconfig_volumes.rb +14 -16
  110. data/lib/fog/vsphere/requests/compute/vm_relocate.rb +8 -8
  111. data/lib/fog/vsphere/requests/compute/vm_remove_snapshot.rb +2 -2
  112. data/lib/fog/vsphere/requests/compute/vm_rename.rb +5 -5
  113. data/lib/fog/vsphere/requests/compute/vm_revert_snapshot.rb +1 -1
  114. data/lib/fog/vsphere/requests/compute/vm_take_snapshot.rb +8 -8
  115. data/lib/fog/vsphere/version.rb +1 -1
  116. data/tests/compute_tests.rb +16 -17
  117. data/tests/helpers/mock_helper.rb +3 -3
  118. data/tests/models/compute/cluster_tests.rb +4 -5
  119. data/tests/models/compute/hosts_tests.rb +2 -4
  120. data/tests/models/compute/rules_tests.rb +10 -16
  121. data/tests/models/compute/server_tests.rb +30 -31
  122. data/tests/models/compute/servers_tests.rb +2 -4
  123. data/tests/models/compute/ticket_tests.rb +4 -6
  124. data/tests/models/compute/tickets_tests.rb +1 -3
  125. data/tests/requests/compute/current_time_tests.rb +2 -4
  126. data/tests/requests/compute/folder_destroy_tests.rb +5 -7
  127. data/tests/requests/compute/get_network_tests.rb +20 -23
  128. data/tests/requests/compute/list_child_snapshots_tests.rb +1 -2
  129. data/tests/requests/compute/list_clusters_tests.rb +5 -6
  130. data/tests/requests/compute/list_datastores_tests.rb +6 -7
  131. data/tests/requests/compute/list_hosts_tests.rb +3 -4
  132. data/tests/requests/compute/list_networks_tests.rb +6 -7
  133. data/tests/requests/compute/list_storage_pods_test.rb +3 -4
  134. data/tests/requests/compute/list_virtual_machines_tests.rb +16 -20
  135. data/tests/requests/compute/list_vm_cdroms_tests.rb +1 -2
  136. data/tests/requests/compute/list_vm_snapshots_tests.rb +1 -2
  137. data/tests/requests/compute/modify_vm_cdrom_tests.rb +3 -4
  138. data/tests/requests/compute/revert_to_snapshot_tests.rb +2 -4
  139. data/tests/requests/compute/set_vm_customvalue_tests.rb +0 -2
  140. data/tests/requests/compute/update_vm_tests.rb +13 -0
  141. data/tests/requests/compute/vm_clone_tests.rb +20 -20
  142. data/tests/requests/compute/vm_config_vnc_tests.rb +3 -4
  143. data/tests/requests/compute/vm_destroy_tests.rb +1 -4
  144. data/tests/requests/compute/vm_migrate_tests.rb +1 -2
  145. data/tests/requests/compute/vm_power_off_tests.rb +2 -4
  146. data/tests/requests/compute/vm_power_on_tests.rb +1 -3
  147. data/tests/requests/compute/vm_reboot_tests.rb +2 -4
  148. data/tests/requests/compute/vm_reconfig_cdrom_tests.rb +2 -3
  149. data/tests/requests/compute/vm_reconfig_cpus_tests.rb +1 -3
  150. data/tests/requests/compute/vm_reconfig_hardware_tests.rb +2 -4
  151. data/tests/requests/compute/vm_reconfig_memory_tests.rb +1 -3
  152. data/tests/requests/compute/vm_take_snapshot_tests.rb +1 -3
  153. metadata +9 -4
@@ -3,21 +3,21 @@ module Fog
3
3
  class Vsphere
4
4
  class Real
5
5
  def add_vm_cdrom(cdrom)
6
- vm_reconfig_hardware('instance_uuid' => cdrom.server.instance_uuid, 'hardware_spec' => {'deviceChange'=>[create_cdrom(cdrom, cdrom.unit_number, :add)]})
6
+ vm_reconfig_hardware('instance_uuid' => cdrom.server.instance_uuid, 'hardware_spec' => { 'deviceChange' => [create_cdrom(cdrom, cdrom.unit_number, :add)] })
7
7
  end
8
8
 
9
9
  def destroy_vm_cdrom(cdrom)
10
- vm_reconfig_hardware('instance_uuid' => cdrom.server.instance_uuid, 'hardware_spec' => {'deviceChange'=>[create_cdrom(cdrom, cdrom.unit_number, :remove)]})
10
+ vm_reconfig_hardware('instance_uuid' => cdrom.server.instance_uuid, 'hardware_spec' => { 'deviceChange' => [create_cdrom(cdrom, cdrom.unit_number, :remove)] })
11
11
  end
12
12
  end
13
13
 
14
14
  class Mock
15
15
  def add_vm_cdrom(cdrom)
16
- vm_reconfig_hardware('instance_uuid' => cdrom.server.instance_uuid, 'hardware_spec' => {'deviceChange'=>[create_cdrom(cdrom, cdrom.unit_number, :add)]})
16
+ vm_reconfig_hardware('instance_uuid' => cdrom.server.instance_uuid, 'hardware_spec' => { 'deviceChange' => [create_cdrom(cdrom, cdrom.unit_number, :add)] })
17
17
  end
18
18
 
19
19
  def destroy_vm_cdrom(cdrom)
20
- vm_reconfig_hardware('instance_uuid' => cdrom.server.instance_uuid, 'hardware_spec' => {'deviceChange'=>[create_cdrom(cdrom, cdrom.unit_number, :remove)]})
20
+ vm_reconfig_hardware('instance_uuid' => cdrom.server.instance_uuid, 'hardware_spec' => { 'deviceChange' => [create_cdrom(cdrom, cdrom.unit_number, :remove)] })
21
21
  end
22
22
  end
23
23
  end
@@ -3,13 +3,13 @@ module Fog
3
3
  class Vsphere
4
4
  class Real
5
5
  def add_vm_controller(controller)
6
- vm_reconfig_hardware('instance_uuid' => controller.server_id, 'hardware_spec' => {'deviceChange'=>[create_controller(controller)]})
6
+ vm_reconfig_hardware('instance_uuid' => controller.server_id, 'hardware_spec' => { 'deviceChange' => [create_controller(controller)] })
7
7
  end
8
8
  end
9
9
 
10
10
  class Mock
11
11
  def add_vm_controller(controller)
12
- vm_reconfig_hardware('instance_uuid' => controller.server_id, 'hardware_spec' => {'deviceChange'=>[create_controller(controller)]})
12
+ vm_reconfig_hardware('instance_uuid' => controller.server_id, 'hardware_spec' => { 'deviceChange' => [create_controller(controller)] })
13
13
  end
14
14
  end
15
15
  end
@@ -3,52 +3,59 @@ module Fog
3
3
  class Vsphere
4
4
  class Real
5
5
  def add_vm_interface(vmid, options = {})
6
- raise ArgumentError, "instance id is a required parameter" unless vmid
6
+ raise ArgumentError, 'instance id is a required parameter' unless vmid
7
7
 
8
- interface = get_interface_from_options(vmid, options.merge(:server_id => vmid))
9
- vm_reconfig_hardware('instance_uuid' => vmid, 'hardware_spec' => {'deviceChange'=>[create_interface(interface, 0, :add, options)]})
8
+ interface = get_interface_from_options(vmid, options.merge(server_id: vmid))
9
+ vm_reconfig_hardware('instance_uuid' => vmid, 'hardware_spec' => { 'deviceChange' => [create_interface(interface, 0, :add, options)] })
10
10
  end
11
11
 
12
12
  def destroy_vm_interface(vmid, options = {})
13
- raise ArgumentError, "instance id is a required parameter" unless vmid
13
+ raise ArgumentError, 'instance id is a required parameter' unless vmid
14
14
 
15
- interface = get_interface_from_options(vmid, options.merge(:server_id => vmid))
16
- vm_reconfig_hardware('instance_uuid' => vmid, 'hardware_spec' => {'deviceChange'=>[create_interface(interface, interface.key, :remove)]})
15
+ interface = get_interface_from_options(vmid, options.merge(server_id: vmid))
16
+ vm_reconfig_hardware('instance_uuid' => vmid, 'hardware_spec' => { 'deviceChange' => [create_interface(interface, interface.key, :remove)] })
17
17
  end
18
18
 
19
19
  def update_vm_interface(vmid, options = {})
20
- raise ArgumentError, "instance id is a required parameter" unless vmid
20
+ raise ArgumentError, 'instance id is a required parameter' unless vmid
21
+ raise ArgumentError, "'datacenter' is a required key in options: #{options}" unless options.key?(:datacenter)
22
+
23
+ datacenter_name = options[:datacenter]
21
24
 
22
25
  interface = get_interface_from_options(vmid, options)
23
- raw_interface = get_raw_interface(vmid, key: interface.key)
26
+ raw_interface = get_raw_interface(vmid, key: interface.key, datacenter: datacenter_name)
27
+
24
28
  if options[:network]
25
29
  interface.network = options[:network]
26
- backing = create_nic_backing(interface, {})
30
+ backing = create_nic_backing(interface, datacenter: datacenter_name)
27
31
  raw_interface.backing = backing
28
32
  end
33
+
29
34
  apply_options_to_raw_interface(raw_interface, options)
35
+
30
36
  spec = {
31
37
  operation: :edit,
32
38
  device: raw_interface
33
39
  }
34
- vm_reconfig_hardware('instance_uuid' => vmid, 'hardware_spec' => {'deviceChange'=>[spec]})
40
+
41
+ vm_reconfig_hardware('instance_uuid' => vmid, 'hardware_spec' => { 'deviceChange' => [spec] })
35
42
  end
36
43
 
37
44
  private
38
45
 
39
46
  def get_interface_from_options(vmid, options)
40
- if options and options[:interface]
47
+ if options && options[:interface]
41
48
  options[:interface]
42
49
 
43
- elsif options[:key] and options[:key]>0
50
+ elsif options[:key] && (options[:key] > 0)
44
51
  oldattributes = get_vm_interface(vmid, options)
45
52
  Fog::Compute::Vsphere::Interface.new(oldattributes.merge(options))
46
53
 
47
- elsif options[:type] and options[:network]
54
+ elsif options[:type] && options[:network]
48
55
  Fog::Compute::Vsphere::Interface.new options
49
56
 
50
57
  else
51
- raise ArgumentError, "interface is a required parameter or pass options with type and network"
58
+ raise ArgumentError, 'interface is a required parameter or pass options with type and network'
52
59
  end
53
60
  end
54
61
 
@@ -64,18 +71,18 @@ module Fog
64
71
 
65
72
  class Mock
66
73
  def add_vm_interface(vmid, options = {})
67
- raise ArgumentError, "instance id is a required parameter" unless vmid
68
- raise ArgumentError, "interface is a required parameter" unless options and options[:interface]
74
+ raise ArgumentError, 'instance id is a required parameter' unless vmid
75
+ raise ArgumentError, 'interface is a required parameter' unless options && options[:interface]
69
76
  true
70
77
  end
71
78
 
72
79
  def destroy_vm_interface(vmid, options = {})
73
- raise ArgumentError, "instance id is a required parameter" unless vmid
74
- raise ArgumentError, "interface is a required parameter" unless options and options[:interface]
80
+ raise ArgumentError, 'instance id is a required parameter' unless vmid
81
+ raise ArgumentError, 'interface is a required parameter' unless options && options[:interface]
75
82
  true
76
83
  end
77
84
 
78
- def update_vm_interface(vmid, options = {})
85
+ def update_vm_interface(_vmid, options = {})
79
86
  return unless options[:interface]
80
87
  options[:interface].network = options[:network]
81
88
  options[:interface].type = options[:type]
@@ -3,30 +3,30 @@ module Fog
3
3
  class Vsphere
4
4
  class Real
5
5
  def add_vm_volume(volume)
6
- vm_reconfig_hardware('instance_uuid' => volume.server_id, 'hardware_spec' => {'deviceChange'=>[create_disk(volume, :add)]})
6
+ vm_reconfig_hardware('instance_uuid' => volume.server_id, 'hardware_spec' => { 'deviceChange' => [create_disk(volume, :add)] })
7
7
  end
8
8
 
9
9
  def remove_vm_volume(volume)
10
- vm_reconfig_hardware('instance_uuid' => volume.server_id, 'hardware_spec' => {'deviceChange'=>[create_disk(volume, :remove)]})
10
+ vm_reconfig_hardware('instance_uuid' => volume.server_id, 'hardware_spec' => { 'deviceChange' => [create_disk(volume, :remove)] })
11
11
  end
12
12
 
13
13
  def destroy_vm_volume(volume)
14
14
  vm_reconfig_hardware('instance_uuid' => volume.server_id, 'hardware_spec' => {
15
- 'deviceChange'=>[create_disk(volume, :remove, file_operation: :destroy)]
16
- })
15
+ 'deviceChange' => [create_disk(volume, :remove, file_operation: :destroy)]
16
+ })
17
17
  end
18
18
  end
19
19
 
20
20
  class Mock
21
21
  def add_vm_volume(volume)
22
- vm_reconfig_hardware('instance_uuid' => volume.server_id, 'hardware_spec' => {'deviceChange'=>[create_cdrom(volume, :add)]})
22
+ vm_reconfig_hardware('instance_uuid' => volume.server_id, 'hardware_spec' => { 'deviceChange' => [create_cdrom(volume, :add)] })
23
23
  end
24
24
 
25
- def remove_vm_volume(volume)
25
+ def remove_vm_volume(_volume)
26
26
  true
27
27
  end
28
28
 
29
- def destroy_vm_volume(volume)
29
+ def destroy_vm_volume(_volume)
30
30
  true
31
31
  end
32
32
  end
@@ -4,7 +4,7 @@ module Fog
4
4
  class Real
5
5
  def revert_to_snapshot(snapshot)
6
6
  unless Snapshot === snapshot
7
- fail ArgumentError, 'snapshot is a required parameter'
7
+ raise ArgumentError, 'snapshot is a required parameter'
8
8
  end
9
9
 
10
10
  task = snapshot.mo_ref.RevertToSnapshot_Task
@@ -18,7 +18,7 @@ module Fog
18
18
 
19
19
  class Mock
20
20
  def revert_to_snapshot(snapshot)
21
- fail ArgumentError, 'snapshot is a required parameter' if snapshot.nil?
21
+ raise ArgumentError, 'snapshot is a required parameter' if snapshot.nil?
22
22
 
23
23
  {
24
24
  'state' => 'success'
@@ -4,11 +4,11 @@ module Fog
4
4
  class Real
5
5
  def set_vm_customvalue(vm_id, key, value)
6
6
  vm_ref = get_vm_ref(vm_id)
7
- vm_ref.setCustomValue(:key => key, :value => value)
7
+ vm_ref.setCustomValue(key: key, value: value)
8
8
  end
9
9
  end
10
10
  class Mock
11
- def set_vm_customvalue(vm_id, key, value)
11
+ def set_vm_customvalue(_vm_id, _key, _value)
12
12
  nil
13
13
  end
14
14
  end
@@ -0,0 +1,111 @@
1
+ module Fog
2
+ module Compute
3
+ class Vsphere
4
+ class Real
5
+ def update_vm(server)
6
+ attributes = server.attributes
7
+ datacenter = attributes[:datacenter]
8
+ vm_mob_ref = get_vm_ref(attributes[:instance_uuid], datacenter)
9
+
10
+ device_change = []
11
+ spec = {}
12
+
13
+ # Name
14
+ spec[:name] = attributes[:name]
15
+
16
+ # CPUs
17
+ spec[:numCPUs] = attributes[:cpus]
18
+ spec[:numCoresPerSocket] = attributes[:corespersocket]
19
+
20
+ # Memory
21
+ spec[:memoryMB] = attributes[:memory_mb]
22
+
23
+ # Volumes
24
+ device_change.concat(update_vm_volumes_specs(vm_mob_ref, server.volumes))
25
+
26
+ # Networks
27
+ device_change.concat(update_vm_interfaces_specs(vm_mob_ref, server.interfaces, datacenter))
28
+
29
+ spec[:deviceChange] = device_change unless device_change.empty?
30
+
31
+ vm_reconfig_hardware('instance_uuid' => attributes[:instance_uuid], 'hardware_spec' => spec) unless spec.empty?
32
+ end
33
+
34
+ private
35
+
36
+ def update_vm_interfaces_specs(vm_mob_ref, fog_interfaces, datacenter)
37
+ vm_nics = vm_mob_ref.config.hardware.device.grep(RbVmomi::VIM::VirtualEthernetCard)
38
+ modified_nics = fog_interfaces.to_a.take(vm_nics.size)
39
+ new_nics = fog_interfaces.to_a.drop(vm_nics.size)
40
+
41
+ specs = []
42
+ vm_nics.zip(modified_nics).each do |vm_nic, fog_nic|
43
+ if fog_nic
44
+ # Update the attributes on the existing nic
45
+ backing = create_nic_backing(fog_nic, datacenter: datacenter)
46
+
47
+ if nic_backing_different?(vm_nic.backing, backing)
48
+ vm_nic.backing = backing
49
+ specs << { operation: :edit, device: vm_nic }
50
+ end
51
+ else
52
+ specs << {
53
+ operation: :remove,
54
+ device: vm_nic
55
+ }
56
+ end
57
+ end
58
+
59
+ specs.concat(new_nics.map { |nic| create_interface(nic, 0, :add, datacenter: datacenter) }) if new_nics.any?
60
+
61
+ specs
62
+ end
63
+
64
+ def update_vm_volumes_specs(vm_mob_ref, volumes)
65
+ vm_volumes = vm_mob_ref.config.hardware.device.grep(RbVmomi::VIM::VirtualDisk)
66
+ modified_volumes = volumes.to_a.take(vm_volumes.size)
67
+ new_volumes = volumes.to_a.drop(vm_volumes.size)
68
+
69
+ specs = []
70
+ vm_volumes.zip(modified_volumes).each do |vm_volume, fog_volume|
71
+ if fog_volume
72
+ update_volume_attributes(vm_volume, fog_volume)
73
+
74
+ specs << { operation: :edit, device: vm_volume }
75
+ next
76
+ end
77
+
78
+ specs << { operation: :remove, fileOperation: :destroy, device: vm_volume }
79
+ end
80
+
81
+ specs.concat(new_volumes.map { |volume| create_disk(volume) }) if new_volumes.any?
82
+
83
+ specs
84
+ end
85
+
86
+ def update_volume_attributes(vm_volume, fog_volume)
87
+ vm_volume.capacityInKB = fog_volume.size
88
+ vm_volume.backing.diskMode = fog_volume.mode
89
+ vm_volume.backing.thinProvisioned = fog_volume.thin
90
+ end
91
+
92
+ def nic_backing_different?(one, two)
93
+ return true if one.class != two.class
94
+
95
+ return true if one.is_a?(RbVmomi::VIM::VirtualEthernetCardDistributedVirtualPortBackingInfo) && (one.port.portgroupKey != two.port.portgroupKey || one.port.switchUuid != two.port.switchUuid)
96
+
97
+ return true if one.is_a?(RbVmomi::VIM::VirtualEthernetCardNetworkBackingInfo) && one.deviceName != two.deviceName && one.deviceType != twp.device
98
+
99
+ false
100
+ end
101
+ end
102
+
103
+ class Mock
104
+ def update_vm(_server)
105
+ # TODO: - currently useless and tests need to be re-though on a whole.
106
+ { 'task_state' => 'success' }
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
@@ -4,15 +4,15 @@ module Fog
4
4
  class Real
5
5
  def upload_iso_check_options(options)
6
6
  default_options = {
7
- 'upload_directory' => 'isos',
7
+ 'upload_directory' => 'isos'
8
8
  }
9
9
  options = default_options.merge(options)
10
- required_options = %w{ datacenter datastore local_path }
10
+ required_options = %w[datacenter datastore local_path]
11
11
  required_options.each do |param|
12
12
  raise ArgumentError, "#{required_options.join(', ')} are required" unless options.key? param
13
13
  end
14
- raise Fog::Compute::Vsphere::NotFound, "Datacenter #{options["datacenter"]} Doesn't Exist!" unless get_datacenter(options["datacenter"])
15
- raise Fog::Compute::Vsphere::NotFound, "Datastore #{options["datastore"]} Doesn't Exist!" unless get_raw_datastore(options['datastore'], options['datacenter'])
14
+ raise Fog::Compute::Vsphere::NotFound, "Datacenter #{options['datacenter']} Doesn't Exist!" unless get_datacenter(options['datacenter'])
15
+ raise Fog::Compute::Vsphere::NotFound, "Datastore #{options['datastore']} Doesn't Exist!" unless get_raw_datastore(options['datastore'], options['datacenter'])
16
16
  options
17
17
  end
18
18
 
@@ -21,13 +21,13 @@ module Fog
21
21
  datastore = get_raw_datastore(options['datastore'], options['datacenter'])
22
22
  datacenter = get_raw_datacenter(options['datacenter'])
23
23
  filename = options['filename'] || File.basename(options['local_path'])
24
- unless datastore.exists? options['upload_directory']+'/'
25
- connection.serviceContent.fileManager.MakeDirectory :name => "[#{options['datastore']}] #{options['upload_directory']}",
26
- :datacenter => datacenter,
27
- :createParentDirectories => false
24
+ unless datastore.exists? options['upload_directory'] + '/'
25
+ connection.serviceContent.fileManager.MakeDirectory name: "[#{options['datastore']}] #{options['upload_directory']}",
26
+ datacenter: datacenter,
27
+ createParentDirectories: false
28
28
  end
29
- datastore.upload options['upload_directory']+'/'+filename, options['local_path']
30
- datastore.exists? options['upload_directory']+'/'+filename
29
+ datastore.upload options['upload_directory'] + '/' + filename, options['local_path']
30
+ datastore.exists? options['upload_directory'] + '/' + filename
31
31
  end
32
32
  end
33
33
  end
@@ -3,12 +3,12 @@ module Fog
3
3
  class Vsphere
4
4
  class Real
5
5
  def vm_acquire_ticket(options = {})
6
- raise ArgumentError, "instance_uuid is a required parameter" unless options.key?('instance_uuid')
6
+ raise ArgumentError, 'instance_uuid is a required parameter' unless options.key?('instance_uuid')
7
7
  ticket_type = options['ticket_type'] || 'webmks'
8
8
 
9
9
  vm_mob_ref = get_vm_ref(options['instance_uuid'])
10
10
 
11
- ticket = vm_mob_ref.AcquireTicket(:ticketType => ticket_type)
11
+ ticket = vm_mob_ref.AcquireTicket(ticketType: ticket_type)
12
12
  {
13
13
  'ticket' => ticket.ticket,
14
14
  'host' => ticket.host,
@@ -20,7 +20,7 @@ module Fog
20
20
 
21
21
  class Mock
22
22
  def vm_acquire_ticket(options = {})
23
- raise ArgumentError, "instance_uuid is a required parameter" unless options.key?('instance_uuid')
23
+ raise ArgumentError, 'instance_uuid is a required parameter' unless options.key?('instance_uuid')
24
24
  {
25
25
  'ticket' => 'fdsfdsf',
26
26
  'host' => 'esxi.example.com',
@@ -3,25 +3,26 @@ module Fog
3
3
  class Vsphere
4
4
  module Shared
5
5
  private
6
+
6
7
  def vm_clone_check_options(options)
7
8
  default_options = {
8
9
  'force' => false,
9
10
  'linked_clone' => false,
10
- 'nic_type' => 'VirtualE1000',
11
+ 'nic_type' => 'VirtualE1000'
11
12
  }
12
13
  options = default_options.merge(options)
13
- options["storage_pod"] = nil if options["storage_pod"] == ''
14
+ options['storage_pod'] = nil if options['storage_pod'] == ''
14
15
  # Backwards compat for "path" option
15
- options["template_path"] ||= options["path"]
16
- options["path"] ||= options["template_path"]
17
- required_options = %w{ datacenter template_path name }
16
+ options['template_path'] ||= options['path']
17
+ options['path'] ||= options['template_path']
18
+ required_options = %w[datacenter template_path name]
18
19
  required_options.each do |param|
19
20
  raise ArgumentError, "#{required_options.join(', ')} are required" unless options.key? param
20
21
  end
21
- raise Fog::Compute::Vsphere::NotFound, "Datacenter #{options["datacenter"]} Doesn't Exist!" unless get_datacenter(options["datacenter"])
22
- raise Fog::Compute::Vsphere::NotFound, "Template #{options["template_path"]} Doesn't Exist!" unless get_virtual_machine(options["template_path"], options["datacenter"])
22
+ raise Fog::Compute::Vsphere::NotFound, "Datacenter #{options['datacenter']} Doesn't Exist!" unless get_datacenter(options['datacenter'])
23
+ raise Fog::Compute::Vsphere::NotFound, "Template #{options['template_path']} Doesn't Exist!" unless get_virtual_machine(options['template_path'], options['datacenter'])
23
24
  if options.key?('storage_pod') && !options['storage_pod'].nil? && !get_raw_storage_pod(options['storage_pod'], options['datacenter'])
24
- raise Fog::Compute::Vsphere::NotFound, "Storage Pod #{options["storage_pod"]} Doesn't Exist!"
25
+ raise Fog::Compute::Vsphere::NotFound, "Storage Pod #{options['storage_pod']} Doesn't Exist!"
25
26
  end
26
27
  options
27
28
  end
@@ -64,7 +65,7 @@ module Fog
64
65
  # * 'numCoresPerSocket'<~Integer> - the number of cores per socket of the Destination VM
65
66
  # * 'memoryMB'<~Integer> - the size of memory of the Destination VM in MB
66
67
  # * customization_spec<~Hash>: Options are marked as required if you
67
- # use this customization_spec.
68
+ # use this customization_spec.
68
69
  # As defined https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Specification.html
69
70
  # * encryptionKey <~array of bytes> Used to encrypt/decrypt password
70
71
  # * globalIPSettings expects a hash, REQUIRED
@@ -72,7 +73,7 @@ module Fog
72
73
  # * nicSettingMap expects an array
73
74
  # * options expects a hash
74
75
  # * All options can be parsed using a yaml template with cloudinit_to_customspec.rb
75
- #
76
+ #
76
77
  # OLD Values still supported:
77
78
  # This only support cloning and setting DHCP on the first interface
78
79
  # * 'domain'<~String> - *REQUIRED* This is put into
@@ -106,19 +107,19 @@ module Fog
106
107
 
107
108
  # Options['dest_folder']<~String>
108
109
  # Grab the destination folder object if it exists else use cloned mach
109
- dest_folder_path = options.fetch('dest_folder','/') # default to root path ({dc_name}/vm/)
110
+ dest_folder_path = options.fetch('dest_folder', '/') # default to root path ({dc_name}/vm/)
110
111
  dest_folder = get_raw_vmfolder(dest_folder_path, options['datacenter'])
111
112
 
112
113
  # Options['resource_pool']<~Array>
113
114
  # Now find _a_ resource pool to use for the clone if one is not specified
114
- if ( options.key?('resource_pool') && options['resource_pool'].is_a?(Array) && options['resource_pool'].length == 2 && options['resource_pool'][1] != 'Resources')
115
+ if options.key?('resource_pool') && options['resource_pool'].is_a?(Array) && options['resource_pool'].length == 2 && options['resource_pool'][1] != 'Resources'
115
116
  cluster_name = options['resource_pool'][0]
116
117
  pool_name = options['resource_pool'][1]
117
118
  resource_pool = get_raw_resource_pool(pool_name, cluster_name, options['datacenter'])
118
- elsif ( options.key?('resource_pool') && options['resource_pool'].is_a?(Array) && options['resource_pool'].length == 2 && options['resource_pool'][1] == 'Resources')
119
+ elsif options.key?('resource_pool') && options['resource_pool'].is_a?(Array) && options['resource_pool'].length == 2 && options['resource_pool'][1] == 'Resources'
119
120
  cluster_name = options['resource_pool'][0]
120
121
  resource_pool = get_raw_resource_pool(nil, cluster_name, options['datacenter'])
121
- elsif ( vm_mob_ref.resourcePool == nil )
122
+ elsif vm_mob_ref.resourcePool.nil?
122
123
  # If the template is really a template then there is no associated resource pool,
123
124
  # so we need to find one using the template's parent host or cluster
124
125
  esx_host = vm_mob_ref.collect!('runtime.host')['runtime.host']
@@ -135,11 +136,9 @@ module Fog
135
136
 
136
137
  # Options['host']<~String>
137
138
  # The target host for the virtual machine. Optional.
138
- if options.key?('host') && !options['host'].empty? && !cluster_name.nil?
139
- host = get_raw_host(options['host'], cluster_name, options['datacenter'])
140
- else
141
- host = nil
142
- end
139
+ host = if options.key?('host') && !options['host'].empty? && !cluster_name.nil?
140
+ get_raw_host(options['host'], cluster_name, options['datacenter'])
141
+ end
143
142
 
144
143
  # Options['datastore']<~String>
145
144
  # Grab the datastore object if option is set
@@ -151,7 +150,7 @@ module Fog
151
150
  device_change = []
152
151
  # fully futured interfaces api: replace the current nics
153
152
  # with the new based on the specification
154
- if (options.key?('interfaces') )
153
+ if options.key?('interfaces')
155
154
  if options.key?('network_label')
156
155
  raise ArgumentError, "interfaces option can't be specified together with network_label"
157
156
  end
@@ -168,34 +167,34 @@ module Fog
168
167
  # https://github.com/rlane/rbvmomi/blob/master/test/test_serialization.rb
169
168
  # http://www.vmware.com/support/developer/vc-sdk/visdk41pubs/ApiReference/vim.vm.ConfigSpec.html
170
169
  # FIXME: pad this out with the rest of the useful things in VirtualMachineConfigSpec
171
- virtual_machine_config_spec.numCPUs = options['numCPUs'] if ( options.key?('numCPUs') )
170
+ virtual_machine_config_spec.numCPUs = options['numCPUs'] if options.key?('numCPUs')
172
171
  virtual_machine_config_spec.numCoresPerSocket = options['numCoresPerSocket'] if options.key?('numCoresPerSocket')
173
- virtual_machine_config_spec.memoryMB = options['memoryMB'] if ( options.key?('memoryMB') )
174
- virtual_machine_config_spec.cpuHotAddEnabled = options['cpuHotAddEnabled'] if ( options.key?('cpuHotAddEnabled') )
175
- virtual_machine_config_spec.memoryHotAddEnabled = options['memoryHotAddEnabled'] if ( options.key?('memoryHotAddEnabled') )
176
- virtual_machine_config_spec.firmware = options['firmware'] if ( options.key?('firmware') )
177
- virtual_machine_config_spec.extraConfig = extra_config(extra_config: options['extraConfig']) if ( options.key?('extraConfig') )
172
+ virtual_machine_config_spec.memoryMB = options['memoryMB'] if options.key?('memoryMB')
173
+ virtual_machine_config_spec.cpuHotAddEnabled = options['cpuHotAddEnabled'] if options.key?('cpuHotAddEnabled')
174
+ virtual_machine_config_spec.memoryHotAddEnabled = options['memoryHotAddEnabled'] if options.key?('memoryHotAddEnabled')
175
+ virtual_machine_config_spec.firmware = options['firmware'] if options.key?('firmware')
176
+ virtual_machine_config_spec.extraConfig = extra_config(extra_config: options['extraConfig']) if options.key?('extraConfig')
178
177
  if @vsphere_rev.to_f >= 5 && options.key?('boot_order')
179
178
  boot_order = options['boot_order'].flat_map do |boot_device|
180
179
  case boot_device.to_sym
181
180
  when :network
182
181
  interfaces = device_change.select do |change|
183
- [:edit, :add].include?(change[:operation]) &&
182
+ %i[edit add].include?(change[:operation]) &&
184
183
  change[:device].class <= RbVmomi::VIM::VirtualEthernetCard
185
184
  end.map { |change| change[:device] }
186
185
  interfaces.map do |interface|
187
186
  RbVmomi::VIM::VirtualMachineBootOptionsBootableEthernetDevice.new(
188
- :deviceKey => interface.key
187
+ deviceKey: interface.key
189
188
  )
190
189
  end
191
190
  when :disk
192
191
  disks = device_change.select do |change|
193
- [:edit, :add].include?(change[:operation]) &&
192
+ %i[edit add].include?(change[:operation]) &&
194
193
  change[:device].is_a?(RbVmomi::VIM::VirtualDisk)
195
194
  end.map { |change| change[:device] }
196
195
  disks.map do |disk|
197
196
  RbVmomi::VIM::VirtualMachineBootOptionsBootableDiskDevice.new(
198
- :deviceKey => disk.key
197
+ deviceKey: disk.key
199
198
  )
200
199
  end
201
200
  when :cdrom
@@ -204,7 +203,7 @@ module Fog
204
203
  RbVmomi::VIM::VirtualMachineBootOptionsBootableFloppyDevice.new
205
204
  end
206
205
  end
207
- virtual_machine_config_spec.bootOptions = { :bootOrder => boot_order }
206
+ virtual_machine_config_spec.bootOptions = { bootOrder: boot_order }
208
207
  end
209
208
  # Options['customization_spec']
210
209
  # OLD Options still supported
@@ -234,10 +233,10 @@ module Fog
234
233
  # * password: <~Hash> - REQUIRED, new administrator password for the machine
235
234
  # * plainText: boolean - REQUIRED, specify whether or not the password is in plain text, rather than encrypted
236
235
  # * value: <~String> - REQUIRED, password string
237
- # * timeZone: <~int> - REQUIRED, (see here for values https://msdn.microsoft.com/en-us/library/ms912391(v=winembedded.11).aspx)
236
+ # * timeZone: <~int> - REQUIRED, (see here for values https://msdn.microsoft.com/en-us/library/ms912391(v=winembedded.11).aspx)
238
237
  # * identification: <~Hash> - REQUIRED, representation of the sysprep Identification key
239
238
  # * domainAdmin: <~String> - Optional, domain user account used for authentication if the virtual machine is joining a domain
240
- # * domainAdminPassword: <~Hash> - Optional, password for the domain user account used for authentication
239
+ # * domainAdminPassword: <~Hash> - Optional, password for the domain user account used for authentication
241
240
  # * plainText: boolean - REQUIRED, specify whether or not the password is in plain text, rather than encrypted
242
241
  # * value: <~String> - REQUIRED, password string
243
242
  # * joinDomain: <~String> - Optional, The domain that the virtual machine should join. If this value is supplied, then domainAdmin and domainAdminPassword must also be supplied
@@ -256,7 +255,7 @@ module Fog
256
255
  # * hwClockUTC: <~Boolean> - Optional, Specifies whether the hardware clock is in UTC or local time
257
256
  # * timeZone: <~String> - Optional, Case sensistive timezone, valid values can be found at https://pubs.vmware.com/vsphere-51/topic/com.vmware.wssdk.apiref.doc/timezone.html
258
257
  # * SysprepText: <~Hash> - Optional, alternate way to specify the sysprep.inf answer file.
259
- # * value: <~String> - REQUIRED, Text for the sysprep.inf answer file.
258
+ # * value: <~String> - REQUIRED, Text for the sysprep.inf answer file.
260
259
  # * nicSettingMap: <~Array> - Optional, IP settings that are specific to a particular virtual network adapter
261
260
  # * Each item in array:
262
261
  # * adapter: <~Hash> - REQUIRED, IP settings for the associated virtual network adapter
@@ -277,7 +276,7 @@ module Fog
277
276
  # * deleteAccounts: <~Boolean> - REQUIRED, If deleteAccounts is true, then all user accounts are removed from the system
278
277
  # * reboot: <~String> - Optional, (defaults to reboot), Action to be taken after running sysprep, must be one of: 'noreboot', 'reboot', 'shutdown'
279
278
  #
280
- if ( options.key?('customization_spec') )
279
+ if options.key?('customization_spec')
281
280
  custom_spec = options['customization_spec']
282
281
 
283
282
  # backwards compatablity
@@ -295,44 +294,44 @@ module Fog
295
294
  #
296
295
  # we can assume old parameters being passed
297
296
  cust_hostname = custom_spec['hostname'] || options['name']
298
- custom_spec['identity'] = Hash.new unless custom_spec.key?('identity')
299
- custom_spec['identity']['LinuxPrep'] = {"domain" => custom_spec['domain'], "hostName" => cust_hostname, "timeZone" => custom_spec['time_zone']}
300
-
297
+ custom_spec['identity'] = {} unless custom_spec.key?('identity')
298
+ custom_spec['identity']['LinuxPrep'] = { 'domain' => custom_spec['domain'], 'hostName' => cust_hostname, 'timeZone' => custom_spec['time_zone'] }
299
+
301
300
  if custom_spec.key?('ipsettings')
302
- custom_spec['globalIPSettings']=Hash.new unless custom_spec.key?('globalIPSettings')
301
+ custom_spec['globalIPSettings'] = {} unless custom_spec.key?('globalIPSettings')
303
302
  custom_spec['globalIPSettings']['dnsServerList'] = custom_spec['ipsettings']['dnsServerList'] if custom_spec['ipsettings'].key?('dnsServerList')
304
- custom_spec['globalIPSettings']['dnsSuffixList'] = custom_spec['dnsSuffixList'] || [custom_spec['domain']] if ( custom_spec['dnsSuffixList'] || custom_spec['domain'])
305
- if (custom_spec['ipsettings'].key?('ip') or custom_spec['ipsettings'].key?('gateway') or custom_spec['ipsettings'].key?('subnetMask') or custom_spec['ipsettings'].key?('domain') or custom_spec['ipsettings'].key?('dnsServerList'))
306
- if custom_spec['ipsettings'].key?('ip') and !custom_spec["ipsettings"].key?("subnetMask")
307
- raise ArgumentError, "subnetMask is required for static ip"
308
- end
309
- custom_spec['nicSettingMap']=Array.new unless custom_spec.key?('nicSettingMap')
310
- custom_spec['nicSettingMap'][0]=Hash.new unless custom_spec['nicSettingMap'].length > 0
311
- custom_spec['nicSettingMap'][0]['adapter']=Hash.new unless custom_spec['nicSettingMap'][0].key?('adapter')
312
- custom_spec['nicSettingMap'][0]['adapter']['ip'] = custom_spec['ipsettings']['ip'] if custom_spec['ipsettings'].key?('ip')
313
- custom_spec['nicSettingMap'][0]['adapter']['gateway'] = custom_spec['ipsettings']['gateway'] if custom_spec['ipsettings'].key?('gateway')
314
- custom_spec['nicSettingMap'][0]['adapter']['subnetMask'] = custom_spec['ipsettings']['subnetMask'] if custom_spec['ipsettings'].key?('subnetMask')
315
- custom_spec['nicSettingMap'][0]['adapter']['dnsDomain'] = custom_spec['ipsettings']['domain'] if custom_spec['ipsettings'].key?('domain')
316
- custom_spec['nicSettingMap'][0]['adapter']['dnsServerList'] = custom_spec['ipsettings']['dnsServerList'] if custom_spec['ipsettings'].key?('dnsServerList')
317
- end
303
+ custom_spec['globalIPSettings']['dnsSuffixList'] = custom_spec['dnsSuffixList'] || [custom_spec['domain']] if custom_spec['dnsSuffixList'] || custom_spec['domain']
304
+ if custom_spec['ipsettings'].key?('ip') || custom_spec['ipsettings'].key?('gateway') || custom_spec['ipsettings'].key?('subnetMask') || custom_spec['ipsettings'].key?('domain') || custom_spec['ipsettings'].key?('dnsServerList')
305
+ if custom_spec['ipsettings'].key?('ip') && !custom_spec['ipsettings'].key?('subnetMask')
306
+ raise ArgumentError, 'subnetMask is required for static ip'
307
+ end
308
+ custom_spec['nicSettingMap'] = [] unless custom_spec.key?('nicSettingMap')
309
+ custom_spec['nicSettingMap'][0] = {} if custom_spec['nicSettingMap'].empty?
310
+ custom_spec['nicSettingMap'][0]['adapter'] = {} unless custom_spec['nicSettingMap'][0].key?('adapter')
311
+ custom_spec['nicSettingMap'][0]['adapter']['ip'] = custom_spec['ipsettings']['ip'] if custom_spec['ipsettings'].key?('ip')
312
+ custom_spec['nicSettingMap'][0]['adapter']['gateway'] = custom_spec['ipsettings']['gateway'] if custom_spec['ipsettings'].key?('gateway')
313
+ custom_spec['nicSettingMap'][0]['adapter']['subnetMask'] = custom_spec['ipsettings']['subnetMask'] if custom_spec['ipsettings'].key?('subnetMask')
314
+ custom_spec['nicSettingMap'][0]['adapter']['dnsDomain'] = custom_spec['ipsettings']['domain'] if custom_spec['ipsettings'].key?('domain')
315
+ custom_spec['nicSettingMap'][0]['adapter']['dnsServerList'] = custom_spec['ipsettings']['dnsServerList'] if custom_spec['ipsettings'].key?('dnsServerList')
316
+ end
318
317
  end
319
318
  end
320
- ### End of backwards compatability
319
+ ### End of backwards compatability
321
320
 
322
321
  ## requirements check here ##
323
- raise ArgumentError, "globalIPSettings are required when using Customization Spec" unless custom_spec.key?('globalIPSettings')
324
- raise ArgumentError, "identity is required when using Customization Spec" unless custom_spec.key?('identity')
325
-
322
+ raise ArgumentError, 'globalIPSettings are required when using Customization Spec' unless custom_spec.key?('globalIPSettings')
323
+ raise ArgumentError, 'identity is required when using Customization Spec' unless custom_spec.key?('identity')
324
+
326
325
  # encryptionKey
327
326
  custom_encryptionKey = custom_spec['encryptionKey'] if custom_spec.key?('encryptionKey')
328
327
  custom_encryptionKey ||= nil
329
-
328
+
330
329
  # globalIPSettings
331
330
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.GlobalIPSettings.html
332
- custom_globalIPSettings = RbVmomi::VIM::CustomizationGlobalIPSettings.new()
333
- custom_globalIPSettings.dnsServerList = custom_spec['globalIPSettings']['dnsServerList'] if custom_spec['globalIPSettings'].key?("dnsServerList")
334
- custom_globalIPSettings.dnsSuffixList = custom_spec['globalIPSettings']['dnsSuffixList'] if custom_spec['globalIPSettings'].key?("dnsSuffixList")
335
-
331
+ custom_globalIPSettings = RbVmomi::VIM::CustomizationGlobalIPSettings.new
332
+ custom_globalIPSettings.dnsServerList = custom_spec['globalIPSettings']['dnsServerList'] if custom_spec['globalIPSettings'].key?('dnsServerList')
333
+ custom_globalIPSettings.dnsSuffixList = custom_spec['globalIPSettings']['dnsSuffixList'] if custom_spec['globalIPSettings'].key?('dnsSuffixList')
334
+
336
335
  # identity
337
336
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.IdentitySettings.html
338
337
  # Accepts the 3 supported CustomizationIdentitySettings Types:
@@ -342,21 +341,21 @@ module Fog
342
341
  # At least one of these is required
343
342
  #
344
343
  identity = custom_spec['identity']
345
- if identity.key?("LinuxPrep")
344
+ if identity.key?('LinuxPrep')
346
345
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.LinuxPrep.html
347
346
  # Fields:
348
347
  # * domain: string **REQUIRED**
349
348
  # * hostName: string (CustomizationName) **REQUIRED** Will use options['name'] if not provided.
350
349
  # * hwClockUTC: boolean
351
- # * timeZone: string (https://pubs.vmware.com/vsphere-55/topic/com.vmware.wssdk.apiref.doc/timezone.html)
352
- raise ArgumentError, "domain is required when using LinuxPrep identity" unless identity['LinuxPrep'].key?('domain')
353
- custom_identity = RbVmomi::VIM::CustomizationLinuxPrep(:domain => identity['LinuxPrep']['domain'])
354
- cust_hostname = RbVmomi::VIM::CustomizationFixedName(:name => identity['LinuxPrep']['hostName']) if identity['LinuxPrep'].key?('hostName')
355
- cust_hostname ||= RbVmomi::VIM::CustomizationFixedName(:name => options['name'])
350
+ # * timeZone: string (https://pubs.vmware.com/vsphere-55/topic/com.vmware.wssdk.apiref.doc/timezone.html)
351
+ raise ArgumentError, 'domain is required when using LinuxPrep identity' unless identity['LinuxPrep'].key?('domain')
352
+ custom_identity = RbVmomi::VIM::CustomizationLinuxPrep(domain: identity['LinuxPrep']['domain'])
353
+ cust_hostname = RbVmomi::VIM::CustomizationFixedName(name: identity['LinuxPrep']['hostName']) if identity['LinuxPrep'].key?('hostName')
354
+ cust_hostname ||= RbVmomi::VIM::CustomizationFixedName(name: options['name'])
356
355
  custom_identity.hostName = cust_hostname
357
356
  custom_identity.hwClockUTC = identity['LinuxPrep']['hwClockUTC'] if identity['LinuxPrep'].key?('hwClockUTC')
358
- custom_identity.timeZone = identity['LinuxPrep']['timeZone'] if identity['LinuxPrep'].key?('timeZone')
359
- elsif identity.key?("Sysprep")
357
+ custom_identity.timeZone = identity['LinuxPrep']['timeZone'] if identity['LinuxPrep'].key?('timeZone')
358
+ elsif identity.key?('Sysprep')
360
359
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Sysprep.html
361
360
  # Fields:
362
361
  # * guiRunOnce: CustomizationGuiRunOnce
@@ -364,42 +363,42 @@ module Fog
364
363
  # * identification: CustomizationIdentification **REQUIRED**
365
364
  # * licenseFilePrintData: CustomizationLicenseFilePrintData
366
365
  # * userData: CustomizationUserData **REQUIRED**
367
- #
368
- raise ArgumentError, "guiUnattended is required when using Sysprep identity" unless identity['Sysprep'].key?('guiUnattended')
369
- raise ArgumentError, "identification is required when using Sysprep identity" unless identity['Sysprep'].key?('identification')
370
- raise ArgumentError, "userData is required when using Sysprep identity" unless identity['Sysprep'].key?('userData')
366
+ #
367
+ raise ArgumentError, 'guiUnattended is required when using Sysprep identity' unless identity['Sysprep'].key?('guiUnattended')
368
+ raise ArgumentError, 'identification is required when using Sysprep identity' unless identity['Sysprep'].key?('identification')
369
+ raise ArgumentError, 'userData is required when using Sysprep identity' unless identity['Sysprep'].key?('userData')
371
370
  if identity['Sysprep']['guiRunOnce']
372
371
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.GuiRunOnce.html
373
372
  # Fields:
374
373
  # * commandList: array of string **REQUIRED***
375
374
  #
376
- raise ArgumentError, "commandList is required when using Sysprep identity and guiRunOnce" unless identity['Sysprep']['guiRunOnce'].key?('commandList')
377
- cust_guirunonce = RbVmomi::VIM.CustomizationGuiRunOnce( :commandList => identity['Sysprep']['guiRunOnce']['commandList'] )
375
+ raise ArgumentError, 'commandList is required when using Sysprep identity and guiRunOnce' unless identity['Sysprep']['guiRunOnce'].key?('commandList')
376
+ cust_guirunonce = RbVmomi::VIM.CustomizationGuiRunOnce(commandList: identity['Sysprep']['guiRunOnce']['commandList'])
378
377
  end
379
378
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.GuiUnattended.html
380
379
  # Fields:
381
380
  # * autoLogin: boolean **REQUIRED**
382
381
  # * autoLogonCount: int **REQUIRED**
383
382
  # * timeZone: int (see here for values https://msdn.microsoft.com/en-us/library/ms912391(v=winembedded.11).aspx) **REQUIRED**
384
- # * password: CustomizationPassword
385
- raise ArgumentError, "guiUnattended->autoLogon is required when using Sysprep identity" unless identity['Sysprep']['guiUnattended'].key?('autoLogon')
386
- raise ArgumentError, "guiUnattended->autoLogonCount is required when using Sysprep identity" unless identity['Sysprep']['guiUnattended'].key?('autoLogonCount')
387
- raise ArgumentError, "guiUnattended->timeZone is required when using Sysprep identity" unless identity['Sysprep']['guiUnattended'].key?('timeZone')
383
+ # * password: CustomizationPassword
384
+ raise ArgumentError, 'guiUnattended->autoLogon is required when using Sysprep identity' unless identity['Sysprep']['guiUnattended'].key?('autoLogon')
385
+ raise ArgumentError, 'guiUnattended->autoLogonCount is required when using Sysprep identity' unless identity['Sysprep']['guiUnattended'].key?('autoLogonCount')
386
+ raise ArgumentError, 'guiUnattended->timeZone is required when using Sysprep identity' unless identity['Sysprep']['guiUnattended'].key?('timeZone')
388
387
  custom_guiUnattended = RbVmomi::VIM.CustomizationGuiUnattended(
389
- :autoLogon => identity['Sysprep']['guiUnattended']['autoLogon'],
390
- :autoLogonCount => identity['Sysprep']['guiUnattended']['autoLogonCount'],
391
- :timeZone => identity['Sysprep']['guiUnattended']['timeZone']
388
+ autoLogon: identity['Sysprep']['guiUnattended']['autoLogon'],
389
+ autoLogonCount: identity['Sysprep']['guiUnattended']['autoLogonCount'],
390
+ timeZone: identity['Sysprep']['guiUnattended']['timeZone']
392
391
  )
393
392
  if identity['Sysprep']['guiUnattended']['password']
394
393
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Password.html
395
394
  # Fields:
396
395
  # * plainText: boolean **REQUIRED**
397
396
  # * value: string **REQUIRED**
398
- raise ArgumentError, "guiUnattended->password->plainText is required when using Sysprep identity and guiUnattended -> password" unless identity['Sysprep']['guiUnattended']['password'].key?('plainText')
399
- raise ArgumentError, "guiUnattended->password->value is required when using Sysprep identity and guiUnattended -> password" unless identity['Sysprep']['guiUnattended']['password'].key?('value')
397
+ raise ArgumentError, 'guiUnattended->password->plainText is required when using Sysprep identity and guiUnattended -> password' unless identity['Sysprep']['guiUnattended']['password'].key?('plainText')
398
+ raise ArgumentError, 'guiUnattended->password->value is required when using Sysprep identity and guiUnattended -> password' unless identity['Sysprep']['guiUnattended']['password'].key?('value')
400
399
  custom_guiUnattended.password = RbVmomi::VIM.CustomizationPassword(
401
- :plainText => identity['Sysprep']['guiUnattended']['password']['plainText'],
402
- :value => identity['Sysprep']['guiUnattended']['password']['value']
400
+ plainText: identity['Sysprep']['guiUnattended']['password']['plainText'],
401
+ value: identity['Sysprep']['guiUnattended']['password']['value']
403
402
  )
404
403
  end
405
404
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Identification.html
@@ -412,19 +411,19 @@ module Fog
412
411
  if identity['Sysprep']['identification'].key?('joinWorkgroup')
413
412
  custom_identification.joinWorkgroup = identity['Sysprep']['identification']['joinWorkgroup']
414
413
  elsif identity['Sysprep']['identification'].key?('joinDomain')
415
- raise ArgumentError, "identification->domainAdmin is required when using Sysprep identity and identification -> joinDomain" unless identity['Sysprep']['identification'].key?('domainAdmin')
416
- raise ArgumentError, "identification->domainAdminPassword is required when using Sysprep identity and identification -> joinDomain" unless identity['Sysprep']['identification'].key?('domainAdmin')
417
- raise ArgumentError, "identification->domainAdminPassword->plainText is required when using Sysprep identity and identification -> joinDomain" unless identity['Sysprep']['identification']['domainAdminPassword'].key?('plainText')
418
- raise ArgumentError, "identification->domainAdminPassword->value is required when using Sysprep identity and identification -> joinDomain" unless identity['Sysprep']['identification']['domainAdminPassword'].key?('value')
414
+ raise ArgumentError, 'identification->domainAdmin is required when using Sysprep identity and identification -> joinDomain' unless identity['Sysprep']['identification'].key?('domainAdmin')
415
+ raise ArgumentError, 'identification->domainAdminPassword is required when using Sysprep identity and identification -> joinDomain' unless identity['Sysprep']['identification'].key?('domainAdmin')
416
+ raise ArgumentError, 'identification->domainAdminPassword->plainText is required when using Sysprep identity and identification -> joinDomain' unless identity['Sysprep']['identification']['domainAdminPassword'].key?('plainText')
417
+ raise ArgumentError, 'identification->domainAdminPassword->value is required when using Sysprep identity and identification -> joinDomain' unless identity['Sysprep']['identification']['domainAdminPassword'].key?('value')
419
418
  custom_identification.joinDomain = identity['Sysprep']['identification']['joinDomain']
420
419
  custom_identification.domainAdmin = identity['Sysprep']['identification']['domainAdmin']
421
420
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Password.html
422
421
  # Fields:
423
422
  # * plainText: boolean **REQUIRED**
424
423
  # * value: string **REQUIRED**
425
- custom_identification.domainAdminPassword = RbVmomi::VIM.CustomizationPassword(
426
- :plainText => identity['Sysprep']['identification']['domainAdminPassword']['plainText'],
427
- :value => identity['Sysprep']['identification']['domainAdminPassword']['value']
424
+ custom_identification.domainAdminPassword = RbVmomi::VIM.CustomizationPassword(
425
+ plainText: identity['Sysprep']['identification']['domainAdminPassword']['plainText'],
426
+ value: identity['Sysprep']['identification']['domainAdminPassword']['value']
428
427
  )
429
428
  else
430
429
  raise ArgumentError, "No valid Indentification found, valid values are 'joinWorkgroup' and 'joinDomain'"
@@ -434,13 +433,13 @@ module Fog
434
433
  # Fields:
435
434
  # * autoMode: string (CustomizationLicenseDataMode) ** REQUIRED **, valid strings are: 'perSeat' or 'perServer'
436
435
  # * autoUsers: int (valid only if AutoMode = PerServer)
437
- raise ArgumentError, "licenseFilePrintData->autoMode is required when using Sysprep identity and licenseFilePrintData" unless identity['Sysprep']['licenseFilePrintData'].key?('autoMode')
438
- raise ArgumentError, "Unsupported autoMode, supported modes are : 'perSeat' or 'perServer'" unless ['perSeat', 'perServer'].include? identity['Sysprep']['licenseFilePrintData']['autoMode']
436
+ raise ArgumentError, 'licenseFilePrintData->autoMode is required when using Sysprep identity and licenseFilePrintData' unless identity['Sysprep']['licenseFilePrintData'].key?('autoMode')
437
+ raise ArgumentError, "Unsupported autoMode, supported modes are : 'perSeat' or 'perServer'" unless %w[perSeat perServer].include? identity['Sysprep']['licenseFilePrintData']['autoMode']
439
438
  custom_licenseFilePrintData = RbVmomi::VIM.CustomizationLicenseFilePrintData(
440
- :autoMode => RbVmomi::VIM.CustomizationLicenseDataMode(identity['Sysprep']['licenseFilePrintData']['autoMode'])
439
+ autoMode: RbVmomi::VIM.CustomizationLicenseDataMode(identity['Sysprep']['licenseFilePrintData']['autoMode'])
441
440
  )
442
441
  if identity['Sysprep']['licenseFilePrintData'].key?('autoUsers')
443
- custom_licenseFilePrintData.autoUsers = identity['Sysprep']['licenseFilePrintData']['autoUsers'] if identity['Sysprep']['licenseFilePrintData']['autoMode'] == "PerServer"
442
+ custom_licenseFilePrintData.autoUsers = identity['Sysprep']['licenseFilePrintData']['autoUsers'] if identity['Sysprep']['licenseFilePrintData']['autoMode'] == 'PerServer'
444
443
  end
445
444
  end
446
445
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.UserData.html
@@ -449,48 +448,48 @@ module Fog
449
448
  # * fullName: string **REQUIRED**
450
449
  # * orgName: string **REQUIRED**
451
450
  # * productID: string **REQUIRED**
452
- raise ArgumentError, "userData->computerName is required when using Sysprep identity" unless identity['Sysprep']['userData'].key?('computerName')
453
- raise ArgumentError, "userData->fullName is required when using Sysprep identity" unless identity['Sysprep']['userData'].key?('fullName')
454
- raise ArgumentError, "userData->orgName is required when using Sysprep identity" unless identity['Sysprep']['userData'].key?('orgName')
455
- raise ArgumentError, "userData->productId is required when using Sysprep identity" unless identity['Sysprep']['userData'].key?('productId')
451
+ raise ArgumentError, 'userData->computerName is required when using Sysprep identity' unless identity['Sysprep']['userData'].key?('computerName')
452
+ raise ArgumentError, 'userData->fullName is required when using Sysprep identity' unless identity['Sysprep']['userData'].key?('fullName')
453
+ raise ArgumentError, 'userData->orgName is required when using Sysprep identity' unless identity['Sysprep']['userData'].key?('orgName')
454
+ raise ArgumentError, 'userData->productId is required when using Sysprep identity' unless identity['Sysprep']['userData'].key?('productId')
456
455
  custom_userData = RbVmomi::VIM.CustomizationUserData(
457
- :fullName => identity['Sysprep']['userData']['fullName'],
458
- :orgName => identity['Sysprep']['userData']['orgName'],
459
- :productId => identity['Sysprep']['userData']['productId'],
460
- :computerName => RbVmomi::VIM.CustomizationFixedName(:name => identity['Sysprep']['userData']['computerName'])
456
+ fullName: identity['Sysprep']['userData']['fullName'],
457
+ orgName: identity['Sysprep']['userData']['orgName'],
458
+ productId: identity['Sysprep']['userData']['productId'],
459
+ computerName: RbVmomi::VIM.CustomizationFixedName(name: identity['Sysprep']['userData']['computerName'])
461
460
  )
462
461
 
463
- custom_identity = RbVmomi::VIM::CustomizationSysprep(
464
- :guiUnattended => custom_guiUnattended,
465
- :identification => custom_identification,
466
- :userData => custom_userData
462
+ custom_identity = RbVmomi::VIM::CustomizationSysprep(
463
+ guiUnattended: custom_guiUnattended,
464
+ identification: custom_identification,
465
+ userData: custom_userData
467
466
  )
468
467
  custom_identity.guiRunOnce = cust_guirunonce if defined?(cust_guirunonce)
469
468
  custom_identity.licenseFilePrintData = custom_licenseFilePrintData if defined?(custom_licenseFilePrintData)
470
- elsif identity.key?("SysprepText")
469
+ elsif identity.key?('SysprepText')
471
470
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.SysprepText.html
472
471
  # Fields:
473
472
  # * value: string **REQUIRED**
474
- raise ArgumentError, "SysprepText -> value is required when using SysprepText identity" unless identity['SysprepText'].key?('value')
475
- custom_identity = RbVmomi::VIM::CustomizationSysprepText(:value => identity['SysprepText']['value'])
473
+ raise ArgumentError, 'SysprepText -> value is required when using SysprepText identity' unless identity['SysprepText'].key?('value')
474
+ custom_identity = RbVmomi::VIM::CustomizationSysprepText(value: identity['SysprepText']['value'])
476
475
  else
477
- raise ArgumentError, "At least one of the following valid identities must be supplied: LinuxPrep, Sysprep, SysprepText"
476
+ raise ArgumentError, 'At least one of the following valid identities must be supplied: LinuxPrep, Sysprep, SysprepText'
478
477
  end
479
478
 
480
- if custom_spec.key?("nicSettingMap")
479
+ if custom_spec.key?('nicSettingMap')
481
480
  # custom_spec['nicSettingMap'] is an array of adapater mappings:
482
481
  # custom_spec['nicSettingMap'][0]['macAddress']
483
482
  # custom_spec['nicSettingMap'][0]['adapter']['ip']
484
- #https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.AdapterMapping.html
483
+ # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.AdapterMapping.html
485
484
  # Fields:
486
485
  # * adapter: CustomizationIPSettings **REQUIRED**
487
486
  # * macAddress: string
488
- raise ArgumentError, "At least one nicSettingMap is required when using nicSettingMap" unless custom_spec['nicSettingMap'].length > 0
489
- raise ArgumentError, "Adapter is required when using nicSettingMap" unless custom_spec['nicSettingMap'][0].key?('adapter')
490
-
491
- custom_nicSettingMap = []
487
+ raise ArgumentError, 'At least one nicSettingMap is required when using nicSettingMap' if custom_spec['nicSettingMap'].empty?
488
+ raise ArgumentError, 'Adapter is required when using nicSettingMap' unless custom_spec['nicSettingMap'][0].key?('adapter')
489
+
490
+ custom_nicSettingMap = []
492
491
  # need to go through array here for each apapter
493
- custom_spec['nicSettingMap'].each do | nic |
492
+ custom_spec['nicSettingMap'].each do |nic|
494
493
  # https://pubs.vmware.com/vsphere-55/index.jsp?topic=%2Fcom.vmware.wssdk.apiref.doc%2Fvim.vm.customization.IPSettings.html
495
494
  # Fields:
496
495
  # * dnsDomain: string
@@ -502,12 +501,12 @@ module Fog
502
501
  # * secondaryWINS: string
503
502
  # * subnetMask: string - Required if assigning static IP
504
503
  if nic['adapter'].key?('ip')
505
- raise ArgumentError, "SubnetMask is required when assigning static IP when using nicSettingMap -> Adapter" unless nic['adapter'].key?('subnetMask')
506
- custom_ip = RbVmomi::VIM.CustomizationFixedIp(:ipAddress => nic['adapter']['ip'])
504
+ raise ArgumentError, 'SubnetMask is required when assigning static IP when using nicSettingMap -> Adapter' unless nic['adapter'].key?('subnetMask')
505
+ custom_ip = RbVmomi::VIM.CustomizationFixedIp(ipAddress: nic['adapter']['ip'])
507
506
  else
508
- custom_ip = RbVmomi::VIM::CustomizationDhcpIpGenerator.new()
507
+ custom_ip = RbVmomi::VIM::CustomizationDhcpIpGenerator.new
509
508
  end
510
- custom_adapter = RbVmomi::VIM.CustomizationIPSettings(:ip => custom_ip)
509
+ custom_adapter = RbVmomi::VIM.CustomizationIPSettings(ip: custom_ip)
511
510
  custom_adapter.dnsDomain = nic['adapter']['dnsDomain'] if nic['adapter'].key?('dnsDomain')
512
511
  custom_adapter.dnsServerList = nic['adapter']['dnsServerList'] if nic['adapter'].key?('dnsServerList')
513
512
  custom_adapter.gateway = nic['adapter']['gateway'] if nic['adapter'].key?('gateway')
@@ -517,18 +516,18 @@ module Fog
517
516
  # * gateway: array of string
518
517
  # * ip: CustomizationIpV6Generator[] **Required if setting static IP **
519
518
  if nic['adapter']['ipV6Spec'].key?('ipAddress')
520
- raise ArgumentError, "SubnetMask is required when assigning static IPv6 when using nicSettingMap -> Adapter -> ipV6Spec" unless nic['adapter']['ipV6Spec'].key?('subnetMask')
519
+ raise ArgumentError, 'SubnetMask is required when assigning static IPv6 when using nicSettingMap -> Adapter -> ipV6Spec' unless nic['adapter']['ipV6Spec'].key?('subnetMask')
521
520
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.FixedIpV6.html
522
521
  # * ipAddress: string **REQUIRED**
523
522
  # * subnetMask: int **REQUIRED**
524
523
  custom_ipv6 = RbVmomi::VIM.CustomizationFixedIpV6(
525
- :ipAddress => nic['adapter']['ipV6Spec']['ipAddress'],
526
- :subnetMask => nic['adapter']['ipV6Spec']['subnetMask']
524
+ ipAddress: nic['adapter']['ipV6Spec']['ipAddress'],
525
+ subnetMask: nic['adapter']['ipV6Spec']['subnetMask']
527
526
  )
528
527
  else
529
- custom_ipv6 = RbVmomi::VIM::CustomizationDhcpIpV6Generator.new()
528
+ custom_ipv6 = RbVmomi::VIM::CustomizationDhcpIpV6Generator.new
530
529
  end
531
- custom_ipv6Spec = RbVmomi::VIM.CustomizationIPSettingsIpV6AddressSpec(:ip => custom_ipv6)
530
+ custom_ipv6Spec = RbVmomi::VIM.CustomizationIPSettingsIpV6AddressSpec(ip: custom_ipv6)
532
531
  custom_ipv6Spec.gateway = nic['adapter']['ipV6Spec']['gateway'] if nic['adapter']['ipV6Spec'].key?('gateway')
533
532
  custom_adapter.ipV6Spec = custom_ipv6Spec
534
533
  end
@@ -537,45 +536,45 @@ module Fog
537
536
  # Fields:
538
537
  # netBIOS: string matching: 'disableNetBIOS','enableNetBIOS' or 'enableNetBIOSViaDhcp' ** REQUIRED **
539
538
  #
540
- raise ArgumentError, "Unsupported NetBIOSMode, supported modes are : 'disableNetBIOS','enableNetBIOS' or 'enableNetBIOSViaDhcp'" unless ['disableNetBIOS','enableNetBIOS','enableNetBIOSViaDhcp'].include? nic['adapter']['netBIOS']
539
+ raise ArgumentError, "Unsupported NetBIOSMode, supported modes are : 'disableNetBIOS','enableNetBIOS' or 'enableNetBIOSViaDhcp'" unless %w[disableNetBIOS enableNetBIOS enableNetBIOSViaDhcp].include? nic['adapter']['netBIOS']
541
540
  custom_adapter.netBIOS = RbVmomi::VIM.CustomizationNetBIOSMode(nic['adapter']['netBIOS'])
542
541
  end
543
542
  custom_adapter.primaryWINS = nic['adapter']['primaryWINS'] if nic['adapter'].key?('primaryWINS')
544
543
  custom_adapter.secondaryWINS = nic['adapter']['secondaryWINS'] if nic['adapter'].key?('secondaryWINS')
545
544
  custom_adapter.subnetMask = nic['adapter']['subnetMask'] if nic['adapter'].key?('subnetMask')
546
545
 
547
- custom_adapter_mapping = RbVmomi::VIM::CustomizationAdapterMapping(:adapter => custom_adapter)
546
+ custom_adapter_mapping = RbVmomi::VIM::CustomizationAdapterMapping(adapter: custom_adapter)
548
547
  custom_adapter_mapping.macAddress = nic['macAddress'] if nic.key?('macAddress')
549
-
548
+
550
549
  # build the adapters array
551
550
  custom_nicSettingMap << custom_adapter_mapping
552
551
  end
553
- end
554
-
555
- if custom_spec.key?("options")
552
+ end
553
+
554
+ if custom_spec.key?('options')
556
555
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Options.html
557
556
  # this currently doesn't have any Linux options, just windows
558
557
  # Fields:
559
558
  # * changeSID: boolean **REQUIRED**
560
559
  # * deleteAccounts: boolean **REQUIRED** **note deleteAccounts is deprecated as of VI API 2.5 so can be ignored
561
560
  # * reboot: CustomizationSysprepRebootOption: (string) one of following 'noreboot', reboot' or 'shutdown' (defaults to reboot)
562
- raise ArgumentError, "changeSID id required when using Windows Options" unless custom_spec['options'].key?('changeSID')
563
- raise ArgumentError, "deleteAccounts id required when using Windows Options" unless custom_spec['options'].key?('deleteAccounts')
561
+ raise ArgumentError, 'changeSID id required when using Windows Options' unless custom_spec['options'].key?('changeSID')
562
+ raise ArgumentError, 'deleteAccounts id required when using Windows Options' unless custom_spec['options'].key?('deleteAccounts')
564
563
  custom_options = RbVmomi::VIM::CustomizationWinOptions(
565
- :changeSID => custom_spec['options']['changeSID'],
566
- :deleteAccounts => custom_spec['options']['deleteAccounts']
564
+ changeSID: custom_spec['options']['changeSID'],
565
+ deleteAccounts: custom_spec['options']['deleteAccounts']
567
566
  )
568
567
  if custom_spec['options'].key?('reboot')
569
- raise ArgumentError, "Unsupported reboot option, supported options are : 'noreboot', 'reboot' or 'shutdown'" unless ['noreboot','reboot','shutdown'].include? custom_spec['options']['reboot']
568
+ raise ArgumentError, "Unsupported reboot option, supported options are : 'noreboot', 'reboot' or 'shutdown'" unless %w[noreboot reboot shutdown].include? custom_spec['options']['reboot']
570
569
  custom_options.reboot = RBVmomi::VIM.CustomizationSysprepRebootOption(custom_spec['options']['reboot'])
571
570
  end
572
571
  end
573
- custom_options ||=nil
574
-
572
+ custom_options ||= nil
573
+
575
574
  # https://pubs.vmware.com/vsphere-55/index.jsp#com.vmware.wssdk.apiref.doc/vim.vm.customization.Specification.html
576
575
  customization_spec = RbVmomi::VIM::CustomizationSpec(
577
- :globalIPSettings => custom_globalIPSettings,
578
- :identity => custom_identity
576
+ globalIPSettings: custom_globalIPSettings,
577
+ identity: custom_identity
579
578
  )
580
579
  customization_spec.encryptionKey = custom_encryptionKey if defined?(custom_encryptionKey)
581
580
  customization_spec.nicSettingMap = custom_nicSettingMap if defined?(custom_nicSettingMap)
@@ -584,11 +583,11 @@ module Fog
584
583
  end
585
584
  customization_spec ||= nil
586
585
 
587
- relocation_spec=nil
588
- if ( options['linked_clone'] )
586
+ relocation_spec = nil
587
+ if options['linked_clone']
589
588
  # Storage DRS does not support vSphere linked clones.
590
589
  # http://www.vmware.com/files/pdf/techpaper/vsphere-storage-drs-interoperability.pdf
591
- raise ArgumentError, "linked clones are not supported on storage pods" unless options.key?('storage_pod')
590
+ raise ArgumentError, 'linked clones are not supported on storage pods' unless options.key?('storage_pod')
592
591
  # cribbed heavily from the rbvmomi clone_vm.rb
593
592
  # this chunk of code reconfigures the disk of the clone source to be read only,
594
593
  # and then creates a delta disk on top of that, this is required by the API in order to create
@@ -596,36 +595,36 @@ module Fog
596
595
  disks = vm_mob_ref.config.hardware.device.select do |vm_device|
597
596
  vm_device.class == RbVmomi::VIM::VirtualDisk
598
597
  end
599
- disks.select{|vm_device| vm_device.backing.parent == nil}.each do |disk|
598
+ disks.select { |vm_device| vm_device.backing.parent.nil? }.each do |disk|
600
599
  disk_spec = {
601
- :deviceChange => [
600
+ deviceChange: [
602
601
  {
603
- :operation => :remove,
604
- :device => disk
602
+ operation: :remove,
603
+ device: disk
605
604
  },
606
605
  {
607
- :operation => :add,
608
- :fileOperation => :create,
609
- :device => disk.dup.tap{|disk_backing|
610
- disk_backing.backing = disk_backing.backing.dup;
611
- disk_backing.backing.fileName = "[#{disk.backing.datastore.name}]";
606
+ operation: :add,
607
+ fileOperation: :create,
608
+ device: disk.dup.tap do |disk_backing|
609
+ disk_backing.backing = disk_backing.backing.dup
610
+ disk_backing.backing.fileName = "[#{disk.backing.datastore.name}]"
612
611
  disk_backing.backing.parent = disk.backing
613
- }
612
+ end
614
613
  }
615
614
  ]
616
615
  }
617
- vm_mob_ref.ReconfigVM_Task(:spec => disk_spec).wait_for_completion
616
+ vm_mob_ref.ReconfigVM_Task(spec: disk_spec).wait_for_completion
618
617
  end
619
618
  # Next, create a Relocation Spec instance
620
- relocation_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(:datastore => datastore_obj,
621
- :pool => resource_pool,
622
- :host => host,
623
- :diskMoveType => :moveChildMostDiskBacking)
619
+ relocation_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(datastore: datastore_obj,
620
+ pool: resource_pool,
621
+ host: host,
622
+ diskMoveType: :moveChildMostDiskBacking)
624
623
  else
625
- relocation_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(:pool => resource_pool,
626
- :host => host,
627
- :transform => options['transform'] || 'sparse')
628
- unless options.key?('storage_pod') and datastore_obj.nil?
624
+ relocation_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(pool: resource_pool,
625
+ host: host,
626
+ transform: options['transform'] || 'sparse')
627
+ unless options.key?('storage_pod') && datastore_obj.nil?
629
628
  relocation_spec[:datastore] = datastore_obj
630
629
  end
631
630
  end
@@ -634,72 +633,72 @@ module Fog
634
633
  relocation_spec[:disk] = relocate_template_volumes_specs(vm_mob_ref, options['volumes'], options['datacenter'])
635
634
  end
636
635
  # And the clone specification
637
- clone_spec = RbVmomi::VIM.VirtualMachineCloneSpec(:location => relocation_spec,
638
- :config => virtual_machine_config_spec,
639
- :customization => customization_spec,
640
- :powerOn => options.key?('power_on') ? options['power_on'] : true,
641
- :template => false)
636
+ clone_spec = RbVmomi::VIM.VirtualMachineCloneSpec(location: relocation_spec,
637
+ config: virtual_machine_config_spec,
638
+ customization: customization_spec,
639
+ powerOn: options.key?('power_on') ? options['power_on'] : true,
640
+ template: false)
642
641
 
643
642
  # Perform the actual Clone Task
644
643
  # Clone VM on a storage pod
645
- if options.key?('storage_pod') and !options['storage_pod'].nil?
646
- raise ArgumentError, "need to use at least vsphere revision 5.0 or greater to use storage pods" unless @vsphere_rev.to_f >= 5
647
- pod_spec = RbVmomi::VIM::StorageDrsPodSelectionSpec.new(
648
- :storagePod => get_raw_storage_pod(options['storage_pod'], options['datacenter']),
644
+ if options.key?('storage_pod') && !options['storage_pod'].nil?
645
+ raise ArgumentError, 'need to use at least vsphere revision 5.0 or greater to use storage pods' unless @vsphere_rev.to_f >= 5
646
+ pod_spec = RbVmomi::VIM::StorageDrsPodSelectionSpec.new(
647
+ storagePod: get_raw_storage_pod(options['storage_pod'], options['datacenter'])
649
648
  )
650
649
  storage_spec = RbVmomi::VIM::StoragePlacementSpec.new(
651
- :type => 'clone',
652
- :folder => dest_folder,
653
- :resourcePool => resource_pool,
654
- :podSelectionSpec => pod_spec,
655
- :cloneSpec => clone_spec,
656
- :cloneName => options['name'],
657
- :vm => vm_mob_ref,
650
+ type: 'clone',
651
+ folder: dest_folder,
652
+ resourcePool: resource_pool,
653
+ podSelectionSpec: pod_spec,
654
+ cloneSpec: clone_spec,
655
+ cloneName: options['name'],
656
+ vm: vm_mob_ref
658
657
  )
659
658
  srm = connection.serviceContent.storageResourceManager
660
- result = srm.RecommendDatastores(:storageSpec => storage_spec)
659
+ result = srm.RecommendDatastores(storageSpec: storage_spec)
661
660
 
662
661
  # if result array contains recommendation, we can apply it
663
662
  if key = result.recommendations.first.key
664
- task = srm.ApplyStorageDrsRecommendation_Task(:key => [key])
665
- if options.fetch('wait', true) then
663
+ task = srm.ApplyStorageDrsRecommendation_Task(key: [key])
664
+ if options.fetch('wait', true)
666
665
  result = task.wait_for_completion
667
666
  new_vm = result.vm
668
667
  else
669
668
  new_vm = nil
670
- Fog.wait_for(150, 15) {
669
+ Fog.wait_for(150, 15) do
671
670
  begin
672
- new_vm = dest_folder.find(options['name'], RbVmomi::VIM::VirtualMachine) or raise Fog::Vsphere::Errors::NotFound
671
+ (new_vm = dest_folder.find(options['name'], RbVmomi::VIM::VirtualMachine)) || raise(Fog::Vsphere::Errors::NotFound)
673
672
  rescue Fog::Vsphere::Errors::NotFound
674
673
  new_vm = nil
675
674
  end
676
- }
675
+ end
677
676
  raise Fog::Vsphere::Errors::NotFound unless new_vm
678
677
  end
679
678
  end
680
679
  else
681
- task = vm_mob_ref.CloneVM_Task(:folder => dest_folder,
682
- :name => options['name'],
683
- :spec => clone_spec)
680
+ task = vm_mob_ref.CloneVM_Task(folder: dest_folder,
681
+ name: options['name'],
682
+ spec: clone_spec)
684
683
  # Waiting for the VM to complete allows us to get the VirtulMachine
685
684
  # object of the new machine when it's done. It is HIGHLY recommended
686
685
  # to set 'wait' => true if your app wants to wait. Otherwise, you're
687
686
  # going to have to reload the server model over and over which
688
687
  # generates a lot of time consuming API calls to vmware.
689
- if options.fetch('wait', true) then
688
+ if options.fetch('wait', true)
690
689
  # REVISIT: It would be awesome to call a block passed to this
691
690
  # request to notify the application how far along in the process we
692
691
  # are. I'm thinking of updating a progress bar, etc...
693
692
  new_vm = task.wait_for_completion
694
693
  else
695
694
  new_vm = nil
696
- Fog.wait_for(150, 15) {
695
+ Fog.wait_for(150, 15) do
697
696
  begin
698
- new_vm = dest_folder.find(options['name'], RbVmomi::VIM::VirtualMachine) or raise Fog::Vsphere::Errors::NotFound
697
+ (new_vm = dest_folder.find(options['name'], RbVmomi::VIM::VirtualMachine)) || raise(Fog::Vsphere::Errors::NotFound)
699
698
  rescue Fog::Vsphere::Errors::NotFound
700
699
  new_vm = nil
701
700
  end
702
- }
701
+ end
703
702
  raise Fog::Vsphere::Errors::NotFound unless new_vm
704
703
  end
705
704
  end
@@ -715,37 +714,38 @@ module Fog
715
714
  # Build up the network config spec for simple case:
716
715
  # simple case: apply just the network_label, nic_type and network_adapter_device_key
717
716
  def modify_template_nics_simple_spec(network_label, nic_type, network_adapter_device_key, datacenter)
718
- config_spec_operation = RbVmomi::VIM::VirtualDeviceConfigSpecOperation('edit')
719
- # Get the portgroup and handle it from there.
720
- network = get_raw_network(network_label, datacenter)
721
- if ( network.kind_of? RbVmomi::VIM::DistributedVirtualPortgroup)
722
- # Create the NIC backing for the distributed virtual portgroup
723
- nic_backing_info = RbVmomi::VIM::VirtualEthernetCardDistributedVirtualPortBackingInfo(
724
- :port => RbVmomi::VIM::DistributedVirtualSwitchPortConnection(
725
- :portgroupKey => network.key,
726
- :switchUuid => network.config.distributedVirtualSwitch.uuid
727
- )
728
- )
729
- else
730
- # Otherwise it's a non distributed port group
731
- nic_backing_info = RbVmomi::VIM::VirtualEthernetCardNetworkBackingInfo(:deviceName => network_label)
732
- end
733
- connectable = RbVmomi::VIM::VirtualDeviceConnectInfo(
734
- :allowGuestControl => true,
735
- :connected => true,
736
- :startConnected => true)
737
- device = RbVmomi::VIM.public_send "#{nic_type}",
738
- :backing => nic_backing_info,
739
- :deviceInfo => RbVmomi::VIM::Description(:label => "Network adapter 1", :summary => network_label),
740
- :key => network_adapter_device_key,
741
- :connectable => connectable
742
- device_spec = RbVmomi::VIM::VirtualDeviceConfigSpec(
743
- :operation => config_spec_operation,
744
- :device => device)
745
- return device_spec
717
+ config_spec_operation = RbVmomi::VIM::VirtualDeviceConfigSpecOperation('edit')
718
+ # Get the portgroup and handle it from there.
719
+ network = get_raw_network(network_label, datacenter)
720
+ nic_backing_info = if network.is_a? RbVmomi::VIM::DistributedVirtualPortgroup
721
+ # Create the NIC backing for the distributed virtual portgroup
722
+ RbVmomi::VIM::VirtualEthernetCardDistributedVirtualPortBackingInfo(
723
+ port: RbVmomi::VIM::DistributedVirtualSwitchPortConnection(
724
+ portgroupKey: network.key,
725
+ switchUuid: network.config.distributedVirtualSwitch.uuid
726
+ )
727
+ )
728
+ else
729
+ # Otherwise it's a non distributed port group
730
+ RbVmomi::VIM::VirtualEthernetCardNetworkBackingInfo(deviceName: network_label)
731
+ end
732
+ connectable = RbVmomi::VIM::VirtualDeviceConnectInfo(
733
+ allowGuestControl: true,
734
+ connected: true,
735
+ startConnected: true
736
+ )
737
+ device = RbVmomi::VIM.public_send nic_type.to_s,
738
+ backing: nic_backing_info,
739
+ deviceInfo: RbVmomi::VIM::Description(label: 'Network adapter 1', summary: network_label),
740
+ key: network_adapter_device_key,
741
+ connectable: connectable
742
+ device_spec = RbVmomi::VIM::VirtualDeviceConfigSpec(
743
+ operation: config_spec_operation,
744
+ device: device
745
+ )
746
+ device_spec
746
747
  end
747
748
 
748
-
749
749
  def modify_template_nics_specs(vm_mob_ref, nics, datacenter)
750
750
  specs = []
751
751
  template_nics = vm_mob_ref.config.hardware.device.grep(RbVmomi::VIM::VirtualEthernetCard)
@@ -754,14 +754,14 @@ module Fog
754
754
 
755
755
  template_nics.zip(modified_nics).each do |template_nic, new_nic|
756
756
  if new_nic
757
- backing = create_nic_backing(new_nic, {datacenter: datacenter})
757
+ backing = create_nic_backing(new_nic, datacenter: datacenter)
758
758
  template_nic.backing = backing
759
759
  template_nic.addressType = 'generated'
760
760
  template_nic.macAddress = nil
761
761
  connectable = RbVmomi::VIM::VirtualDeviceConnectInfo(
762
- :allowGuestControl => true,
763
- :connected => true,
764
- :startConnected => true
762
+ allowGuestControl: true,
763
+ connected: true,
764
+ startConnected: true
765
765
  )
766
766
  template_nic.connectable = connectable
767
767
  specs << {
@@ -770,12 +770,12 @@ module Fog
770
770
  }
771
771
  else
772
772
  interface = Fog::Compute::Vsphere::Interface.new(raw_to_hash(template_nic))
773
- specs << create_interface(interface, interface.key, :remove, :datacenter => datacenter)
773
+ specs << create_interface(interface, interface.key, :remove, datacenter: datacenter)
774
774
  end
775
775
  end
776
776
 
777
777
  new_nics.each do |interface|
778
- specs << create_interface(interface, 0, :add, :datacenter => datacenter)
778
+ specs << create_interface(interface, 0, :add, datacenter: datacenter)
779
779
  end
780
780
 
781
781
  specs
@@ -796,11 +796,11 @@ module Fog
796
796
  end
797
797
  template_volume.backing.diskMode = new_volume.mode
798
798
  template_volume.backing.thinProvisioned = new_volume.thin
799
- specs << { :operation => :edit, :device => template_volume }
799
+ specs << { operation: :edit, device: template_volume }
800
800
  else
801
- specs << { :operation => :remove,
802
- :fileOperation => :destroy,
803
- :device => template_volume }
801
+ specs << { operation: :remove,
802
+ fileOperation: :destroy,
803
+ device: template_volume }
804
804
  end
805
805
  end
806
806
  specs.concat(new_volumes.map { |volume| create_disk(volume) })
@@ -814,7 +814,7 @@ module Fog
814
814
  specs = []
815
815
  template_volumes.zip(modified_volumes).each do |template_volume, new_volume|
816
816
  if new_volume && new_volume.datastore && new_volume.datastore != template_volume.backing.datastore.name
817
- specs << { :diskId => template_volume.key, :datastore => get_raw_datastore(new_volume.datastore, datacenter) }
817
+ specs << { diskId: template_volume.key, datastore: get_raw_datastore(new_volume.datastore, datacenter) }
818
818
  end
819
819
  end
820
820
  specs
@@ -826,25 +826,23 @@ module Fog
826
826
  def vm_clone(options = {})
827
827
  # Option handling TODO Needs better method of checking
828
828
  options = vm_clone_check_options(options)
829
- notfound = lambda { raise Fog::Compute::Vsphere::NotFound, "Could not find VM template" }
829
+ notfound = -> { raise Fog::Compute::Vsphere::NotFound, 'Could not find VM template' }
830
830
  template = list_virtual_machines.find(notfound) do |vm|
831
- vm['name'] == options['template_path'].split("/")[-1]
831
+ vm['name'] == options['template_path'].split('/')[-1]
832
832
  end
833
833
 
834
834
  # generate a random id
835
- id = [8,4,4,4,12].map{|i| Fog::Mock.random_hex(i)}.join("-")
836
- new_vm = template.clone.merge({
837
- "name" => options['name'],
838
- "id" => id,
839
- "instance_uuid" => id,
840
- "path" => "/Datacenters/#{options['datacenter']}/#{options['dest_folder'] ? options['dest_folder']+"/" : ""}#{options['name']}"
841
- })
842
- self.data[:servers][id] = new_vm
835
+ id = [8, 4, 4, 4, 12].map { |i| Fog::Mock.random_hex(i) }.join('-')
836
+ new_vm = template.clone.merge('name' => options['name'],
837
+ 'id' => id,
838
+ 'instance_uuid' => id,
839
+ 'path' => "/Datacenters/#{options['datacenter']}/#{options['dest_folder'] ? options['dest_folder'] + '/' : ''}#{options['name']}")
840
+ data[:servers][id] = new_vm
843
841
 
844
842
  {
845
843
  'vm_ref' => "vm-#{Fog::Mock.random_numbers(3)}",
846
844
  'new_vm' => new_vm,
847
- 'task_ref' => "task-#{Fog::Mock.random_numbers(4)}",
845
+ 'task_ref' => "task-#{Fog::Mock.random_numbers(4)}"
848
846
  }
849
847
  end
850
848
  end