fog 1.36.0 → 1.37.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +61 -0
  3. data/Rakefile +0 -3
  4. data/fog.gemspec +4 -3
  5. data/lib/fog/digitalocean/compute_v2.rb +2 -1
  6. data/lib/fog/digitalocean/examples/getting_started.md +24 -48
  7. data/lib/fog/digitalocean/models/compute_v2/server.rb +4 -0
  8. data/lib/fog/digitalocean/models/compute_v2/ssh_key.rb +17 -16
  9. data/lib/fog/digitalocean/requests/compute_v2/delete_ssh_key.rb +1 -1
  10. data/lib/fog/digitalocean/requests/compute_v2/get_image_details.rb +1 -2
  11. data/lib/fog/openstack.rb +2 -0
  12. data/lib/fog/openstack/common.rb +46 -0
  13. data/lib/fog/openstack/compute.rb +3 -1
  14. data/lib/fog/openstack/core.rb +15 -3
  15. data/lib/fog/openstack/docs/compute.md +1 -1
  16. data/lib/fog/openstack/identity.rb +0 -37
  17. data/lib/fog/openstack/identity_v2.rb +9 -3
  18. data/lib/fog/openstack/identity_v3.rb +8 -3
  19. data/lib/fog/openstack/image.rb +1 -41
  20. data/lib/fog/openstack/image_v1.rb +9 -3
  21. data/lib/fog/openstack/image_v2.rb +7 -2
  22. data/lib/fog/openstack/metering.rb +2 -1
  23. data/lib/fog/openstack/models/compute/server.rb +5 -0
  24. data/lib/fog/openstack/models/identity_v2/user.rb +6 -2
  25. data/lib/fog/openstack/models/volume/availability_zone.rb +1 -4
  26. data/lib/fog/openstack/models/volume/availability_zones.rb +1 -4
  27. data/lib/fog/openstack/models/volume/transfer.rb +1 -9
  28. data/lib/fog/openstack/models/volume/transfers.rb +1 -4
  29. data/lib/fog/openstack/models/volume/volume.rb +6 -18
  30. data/lib/fog/openstack/models/volume/volume_type.rb +0 -3
  31. data/lib/fog/openstack/models/volume/volume_types.rb +1 -4
  32. data/lib/fog/openstack/models/volume/volumes.rb +1 -4
  33. data/lib/fog/openstack/models/volume_v1/availability_zone.rb +15 -0
  34. data/lib/fog/openstack/models/volume_v1/availability_zones.rb +16 -0
  35. data/lib/fog/openstack/models/volume_v1/transfer.rb +18 -0
  36. data/lib/fog/openstack/models/volume_v1/transfers.rb +16 -0
  37. data/lib/fog/openstack/models/volume_v1/volume.rb +26 -0
  38. data/lib/fog/openstack/models/volume_v1/volume_type.rb +16 -0
  39. data/lib/fog/openstack/models/volume_v1/volume_types.rb +16 -0
  40. data/lib/fog/openstack/models/volume_v1/volumes.rb +16 -0
  41. data/lib/fog/openstack/models/volume_v2/availability_zone.rb +15 -0
  42. data/lib/fog/openstack/models/volume_v2/availability_zones.rb +16 -0
  43. data/lib/fog/openstack/models/volume_v2/transfer.rb +19 -0
  44. data/lib/fog/openstack/models/volume_v2/transfers.rb +16 -0
  45. data/lib/fog/openstack/models/volume_v2/volume.rb +27 -0
  46. data/lib/fog/openstack/models/volume_v2/volume_type.rb +16 -0
  47. data/lib/fog/openstack/models/volume_v2/volume_types.rb +16 -0
  48. data/lib/fog/openstack/models/volume_v2/volumes.rb +16 -0
  49. data/lib/fog/openstack/network.rb +2 -1
  50. data/lib/fog/openstack/orchestration.rb +2 -1
  51. data/lib/fog/openstack/planning.rb +2 -1
  52. data/lib/fog/openstack/requests/compute/evacuate_server.rb +26 -0
  53. data/lib/fog/openstack/requests/volume/accept_transfer.rb +8 -10
  54. data/lib/fog/openstack/requests/volume/create_transfer.rb +8 -10
  55. data/lib/fog/openstack/requests/volume/create_volume.rb +9 -40
  56. data/lib/fog/openstack/requests/volume/create_volume_snapshot.rb +13 -31
  57. data/lib/fog/openstack/requests/volume/create_volume_type.rb +2 -2
  58. data/lib/fog/openstack/requests/volume/delete_snapshot.rb +2 -2
  59. data/lib/fog/openstack/requests/volume/delete_transfer.rb +1 -3
  60. data/lib/fog/openstack/requests/volume/delete_volume.rb +2 -2
  61. data/lib/fog/openstack/requests/volume/delete_volume_type.rb +2 -2
  62. data/lib/fog/openstack/requests/volume/extend_volume.rb +2 -2
  63. data/lib/fog/openstack/requests/volume/get_quota.rb +2 -2
  64. data/lib/fog/openstack/requests/volume/get_quota_defaults.rb +7 -7
  65. data/lib/fog/openstack/requests/volume/get_quota_usage.rb +2 -2
  66. data/lib/fog/openstack/requests/volume/get_snapshot_details.rb +1 -20
  67. data/lib/fog/openstack/requests/volume/get_transfer_details.rb +1 -1
  68. data/lib/fog/openstack/requests/volume/get_volume_details.rb +1 -22
  69. data/lib/fog/openstack/requests/volume/get_volume_type_details.rb +2 -2
  70. data/lib/fog/openstack/requests/volume/list_snapshots.rb +2 -2
  71. data/lib/fog/openstack/requests/volume/list_snapshots_detailed.rb +2 -2
  72. data/lib/fog/openstack/requests/volume/list_transfers.rb +1 -1
  73. data/lib/fog/openstack/requests/volume/list_transfers_detailed.rb +1 -1
  74. data/lib/fog/openstack/requests/volume/list_volume_types.rb +2 -2
  75. data/lib/fog/openstack/requests/volume/list_volumes.rb +1 -34
  76. data/lib/fog/openstack/requests/volume/list_volumes_detailed.rb +1 -34
  77. data/lib/fog/openstack/requests/volume/list_zones.rb +2 -2
  78. data/lib/fog/openstack/requests/volume/set_tenant.rb +2 -2
  79. data/lib/fog/openstack/requests/volume/update_quota.rb +2 -2
  80. data/lib/fog/openstack/requests/volume/update_volume_type.rb +2 -2
  81. data/lib/fog/openstack/requests/volume_v1/accept_transfer.rb +2 -0
  82. data/lib/fog/openstack/requests/volume_v1/create_transfer.rb +2 -0
  83. data/lib/fog/openstack/requests/volume_v1/create_volume.rb +49 -0
  84. data/lib/fog/openstack/requests/volume_v1/create_volume_snapshot.rb +44 -0
  85. data/lib/fog/openstack/requests/volume_v1/create_volume_type.rb +2 -0
  86. data/lib/fog/openstack/requests/volume_v1/delete_snapshot.rb +2 -0
  87. data/lib/fog/openstack/requests/volume_v1/delete_transfer.rb +2 -0
  88. data/lib/fog/openstack/requests/volume_v1/delete_volume.rb +2 -0
  89. data/lib/fog/openstack/requests/volume_v1/delete_volume_type.rb +2 -0
  90. data/lib/fog/openstack/requests/volume_v1/extend_volume.rb +2 -0
  91. data/lib/fog/openstack/requests/volume_v1/get_quota.rb +2 -0
  92. data/lib/fog/openstack/requests/volume_v1/get_quota_defaults.rb +2 -0
  93. data/lib/fog/openstack/requests/volume_v1/get_quota_usage.rb +2 -0
  94. data/lib/fog/openstack/requests/volume_v1/get_snapshot_details.rb +32 -0
  95. data/lib/fog/openstack/requests/volume_v1/get_transfer_details.rb +2 -0
  96. data/lib/fog/openstack/requests/volume_v1/get_volume_details.rb +35 -0
  97. data/lib/fog/openstack/requests/volume_v1/get_volume_type_details.rb +2 -0
  98. data/lib/fog/openstack/requests/volume_v1/list_snapshots.rb +2 -0
  99. data/lib/fog/openstack/requests/volume_v1/list_snapshots_detailed.rb +2 -0
  100. data/lib/fog/openstack/requests/volume_v1/list_transfers.rb +2 -0
  101. data/lib/fog/openstack/requests/volume_v1/list_transfers_detailed.rb +2 -0
  102. data/lib/fog/openstack/requests/volume_v1/list_volume_types.rb +2 -0
  103. data/lib/fog/openstack/requests/volume_v1/list_volumes.rb +46 -0
  104. data/lib/fog/openstack/requests/volume_v1/list_volumes_detailed.rb +46 -0
  105. data/lib/fog/openstack/requests/volume_v1/list_zones.rb +2 -0
  106. data/lib/fog/openstack/requests/volume_v1/real.rb +11 -0
  107. data/lib/fog/openstack/requests/volume_v1/real_mock.rb +14 -0
  108. data/lib/fog/openstack/requests/volume_v1/set_tenant.rb +2 -0
  109. data/lib/fog/openstack/requests/volume_v1/update_quota.rb +2 -0
  110. data/lib/fog/openstack/requests/volume_v2/accept_transfer.rb +2 -0
  111. data/lib/fog/openstack/requests/volume_v2/create_transfer.rb +2 -0
  112. data/lib/fog/openstack/requests/volume_v2/create_volume.rb +49 -0
  113. data/lib/fog/openstack/requests/volume_v2/create_volume_snapshot.rb +43 -0
  114. data/lib/fog/openstack/requests/volume_v2/create_volume_type.rb +2 -0
  115. data/lib/fog/openstack/requests/volume_v2/delete_snapshot.rb +2 -0
  116. data/lib/fog/openstack/requests/volume_v2/delete_transfer.rb +2 -0
  117. data/lib/fog/openstack/requests/volume_v2/delete_volume.rb +2 -0
  118. data/lib/fog/openstack/requests/volume_v2/delete_volume_type.rb +2 -0
  119. data/lib/fog/openstack/requests/volume_v2/extend_volume.rb +2 -0
  120. data/lib/fog/openstack/requests/volume_v2/get_quota.rb +2 -0
  121. data/lib/fog/openstack/requests/volume_v2/get_quota_defaults.rb +2 -0
  122. data/lib/fog/openstack/requests/volume_v2/get_quota_usage.rb +2 -0
  123. data/lib/fog/openstack/requests/volume_v2/get_snapshot_details.rb +32 -0
  124. data/lib/fog/openstack/requests/volume_v2/get_transfer_details.rb +2 -0
  125. data/lib/fog/openstack/requests/volume_v2/get_volume_details.rb +35 -0
  126. data/lib/fog/openstack/requests/volume_v2/get_volume_type_details.rb +2 -0
  127. data/lib/fog/openstack/requests/volume_v2/list_snapshots.rb +2 -0
  128. data/lib/fog/openstack/requests/volume_v2/list_snapshots_detailed.rb +2 -0
  129. data/lib/fog/openstack/requests/volume_v2/list_transfers.rb +2 -0
  130. data/lib/fog/openstack/requests/volume_v2/list_transfers_detailed.rb +2 -0
  131. data/lib/fog/openstack/requests/volume_v2/list_volume_types.rb +2 -0
  132. data/lib/fog/openstack/requests/volume_v2/list_volumes.rb +46 -0
  133. data/lib/fog/openstack/requests/volume_v2/list_volumes_detailed.rb +46 -0
  134. data/lib/fog/openstack/requests/volume_v2/list_zones.rb +2 -0
  135. data/lib/fog/openstack/requests/volume_v2/real.rb +11 -0
  136. data/lib/fog/openstack/requests/volume_v2/real_mock.rb +14 -0
  137. data/lib/fog/openstack/requests/volume_v2/set_tenant.rb +2 -0
  138. data/lib/fog/openstack/requests/volume_v2/update_quota.rb +2 -0
  139. data/lib/fog/openstack/requests/volume_v2/update_volume_type.rb +2 -0
  140. data/lib/fog/openstack/storage.rb +2 -1
  141. data/lib/fog/openstack/volume.rb +21 -176
  142. data/lib/fog/openstack/volume_v1.rb +163 -0
  143. data/lib/fog/openstack/volume_v2.rb +164 -0
  144. data/lib/fog/rackspace/compute_v2.rb +1 -0
  145. data/lib/fog/rackspace/docs/compute_v2.md +1 -1
  146. data/lib/fog/rackspace/models/compute_v2/server.rb +14 -0
  147. data/lib/fog/rackspace/requests/compute_v2/get_vnc_console.rb +45 -0
  148. data/lib/fog/rackspace/requests/storage/put_container.rb +10 -6
  149. data/lib/fog/vcloud_director/compute.rb +18 -2
  150. data/lib/fog/vcloud_director/models/compute/disks.rb +6 -0
  151. data/lib/fog/vcloud_director/models/compute/networks.rb +7 -2
  152. data/lib/fog/vcloud_director/models/compute/vdc.rb +5 -0
  153. data/lib/fog/vcloud_director/models/compute/vm.rb +15 -1
  154. data/lib/fog/vcloud_director/parsers/compute/vm.rb +4 -0
  155. data/lib/fog/vcloud_director/parsers/compute/vms.rb +4 -0
  156. data/lib/fog/vcloud_director/requests/compute/delete_vapp.rb +30 -0
  157. data/lib/fog/vcloud_director/requests/compute/get_catalog.rb +24 -3
  158. data/lib/fog/vcloud_director/requests/compute/get_catalog_item.rb +23 -0
  159. data/lib/fog/vcloud_director/requests/compute/get_metadata.rb +11 -0
  160. data/lib/fog/vcloud_director/requests/compute/get_vapp.rb +1 -0
  161. data/lib/fog/vcloud_director/requests/compute/get_vm.rb +46 -0
  162. data/lib/fog/vcloud_director/requests/compute/get_vm_disks.rb +20 -0
  163. data/lib/fog/vcloud_director/requests/compute/get_vm_network.rb +25 -0
  164. data/lib/fog/vcloud_director/requests/compute/get_vms.rb +13 -0
  165. data/lib/fog/vcloud_director/requests/compute/instantiate_vapp_template.rb +70 -0
  166. data/lib/fog/vcloud_director/requests/compute/post_power_on_vapp.rb +35 -0
  167. data/lib/fog/vcloud_director/requests/compute/post_reconfigure_vm.rb +118 -0
  168. data/lib/fog/vcloud_director/requests/compute/post_update_vapp_metadata.rb +34 -0
  169. data/lib/fog/vcloud_director/requests/compute/put_guest_customization_section_vapp.rb +2 -1
  170. data/lib/fog/vcloud_director/requests/compute/put_network_connection_system_section_vapp.rb +31 -0
  171. data/lib/fog/version.rb +1 -1
  172. data/lib/tasks/changelog_task.rb +1 -0
  173. data/spec/fog/openstack/shared_context.rb +11 -2
  174. data/spec/fog/openstack/volume/common_setup.yml +74 -50
  175. data/spec/fog/openstack/volume/volume_crud.yml +286 -236
  176. data/spec/fog/openstack/volume/volume_extend.yml +270 -363
  177. data/spec/fog/openstack/volume/volume_transfer_and_accept.yml +418 -424
  178. data/spec/fog/openstack/volume/volume_transfer_and_delete.yml +292 -321
  179. data/spec/fog/openstack/volume/volume_type_read.yml +30 -36
  180. data/spec/fog/openstack/volume_spec.rb +251 -224
  181. data/spec/fog/openstack/volume_v1/common_setup.yml +100 -0
  182. data/spec/fog/openstack/volume_v1/volume_crud.yml +535 -0
  183. data/spec/fog/openstack/volume_v1/volume_extend.yml +596 -0
  184. data/spec/fog/openstack/volume_v1/volume_transfer_and_accept.yml +1010 -0
  185. data/spec/fog/openstack/volume_v1/volume_transfer_and_delete.yml +645 -0
  186. data/spec/fog/openstack/volume_v1/volume_type_read.yml +114 -0
  187. data/spec/fog/openstack/volume_v2/common_setup.yml +100 -0
  188. data/spec/fog/openstack/volume_v2/volume_crud.yml +611 -0
  189. data/spec/fog/openstack/volume_v2/volume_extend.yml +669 -0
  190. data/spec/fog/openstack/volume_v2/volume_transfer_and_accept.yml +1072 -0
  191. data/spec/fog/openstack/volume_v2/volume_transfer_and_delete.yml +666 -0
  192. data/spec/fog/openstack/volume_v2/volume_type_read.yml +114 -0
  193. data/tests/helpers/mock_helper.rb +0 -4
  194. data/tests/openstack/authenticate_tests.rb +4 -0
  195. data/tests/openstack/volume_tests.rb +4 -0
  196. data/tests/rackspace/requests/compute_v2/server_tests.rb +4 -0
  197. metadata +135 -152
  198. data/lib/fog/bin/vsphere.rb +0 -28
  199. data/lib/fog/vsphere.rb +0 -1
  200. data/lib/fog/vsphere/compute.rb +0 -474
  201. data/lib/fog/vsphere/core.rb +0 -39
  202. data/lib/fog/vsphere/models/compute/cluster.rb +0 -28
  203. data/lib/fog/vsphere/models/compute/clusters.rb +0 -23
  204. data/lib/fog/vsphere/models/compute/customfield.rb +0 -16
  205. data/lib/fog/vsphere/models/compute/customfields.rb +0 -24
  206. data/lib/fog/vsphere/models/compute/customvalue.rb +0 -14
  207. data/lib/fog/vsphere/models/compute/customvalues.rb +0 -34
  208. data/lib/fog/vsphere/models/compute/datacenter.rb +0 -44
  209. data/lib/fog/vsphere/models/compute/datacenters.rb +0 -20
  210. data/lib/fog/vsphere/models/compute/datastore.rb +0 -21
  211. data/lib/fog/vsphere/models/compute/datastores.rb +0 -22
  212. data/lib/fog/vsphere/models/compute/folder.rb +0 -24
  213. data/lib/fog/vsphere/models/compute/folders.rb +0 -24
  214. data/lib/fog/vsphere/models/compute/interface.rb +0 -91
  215. data/lib/fog/vsphere/models/compute/interfaces.rb +0 -67
  216. data/lib/fog/vsphere/models/compute/interfacetype.rb +0 -22
  217. data/lib/fog/vsphere/models/compute/interfacetypes.rb +0 -35
  218. data/lib/fog/vsphere/models/compute/network.rb +0 -18
  219. data/lib/fog/vsphere/models/compute/networks.rb +0 -23
  220. data/lib/fog/vsphere/models/compute/process.rb +0 -18
  221. data/lib/fog/vsphere/models/compute/resource_pool.rb +0 -19
  222. data/lib/fog/vsphere/models/compute/resource_pools.rb +0 -23
  223. data/lib/fog/vsphere/models/compute/scsicontroller.rb +0 -16
  224. data/lib/fog/vsphere/models/compute/server.rb +0 -325
  225. data/lib/fog/vsphere/models/compute/servers.rb +0 -37
  226. data/lib/fog/vsphere/models/compute/servertype.rb +0 -36
  227. data/lib/fog/vsphere/models/compute/servertypes.rb +0 -24
  228. data/lib/fog/vsphere/models/compute/snapshot.rb +0 -35
  229. data/lib/fog/vsphere/models/compute/snapshots.rb +0 -27
  230. data/lib/fog/vsphere/models/compute/template.rb +0 -11
  231. data/lib/fog/vsphere/models/compute/templates.rb +0 -20
  232. data/lib/fog/vsphere/models/compute/volume.rb +0 -99
  233. data/lib/fog/vsphere/models/compute/volumes.rb +0 -54
  234. data/lib/fog/vsphere/requests/compute/cloudinit_to_customspec.rb +0 -65
  235. data/lib/fog/vsphere/requests/compute/create_folder.rb +0 -22
  236. data/lib/fog/vsphere/requests/compute/create_vm.rb +0 -227
  237. data/lib/fog/vsphere/requests/compute/current_time.rb +0 -18
  238. data/lib/fog/vsphere/requests/compute/get_cluster.rb +0 -25
  239. data/lib/fog/vsphere/requests/compute/get_compute_resource.rb +0 -41
  240. data/lib/fog/vsphere/requests/compute/get_datacenter.rb +0 -31
  241. data/lib/fog/vsphere/requests/compute/get_datastore.rb +0 -30
  242. data/lib/fog/vsphere/requests/compute/get_folder.rb +0 -74
  243. data/lib/fog/vsphere/requests/compute/get_interface_type.rb +0 -15
  244. data/lib/fog/vsphere/requests/compute/get_network.rb +0 -59
  245. data/lib/fog/vsphere/requests/compute/get_resource_pool.rb +0 -26
  246. data/lib/fog/vsphere/requests/compute/get_server_type.rb +0 -32
  247. data/lib/fog/vsphere/requests/compute/get_template.rb +0 -16
  248. data/lib/fog/vsphere/requests/compute/get_virtual_machine.rb +0 -57
  249. data/lib/fog/vsphere/requests/compute/get_vm_first_scsi_controller.rb +0 -26
  250. data/lib/fog/vsphere/requests/compute/list_child_snapshots.rb +0 -71
  251. data/lib/fog/vsphere/requests/compute/list_clusters.rb +0 -72
  252. data/lib/fog/vsphere/requests/compute/list_compute_resources.rb +0 -92
  253. data/lib/fog/vsphere/requests/compute/list_customfields.rb +0 -21
  254. data/lib/fog/vsphere/requests/compute/list_datacenters.rb +0 -53
  255. data/lib/fog/vsphere/requests/compute/list_datastores.rb +0 -40
  256. data/lib/fog/vsphere/requests/compute/list_folders.rb +0 -44
  257. data/lib/fog/vsphere/requests/compute/list_interface_types.rb +0 -25
  258. data/lib/fog/vsphere/requests/compute/list_networks.rb +0 -38
  259. data/lib/fog/vsphere/requests/compute/list_processes.rb +0 -41
  260. data/lib/fog/vsphere/requests/compute/list_resource_pools.rb +0 -38
  261. data/lib/fog/vsphere/requests/compute/list_server_types.rb +0 -54
  262. data/lib/fog/vsphere/requests/compute/list_templates.rb +0 -48
  263. data/lib/fog/vsphere/requests/compute/list_virtual_machines.rb +0 -80
  264. data/lib/fog/vsphere/requests/compute/list_vm_customvalues.rb +0 -20
  265. data/lib/fog/vsphere/requests/compute/list_vm_interfaces.rb +0 -63
  266. data/lib/fog/vsphere/requests/compute/list_vm_snapshots.rb +0 -66
  267. data/lib/fog/vsphere/requests/compute/list_vm_volumes.rb +0 -52
  268. data/lib/fog/vsphere/requests/compute/modify_vm_interface.rb +0 -59
  269. data/lib/fog/vsphere/requests/compute/modify_vm_volume.rb +0 -25
  270. data/lib/fog/vsphere/requests/compute/revert_to_snapshot.rb +0 -30
  271. data/lib/fog/vsphere/requests/compute/set_vm_customvalue.rb +0 -17
  272. data/lib/fog/vsphere/requests/compute/vm_clone.rb +0 -727
  273. data/lib/fog/vsphere/requests/compute/vm_config_vnc.rb +0 -45
  274. data/lib/fog/vsphere/requests/compute/vm_destroy.rb +0 -23
  275. data/lib/fog/vsphere/requests/compute/vm_execute.rb +0 -47
  276. data/lib/fog/vsphere/requests/compute/vm_migrate.rb +0 -33
  277. data/lib/fog/vsphere/requests/compute/vm_power_off.rb +0 -39
  278. data/lib/fog/vsphere/requests/compute/vm_power_on.rb +0 -26
  279. data/lib/fog/vsphere/requests/compute/vm_reboot.rb +0 -31
  280. data/lib/fog/vsphere/requests/compute/vm_reconfig_cpus.rb +0 -23
  281. data/lib/fog/vsphere/requests/compute/vm_reconfig_hardware.rb +0 -24
  282. data/lib/fog/vsphere/requests/compute/vm_reconfig_memory.rb +0 -23
  283. data/lib/fog/vsphere/requests/compute/vm_take_snapshot.rb +0 -37
  284. data/tests/vsphere/compute_tests.rb +0 -53
  285. data/tests/vsphere/models/compute/server_tests.rb +0 -70
  286. data/tests/vsphere/models/compute/servers_tests.rb +0 -15
  287. data/tests/vsphere/requests/compute/current_time_tests.rb +0 -12
  288. data/tests/vsphere/requests/compute/get_network_tests.rb +0 -48
  289. data/tests/vsphere/requests/compute/list_child_snapshots_tests.rb +0 -10
  290. data/tests/vsphere/requests/compute/list_clusters_tests.rb +0 -11
  291. data/tests/vsphere/requests/compute/list_virtual_machines_tests.rb +0 -38
  292. data/tests/vsphere/requests/compute/list_vm_snapshots_tests.rb +0 -10
  293. data/tests/vsphere/requests/compute/revert_to_snapshot_tests.rb +0 -15
  294. data/tests/vsphere/requests/compute/set_vm_customvalue_tests.rb +0 -20
  295. data/tests/vsphere/requests/compute/vm_clone_tests.rb +0 -50
  296. data/tests/vsphere/requests/compute/vm_config_vnc_tests.rb +0 -19
  297. data/tests/vsphere/requests/compute/vm_destroy_tests.rb +0 -17
  298. data/tests/vsphere/requests/compute/vm_migrate_tests.rb +0 -16
  299. data/tests/vsphere/requests/compute/vm_power_off_tests.rb +0 -26
  300. data/tests/vsphere/requests/compute/vm_power_on_tests.rb +0 -17
  301. data/tests/vsphere/requests/compute/vm_reboot_tests.rb +0 -26
  302. data/tests/vsphere/requests/compute/vm_reconfig_cpus_tests.rb +0 -19
  303. data/tests/vsphere/requests/compute/vm_reconfig_hardware_tests.rb +0 -19
  304. data/tests/vsphere/requests/compute/vm_reconfig_memory_tests.rb +0 -19
  305. data/tests/vsphere/requests/compute/vm_take_snapshot_tests.rb +0 -19
