fog-openstack 0.1.7 → 0.1.8

Sign up to get free protection for your applications and to get access to all the features.
Files changed (162) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +12 -28
  3. data/docs/workflow.md +129 -0
  4. data/examples/workflow/workflow-examples.rb +387 -0
  5. data/gemfiles/Gemfile-1.9 +1 -0
  6. data/lib/fog/openstack.rb +5 -1
  7. data/lib/fog/openstack/baremetal.rb +14 -38
  8. data/lib/fog/openstack/compute.rb +4 -33
  9. data/lib/fog/openstack/core.rb +104 -50
  10. data/lib/fog/openstack/identity.rb +2 -1
  11. data/lib/fog/openstack/identity_v2.rb +0 -2
  12. data/lib/fog/openstack/identity_v3.rb +0 -2
  13. data/lib/fog/openstack/image_v1.rb +6 -6
  14. data/lib/fog/openstack/image_v2.rb +7 -6
  15. data/lib/fog/openstack/introspection.rb +10 -35
  16. data/lib/fog/openstack/metering.rb +16 -35
  17. data/lib/fog/openstack/monitoring.rb +5 -31
  18. data/lib/fog/openstack/network.rb +5 -34
  19. data/lib/fog/openstack/nfv.rb +10 -35
  20. data/lib/fog/openstack/orchestration.rb +5 -40
  21. data/lib/fog/openstack/planning.rb +11 -36
  22. data/lib/fog/openstack/requests/compute/get_limits.rb +8 -7
  23. data/lib/fog/openstack/requests/network/update_router.rb +1 -1
  24. data/lib/fog/openstack/requests/workflow_v2/create_action.rb +28 -0
  25. data/lib/fog/openstack/requests/workflow_v2/create_action_execution.rb +31 -0
  26. data/lib/fog/openstack/requests/workflow_v2/create_cron_trigger.rb +55 -0
  27. data/lib/fog/openstack/requests/workflow_v2/create_environment.rb +31 -0
  28. data/lib/fog/openstack/requests/workflow_v2/create_execution.rb +30 -0
  29. data/lib/fog/openstack/requests/workflow_v2/create_workbook.rb +28 -0
  30. data/lib/fog/openstack/requests/workflow_v2/create_workflow.rb +28 -0
  31. data/lib/fog/openstack/requests/workflow_v2/delete_action.rb +25 -0
  32. data/lib/fog/openstack/requests/workflow_v2/delete_action_execution.rb +25 -0
  33. data/lib/fog/openstack/requests/workflow_v2/delete_cron_trigger.rb +25 -0
  34. data/lib/fog/openstack/requests/workflow_v2/delete_environment.rb +25 -0
  35. data/lib/fog/openstack/requests/workflow_v2/delete_execution.rb +25 -0
  36. data/lib/fog/openstack/requests/workflow_v2/delete_workbook.rb +25 -0
  37. data/lib/fog/openstack/requests/workflow_v2/delete_workflow.rb +25 -0
  38. data/lib/fog/openstack/requests/workflow_v2/get_action.rb +27 -0
  39. data/lib/fog/openstack/requests/workflow_v2/get_action_execution.rb +26 -0
  40. data/lib/fog/openstack/requests/workflow_v2/get_cron_trigger.rb +28 -0
  41. data/lib/fog/openstack/requests/workflow_v2/get_environment.rb +28 -0
  42. data/lib/fog/openstack/requests/workflow_v2/get_execution.rb +26 -0
  43. data/lib/fog/openstack/requests/workflow_v2/get_task.rb +27 -0
  44. data/lib/fog/openstack/requests/workflow_v2/get_workbook.rb +28 -0
  45. data/lib/fog/openstack/requests/workflow_v2/get_workflow.rb +28 -0
  46. data/lib/fog/openstack/requests/workflow_v2/list_action_executions.rb +28 -0
  47. data/lib/fog/openstack/requests/workflow_v2/list_actions.rb +30 -0
  48. data/lib/fog/openstack/requests/workflow_v2/list_cron_triggers.rb +28 -0
  49. data/lib/fog/openstack/requests/workflow_v2/list_environments.rb +28 -0
  50. data/lib/fog/openstack/requests/workflow_v2/list_executions.rb +28 -0
  51. data/lib/fog/openstack/requests/workflow_v2/list_services.rb +28 -0
  52. data/lib/fog/openstack/requests/workflow_v2/list_tasks.rb +28 -0
  53. data/lib/fog/openstack/requests/workflow_v2/list_workbooks.rb +28 -0
  54. data/lib/fog/openstack/requests/workflow_v2/list_workflows.rb +30 -0
  55. data/lib/fog/openstack/requests/workflow_v2/rerun_task.rb +33 -0
  56. data/lib/fog/openstack/requests/workflow_v2/update_action.rb +28 -0
  57. data/lib/fog/openstack/requests/workflow_v2/update_action_execution.rb +33 -0
  58. data/lib/fog/openstack/requests/workflow_v2/update_environment.rb +31 -0
  59. data/lib/fog/openstack/requests/workflow_v2/update_execution.rb +33 -0
  60. data/lib/fog/openstack/requests/workflow_v2/update_workbook.rb +28 -0
  61. data/lib/fog/openstack/requests/workflow_v2/update_workflow.rb +28 -0
  62. data/lib/fog/openstack/requests/workflow_v2/validate_action.rb +28 -0
  63. data/lib/fog/openstack/requests/workflow_v2/validate_workbook.rb +28 -0
  64. data/lib/fog/openstack/requests/workflow_v2/validate_workflow.rb +28 -0
  65. data/lib/fog/openstack/storage.rb +4 -35
  66. data/lib/fog/openstack/version.rb +1 -1
  67. data/lib/fog/openstack/volume_v1.rb +7 -5
  68. data/lib/fog/openstack/volume_v2.rb +7 -5
  69. data/lib/fog/openstack/workflow.rb +12 -0
  70. data/lib/fog/openstack/workflow_v2.rb +160 -0
  71. metadata +48 -95
  72. data/lib/fog/openstack/common.rb +0 -44
  73. data/tests/openstack/models/compute/images_tests.rb +0 -13
  74. data/tests/openstack/models/compute/security_group_tests.rb +0 -54
  75. data/tests/openstack/models/compute/server_tests.rb +0 -220
  76. data/tests/openstack/models/compute/service_tests.rb +0 -17
  77. data/tests/openstack/models/image/image_tests.rb +0 -36
  78. data/tests/openstack/models/image/images_tests.rb +0 -19
  79. data/tests/openstack/models/network/floating_ip_tests.rb +0 -35
  80. data/tests/openstack/models/network/floating_ips_tests.rb +0 -19
  81. data/tests/openstack/models/network/ike_policies_tests.rb +0 -28
  82. data/tests/openstack/models/network/ike_policy_tests.rb +0 -36
  83. data/tests/openstack/models/network/ipsec_policies_tests.rb +0 -26
  84. data/tests/openstack/models/network/ipsec_policy_tests.rb +0 -36
  85. data/tests/openstack/models/network/ipsec_site_connection_tests.rb +0 -50
  86. data/tests/openstack/models/network/ipsec_site_connections_tests.rb +0 -32
  87. data/tests/openstack/models/network/lb_health_monitor_tests.rb +0 -52
  88. data/tests/openstack/models/network/lb_health_monitors_tests.rb +0 -21
  89. data/tests/openstack/models/network/lb_member_tests.rb +0 -28
  90. data/tests/openstack/models/network/lb_members_tests.rb +0 -21
  91. data/tests/openstack/models/network/lb_pool_tests.rb +0 -53
  92. data/tests/openstack/models/network/lb_pools_tests.rb +0 -20
  93. data/tests/openstack/models/network/lb_vip_tests.rb +0 -39
  94. data/tests/openstack/models/network/lb_vips_tests.rb +0 -21
  95. data/tests/openstack/models/network/network_tests.rb +0 -61
  96. data/tests/openstack/models/network/networks_tests.rb +0 -21
  97. data/tests/openstack/models/network/port_tests.rb +0 -28
  98. data/tests/openstack/models/network/ports_tests.rb +0 -25
  99. data/tests/openstack/models/network/router_tests.rb +0 -39
  100. data/tests/openstack/models/network/routers_tests.rb +0 -21
  101. data/tests/openstack/models/network/security_group_rule_tests.rb +0 -27
  102. data/tests/openstack/models/network/security_group_rules_tests.rb +0 -25
  103. data/tests/openstack/models/network/security_group_tests.rb +0 -17
  104. data/tests/openstack/models/network/security_groups_tests.rb +0 -16
  105. data/tests/openstack/models/network/subnet_tests.rb +0 -30
  106. data/tests/openstack/models/network/subnets_tests.rb +0 -27
  107. data/tests/openstack/models/network/vpn_service_tests.rb +0 -27
  108. data/tests/openstack/models/network/vpn_services_tests.rb +0 -22
  109. data/tests/openstack/models/nfv/vnf_tests.rb +0 -35
  110. data/tests/openstack/models/nfv/vnfd_tests.rb +0 -23
  111. data/tests/openstack/models/nfv/vnfds_tests.rb +0 -31
  112. data/tests/openstack/models/nfv/vnfs_tests.rb +0 -38
  113. data/tests/openstack/models/planning/.gitkeep +0 -0
  114. data/tests/openstack/models/planning/plan_tests.rb +0 -51
  115. data/tests/openstack/models/planning/plans_tests.rb +0 -18
  116. data/tests/openstack/models/planning/role_tests.rb +0 -14
  117. data/tests/openstack/models/storage/file_tests.rb +0 -251
  118. data/tests/openstack/requests/compute/address_tests.rb +0 -58
  119. data/tests/openstack/requests/compute/aggregate_tests.rb +0 -59
  120. data/tests/openstack/requests/compute/availability_zone_tests.rb +0 -18
  121. data/tests/openstack/requests/compute/flavor_tests.rb +0 -95
  122. data/tests/openstack/requests/compute/helper.rb +0 -41
  123. data/tests/openstack/requests/compute/image_tests.rb +0 -58
  124. data/tests/openstack/requests/compute/keypair_tests.rb +0 -30
  125. data/tests/openstack/requests/compute/limit_tests.rb +0 -59
  126. data/tests/openstack/requests/compute/quota_tests.rb +0 -60
  127. data/tests/openstack/requests/compute/security_group_tests.rb +0 -61
  128. data/tests/openstack/requests/compute/server_tests.rb +0 -289
  129. data/tests/openstack/requests/compute/service_tests.rb +0 -33
  130. data/tests/openstack/requests/compute/tenant_tests.rb +0 -19
  131. data/tests/openstack/requests/compute/volume_tests.rb +0 -38
  132. data/tests/openstack/requests/image/image_tests.rb +0 -135
  133. data/tests/openstack/requests/metering/event_tests.rb +0 -17
  134. data/tests/openstack/requests/metering/meter_tests.rb +0 -52
  135. data/tests/openstack/requests/metering/resource_tests.rb +0 -19
  136. data/tests/openstack/requests/network/ike_policy_tests.rb +0 -65
  137. data/tests/openstack/requests/network/ipsec_policy_tests.rb +0 -65
  138. data/tests/openstack/requests/network/ipsec_site_connection_tests.rb +0 -82
  139. data/tests/openstack/requests/network/lb_health_monitor_tests.rb +0 -93
  140. data/tests/openstack/requests/network/lb_member_tests.rb +0 -60
  141. data/tests/openstack/requests/network/lb_pool_tests.rb +0 -80
  142. data/tests/openstack/requests/network/lb_vip_tests.rb +0 -71
  143. data/tests/openstack/requests/network/network_tests.rb +0 -107
  144. data/tests/openstack/requests/network/port_tests.rb +0 -66
  145. data/tests/openstack/requests/network/quota_tests.rb +0 -65
  146. data/tests/openstack/requests/network/router_tests.rb +0 -73
  147. data/tests/openstack/requests/network/security_group_rule_tests.rb +0 -58
  148. data/tests/openstack/requests/network/security_group_tests.rb +0 -43
  149. data/tests/openstack/requests/network/subnet_tests.rb +0 -66
  150. data/tests/openstack/requests/network/vpn_service_tests.rb +0 -61
  151. data/tests/openstack/requests/nfv/vnf_tests.rb +0 -70
  152. data/tests/openstack/requests/nfv/vnfd_tests.rb +0 -44
  153. data/tests/openstack/requests/orchestration/stack_tests.rb +0 -64
  154. data/tests/openstack/requests/planning/.gitkeep +0 -0
  155. data/tests/openstack/requests/planning/plan_tests.rb +0 -65
  156. data/tests/openstack/requests/planning/role_tests.rb +0 -16
  157. data/tests/openstack/requests/storage/container_tests.rb +0 -64
  158. data/tests/openstack/requests/storage/large_object_tests.rb +0 -372
  159. data/tests/openstack/requests/storage/object_tests.rb +0 -208
  160. data/tests/openstack/requests/volume/availability_zone_tests.rb +0 -13
  161. data/tests/openstack/requests/volume/quota_tests.rb +0 -50
  162. data/tests/openstack/requests/volume/volume_type_tests.rb +0 -32
