fog-vsphere 1.3.0 → 1.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +4 -0
- data/lib/fog/vsphere/compute.rb +1 -0
- data/lib/fog/vsphere/models/compute/server.rb +23 -7
- data/lib/fog/vsphere/models/compute/volume.rb +32 -27
- data/lib/fog/vsphere/models/compute/volumes.rb +1 -1
- data/lib/fog/vsphere/requests/compute/create_vm.rb +35 -41
- data/lib/fog/vsphere/requests/compute/list_vm_scsi_controllers.rb +24 -0
- data/lib/fog/vsphere/requests/compute/list_vm_volumes.rb +2 -1
- data/lib/fog/vsphere/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d70aa872274ad6369ff9abccb2f116eda6a5e9f9
|
4
|
+
data.tar.gz: 4946c00124f4948ed32a177054f34a8c19427e16
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6b7e631c01fa5d2e1a412ff1a9106d37239644f6ce5dcb42ef0b603ce338af6ce373bd0458a277b32211c1c5f7cb9b1a919a6dd999dea3fecd4534a7991ed2f4
|
7
|
+
data.tar.gz: d877b5c7c0fbedbd284e7bd782302989162ce0d9e57daed93e4c63ea136b91b54a743b2d65c7b680717971965b89dca8834439185bca10b6a5509aa2c5c48166
|
data/CHANGELOG.md
CHANGED
data/lib/fog/vsphere/compute.rb
CHANGED
@@ -6,6 +6,7 @@ module Fog
|
|
6
6
|
class Server < Fog::Compute::Server
|
7
7
|
extend Fog::Deprecation
|
8
8
|
deprecate(:ipaddress, :public_ip_address)
|
9
|
+
deprecate(:scsi_controller, :scsi_controllers)
|
9
10
|
|
10
11
|
# This will be the instance uuid which is globally unique across
|
11
12
|
# a vSphere deployment.
|
@@ -45,7 +46,7 @@ module Fog
|
|
45
46
|
attribute :instance_uuid # move this --> id
|
46
47
|
attribute :guest_id
|
47
48
|
attribute :hardware_version
|
48
|
-
attribute :
|
49
|
+
attribute :scsi_controllers, :type => :array
|
49
50
|
attribute :cpuHotAddEnabled
|
50
51
|
attribute :memoryHotAddEnabled
|
51
52
|
attribute :firmware
|
@@ -57,7 +58,7 @@ module Fog
|
|
57
58
|
initialize_interfaces
|
58
59
|
initialize_volumes
|
59
60
|
initialize_customvalues
|
60
|
-
|
61
|
+
initialize_scsi_controllers
|
61
62
|
end
|
62
63
|
|
63
64
|
# Lazy Loaded Attributes
|
@@ -255,8 +256,12 @@ module Fog
|
|
255
256
|
attributes[:customvalues] ||= id.nil? ? [] : service.customvalues( :vm => self )
|
256
257
|
end
|
257
258
|
|
259
|
+
def scsi_controllers
|
260
|
+
self.attributes[:scsi_controllers] ||= service.list_vm_scsi_controllers(id)
|
261
|
+
end
|
262
|
+
|
258
263
|
def scsi_controller
|
259
|
-
|
264
|
+
scsi_controllers.first
|
260
265
|
end
|
261
266
|
|
262
267
|
def folder
|
@@ -313,7 +318,7 @@ module Fog
|
|
313
318
|
|
314
319
|
def initialize_volumes
|
315
320
|
if attributes[:volumes] and attributes[:volumes].is_a?(Array)
|
316
|
-
self.attributes[:volumes].map! { |vol| vol.is_a?(Hash) ? service.volumes.new(vol) : vol }
|
321
|
+
self.attributes[:volumes].map! { |vol| vol.is_a?(Hash) ? service.volumes.new({:server => self}.merge(vol)) : vol }
|
317
322
|
end
|
318
323
|
end
|
319
324
|
|
@@ -323,9 +328,20 @@ module Fog
|
|
323
328
|
end
|
324
329
|
end
|
325
330
|
|
326
|
-
def
|
327
|
-
if attributes[:
|
328
|
-
|
331
|
+
def initialize_scsi_controllers
|
332
|
+
if attributes[:scsi_controllers] && attributes[:scsi_controllers].is_a?(Array)
|
333
|
+
self.attributes[:scsi_controllers].map! do |controller|
|
334
|
+
controller.is_a?(Hash) ? Fog::Compute::Vsphere::SCSIController.new(controller) : controller
|
335
|
+
end
|
336
|
+
elsif attributes[:scsi_controller] && attributes[:scsi_controller].is_a?(Hash)
|
337
|
+
self.attributes[:scsi_controllers] = [
|
338
|
+
Fog::Compute::Vsphere::SCSIController.new(self.attributes[:scsi_controller])
|
339
|
+
]
|
340
|
+
elsif attributes[:volumes] && attributes[:volumes].is_a?(Array) && !attributes[:volumes].empty?
|
341
|
+
# Create a default scsi controller if there are any disks but no controller defined
|
342
|
+
self.attributes[:scsi_controllers] = [
|
343
|
+
Fog::Compute::Vsphere::SCSIController.new
|
344
|
+
]
|
329
345
|
end
|
330
346
|
end
|
331
347
|
end
|
@@ -5,6 +5,7 @@ module Fog
|
|
5
5
|
DISK_SIZE_TO_GB = 1048576
|
6
6
|
identity :id
|
7
7
|
|
8
|
+
has_one :server, Server
|
8
9
|
attribute :datastore
|
9
10
|
attribute :storage_pod
|
10
11
|
attribute :mode
|
@@ -16,12 +17,9 @@ module Fog
|
|
16
17
|
attribute :size_gb
|
17
18
|
attribute :key
|
18
19
|
attribute :unit_number
|
19
|
-
attribute :
|
20
|
-
|
21
|
-
def initialize(attributes={} )
|
22
|
-
# Assign server first to prevent race condition with persisted?
|
23
|
-
self.server_id = attributes.delete(:server_id)
|
20
|
+
attribute :controller_key, :type => :integer, :default => 1000
|
24
21
|
|
22
|
+
def initialize(attributes={})
|
25
23
|
super defaults.merge(attributes)
|
26
24
|
end
|
27
25
|
|
@@ -48,25 +46,7 @@ module Fog
|
|
48
46
|
raise Fog::Errors::Error.new('Resaving an existing object may create a duplicate') if persisted?
|
49
47
|
requires :server_id, :size, :datastore
|
50
48
|
|
51
|
-
|
52
|
-
# This is due to SCSI ID 7 being reserved for the pvscsi controller
|
53
|
-
# When referring to a volume that already added using a unit_id of 7 or higher, we must refer to the actual SCSI ID
|
54
|
-
if unit_number.nil?
|
55
|
-
# Vsphere maps unit_numbers 7 and greater to a higher SCSI ID since the pvscsi driver reserves SCSI ID 7
|
56
|
-
used_unit_numbers = server.volumes.map { |volume| volume.unit_number < 7 ? volume.unit_number : volume.unit_number - 1 }
|
57
|
-
max_unit_number = used_unit_numbers.max
|
58
|
-
|
59
|
-
if max_unit_number > server.volumes.size
|
60
|
-
# If the max ID exceeds the number of volumes, there must be a hole in the range. Find a hole and use it.
|
61
|
-
self.unit_number = max_unit_number.times.to_a.find { |i| used_unit_numbers.exclude?(i) }
|
62
|
-
else
|
63
|
-
self.unit_number = max_unit_number + 1
|
64
|
-
end
|
65
|
-
else
|
66
|
-
if server.volumes.any? { |volume| volume.unit_number == self.unit_number && volume.id != self.id }
|
67
|
-
raise "A volume already exists with that unit_number, so we can't save the new volume"
|
68
|
-
end
|
69
|
-
end
|
49
|
+
set_unit_number
|
70
50
|
|
71
51
|
data = service.add_vm_volume(self)
|
72
52
|
|
@@ -80,6 +60,7 @@ module Fog
|
|
80
60
|
|
81
61
|
self.id = created.id
|
82
62
|
self.key = created.key
|
63
|
+
self.controller_key = created.controllerKey
|
83
64
|
self.filename = created.filename
|
84
65
|
|
85
66
|
true
|
@@ -88,9 +69,22 @@ module Fog
|
|
88
69
|
end
|
89
70
|
end
|
90
71
|
|
91
|
-
def
|
92
|
-
requires :
|
93
|
-
|
72
|
+
def server_id
|
73
|
+
requires :server
|
74
|
+
server.id
|
75
|
+
end
|
76
|
+
|
77
|
+
def set_unit_number
|
78
|
+
# When adding volumes to vsphere, if our unit_number is 7 or higher, vsphere will increment the unit_number
|
79
|
+
# This is due to SCSI ID 7 being reserved for the pvscsi controller
|
80
|
+
# When referring to a volume that already added using a unit_id of 7 or higher, we must refer to the actual SCSI ID
|
81
|
+
if unit_number.nil?
|
82
|
+
self.unit_number = calculate_free_unit_number
|
83
|
+
else
|
84
|
+
if server.volumes.select { |vol| vol.controller_key == controller_key }.any? { |volume| volume.unit_number == self.unit_number && volume.id != self.id }
|
85
|
+
raise "A volume already exists with that unit_number, so we can't save the new volume"
|
86
|
+
end
|
87
|
+
end
|
94
88
|
end
|
95
89
|
|
96
90
|
private
|
@@ -102,6 +96,17 @@ module Fog
|
|
102
96
|
:mode => "persistent"
|
103
97
|
}
|
104
98
|
end
|
99
|
+
|
100
|
+
def calculate_free_unit_number
|
101
|
+
requires :controller_key
|
102
|
+
|
103
|
+
# Vsphere maps unit_numbers 7 and greater to a higher SCSI ID since the pvscsi driver reserves SCSI ID 7
|
104
|
+
used_unit_numbers = server.volumes
|
105
|
+
.select { |vol| vol.unit_number && vol.controller_key == controller_key }.map(&:unit_number) + [7]
|
106
|
+
free_unit_numbers = (0..15).to_a - used_unit_numbers
|
107
|
+
|
108
|
+
free_unit_numbers.first
|
109
|
+
end
|
105
110
|
end
|
106
111
|
end
|
107
112
|
end
|
@@ -20,7 +20,7 @@ module Fog
|
|
20
20
|
vm_cfg[:cpuHotAddEnabled] = attributes[:cpuHotAddEnabled] if attributes.key?(:cpuHotAddEnabled)
|
21
21
|
vm_cfg[:memoryHotAddEnabled] = attributes[:memoryHotAddEnabled] if attributes.key?(:memoryHotAddEnabled)
|
22
22
|
vm_cfg[:firmware] = attributes[:firmware] if attributes.key?(:firmware)
|
23
|
-
vm_cfg[:bootOptions] = boot_options(attributes) if attributes.key?(:boot_order) || attributes.key?(:boot_retry)
|
23
|
+
vm_cfg[:bootOptions] = boot_options(attributes, vm_cfg) if attributes.key?(:boot_order) || attributes.key?(:boot_retry)
|
24
24
|
resource_pool = if attributes[:resource_pool] && attributes[:resource_pool] != 'Resources'
|
25
25
|
get_raw_resource_pool(attributes[:resource_pool], attributes[:cluster], attributes[:datacenter])
|
26
26
|
else
|
@@ -97,9 +97,12 @@ module Fog
|
|
97
97
|
devices << nics.map { |nic| create_interface(nic, nics.index(nic), :add, attributes) }
|
98
98
|
end
|
99
99
|
|
100
|
+
if (scsi_controllers = (attributes[:scsi_controllers] || attributes["scsi_controller"]))
|
101
|
+
devices << scsi_controllers.each_with_index.map { |controller, index| create_controller(controller, index) }
|
102
|
+
end
|
103
|
+
|
100
104
|
if (disks = attributes[:volumes])
|
101
|
-
devices <<
|
102
|
-
devices << disks.map { |disk| create_disk(disk, disks.index(disk), :add, 1000, get_storage_pod(attributes)) }
|
105
|
+
devices << disks.map { |disk| create_disk(disk, :add, get_storage_pod(attributes)) }
|
103
106
|
end
|
104
107
|
|
105
108
|
if (cdroms = attributes[:cdroms])
|
@@ -108,12 +111,12 @@ module Fog
|
|
108
111
|
devices.flatten
|
109
112
|
end
|
110
113
|
|
111
|
-
def boot_options
|
114
|
+
def boot_options(attributes, vm_cfg)
|
112
115
|
# NOTE: you must be using vsphere_rev 5.0 or greater to set boot_order
|
113
116
|
# e.g. Fog::Compute.new(provider: "vsphere", vsphere_rev: "5.5", etc)
|
114
117
|
options = {}
|
115
118
|
if @vsphere_rev.to_f >= 5 and attributes[:boot_order]
|
116
|
-
options[:bootOrder] = boot_order(attributes)
|
119
|
+
options[:bootOrder] = boot_order(attributes, vm_cfg)
|
117
120
|
end
|
118
121
|
|
119
122
|
# Set attributes[:boot_retry] to a delay in miliseconds to enable boot retries
|
@@ -121,11 +124,11 @@ module Fog
|
|
121
124
|
options[:bootRetryEnabled] = true
|
122
125
|
options[:bootRetryDelay] = attributes[:boot_retry]
|
123
126
|
end
|
124
|
-
|
127
|
+
|
125
128
|
options.empty? ? nil : RbVmomi::VIM::VirtualMachineBootOptions.new(options)
|
126
129
|
end
|
127
130
|
|
128
|
-
def boot_order
|
131
|
+
def boot_order(attributes, vm_cfg)
|
129
132
|
# attributes[:boot_order] may be an array like this ['network', 'disk']
|
130
133
|
# stating, that we want to prefer network boots over disk boots
|
131
134
|
boot_order = []
|
@@ -142,18 +145,17 @@ module Fog
|
|
142
145
|
end
|
143
146
|
end
|
144
147
|
when 'disk'
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
end
|
148
|
+
disks = vm_cfg[:deviceChange].map {|dev| dev[:device]}.select { |dev| dev.is_a? RbVmomi::VIM::VirtualDisk }
|
149
|
+
disks.each do |disk|
|
150
|
+
# we allow booting from all harddisks, the first disk has the highest priority
|
151
|
+
boot_order << RbVmomi::VIM::VirtualMachineBootOptionsBootableDiskDevice.new(
|
152
|
+
:deviceKey => get_disk_device_key(disk.controllerKey, disk.unitNumber)
|
153
|
+
)
|
152
154
|
end
|
153
155
|
when 'cdrom'
|
154
|
-
boot_order << RbVmomi::VIM::VirtualMachineBootOptionsBootableCdromDevice.new
|
156
|
+
boot_order << RbVmomi::VIM::VirtualMachineBootOptionsBootableCdromDevice.new
|
155
157
|
when 'floppy'
|
156
|
-
boot_order << RbVmomi::VIM::VirtualMachineBootOptionsBootableFloppyDevice.new
|
158
|
+
boot_order << RbVmomi::VIM::VirtualMachineBootOptionsBootableFloppyDevice.new
|
157
159
|
else
|
158
160
|
raise "failed to create boot device because \"#{boot_device}\" is unknown"
|
159
161
|
end
|
@@ -161,17 +163,11 @@ module Fog
|
|
161
163
|
boot_order
|
162
164
|
end
|
163
165
|
|
164
|
-
def get_disk_device_key(
|
166
|
+
def get_disk_device_key(controller_key, unit_number)
|
167
|
+
# controller key is based on 1000 + controller bus
|
165
168
|
# disk key is based on 2000 + the SCSI ID + the controller bus * 16
|
166
|
-
|
167
|
-
|
168
|
-
# fog assumes that there is only a single scsi controller, see device_change()
|
169
|
-
if (index > 6) then
|
170
|
-
_index = index + 1
|
171
|
-
else
|
172
|
-
_index = index
|
173
|
-
end
|
174
|
-
2000 + _index
|
169
|
+
controller_bus = controller_key - 1000
|
170
|
+
2000 + (controller_bus * 16) + unit_number
|
175
171
|
end
|
176
172
|
|
177
173
|
def create_nic_backing nic, attributes
|
@@ -204,9 +200,9 @@ module Fog
|
|
204
200
|
}
|
205
201
|
end
|
206
202
|
|
207
|
-
def create_controller
|
208
|
-
options=if
|
209
|
-
controller_default_options.merge(
|
203
|
+
def create_controller(controller=nil, index = 0)
|
204
|
+
options=if controller
|
205
|
+
controller_default_options.merge(controller.attributes)
|
210
206
|
else
|
211
207
|
controller_default_options
|
212
208
|
end
|
@@ -218,15 +214,15 @@ module Fog
|
|
218
214
|
{
|
219
215
|
:operation => options[:operation],
|
220
216
|
:device => controller_class.new({
|
221
|
-
:key => options[:key],
|
222
|
-
:busNumber => options[:bus_id],
|
217
|
+
:key => options[:key] || (1000 + index),
|
218
|
+
:busNumber => options[:bus_id] || index,
|
223
219
|
:sharedBus => controller_get_shared_from_options(options),
|
224
220
|
})
|
225
221
|
}
|
226
222
|
end
|
227
223
|
|
228
224
|
def controller_default_options
|
229
|
-
{:operation =>
|
225
|
+
{:operation => :add, :type => RbVmomi::VIM.VirtualLsiLogicController.class, :shared => false }
|
230
226
|
end
|
231
227
|
|
232
228
|
def controller_get_shared_from_options options
|
@@ -241,30 +237,28 @@ module Fog
|
|
241
237
|
end
|
242
238
|
end
|
243
239
|
|
244
|
-
def create_disk
|
245
|
-
if (index > 6) then
|
246
|
-
_index = index + 1
|
247
|
-
else
|
248
|
-
_index = index
|
249
|
-
end
|
240
|
+
def create_disk(disk, operation = :add, storage_pod = nil)
|
250
241
|
# If we deploy the vm on a storage pod, datastore has to be an empty string
|
251
242
|
if storage_pod
|
252
243
|
datastore = ''
|
253
244
|
else
|
254
245
|
datastore = "[#{disk.datastore}]"
|
255
246
|
end
|
247
|
+
|
248
|
+
disk.set_unit_number
|
249
|
+
|
256
250
|
payload = {
|
257
251
|
:operation => operation,
|
258
252
|
:fileOperation => operation == :add ? :create : :destroy,
|
259
253
|
:device => RbVmomi::VIM.VirtualDisk(
|
260
|
-
:key =>
|
254
|
+
:key => -1,
|
261
255
|
:backing => RbVmomi::VIM.VirtualDiskFlatVer2BackingInfo(
|
262
256
|
:fileName => datastore,
|
263
257
|
:diskMode => disk.mode.to_sym,
|
264
258
|
:thinProvisioned => disk.thin
|
265
259
|
),
|
266
|
-
:controllerKey => controller_key,
|
267
|
-
:unitNumber =>
|
260
|
+
:controllerKey => disk.controller_key,
|
261
|
+
:unitNumber => disk.unit_number,
|
268
262
|
:capacityInKB => disk.size
|
269
263
|
)
|
270
264
|
}
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module Fog
|
2
|
+
module Compute
|
3
|
+
class Vsphere
|
4
|
+
class Real
|
5
|
+
def list_vm_scsi_controllers(vm_id)
|
6
|
+
list_vm_scsi_controllers_raw(vm_id).map do |raw_controller|
|
7
|
+
Fog::Compute::Vsphere::SCSIController.new(raw_controller)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def list_vm_scsi_controllers_raw(vm_id)
|
12
|
+
get_vm_ref(vm_id).config.hardware.device.grep(RbVmomi::VIM::VirtualSCSIController).map do |ctrl|
|
13
|
+
{
|
14
|
+
:type => ctrl.class.to_s,
|
15
|
+
:shared_bus => ctrl.sharedBus.to_s,
|
16
|
+
:unit_number => ctrl.scsiCtlrUnitNumber,
|
17
|
+
:key => ctrl.key,
|
18
|
+
}
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
data/lib/fog/vsphere/version.rb
CHANGED
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: 1.
|
4
|
+
version: 1.4.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: 2016-10-
|
11
|
+
date: 2016-10-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fog-core
|
@@ -228,6 +228,7 @@ files:
|
|
228
228
|
- lib/fog/vsphere/requests/compute/list_vm_cdroms.rb
|
229
229
|
- lib/fog/vsphere/requests/compute/list_vm_customvalues.rb
|
230
230
|
- lib/fog/vsphere/requests/compute/list_vm_interfaces.rb
|
231
|
+
- lib/fog/vsphere/requests/compute/list_vm_scsi_controllers.rb
|
231
232
|
- lib/fog/vsphere/requests/compute/list_vm_snapshots.rb
|
232
233
|
- lib/fog/vsphere/requests/compute/list_vm_volumes.rb
|
233
234
|
- lib/fog/vsphere/requests/compute/modify_vm_cdrom.rb
|