@@ -2,119 +2,113 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: http://devstack.openstack.stack:8776/v1/a19e9490e4504b0b877c55510dfb2842/types
5
+ uri: http://devstack.openstack.stack:8776/v2/711f0a64ef5046c084ce904b4445d119/types
6
6
  body:
7
7
  encoding: US-ASCII
8
8
  string: ''
9
9
  headers:
10
10
  User-Agent:
11
- - fog/1.31.0 fog-core/1.31.1
12
- Proxy-Connection:
13
- - Keep-Alive
11
+ - fog-core/1.32.1
14
12
  Content-Type:
15
13
  - application/json
16
14
  Accept:
17
15
  - application/json
18
16
  X-Auth-Token:
19
- - fb5eafb443894cc59c09cf4608dbc5eb
17
+ - f8e9e59847aa47f1b80eb28452cef591
20
18
  response:
21
19
  status:
22
20
  code: 200
23
21
  message: ''
24
22
  headers:
25
23
  X-Compute-Request-Id:
26
- - req-d219712e-fc18-44bf-a9a8-01b8e4ca4dfd
24
+ - req-54416d94-ae11-4e32-9ebd-aee0bc1a1177
27
25
  Content-Type:
28
26
  - application/json
29
27
  Content-Length:
30
28
  - '206'
