fog-vsphere 2.4.0 → 2.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d5281df844dc5370c7eeb4aa1b6d062edc780650cfa26143ef122a9f719b1305
4
- data.tar.gz: ddd9c2dfe8393e74aa74267406f23638047f52ae426dcb98b30d0db64666e5d2
3
+ metadata.gz: 45a6779fc97119bf814c810a3953731bb574e97dc2a806922cfe7291f34c5acb
4
+ data.tar.gz: 8606ad0e48b0715b2cfcbbc4e2d1e5976f93a6bce82942fb456d8c3acdd37b85
5
5
  SHA512:
6
- metadata.gz: cf18dc5cee08a4be3919c5473237ad83ba609d95868891dd7afb43d8d0aacd4d89ff05f211e3a89e25610aa3b5ee0da75f846fbbfdd7a3d1e3b9301d860f7586
7
- data.tar.gz: 597988c88827a950b9ff4ab4363c344f72ebca5833cae3397358ddab8fae9f4f63813c8fa54826c3c2956e0469898165e582f4ef17406c22bd95d1b9c1fd34fd
6
+ metadata.gz: 02a8cf0c88859c98f9afb68f69b78b634e7db977a37ee457923c7bcad9cfe75721663bd353a974f16c9dbd3a93b11b5341f89a0b5e23836cf25b110a66925702
7
+ data.tar.gz: e01bdf1f3c62f9be49e1a0d056823e411c49d5d95d736c3e668549442f9a36eafd9d6622b9f61126934f59eb96ce319abc94bf9aefa254265bf6cdc1d9927e49
@@ -6,3 +6,36 @@ AllCops:
6
6
 
7
7
  Style/Documentation:
8
8
  Enabled: false
9
+
10
+ HashSyntax:
11
+ Enabled: false # don't force 1.9 hash syntax
12
+
13
+ Style/StringLiterals:
14
+ Enabled: false # dont't enforce
15
+
16
+ Style/WordArray:
17
+ Enabled: false
18
+
19
+ Style/GuardClause:
20
+ Enabled: false # don't enforce this
21
+
22
+ Layout/SpaceInsideHashLiteralBraces:
23
+ Enabled: false
24
+
25
+ Metrics/AbcSize:
26
+ Enabled: false
27
+
28
+ Metrics/CyclomaticComplexity:
29
+ Enabled : false
30
+
31
+ Metrics/PerceivedComplexity:
32
+ Enabled: false
33
+
34
+ Performance/Casecmp:
35
+ Enabled: false
36
+
37
+ Style/RescueModifier:
38
+ Enabled: false
39
+
40
+ Metrics/MethodLength:
41
+ Max: 45
@@ -1,6 +1,6 @@
1
1
  # This configuration was generated by
2
2
  # `rubocop --auto-gen-config`
3
- # on 2018-04-18 16:02:28 +0200 using RuboCop version 0.50.0.
3
+ # on 2018-11-15 11:16:00 -0500 using RuboCop version 0.49.1.
4
4
  # The point is for the user to remove these configuration records
5
5
  # one by one as the offenses are removed from the code base.
6
6
  # Note that changes in the inspected code, or installation of new
@@ -26,20 +26,6 @@ Lint/EndAlignment:
26
26
  - 'lib/fog/vsphere/requests/compute/create_vm.rb'
27
27
  - 'lib/fog/vsphere/requests/compute/host_start_maintenance.rb'
28
28
 
29
- # Offense count: 2
30
- Lint/InterpolationCheck:
31
- Exclude:
32
- - 'tests/requests/compute/vm_power_off_tests.rb'
33
- - 'tests/requests/compute/vm_suspend_tests.rb'
34
-
35
- # Offense count: 13
36
- Lint/RescueWithoutErrorClass:
37
- Exclude:
38
- - 'lib/fog/vsphere/compute.rb'
39
- - 'lib/fog/vsphere/requests/compute/list_hosts.rb'
40
- - 'lib/fog/vsphere/requests/compute/list_vm_cdroms.rb'
41
- - 'lib/fog/vsphere/requests/compute/list_vm_volumes.rb'
42
-
43
29
  # Offense count: 3
