bbrowning-virtualbox 0.7.6.dev

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 (281) hide show
  1. data/.gitignore +8 -0
  2. data/.yardopts +3 -0
  3. data/Gemfile +16 -0
  4. data/LICENSE +19 -0
  5. data/Rakefile +33 -0
  6. data/Readme.md +70 -0
  7. data/docs/GettingStarted.md +196 -0
  8. data/docs/WhatsNew.md +12 -0
  9. data/features/README.md +33 -0
  10. data/features/global.feature +19 -0
  11. data/features/global_extra_data.feature +27 -0
  12. data/features/step_definitions/abstract_model_steps.rb +39 -0
  13. data/features/step_definitions/extra_data_steps.rb +36 -0
  14. data/features/step_definitions/global_steps.rb +29 -0
  15. data/features/step_definitions/nat_engine_steps.rb +76 -0
  16. data/features/step_definitions/network_adapter_steps.rb +38 -0
  17. data/features/step_definitions/shared_folder_steps.rb +76 -0
  18. data/features/step_definitions/snapshot_steps.rb +74 -0
  19. data/features/step_definitions/storage_controller_steps.rb +16 -0
  20. data/features/step_definitions/virtualbox_steps.rb +17 -0
  21. data/features/step_definitions/vm_steps.rb +50 -0
  22. data/features/support/env.rb +61 -0
  23. data/features/support/helpers.rb +38 -0
  24. data/features/support/hooks.rb +30 -0
  25. data/features/support/ordered_hash.rb +49 -0
  26. data/features/support/vboxmanage.rb +191 -0
  27. data/features/version.feature +16 -0
  28. data/features/vm.feature +13 -0
  29. data/features/vm_bios.feature +29 -0
  30. data/features/vm_cpu.feature +29 -0
  31. data/features/vm_extra_data.feature +35 -0
  32. data/features/vm_hw_virt.feature +29 -0
  33. data/features/vm_nat_engine.feature +57 -0
  34. data/features/vm_network_adapters.feature +27 -0
  35. data/features/vm_shared_folders.feature +42 -0
  36. data/features/vm_snapshots.feature +29 -0
  37. data/features/vm_storage_controllers.feature +11 -0
  38. data/lib/virtualbox.rb +11 -0
  39. data/lib/virtualbox/abstract_model.rb +281 -0
  40. data/lib/virtualbox/abstract_model/attributable.rb +290 -0
  41. data/lib/virtualbox/abstract_model/dirty.rb +177 -0
  42. data/lib/virtualbox/abstract_model/interface_attributes.rb +98 -0
  43. data/lib/virtualbox/abstract_model/relatable.rb +332 -0
  44. data/lib/virtualbox/abstract_model/validatable.rb +167 -0
  45. data/lib/virtualbox/abstract_model/version_matcher.rb +35 -0
  46. data/lib/virtualbox/appliance.rb +62 -0
  47. data/lib/virtualbox/audio_adapter.rb +52 -0
  48. data/lib/virtualbox/bios.rb +50 -0
  49. data/lib/virtualbox/com.rb +23 -0
  50. data/lib/virtualbox/com/abstract_enum.rb +43 -0
  51. data/lib/virtualbox/com/abstract_implementer.rb +45 -0
  52. data/lib/virtualbox/com/abstract_interface.rb +167 -0
  53. data/lib/virtualbox/com/base_interface.rb +38 -0
  54. data/lib/virtualbox/com/ffi/interface.rb +150 -0
  55. data/lib/virtualbox/com/ffi/interfaces.rb +54 -0
  56. data/lib/virtualbox/com/ffi/util.rb +119 -0
  57. data/lib/virtualbox/com/ffi/vboxxpcomc.rb +31 -0
  58. data/lib/virtualbox/com/ffi_interface.rb +96 -0
  59. data/lib/virtualbox/com/implementer/base.rb +59 -0
  60. data/lib/virtualbox/com/implementer/ffi.rb +361 -0
  61. data/lib/virtualbox/com/implementer/mscom.rb +175 -0
  62. data/lib/virtualbox/com/implementer/nil.rb +10 -0
  63. data/lib/virtualbox/com/interface/3.1.x/access_mode.rb +11 -0
  64. data/lib/virtualbox/com/interface/3.1.x/appliance.rb +22 -0
  65. data/lib/virtualbox/com/interface/3.1.x/audio_adapter.rb +15 -0
  66. data/lib/virtualbox/com/interface/3.1.x/audio_controller_type.rb +11 -0
  67. data/lib/virtualbox/com/interface/3.1.x/audio_driver_type.rb +11 -0
  68. data/lib/virtualbox/com/interface/3.1.x/bios_boot_menu_mode.rb +11 -0
  69. data/lib/virtualbox/com/interface/3.1.x/bios_settings.rb +21 -0
  70. data/lib/virtualbox/com/interface/3.1.x/clipboard_mode.rb +11 -0
  71. data/lib/virtualbox/com/interface/3.1.x/console.rb +50 -0
  72. data/lib/virtualbox/com/interface/3.1.x/cpu_property_type.rb +11 -0
  73. data/lib/virtualbox/com/interface/3.1.x/device_type.rb +11 -0
  74. data/lib/virtualbox/com/interface/3.1.x/dhcp_server.rb +22 -0
  75. data/lib/virtualbox/com/interface/3.1.x/firmware_type.rb +11 -0
  76. data/lib/virtualbox/com/interface/3.1.x/guest_os_type.rb +23 -0
  77. data/lib/virtualbox/com/interface/3.1.x/host.rb +42 -0
  78. data/lib/virtualbox/com/interface/3.1.x/host_network_interface.rb +30 -0
  79. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_medium_type.rb +11 -0
  80. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_status.rb +11 -0
  81. data/lib/virtualbox/com/interface/3.1.x/host_network_interface_type.rb +11 -0
  82. data/lib/virtualbox/com/interface/3.1.x/host_usb_device.rb +13 -0
  83. data/lib/virtualbox/com/interface/3.1.x/host_usb_device_filter.rb +13 -0
  84. data/lib/virtualbox/com/interface/3.1.x/hw_virt_ex_property_type.rb +11 -0
  85. data/lib/virtualbox/com/interface/3.1.x/machine.rb +105 -0
  86. data/lib/virtualbox/com/interface/3.1.x/machine_state.rb +14 -0
  87. data/lib/virtualbox/com/interface/3.1.x/medium.rb +50 -0
  88. data/lib/virtualbox/com/interface/3.1.x/medium_attachment.rb +18 -0
  89. data/lib/virtualbox/com/interface/3.1.x/medium_format.rb +18 -0
  90. data/lib/virtualbox/com/interface/3.1.x/medium_state.rb +11 -0
  91. data/lib/virtualbox/com/interface/3.1.x/medium_type.rb +11 -0
  92. data/lib/virtualbox/com/interface/3.1.x/medium_variant.rb +11 -0
  93. data/lib/virtualbox/com/interface/3.1.x/network_adapter.rb +30 -0
  94. data/lib/virtualbox/com/interface/3.1.x/network_adapter_type.rb +11 -0
  95. data/lib/virtualbox/com/interface/3.1.x/network_attachment_type.rb +11 -0
  96. data/lib/virtualbox/com/interface/3.1.x/nsiexception.rb +23 -0
  97. data/lib/virtualbox/com/interface/3.1.x/nsisupports.rb +15 -0
  98. data/lib/virtualbox/com/interface/3.1.x/parallel_port.rb +17 -0
  99. data/lib/virtualbox/com/interface/3.1.x/port_mode.rb +11 -0
  100. data/lib/virtualbox/com/interface/3.1.x/progress.rb +63 -0
  101. data/lib/virtualbox/com/interface/3.1.x/serial_port.rb +19 -0
  102. data/lib/virtualbox/com/interface/3.1.x/session.rb +18 -0
  103. data/lib/virtualbox/com/interface/3.1.x/session_state.rb +11 -0
  104. data/lib/virtualbox/com/interface/3.1.x/session_type.rb +11 -0
  105. data/lib/virtualbox/com/interface/3.1.x/shared_folder.rb +17 -0
  106. data/lib/virtualbox/com/interface/3.1.x/snapshot.rb +20 -0
  107. data/lib/virtualbox/com/interface/3.1.x/storage_bus.rb +11 -0
  108. data/lib/virtualbox/com/interface/3.1.x/storage_controller.rb +23 -0
  109. data/lib/virtualbox/com/interface/3.1.x/storage_controller_type.rb +11 -0
  110. data/lib/virtualbox/com/interface/3.1.x/system_properties.rb +37 -0
  111. data/lib/virtualbox/com/interface/3.1.x/usb_controller.rb +20 -0
  112. data/lib/virtualbox/com/interface/3.1.x/usb_device.rb +24 -0
  113. data/lib/virtualbox/com/interface/3.1.x/usb_device_filter.rb +23 -0
  114. data/lib/virtualbox/com/interface/3.1.x/usb_device_filter_action.rb +11 -0
  115. data/lib/virtualbox/com/interface/3.1.x/usb_device_state.rb +11 -0
  116. data/lib/virtualbox/com/interface/3.1.x/virtual_box_error_info.rb +17 -0
  117. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description.rb +19 -0
  118. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_type.rb +14 -0
  119. data/lib/virtualbox/com/interface/3.1.x/virtual_system_description_value_type.rb +11 -0
  120. data/lib/virtualbox/com/interface/3.1.x/virtualbox.rb +67 -0
  121. data/lib/virtualbox/com/interface/3.1.x/vrdp_auth_type.rb +11 -0
  122. data/lib/virtualbox/com/interface/3.1.x/vrdp_server.rb +19 -0
  123. data/lib/virtualbox/com/interface/3.2.x/access_mode.rb +11 -0
  124. data/lib/virtualbox/com/interface/3.2.x/appliance.rb +22 -0
  125. data/lib/virtualbox/com/interface/3.2.x/audio_adapter.rb +15 -0
  126. data/lib/virtualbox/com/interface/3.2.x/audio_controller_type.rb +11 -0
  127. data/lib/virtualbox/com/interface/3.2.x/audio_driver_type.rb +11 -0
  128. data/lib/virtualbox/com/interface/3.2.x/bios_boot_menu_mode.rb +11 -0
  129. data/lib/virtualbox/com/interface/3.2.x/bios_settings.rb +21 -0
  130. data/lib/virtualbox/com/interface/3.2.x/clipboard_mode.rb +11 -0
  131. data/lib/virtualbox/com/interface/3.2.x/console.rb +50 -0
  132. data/lib/virtualbox/com/interface/3.2.x/cpu_property_type.rb +11 -0
  133. data/lib/virtualbox/com/interface/3.2.x/device_type.rb +11 -0
  134. data/lib/virtualbox/com/interface/3.2.x/dhcp_server.rb +22 -0
  135. data/lib/virtualbox/com/interface/3.2.x/firmware_type.rb +11 -0
  136. data/lib/virtualbox/com/interface/3.2.x/guest.rb +13 -0
  137. data/lib/virtualbox/com/interface/3.2.x/guest_os_type.rb +33 -0
  138. data/lib/virtualbox/com/interface/3.2.x/host.rb +43 -0
  139. data/lib/virtualbox/com/interface/3.2.x/host_network_interface.rb +30 -0
  140. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_medium_type.rb +11 -0
  141. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_status.rb +11 -0
  142. data/lib/virtualbox/com/interface/3.2.x/host_network_interface_type.rb +11 -0
  143. data/lib/virtualbox/com/interface/3.2.x/host_usb_device.rb +13 -0
  144. data/lib/virtualbox/com/interface/3.2.x/host_usb_device_filter.rb +13 -0
  145. data/lib/virtualbox/com/interface/3.2.x/hw_virt_ex_property_type.rb +11 -0
  146. data/lib/virtualbox/com/interface/3.2.x/keyboard_hid_type.rb +11 -0
  147. data/lib/virtualbox/com/interface/3.2.x/machine.rb +118 -0
  148. data/lib/virtualbox/com/interface/3.2.x/machine_state.rb +14 -0
  149. data/lib/virtualbox/com/interface/3.2.x/medium.rb +51 -0
  150. data/lib/virtualbox/com/interface/3.2.x/medium_attachment.rb +18 -0
  151. data/lib/virtualbox/com/interface/3.2.x/medium_format.rb +18 -0
  152. data/lib/virtualbox/com/interface/3.2.x/medium_state.rb +11 -0
  153. data/lib/virtualbox/com/interface/3.2.x/medium_type.rb +11 -0
  154. data/lib/virtualbox/com/interface/3.2.x/medium_variant.rb +11 -0
  155. data/lib/virtualbox/com/interface/3.2.x/nat_alias_mode.rb +11 -0
  156. data/lib/virtualbox/com/interface/3.2.x/nat_engine.rb +27 -0
  157. data/lib/virtualbox/com/interface/3.2.x/nat_protocol.rb +11 -0
  158. data/lib/virtualbox/com/interface/3.2.x/network_adapter.rb +34 -0
  159. data/lib/virtualbox/com/interface/3.2.x/network_adapter_type.rb +11 -0
  160. data/lib/virtualbox/com/interface/3.2.x/network_attachment_type.rb +11 -0
  161. data/lib/virtualbox/com/interface/3.2.x/nsiexception.rb +23 -0
  162. data/lib/virtualbox/com/interface/3.2.x/nsisupports.rb +15 -0
  163. data/lib/virtualbox/com/interface/3.2.x/parallel_port.rb +17 -0
  164. data/lib/virtualbox/com/interface/3.2.x/pointing_hid_type.rb +11 -0
  165. data/lib/virtualbox/com/interface/3.2.x/port_mode.rb +11 -0
  166. data/lib/virtualbox/com/interface/3.2.x/progress.rb +63 -0
  167. data/lib/virtualbox/com/interface/3.2.x/serial_port.rb +19 -0
  168. data/lib/virtualbox/com/interface/3.2.x/session.rb +18 -0
  169. data/lib/virtualbox/com/interface/3.2.x/session_state.rb +11 -0
  170. data/lib/virtualbox/com/interface/3.2.x/session_type.rb +11 -0
  171. data/lib/virtualbox/com/interface/3.2.x/shared_folder.rb +17 -0
  172. data/lib/virtualbox/com/interface/3.2.x/snapshot.rb +20 -0
  173. data/lib/virtualbox/com/interface/3.2.x/storage_bus.rb +11 -0
  174. data/lib/virtualbox/com/interface/3.2.x/storage_controller.rb +24 -0
  175. data/lib/virtualbox/com/interface/3.2.x/storage_controller_type.rb +11 -0
  176. data/lib/virtualbox/com/interface/3.2.x/system_properties.rb +42 -0
  177. data/lib/virtualbox/com/interface/3.2.x/usb_controller.rb +21 -0
  178. data/lib/virtualbox/com/interface/3.2.x/usb_device.rb +24 -0
  179. data/lib/virtualbox/com/interface/3.2.x/usb_device_filter.rb +23 -0
  180. data/lib/virtualbox/com/interface/3.2.x/usb_device_filter_action.rb +11 -0
  181. data/lib/virtualbox/com/interface/3.2.x/usb_device_state.rb +11 -0
  182. data/lib/virtualbox/com/interface/3.2.x/virtual_box_error_info.rb +17 -0
  183. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description.rb +19 -0
  184. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_type.rb +14 -0
  185. data/lib/virtualbox/com/interface/3.2.x/virtual_system_description_value_type.rb +11 -0
  186. data/lib/virtualbox/com/interface/3.2.x/virtualbox.rb +67 -0
  187. data/lib/virtualbox/com/interface/3.2.x/vrdp_auth_type.rb +11 -0
  188. data/lib/virtualbox/com/interface/3.2.x/vrdp_server.rb +21 -0
  189. data/lib/virtualbox/com/mscom_interface.rb +44 -0
  190. data/lib/virtualbox/com/nil_interface.rb +7 -0
  191. data/lib/virtualbox/com/util.rb +32 -0
  192. data/lib/virtualbox/cpu.rb +61 -0
  193. data/lib/virtualbox/dhcp_server.rb +89 -0
  194. data/lib/virtualbox/dvd.rb +27 -0
  195. data/lib/virtualbox/exceptions.rb +39 -0
  196. data/lib/virtualbox/ext/byte_normalizer.rb +17 -0
  197. data/lib/virtualbox/ext/glob_loader.rb +22 -0
  198. data/lib/virtualbox/ext/logger.rb +38 -0
  199. data/lib/virtualbox/ext/platform.rb +27 -0
  200. data/lib/virtualbox/ext/subclass_listing.rb +24 -0
  201. data/lib/virtualbox/extra_data.rb +127 -0
  202. data/lib/virtualbox/forwarded_port.rb +222 -0
  203. data/lib/virtualbox/global.rb +102 -0
  204. data/lib/virtualbox/guest_property.rb +116 -0
  205. data/lib/virtualbox/hard_drive.rb +246 -0
  206. data/lib/virtualbox/host.rb +71 -0
  207. data/lib/virtualbox/host_network_interface.rb +137 -0
  208. data/lib/virtualbox/hw_virtualization.rb +63 -0
  209. data/lib/virtualbox/lib.rb +84 -0
  210. data/lib/virtualbox/media.rb +20 -0
  211. data/lib/virtualbox/medium.rb +145 -0
  212. data/lib/virtualbox/medium_attachment.rb +61 -0
  213. data/lib/virtualbox/nat_engine.rb +71 -0
  214. data/lib/virtualbox/nat_forwarded_port.rb +171 -0
  215. data/lib/virtualbox/network_adapter.rb +166 -0
  216. data/lib/virtualbox/proxies/collection.rb +57 -0
  217. data/lib/virtualbox/shared_folder.rb +220 -0
  218. data/lib/virtualbox/snapshot.rb +185 -0
  219. data/lib/virtualbox/storage_controller.rb +160 -0
  220. data/lib/virtualbox/system_properties.rb +74 -0
  221. data/lib/virtualbox/usb_controller.rb +59 -0
  222. data/lib/virtualbox/usb_device_filter.rb +74 -0
  223. data/lib/virtualbox/version.rb +36 -0
  224. data/lib/virtualbox/virtual_system_description.rb +47 -0
  225. data/lib/virtualbox/vm.rb +684 -0
  226. data/lib/virtualbox/vrdp_server.rb +59 -0
  227. data/test/test_helper.rb +18 -0
  228. data/test/virtualbox/abstract_model/attributable_test.rb +269 -0
  229. data/test/virtualbox/abstract_model/dirty_test.rb +83 -0
  230. data/test/virtualbox/abstract_model/interface_attributes_test.rb +194 -0
  231. data/test/virtualbox/abstract_model/relatable_test.rb +348 -0
  232. data/test/virtualbox/abstract_model/validatable_test.rb +308 -0
  233. data/test/virtualbox/abstract_model/version_matcher_test.rb +41 -0
  234. data/test/virtualbox/abstract_model_test.rb +462 -0
  235. data/test/virtualbox/appliance_test.rb +159 -0
  236. data/test/virtualbox/audio_adapter_test.rb +83 -0
  237. data/test/virtualbox/bios_test.rb +83 -0
  238. data/test/virtualbox/com/abstract_enum_test.rb +49 -0
  239. data/test/virtualbox/com/abstract_implementer_test.rb +40 -0
  240. data/test/virtualbox/com/abstract_interface_test.rb +140 -0
  241. data/test/virtualbox/com/ffi/interface_test.rb +249 -0
  242. data/test/virtualbox/com/ffi/util_test.rb +108 -0
  243. data/test/virtualbox/com/ffi_interface_test.rb +42 -0
  244. data/test/virtualbox/com/implementer/base_test.rb +38 -0
  245. data/test/virtualbox/com/implementer/ffi_test.rb +527 -0
  246. data/test/virtualbox/com/implementer/mscom_test.rb +247 -0
  247. data/test/virtualbox/com/mscom_interface_test.rb +17 -0
  248. data/test/virtualbox/com/util_test.rb +17 -0
  249. data/test/virtualbox/cpu_test.rb +103 -0
  250. data/test/virtualbox/dhcp_server_test.rb +165 -0
  251. data/test/virtualbox/dvd_test.rb +28 -0
  252. data/test/virtualbox/ext/byte_normalizer_test.rb +34 -0
  253. data/test/virtualbox/ext/platform_test.rb +50 -0
  254. data/test/virtualbox/ext/subclass_listing_test.rb +25 -0
  255. data/test/virtualbox/extra_data_test.rb +155 -0
  256. data/test/virtualbox/forwarded_port_test.rb +286 -0
  257. data/test/virtualbox/global_test.rb +46 -0
  258. data/test/virtualbox/hard_drive_test.rb +141 -0
  259. data/test/virtualbox/host_network_interface_test.rb +254 -0
  260. data/test/virtualbox/host_test.rb +94 -0
  261. data/test/virtualbox/hw_virtualization_test.rb +103 -0
  262. data/test/virtualbox/lib_test.rb +93 -0
  263. data/test/virtualbox/medium_attachment_test.rb +147 -0
  264. data/test/virtualbox/medium_test.rb +192 -0
  265. data/test/virtualbox/nat_engine_test.rb +106 -0
  266. data/test/virtualbox/nat_forwarded_port_test.rb +222 -0
  267. data/test/virtualbox/network_adapter_test.rb +191 -0
  268. data/test/virtualbox/proxies/collection_test.rb +102 -0
  269. data/test/virtualbox/shared_folder_test.rb +219 -0
  270. data/test/virtualbox/snapshot_test.rb +231 -0
  271. data/test/virtualbox/storage_controller_test.rb +197 -0
  272. data/test/virtualbox/system_properties_test.rb +87 -0
  273. data/test/virtualbox/usb_controller_test.rb +112 -0
  274. data/test/virtualbox/usb_device_filter_test.rb +93 -0
  275. data/test/virtualbox/version_test.rb +59 -0
  276. data/test/virtualbox/virtual_system_description_test.rb +61 -0
  277. data/test/virtualbox/vm_test.rb +637 -0
  278. data/test/virtualbox/vrdp_server_test.rb +83 -0
  279. data/test/virtualbox_test.rb +11 -0
  280. data/virtualbox.gemspec +25 -0
  281. metadata +397 -0