31
29
  X-Openstack-Request-Id:
32
- - req-d219712e-fc18-44bf-a9a8-01b8e4ca4dfd
30
+ - req-54416d94-ae11-4e32-9ebd-aee0bc1a1177
33
31
  Date:
34
- - Fri, 26 Jun 2015 14:39:27 GMT
32
+ - Thu, 22 Oct 2015 14:04:49 GMT
35
33
  body:
36
- encoding: US-ASCII
37
- string: ! '{"volume_types": [{"os-volume-type-access:is_public": true, "extra_specs":
38
- {"volume_backend_name": "lvmdriver-1"}, "id": "dfd01103-04cb-48ed-9cac-26e10b971812",
34
+ encoding: UTF-8
35
+ string: '{"volume_types": [{"os-volume-type-access:is_public": true, "extra_specs":
36
+ {"volume_backend_name": "lvmdriver-1"}, "id": "3637058f-9a35-451b-ab6c-5d5e2425d6ca",
39
37
  "name": "lvmdriver-1", "description": null}]}'
40
38
  http_version:
41
- recorded_at: Fri, 26 Jun 2015 14:39:26 GMT
39
+ recorded_at: Thu, 22 Oct 2015 14:04:30 GMT
42
40
  - request:
43
41
  method: get
44
- uri: http://devstack.openstack.stack:8776/v1/a19e9490e4504b0b877c55510dfb2842/types/dfd01103-04cb-48ed-9cac-26e10b971812
42
+ uri: http://devstack.openstack.stack:8776/v2/711f0a64ef5046c084ce904b4445d119/types/3637058f-9a35-451b-ab6c-5d5e2425d6ca
45
43
  body:
46
44
  encoding: US-ASCII
47
45
  string: ''
48
46
  headers:
49
47
  User-Agent:
50
- - fog/1.31.0 fog-core/1.31.1
51
- Proxy-Connection:
52
- - Keep-Alive
48
+ - fog-core/1.32.1
53
49
  Content-Type:
54
50
  - application/json
55
51
  Accept:
56
52
  - application/json
57
53
  X-Auth-Token:
58
- - fb5eafb443894cc59c09cf4608dbc5eb
54
+ - f8e9e59847aa47f1b80eb28452cef591
59
55
  response:
60
56
  status:
61
57
  code: 200
62
58
  message: ''
63
59
  headers:
64
60
  X-Compute-Request-Id:
65
- - req-bf6db357-855c-44c6-abde-5058252225b0
61
+ - req-4f689228-dbe2-40cd-aa33-3ca37acd5e23
66
62
  Content-Type:
67
63
  - application/json
68
64
  Content-Length:
69
65
  - '203'
70
66
  X-Openstack-Request-Id:
71
- - req-bf6db357-855c-44c6-abde-5058252225b0
67
+ - req-4f689228-dbe2-40cd-aa33-3ca37acd5e23
72
68
  Date:
73
- - Fri, 26 Jun 2015 14:39:27 GMT
69
+ - Thu, 22 Oct 2015 14:04:49 GMT
74
70
  body:
75
- encoding: US-ASCII
76
- string: ! '{"volume_type": {"os-volume-type-access:is_public": true, "extra_specs":
77
- {"volume_backend_name": "lvmdriver-1"}, "id": "dfd01103-04cb-48ed-9cac-26e10b971812",
71
+ encoding: UTF-8
72
+ string: '{"volume_type": {"os-volume-type-access:is_public": true, "extra_specs":
73
+ {"volume_backend_name": "lvmdriver-1"}, "id": "3637058f-9a35-451b-ab6c-5d5e2425d6ca",
78
74
  "name": "lvmdriver-1", "description": null}}'
79
75
  http_version:
80
- recorded_at: Fri, 26 Jun 2015 14:39:26 GMT
76
+ recorded_at: Thu, 22 Oct 2015 14:04:30 GMT
81
77
  - request:
82
78
  method: get
83
- uri: http://devstack.openstack.stack:8776/v1/a19e9490e4504b0b877c55510dfb2842/types?lvmdriver-1
79
+ uri: http://devstack.openstack.stack:8776/v2/711f0a64ef5046c084ce904b4445d119/types?lvmdriver-1
84
80
  body:
85
81
  encoding: US-ASCII
86
82
  string: ''
87
83
  headers:
88
84
  User-Agent:
89
- - fog/1.31.0 fog-core/1.31.1
90
- Proxy-Connection:
91
- - Keep-Alive
85
+ - fog-core/1.32.1
92
86
  Content-Type:
93
87
  - application/json
94
88
  Accept:
95
89
  - application/json
96
90
  X-Auth-Token:
97
- - fb5eafb443894cc59c09cf4608dbc5eb
91
+ - f8e9e59847aa47f1b80eb28452cef591
98
92
  response:
99
93
  status:
100
94
  code: 200
101
95
  message: ''
102
96
  headers:
103
97
  X-Compute-Request-Id:
104
- - req-af76f251-0a78-4152-b005-36bb164be5dd
98
+ - req-2e5a783a-b12c-48a6-ba15-9371eda9da5b
105
99
  Content-Type:
106
100
  - application/json
107
101
  Content-Length:
108
102
  - '206'
109
103
  X-Openstack-Request-Id:
110
- - req-af76f251-0a78-4152-b005-36bb164be5dd
104
+ - req-2e5a783a-b12c-48a6-ba15-9371eda9da5b
111
105
  Date:
112
- - Fri, 26 Jun 2015 14:39:28 GMT
106
+ - Thu, 22 Oct 2015 14:04:49 GMT
113
107
  body:
114
- encoding: US-ASCII
115
- string: ! '{"volume_types": [{"os-volume-type-access:is_public": true, "extra_specs":
116
- {"volume_backend_name": "lvmdriver-1"}, "id": "dfd01103-04cb-48ed-9cac-26e10b971812",
108
+ encoding: UTF-8
109
+ string: '{"volume_types": [{"os-volume-type-access:is_public": true, "extra_specs":
110
+ {"volume_backend_name": "lvmdriver-1"}, "id": "3637058f-9a35-451b-ab6c-5d5e2425d6ca",
117
111
  "name": "lvmdriver-1", "description": null}]}'
118
112
  http_version:
119
- recorded_at: Fri, 26 Jun 2015 14:39:27 GMT
113
+ recorded_at: Thu, 22 Oct 2015 14:04:30 GMT
120
114
  recorded_with: VCR 2.9.3
@@ -2,21 +2,35 @@ require 'fog/openstack/compute'
2
2
  require 'fog/openstack/identity'
3
3
  require 'fog/openstack/identity_v3'
4
4
  require 'fog/openstack/volume'
5
+ require 'fog/openstack/shared_context'
5
6
 
6
- if RUBY_VERSION =~ /1.8/
7
- require File.expand_path('../shared_context', __FILE__)
8
- else
9
- require_relative './shared_context'
10
- end
11
-
12
- RSpec.describe Fog::Volume::OpenStack do
13
-
7
+ [Fog::Volume::OpenStack,
8
+ Fog::Volume::OpenStack::V1,
9
+ Fog::Volume::OpenStack::V2].delete_if{|_class| ENV['TEST_CLASS'] && ENV['TEST_CLASS'] != _class.name}.each do |service_class|
10
+ RSpec.describe service_class do
14
11
  include_context 'OpenStack specs with VCR'
15
12
  before :all do
13
+ vcr_directory = 'spec/fog/openstack/volume' if service_class == Fog::Volume::OpenStack
14
+
15
+ vcr_directory = 'spec/fog/openstack/volume_v1' if service_class == Fog::Volume::OpenStack::V1
16
+
17
+ vcr_directory = 'spec/fog/openstack/volume_v2' if service_class == Fog::Volume::OpenStack::V2
18
+
16
19
  setup_vcr_and_service(
17
- :vcr_directory => 'spec/fog/openstack/volume',
18
- :service_class => Fog::Volume::OpenStack
20
+ :vcr_directory => vcr_directory,
21
+ :service_class => service_class
19
22
  )
23
+
24
+ # Account for the different parameter naming between v1 and v2 services
25
+ @name_param = :display_name unless v2?
26
+ @name_param = :name if v2?
27
+
28
+ @description_param = :display_description unless v2?
29
+ @description_param = :description if v2?
30
+ end
31
+
32
+ def v2?
33
+ @service.is_a? Fog::Volume::OpenStack::V2::Real
20
34
  end
21
35
 
22
36
  def setup_test_object(options)
@@ -24,9 +38,9 @@ RSpec.describe Fog::Volume::OpenStack do
24
38
  case type
25
39
  when :volume
26
40
  puts "Checking for leftovers..." if ENV['DEBUG_VERBOSE']
27
- volume_name = options[:display_name]
41
+ volume_name = options[@name_param]
28
42
  # if this fails, cleanup this object (it was left over from a failed test run)
29
- expect(@service.volumes.all(:display_name => volume_name).length).to be(0)
43
+ expect(@service.volumes.all(@name_param => volume_name).length).to be(0)
30
44
 