44
30
  Lint/ShadowingOuterLocalVariable:
45
31
  Exclude:
@@ -60,14 +46,14 @@ Lint/UselessAssignment:
60
46
  - 'lib/fog/vsphere/requests/compute/vm_migrate.rb'
61
47
  - 'tests/requests/compute/vm_clone_tests.rb'
62
48
 
63
- # Offense count: 57
49
+ # Offense count: 64
64
50
  Metrics/AbcSize:
65
- Max: 633
51
+ Max: 635
66
52
 
67
53
  # Offense count: 12
68
54
  # Configuration parameters: CountComments, ExcludedMethods.
69
55
  Metrics/BlockLength:
70
- Max: 263
56
+ Max: 264
71
57
 
72
58
  # Offense count: 21
73
59
  # Configuration parameters: CountBlocks.
@@ -77,22 +63,22 @@ Metrics/BlockNesting:
77
63
  # Offense count: 6
78
64
  # Configuration parameters: CountComments.
79
65
  Metrics/ClassLength:
80
- Max: 452
66
+ Max: 284
81
67
 
82
- # Offense count: 15
68
+ # Offense count: 19
83
69
  Metrics/CyclomaticComplexity:
84
- Max: 150
70
+ Max: 151
85
71
 
86
- # Offense count: 16
72
+ # Offense count: 819
87
73
  # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
88
74
  # URISchemes: http, https
89
75
  Metrics/LineLength:
90
76
  Max: 317
91
77
 
92
- # Offense count: 72
78
+ # Offense count: 80
93
79
  # Configuration parameters: CountComments.
94
80
  Metrics/MethodLength:
95
- Max: 356
81
+ Max: 358
96
82
 
97
83
  # Offense count: 1
98
84
  # Configuration parameters: CountComments.
@@ -104,31 +90,9 @@ Metrics/ModuleLength:
104
90
  Metrics/ParameterLists:
105
91
  Max: 6
106
92
 
107
- # Offense count: 16
93
+ # Offense count: 20
108
94
  Metrics/PerceivedComplexity:
109
- Max: 158
110
-
111
- # Offense count: 1
112
- # Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist.
113
- # NamePrefix: is_, has_, have_
114
- # NamePrefixBlacklist: is_, has_, have_
115
- # NameWhitelist: is_a?
116
- Naming/PredicateName:
117
- Exclude:
118
- - 'spec/**/*'
119
- - 'lib/fog/vsphere/compute.rb'
120
-
121
- # Offense count: 15
122
- # Configuration parameters: EnforcedStyle, SupportedStyles.
123
- # SupportedStyles: snake_case, camelCase
124
- Naming/VariableName:
125
- Exclude:
126
- - 'lib/fog/vsphere/requests/compute/create_vm.rb'
127
- - 'lib/fog/vsphere/requests/compute/list_datacenters.rb'
128
- - 'lib/fog/vsphere/requests/compute/list_resource_pools.rb'
129
- - 'lib/fog/vsphere/requests/compute/list_server_types.rb'
130
- - 'lib/fog/vsphere/requests/compute/vm_clone.rb'
131
- - 'tests/compute_tests.rb'
95
+ Max: 159
132
96
 
133
97
  # Offense count: 10
134
98
  Style/CaseEquality:
@@ -152,7 +116,7 @@ Style/DoubleNegation:
152
116
  Exclude:
153
117
  - 'tests/helpers/succeeds_helper.rb'
154
118
 
155
- # Offense count: 12
119
+ # Offense count: 14
156
120
  # Configuration parameters: MinBodyLength.
157
121
  Style/GuardClause:
158
122
  Exclude:
@@ -165,6 +129,7 @@ Style/GuardClause:
165
129
  - 'lib/fog/vsphere/requests/compute/create_vm.rb'
166
130
  - 'lib/fog/vsphere/requests/compute/list_resource_pools.rb'
167
131
  - 'lib/fog/vsphere/requests/compute/list_server_types.rb'
