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.
Files changed (2) hide show
  1. data/lib/ovfparse/vmpackage.rb +157 -5
  2. metadata +15 -15
@@ -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
- xsd.validate(@xml).each do |error|
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.xpath(element_details['full_name'])[0]
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: 221
4
+ hash: 9
5
5
  prerelease:
6
6
  segments:
7
7
  - 0
8
- - 0
9
- - 97
10
- version: 0.0.97
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-04-19 00:00:00 -04:00
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/http_vmrepository.rb
47
- - lib/ovfparse/vc_repository.rb
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/vc4_vmrepository.rb
55
- - lib/ovfparse/https_vmrepository.rb
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.6.2
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