31
45
  puts "Creating volume #{volume_name}..." if ENV['DEBUG_VERBOSE']
32
46
  return @service.volumes.create(options)
@@ -46,73 +60,80 @@ RSpec.describe Fog::Volume::OpenStack do
46
60
  end
47
61
 
48
62
  def cleanup_test_object(collection, id)
49
- # has the object already been deleted?
50
- begin
51
- object = collection.get(id)
52
- rescue Fog::Compute::OpenStack::NotFound # "Compute", not "Volume"; see issue #3618
53
- true
63
+
64
+ # wait for the object to be deletable
65
+ Fog.wait_for do
66
+ begin
67
+ object = collection.get(id)
68
+ puts "Current status: #{object ? object.status : 'deleted'}" if ENV['DEBUG_VERBOSE']
69
+ object.nil? || (['available', 'error'].include? object.status.downcase)
70
+ end
54
71
  end
55
72
 
73
+ object = collection.get(id)
56
74
  puts "Deleting object #{object.class} #{id}..." if ENV['DEBUG_VERBOSE']
57
- object.destroy
75
+ object.destroy if object
58
76
 
59
77
  # wait for the object to be deleted
60
78
  Fog.wait_for do
61
79
  begin
62
80
  object = collection.get(id)
63
81
  puts "Current status: #{object ? object.status : 'deleted'}" if ENV['DEBUG_VERBOSE']
64
- false
65
- rescue Fog::Compute::OpenStack::NotFound # "Compute", not "Volume"; see issue #3618
66
- true
82
+ object.nil?
67
83
  end
68
84
  end
69
85
  end
70
86
 
71
87
  it 'CRUD volumes' do
72
88
  VCR.use_cassette('volume_crud') do
73
-
74
- volume_name = "fog-testvolume-1"
75
- volume_description = 'This is the volume description.'
76
- volume_size = 1 # in GB
77
-
78
- # create volume
79
- volume_id = setup_test_object(:type => :volume,
80
- :display_name => volume_name,
81
- :display_description => volume_description,
82
- :size => volume_size
83
- ).id
84
-
85
- expect(@service.volumes.all(:display_name => volume_name).length).to be 1
86
-
87
- # check retrieval of volume by ID
88
- puts "Retrieving volume by ID..." if ENV['DEBUG_VERBOSE']
89
-
90
- volume = @service.volumes.get(volume_id)
91
- expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
92
-
93
- expect(volume.id).to eq(volume_id)
94
- expect(volume.display_name).to eq(volume_name)
95
- expect(volume.display_description).to eq(volume_description)
96
- expect(volume.size).to eq(volume_size)
97
-
98
- puts "Waiting for volume to be available..." if ENV['DEBUG_VERBOSE']
99
- volume.wait_for { ready? }
100
-
101
- # check retrieval of volume by name
102
- puts "Retrieving volume by name..." if ENV['DEBUG_VERBOSE']
103
-
104
- volumes = @service.volumes.all(:display_name => volume_name)
105
- expect(volumes.length).to be 1
106
- volume = volumes[0]
107
- expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
108
-
109
- expect(volume.id).to eq(volume_id)
110
- expect(volume.display_name).to eq(volume_name)
111
- expect(volume.display_description).to eq(volume_description)
112
- expect(volume.size).to eq(volume_size)
113
-
114
- # delete volume
115
- cleanup_test_object(@service.volumes, volume_id)
89
+ begin
90
+ volume_name = "fog-testvolume-1"
91
+ volume_description = 'This is the volume description.'
92
+ volume_size = 1 # in GB
93
+
94
+ # create volume
95
+ volume_id = setup_test_object(:type => :volume,
96
+ @name_param => volume_name,
97
+ @description_param => volume_description,
98
+ :size => volume_size
99
+ ).id
100
+
101
+ expect(@service.volumes.all(@name_param => volume_name).length).to be 1
102
+
103
+ # check retrieval of volume by ID
104
+ puts "Retrieving volume by ID..." if ENV['DEBUG_VERBOSE']
105
+
106
+ volume = @service.volumes.get(volume_id)
107
+ expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
108
+
109
+ expect(volume.id).to eq(volume_id)
110
+ expect(volume.display_name).to eq(volume_name) unless v2?
111
+ expect(volume.name).to eq(volume_name) if v2?
112
+ expect(volume.display_description).to eq(volume_description) unless v2?
113
+ expect(volume.description).to eq(volume_description) if v2?
114
+ expect(volume.size).to eq(volume_size)
115
+
116
+ puts "Waiting for volume to be available..." if ENV['DEBUG_VERBOSE']
117
+ volume.wait_for { ready? }
118
+
119
+ # check retrieval of volume by name
120
+ puts "Retrieving volume by name..." if ENV['DEBUG_VERBOSE']
121
+
122
+ volumes = @service.volumes.all(@name_param => volume_name)
123
+ expect(volumes.length).to be 1
124
+ volume = volumes[0]
125
+ expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
126
+
127
+ expect(volume.id).to eq(volume_id)
128
+ expect(volume.display_name).to eq(volume_name) unless v2?
129
+ expect(volume.name).to eq(volume_name) if v2?
130
+ expect(volume.display_description).to eq(volume_description) unless v2?
131
+ expect(volume.description).to eq(volume_description) if v2?
132
+ expect(volume.size).to eq(volume_size)
133
+ ensure
134
+ # delete volume
135
+ cleanup_test_object(@service.volumes, volume_id)
136
+ end
116
137
  end
117
138
  end
118
139
 
@@ -152,175 +173,181 @@ RSpec.describe Fog::Volume::OpenStack do
152
173
 
153
174
  it 'can extend volumes' do
154
175
  VCR.use_cassette('volume_extend') do
155
-
156
- volume_size_small = 1 # in GB
157
- volume_size_large = 2 # in GB
158
-
159
- volume = setup_test_object(:type => :volume,
160
- :display_name => 'fog-testvolume-1',
161
- :size => volume_size_small
162
- )
163
- volume.wait_for { ready? and size == volume_size_small }
164
-
165
- # extend volume
166
- puts "Extending volume..." if ENV['DEBUG_VERBOSE']
167
- volume.extend(volume_size_large)
168
- volume.wait_for { ready? and size == volume_size_large }
169
-
170
- # shrinking is not allowed in OpenStack
171
- puts "Shrinking volume should fail..." if ENV['DEBUG_VERBOSE']
172
- expect { volume.extend(volume_size_small) }.to raise_error(Excon::Errors::BadRequest, /Invalid input received: New size for extend must be greater than current size./)
173
-
174
- # delete volume
175
- cleanup_test_object(@service.volumes, volume.id)
176
-
177
- # check that extending a non-existing volume fails
178
- puts "Extending deleted volume should fail..." if ENV['DEBUG_VERBOSE']
179
- expect { @service.extend_volume(volume.id, volume_size_small) }.to raise_error(Fog::Compute::OpenStack::NotFound)
176
+ begin
177
+ volume_size_small = 1 # in GB
178
+ volume_size_large = 2 # in GB
179
+
180
+ volume = setup_test_object(:type => :volume,
181
+ @name_param => 'fog-testvolume-1',
182
+ :size => volume_size_small
183
+ )
184
+ volume.wait_for { ready? and size == volume_size_small }
185
+
186
+ # extend volume
187
+ puts "Extending volume..." if ENV['DEBUG_VERBOSE']
188
+ volume.extend(volume_size_large)
189
+ volume.wait_for { ready? and size == volume_size_large }
190
+
191
+ # shrinking is not allowed in OpenStack
192
+ puts "Shrinking volume should fail..." if ENV['DEBUG_VERBOSE']
193
+ expect { volume.extend(volume_size_small) }.to raise_error(Excon::Errors::BadRequest, /Invalid input received: New size for extend must be greater than current size./)
194
+ ensure
195
+ # delete volume
196
+ cleanup_test_object(@service.volumes, volume.id)
197
+
198
+ # check that extending a non-existing volume fails
199
+ puts "Extending deleted volume should fail..." if ENV['DEBUG_VERBOSE']
200
+ expect { @service.extend_volume(volume.id, volume_size_small) }.to raise_error(Fog::Volume::OpenStack::NotFound)
201
+ end
180
202
  end