132
+ - 'lib/fog/vsphere/requests/compute/vm_relocate.rb'
168
133
 
169
134
  # Offense count: 2
170
135
  Style/IfInsideElse:
@@ -199,6 +164,22 @@ Style/PercentLiteralDelimiters:
199
164
  Exclude:
200
165
  - 'Rakefile'
201
166
 
167
+ # Offense count: 1
168
+ # Configuration parameters: NamePrefix, NamePrefixBlacklist, NameWhitelist.
169
+ # NamePrefix: is_, has_, have_
170
+ # NamePrefixBlacklist: is_, has_, have_
171
+ # NameWhitelist: is_a?
172
+ Style/PredicateName:
173
+ Exclude:
174
+ - 'spec/**/*'
175
+ - 'lib/fog/vsphere/compute.rb'
176
+
177
+ # Offense count: 2
178
+ # Cop supports --auto-correct.
179
+ Style/RedundantSelf:
180
+ Exclude:
181
+ - 'lib/fog/vsphere/models/compute/volume.rb'
182
+
202
183
  # Offense count: 3
203
184
  # Cop supports --auto-correct.
204
185
  # Configuration parameters: EnforcedStyle, SupportedStyles, AllowInnerSlashes.
@@ -215,3 +196,14 @@ Style/RegexpLiteral:
215
196
  Style/Semicolon:
216
197
  Exclude:
217
198
  - 'tests/models/compute/rules_tests.rb'
199
+
200
+ # Offense count: 14
201
+ # Configuration parameters: EnforcedStyle, SupportedStyles.
202
+ # SupportedStyles: snake_case, camelCase
203
+ Style/VariableName:
204
+ Exclude:
205
+ - 'lib/fog/vsphere/requests/compute/create_vm.rb'
206
+ - 'lib/fog/vsphere/requests/compute/list_datacenters.rb'
207
+ - 'lib/fog/vsphere/requests/compute/list_resource_pools.rb'
208
+ - 'lib/fog/vsphere/requests/compute/list_server_types.rb'
209
+ - 'lib/fog/vsphere/requests/compute/vm_clone.rb'
@@ -20,7 +20,8 @@ matrix:
20
20
  gemfile: Gemfile
21
21
  script: bundle exec rake travis:ci
22
22
  notifications:
23
- email: false
23
+ email:
24
+ - chrobert@redhat.com
24
25
  addons:
25
26
  code_climate:
26
27
  repo_token: 44bcd04b60228fc94f2be3a5e0346441b5ea156e94e89a17fc24c5d3de483721
