fog 1.34.0 → 1.35.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (350) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +10 -24
  3. data/CHANGELOG.md +84 -0
  4. data/CONTRIBUTING.md +1 -1
  5. data/README.md +4 -20
  6. data/fog.gemspec +7 -5
  7. data/lib/fog.rb +1 -0
  8. data/lib/fog/bin.rb +1 -0
  9. data/lib/fog/digitalocean/compute_v2.rb +108 -0
  10. data/lib/fog/digitalocean/models/compute_v2/flavor.rb +17 -0
  11. data/lib/fog/digitalocean/models/compute_v2/flavors.rb +21 -0
  12. data/lib/fog/digitalocean/models/compute_v2/image.rb +25 -0
  13. data/lib/fog/digitalocean/models/compute_v2/images.rb +36 -0
  14. data/lib/fog/digitalocean/models/compute_v2/region.rb +13 -0
  15. data/lib/fog/digitalocean/models/compute_v2/regions.rb +21 -0
  16. data/lib/fog/digitalocean/models/compute_v2/server.rb +166 -0
  17. data/lib/fog/digitalocean/models/compute_v2/servers.rb +39 -0
  18. data/lib/fog/digitalocean/models/compute_v2/ssh_key.rb +30 -0
  19. data/lib/fog/digitalocean/models/compute_v2/ssh_keys.rb +35 -0
  20. data/lib/fog/digitalocean/requests/compute_v2/change_kernel.rb +44 -0
  21. data/lib/fog/digitalocean/requests/compute_v2/convert_to_snapshot.rb +44 -0
  22. data/lib/fog/digitalocean/requests/compute_v2/create_server.rb +93 -0
  23. data/lib/fog/digitalocean/requests/compute_v2/create_ssh_key.rb +47 -0
  24. data/lib/fog/digitalocean/requests/compute_v2/delete_server.rb +28 -0
  25. data/lib/fog/digitalocean/requests/compute_v2/delete_ssh_key.rb +28 -0
  26. data/lib/fog/digitalocean/requests/compute_v2/disable_backups.rb +45 -0
  27. data/lib/fog/digitalocean/requests/compute_v2/enable_ipv6.rb +44 -0
  28. data/lib/fog/digitalocean/requests/compute_v2/enable_private_networking.rb +44 -0
  29. data/lib/fog/digitalocean/requests/compute_v2/get_droplet_action.rb +36 -0
  30. data/lib/fog/digitalocean/requests/compute_v2/get_image_details.rb +43 -0
  31. data/lib/fog/digitalocean/requests/compute_v2/get_server_details.rb +84 -0
  32. data/lib/fog/digitalocean/requests/compute_v2/get_ssh_key.rb +34 -0
  33. data/lib/fog/digitalocean/requests/compute_v2/list_droplet_actions.rb +38 -0
  34. data/lib/fog/digitalocean/requests/compute_v2/list_flavors.rb +131 -0
  35. data/lib/fog/digitalocean/requests/compute_v2/list_images.rb +50 -0
  36. data/lib/fog/digitalocean/requests/compute_v2/list_regions.rb +94 -0
  37. data/lib/fog/digitalocean/requests/compute_v2/list_servers.rb +28 -0
  38. data/lib/fog/digitalocean/requests/compute_v2/list_ssh_keys.rb +26 -0
  39. data/lib/fog/digitalocean/requests/compute_v2/password_reset.rb +44 -0
  40. data/lib/fog/digitalocean/requests/compute_v2/power_cycle.rb +44 -0
  41. data/lib/fog/digitalocean/requests/compute_v2/power_off.rb +44 -0
  42. data/lib/fog/digitalocean/requests/compute_v2/power_on.rb +44 -0
  43. data/lib/fog/digitalocean/requests/compute_v2/reboot_server.rb +44 -0
  44. data/lib/fog/digitalocean/requests/compute_v2/rebuild.rb +44 -0
  45. data/lib/fog/digitalocean/requests/compute_v2/rename.rb +44 -0
  46. data/lib/fog/digitalocean/requests/compute_v2/resize.rb +48 -0
  47. data/lib/fog/digitalocean/requests/compute_v2/restore.rb +44 -0
  48. data/lib/fog/digitalocean/requests/compute_v2/shutdown.rb +44 -0
  49. data/lib/fog/digitalocean/requests/compute_v2/snapshot.rb +44 -0
  50. data/lib/fog/digitalocean/requests/compute_v2/transfer_image.rb +44 -0
  51. data/lib/fog/digitalocean/requests/compute_v2/update_ssh_key.rb +46 -0
  52. data/lib/fog/digitalocean/requests/compute_v2/upgrade.rb +44 -0
  53. data/lib/fog/digitalocean/service.rb +51 -0
  54. data/lib/fog/linode/models/compute/kernels.rb +1 -1
  55. data/lib/fog/opennebula/models/compute/flavor.rb +13 -13
  56. data/lib/fog/opennebula/requests/compute/template_pool.rb +14 -11
  57. data/lib/fog/openstack.rb +2 -0
  58. data/lib/fog/openstack/core.rb +30 -3
  59. data/lib/fog/openstack/identity.rb +8 -7
  60. data/lib/fog/openstack/identity_v3.rb +1 -0
  61. data/lib/fog/openstack/image.rb +35 -130
  62. data/lib/fog/openstack/image_v1.rb +142 -0
  63. data/lib/fog/openstack/image_v2.rb +137 -0
  64. data/lib/fog/openstack/models/image_v1/image.rb +78 -0
  65. data/lib/fog/openstack/models/image_v1/images.rb +70 -0
  66. data/lib/fog/openstack/models/image_v2/image.rb +149 -0
  67. data/lib/fog/openstack/models/image_v2/images.rb +67 -0
  68. data/lib/fog/openstack/models/orchestration/stack.rb +5 -0
  69. data/lib/fog/openstack/models/volume/volume_type.rb +25 -0
  70. data/lib/fog/openstack/orchestration.rb +1 -0
  71. data/lib/fog/openstack/requests/compute/server_actions.rb +14 -3
  72. data/lib/fog/openstack/requests/{image → image_v1}/add_member_to_image.rb +2 -0
  73. data/lib/fog/openstack/requests/image_v1/create_image.rb +78 -0
  74. data/lib/fog/openstack/requests/image_v1/delete_image.rb +25 -0
  75. data/lib/fog/openstack/requests/image_v1/get_image.rb +47 -0
  76. data/lib/fog/openstack/requests/image_v1/get_image_by_id.rb +34 -0
  77. data/lib/fog/openstack/requests/image_v1/get_image_members.rb +31 -0
  78. data/lib/fog/openstack/requests/image_v1/get_shared_images.rb +31 -0
  79. data/lib/fog/openstack/requests/image_v1/list_public_images.rb +35 -0
  80. data/lib/fog/openstack/requests/image_v1/list_public_images_detailed.rb +37 -0
  81. data/lib/fog/openstack/requests/image_v1/remove_member_from_image.rb +25 -0
  82. data/lib/fog/openstack/requests/image_v1/set_tenant.rb +21 -0
  83. data/lib/fog/openstack/requests/image_v1/update_image.rb +66 -0
  84. data/lib/fog/openstack/requests/image_v1/update_image_members.rb +39 -0
  85. data/lib/fog/openstack/requests/image_v2/add_member_to_image.rb +26 -0
  86. data/lib/fog/openstack/requests/image_v2/add_tag_to_image.rb +25 -0
  87. data/lib/fog/openstack/requests/image_v2/create_image.rb +54 -0
  88. data/lib/fog/openstack/requests/image_v2/deactivate_image.rb +25 -0
  89. data/lib/fog/openstack/requests/image_v2/delete_image.rb +25 -0
  90. data/lib/fog/openstack/requests/image_v2/download_image.rb +29 -0
  91. data/lib/fog/openstack/requests/image_v2/get_image.rb +47 -0
  92. data/lib/fog/openstack/requests/image_v2/get_image_by_id.rb +34 -0
  93. data/lib/fog/openstack/requests/image_v2/get_image_members.rb +31 -0
  94. data/lib/fog/openstack/requests/image_v2/get_member_details.rb +33 -0
  95. data/lib/fog/openstack/requests/image_v2/get_shared_images.rb +31 -0
  96. data/lib/fog/openstack/requests/image_v2/list_images.rb +35 -0
  97. data/lib/fog/openstack/requests/image_v2/reactivate_image.rb +25 -0
  98. data/lib/fog/openstack/requests/image_v2/remove_member_from_image.rb +25 -0
  99. data/lib/fog/openstack/requests/image_v2/remove_tag_from_image.rb +25 -0
  100. data/lib/fog/openstack/requests/image_v2/set_tenant.rb +21 -0
  101. data/lib/fog/openstack/requests/image_v2/update_image.rb +49 -0
  102. data/lib/fog/openstack/requests/image_v2/update_image_member.rb +34 -0
  103. data/lib/fog/openstack/requests/image_v2/upload_image.rb +30 -0
  104. data/lib/fog/openstack/requests/orchestration/patch_stack.rb +37 -0
  105. data/lib/fog/openstack/requests/volume/create_volume_type.rb +41 -0
  106. data/lib/fog/openstack/requests/{image/delete_image.rb → volume/delete_volume_type.rb} +6 -6
  107. data/lib/fog/openstack/requests/volume/get_quota_usage.rb +44 -0
  108. data/lib/fog/openstack/requests/volume/get_volume_type_details.rb +1 -1
  109. data/lib/fog/openstack/requests/volume/update_volume_type.rb +41 -0
  110. data/lib/fog/openstack/volume.rb +5 -0
  111. data/lib/fog/rackspace/models/compute_v2/server.rb +11 -1
  112. data/lib/fog/rackspace/models/compute_v2/servers.rb +2 -2
  113. data/lib/fog/rackspace/requests/compute_v2/create_server.rb +7 -2
  114. data/lib/fog/vcloud_director/requests/compute/get_execute_query.rb +13 -10
  115. data/lib/fog/version.rb +1 -1
  116. data/lib/fog/vsphere/models/compute/server.rb +1 -1
  117. data/lib/tasks/changelog_task.rb +1 -0
  118. data/spec/fog/openstack/identity_v3/authv3_a.yml +45 -52
  119. data/spec/fog/openstack/identity_v3/authv3_b.yml +45 -52
  120. data/spec/fog/openstack/identity_v3/authv3_c.yml +95 -101
  121. data/spec/fog/openstack/identity_v3/authv3_project.yml +68 -75
  122. data/spec/fog/openstack/identity_v3/authv3_token.yml +212 -174
  123. data/spec/fog/openstack/identity_v3/authv3_unscoped.yml +278 -266
  124. data/spec/fog/openstack/identity_v3/authv3_unscoped_reauth.yml +190 -202
  125. data/spec/fog/openstack/identity_v3/common_setup.yml +67 -445
  126. data/spec/fog/openstack/identity_v3/idv3_credential.yml +56 -26
  127. data/spec/fog/openstack/identity_v3/idv3_credential_crud.yml +292 -152
  128. data/spec/fog/openstack/identity_v3/idv3_domain.yml +99 -49
  129. data/spec/fog/openstack/identity_v3/idv3_domain_crud.yml +239 -119
  130. data/spec/fog/openstack/identity_v3/idv3_domain_group_roles_mutation.yml +414 -205
  131. data/spec/fog/openstack/identity_v3/idv3_domain_roles_mutation.yml +259 -136
  132. data/spec/fog/openstack/identity_v3/idv3_endpoint.yml +474 -472
  133. data/spec/fog/openstack/identity_v3/idv3_endpoints_crud.yml +679 -626
  134. data/spec/fog/openstack/identity_v3/idv3_group_crud_mutation.yml +536 -269
  135. data/spec/fog/openstack/identity_v3/idv3_policy.yml +76 -36
  136. data/spec/fog/openstack/identity_v3/idv3_policy_crud.yml +197 -97
  137. data/spec/fog/openstack/identity_v3/idv3_project.yml +135 -85
  138. data/spec/fog/openstack/identity_v3/idv3_project_crud.yml +237 -127
  139. data/spec/fog/openstack/identity_v3/idv3_project_group_user_roles_mutation.yml +625 -295
  140. data/spec/fog/openstack/identity_v3/idv3_project_hier_crud_list.yml +716 -355
  141. data/spec/fog/openstack/identity_v3/idv3_role.yml +134 -88
  142. data/spec/fog/openstack/identity_v3/idv3_role_crud.yml +312 -118
  143. data/spec/fog/openstack/identity_v3/idv3_service.yml +179 -133
  144. data/spec/fog/openstack/identity_v3/idv3_services_crud.yml +306 -212
  145. data/spec/fog/openstack/identity_v3/idv3_token.yml +213 -177
  146. data/spec/fog/openstack/identity_v3/idv3_user_crud.yml +345 -188
  147. data/spec/fog/openstack/identity_v3/idv3_users.yml +182 -116
  148. data/spec/fog/openstack/identity_v3_spec.rb +103 -85
  149. data/spec/fog/openstack/{identity_v3/idv3_other_region.yml → image_v1/common_setup.yml} +50 -93
  150. data/spec/fog/openstack/image_v1/list_images.yml +54 -0
  151. data/spec/fog/openstack/image_v1_spec.rb +24 -0
  152. data/spec/fog/openstack/image_v2/common_setup.yml +144 -0
  153. data/spec/fog/openstack/image_v2/image_schema.json +190 -0
  154. data/spec/fog/openstack/image_v2/image_v2_activation.yml +3988 -0
  155. data/spec/fog/openstack/image_v2/image_v2_create_id.yml +291 -0
  156. data/spec/fog/openstack/image_v2/image_v2_crud.yml +437 -0
  157. data/spec/fog/openstack/image_v2/image_v2_member_crudl.yml +451 -0
  158. data/spec/fog/openstack/image_v2/image_v2_tags.yml +532 -0
  159. data/spec/fog/openstack/image_v2/image_v2_upload_download.yml +3966 -0
  160. data/spec/fog/openstack/image_v2/minimal.ova +0 -0
  161. data/spec/fog/openstack/image_v2_spec.rb +285 -0
  162. data/spec/fog/openstack/image_v2_upload_spec.rb +74 -0
  163. data/spec/fog/openstack/shared_context.rb +14 -10
  164. data/tests/compute/helper.rb +0 -3
  165. data/tests/digitalocean/requests/compute_v2/list_flavors_tests.rb +25 -0
  166. data/tests/digitalocean/requests/compute_v2/list_images_tests.rb +25 -0
  167. data/tests/digitalocean/requests/compute_v2/list_regions_tests.rb +21 -0
  168. data/tests/digitalocean/requests/compute_v2/server_tests.rb +77 -0
  169. data/tests/helpers/mock_helper.rb +1 -0
  170. data/tests/opennebula/models/compute/flavor_tests.rb +1 -1
  171. data/tests/openstack/requests/orchestration/stack_tests.rb +5 -1
  172. data/tests/openstack/requests/volume/volume_type_tests.rb +32 -0
  173. data/tests/rackspace/models/compute_v2/server_tests.rb +7 -7
  174. metadata +160 -236
  175. data/gemfiles/Gemfile-ruby-1.8.7 +0 -17
  176. data/lib/fog/bin/xenserver.rb +0 -29
  177. data/lib/fog/openstack/models/image/image.rb +0 -76
  178. data/lib/fog/openstack/models/image/images.rb +0 -67
  179. data/lib/fog/openstack/requests/image/create_image.rb +0 -76
  180. data/lib/fog/openstack/requests/image/get_image.rb +0 -45
  181. data/lib/fog/openstack/requests/image/get_image_by_id.rb +0 -32
  182. data/lib/fog/openstack/requests/image/get_image_members.rb +0 -29
  183. data/lib/fog/openstack/requests/image/get_shared_images.rb +0 -29
  184. data/lib/fog/openstack/requests/image/list_public_images.rb +0 -33
  185. data/lib/fog/openstack/requests/image/list_public_images_detailed.rb +0 -35
  186. data/lib/fog/openstack/requests/image/remove_member_from_image.rb +0 -23
  187. data/lib/fog/openstack/requests/image/set_tenant.rb +0 -19
  188. data/lib/fog/openstack/requests/image/update_image.rb +0 -64
  189. data/lib/fog/openstack/requests/image/update_image_members.rb +0 -37
  190. data/lib/fog/xenserver.rb +0 -1
  191. data/lib/fog/xenserver/CHANGELOG.md +0 -77
  192. data/lib/fog/xenserver/compute.rb +0 -186
  193. data/lib/fog/xenserver/core.rb +0 -94
  194. data/lib/fog/xenserver/examples/README.md +0 -11
  195. data/lib/fog/xenserver/examples/chage_default_storage_repository.md +0 -99
  196. data/lib/fog/xenserver/examples/creating_servers.md +0 -168
  197. data/lib/fog/xenserver/examples/getting_started.md +0 -163
  198. data/lib/fog/xenserver/examples/networks-and-vlans.rb +0 -44
  199. data/lib/fog/xenserver/examples/storage_repositories.md +0 -94
  200. data/lib/fog/xenserver/models/compute/blob.rb +0 -22
  201. data/lib/fog/xenserver/models/compute/blobs.rb +0 -25
  202. data/lib/fog/xenserver/models/compute/bond.rb +0 -23
  203. data/lib/fog/xenserver/models/compute/bonds.rb +0 -25
  204. data/lib/fog/xenserver/models/compute/console.rb +0 -29
  205. data/lib/fog/xenserver/models/compute/consoles.rb +0 -25
  206. data/lib/fog/xenserver/models/compute/crash_dump.rb +0 -19
  207. data/lib/fog/xenserver/models/compute/crash_dumps.rb +0 -25
  208. data/lib/fog/xenserver/models/compute/dr_task.rb +0 -17
  209. data/lib/fog/xenserver/models/compute/dr_tasks.rb +0 -25
  210. data/lib/fog/xenserver/models/compute/gpu_group.rb +0 -22
  211. data/lib/fog/xenserver/models/compute/gpu_groups.rb +0 -25
  212. data/lib/fog/xenserver/models/compute/guest_metrics.rb +0 -26
  213. data/lib/fog/xenserver/models/compute/host.rb +0 -156
  214. data/lib/fog/xenserver/models/compute/host_cpu.rb +0 -34
  215. data/lib/fog/xenserver/models/compute/host_crash_dump.rb +0 -20
  216. data/lib/fog/xenserver/models/compute/host_crash_dumps.rb +0 -25
  217. data/lib/fog/xenserver/models/compute/host_metrics.rb +0 -26
  218. data/lib/fog/xenserver/models/compute/host_patch.rb +0 -25
  219. data/lib/fog/xenserver/models/compute/host_patchs.rb +0 -25
  220. data/lib/fog/xenserver/models/compute/hosts.rb +0 -25
  221. data/lib/fog/xenserver/models/compute/network.rb +0 -93
  222. data/lib/fog/xenserver/models/compute/networks.rb +0 -29
  223. data/lib/fog/xenserver/models/compute/pbd.rb +0 -37
  224. data/lib/fog/xenserver/models/compute/pbds.rb +0 -29
  225. data/lib/fog/xenserver/models/compute/pci.rb +0 -22
  226. data/lib/fog/xenserver/models/compute/pcis.rb +0 -25
  227. data/lib/fog/xenserver/models/compute/pgpu.rb +0 -20
  228. data/lib/fog/xenserver/models/compute/pgpus.rb +0 -25
  229. data/lib/fog/xenserver/models/compute/pif.rb +0 -54
  230. data/lib/fog/xenserver/models/compute/pif_metrics.rb +0 -28
  231. data/lib/fog/xenserver/models/compute/pifs.rb +0 -29
  232. data/lib/fog/xenserver/models/compute/pifs_metrics.rb +0 -25
  233. data/lib/fog/xenserver/models/compute/pool.rb +0 -75
  234. data/lib/fog/xenserver/models/compute/pool_patch.rb +0 -24
  235. data/lib/fog/xenserver/models/compute/pool_patchs.rb +0 -25
  236. data/lib/fog/xenserver/models/compute/pools.rb +0 -29
  237. data/lib/fog/xenserver/models/compute/role.rb +0 -19
  238. data/lib/fog/xenserver/models/compute/roles.rb +0 -25
  239. data/lib/fog/xenserver/models/compute/server.rb +0 -251
  240. data/lib/fog/xenserver/models/compute/server_appliance.rb +0 -21
  241. data/lib/fog/xenserver/models/compute/server_appliances.rb +0 -25
  242. data/lib/fog/xenserver/models/compute/servers.rb +0 -64
  243. data/lib/fog/xenserver/models/compute/storage_manager.rb +0 -28
  244. data/lib/fog/xenserver/models/compute/storage_managers.rb +0 -25
  245. data/lib/fog/xenserver/models/compute/storage_repositories.rb +0 -27
  246. data/lib/fog/xenserver/models/compute/storage_repository.rb +0 -90
  247. data/lib/fog/xenserver/models/compute/tunnel.rb +0 -20
  248. data/lib/fog/xenserver/models/compute/tunnels.rb +0 -25
  249. data/lib/fog/xenserver/models/compute/vbd.rb +0 -88
  250. data/lib/fog/xenserver/models/compute/vbd_metrics.rb +0 -25
  251. data/lib/fog/xenserver/models/compute/vbds.rb +0 -29
  252. data/lib/fog/xenserver/models/compute/vdi.rb +0 -102
  253. data/lib/fog/xenserver/models/compute/vdis.rb +0 -25
  254. data/lib/fog/xenserver/models/compute/vif.rb +0 -56
  255. data/lib/fog/xenserver/models/compute/vifs.rb +0 -25
  256. data/lib/fog/xenserver/models/compute/vlan.rb +0 -78
  257. data/lib/fog/xenserver/models/compute/vlans.rb +0 -35
  258. data/lib/fog/xenserver/models/compute/vmpp.rb +0 -35
  259. data/lib/fog/xenserver/models/compute/vmpps.rb +0 -25
  260. data/lib/fog/xenserver/models/compute/vtpm.rb +0 -18
  261. data/lib/fog/xenserver/models/compute/vtpms.rb +0 -25
  262. data/lib/fog/xenserver/parser.rb +0 -34
  263. data/lib/fog/xenserver/parsers/get_hosts.rb +0 -16
  264. data/lib/fog/xenserver/parsers/get_networks.rb +0 -16
  265. data/lib/fog/xenserver/parsers/get_pools.rb +0 -16
  266. data/lib/fog/xenserver/parsers/get_records.rb +0 -16
  267. data/lib/fog/xenserver/parsers/get_storage_repositories.rb +0 -16
  268. data/lib/fog/xenserver/parsers/get_vbds.rb +0 -16
  269. data/lib/fog/xenserver/parsers/get_vifs.rb +0 -16
  270. data/lib/fog/xenserver/parsers/get_vms.rb +0 -16
  271. data/lib/fog/xenserver/requests/compute/clone_server.rb +0 -30
  272. data/lib/fog/xenserver/requests/compute/create_network.rb +0 -46
  273. data/lib/fog/xenserver/requests/compute/create_server.rb +0 -144
  274. data/lib/fog/xenserver/requests/compute/create_sr.rb +0 -88
  275. data/lib/fog/xenserver/requests/compute/create_vbd.rb +0 -43
  276. data/lib/fog/xenserver/requests/compute/create_vdi.rb +0 -57
  277. data/lib/fog/xenserver/requests/compute/create_vif.rb +0 -62
  278. data/lib/fog/xenserver/requests/compute/create_vlan.rb +0 -43
  279. data/lib/fog/xenserver/requests/compute/destroy_network.rb +0 -31
  280. data/lib/fog/xenserver/requests/compute/destroy_record.rb +0 -11
  281. data/lib/fog/xenserver/requests/compute/destroy_server.rb +0 -20
  282. data/lib/fog/xenserver/requests/compute/destroy_sr.rb +0 -28
  283. data/lib/fog/xenserver/requests/compute/destroy_vdi.rb +0 -20
  284. data/lib/fog/xenserver/requests/compute/destroy_vif.rb +0 -20
  285. data/lib/fog/xenserver/requests/compute/destroy_vlan.rb +0 -30
  286. data/lib/fog/xenserver/requests/compute/disable_host.rb +0 -23
  287. data/lib/fog/xenserver/requests/compute/eject_vbd.rb +0 -17
  288. data/lib/fog/xenserver/requests/compute/enable_host.rb +0 -22
  289. data/lib/fog/xenserver/requests/compute/get_record.rb +0 -31
  290. data/lib/fog/xenserver/requests/compute/get_records.rb +0 -24
  291. data/lib/fog/xenserver/requests/compute/insert_vbd.rb +0 -17
  292. data/lib/fog/xenserver/requests/compute/provision_server.rb +0 -17
  293. data/lib/fog/xenserver/requests/compute/reboot_host.rb +0 -17
  294. data/lib/fog/xenserver/requests/compute/reboot_server.rb +0 -17
  295. data/lib/fog/xenserver/requests/compute/scan_sr.rb +0 -17
  296. data/lib/fog/xenserver/requests/compute/set_affinity.rb +0 -19
  297. data/lib/fog/xenserver/requests/compute/set_attribute.rb +0 -19
  298. data/lib/fog/xenserver/requests/compute/shutdown_host.rb +0 -17
  299. data/lib/fog/xenserver/requests/compute/shutdown_server.rb +0 -17
  300. data/lib/fog/xenserver/requests/compute/snapshot_revert.rb +0 -24
  301. data/lib/fog/xenserver/requests/compute/snapshot_server.rb +0 -17
  302. data/lib/fog/xenserver/requests/compute/start_server.rb +0 -17
  303. data/lib/fog/xenserver/requests/compute/start_vm.rb +0 -19
  304. data/lib/fog/xenserver/requests/compute/unplug_pbd.rb +0 -20
  305. data/lib/fog/xenserver/requests/compute/unplug_vbd.rb +0 -25
  306. data/lib/fog/xenserver/utilities.rb +0 -8
  307. data/tests/xenserver/README +0 -21
  308. data/tests/xenserver/compute_tests.rb +0 -51
  309. data/tests/xenserver/helper.rb +0 -36
  310. data/tests/xenserver/models/compute/console_test.rb +0 -35
  311. data/tests/xenserver/models/compute/consoles_test.rb +0 -19
  312. data/tests/xenserver/models/compute/host_cpu_tests.rb +0 -58
  313. data/tests/xenserver/models/compute/host_metrics_tests.rb +0 -48
  314. data/tests/xenserver/models/compute/host_tests.rb +0 -98
  315. data/tests/xenserver/models/compute/hosts_tests.rb +0 -22
  316. data/tests/xenserver/models/compute/network_tests.rb +0 -79
  317. data/tests/xenserver/models/compute/networks_tests.rb +0 -22
  318. data/tests/xenserver/models/compute/pbd_tests.rb +0 -76
  319. data/tests/xenserver/models/compute/pbds_tests.rb +0 -22
  320. data/tests/xenserver/models/compute/pif_tests.rb +0 -58
  321. data/tests/xenserver/models/compute/pifs_tests.rb +0 -22
  322. data/tests/xenserver/models/compute/pool_tests.rb +0 -56
  323. data/tests/xenserver/models/compute/pools_tests.rb +0 -30
  324. data/tests/xenserver/models/compute/server_tests.rb +0 -184
  325. data/tests/xenserver/models/compute/servers_tests.rb +0 -89
  326. data/tests/xenserver/models/compute/storage_repositories_tests.rb +0 -30
  327. data/tests/xenserver/models/compute/storage_repository_tests.rb +0 -114
  328. data/tests/xenserver/models/compute/vbd_tests.rb +0 -115
  329. data/tests/xenserver/models/compute/vbds_tests.rb +0 -22
  330. data/tests/xenserver/models/compute/vif_tests.rb +0 -53
  331. data/tests/xenserver/models/compute/vifs_tests.rb +0 -22
  332. data/tests/xenserver/models/compute/vlan_tests.rb +0 -76
  333. data/tests/xenserver/models/compute/vlans_tests.rb +0 -36
  334. data/tests/xenserver/requests/compute/clone_server_tests.rb +0 -32
  335. data/tests/xenserver/requests/compute/create_network_tests.rb +0 -20
  336. data/tests/xenserver/requests/compute/create_server_tests.rb +0 -129
  337. data/tests/xenserver/requests/compute/create_sr_tests.rb +0 -54
  338. data/tests/xenserver/requests/compute/create_vdi_tests.rb +0 -80
  339. data/tests/xenserver/requests/compute/create_vif_tests.rb +0 -88
  340. data/tests/xenserver/requests/compute/create_vlan_tests.rb +0 -36
  341. data/tests/xenserver/requests/compute/destroy_network_tests.rb +0 -13
  342. data/tests/xenserver/requests/compute/destroy_sr_tests.rb +0 -46
  343. data/tests/xenserver/requests/compute/destroy_vdi_tests.rb +0 -25
  344. data/tests/xenserver/requests/compute/destroy_vlan_tests.rb +0 -36
  345. data/tests/xenserver/requests/compute/disable_host_tests.rb +0 -16
  346. data/tests/xenserver/requests/compute/enable_host_tests.rb +0 -16
  347. data/tests/xenserver/requests/compute/get_record_tests.rb +0 -15
  348. data/tests/xenserver/requests/compute/set_attribute_tests.rb +0 -66
  349. data/tests/xenserver/requests/compute/unplug_pbd_tests.rb +0 -48
  350. data/tests/xenserver/xenserver_tests.rb +0 -33
