fog-vsphere 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  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.