@@ -1,4 +1,16 @@
1
+ ## v2.5.0
2
+
3
+ * Expose extraConfig from user_data for vm_clone #172
4
+ * Support getting folder types other than vm folder #171
5
+ * Vm_clone: ERROR if options['volumes'] is not specified #170
6
+ * Patch attribute[:datacenter] for create interface #167
7
+ * Add required datacenter param to all calls which may use get_vm_interface #165
8
+ * Add option to relocate vm's datastore #164
9
+ * Add cpu_hz attribute to host (#162)
10
+ * Fix adding 8th volume to vm (#146)
11
+
1
12
  ## v2.4.0
13
+
2
14
  * improve folder loading performance (#158)
3
15
  * improve storage pod loading performance (#160)
4
16
  * improve datastore loading performance (#159)
@@ -8,18 +20,22 @@
8
20
  * add server guard to unit_number calculation (#152)
9
21
 
10
22
  ## v2.3.0
23
+
11
24
  * set volume unit_number when cloning a vm (#151)
12
25
  * add unclustered esxi hosts back to cluster selection (#149)
13
26
  * reduce the time required to list networks (#145)
14
27
 
15
28
  ## v2.2.0
29
+
16
30
  * vm interface updating needs a datacenter as option (#140)
17
31
  * improve vm saving to use a single api call and support network changes (#142)
18
32
 
19
33
  ## v2.1.1
34
+
20
35
  * fixes an issue where networks of type DVPort cannot be listed (#137)
21
36
 
22
37
  ## v2.1.0
38
+
23
39
  * fixes two issues that broke vm cloning (#134, #135)
24
40
  * performance of host listing was improved (#131)
25
41
  * networks have a vlan property (#129)
@@ -1,5 +1,5 @@
1
1
  require 'digest/sha2'
2
-
2
+ # rubocop:disable Lint/RescueWithoutErrorClass
3
3
  module Fog
4
4
  module Compute
5
5
  class Vsphere < Fog::Service
@@ -182,6 +182,7 @@ module Fog
182
182
  props_to_attr_hash vm_mob_ref, props
183
183
  end
184
184
 
185
+ # rubocop:disable Metrics/MethodLength
185
186
  def props_to_attr_hash(vm_mob_ref, props)
186
187
  # NOTE: Object.tap is in 1.8.7 and later.
187
188
  # Here we create the hash object that this method returns, but first we need
@@ -249,6 +250,7 @@ module Fog
249
250
  # provides both real RbVmomi object and its name.
250
251
  # e.g.
251
252
  # [Datacenter("datacenter-2"), "dc-name"]
253
+ # rubocop:enable Metrics/MethodLength
252
254
  def parent_attribute(path, type)
253
255
  element = case type
254
256
  when :datacenter
@@ -277,7 +279,7 @@ module Fog
277
279
 
278
280
  class Mock
279
281
  include Shared
280
-
282
+ # rubocop:disable Metrics/MethodLength
281
283
  def self.data
282
284
  @data ||= Hash.new do |hash, key|
283
285
  hash[key] = {
@@ -537,6 +539,7 @@ module Fog
537
539
  cpu_cores: 20,
538
540
  cpu_sockets: 2,
539
541
  cpu_threads: 40,
542
+ cpu_hz: 2_599_999_534,
540
543
  memory: 824_597_241_856,
541
544
  product_version: '6.0.0',
542
545
  vm_ids: ['5032c8a5-9c5e-ba7a-3804-832a03e16381', '502916a3-b42e-17c7-43ce-b3206e9524dc']
@@ -546,6 +549,7 @@ module Fog
546
549
  end
547
550
  end
548
551
 
552
+ # rubocop:enable Metrics/MethodLength
549
553
  def initialize(options = {})
550
554
  require 'rbvmomi'
551
555
  @vsphere_username = options[:vsphere_username]
@@ -9,6 +9,7 @@ module Fog
9
9
  attribute :cpu_cores
10
10
  attribute :cpu_sockets
11
11
  attribute :cpu_threads
12
+ attribute :cpu_hz
12
13
  attribute :memory
13
14
  attribute :uuid
14
15
  attribute :ipaddress
@@ -44,7 +44,7 @@ module Fog
44
44
  def destroy
45
45
  requires :server_id, :key, :type
46
46
 
47
- service.destroy_vm_interface(server_id, key: key, type: type)
47
+ service.destroy_vm_interface(server_id, key: key, type: type, datacenter: server.datacenter)
48
48
  end
49
49
 
50
50
  def save
@@ -55,6 +55,7 @@ module Fog
55
55
  # and thus the highest :key value must correspond to the created interface. Since this has an inherent race
56
56
  # condition we need to gate the saves.
57
57
  SAVE_MUTEX.synchronize do
58
+ attributes[:datacenter] = server.datacenter unless attributes.key?(:datacenter)
58
59
  data = service.add_vm_interface(server_id, attributes)
59
60
 
60
61
  if data['task_state'] == 'success'
@@ -29,7 +29,7 @@ module Fog
29
29
 
30
30
  case server
31
31
  when Fog::Compute::Vsphere::Server
32
- interface = service.get_vm_interface(server.id, key: id, mac: id, name: id)
32
+ interface = service.get_vm_interface(server.id, key: id, mac: id, name: id, datacenter: server.datacenter)
33
33
  when Fog::Compute::Vsphere::Template
34
34
  interface = service.get_template_interfaces(server.id, key: id, mac: id, name: id)
35
35
  else
@@ -230,6 +230,7 @@ module Fog
230
230
 
231
231
  def update_interface(attrs)
232
232
  wait_for { !ready? } if interface_ready? attrs
233
+ attrs[:datacenter] = datacenter unless attrs.key? :datacenter
233
234
  service.update_vm_interface(id, attrs)
234
235
  end
235
236
 
@@ -60,8 +60,6 @@ module Fog
60
60
  data = service.add_vm_volume(self)
61
61
 
62
62
  if data['task_state'] == 'success'
63
- self.unit_number += 1 if unit_number >= 7
64
-
65
63
  # We have to query vSphere to get the volume attributes since the task handle doesn't include that info.
66
64
  created = server.volumes.all.find { |volume| volume.unit_number == self.unit_number }
67
65
 
@@ -12,6 +12,7 @@ module Fog
12
12
  # identity expects an hash, REQUIRED
13
13
  # nicSettingMap expects an array
14
14
  # options expects an hash
15
+ # extraConfig expects a hash
15
16
 
16
17
  custom_spec['encryptionKey'] = user_data['encryptionKey'] if user_data.key?('encryptionKey')
17
18
  custom_spec['globalIPSettings'] = user_data['globalIPSettings'] if user_data.key?('globalIPSettings')
@@ -19,6 +20,7 @@ module Fog
19
20
  custom_spec['identity'] = { 'Sysprep' => { 'guiRunOnce' => { 'commandList' => user_data['runcmd'] } } } if user_data.key?('runcmd') && !user_data.key?('identity')
20
21
  custom_spec['nicSettingMap'] = user_data['nicSettingMap'] if user_data.key?('nicSettingMap')
21
22
  custom_spec['options'] = user_data['options'] if user_data.key?('options')
23
+ custom_spec['extraConfig'] = user_data['extraConfig'] if user_data.key?('extraConfig')
22
24
 
23
25
  # for backwards compatability
24
26
  # hostname expects a string, REQUIRED
@@ -50,6 +52,7 @@ module Fog
50
52
  custom_spec['identity'] = user_data['identity'] if user_data.key?('identity')
51
53
  custom_spec['nicSettingMap'] = user_data['nicSettingMap'] if user_data.key?('nicSettingMap')
52
54
  custom_spec['options'] = user_data['options'] if user_data.key?('options')
55
+ custom_spec['extraConfig'] = user_data['extraConfig'] if user_data.key?('extraConfig')
53
56
  custom_spec['hostname'] = user_data['hostname'] if user_data.key?('hostname')
54
57
  custom_spec['ipsettings'] = { 'ip' => user_data['ip'] } if user_data.key?('ip')
55
58
  custom_spec['ipsettings']['subnetMask'] = user_data['netmask'] if user_data.key?('netmask')
@@ -14,8 +14,9 @@ module Fog
14
14
  raw_datacenters.find { |d| d.name == name } || get_raw_datacenter(name)
15
15
  end
16
16
 
17
- def get_raw_datacenter(name)
18
- connection.serviceInstance.find_datacenter(name)
17
+ # @note RbVmomi takes path instead of name as argument to find datacenter
18
+ def get_raw_datacenter(path)
19
+ connection.serviceInstance.find_datacenter(path)
19
20
  end
20
21
  end
21
22
 
@@ -4,33 +4,32 @@ module Fog
4
4
  class Real
5
5
  def get_folder(path, datacenter_name, type = nil)
6
6
  type ||= 'vm'
7
-
8
7
  # Cycle through all types of folders.
9
- case type
10
- when 'vm', :vm
11
- # if you're a vm then grab the VM.
12
- folder = get_raw_vmfolder(path, datacenter_name)
13
- raise(Fog::Compute::Vsphere::NotFound) unless folder
14
- folder_attributes(folder, datacenter_name)
15
- when 'network', :network
16
- raise 'not implemented'
17
- when 'datastore', :datastore
18
- raise 'not implemented'
19
- else
20
- raise ArgumentError, "#{type} is unknown"
21
- end
8
+ folder = get_raw_folder(path, datacenter_name, type)
9
+ raise(Fog::Compute::Vsphere::NotFound) unless folder
10
+ folder_attributes(folder, datacenter_name)
22
11
  end
23
12
 
24
13
  protected
25
14
 
26
- def get_raw_vmfolder(path, datacenter_name)
15
+ def get_raw_folder(path, datacenter_name_or_obj, type)
27
16
  # The required path syntax - 'topfolder/subfolder
28
17
 
29
18
  # Clean up path to be relative since we're providing datacenter name
30
- dc = find_raw_datacenter(datacenter_name)
31
- dc_root_folder = dc.vmFolder
19
+ dc = if datacenter_name_or_obj.is_a?(String)
20
+ find_raw_datacenter(datacenter_name_or_obj)
21
+ else
22
+ datacenter_name_or_obj
23
+ end
24
+
25
+ valid_types = %w[vm network datastore host]
26
+ raise ArgumentError, "#{type} is unknown" if type.blank?
27
+ raise "Invalid type (#{type}). Must be one of #{valid_types.join(', ')} " unless valid_types.include?(type.to_s)
28
+ meth = "#{type}Folder"
29
+ dc_root_folder = dc.send(meth)
30
+
32
31
  # Filter the root path for this datacenter not to be used."
33
- dc_root_folder_path = dc_root_folder.path.map { |_id, name| name }.join('/')
32
+ dc_root_folder_path = dc_root_folder.path.map { |_, name| name }.join('/')
34
33
  paths = path.sub(/^\/?#{Regexp.quote(dc_root_folder_path)}\/?/, '').split('/')
35
34
 
36
35
  return dc_root_folder if paths.empty?
@@ -46,6 +45,10 @@ module Fog
46
45
  end
47
46
  end
48
47
 
48
+ def get_raw_vmfolder(path, datacenter_name)
49
+ get_raw_folder(path, datacenter_name, 'vm')
50
+ end
51
+
49
52
  def folder_attributes(folder, datacenter_name)
50
53
  {
51
54
  id: managed_obj_id(folder),
@@ -65,6 +68,7 @@ module Fog
65
68
  return :vm if types.include?('VirtualMachine')
66
69
  return :network if types.include?('Network')
67
70
  return :datastore if types.include?('Datastore')
71
+ return :host if types.include?('ComputeResource')
68
72
  end
69
73
  end
70
74
 
@@ -1,3 +1,4 @@
1
+ # rubocop:disable Lint/RescueWithoutErrorClass
1
2
  module Fog
2
3
  module Compute
3
4
  class Vsphere
@@ -77,6 +78,7 @@ module Fog
77
78
  cpu_cores: 'hardware.cpuInfo.numCpuCores',
78
79
  cpu_sockets: 'hardware.cpuInfo.numCpuPackages',
79
80
  cpu_threads: 'hardware.cpuInfo.numCpuThreads',
81
+ cpu_hz: 'hardware.cpuInfo.hz',
80
82
  memory: 'hardware.memorySize',
81
83
  uuid: 'hardware.systemInfo.uuid',
82
84
  model: 'hardware.systemInfo.model',
@@ -1,3 +1,4 @@
1
+ # rubocop:disable Lint/RescueWithoutErrorClass
1
2
  module Fog
2
3
  module Compute
3
4
  class Vsphere
@@ -1,3 +1,4 @@
1
+ # rubocop:disable Lint/RescueWithoutErrorClass
1
2
  module Fog
2
3
  module Compute
3
4
  class Vsphere
@@ -13,7 +13,7 @@ module Fog
13
13
  raise ArgumentError, 'instance id is a required parameter' unless vmid
14
14
 
15
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)] })
16
+ vm_reconfig_hardware('instance_uuid' => vmid, 'hardware_spec' => { 'deviceChange' => [create_interface(interface, interface.key, :remove, options)] })
17
17
  end
18
18
 
19
19
  def update_vm_interface(vmid, options = {})
@@ -93,6 +93,7 @@ module Fog
93
93
  # existing disks as well as add or remove them. The
94
94
  # resizing is applied only when the size is bigger then the
95
95
  # in size in the template
96
+ # rubocop:disable Metrics/MethodLength
96
97
  def vm_clone(options = {})
97
98
  # Option handling
98
99
  options = vm_clone_check_options(options)
@@ -631,7 +632,9 @@ module Fog
631
632
  end
632
633
  # relocate templates is not supported by fog-vsphere when vm is cloned on a storage pod
633
634
  unless options.key?('storage_pod')
634
- relocation_spec[:disk] = relocate_template_volumes_specs(vm_mob_ref, options['volumes'], options['datacenter'])
635
+ unless options['volumes'].blank?
636
+ relocation_spec[:disk] = relocate_template_volumes_specs(vm_mob_ref, options['volumes'], options['datacenter'])
637
+ end
635
638
  end
636
639
  # And the clone specification
637
640
  clone_spec = RbVmomi::VIM.VirtualMachineCloneSpec(location: relocation_spec,
@@ -711,6 +714,7 @@ module Fog
711
714
  'task_ref' => task._ref
712
715
  }
713
716
  end
717
+ # rubocop:enable Metrics/MethodLength
714
718
 
715
719
  # Build up the network config spec for simple case:
716
720
  # simple case: apply just the network_label, nic_type and network_adapter_device_key
@@ -2,18 +2,31 @@ module Fog
2
2
  module Compute
3
3
  class Vsphere
4
4
  class Real
5
- # Clones a VM from a template or existing machine on your vSphere
6
- # Server.
5
+ # Relocates a VM to different host or datastore.
7
6
  #
8
7
  # ==== Parameters
9
8
  # * options<~Hash>:
10
9
  # * 'instance_uuid'<~String> - *REQUIRED* VM to relocate
11
10
  # * 'host'<~String> - name of host which will run the VM.
11
+ # * 'cluster'<~String> - name of cluster where host is.
12
+ # Only works with clusters within same datacenter as
13
+ # where vm is running. Defaults to vm's host's cluster.
14
+ # * 'datacenter'<~String> - name of datacenter where host is.
15
+ # It must be same datacenter as where vm is running.
16
+ # Defaults to vm's datacenter.
17
+ # * 'datastore'<~String> - name of datastore where VM will
18
+ # be located.
12
19
  # * 'pool'<~String> - name of pool which the VM should be
13
20
  # attached.
14
21
  # * 'disks'<~Array> - disks to relocate. Each disk is a
15
22
  # hash with diskId wich is key attribute of volume,
16
- # and datastore to relocate to.
23
+ # and datastore to relocate to. diskBackingInfo can be provided,
24
+ # with type FlatVer2 or SeSparse
25
+ # Example: [{
26
+ # 'diskId' => 2000,
27
+ # 'datastore' => 'datastore_name',
28
+ # 'diskBackingInfo' => {'type' => 'FlatVer2', ...}
29
+ # }]
17
30
  def vm_relocate(options = {})
18
31
  raise ArgumentError, 'instance_uuid is a required parameter' unless options.key? 'instance_uuid'
19
32
 
@@ -25,14 +38,25 @@ module Fog
25
38
  raise Fog::Vsphere::Errors::NotFound,
26
39
  "Could not find VirtualMachine with instance uuid #{options['instance_uuid']}"
27
40
  end
28
- options['host'] = get_raw_host(options['host'], options['cluster'], options['datacenter']) if options['host']
41
+ datacenter = options['datacenter'] || get_vm_datacenter(vm_mob_ref)
42
+ cluster_name = options['cluster'] || get_vm_cluster(vm_mob_ref)
43
+
44
+ options['host'] = get_raw_host(options['host'], cluster_name, datacenter) if options['host']
45
+ options['datastore'] = get_raw_datastore(options['datastore'], datacenter) if options.key?('datastore')
46
+
29
47
  if options['disks']
30
48
  options['disks'] = options['disks'].map do |disk|
31
- disk['datastore'] = get_raw_datastore(disk['datastore'], nil)
49
+ disk['datastore'] = get_raw_datastore(disk['datastore'], datacenter)
50
+ if disk['diskBackingInfo'] && disk['diskBackingInfo']['type']
51
+ backing_type = "VirtualDisk#{disk['diskBackingInfo'].delete('type')}BackingInfo"
52
+ disk['diskBackingInfo'] = RbVmomi::VIM.send(backing_type, disk['diskBackingInfo'])
53
+ end
32
54
  RbVmomi::VIM::VirtualMachineRelocateSpecDiskLocator(disk)
33
55
  end
34
56
  end
57
+
35
58
  spec = RbVmomi::VIM::VirtualMachineRelocateSpec(
59
+ datastore: options['datastore'],
36
60
  pool: options['pool'],
37
61
  host: options['host'],
38
62
  disk: options['disks']
@@ -41,6 +65,30 @@ module Fog
41
65
  task.wait_for_completion
42
66
  { 'task_state' => task.info.state }
43
67
  end
68
+
69
+ def get_vm_datacenter(vm_mob_ref)
70
+ parent = vm_mob_ref.parent
71
+ until parent.is_a?(RbVmomi::VIM::Datacenter)
72
+ if vm_mob_ref.respond_to?(:parent)
73
+ parent = parent.parent
74
+ else
75
+ return
76
+ end
77
+ end
78
+ parent.name
79
+ end
80
+
81
+ def get_vm_cluster(vm_mob_ref)
82
+ parent = vm_mob_ref.runtime.host.parent
83
+ until parent.is_a?(RbVmomi::VIM::ClusterComputeResource)
84
+ if vm_mob_ref.respond_to?(:parent)
85
+ parent = parent.parent
86
+ else
87
+ return
88
+ end
89
+ end
90
+ parent.name
91
+ end
44
92
  end
45
93
 
46
94
  class Mock
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Vsphere
3
- VERSION = '2.4.0'.freeze
3
+ VERSION = '2.5.0'.freeze
4
4
  end
5
5
  end
@@ -10,6 +10,7 @@ Shindo.tests('Fog::Compute[:vsphere]', ['vsphere']) do
10
10
  @parent = @_ref = 'vm-123'
11
11
  end
12
12
 
13
+ # rubocop:disable Style/VariableName
13
14
  def collect!(*_pathSet)
14
15
  { '_ref' => 'vm-123', 'name' => 'fakevm' }
15
16
  end
@@ -14,7 +14,7 @@ Shindo.tests('Fog::Compute[:vsphere] | vm_power_off request', ['vsphere']) do
14
14
  { true => 'cut_power', false => 'shutdown_guest' }.each do |force, expected|
15
15
  tests("When 'force' => #{force}") do
16
16
  response = compute.vm_power_off('instance_uuid' => powered_on_vm, 'force' => force)
17
- test('should retur power_off_type of #{expected}') { response['power_off_type'] == expected }
17
+ test("should retur power_off_type of #{expected}") { response['power_off_type'] == expected }
18
18
  end
19
19
  end
20
20
 
@@ -13,7 +13,7 @@ Shindo.tests('Fog::Compute[:vsphere] | vm_suspend request', ['vsphere']) do
13
13
  { true => 'suspend', false => 'standby_guest' }.each do |force, expected|
14
14
  tests("When 'force' => #{force}") do
15
15
  response = compute.vm_suspend('instance_uuid' => powered_on_vm, 'force' => force)
16
- test('should return suspend_type of #{expected}') { response['suspend_type'] == expected }
16
+ test("should return suspend_type of #{expected}") { response['suspend_type'] == expected }
17
17
  end
18
18
  end
19
19
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fog-vsphere
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - J.R. Garcia
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-16 00:00:00.000000000 Z
11
+ date: 2018-11-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog-core
@@ -328,7 +328,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
328
328
  version: '0'
329
329
  requirements: []
330
330
  rubyforge_project:
331
- rubygems_version: 2.7.3
331
+ rubygems_version: 2.7.7
332
332
  signing_key:
333
333
  specification_version: 4
334
334
  summary: Module for the 'fog' gem to support VMware vSphere.