181
203
  end
182
204
 
183
205
  it 'can create and accept volume transfers' do
184
206
  VCR.use_cassette('volume_transfer_and_accept') do
185
-
186
- transfer_name = 'fog-testtransfer-1'
187
-
188
- # create volume object
189
- volume = setup_test_object(:type => :volume,
190
- :display_name => 'fog-testvolume-1',
191
- :size => 1
192
- )
193
- volume.wait_for { ready? }
194
-
195
- # create transfer object
196
- transfer = setup_test_object(:type => :transfer,
197
- :name => transfer_name,
198
- :volume_id => volume.id
199
- )
200
- # we need to save the auth_key NOW, it's only present in the response
201
- # from the create_transfer request
202
- auth_key = transfer.auth_key
203
- transfer_id = transfer.id
204
-
205
- # check retrieval of transfer by ID
206
- puts 'Retrieving transfer by ID...' if ENV['DEBUG_VERBOSE']
207
-
208
- transfer = @service.transfers.get(transfer_id)
209
- expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
210
-
211
- expect(transfer.id).to eq(transfer_id)
212
- expect(transfer.name).to eq(transfer_name)
213
- expect(transfer.volume_id).to eq(volume.id)
214
-
215
- # check retrieval of transfer by name
216
- puts 'Retrieving transfer by name...' if ENV['DEBUG_VERBOSE']
217
-
218
- transfers = @service.transfers.all(:name => transfer_name)
219
- expect(transfers.length).to be(1)
220
- transfer = transfers[0]
221
- expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
222
-
223
- expect(transfer.id).to eq(transfer_id)
224
- expect(transfer.name).to eq(transfer_name)
225
- expect(transfer.volume_id).to eq(volume.id)
226
-
227
- # to accept the transfer, we need a second connection to a different project
228
- puts 'Checking object visibility from different projects...' if ENV['DEBUG_VERBOSE']
229
- other_service = Fog::Volume::OpenStack.new(
230
- :openstack_auth_url => "#{@os_auth_url}/tokens",
231
- :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
232
- :openstack_api_key => ENV['OS_PASSWORD_OTHER'] || 'devstack',
233
- :openstack_username => ENV['OS_USERNAME_OTHER'] || 'demo',
234
- :openstack_tenant => ENV['OS_PROJECT_NAME_OTHER'] || 'demo'
235
- )
236
-
237
- # check that recipient cannot see the transfer object
238
- expect { other_service.transfers.get(transfer.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
239
- expect(other_service.transfers.all(:name => transfer_name).length).to be(0)
240
-
241
- # # check that recipient cannot see the volume before transfer
242
- # expect { other_service.volumes.get(volume.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
243
- # expect(other_service.volumes.all(:display_name => volume_name).length).to be(0)
244
-
245
- # The recipient can inexplicably see the volume even before the
246
- # transfer, so to confirm that the transfer happens, we record its tenant ID.
247
- expect(volume.tenant_id).to match(/^[0-9a-f-]+$/) # should look like a UUID
248
- source_tenant_id = volume.tenant_id
249
-
250
- # check that accept_transfer fails without valid transfer ID and auth key
251
- bogus_uuid = 'ec8ff7e8-81e2-4e12-b9fb-3e8890612c2d' # generated by Fog::UUID.uuid, but fixed to play nice with VCR
252
- expect { other_service.transfers.accept(bogus_uuid, auth_key) }.to raise_error(Fog::Compute::OpenStack::NotFound)
253
- expect { other_service.transfers.accept(transfer_id, 'invalidauthkey') }.to raise_error(Excon::Errors::BadRequest)
254
-
255
- # accept transfer
256
- puts 'Accepting transfer...' if ENV['DEBUG_VERBOSE']
257
- transfer = other_service.transfers.accept(transfer.id, auth_key)
258
- expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
259
-
260
- expect(transfer.id).to eq(transfer_id)
261
- expect(transfer.name).to eq(transfer_name)
262
-
263
- # check that recipient can see the volume
264
- volume = other_service.volumes.get(volume.id)
265
- expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
266
-
267
- # # check that sender cannot see the volume anymore
268
- # expect { @service.volumes.get(volume.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
269
- # expect(@service.volumes.all(:display_name => volume_name).length).to be(0)
270
-
271
- # As noted above, both users seem to be able to see the volume at all times.
272
- # Check change of ownership by looking at the tenant_id, instead.
273
- expect(volume.tenant_id).to match(/^[0-9a-f-]+$/) # should look like a UUID
274
- expect(volume.tenant_id).not_to eq(source_tenant_id)
275
-
276
- # check that the transfer object is gone on both sides
277
- [ @service, other_service ].each do |service|
278
- expect { service.transfers.get(transfer.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
279
- expect(service.transfers.all(:name => transfer_name).length).to be(0)
207
+ begin
208
+ transfer_name = 'fog-testtransfer-1'
209
+
210
+ # create volume object
211
+ volume = setup_test_object(:type => :volume,
212
+ @name_param => 'fog-testvolume-1',
213
+ :size => 1
214
+ )
215
+ volume.wait_for { ready? }
216
+
217
+ # create transfer object
218
+ transfer = setup_test_object(:type => :transfer,
219
+ :name => transfer_name,
220
+ :volume_id => volume.id
221
+ )
222
+ # we need to save the auth_key NOW, it's only present in the response
223
+ # from the create_transfer request
224
+ auth_key = transfer.auth_key
225
+ transfer_id = transfer.id
226
+
227
+ # check retrieval of transfer by ID
228
+ puts 'Retrieving transfer by ID...' if ENV['DEBUG_VERBOSE']
229
+
230
+ transfer = @service.transfers.get(transfer_id)
231
+ expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
232
+
233
+ expect(transfer.id).to eq(transfer_id)
234
+ expect(transfer.name).to eq(transfer_name)
235
+ expect(transfer.volume_id).to eq(volume.id)
236
+
237
+ # check retrieval of transfer by name
238
+ puts 'Retrieving transfer by name...' if ENV['DEBUG_VERBOSE']
239
+
240
+ transfers = @service.transfers.all(:name => transfer_name)
241
+ expect(transfers.length).to be(1)
242
+ transfer = transfers[0]
243
+ expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
244
+
245
+ expect(transfer.id).to eq(transfer_id)
246
+ expect(transfer.name).to eq(transfer_name)
247
+ expect(transfer.volume_id).to eq(volume.id)
248
+
249
+ # to accept the transfer, we need a second connection to a different project
250
+ puts 'Checking object visibility from different projects...' if ENV['DEBUG_VERBOSE']
251
+ other_service = @service.class.new(
252
+ :openstack_auth_url => "#{@os_auth_url}/auth/tokens",
253
+ :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
254
+ :openstack_api_key => ENV['OS_PASSWORD_OTHER'] || 'password',
255
+ :openstack_username => ENV['OS_USERNAME_OTHER'] || 'demo',
256
+ :openstack_domain_name => ENV['OS_USER_DOMAIN_NAME'] || 'Default',
257
+ :openstack_project_name => ENV['OS_PROJECT_NAME_OTHER'] || 'demo'
258
+ )
259
+
260
+ # check that recipient cannot see the transfer object
261
+ expect(other_service.transfers.get(transfer.id)).to be_nil
262
+ expect(other_service.transfers.all(:name => transfer_name).length).to be(0)
263
+
264
+ # # check that recipient cannot see the volume before transfer
265
+ # expect { other_service.volumes.get(volume.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
266
+ # expect(other_service.volumes.all(@name_param => volume_name).length).to be(0)
267
+
268
+ # The recipient can inexplicably see the volume even before the
269
+ # transfer, so to confirm that the transfer happens, we record its tenant ID.
270
+ expect(volume.tenant_id).to match(/^[0-9a-f-]+$/) # should look like a UUID
271
+ source_tenant_id = volume.tenant_id
272
+
273
+ # check that accept_transfer fails without valid transfer ID and auth key
274
+ bogus_uuid = 'ec8ff7e8-81e2-4e12-b9fb-3e8890612c2d' # generated by Fog::UUID.uuid, but fixed to play nice with VCR
275
+ expect { other_service.transfers.accept(bogus_uuid, auth_key) }.to raise_error(Fog::Volume::OpenStack::NotFound)
276
+ expect { other_service.transfers.accept(transfer_id, 'invalidauthkey') }.to raise_error(Excon::Errors::BadRequest)
277
+
278
+ # accept transfer
279
+ puts 'Accepting transfer...' if ENV['DEBUG_VERBOSE']
280
+ transfer = other_service.transfers.accept(transfer.id, auth_key)
281
+ expect(transfer).to be_a(Fog::Volume::OpenStack::Transfer)
282
+
283
+ expect(transfer.id).to eq(transfer_id)
284
+ expect(transfer.name).to eq(transfer_name)
285
+
286
+ # check that recipient can see the volume
287
+ volume = other_service.volumes.get(volume.id)
288
+ expect(volume).to be_a(Fog::Volume::OpenStack::Volume)
289
+
290
+ # # check that sender cannot see the volume anymore
291
+ # expect { @service.volumes.get(volume.id) }.to raise_error(Fog::Compute::OpenStack::NotFound)
292
+ # expect(@service.volumes.all(@name_param => volume_name).length).to be(0)
293
+
294
+ # As noted above, both users seem to be able to see the volume at all times.
295
+ # Check change of ownership by looking at the tenant_id, instead.
296
+ expect(volume.tenant_id).to match(/^[0-9a-f-]+$/) # should look like a UUID
297
+ expect(volume.tenant_id).not_to eq(source_tenant_id)
298
+
299
+ # check that the transfer object is gone on both sides
300
+ [@service, other_service].each do |service|
301
+ expect(service.transfers.get(transfer.id)).to be_nil
302
+ expect(service.transfers.all(:name => transfer_name).length).to be(0)
303
+ end
304
+ ensure
305
+ # cleanup volume
306
+ cleanup_test_object(other_service.volumes, volume.id)
280
307
  end
281
-
282
- # cleanup volume
283
- cleanup_test_object(other_service.volumes, volume.id)
284
308
  end
285
309
  end
286
310
 
287
311
  it 'can create and delete volume transfers' do
288
312
  VCR.use_cassette('volume_transfer_and_delete') do
289
- # create volume object
290
- volume = setup_test_object(:type => :volume,
291
- :display_name => 'fog-testvolume-1',
292
- :size => 1
293
- )
294
- volume.wait_for { ready? }
295
-
296
- # create transfer object
297
- transfer = setup_test_object(:type => :transfer,
298
- :name => 'fog-testtransfer-1',
299
- :volume_id => volume.id
300
- )
301
- # we need to save the auth_key NOW, it's only present in the response
302
- # from the create_transfer request
303
- auth_key = transfer.auth_key
304
- transfer_id = transfer.id
305
-
306
- # to try to accept the transfer, we need a second connection to a different project
307
- other_service = Fog::Volume::OpenStack.new(
308
- :openstack_auth_url => "#{@os_auth_url}/tokens",
309
- :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
310
- :openstack_api_key => ENV['OS_PASSWORD_OTHER'] || 'devstack',
311
- :openstack_username => ENV['OS_USERNAME_OTHER'] || 'demo',
312
- :openstack_tenant => ENV['OS_PROJECT_NAME_OTHER'] || 'demo'
313
- )
314
-
315
- # delete transfer again
316
- transfer.destroy
317
-
318
- # check that transfer cannot be accepted when it has been deleted
319
- puts 'Checking that accepting a deleted transfer fails...' if ENV['DEBUG_VERBOSE']
320
- expect { other_service.transfers.accept(transfer_id, auth_key) }.to raise_error(Fog::Compute::OpenStack::NotFound)
321
-
322
- # cleanup volume
323
- cleanup_test_object(@service.volumes, volume.id)
313
+ begin
314
+ # create volume object
315
+ volume = setup_test_object(:type => :volume,
316
+ @name_param => 'fog-testvolume-1',
317
+ :size => 1
318
+ )
319
+ volume.wait_for { ready? }
320
+
321
+ # create transfer object
322
+ transfer = setup_test_object(:type => :transfer,
323
+ :name => 'fog-testtransfer-1',
324
+ :volume_id => volume.id
325
+ )
326
+ # we need to save the auth_key NOW, it's only present in the response
327
+ # from the create_transfer request
328
+ auth_key = transfer.auth_key
329
+ transfer_id = transfer.id
330
+
331
+ # to try to accept the transfer, we need a second connection to a different project
332
+ other_service = @service.class.new(
333
+ :openstack_auth_url => "#{@os_auth_url}/auth/tokens",
334
+ :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
335
+ :openstack_api_key => ENV['OS_PASSWORD_OTHER'] || 'password',
336
+ :openstack_username => ENV['OS_USERNAME_OTHER'] || 'demo',
337
+ :openstack_domain_name => ENV['OS_USER_DOMAIN_NAME'] || 'Default',
338
+ :openstack_project_name => ENV['OS_PROJECT_NAME_OTHER'] || 'demo'
339
+ )
340
+
341
+ # delete transfer again
342
+ transfer.destroy
343
+
344
+ # check that transfer cannot be accepted when it has been deleted
345
+ puts 'Checking that accepting a deleted transfer fails...' if ENV['DEBUG_VERBOSE']
346
+ expect { other_service.transfers.accept(transfer_id, auth_key) }.to raise_error(Fog::Volume::OpenStack::NotFound)
347
+ ensure
348
+ # cleanup volume
349
+ cleanup_test_object(@service.volumes, volume.id)
350
+ end
324
351
  end
325
352
  end
326
353
 
@@ -331,5 +358,5 @@ RSpec.describe Fog::Volume::OpenStack do
331
358
 
332
359
 
333
360
  # TODO: tests for quotas
334
-
335
- end
361
+ end
362
+ end