fog-vsphere 3.1.0 → 3.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fbf8c2995fa660abf28a98251b80558313b774a1bc2e8ef3bc586d45d8064935
4
- data.tar.gz: 5866c48ca90536982c801690532da58552c1eddf41152e375c2b5c5cd7c32607
3
+ metadata.gz: ad810bd0bdd64f88734bbd79e55ec34499638de434018789fee29d7b0e80e18b
4
+ data.tar.gz: 12ee08e303541b65f02314ab02187a04952dd487198bc33e2c84d87591bf8245
5
5
  SHA512:
6
- metadata.gz: e0b9e971137d1514ff5d222a220da02ea4666b9bd57e51d961af17d5a797ce1d48291d6a995a1ab4791521f2021c8b7165c6612896db58be6ac3fd0904daeb4d
7
- data.tar.gz: b775ee968dc815b746ed032bf499230a95fbe7ff8e34a44c12270be68be5708c88effb117462cca0a6d385335297b594fc6ad5e2a9a9aafc5c2d56837410ae73
6
+ metadata.gz: 5635212e1c8379224a31165790df4d2c34c09760e3c6b52e6d2a432500d1ec115f174ab09d264690cbd8d544eaeb9d64a946b96fe195d7531ac124aaec43fe2c
7
+ data.tar.gz: c078f8486725f2749a6c6729952154baf64864e6ce422190680c5b4125f584de5e9739b264f9fea667b49a294fe39ce3d5c1e0e5450522f3172fde86177f00c9
@@ -1,3 +1,7 @@
1
+ ## v3.1.1
2
+
3
+ * Fixes multiple storagePods deployment (#213)
4
+
1
5
  ## v3.1.0
2
6
 
3
7
  * Adds vcr webmock testing basics (#208)
@@ -33,7 +33,7 @@ module Fog
33
33
  # if any volume has a storage_pod set, we deploy the vm on a storage pod instead of the defined datastores
34
34
  pod = get_storage_pod_from_volumes(attributes)
35
35
  vm = if pod
36
- create_vm_on_storage_pod(pod, vm_cfg, vmFolder, resource_pool, attributes[:datacenter], host)
36
+ create_vm_on_storage_pod(pod, attributes[:volumes], vm_cfg, vmFolder, resource_pool, attributes[:datacenter], host)
37
37
  else
38
38
  create_vm_on_datastore(vm_cfg, vmFolder, resource_pool, host)
39
39
  end
@@ -46,15 +46,17 @@ module Fog
46
46
  vm = vmFolder.CreateVM_Task(config: vm_cfg, pool: resource_pool, host: host).wait_for_completion
47
47
  end
48
48
 
49
- def create_vm_on_storage_pod(storage_pod, vm_cfg, vmFolder, resource_pool, datacenter, host = nil)
50
- pod_spec = RbVmomi::VIM::StorageDrsPodSelectionSpec.new(
51
- storagePod: get_raw_storage_pod(storage_pod, datacenter)
52
- )
49
+ # rubocop:disable Metrics/ParameterLists
50
+ def create_vm_on_storage_pod(vm_pod_name, volumes, vm_cfg, vmFolder, resource_pool, datacenter, host = nil)
51
+ disks_per_pod = volumes.group_by(&:storage_pod)
52
+ disks_per_pod[vm_pod_name] ||= []
53
+ disks_per_pod[vm_pod_name].concat(disks_per_pod.delete(nil)) if disks_per_pod.key?(nil)
54
+
53
55
  storage_spec = RbVmomi::VIM::StoragePlacementSpec.new(
54
56
  type: 'create',
55
57
  folder: vmFolder,
56
58
  resourcePool: resource_pool,
57
- podSelectionSpec: pod_spec,
59
+ podSelectionSpec: pod_selection_spec(vm_pod_name, disks_per_pod, datacenter),
58
60
  configSpec: vm_cfg,
59
61
  host: host
60
62
  )
@@ -62,8 +64,11 @@ module Fog
62
64
  result = srm.RecommendDatastores(storageSpec: storage_spec)
63
65
 
64
66
  # if result array contains recommendation, we can apply it
65
- if key = result.recommendations.first.key
66
- result = srm.ApplyStorageDrsRecommendation_Task(key: [key]).wait_for_completion
67
+ # we need one recomendation for one storagePod
68
+ grouped_recoms = result.recommendations.group_by { |rec| rec.target._ref }
69
+ if grouped_recoms.keys.size == disks_per_pod.size
70
+ keys = grouped_recoms.map { |_ref, recoms| recoms.first.key }
71
+ result = srm.ApplyStorageDrsRecommendation_Task(key: keys).wait_for_completion
67
72
  vm = result.vm
68
73
  else
69
74
  raise 'Could not create vm on storage pod, did not get a storage recommendation'
@@ -71,6 +76,21 @@ module Fog
71
76
  vm
72
77
  end
73
78
 
79
+ def pod_selection_spec(vm_pod_name, disks_per_pod, datacenter)
80
+ raw_pods = {}
81
+ disks_per_pod.each_key { |pod_name| raw_pods[pod_name] = get_raw_storage_pod(pod_name, datacenter) }
82
+
83
+ RbVmomi::VIM::StorageDrsPodSelectionSpec.new(
84
+ storagePod: raw_pods[vm_pod_name],
85
+ initialVmConfig: disks_per_pod.map do |name, vols|
86
+ RbVmomi::VIM::VmPodConfigForPlacement.new(
87
+ disk: vols.collect { |vol| RbVmomi::VIM::PodDiskLocator.new(diskId: vol.key) },
88
+ storagePod: raw_pods[name]
89
+ )
90
+ end
91
+ )
92
+ end
93
+
74
94
  # check if a storage pool is set on any of the volumes and return the first result found or nil
75
95
  # return early if vsphere revision is lower than 5 as this is not supported
76
96
  def get_storage_pod_from_volumes(attributes)
@@ -650,14 +650,16 @@ module Fog
650
650
  # Clone VM on a storage pod
651
651
  if options.key?('storage_pod') && !options['storage_pod'].nil?
652
652
  raise ArgumentError, 'need to use at least vsphere revision 5.0 or greater to use storage pods' unless @vsphere_rev.to_f >= 5
653
- pod_spec = RbVmomi::VIM::StorageDrsPodSelectionSpec.new(
654
- storagePod: get_raw_storage_pod(options['storage_pod'], options['datacenter'])
655
- )
653
+ vm_pod_name = options['storage_pod']
654
+ disks_per_pod = options['volumes'].group_by(&:storage_pod)
655
+ disks_per_pod[vm_pod_name] ||= []
656
+ disks_per_pod[vm_pod_name].concat(disks_per_pod.delete(nil)) if disks_per_pod.key?(nil)
657
+
656
658
  storage_spec = RbVmomi::VIM::StoragePlacementSpec.new(
657
659
  type: 'clone',
658
660
  folder: dest_folder,
659
661
  resourcePool: resource_pool,
660
- podSelectionSpec: pod_spec,
662
+ podSelectionSpec: pod_selection_spec(vm_pod_name, disks_per_pod, options['datacenter']),
661
663
  cloneSpec: clone_spec,
662
664
  cloneName: options['name'],
663
665
  vm: vm_mob_ref
@@ -666,8 +668,11 @@ module Fog
666
668
  result = srm.RecommendDatastores(storageSpec: storage_spec)
667
669
 
668
670
  # if result array contains recommendation, we can apply it
669
- if key = result.recommendations.first.key
670
- task = srm.ApplyStorageDrsRecommendation_Task(key: [key])
671
+ # we need one recomendation for one storagePod
672
+ grouped_recoms = result.recommendations.group_by { |rec| rec.target._ref }
673
+ if grouped_recoms.keys.size == disks_per_pod.size
674
+ keys = grouped_recoms.map { |_ref, recoms| recoms.first.key }
675
+ task = srm.ApplyStorageDrsRecommendation_Task(key: keys)
671
676
  if options.fetch('wait', true)
672
677
  result = task.wait_for_completion
673
678
  new_vm = result.vm
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Vsphere
3
- VERSION = '3.1.0'.freeze
3
+ VERSION = '3.1.1'.freeze
4
4
  end
5
5
  end
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: 3.1.0
4
+ version: 3.1.1
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: 2019-06-04 00:00:00.000000000 Z
11
+ date: 2019-06-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog-core