@@ -0,0 +1,285 @@
1
+ require 'fog/openstack/image_v2'
2
+
3
+ if RUBY_VERSION =~ /1.8/
4
+ require File.expand_path('../shared_context', __FILE__)
5
+ else
6
+ require_relative './shared_context'
7
+ end
8
+
9
+ RSpec.describe Fog::Image::OpenStack do
10
+
11
+ spec_data_folder = 'spec/fog/openstack/image_v2'
12
+
13
+ include_context 'OpenStack specs with VCR'
14
+ before :all do
15
+ setup_vcr_and_service(
16
+ :vcr_directory => spec_data_folder,
17
+ # :service_class => Fog::Image::OpenStack::V2
18
+ :service_class => Fog::Image::OpenStack # No need to be explicit - Fog will choose the latest available version
19
+ )
20
+ end
21
+
22
+ def cleanup_image image, image_name=nil, image_id=nil
23
+ # Delete the image
24
+ image.destroy if image
25
+ image_by_id = @service.images.find_by_id(image_id) rescue false if image_id
26
+ image_by_id.destroy if image_by_id
27
+ @service.images.all(:name => image_name).each do |image|
28
+ image.destroy
29
+ end if image_name
30
+ # Check that the deletion worked
31
+ expect { @service.images.find_by_id image_id }.to raise_error(Fog::Image::OpenStack::NotFound) if image_id
32
+ expect(@service.images.all(:name => image_name).length).to be 0 if image_name
33
+ end
34
+
35
+ it "CRUD & list images" do
36
+ VCR.use_cassette('image_v2_crud') do
37
+ image_name = 'foobar'
38
+ image_rename = 'baz'
39
+
40
+ expect(@service.images.all).to_not be_nil
41
+ begin
42
+ # Create an image called foobar
43
+ foobar_image = @service.images.create(:name => image_name)
44
+ foobar_id = foobar_image.id
45
+ expect(@service.images.all(:name => image_name).length).to be 1
46
+ expect(foobar_image.status).to eq 'queued'
47
+
48
+ # Rename it to baz
49
+ foobar_image.update(:name => image_rename) # see "Patch images" test below - for now this will be a simple synthesis of a JSON patch with op = 'replace'
50
+ expect(foobar_image.name).to eq image_rename
51
+ baz_image = @service.images.find_by_id foobar_id
52
+ expect(baz_image).to_not be_nil
53
+ expect(baz_image.id).to eq foobar_id
54
+ expect(baz_image.name).to eq image_rename
55
+
56
+ # Read the image freshly by listing images filtered by the new name
57
+ images = @service.images.all(:name => image_rename)
58
+ expect(images.length).to be 1
59
+ expect(images.first.id).to eq baz_image.id
60
+
61
+ ensure
62
+ cleanup_image baz_image
63
+ @service.images.all.select { |image| [image_name, image_rename].include? image.name }.each do |image|
64
+ image.destroy
65
+ end
66
+ # Check that the deletion worked
67
+ expect(@service.images.all.select { |image| [image_name, image_rename].include? image.name }.length).to be 0
68
+ end
69
+ end
70
+ end
71
+
72
+ it "Image creation with ID" do
73
+ VCR.use_cassette('image_v2_create_id') do
74
+ image_name = 'foobar_id'
75
+
76
+ # Here be dragons - highly recommend not to supply an ID when creating
77
+ begin
78
+ # increment this identifier when running test more than once, unless the VCR recording is being used
79
+ identifier = '11111111-2222-3333-aaaa-bbbbbbccccdf'
80
+
81
+ # Create an image with a specified ID
82
+ foobar_image = @service.images.create(:name => 'foobar_id', :id => identifier)
83
+ foobar_id = foobar_image.id
84
+ expect(@service.images.all(:name => image_name).length).to be 1
85
+ expect(foobar_image.status).to eq 'queued'
86
+ expect(foobar_id).to eq identifier
87
+
88
+ get_image = @service.images.find_by_id(identifier)
89
+ expect(get_image.name).to eq image_name
90
+
91
+ ensure
92
+ cleanup_image foobar_image, image_name, foobar_id
93
+ end
94
+ end
95
+ end
96
+
97
+ it "Image creation with specified location" do
98
+ VCR.use_cassette('image_v2_create_location') do
99
+
100
+ begin
101
+ # Create image with location of image data
102
+ pending "Figure out 'Create image with location of image data'"
103
+ fail
104
+
105
+ ensure
106
+ end
107
+ end
108
+ end
109
+
110
+ it "Image upload & download in bulk" do
111
+ VCR.use_cassette('image_v2_upload_download') do
112
+ image_name = 'foobar_up1'
113
+ begin
114
+ image_path = "#{spec_data_folder}/minimal.ova" # "no-op" virtual machine image, 80kB .ova file containing 64Mb dynamic disk
115
+
116
+ foobar_image = @service.images.create(:name => image_name,
117
+ :container_format => 'ovf',
118
+ :disk_format => 'vmdk'
119
+ )
120
+ foobar_id = foobar_image.id
121
+
122
+ # Upload data from File or IO object
123
+ foobar_image.upload_data File.new(image_path, 'r')
124
+
125
+ # Status should be saving or active
126
+ expect(@service.images.find_by_id(foobar_id).status).to satisfy { |value| ['saving', 'active'].include? value }
127
+
128
+ # Get an IO object from which to download image data - wait until finished saving though
129
+ while @service.images.find_by_id(foobar_id).status == 'saving' do
130
+ sleep 1
131
+ end
132
+ expect(@service.images.find_by_id(foobar_id).status).to eq 'active'
133
+
134
+ # Bulk download
135
+ downloaded_data = foobar_image.download_data
136
+ expect(downloaded_data.size).to eq File.size(image_path)
137
+
138
+ ensure
139
+ cleanup_image foobar_image, image_name
140
+ end
141
+ end
142
+ end
143
+
144
+ it "Deactivates and activates an image" do
145
+ VCR.use_cassette('image_v2_activation') do
146
+ image_name = 'foobar3a'
147
+ image_path = "spec/fog/openstack/image_v2/minimal.ova" # "no-op" virtual machine image, 80kB .ova file containing 64Mb dynamic disk
148
+
149
+ begin
150
+ # Create an image called foobar2
151
+ foobar_image = @service.images.create(:name => image_name,
152
+ :container_format => 'ovf',
153
+ :disk_format => 'vmdk'
154
+ )
155
+ foobar_id = foobar_image.id
156
+ foobar_image.upload_data File.new(image_path, 'r')
157
+ while @service.images.find_by_id(foobar_id).status == 'saving' do
158
+ sleep 1
159
+ end
160
+
161
+ foobar_image.deactivate
162
+ expect { foobar_image.download_data }.to raise_error(Excon::Errors::Forbidden)
163
+
164
+ foobar_image.reactivate
165
+ expect { foobar_image.download_data }.not_to raise_error
166
+ ensure
167
+ cleanup_image foobar_image, image_name
168
+ end
169
+ end
170
+ end
171
+
172
+ it "Adds and deletes image tags" do
173
+ VCR.use_cassette('image_v2_tags') do
174
+ image_name = 'foobar3'
175
+ begin
176
+ # Create an image
177
+ foobar_image = @service.images.create(:name => image_name,
178
+ :container_format => 'ovf',
179
+ :disk_format => 'vmdk'
180
+ )
181
+ foobar_id = foobar_image.id
182
+
183
+ foobar_image.add_tag 'tag1'
184
+ expect(@service.images.find_by_id(foobar_id).tags).to contain_exactly('tag1')
185
+
186
+ foobar_image.add_tags ['tag2', 'tag3', 'tag4']
187
+ expect(@service.images.find_by_id(foobar_id).tags).to contain_exactly('tag1', 'tag2', 'tag3', 'tag4')
188
+
189
+ foobar_image.remove_tag 'tag2'
190
+ expect(@service.images.find_by_id(foobar_id).tags).to contain_exactly('tag1', 'tag3', 'tag4')
191
+
192
+ foobar_image.remove_tags ['tag1', 'tag3']
193
+ expect(@service.images.find_by_id(foobar_id).tags).to contain_exactly('tag4')
194
+
195
+ ensure
196
+ cleanup_image foobar_image, image_name
197
+ end
198
+ end
199
+ end
200
+
201
+ it "CRUD and list image members" do
202
+ VCR.use_cassette('image_v2_member_crudl') do
203
+ image_name = 'foobar4'
204
+ tenant_id = 'tenant1'
205
+ begin
206
+ # Create an image called foobar
207
+ foobar_image = @service.images.create(:name => image_name)
208
+ foobar_id = foobar_image.id
209
+
210
+ expect(foobar_image.members.size).to be 0
211
+ foobar_image.add_member tenant_id
212
+ expect(foobar_image.members.size).to be 1
213
+
214
+ member = foobar_image.member tenant_id
215
+ expect(member).to_not be_nil
216
+ expect(member['status']).to eq 'pending'
217
+
218
+ member['status'] = 'accepted'
219
+ foobar_image.update_member member
220
+ expect(foobar_image.member(tenant_id)['status']).to eq 'accepted'
221
+
222
+ foobar_image.remove_member member['member_id']
223
+ expect(foobar_image.members.size).to be 0
224
+ ensure
225
+ cleanup_image foobar_image, image_name
226
+ end
227
+ end
228
+ end
229
+
230
+ it "Gets JSON schemas for 'images', 'image', 'members', 'member'" do
231
+ VCR.use_cassette('image_v2_schemas') do
232
+ pending 'Fetching JSON schemas: to be implemented'
233
+ fail
234
+ end
235
+ end
236
+
237
+ it "CRUD resource types" do
238
+ VCR.use_cassette('image_v2_resource_type_crud') do
239
+ pending 'CRUD resource types: to be implemented'
240
+ fail
241
+ end
242
+ end
243
+
244
+ it "CRUD namespace metadata definition" do
245
+ VCR.use_cassette('image_v2_namespace_metadata_crud') do
246
+ pending 'CRUD namespace metadata definition: to be implemented'
247
+ fail
248
+ end
249
+ end
250
+
251
+ it "CRUD property metadata definition" do
252
+ VCR.use_cassette('image_v2_property_metadata_crud') do
253
+ pending 'CRUD property metadata definition: to be implemented'
254
+ fail
255
+ end
256
+ end
257
+
258
+ it "CRUD object metadata definition" do
259
+ VCR.use_cassette('image_v2_object_metadata_crud') do
260
+ pending 'CRUD object metadata definition: to be implemented'
261
+ fail
262
+ end
263
+ end
264
+
265
+ it "CRUD tag metadata definition" do
266
+ VCR.use_cassette('image_v2_tag_metadata_crud') do
267
+ pending 'CRUD tag metadata definition: to be implemented'
268
+ fail
269
+ end
270
+ end
271
+
272
+ it "CRUD schema metadata definition" do
273
+ VCR.use_cassette('image_v2_schema_metadata_crud') do
274
+ pending 'CRUD schema metadata definition: to be implemented'
275
+ fail
276
+ end
277
+ end
278
+
279
+ it "Creates, lists & gets tasks" do
280
+ VCR.use_cassette('image_v2_task_clg') do
281
+ pending 'Creates, lists & gets tasks: to be implemented'
282
+ fail
283
+ end
284
+ end
285
+ end
@@ -0,0 +1,74 @@
1
+ require 'fog/openstack/identity_v3'
2
+ require 'fog/openstack/image_v2'
3
+
4
+ RSpec.describe Fog::Image::OpenStack do
5
+
6
+ it "Upload/download image data using chunked IO" do
7
+ if ENV['OS_AUTH_URL'] # We only run this against a live system, because VCR's use of Webmock stops Excon :response_block from working correctly
8
+
9
+ @os_auth_url = ENV['OS_AUTH_URL']
10
+
11
+ # allow us to ignore dev certificates on servers
12
+ Excon.defaults[:ssl_verify_peer] = false if ENV['SSL_VERIFY_PEER'] == 'false'
13
+
14
+ # setup the service object
15
+ @service = Fog::Image::OpenStack.new({
16
+ :openstack_auth_url => "#{@os_auth_url}/auth/tokens",
17
+ :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
18
+ :openstack_api_key => ENV['OS_PASSWORD'] || 'password',
19
+ :openstack_username => ENV['OS_USERNAME'] || 'admin',
20
+ :openstack_domain_name => ENV['OS_USER_DOMAIN_NAME'] || 'Default',
21
+ :openstack_project_name => ENV['OS_PROJECT_NAME'] || 'admin'
22
+ }) unless @service
23
+
24
+ spec_data_folder = 'spec/fog/openstack/image_v2'
25
+
26
+ begin
27
+ ####
28
+ ## Upload & download data using request/response blocks so we can stream data effectively
29
+ ####
30
+ image_path = "#{spec_data_folder}/minimal.ova" # "no-op" virtual machine image, 80kB .ova file containing 64Mb dynamic disk
31
+
32
+ foobar_image = @service.images.create(:name => 'foobar_up2',
33
+ :container_format => 'ovf',
34
+ :disk_format => 'vmdk'
35
+ )
36
+ foobar_id = foobar_image.id
37
+
38
+ data_file = File.new(image_path, 'r')
39
+ chunker = lambda do
40
+ # Excon.defaults[:chunk_size] defaults to 1048576, ie 1MB
41
+ # to_s will convert the nil received after everything is read to the final empty chunk
42
+ data_file.read(Excon.defaults[:chunk_size]).to_s
43
+ end
44
+ foobar_image.upload_data(:request_block => chunker)
45
+
46
+ # Make sure the upload is finished
47
+ while @service.images.find_by_id(foobar_id).status == 'saving' do
48
+ sleep 1
49
+ end
50
+ expect(@service.images.find_by_id(foobar_id).status).to eq 'active'
51
+
52
+ size = 0
53
+ read_block = lambda do |chunk, remaining, total|
54
+ size += chunk.size
55
+ end
56
+ foobar_image.download_data(:response_block => read_block)
57
+ expect(size).to eq File.size(image_path)
58
+
59
+ ensure
60
+ # Delete the image
61
+ foobar_image.destroy if foobar_image
62
+
63
+ @service.images.all(:name => 'foobar_up2').each do |image|
64
+ image.destroy
65
+ end
66
+
67
+ # Check that the deletion worked
68
+ expect { @service.images.find_by_id foobar_id }.to raise_error(Fog::Image::OpenStack::NotFound) if foobar_id
69
+ expect(@service.images.all(:name => 'foobar_up2').length).to be 0
70
+ end
71
+ end
72
+ end
73
+
74
+ end
@@ -3,6 +3,9 @@ require 'rspec/expectations'
3
3
  require 'vcr'
