ovfparse 0.0.97 → 0.6.7
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.
- 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
|