fog-vsphere 3.1.1 → 3.2.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: ad810bd0bdd64f88734bbd79e55ec34499638de434018789fee29d7b0e80e18b
4
- data.tar.gz: 12ee08e303541b65f02314ab02187a04952dd487198bc33e2c84d87591bf8245
3
+ metadata.gz: 73be829a1d5ffd1d11f38e91c589dc06d13053df3265907615b8ab025d577dc0
4
+ data.tar.gz: fbcffa36f4ea94ae6a3f56a958143593a5a27b84041bc70fb5842830063d288d
5
5
  SHA512:
6
- metadata.gz: 5635212e1c8379224a31165790df4d2c34c09760e3c6b52e6d2a432500d1ec115f174ab09d264690cbd8d544eaeb9d64a946b96fe195d7531ac124aaec43fe2c
7
- data.tar.gz: c078f8486725f2749a6c6729952154baf64864e6ce422190680c5b4125f584de5e9739b264f9fea667b49a294fe39ce3d5c1e0e5450522f3172fde86177f00c9
6
+ metadata.gz: f74b04e50ffc07f9523df9b27e954b4709fb65f347f7c1c1bfadda3c1b0a19953f1e38cf46695041242276a363f8a6feecda18385d00e42230551a5b502868fb
7
+ data.tar.gz: 5a0a583a956180e5bb8bbb2758472c5e510b7f9814af7ecac32cf82f3a736cd348e0c0243f73de5cf94f432dcaa55e40f316ee278b1e5ba97967490dd2b23160
@@ -1,3 +1,11 @@
1
+ ## v3.2.0
2
+
3
+ * Annotation Notes are not set in Image based builds (#218)
4
+
5
+ * Cloning disks thin relocation and storagePod location (#216)
6
+
7
+ * Grab DC if within a folder (#214)
8
+
1
9
  ## v3.1.1
2
10
 
3
11
  * Fixes multiple storagePods deployment (#213)
@@ -56,6 +56,7 @@
56
56
  * Paul Thornthwaite <paul@brightbox.co.uk>
57
57
  * Paul Thornthwaite <tokengeek@gmail.com>
58
58
  * Paulo Henrique Lopes Ribeiro <plribeiro3000@gmail.com>
59
+ * Rohan Arora <roarora@redhat.com>
59
60
  * Rich Daley <rdaley@williamhill.co.uk>
60
61
  * Rich Lane <rlane@club.cc.cmu.edu>
61
62
  * Samuel Keeley <samuel@dropbox.com>
@@ -24,7 +24,7 @@ module Fog
24
24
  end
25
25
 
26
26
  def vm_folders(filters = {})
27
- service.folders({ datacenter: path.join('/'), type: :vm }.merge(filters))
27
+ service.folders({ datacenter: name, type: :vm }.merge(filters))
28
28
  end
29
29
 
30
30
  def virtual_machines(filters = {})
@@ -48,15 +48,11 @@ module Fog
48
48
 
49
49
  # rubocop:disable Metrics/ParameterLists
50
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
-
55
51
  storage_spec = RbVmomi::VIM::StoragePlacementSpec.new(
56
52
  type: 'create',
57
53
  folder: vmFolder,
58
54
  resourcePool: resource_pool,
59
- podSelectionSpec: pod_selection_spec(vm_pod_name, disks_per_pod, datacenter),
55
+ podSelectionSpec: pod_selection_spec(vm_pod_name, group_disks_by_storage_pod(volumes, vm_pod_name), datacenter),
60
56
  configSpec: vm_cfg,
61
57
  host: host
62
58
  )
@@ -76,19 +72,40 @@ module Fog
76
72
  vm
77
73
  end
78
74
 
79
- def pod_selection_spec(vm_pod_name, disks_per_pod, datacenter)
75
+ def group_disks_by_storage_pod(volumes, vm_pod_name: nil)
76
+ vm_pod_name ||= volumes.detect { |v| !v.storage_pod.empty? }.storage_pod
77
+ disks_per_pod = volumes.group_by(&:storage_pod)
78
+ if disks_per_pod.key?(nil)
79
+ disks_per_pod[vm_pod_name] ||= []
80
+ disks_per_pod[vm_pod_name].concat(disks_per_pod.delete(nil))
81
+ end
82
+ disks_per_pod
83
+ end
84
+
85
+ def pod_selection_spec(vm_pod_name, disks_per_pod, datacenter, with_relocation: false, only_volumes: false)
80
86
  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
87
+ raw_pods[vm_pod_name] = get_raw_storage_pod(vm_pod_name, datacenter)
88
+ disks_per_pod.each_key { |pod_name| raw_pods[pod_name] ||= get_raw_storage_pod(pod_name, datacenter) }
89
+
90
+ disk_placements = disks_per_pod.map do |name, vols|
91
+ RbVmomi::VIM::VmPodConfigForPlacement.new(
92
+ disk: vols.collect do |vol|
93
+ locator = RbVmomi::VIM::PodDiskLocator.new(diskId: vol.key)
94
+ locator[:diskBackingInfo] = relocation_volume_backing(vol) if with_relocation
95
+ locator
96
+ end,
97
+ storagePod: raw_pods[name]
98
+ )
99
+ end
100
+ vm_config_placements = []
101
+ vm_config_placements << RbVmomi::VIM::VmPodConfigForPlacement.new(storagePod: raw_pods[vm_pod_name], disk: []) unless only_volumes
102
+ vm_config_placements.concat(disk_placements)
103
+
104
+ spec = RbVmomi::VIM::StorageDrsPodSelectionSpec.new(
105
+ initialVmConfig: vm_config_placements
91
106
  )
107
+ spec[:storagePod] = raw_pods[vm_pod_name] unless only_volumes
108
+ spec
92
109
  end
93
110
 
94
111
  # check if a storage pool is set on any of the volumes and return the first result found or nil
@@ -164,7 +164,8 @@ module Fog
164
164
  device_change << modify_template_nics_simple_spec(options['network_label'], options['nic_type'], options['network_adapter_device_key'], options['datacenter'])
165
165
  end
166
166
  if disks = options['volumes']
167
- device_change.concat(modify_template_volumes_specs(vm_mob_ref, options['volumes'], default_storage_pod: options['storage_pod']))
167
+ device_change.concat(modify_template_volumes_specs(vm_mob_ref, options['volumes']))
168
+ device_change.concat(add_new_volumes_specs(vm_mob_ref, options['volumes'])) unless options['storage_pod']
168
169
  end
169
170
  virtual_machine_config_spec.deviceChange = device_change if device_change.any?
170
171
  # Options['numCPUs'] or Options['memoryMB']
@@ -178,6 +179,7 @@ module Fog
178
179
  virtual_machine_config_spec.cpuHotAddEnabled = options['cpuHotAddEnabled'] if options.key?('cpuHotAddEnabled')
179
180
  virtual_machine_config_spec.memoryHotAddEnabled = options['memoryHotAddEnabled'] if options.key?('memoryHotAddEnabled')
180
181
  virtual_machine_config_spec.firmware = options['firmware'] if options.key?('firmware')
182
+ virtual_machine_config_spec.annotation = options['annotation'] if options.key?('annotation')
181
183
  virtual_machine_config_spec.extraConfig = extra_config(extra_config: options['extraConfig']) if options.key?('extraConfig')
182
184
  if @vsphere_rev.to_f >= 5 && options.key?('boot_order')
183
185
  boot_order = options['boot_order'].flat_map do |boot_device|
@@ -627,18 +629,16 @@ module Fog
627
629
  diskMoveType: :moveChildMostDiskBacking)
628
630
  else
629
631
  relocation_spec = RbVmomi::VIM.VirtualMachineRelocateSpec(pool: resource_pool,
630
- host: host,
631
- transform: options['transform'] || 'sparse')
632
- unless options.key?('storage_pod') && datastore_obj.nil?
632
+ host: host)
633
+ unless options['storage_pod'] && datastore_obj.nil?
633
634
  relocation_spec[:datastore] = datastore_obj
634
635
  end
635
636
  end
636
637
  # relocate templates is not supported by fog-vsphere when vm is cloned on a storage pod
637
- unless options.key?('storage_pod') || !options['volumes']
638
- unless options['volumes'].empty?
639
- relocation_spec[:disk] = relocate_template_volumes_specs(vm_mob_ref, options['volumes'], options['datacenter'])
640
- end
638
+ if !options['storage_pod'] && options['volumes'] && !options['volumes'].empty?
639
+ relocation_spec[:disk] = relocate_template_volumes_specs(vm_mob_ref, options['volumes'], options['datacenter'])
641
640
  end
641
+
642
642
  # And the clone specification
643
643
  clone_spec = RbVmomi::VIM.VirtualMachineCloneSpec(location: relocation_spec,
644
644
  config: virtual_machine_config_spec,
@@ -648,18 +648,16 @@ module Fog
648
648
 
649
649
  # Perform the actual Clone Task
650
650
  # Clone VM on a storage pod
651
- if options.key?('storage_pod') && !options['storage_pod'].nil?
651
+ if options['storage_pod']
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
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)
654
+ disks_per_pod = group_disks_by_storage_pod(modified_volumes(vm_mob_ref, options['volumes']), vm_pod_name: options['storage_pod'])
657
655
 
658
656
  storage_spec = RbVmomi::VIM::StoragePlacementSpec.new(
659
657
  type: 'clone',
660
658
  folder: dest_folder,
661
659
  resourcePool: resource_pool,
662
- podSelectionSpec: pod_selection_spec(vm_pod_name, disks_per_pod, options['datacenter']),
660
+ podSelectionSpec: pod_selection_spec(vm_pod_name, disks_per_pod, options['datacenter'], with_relocation: true),
663
661
  cloneSpec: clone_spec,
664
662
  cloneName: options['name'],
665
663
  vm: vm_mob_ref
@@ -688,6 +686,26 @@ module Fog
688
686
  raise Fog::Vsphere::Errors::NotFound unless new_vm
689
687
  end
690
688
  end
689
+
690
+ new_volumes = new_volumes(vm_mob_ref, options['volumes'])
691
+ if new_vm && !new_volumes.empty?
692
+ new_disks_per_pod = group_disks_by_storage_pod(new_volumes, vm_pod_name: options['storage_pod'])
693
+ add_vols_config_spec = {
694
+ deviceChange: add_new_volumes_specs(vm_mob_ref, options['volumes'], default_storage_pod: options['storage_pod'])
695
+ }
696
+ placement_spec = RbVmomi::VIM::StoragePlacementSpec.new(
697
+ type: 'reconfigure',
698
+ vm: new_vm,
699
+ configSpec: add_vols_config_spec,
700
+ podSelectionSpec: pod_selection_spec(vm_pod_name, new_disks_per_pod, options['datacenter'], only_volumes: true)
701
+ )
702
+ result = srm.RecommendDatastores(storageSpec: placement_spec)
703
+ grouped_recoms = result.recommendations.group_by { |rec| rec.target._ref }
704
+ if grouped_recoms.keys.size == new_disks_per_pod.size
705
+ keys = grouped_recoms.map { |_ref, recoms| recoms.first.key }
706
+ srm.ApplyStorageDrsRecommendation_Task(key: keys).wait_for_completion
707
+ end
708
+ end
691
709
  else
692
710
  task = vm_mob_ref.CloneVM_Task(folder: dest_folder,
693
711
  name: options['name'],
@@ -794,13 +812,21 @@ module Fog
794
812
  specs
795
813
  end
796
814
 
797
- def modify_template_volumes_specs(vm_mob_ref, volumes, default_storage_pod: nil)
815
+ def modified_volumes(vm_mob_ref, volumes)
816
+ template_volumes = vm_mob_ref.config.hardware.device.grep(RbVmomi::VIM::VirtualDisk)
817
+ volumes.take(template_volumes.size)
818
+ end
819
+
820
+ def new_volumes(vm_mob_ref, volumes)
821
+ template_volumes = vm_mob_ref.config.hardware.device.grep(RbVmomi::VIM::VirtualDisk)
822
+ volumes.drop(template_volumes.size)
823
+ end
824
+
825
+ def modify_template_volumes_specs(vm_mob_ref, volumes)
798
826
  template_volumes = vm_mob_ref.config.hardware.device.grep(RbVmomi::VIM::VirtualDisk)
799
- modified_volumes = volumes.take(template_volumes.size)
800
- new_volumes = volumes.drop(template_volumes.size)
801
827
 
802
828
  specs = []
803
- template_volumes.zip(modified_volumes).each do |template_volume, new_volume|
829
+ template_volumes.zip(modified_volumes(vm_mob_ref, volumes)).each do |template_volume, new_volume|
804
830
  if new_volume
805
831
  # copy identifiers to fog device to mark them as used
806
832
  new_volume.unit_number = template_volume.unitNumber
@@ -819,22 +845,36 @@ module Fog
819
845
  device: template_volume }
820
846
  end
821
847
  end
822
- specs.concat(new_volumes.map { |volume| create_disk(volume, :add, storage_pod: default_storage_pod) })
823
848
  specs
824
849
  end
825
850
 
851
+ def add_new_volumes_specs(vm_mob_ref, volumes, default_storage_pod: nil)
852
+ new_volumes(vm_mob_ref, volumes).map { |volume| create_disk(volume, :add, storage_pod: default_storage_pod) }
853
+ end
854
+
826
855
  def relocate_template_volumes_specs(vm_mob_ref, volumes, datacenter)
827
856
  template_volumes = vm_mob_ref.config.hardware.device.grep(RbVmomi::VIM::VirtualDisk)
828
857
  modified_volumes = volumes.take(template_volumes.size)
829
858
 
830
859
  specs = []
831
860
  template_volumes.zip(modified_volumes).each do |template_volume, new_volume|
832
- if new_volume && new_volume.datastore && new_volume.datastore != template_volume.backing.datastore.name
833
- specs << { diskId: template_volume.key, datastore: get_raw_datastore(new_volume.datastore, datacenter) }
834
- end
861
+ next unless new_volume
862
+ specs << RbVmomi::VIM.VirtualMachineRelocateSpecDiskLocator(
863
+ diskId: template_volume.key,
864
+ datastore: get_raw_datastore(new_volume.datastore, datacenter),
865
+ diskBackingInfo: relocation_volume_backing(new_volume)
866
+ )
835
867
  end
836
868
  specs
837
869
  end
870
+
871
+ def relocation_volume_backing(volume)
872
+ RbVmomi::VIM.VirtualDiskFlatVer2BackingInfo(
873
+ diskMode: volume.mode.to_sym,
874
+ fileName: '',
875
+ thinProvisioned: volume.thin
876
+ )
877
+ end
838
878
  end
839
879
 
840
880
  # rubocop:enable ClassLength
@@ -1,5 +1,5 @@
1
1
  module Fog
2
2
  module Vsphere
3
- VERSION = '3.1.1'.freeze
3
+ VERSION = '3.2.0'.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.1
4
+ version: 3.2.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: 2019-06-10 00:00:00.000000000 Z
11
+ date: 2019-07-17 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fog-core
@@ -334,8 +334,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
334
334
  - !ruby/object:Gem::Version
335
335
  version: '0'
336
336
  requirements: []
337
- rubyforge_project:
338
- rubygems_version: 2.7.6.2
337
+ rubygems_version: 3.0.4
339
338
  signing_key:
340
339
  specification_version: 4
341
340
  summary: Module for the 'fog' gem to support VMware vSphere.