4
4
  require 'fog/openstack/identity'
5
5
  require 'fog/openstack/identity_v3'
6
+ require 'fog/openstack/image'
7
+ require 'fog/openstack/image_v1'
8
+ require 'fog/openstack/image_v2'
6
9
  require 'fog/openstack/network'
7
10
 
8
11
  #
@@ -40,7 +43,7 @@ RSpec.shared_context 'OpenStack specs with VCR' do
40
43
  Fog.interval = 0
41
44
  # use an auth URL that matches our VCR recordings (IdentityV2 for most
42
45
  # services, but IdentityV3 test obviously needs IdentityV3 auth URL)
43
- if [Fog::Identity::OpenStack::V3, Fog::Network::OpenStack].include? @service_class
46
+ if [Fog::Identity::OpenStack::V3, Fog::Image::OpenStack, Fog::Image::OpenStack::V1, Fog::Network::OpenStack].include? @service_class
44
47
  @os_auth_url = 'http://devstack.openstack.stack:5000/v3'
45
48
  else
46
49
  @os_auth_url = 'http://devstack.openstack.stack:5000/v2.0'
@@ -73,19 +76,20 @@ RSpec.shared_context 'OpenStack specs with VCR' do
73
76
  if @service_class == Fog::Identity::OpenStack::V3 || @os_auth_url.end_with?('/v3')