@@ -0,0 +1,61 @@
1
+ module VirtualBox
2
+ # Represents the attachment of a medium (DVD, Hard Drive, etc) to a
3
+ # virtual machine, and specifically to a {StorageController}.
4
+ class MediumAttachment < AbstractModel
5
+ attribute :parent, :readonly => true, :property => false
6
+ attribute :controller_name, :readonly => :true, :property => :controller
7
+ attribute :port, :readonly => true
8
+ attribute :device, :readonly => true
9
+ attribute :passthrough, :readonly => true
10
+ attribute :type, :readonly => true
11
+ relationship :medium, :Medium
12
+ relationship :storage_controller, :StorageController
13
+
14
+ class << self
15
+ # Populates a relationship with another model.
16
+ #
17
+ # **This method typically won't be used except internally.**
18
+ #
19
+ # @return [Array<MediumAttachment>]
20
+ def populate_relationship(caller, imachine)
21
+ relation = Proxies::Collection.new(caller)
22
+
23
+ imachine.medium_attachments.each do |ima|
24
+ relation << new(caller, ima)
25
+ end
26
+
27
+ relation
28
+ end
29
+ end
30
+
31
+ def initialize(parent, imedium_attachment)
32
+ populate_attributes({:parent => parent}, :ignore_relationships => true)
33
+ initialize_attributes(imedium_attachment)
34
+ end
35
+
36
+ def initialize_attributes(ima)
37
+ load_interface_attributes(ima)
38
+ populate_relationship(:medium, ima.medium)
39
+ populate_relationship(:storage_controller, self)
40
+ end
41
+
42
+ # Detaches the medium from it's parent virtual machine. Note that this
43
+ # **does not delete** the `medium` which this attachment references; it
44
+ # merely removes the assocation of said medium with this attachment's
45
+ # virtual machine.
46
+ def detach
47
+ parent.with_open_session do |session|
48
+ machine = session.machine
49
+
50
+ machine.detach_device(storage_controller.name, port, device)
51
+ end
52
+ end
53
+
54
+ # Destroy this medium attachment. This simply detaches the medium attachment.
55
+ # This will also delete the medium if that option is specified.
56
+ def destroy(opts={})
57
+ detach
58
+ medium.destroy(opts[:destroy_medium] == :delete) if opts[:destroy_medium] && medium
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,71 @@
1
+ module VirtualBox
2
+ # Represents a NAT engine for a given {NetworkAdapter}. This data is
3
+ # available through the `nat_driver` relationship on
4
+ # {NetworkAdapter} only if the adapter is a NAT adapter.
5
+ class NATEngine < AbstractModel
6
+ attribute :parent, :readonly => true, :property => false
7
+ attribute :network
8
+ attribute :tftp_prefix
9
+ attribute :tftp_boot_file
10
+ attribute :tftp_next_server
11
+ attribute :alias_mode
12
+ attribute :dns_pass_domain
13
+ attribute :dns_proxy
14
+ attribute :dns_use_host_resolver
15
+ attribute :interface, :readonly => true, :property => false
16
+ relationship :forwarded_ports, :NATForwardedPort
17
+
18
+ class << self
19
+ # Populates the NAT engine for anything which is related to it.
20
+ #
21
+ # **This method typically won't be used except internally.**
22
+ #
23
+ # @return [NATEngine]
24
+ def populate_relationship(caller, inat)
25
+ return nil if inat.nil?
26
+ new(caller, inat)
27
+ end
28
+
29
+ # Saves the relationship. This simply calls {#save} on every
30
+ # member of the relationship.
31
+ #
32
+ # **This method typically won't be used except internally.**
33
+ def save_relationship(caller, item)
34
+ item.save
35
+ end
36
+ end
37
+
38
+ def initialize(caller, inat)
39
+ super()
40
+ initialize_attributes(caller, inat)
41
+ end
42
+
43
+ # Initializes the attributes of an existing NAT engine.
44
+ def initialize_attributes(parent, inat)
45
+ write_attribute(:parent, parent)
46
+ write_attribute(:interface, inat)
47
+
48
+ # Load the interface attributes associated with this model
49
+ load_interface_attributes(inat)
50
+ populate_relationships(inat)
51
+
52
+ # Clear dirty and set as existing
53
+ clear_dirty!
54
+ existing_record!
55
+ end
56
+
57
+ def save
58
+ modify_engine do |nat|
59
+ save_changed_interface_attributes(nat)
60
+ save_relationships
61
+ end
62
+ end
63
+
64
+ # Helper method to get the mutable `INATEngine` interface.
65
+ def modify_engine
66
+ parent.modify_adapter do |adapter|
67
+ yield adapter.nat_driver
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,171 @@
1
+ module VirtualBox
2
+ # When a VM uses NAT as its NIC type, VirtualBox acts like its
3
+ # own private router for all virtual machines. Because of this,
4
+ # the host machine can't access services within the guest machine.
5
+ # To get around this, NAT supports port forwarding, which allows the
6
+ # guest machine services to be forwarded to some port on the host
7
+ # machine. Port forwarding is done completely through {ExtraData}, but
8
+ # is a complicated enough procedure that this class was made to
9
+ # faciliate it.
10
+ #
11
+ # **Note:** After changing any forwarded ports, the entire VirtualBox
12
+ # process must be restarted completely for them to take effect. When
13
+ # working with the ruby library, this isn't so much of an issue, but
14
+ # if you have any VMs running, they must all be shut down and restarted.
15
+ #
16
+ # # Adding a new Forwarded Port
17
+ #
18
+ # Since forwarded ports rely on being part of a {VM}, we're going to
19
+ # assume that `vm` points to a {VM} which has already been found.
20
+ #
21
+ # port = VirtualBox::NATForwardedPort.new
22
+ # port.name = "apache" # This can be anything
23
+ # port.guestport = 80
24
+ # port.hostport = 8080
25
+ # vm.network_adapters[0].nat_driver.forwarded_ports << port
26
+ # port.save # Or vm.save
27
+ #
28
+ # # Modifying an Existing Forwarded Port
29
+ #
30
+ # This is assuming that `vm` is a local variable storing a {VM} object
31
+ # which has already been found.
32
+ #
33
+ # ports = vm.network_adapters[0].nat_driver.forwarded_ports
34
+ # ports.first.hostport = 1919
35
+ # vm.save
36
+ #
37
+ # # Deleting a Forwarded Port
38
+ #
39
+ # To delete a forwarded port, you simply destroy it like any other model:
40
+ #
41
+ # ports = vm.network_adapters[0].nat_driver.forwarded_ports
42
+ # ports.first.destroy
43
+ #
44
+ # # Attributes and Relationships
45
+ #
46
+ # Properties of the model are exposed using standard ruby instance
47
+ # methods which are generated on the fly. Because of this, they are not listed
48
+ # below as available instance methods.
49
+ #
50
+ # These attributes can be accessed and modified via standard ruby-style
51
+ # `instance.attribute` and `instance.attribute=` methods. The attributes are
52
+ # listed below.
53
+ #
54
+ # Relationships are also accessed like attributes but can't be set. Instead,
55
+ # they are typically references to other objects such as an {AttachedDevice} which
56
+ # in turn have their own attributes which can be modified.
57
+ #
58
+ # ## Attributes
59
+ #
60
+ # This is copied directly from the class header, but lists all available
61
+ # attributes. If you don't understand what this means, read {Attributable}.
62
+ #
63
+ # attribute :parent, :readonly => true
64
+ # attribute :name
65
+ # attribute :protocol, :default => "TCP"
66
+ # attribute :guestport
67
+ # attribute :hostport
68
+ #
69
+ class NATForwardedPort < AbstractModel
70
+ attribute :parent, :readonly => true, :property => false
71
+ attribute :parent_collection, :readonly => true, :property => false
72
+ attribute :name
73
+ attribute :protocol, :default => :tcp
74
+ attribute :guestport
75
+ attribute :hostport
76
+
77
+ class << self
78
+ # Populates a relationship with another model.
79
+ #
80
+ # **This method typically won't be used except internally.**
81
+ #
82
+ # @return [Array<NATForwardedPort>]
83
+ def populate_relationship(caller, interface)
84
+ relation = Proxies::Collection.new(caller)
85
+
86
+ interface.redirects.each do |key, value|
87
+ parts = key.split(",")
88
+
89
+ port = new({
90
+ :parent => caller,
91
+ :parent_collection => relation,
92
+ :name => parts[0],
93
+ :protocol => COM::Util.versioned_interface(:NATProtocol).index(parts[1]),
94
+ :guestport => parts[5].to_i,
95
+ :hostport => parts[3].to_i
96
+ })
97
+
98
+ port.existing_record!
99
+
100
+ relation.push(port)
101
+ end
102
+
103
+ relation
104
+ end
105
+
106
+ # Saves the relationship. This simply calls {#save} on every
107
+ # member of the relationship.
108
+ #
109
+ # **This method typically won't be used except internally.**
110
+ def save_relationship(caller, data)
111
+ data.dup.each do |fp|
112
+ fp.save
113
+ end
114
+ end
115
+ end
116
+
117
+ # @param [Hash] data The initial attributes to populate.
118
+ def initialize(data={})
119
+ super()
120
+ populate_attributes(data) if !data.empty?
121
+ end
122
+
123
+ # Validates a forwarded port.
124
+ def validate
125
+ super
126
+
127
+ validates_presence_of :parent
128
+ validates_presence_of :name
129
+ validates_presence_of :guestport
130
+ validates_presence_of :hostport
131
+ end
132
+
133
+ # Saves the forwarded port.
134
+ #
135
+ # @return [Boolean] True if command was successful, false otherwise.
136
+ def save
137
+ return true if !new_record? && !changed?
138
+ raise Exceptions::ValidationFailedException.new(errors) if !valid?
139
+ destroy(false) if !new_record?
140
+
141
+ parent.modify_engine do |nat|
142
+ nat.add_redirect(name, protocol, "", hostport, "", guestport)
143
+ end
144
+
145
+ clear_dirty!
146
+ existing_record!
147
+ true
148
+ end
149
+
150
+ # Destroys the port forwarding mapping.
151
+ #
152
+ # @return [Boolean] True if command was successful, false otherwise.
153
+ def destroy(update_collection=true)
154
+ return if new_record?
155
+ previous_name = name_changed? ? name_was : name
156
+ parent.modify_engine do |nat|
157
+ nat.remove_redirect(previous_name)
158
+ end
159
+ parent_collection.delete(self, true) if parent_collection && update_collection
160
+ new_record!
161
+ true
162
+ end
163
+
164
+ # Relationship callback when added to a collection. This is automatically
165
+ # called by any relationship collection when this object is added.
166
+ def added_to_relationship(proxy)
167
+ write_attribute(:parent, proxy.parent)
168
+ write_attribute(:parent_collection, proxy)
169
+ end
170
+ end
171
+ end
@@ -0,0 +1,166 @@
1
+ module VirtualBox
2
+ # Represents a single NIC (Network Interface Card) of a virtual machine.
3
+ #
4
+ # # Create a Network Adapter
5
+ #
6
+ # There is no need to have the ability to create a network adapter,
7
+ # since when creating a VM from scratch, all eight network adapter
8
+ # slots are created, but set to `attachment_type` `nil`. Simply
9
+ # modify the adapter you're interested in and save.
10
+ #
11
+ #
12
+ # # Editing a Network Adapter
13
+ #
14
+ # Network adapters can be modified directly in their relationship to other
15
+ # virtual machines. When {VM#save} is called, it will also save any
16
+ # changes to its relationships. Additionally, you may call {#save}
17
+ # on the relationship itself.
18
+ #
19
+ # vm = VirtualBox::VM.find("foo")
20
+ # vm.network_adapters[0].macaddress = @new_mac_address
21
+ # vm.save
22
+ #
23
+ # # Destroying a Network Adapter
24
+ #
25
+ # Network adapters can not actually be "destroyed" but can be
26
+ # removed by setting the `attachment_type` to `nil` and saving.
27
+ #
28
+ # # Attributes
29
+ #
30
+ # Properties of the model are exposed using standard ruby instance
31
+ # methods which are generated on the fly. Because of this, they are not listed
32
+ # below as available instance methods.
33
+ #
34
+ # These attributes can be accessed and modified via standard ruby-style
35
+ # `instance.attribute` and `instance.attribute=` methods. The attributes are
36
+ # listed below. If you aren't sure what this means or you can't understand
37
+ # why the below is listed, please read {Attributable}.
38
+ #
39
+ # attribute :slot, :readonly => true
40
+ # attribute :enabled, :boolean => true
41
+ # attribute :attachment_type
42
+ # attribute :adapter_type
43
+ # attribute :mac_address
44
+ # attribute :cable_connected, :boolean => true
45
+ # attribute :nat_network
46
+ # attribute :internal_network
47
+ # attribute :host_interface
48
+ # attribute :interface, :readonly => true, :property => false
49
+ #
50
+ class NetworkAdapter < AbstractModel
51
+ attribute :parent, :readonly => true, :property => false
52
+ attribute :slot, :readonly => true
53
+ attribute :enabled, :boolean => true
54
+ attribute :attachment_type
55
+ attribute :adapter_type
56
+ attribute :mac_address
57
+ attribute :cable_connected, :boolean => true
58
+ attribute :nat_network
59
+ attribute :internal_network
60
+ attribute :host_interface
61
+ attribute :interface, :readonly => true, :property => false
62
+ relationship :nat_driver, :NATEngine, :version => "3.2", :lazy => true
63
+
64
+ class << self
65
+ # Populates the nic relationship for anything which is related to it.
66
+ #
67
+ # **This method typically won't be used except internally.**
68
+ #
69
+ # @return [Array<Nic>]
70
+ def populate_relationship(caller, imachine)
71
+ relation = Proxies::Collection.new(caller)
72
+
73
+ # Get the count of network adapters
74
+ count = imachine.parent.system_properties.network_adapter_count
75
+
76
+ count.times do |i|
77
+ relation << new(caller, imachine.get_network_adapter(i))
78
+ end
79
+
80
+ relation
81
+ end
82
+
83
+ # Saves the relationship. This simply calls {#save} on every
84
+ # member of the relationship.
85
+ #
86
+ # **This method typically won't be used except internally.**
87
+ def save_relationship(caller, items)
88
+ items.each do |item|
89
+ item.save
90
+ end
91
+ end
92
+ end
93
+
94
+ def initialize(caller, inetwork)
95
+ super()
96
+
97
+ initialize_attributes(caller, inetwork)
98
+ end
99
+
100
+ # Initializes the attributes of an existing shared folder.
101
+ def initialize_attributes(parent, inetwork)
102
+ # Set the parent and interface
103
+ write_attribute(:parent, parent)
104
+ write_attribute(:interface, inetwork)
105
+
106
+ # Load the interface attributes
107
+ load_interface_attributes(inetwork)
108
+
109
+ # Clear dirtiness, since this should only be called initially and
110
+ # therefore shouldn't affect dirtiness
111
+ clear_dirty!
112
+
113
+ # But this is an existing record
114
+ existing_record!
115
+ end
116
+
117
+ def load_relationship(name)
118
+ # Lazy load the NAT driver. This is only supported by VirtualBox
119
+ # 3.2 and higher. This restriction is checked when the
120
+ # relationship attribute is accessed.
121
+ populate_relationship(:nat_driver, interface.nat_driver)
122
+ end
123
+
124
+ # Gets the host interface object associated with the class if it
125
+ # exists.
126
+ def host_interface_object
127
+ VirtualBox::Global.global.host.network_interfaces.find do |ni|
128
+ ni.name == host_interface
129
+ end
130
+ end
131
+
132
+ # Save a network adapter.
133
+ def save
134
+ modify_adapter do |adapter|
135
+ save_attachment_type(adapter)
136
+ save_changed_interface_attributes(adapter)
137
+ save_relationships
138
+ end
139
+ end
140
+
141
+ # Saves the attachment type. This should never be called directly. Instead,
142
+ # {save} should be called, which will call this method if appropriate.
143
+ def save_attachment_type(adapter)
144
+ return unless attachment_type_changed?
145
+
146
+ mapping = {
147
+ :nat => :attach_to_nat,
148
+ :bridged => :attach_to_bridged_interface,
149
+ :internal => :attach_to_internal_network,
150
+ :host_only => :attach_to_host_only_interface
151
+ }
152
+
153
+ adapter.send(mapping[attachment_type])
154
+ clear_dirty!(:attachment_type)
155
+ end
156
+
157
+ # Opens a session, yields the adapter and then saves the machine at
158
+ # the end
159
+ def modify_adapter
160
+ parent_machine.with_open_session do |session|
161
+ machine = session.machine
162
+ yield machine.get_network_adapter(slot)
163
+ end
164
+ end
165
+ end
166
+ end