@@ -1,44 +0,0 @@
1
- Shindo.tests('@vnfd | NFV vnfds requests', ['openstack']) do
2
- @nfv = Fog::NFV::OpenStack.new
3
-
4
- @vnfds = {
5
- "service_types" => Array,
6
- "description" => String,
7
- "tenant_id" => String,
8
- "mgmt_driver" => String,
9
- "infra_driver" => String,
10
- "attributes" => Hash,
11
- "id" => String,
12
- "name" => String
13
- }
14
-
15
- tests('success') do
16
- tests('#create_vnfds').data_matches_schema('vnfd' => @vnfds) do
17
- vnfd_data = {:attributes => {:vnfd => "template_name: sample-vnfd\ndescription: demo-example\n\nservice_prop"\
18
- "erties:\n Id: sample-vnfd\n vendor: tacker\n version: 1\n\nvdus:\n"\
19
- " vdu1:\n id: vdu1\n vm_image: cirros\n instance_type: m1.ti"\
20
- "ny\n\n network_interfaces:\n management:\n network: ne"\
21
- "t_mgmt\n management: true\n pkt_in:\n network: net"\
22
- "0\n pkt_out:\n network: net1\n\n placement_policy:\n "\
23
- " availability_zone: nova\n\n auto-scaling: noop\n\n config:"\
24
- "\n param0: key0\n param1: key1\n"},
25
- :service_types => [{:service_type => "vnfd"}],
26
- :mgmt_driver => "noop",
27
- :infra_driver => "heat"}
28
- auth = {"tenantName" => "admin", "passwordCredentials" => {"username" => "admin", "password" => "password"}}
29
- @vnfd_body = @nfv.create_vnfd(:vnfd => vnfd_data, :auth => auth).body
30
- end
31
-
32
- tests('#list_vnfds').data_matches_schema('vnfds' => [@vnfds]) do
33
- @nfv.list_vnfds.body
34
- end
35
-
36
- tests('#get_vnfds').data_matches_schema('vnfd' => @vnfds) do
37
- @nfv.get_vnfd(@vnfd_body["vnfd"]["id"]).body
38
- end
39
-
40
- tests('#delete_vnfds').succeeds do
41
- @nfv.delete_vnfd(@vnfd_body["vnfd"]["id"])
42
- end
43
- end
44
- end
@@ -1,64 +0,0 @@
1
- Shindo.tests('Fog::Orchestration[:openstack] | stack requests', ['openstack']) do
2
- @stack_format = {
3
- 'links' => Array,
4
- 'id' => String,
5
- 'stack_name' => String,
6
- 'description' => Fog::Nullable::String,
7
- 'stack_status' => String,
8
- 'stack_status_reason' => String,
9
- 'creation_time' => Time,
10
- 'updated_time' => Time
11
- }
12
-
13
- @stack_detailed_format = {
14
- "parent" => Fog::Nullable::String,
15
- "disable_rollback" => Fog::Boolean,
16
- "description" => String,
17
- "links" => Array,
18
- "stack_status_reason" => String,
19
- "stack_name" => String,
20
- "stack_user_project_id" => String,
21
- "stack_owner" => String,
22
- "creation_time" => Fog::Nullable::String,
23
- "capabilities" => Array,
24
- "notification_topics" => Array,
25
- "updated_time" => Fog::Nullable::String,
26
- "timeout_mins" => Fog::Nullable::String,
27
- "stack_status" => String,
28
- "parameters" => Hash,
29
- "id" => String,
30
- "outputs" => Array,
31
- "template_description" => String
32
- }
33
-
34
- @create_format = {
35
- 'id' => String,
36
- 'links' => Array,
37
- }
38
-
39
- tests('success') do
40
- tests('#create_stack("teststack")').formats(@create_format) do
41
- @stack = Fog::Orchestration[:openstack].create_stack("teststack").body
42
- end
43
-
44
- tests('#list_stack_data').formats({'stacks' => [@stack_format]}) do
45
- Fog::Orchestration[:openstack].list_stack_data.body
46
- end
47
-
48
- tests('#list_stack_data_Detailed').formats({'stacks' => [@stack_detailed_format]}) do
49
- Fog::Orchestration[:openstack].list_stack_data_detailed.body
50
- end
51
-
52
- tests('#update_stack("teststack")').formats({}) do
53
- Fog::Orchestration[:openstack].update_stack("teststack").body
54
- end
55
-
56
- tests('#patch_stack("teststack")').formats({}) do
57
- Fog::Orchestration[:openstack].patch_stack(@stack).body
58
- end
59
-
60
- tests('#delete_stack("teststack", "id")').formats({}) do
61
- Fog::Orchestration[:openstack].delete_stack("teststack", "id").body
62
- end
63
- end
64
- end
@@ -1,65 +0,0 @@
1
- Shindo.tests('Fog::Openstack[:planning] | Planning plan requests', ['openstack']) do
2
- openstack = Fog::Identity[:openstack]
3
-
4
- @plan_format = {
5
- "created_at" => Fog::Nullable::String,
6
- "description" => Fog::Nullable::String,
7
- "name" => String,
8
- "parameters" => Fog::Nullable::Array,
9
- "roles" => Fog::Nullable::Array,
10
- "updated_at" => Fog::Nullable::String,
11
- "uuid" => String,
12
- "version" => Fog::Nullable::Integer,
13
- }
14
-
15
- @plan_templates_format = Hash
16
-
17
- tests('success') do
18
- tests('#list_plans').data_matches_schema([@plan_format]) do
19
- plans = Fog::Openstack[:planning].list_plans.body
20
- @instance = plans.first
21
- plans
22
- end
23
-
24
- tests('#get_plan').data_matches_schema(@plan_format) do
25
- Fog::Openstack[:planning].get_plan(@instance['uuid']).body
26
- end
27
-
28
- tests('#delete_plan').succeeds do
29
- Fog::Openstack[:planning].delete_plan(@instance['uuid'])
30
- end
31
-
32
- tests('#create_plan').data_matches_schema(@plan_format) do
33
- plan_attributes = {
34
- :name => 'test-plan-name',
35
- :description => 'test-plan-desc',
36
- }
37
- @instance = Fog::Openstack[:planning].create_plan(plan_attributes).body
38
- end
39
-
40
- tests('#add_role_to_plan').data_matches_schema(@plan_format) do
41
- @role_instance = Fog::Openstack[:planning].list_roles.body.first
42
- Fog::Openstack[:planning].add_role_to_plan(@instance['uuid'], @role_instance['uuid']).body
43
- end
44
-
45
- tests('#patch_plan').data_matches_schema(@plan_format) do
46
- parameters = Fog::Openstack[:planning].get_plan(@instance['uuid']).body['parameters'][0..1]
47
- plan_parameters = parameters.map do |parameter|
48
- {
49
- "name" => parameter['name'],
50
- "value" => "test-#{parameter['name']}-value",
51
- }
52
- end
53
- Fog::Openstack[:planning].patch_plan(@instance['uuid'], plan_parameters).body
54
- end
55
-
56
- tests('#get_plan_templates').data_matches_schema(@plan_templates_format) do
57
- Fog::Openstack[:planning].get_plan_templates(@instance['uuid']).body
58
- end
59
-
60
- tests('#remove_role_from_plan').data_matches_schema(@plan_format) do
61
- Fog::Openstack[:planning].remove_role_from_plan(@instance['uuid'], @role_instance['uuid']).body
62
- end
63
-
64
- end
65
- end
@@ -1,16 +0,0 @@
1
- Shindo.tests('Fog::Openstack[:planning] | Planning role requests', ['openstack']) do
2
- openstack = Fog::Identity[:openstack]
3
-
4
- @role_format = {
5
- 'description' => Fog::Nullable::String,
6
- 'name' => Fog::Nullable::String,
7
- 'uuid' => String,
8
- 'version' => Integer,
9
- }
10
-
11
- tests('success') do
12
- tests('#list_roles').data_matches_schema([@role_format]) do
13
- Fog::Openstack[:planning].list_roles.body
14
- end
15
- end
16
- end
@@ -1,64 +0,0 @@
1
- Shindo.tests('Fog::Storage[:openstack] | container requests', ["openstack"]) do
2
-
3
- @container_format = [String]
4
-
5
- @containers_format = [{
6
- 'bytes' => Integer,
7
- 'count' => Integer,
8
- 'name' => String
9
- }]
10
-
11
- tests('success') do
12
-
13
- tests("#put_container('fogcontainertests')").succeeds do
14
- pending if Fog.mocking?
15
- Fog::Storage[:openstack].put_container('fogcontainertests')
16
- end
17
-
18
- tests("#get_container('fogcontainertests')").formats(@container_format) do
19
- pending if Fog.mocking?
20
- Fog::Storage[:openstack].get_container('fogcontainertests').body
21
- end
22
-
23
- tests("#get_containers").formats(@containers_format) do
24
- pending if Fog.mocking?
25
- Fog::Storage[:openstack].get_containers.body
26
- end
27
-
28
- tests("#head_container('fogcontainertests')").succeeds do
29
- pending if Fog.mocking?
30
- Fog::Storage[:openstack].head_container('fogcontainertests')
31
- end
32
-
33
- tests("#head_containers").succeeds do
34
- pending if Fog.mocking?
35
- Fog::Storage[:openstack].head_containers
36
- end
37
-
38
- tests("#delete_container('fogcontainertests')").succeeds do
39
- pending if Fog.mocking?
40
- Fog::Storage[:openstack].delete_container('fogcontainertests')
41
- end
42
-
43
- end
44
-
45
- tests('failure') do
46
-
47
- tests("#get_container('fognoncontainer')").raises(Fog::Storage::OpenStack::NotFound) do
48
- pending if Fog.mocking?
49
- Fog::Storage[:openstack].get_container('fognoncontainer')
50
- end
51
-
52
- tests("#head_container('fognoncontainer')").raises(Fog::Storage::OpenStack::NotFound) do
53
- pending if Fog.mocking?
54
- Fog::Storage[:openstack].head_container('fognoncontainer')
55
- end
56
-
57
- tests("#delete_container('fognoncontainer')").raises(Fog::Storage::OpenStack::NotFound) do
58
- pending if Fog.mocking?
59
- Fog::Storage[:openstack].delete_container('fognoncontainer')
60
- end
61
-
62
- end
63
-
64
- end
@@ -1,372 +0,0 @@
1
- Shindo.tests('Fog::Storage[:openstack] | large object requests', ['openstack']) do
2
-
3
- unless Fog.mocking?
4
- @directory = Fog::Storage[:openstack].directories.create(:key => 'foglargeobjecttests')
5
- @directory2 = Fog::Storage[:openstack].directories.create(:key => 'foglargeobjecttests2')
6
- @segments = {
7
- :a => {
8
- :container => @directory.identity,
9
- :name => 'fog_large_object/a',
10
- :data => 'a' * (1024**2 + 10),
11
- :size => 1024**2 + 10,
12
- :etag => 'c2e97007d59f0c19b850debdcb80cca5'
13
- },
14
- :b => {
15
- :container => @directory.identity,
16
- :name => 'fog_large_object/b',
17
- :data => 'b' * (1024**2 + 20),
18
- :size => 1024**2 + 20,
19
- :etag => 'd35f50622a1259daad75ff7d5512c7ef'
20
- },
21
- :c => {
22
- :container => @directory.identity,
23
- :name => 'fog_large_object2/a',
24
- :data => 'c' * (1024**2 + 30),
25
- :size => 1024**2 + 30,
26
- :etag => '901d3531a87d188041d4d5b43cb464c1'
27
- },
28
- :d => {
29
- :container => @directory2.identity,
30
- :name => 'fog_large_object2/b',
31
- :data => 'd' * (1024**2 + 40),
32
- :size => 1024**2 + 40,
33
- :etag => '350c0e00525198813920a157df185c8d'
34
- }
35
- }
36
- end
37
-
38
- tests('success') do
39
-
40
- tests('upload test segments').succeeds do
41
- pending if Fog.mocking?
42
-
43
- @segments.each_value do |segment|
44
- Fog::Storage[:openstack].put_object(segment[:container], segment[:name], segment[:data])
45
- end
46
- end
47
-
48
- tests('dynamic large object requests') do
49
- pending if Fog.mocking?
50
-
51
- tests('#put_object_manifest alias').succeeds do
52
- Fog::Storage[:openstack].put_object_manifest(@directory.identity, 'fog_large_object')
53
- end
54
-
55
- tests('using default X-Object-Manifest header') do
56
-
57
- tests('#put_dynamic_obj_manifest').succeeds do
58
- Fog::Storage[:openstack].put_dynamic_obj_manifest(@directory.identity, 'fog_large_object')
59
- end
60
-
61
- tests('#get_object streams all segments matching the default prefix').succeeds do
62
- expected = @segments[:a][:data] + @segments[:b][:data] + @segments[:c][:data]
63
- Fog::Storage[:openstack].get_object(@directory.identity, 'fog_large_object').body == expected
64
- end
65
-
66
- # When the manifest object name is equal to the segment prefix, OpenStack treats it as if it's the first segment.
67
- # So you must prepend the manifest object's Etag - Digest::MD5.hexdigest('')
68
- tests('#head_object returns Etag that includes manifest object in calculation').succeeds do
69
- etags = ['d41d8cd98f00b204e9800998ecf8427e', @segments[:a][:etag], @segments[:b][:etag], @segments[:c][:etag]]
70
- expected = "\"#{ Digest::MD5.hexdigest(etags.join) }\"" # returned in quotes "\"2577f38428e895c50de6ea78ccc7da2a"\"
71
- Fog::Storage[:openstack].head_object(@directory.identity, 'fog_large_object').headers['Etag'] == expected
72
- end
73
-
74
- end
75
-
76
- tests('specifying X-Object-Manifest segment prefix') do
77
-
78
- tests('#put_dynamic_obj_manifest').succeeds do
79
- options = { 'X-Object-Manifest' => "#{ @directory.identity }/fog_large_object/" }
80
- Fog::Storage[:openstack].put_dynamic_obj_manifest(@directory.identity, 'fog_large_object', options)
81
- end
82
-
83
- tests('#get_object streams segments only matching the specified prefix').succeeds do
84
- expected = @segments[:a][:data] + @segments[:b][:data]
85
- Fog::Storage[:openstack].get_object(@directory.identity, 'fog_large_object').body == expected
86
- end
87
-
88
- tests('#head_object returns Etag that does not include manifest object in calculation').succeeds do
89
- etags = [@segments[:a][:etag], @segments[:b][:etag]]
90
- expected = "\"#{ Digest::MD5.hexdigest(etags.join) }\"" # returned in quotes "\"0f035ed3cc38aa0ef46dda3478fad44d"\"
91
- Fog::Storage[:openstack].head_object(@directory.identity, 'fog_large_object').headers['Etag'] == expected
92
- end
93
-
94
- end
95
-
96
- tests('storing manifest in a different container than the segments') do
97
-
98
- tests('#put_dynamic_obj_manifest').succeeds do
99
- options = { 'X-Object-Manifest' => "#{ @directory.identity }/fog_large_object/" }
100
- Fog::Storage[:openstack].put_dynamic_obj_manifest(@directory2.identity, 'fog_large_object', options)
101
- end
102
-
103
- tests('#get_object').succeeds do
104
- expected = @segments[:a][:data] + @segments[:b][:data]
105
- Fog::Storage[:openstack].get_object(@directory2.identity, 'fog_large_object').body == expected
106
- end
107
-
108
- end
109
-
110
- end
111
-
112
- tests('static large object requests') do
113
- pending if Fog.mocking?
114
-
115
- tests('single container') do
116
-
117
- tests('#put_static_obj_manifest').succeeds do
118
- segments = [
119
- { :path => "#{ @segments[:a][:container] }/#{ @segments[:a][:name] }",
120
- :etag => @segments[:a][:etag],
121
- :size_bytes => @segments[:a][:size] },
122
- { :path => "#{ @segments[:c][:container] }/#{ @segments[:c][:name] }",
123
- :etag => @segments[:c][:etag],
124
- :size_bytes => @segments[:c][:size] }
125
- ]
126
- Fog::Storage[:openstack].put_static_obj_manifest(@directory.identity, 'fog_large_object', segments)
127
- end
128
-
129
- tests('#head_object') do
130
- etags = [@segments[:a][:etag], @segments[:c][:etag]]
131
- etag = "\"#{ Digest::MD5.hexdigest(etags.join) }\"" # "\"ad7e633a12e8a4915b45e6dd1d4b0b4b\""
132
- content_length = (@segments[:a][:size] + @segments[:c][:size]).to_s
133
- response = Fog::Storage[:openstack].head_object(@directory.identity, 'fog_large_object')
134
-
135
- returns(etag, 'returns ETag computed from segments') { response.headers['Etag'] }
136
- returns(content_length , 'returns Content-Length for all segments') { response.headers['Content-Length'] }
137
- returns('True', 'returns X-Static-Large-Object header') { response.headers['X-Static-Large-Object'] }
138
- end
139
-
140
- tests('#get_object').succeeds do
141
- expected = @segments[:a][:data] + @segments[:c][:data]
142
- Fog::Storage[:openstack].get_object(@directory.identity, 'fog_large_object').body == expected
143
- end
144
-
145
- tests('#delete_static_large_object') do
146
- expected = {
147
- 'Number Not Found' => 0,
148
- 'Response Status' => '200 OK',
149
- 'Errors' => [],
150
- 'Number Deleted' => 3,
151
- 'Response Body' => ''
152
- }
153
- returns(expected, 'deletes manifest and segments') do
154
- Fog::Storage[:openstack].delete_static_large_object(@directory.identity, 'fog_large_object').body
155
- end
156
- end
157
-
158
- end
159
-
160
- tests('multiple containers') do
161
-
162
- tests('#put_static_obj_manifest').succeeds do
163
- segments = [
164
- { :path => "#{ @segments[:b][:container] }/#{ @segments[:b][:name] }",
165
- :etag => @segments[:b][:etag],
166
- :size_bytes => @segments[:b][:size] },
167
- { :path => "#{ @segments[:d][:container] }/#{ @segments[:d][:name] }",
168
- :etag => @segments[:d][:etag],
169
- :size_bytes => @segments[:d][:size] }
170
- ]
171
- Fog::Storage[:openstack].put_static_obj_manifest(@directory2.identity, 'fog_large_object', segments)
172
- end
173
-
174
- tests('#head_object') do
175
- etags = [@segments[:b][:etag], @segments[:d][:etag]]
176
- etag = "\"#{ Digest::MD5.hexdigest(etags.join) }\"" # "\"9801a4cc4472896a1e975d03f0d2c3f8\""
177
- content_length = (@segments[:b][:size] + @segments[:d][:size]).to_s
178
- response = Fog::Storage[:openstack].head_object(@directory2.identity, 'fog_large_object')
179
-
180
- returns(etag, 'returns ETag computed from segments') { response.headers['Etag'] }
181
- returns(content_length , 'returns Content-Length for all segments') { response.headers['Content-Length'] }
182
- returns('True', 'returns X-Static-Large-Object header') { response.headers['X-Static-Large-Object'] }
183
- end
184
-
185
- tests('#get_object').succeeds do
186
- expected = @segments[:b][:data] + @segments[:d][:data]
187
- Fog::Storage[:openstack].get_object(@directory2.identity, 'fog_large_object').body == expected
188
- end
189
-
190
- tests('#delete_static_large_object') do
191
- expected = {
192
- 'Number Not Found' => 0,
193
- 'Response Status' => '200 OK',
194
- 'Errors' => [],
195
- 'Number Deleted' => 3,
196
- 'Response Body' => ''
197
- }
198
- returns(expected, 'deletes manifest and segments') do
199
- Fog::Storage[:openstack].delete_static_large_object(@directory2.identity, 'fog_large_object').body
200
- end
201
- end
202
-
203
- end
204
-
205
- end
206
-
207
- end
208
-
209
- tests('failure') do
210
-
211
- tests('dynamic large object requests') do
212
- pending if Fog.mocking?
213
-
214
- tests('#put_dynamic_obj_manifest with missing container').raises(Fog::Storage::OpenStack::NotFound) do
215
- Fog::Storage[:openstack].put_dynamic_obj_manifest('fognoncontainer', 'fog_large_object')
216
- end
217
-
218
- end
219
-
220
- tests('static large object requests') do
221
- pending if Fog.mocking?
222
-
223
- tests('upload test segments').succeeds do
224
- Fog::Storage[:openstack].put_object(@segments[:a][:container], @segments[:a][:name], @segments[:a][:data])
225
- Fog::Storage[:openstack].put_object(@segments[:b][:container], @segments[:b][:name], @segments[:b][:data])
226
- end
227
-
228
- tests('#put_static_obj_manifest with missing container').raises(Fog::Storage::OpenStack::NotFound) do
229
- Fog::Storage[:openstack].put_static_obj_manifest('fognoncontainer', 'fog_large_object', [])
230
- end
231
-
232
- tests('#put_static_obj_manifest with missing object') do
233
- segments = [
234
- { :path => "#{ @segments[:c][:container] }/#{ @segments[:c][:name] }",
235
- :etag => @segments[:c][:etag],
236
- :size_bytes => @segments[:c][:size] }
237
- ]
238
- expected = { 'Errors' => [[segments[0][:path], '404 Not Found']] }
239
-
240
- error = nil
241
- begin
242
- Fog::Storage[:openstack].put_static_obj_manifest(@directory.identity, 'fog_large_object', segments)
243
- rescue => err
244
- error = err
245
- end
246
-
247
- raises(Excon::Errors::BadRequest) do
248
- raise error if error
249
- end
250
-
251
- returns(expected, 'returns error information') do
252
- Fog::JSON.decode(error.response.body)
253
- end
254
- end
255
-
256
- tests('#put_static_obj_manifest with invalid etag') do
257
- segments = [
258
- { :path => "#{ @segments[:a][:container] }/#{ @segments[:a][:name] }",
259
- :etag => @segments[:b][:etag],
260
- :size_bytes => @segments[:a][:size] }
261
- ]
262
- expected = { 'Errors' => [[segments[0][:path], 'Etag Mismatch']] }
263
-
264
- error = nil
265
- begin
266
- Fog::Storage[:openstack].put_static_obj_manifest(@directory.identity, 'fog_large_object', segments)
267
- rescue => err
268
- error = err
269
- end
270
-
271
- raises(Excon::Errors::BadRequest) do
272
- raise error if error
273
- end
274
-
275
- returns(expected, 'returns error information') do
276
- Fog::JSON.decode(error.response.body)
277
- end
278
- end
279
-
280
- tests('#put_static_obj_manifest with invalid byte_size') do
281
- segments = [
282
- { :path => "#{ @segments[:a][:container] }/#{ @segments[:a][:name] }",
283
- :etag => @segments[:a][:etag],
284
- :size_bytes => @segments[:b][:size] }
285
- ]
286
- expected = { 'Errors' => [[segments[0][:path], 'Size Mismatch']] }
287
-
288
- error = nil
289
- begin
290
- Fog::Storage[:openstack].put_static_obj_manifest(@directory.identity, 'fog_large_object', segments)
291
- rescue => err
292
- error = err
293
- end
294
-
295
- raises(Excon::Errors::BadRequest) do
296
- raise error if error
297
- end
298
-
299
- returns(expected, 'returns error information') do
300
- Fog::JSON.decode(error.response.body)
301
- end
302
- end
303
-
304
- tests('#delete_static_large_object with missing container') do
305
- expected = {
306
- 'Number Not Found' => 1,
307
- 'Response Status' => '200 OK',
308
- 'Errors' => [],
309
- 'Number Deleted' => 0,
310
- 'Response Body' => ''
311
- }
312
-
313
- returns(expected, 'reports missing object') do
314
- Fog::Storage[:openstack].delete_static_large_object('fognoncontainer', 'fog_large_object').body
315
- end
316
- end
317
-
318
- tests('#delete_static_large_object with missing manifest') do
319
- expected = {
320
- 'Number Not Found' => 1,
321
- 'Response Status' => '200 OK',
322
- 'Errors' => [],
323
- 'Number Deleted' => 0,
324
- 'Response Body' => ''
325
- }
326
-
327
- returns(expected, 'reports missing manifest') do
328
- Fog::Storage[:openstack].delete_static_large_object(@directory.identity, 'fog_non_object').body
329
- end
330
- end
331
-
332
- tests('#delete_static_large_object with missing segment') do
333
-
334
- tests('#put_static_obj_manifest for segments :a and :b').succeeds do
335
- segments = [
336
- { :path => "#{ @segments[:a][:container] }/#{ @segments[:a][:name] }",
337
- :etag => @segments[:a][:etag],
338
- :size_bytes => @segments[:a][:size] },
339
- { :path => "#{ @segments[:b][:container] }/#{ @segments[:b][:name] }",
340
- :etag => @segments[:b][:etag],
341
- :size_bytes => @segments[:b][:size] }
342
- ]
343
- Fog::Storage[:openstack].put_static_obj_manifest(@directory.identity, 'fog_large_object', segments)
344
- end
345
-
346
- tests('#delete_object segment :b').succeeds do
347
- Fog::Storage[:openstack].delete_object(@segments[:b][:container], @segments[:b][:name])
348
- end
349
-
350
- tests('#delete_static_large_object') do
351
- expected = {
352
- 'Number Not Found' => 1,
353
- 'Response Status' => '200 OK',
354
- 'Errors' => [],
355
- 'Number Deleted' => 2,
356
- 'Response Body' => ''
357
- }
358
- returns(expected, 'deletes manifest and segment :a, and reports missing segment :b') do
359
- Fog::Storage[:openstack].delete_static_large_object(@directory.identity, 'fog_large_object').body
360
- end
361
- end
362
-
363
- end
364
- end
365
-
366
- end
367
-
368
- unless Fog.mocking?
369
- @directory.destroy
370
- @directory2.destroy
371
- end
372
- end