74
77
  options = {
75
78
  :openstack_auth_url => "#{@os_auth_url}/auth/tokens",
76
- :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
77
- :openstack_api_key => ENV['OS_PASSWORD'] || 'password',
78
- :openstack_username => ENV['OS_USERNAME'] || 'admin',
79
- :openstack_domain_name => ENV['OS_USER_DOMAIN_NAME'] || 'Default',
80
- :openstack_project_name => ENV['OS_PROJECT_NAME'] || 'admin'
79
+ :openstack_region => ENV['OS_REGION_NAME'] || options[:region_name] || 'RegionOne',
80
+ :openstack_api_key => ENV['OS_PASSWORD'] || options[:password] || 'password',
81
+ :openstack_username => ENV['OS_USERNAME'] || options[:username] || 'admin',
82
+ :openstack_domain_name => ENV['OS_USER_DOMAIN_NAME']|| options[:domain_name] || 'Default',
83
+ :openstack_project_name => ENV['OS_PROJECT_NAME']|| options[:project_name] || 'admin'
81
84
  }
85
+ options[:openstack_service_type] = [ENV['OS_AUTH_SERVICE']] if ENV['OS_AUTH_SERVICE']
82
86
  else
83
87
  options = {
84
88
  :openstack_auth_url => "#{@os_auth_url}/tokens",
85
- :openstack_region => ENV['OS_REGION_NAME'] || 'RegionOne',
86
- :openstack_api_key => ENV['OS_PASSWORD'] || 'devstack',
87
- :openstack_username => ENV['OS_USERNAME'] || 'admin',
88
- :openstack_tenant => ENV['OS_PROJECT_NAME'] || 'admin'
89
+ :openstack_region => ENV['OS_REGION_NAME'] || options[:region_name] || 'RegionOne',
90
+ :openstack_api_key => ENV['OS_PASSWORD'] || options[:password] || 'devstack',
91
+ :openstack_username => ENV['OS_USERNAME'] || options[:username] || 'admin',
92
+ :openstack_tenant => ENV['OS_PROJECT_NAME'] || options[:project_name] || 'admin'
89
93
  # FIXME: Identity V3 not properly supported by other services yet
90
94
  # :openstack_user_domain => ENV['OS_USER_DOMAIN_NAME'] || 'Default',
91
95
  # :openstack_project_domain => ENV['OS_PROJECT_DOMAIN_NAME'] || 'Default',
@@ -109,9 +109,6 @@ def compute_providers
109
109
  :name => "fog_#{Time.now.to_i}"
110
110
  },
