ovfparse 0.0.97 → 0.6.7
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/ovfparse/vmpackage.rb +157 -5
- metadata +15 -15
data/lib/ovfparse/vmpackage.rb
CHANGED
@@ -176,13 +176,10 @@ class VmPackage
|
|
176
176
|
end
|
177
177
|
|
178
178
|
def checkschema(schema)
|
179
|
-
puts "Starting schema parse"
|
180
|
-
xsd = Nokogiri::XML::Schema(File.open(schema))
|
181
|
-
puts "Done with schema parse"
|
182
179
|
response = ""
|
183
180
|
|
184
181
|
isValid = true
|
185
|
-
|
182
|
+
schema.validate(@xml).each do |error|
|
186
183
|
response << error.message + "\n"
|
187
184
|
isValid = false
|
188
185
|
end
|
@@ -300,8 +297,22 @@ puts "Done with schema parse"
|
|
300
297
|
}
|
301
298
|
end
|
302
299
|
|
300
|
+
def removeNetworksFromVirtualHardwareSection
|
301
|
+
vhs = getChildByName(virtualSystem, 'VirtualHardwareSection') || virtualSystem.add_child(xml.create_element('VirtualHardwareSection', {}))
|
302
|
+
items = getChildrenByName(vhs, 'Item')
|
303
|
+
items.each { |item|
|
304
|
+
id = getChildByName(item, 'ResourceType')
|
305
|
+
if(id.content == '10')
|
306
|
+
item.unlink
|
307
|
+
end
|
308
|
+
}
|
309
|
+
end
|
310
|
+
|
303
311
|
def setVmNetworks(networks)
|
312
|
+
removeNetworksFromVirtualHardwareSection
|
313
|
+
|
304
314
|
networkNodes = getChildrenByName(networkSection, 'Network')
|
315
|
+
vhs = getChildByName(virtualSystem, 'VirtualHardwareSection')
|
305
316
|
|
306
317
|
networkNodes.each { |node|
|
307
318
|
updated_network = networks.detect { |network| network.location == node['name'] }
|
@@ -318,6 +329,19 @@ puts "Done with schema parse"
|
|
318
329
|
end
|
319
330
|
}
|
320
331
|
|
332
|
+
# Find the highest instance ID
|
333
|
+
maxID = 0
|
334
|
+
items = getChildrenByName(vhs, 'Item')
|
335
|
+
items.each { |item|
|
336
|
+
itemID = getChildByName(item, 'InstanceID').content.to_i
|
337
|
+
if(itemID > maxID)
|
338
|
+
maxID = itemID
|
339
|
+
end
|
340
|
+
}
|
341
|
+
|
342
|
+
rasdNamespace = xml.root.namespace_definitions.detect{ |ns| ns.prefix == 'rasd' }
|
343
|
+
netCount = 0
|
344
|
+
|
321
345
|
networks.each { |network|
|
322
346
|
if( (networkNodes.detect { |node| network.location == node['name'] }).nil?)
|
323
347
|
networkNode = networkSection.add_child(xml.create_element('Network', {'ovf:name' => network.location}))
|
@@ -325,12 +349,107 @@ puts "Done with schema parse"
|
|
325
349
|
networkNode.add_child(xml.create_element('Description', network.notes))
|
326
350
|
end
|
327
351
|
end
|
352
|
+
|
353
|
+
maxID += 1
|
354
|
+
newNetwork = vhs.add_child(xml.create_element('Item', {}))
|
355
|
+
newNetwork.add_child(xml.create_element('AutomaticAllocation', "true")).namespace = rasdNamespace
|
356
|
+
newNetwork.add_child(xml.create_element('Connection', network.location)).namespace = rasdNamespace
|
357
|
+
newNetwork.add_child(xml.create_element('ElementName', "ethernet" + netCount.to_s)).namespace = rasdNamespace
|
358
|
+
newNetwork.add_child(xml.create_element('InstanceID', maxID.to_s)).namespace = rasdNamespace
|
359
|
+
newNetwork.add_child(xml.create_element('ResourceSubType', "E1000")).namespace = rasdNamespace
|
360
|
+
newNetwork.add_child(xml.create_element('ResourceType', "10")).namespace = rasdNamespace
|
361
|
+
netCount += 1
|
362
|
+
}
|
363
|
+
end
|
364
|
+
|
365
|
+
def removeDisksFromVirtualHardwareSection
|
366
|
+
vhs = getChildByName(virtualSystem, 'VirtualHardwareSection') || virtualSystem.add_child(xml.create_element('VirtualHardwareSection', {}))
|
367
|
+
items = getChildrenByName(vhs, 'Item')
|
368
|
+
items.each { |item|
|
369
|
+
id = getChildByName(item, 'ResourceType')
|
370
|
+
if(id.content == '17')
|
371
|
+
item.unlink
|
372
|
+
end
|
373
|
+
}
|
374
|
+
end
|
375
|
+
|
376
|
+
def getOpenChannelOnIDEController(controller, items)
|
377
|
+
currentAddress = getChildByName(controller, 'InstanceID').content
|
378
|
+
controllerChildren = items.select{ |item|
|
379
|
+
parentNode = getChildByName(item, 'Parent')
|
380
|
+
unless(parentNode.nil?)
|
381
|
+
parentNode.content == currentAddress
|
382
|
+
end
|
328
383
|
}
|
384
|
+
childAddresses = Array.new
|
385
|
+
controllerChildren.each{ |child|
|
386
|
+
childAddresses.push(getChildByName(child, 'AddressOnParent').content)
|
387
|
+
}
|
388
|
+
if(childAddresses.length == 0 || (childAddresses.length == 1 && childAddresses[0] == '1'))
|
389
|
+
return '0'
|
390
|
+
elsif(childAddresses.length == 1)
|
391
|
+
return '1'
|
392
|
+
else
|
393
|
+
return false
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
def buildNewIDEController(vhs, rasdNamespace, newID, newAddress)
|
398
|
+
new_controller = vhs.add_child(xml.create_element('Item', {}))
|
399
|
+
new_controller.add_child(xml.create_element('Address', newAddress)).namespace = rasdNamespace
|
400
|
+
new_controller.add_child(xml.create_element('Description', "IDE Controller " + newAddress)).namespace = rasdNamespace
|
401
|
+
new_controller.add_child(xml.create_element('ElementName', "IDEController" + newAddress)).namespace = rasdNamespace
|
402
|
+
new_controller.add_child(xml.create_element('InstanceID', newID)).namespace = rasdNamespace
|
403
|
+
new_controller.add_child(xml.create_element('ResourceType', "5")).namespace = rasdNamespace
|
404
|
+
end
|
405
|
+
|
406
|
+
def getFirstOpenIDEAddress(vhs, rasdNamespace, maxID)
|
407
|
+
items = getChildrenByName(vhs, 'Item')
|
408
|
+
ide_controllers = items.select{ |item| getChildByName(item, 'ResourceType').content == '5' }
|
409
|
+
|
410
|
+
if(ide_controllers.length == 0)
|
411
|
+
buildNewIDEController(vhs, rasdNamespace, maxID, '0')
|
412
|
+
return [maxID, '0']
|
413
|
+
|
414
|
+
elsif(ide_controllers.length == 1)
|
415
|
+
controller = ide_controllers[0]
|
416
|
+
controllerAddress = getChildByName(controller, 'Address').content
|
417
|
+
open_address = getOpenChannelOnIDEController(controller, items)
|
418
|
+
if(open_address == '0' || open_address == '1')
|
419
|
+
return [getChildByName(controller, 'InstanceID').content, open_address]
|
420
|
+
elsif(!open_address && controllerAddress == '0')
|
421
|
+
buildNewIDEController(vhs, rasdNamespace, maxID, '1')
|
422
|
+
return [maxID, '0']
|
423
|
+
else
|
424
|
+
buildNewIDEController(vhs, rasdNamespace, maxID, '0')
|
425
|
+
return [maxID, '0']
|
426
|
+
end
|
427
|
+
|
428
|
+
else
|
429
|
+
controller = ide_controllers[0]
|
430
|
+
controllerAddress = getChildByName(controller, 'Address').content
|
431
|
+
open_address = getOpenChannelOnIDEController(controller, items)
|
432
|
+
if(open_address == '0' || open_address == '1')
|
433
|
+
return [getChildByName(controller, 'InstanceID').content, open_address]
|
434
|
+
else
|
435
|
+
controller = ide_controllers[1]
|
436
|
+
controllerAddress = getChildByName(controller, 'Address').content
|
437
|
+
open_address = getOpenChannelOnIDEController(controller, items)
|
438
|
+
if(open_address == '0' || open_address == '1')
|
439
|
+
return [getChildByName(controller, 'InstanceID').content, open_address]
|
440
|
+
else
|
441
|
+
return false
|
442
|
+
end
|
443
|
+
end
|
444
|
+
end
|
329
445
|
end
|
330
446
|
|
331
447
|
def setVmDisks(disks)
|
448
|
+
removeDisksFromVirtualHardwareSection
|
449
|
+
|
332
450
|
fileNodes = getChildrenByName(references, 'File')
|
333
451
|
diskNodes = getChildrenByName(diskSection, 'Disk')
|
452
|
+
vhs = getChildByName(virtualSystem, 'VirtualHardwareSection')
|
334
453
|
|
335
454
|
icons = Array.new
|
336
455
|
getChildrenByName(getChildByName(virtualSystem, 'ProductSection'), 'Icon').each { |node|
|
@@ -350,18 +469,50 @@ puts "Done with schema parse"
|
|
350
469
|
end
|
351
470
|
else
|
352
471
|
file_node['ovf:id'] = updated_disk.name + '_disk'
|
472
|
+
old_disk_node = old_disk_node || diskSection.add_child(xml.create_element('Disk', {}))
|
353
473
|
old_disk_node['ovf:fileRef'] = updated_disk.name + '_disk'
|
354
474
|
old_disk_node['ovf:capacity'] = updated_disk.size.to_s
|
355
475
|
old_disk_node['ovf:diskId'] = updated_disk.name
|
476
|
+
old_disk_node['ovf:capacityAllocationUnits'] = "byte * 2^30"
|
477
|
+
old_disk_node['ovf:format'] = "http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized"
|
356
478
|
end
|
357
479
|
}
|
358
480
|
|
481
|
+
# Find the highest instance ID
|
482
|
+
maxID = 0
|
483
|
+
items = getChildrenByName(vhs, 'Item')
|
484
|
+
items.each { |item|
|
485
|
+
itemID = getChildByName(item, 'InstanceID').content.to_i
|
486
|
+
if(itemID > maxID)
|
487
|
+
maxID = itemID
|
488
|
+
end
|
489
|
+
}
|
490
|
+
|
491
|
+
rasdNamespace = xml.root.namespace_definitions.detect{ |ns| ns.prefix == 'rasd' }
|
492
|
+
|
359
493
|
disks.each { |disk|
|
360
494
|
if( (fileNodes.detect { |node| disk.location == node['href'] }).nil?)
|
361
495
|
diskSection.add_child(xml.create_element('Disk', {'ovf:capacity' => disk.size.to_s, 'ovf:capacityAllocationUnits' => "byte * 2^30", 'ovf:diskId' => disk.name, 'ovf:fileRef' => disk.name + '_disk', 'ovf:format' => "http://www.vmware.com/interfaces/specifications/vmdk.html#streamOptimized" }))
|
362
496
|
references.add_child(xml.create_element('File', {'ovf:href' => disk.location, 'ovf:id' => disk.name + '_disk'}))
|
363
497
|
end
|
498
|
+
|
499
|
+
maxID += 1
|
500
|
+
address = getFirstOpenIDEAddress(vhs, rasdNamespace, maxID)
|
501
|
+
if(!address)
|
502
|
+
# PANIC BECAUSE THIS IS BAD MAN, NO AVAILABLE IDE SLOTS
|
503
|
+
raise "No IDE slots available"
|
504
|
+
else
|
505
|
+
maxID += 1
|
506
|
+
newDisk = vhs.add_child(xml.create_element('Item', {}))
|
507
|
+
newDisk.add_child(xml.create_element('AddressOnParent', address[1])).namespace = rasdNamespace
|
508
|
+
newDisk.add_child(xml.create_element('ElementName', disk.name)).namespace = rasdNamespace
|
509
|
+
newDisk.add_child(xml.create_element('HostResource', "ovf:/disk/" + disk.name)).namespace = rasdNamespace
|
510
|
+
newDisk.add_child(xml.create_element('InstanceID', maxID.to_s)).namespace = rasdNamespace
|
511
|
+
newDisk.add_child(xml.create_element('Parent', address[0])).namespace = rasdNamespace
|
512
|
+
newDisk.add_child(xml.create_element('ResourceType', "17")).namespace = rasdNamespace
|
513
|
+
end
|
364
514
|
}
|
515
|
+
|
365
516
|
end
|
366
517
|
|
367
518
|
def setVmAttributes(attributes)
|
@@ -406,7 +557,7 @@ puts "Done with schema parse"
|
|
406
557
|
def setElements(updated_element, parent_node, element_list)
|
407
558
|
element_list.each { |element_details|
|
408
559
|
updated_value = updated_element[element_details['element_ref']]
|
409
|
-
element_node = parent_node
|
560
|
+
element_node = getChildByName(parent_node, element_details['full_name'])
|
410
561
|
#if((updated_value == '' || updated_value.nil?) && !element_node.nil?)
|
411
562
|
# element_node.unlink
|
412
563
|
#elsif(updated_value != '' && !updated_value.nil?)
|
@@ -571,3 +722,4 @@ end
|
|
571
722
|
|
572
723
|
class Vc4VmPackage < VmPackage
|
573
724
|
end
|
725
|
+
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ovfparse
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 9
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
|
-
-
|
9
|
-
-
|
10
|
-
version: 0.
|
8
|
+
- 6
|
9
|
+
- 7
|
10
|
+
version: 0.6.7
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Jim Barkley
|
@@ -15,7 +15,7 @@ autorequire:
|
|
15
15
|
bindir: bin
|
16
16
|
cert_chain: []
|
17
17
|
|
18
|
-
date: 2011-
|
18
|
+
date: 2011-06-06 00:00:00 -04:00
|
19
19
|
default_executable:
|
20
20
|
dependencies:
|
21
21
|
- !ruby/object:Gem::Dependency
|
@@ -43,20 +43,20 @@ extensions: []
|
|
43
43
|
extra_rdoc_files:
|
44
44
|
- README
|
45
45
|
files:
|
46
|
-
- lib/ovfparse/
|
47
|
-
- lib/ovfparse/
|
48
|
-
- lib/ovfparse/os_id_table.rb
|
49
|
-
- lib/ovfparse/file_vmrepository.rb
|
46
|
+
- lib/ovfparse/vc4_vmrepository.rb
|
47
|
+
- lib/ovfparse/ftp_vmrepository.rb
|
50
48
|
- lib/ovfparse/marketplace_repository.rb
|
49
|
+
- lib/ovfparse/vc_repository.rb
|
50
|
+
- lib/ovfparse/https_vmrepository.rb
|
51
51
|
- lib/ovfparse/vmrepository.rb
|
52
|
+
- lib/ovfparse/esx_repository.rb
|
52
53
|
- lib/ovfparse/vmpackage.rb
|
54
|
+
- lib/ovfparse/http_vmrepository.rb
|
53
55
|
- lib/ovfparse/esx4_vmrepository.rb
|
54
|
-
- lib/ovfparse/
|
55
|
-
- lib/ovfparse/
|
56
|
-
- lib/ovfparse/ftp_vmrepository.rb
|
57
|
-
- lib/ovfparse/esx_repository.rb
|
58
|
-
- lib/test.rb
|
56
|
+
- lib/ovfparse/file_vmrepository.rb
|
57
|
+
- lib/ovfparse/os_id_table.rb
|
59
58
|
- lib/ovfparse.rb
|
59
|
+
- lib/test.rb
|
60
60
|
- README
|
61
61
|
has_rdoc: true
|
62
62
|
homepage: http://github.com/ruby-ovf/ovfparse
|
@@ -88,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
88
88
|
requirements: []
|
89
89
|
|
90
90
|
rubyforge_project:
|
91
|
-
rubygems_version: 1.
|
91
|
+
rubygems_version: 1.5.0
|
92
92
|
signing_key:
|
93
93
|
specification_version: 3
|
94
94
|
summary: Retrieves and parses files in the Open Virtualization Format
|