ovfparse 0.0.97 → 0.6.7

Sign up to get free protection for your applications and to get access to all the features.
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