111
111
  :mocked => true
112
- },
113
- :xenserver => {
114
- :mocked => false
115
112
  }
116
113
  }
117
114
  end
@@ -0,0 +1,25 @@
1
+ Shindo.tests('Fog::Compute::DigitalOceanV2 | list_flavors request', ['digitalocean', 'compute']) do
2
+ service = Fog::Compute.new(:provider => 'DigitalOcean', :version => 'V2')
3
+
4
+ size_format = {
5
+ 'slug' => String,
6
+ 'memory' => Integer,
7
+ 'vcpus' => Integer,
8
+ 'disk' => Integer,
9
+ 'transfer' => Float,
10
+ 'price_monthly' => Float,
11
+ 'price_hourly' => Float,
12
+ 'regions' => Array,
13
+ 'available' => Fog::Boolean,
14
+ }
15
+
16
+ tests('success') do
17
+ tests('#list_flavors') do
18
+ service.list_flavors.body['sizes'].each do |size|
19
+ tests('format').data_matches_schema(size_format) do
20
+ size
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,25 @@
1
+ Shindo.tests('Fog::Compute::DigitalOceanV2 | list_images request', ['digitalocean', 'compute']) do
2
+ service = Fog::Compute.new(:provider => 'DigitalOcean', :version => 'V2')
3
+
4
+ image_format = {
5
+ 'id' => Integer,
6
+ 'name' => String,
7
+ 'type' => String,
8
+ 'distribution' => String,
9
+ 'slug' => Fog::Nullable::String,
10
+ 'public' => Fog::Boolean,
11
+ 'regions' => Array,
12
+ 'min_disk_size' => Fog::Nullable::Integer,
13
+ 'created_at' => String,
14
+ }
15
+
16
+ tests('success') do
17
+ tests('#list_images') do
18
+ service.list_images.body['images'].each do |image|
19
+ tests('format').data_matches_schema(image_format) do
20
+ image
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end