fog-vsphere 3.1.1 → 3.2.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: 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.