fog-oraclecloud 0.1.12 → 0.1.13

Sign up to get free protection for your applications and to get access to all the features.
Files changed (142) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +12 -10
  3. data/Gemfile +4 -4
  4. data/LICENSE +20 -20
  5. data/README.md +153 -153
  6. data/Rakefile +2 -2
  7. data/bin/console +14 -14
  8. data/bin/setup +8 -8
  9. data/fog-oracle.gemspec +32 -31
  10. data/lib/fog/oraclecloud.rb +29 -29
  11. data/lib/fog/oraclecloud/compute.rb +184 -184
  12. data/lib/fog/oraclecloud/database.rb +129 -129
  13. data/lib/fog/oraclecloud/java.rb +123 -115
  14. data/lib/fog/oraclecloud/models/compute/image.rb +43 -43
  15. data/lib/fog/oraclecloud/models/compute/image_list.rb +39 -39
  16. data/lib/fog/oraclecloud/models/compute/image_lists.rb +22 -22
  17. data/lib/fog/oraclecloud/models/compute/images.rb +22 -22
  18. data/lib/fog/oraclecloud/models/compute/instance.rb +74 -69
  19. data/lib/fog/oraclecloud/models/compute/instances.rb +22 -22
  20. data/lib/fog/oraclecloud/models/compute/object_plan.rb +16 -16
  21. data/lib/fog/oraclecloud/models/compute/object_plans.rb +12 -12
  22. data/lib/fog/oraclecloud/models/compute/orchestration.rb +89 -89
  23. data/lib/fog/oraclecloud/models/compute/orchestrations.rb +20 -20
  24. data/lib/fog/oraclecloud/models/compute/security_application.rb +42 -42
  25. data/lib/fog/oraclecloud/models/compute/security_applications.rb +22 -22
  26. data/lib/fog/oraclecloud/models/compute/security_list.rb +26 -26
  27. data/lib/fog/oraclecloud/models/compute/security_lists.rb +22 -22
  28. data/lib/fog/oraclecloud/models/compute/security_rule.rb +41 -41
  29. data/lib/fog/oraclecloud/models/compute/security_rules.rb +22 -22
  30. data/lib/fog/oraclecloud/models/compute/ssh_key.rb +37 -37
  31. data/lib/fog/oraclecloud/models/compute/ssh_keys.rb +22 -22
  32. data/lib/fog/oraclecloud/models/compute/volume.rb +47 -47
  33. data/lib/fog/oraclecloud/models/compute/volumes.rb +20 -20
  34. data/lib/fog/oraclecloud/models/database/backup.rb +37 -37
  35. data/lib/fog/oraclecloud/models/database/backups.rb +30 -30
  36. data/lib/fog/oraclecloud/models/database/instance.rb +331 -331
  37. data/lib/fog/oraclecloud/models/database/instances.rb +25 -25
  38. data/lib/fog/oraclecloud/models/database/patch.rb +34 -34
  39. data/lib/fog/oraclecloud/models/database/patches.rb +18 -18
  40. data/lib/fog/oraclecloud/models/database/recoveries.rb +26 -26
  41. data/lib/fog/oraclecloud/models/database/recovery.rb +43 -43
  42. data/lib/fog/oraclecloud/models/database/server.rb +28 -28
  43. data/lib/fog/oraclecloud/models/database/servers.rb +18 -18
  44. data/lib/fog/oraclecloud/models/database/snapshot.rb +60 -60
  45. data/lib/fog/oraclecloud/models/database/snapshots.rb +22 -22
  46. data/lib/fog/oraclecloud/models/java/database.rb +17 -17
  47. data/lib/fog/oraclecloud/models/java/databases.rb +17 -17
  48. data/lib/fog/oraclecloud/models/java/instance.rb +269 -265
  49. data/lib/fog/oraclecloud/models/java/instances.rb +23 -23
  50. data/lib/fog/oraclecloud/models/java/server.rb +62 -62
  51. data/lib/fog/oraclecloud/models/java/servers.rb +25 -25
  52. data/lib/fog/oraclecloud/models/soa/instance.rb +163 -163
  53. data/lib/fog/oraclecloud/models/soa/instances.rb +54 -54
  54. data/lib/fog/oraclecloud/models/storage/container.rb +33 -33
  55. data/lib/fog/oraclecloud/models/storage/containers.rb +24 -24
  56. data/lib/fog/oraclecloud/models/storage/object.rb +27 -27
  57. data/lib/fog/oraclecloud/models/storage/objects.rb +27 -27
  58. data/lib/fog/oraclecloud/requests/compute/create_image.rb +30 -30
  59. data/lib/fog/oraclecloud/requests/compute/create_image_list.rb +27 -27
  60. data/lib/fog/oraclecloud/requests/compute/create_instance.rb +53 -53
  61. data/lib/fog/oraclecloud/requests/compute/create_orchestration.rb +82 -82
  62. data/lib/fog/oraclecloud/requests/compute/create_security_application.rb +28 -28
  63. data/lib/fog/oraclecloud/requests/compute/create_security_rule.rb +29 -29
  64. data/lib/fog/oraclecloud/requests/compute/create_ssh_key.rb +46 -46
  65. data/lib/fog/oraclecloud/requests/compute/create_volume.rb +28 -28
  66. data/lib/fog/oraclecloud/requests/compute/delete_image.rb +19 -19
  67. data/lib/fog/oraclecloud/requests/compute/delete_image_list.rb +19 -19
  68. data/lib/fog/oraclecloud/requests/compute/delete_instance.rb +33 -33
  69. data/lib/fog/oraclecloud/requests/compute/delete_orchestration.rb +36 -36
  70. data/lib/fog/oraclecloud/requests/compute/delete_security_application.rb +20 -20
  71. data/lib/fog/oraclecloud/requests/compute/delete_security_rule.rb +20 -20
  72. data/lib/fog/oraclecloud/requests/compute/delete_ssh_key.rb +32 -32
  73. data/lib/fog/oraclecloud/requests/compute/get_image.rb +21 -21
  74. data/lib/fog/oraclecloud/requests/compute/get_image_list.rb +21 -21
  75. data/lib/fog/oraclecloud/requests/compute/get_instance.rb +45 -45
  76. data/lib/fog/oraclecloud/requests/compute/get_orchestration.rb +39 -39
  77. data/lib/fog/oraclecloud/requests/compute/get_security_application.rb +20 -20
  78. data/lib/fog/oraclecloud/requests/compute/get_security_rule.rb +20 -20
  79. data/lib/fog/oraclecloud/requests/compute/get_ssh_key.rb +39 -39
  80. data/lib/fog/oraclecloud/requests/compute/list_image_lists.rb +29 -29
  81. data/lib/fog/oraclecloud/requests/compute/list_images.rb +16 -16
  82. data/lib/fog/oraclecloud/requests/compute/list_instances.rb +28 -28
  83. data/lib/fog/oraclecloud/requests/compute/list_orchestrations.rb +28 -28
  84. data/lib/fog/oraclecloud/requests/compute/list_security_applications.rb +21 -21
  85. data/lib/fog/oraclecloud/requests/compute/list_security_lists.rb +16 -16
  86. data/lib/fog/oraclecloud/requests/compute/list_security_rules.rb +21 -21
  87. data/lib/fog/oraclecloud/requests/compute/list_ssh_keys.rb +29 -29
  88. data/lib/fog/oraclecloud/requests/compute/list_volumes.rb +16 -16
  89. data/lib/fog/oraclecloud/requests/compute/start_orchestration.rb +39 -39
  90. data/lib/fog/oraclecloud/requests/compute/stop_orchestration.rb +39 -39
  91. data/lib/fog/oraclecloud/requests/compute/update_image.rb +27 -27
  92. data/lib/fog/oraclecloud/requests/compute/update_image_list.rb +27 -27
  93. data/lib/fog/oraclecloud/requests/compute/update_orchestration.rb +80 -80
  94. data/lib/fog/oraclecloud/requests/compute/update_ssh_key.rb +49 -49
  95. data/lib/fog/oraclecloud/requests/database/backup_instance.rb +45 -45
  96. data/lib/fog/oraclecloud/requests/database/create_instance.rb +101 -101
  97. data/lib/fog/oraclecloud/requests/database/create_snapshot.rb +50 -50
  98. data/lib/fog/oraclecloud/requests/database/delete_instance.rb +26 -26
  99. data/lib/fog/oraclecloud/requests/database/delete_snapshot.rb +26 -26
  100. data/lib/fog/oraclecloud/requests/database/get_instance.rb +62 -62
  101. data/lib/fog/oraclecloud/requests/database/get_instance_from_job.rb +31 -31
  102. data/lib/fog/oraclecloud/requests/database/get_snapshot.rb +43 -43
  103. data/lib/fog/oraclecloud/requests/database/list_backups.rb +39 -39
  104. data/lib/fog/oraclecloud/requests/database/list_instances.rb +29 -29
  105. data/lib/fog/oraclecloud/requests/database/list_patches.rb +51 -51
  106. data/lib/fog/oraclecloud/requests/database/list_recoveries.rb +40 -40
  107. data/lib/fog/oraclecloud/requests/database/list_servers.rb +27 -27
  108. data/lib/fog/oraclecloud/requests/database/list_snapshots.rb +27 -27
  109. data/lib/fog/oraclecloud/requests/database/recover_instance.rb +83 -83
  110. data/lib/fog/oraclecloud/requests/database/scale_instance.rb +40 -40
  111. data/lib/fog/oraclecloud/requests/java/create_instance.rb +156 -87
  112. data/lib/fog/oraclecloud/requests/java/delete_instance.rb +37 -37
  113. data/lib/fog/oraclecloud/requests/java/get_instance.rb +43 -43
  114. data/lib/fog/oraclecloud/requests/java/get_server.rb +42 -42
  115. data/lib/fog/oraclecloud/requests/java/list_instances.rb +29 -29
  116. data/lib/fog/oraclecloud/requests/java/list_servers.rb +30 -30
  117. data/lib/fog/oraclecloud/requests/java/scale_a_node.rb +45 -45
  118. data/lib/fog/oraclecloud/requests/java/scale_in_a_cluster.rb +35 -35
  119. data/lib/fog/oraclecloud/requests/java/scale_out_a_cluster.rb +38 -38
  120. data/lib/fog/oraclecloud/requests/soa/create_instance.rb +71 -71
  121. data/lib/fog/oraclecloud/requests/soa/delete_instance.rb +35 -35
  122. data/lib/fog/oraclecloud/requests/soa/get_instance.rb +42 -42
  123. data/lib/fog/oraclecloud/requests/soa/get_job_status.rb +22 -22
  124. data/lib/fog/oraclecloud/requests/soa/list_instances.rb +29 -29
  125. data/lib/fog/oraclecloud/requests/storage/create_container.rb +41 -41
  126. data/lib/fog/oraclecloud/requests/storage/delete_container.rb +15 -15
  127. data/lib/fog/oraclecloud/requests/storage/get_container.rb +63 -63
  128. data/lib/fog/oraclecloud/requests/storage/list_containers.rb +27 -27
  129. data/lib/fog/oraclecloud/soa.rb +106 -106
  130. data/lib/fog/oraclecloud/storage.rb +98 -98
  131. data/lib/fog/oraclecloud/version.rb +5 -5
  132. data/tests/helper.rb +5 -3
  133. data/tests/helpers/mock_helper.rb +14 -14
  134. data/tests/requests/compute_tests.rb +9 -9
  135. data/tests/requests/database_tests.rb +241 -241
  136. data/tests/requests/instance_tests.rb +68 -61
  137. data/tests/requests/java_tests.rb +149 -109
  138. data/tests/requests/orchestrations_tests.rb +90 -90
  139. data/tests/requests/soa_tests.rb +151 -151
  140. data/tests/requests/ssh_keys_tests.rb +53 -53
  141. data/tests/requests/storage_tests.rb +54 -54
  142. metadata +17 -3
@@ -1,54 +1,54 @@
1
- require 'fog/core/collection'
2
-
3
- module Fog
4
- module OracleCloud
5
- class SOA
6
- class Instances < Fog::Collection
7
-
8
- model Fog::OracleCloud::SOA::Instance
9
-
10
- def all
11
- data = service.list_instances().body['services']
12
- load(data)
13
- end
14
-
15
- def get(id)
16
- new(service.get_instance(id).body)
17
- end
18
-
19
- def create(attributes = {}, db_attributes = {})
20
- if attributes[:db_service_name].nil?
21
- # Attempt to create a database instance for them
22
- db_name = db_attributes[:service_name] || "#{attributes[:service_name]}-DB"
23
- db_attributes.merge!({
24
- :service_name => "#{attributes[:service_name]}-DB",
25
- :edition => 'EE',
26
- :ssh_key => attributes[:ssh_key],
27
- :shape => 'oc3',
28
- :version => '12.1.0.2',
29
- :admin_password => attributes[:admin_password],
30
- :backup_destination => 'BOTH'
31
- }) { |key, v1, v2| v1 }
32
- # Check it doesn't exist already
33
- begin
34
- db = Fog::OracleCloud[:database].instances.get(db_name)
35
- rescue Fog::OracleCloud::Database::NotFound => error
36
- # Doesn't exist, create it first
37
- db = Fog::OracleCloud[:database].instances.create(db_attributes)
38
- db.wait_for { ready? }
39
- end
40
- attributes.merge!({
41
- :dba_name => 'SYS',
42
- :dba_password => db_attributes[:admin_password],
43
- :db_service_name => db_name
44
- })
45
- end
46
- # Now provision SOA
47
- object = new(attributes)
48
- object.save
49
- object
50
- end
51
- end
52
- end
53
- end
54
- end
1
+ require 'fog/core/collection'
2
+
3
+ module Fog
4
+ module OracleCloud
5
+ class SOA
6
+ class Instances < Fog::Collection
7
+
8
+ model Fog::OracleCloud::SOA::Instance
9
+
10
+ def all
11
+ data = service.list_instances().body['services']
12
+ load(data)
13
+ end
14
+
15
+ def get(id)
16
+ new(service.get_instance(id).body)
17
+ end
18
+
19
+ def create(attributes = {}, db_attributes = {})
20
+ if attributes[:db_service_name].nil?
21
+ # Attempt to create a database instance for them
22
+ db_name = db_attributes[:service_name] || "#{attributes[:service_name]}-DB"
23
+ db_attributes.merge!({
24
+ :service_name => "#{attributes[:service_name]}-DB",
25
+ :edition => 'EE',
26
+ :ssh_key => attributes[:ssh_key],
27
+ :shape => 'oc3',
28
+ :version => '12.1.0.2',
29
+ :admin_password => attributes[:admin_password],
30
+ :backup_destination => 'BOTH'
31
+ }) { |key, v1, v2| v1 }
32
+ # Check it doesn't exist already
33
+ begin
34
+ db = Fog::OracleCloud[:database].instances.get(db_name)
35
+ rescue Fog::OracleCloud::Database::NotFound => error
36
+ # Doesn't exist, create it first
37
+ db = Fog::OracleCloud[:database].instances.create(db_attributes)
38
+ db.wait_for { ready? }
39
+ end
40
+ attributes.merge!({
41
+ :dba_name => 'SYS',
42
+ :dba_password => db_attributes[:admin_password],
43
+ :db_service_name => db_name
44
+ })
45
+ end
46
+ # Now provision SOA
47
+ object = new(attributes)
48
+ object.save
49
+ object
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -1,33 +1,33 @@
1
- module Fog
2
- module Storage
3
- class OracleCloud
4
- class Container < Fog::Model
5
- identity :name
6
-
7
- attribute :count, :aliases => 'X-Container-Object-Count'
8
- attribute :bytes, :aliases => 'X-Container-Bytes-Used'
9
- attribute :deleteTimestamp
10
- attribute :containerId
11
- attribute :read_acl, :aliases => 'X-Container-Read'
12
- attribute :write_acl, :aliases => 'X-Container-Write'
13
- attribute :createdTimestamp, :aliases => 'X-Timestamp'
14
-
15
- def objects
16
- @objects ||= Fog::Storage::OracleCloud::Objects.new(:container=>self, :service=>service)
17
- end
18
-
19
- def save
20
- requires :name
21
- data = service.create_container(name)
22
- merge_attributes(data.headers)
23
- end
24
-
25
- def destroy
26
- requires :name
27
- service.delete_container(name)
28
- end
29
-
30
- end
31
- end
32
- end
33
- end
1
+ module Fog
2
+ module Storage
3
+ class OracleCloud
4
+ class Container < Fog::Model
5
+ identity :name
6
+
7
+ attribute :count, :aliases => 'X-Container-Object-Count'
8
+ attribute :bytes, :aliases => 'X-Container-Bytes-Used'
9
+ attribute :deleteTimestamp
10
+ attribute :containerId
11
+ attribute :read_acl, :aliases => 'X-Container-Read'
12
+ attribute :write_acl, :aliases => 'X-Container-Write'
13
+ attribute :createdTimestamp, :aliases => 'X-Timestamp'
14
+
15
+ def objects
16
+ @objects ||= Fog::Storage::OracleCloud::Objects.new(:container=>self, :service=>service)
17
+ end
18
+
19
+ def save
20
+ requires :name
21
+ data = service.create_container(name)
22
+ merge_attributes(data.headers)
23
+ end
24
+
25
+ def destroy
26
+ requires :name
27
+ service.delete_container(name)
28
+ end
29
+
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,24 +1,24 @@
1
- module Fog
2
- module Storage
3
- class OracleCloud
4
- class Containers < Fog::Collection
5
-
6
- model Fog::Storage::OracleCloud::Container
7
-
8
- def all
9
- containers = service.list_containers().body
10
- load(containers)
11
- end
12
-
13
- def get(name)
14
- data = service.get_container(name).headers
15
- # The storage cloud service doesn't actually return the name. Add it back in
16
- data['name'] = name
17
- new(data)
18
- end
19
-
20
- end
21
- end
22
-
23
- end
24
- end
1
+ module Fog
2
+ module Storage
3
+ class OracleCloud
4
+ class Containers < Fog::Collection
5
+
6
+ model Fog::Storage::OracleCloud::Container
7
+
8
+ def all
9
+ containers = service.list_containers().body
10
+ load(containers)
11
+ end
12
+
13
+ def get(name)
14
+ data = service.get_container(name).headers
15
+ # The storage cloud service doesn't actually return the name. Add it back in
16
+ data['name'] = name
17
+ new(data)
18
+ end
19
+
20
+ end
21
+ end
22
+
23
+ end
24
+ end
@@ -1,27 +1,27 @@
1
- module Fog
2
- module Storage
3
- class OracleCloud
4
- class Object < Fog::Model
5
- identity :name
6
-
7
- attribute :content_type
8
- attribute :bytes
9
- attribute :last_modified
10
- attribute :hash
11
-
12
- def save
13
- requires :name
14
- # data = service.create_container(name)
15
- # pp data
16
- # merge_attributes(data.headers)
17
- end
18
-
19
- def destroy
20
- requires :name
21
- # service.delete_container(name)
22
- end
23
-
24
- end
25
- end
26
- end
27
- end
1
+ module Fog
2
+ module Storage
3
+ class OracleCloud
4
+ class Object < Fog::Model
5
+ identity :name
6
+
7
+ attribute :content_type
8
+ attribute :bytes
9
+ attribute :last_modified
10
+ attribute :hash
11
+
12
+ def save
13
+ requires :name
14
+ # data = service.create_container(name)
15
+ # pp data
16
+ # merge_attributes(data.headers)
17
+ end
18
+
19
+ def destroy
20
+ requires :name
21
+ # service.delete_container(name)
22
+ end
23
+
24
+ end
25
+ end
26
+ end
27
+ end
@@ -1,27 +1,27 @@
1
- module Fog
2
- module Storage
3
- class OracleCloud
4
- class Objects < Fog::Collection
5
-
6
- attribute :container
7
-
8
- model Fog::Storage::OracleCloud::Object
9
-
10
- def all
11
- requires :container
12
- objects = service.get_container_with_objects(container.name)
13
- load(objects.body)
14
- end
15
-
16
- def get(name)
17
- data = service.get_container(name).headers
18
- # The storage cloud service doesn't actually return the name. Add it back in
19
- data['name'] = name
20
- new(data)
21
- end
22
-
23
- end
24
- end
25
-
26
- end
27
- end
1
+ module Fog
2
+ module Storage
3
+ class OracleCloud
4
+ class Objects < Fog::Collection
5
+
6
+ attribute :container
7
+
8
+ model Fog::Storage::OracleCloud::Object
9
+
10
+ def all
11
+ requires :container
12
+ objects = service.get_container_with_objects(container.name)
13
+ load(objects.body)
14
+ end
15
+
16
+ def get(name)
17
+ data = service.get_container(name).headers
18
+ # The storage cloud service doesn't actually return the name. Add it back in
19
+ data['name'] = name
20
+ new(data)
21
+ end
22
+
23
+ end
24
+ end
25
+
26
+ end
27
+ end
@@ -1,30 +1,30 @@
1
- module Fog
2
- module Compute
3
- class OracleCloud
4
- class Real
5
- def create_image (account, name, no_upload, file, sizes)
6
- # Just in case it's already set
7
- name.sub! "/Compute-#{@identity_domain}/#{@username}/", ''
8
- body_data = {
9
- 'name' => "/Compute-#{@identity_domain}/#{@username}/#{name}",
10
- 'account' => account,
11
- 'no_upload' => no_upload,
12
- 'file' => file,
13
- 'sizes' => sizes
14
- }
15
- body_data = body_data.reject {|key, value| value.nil?}
16
-
17
- request(
18
- :method => 'POST',
19
- :expects => 201,
20
- :path => "/imagelist/Compute-#{@identity_domain}/#{@username}/#{name}",
21
- :body => Fog::JSON.encode(body_data),
22
- :headers => {
23
- 'Content-Type' => 'application/oracle-compute-v3+json'
24
- }
25
- )
26
- end
27
- end
28
- end
29
- end
30
- end
1
+ module Fog
2
+ module Compute
3
+ class OracleCloud
4
+ class Real
5
+ def create_image (account, name, no_upload, file, sizes)
6
+ # Just in case it's already set
7
+ name.sub! "/Compute-#{@identity_domain}/#{@username}/", ''
8
+ body_data = {
9
+ 'name' => "/Compute-#{@identity_domain}/#{@username}/#{name}",
10
+ 'account' => account,
11
+ 'no_upload' => no_upload,
12
+ 'file' => file,
13
+ 'sizes' => sizes
14
+ }
15
+ body_data = body_data.reject {|key, value| value.nil?}
16
+
17
+ request(
18
+ :method => 'POST',
19
+ :expects => 201,
20
+ :path => "/imagelist/Compute-#{@identity_domain}/#{@username}/#{name}",
21
+ :body => Fog::JSON.encode(body_data),
22
+ :headers => {
23
+ 'Content-Type' => 'application/oracle-compute-v3+json'
24
+ }
25
+ )
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,27 +1,27 @@
1
- module Fog
2
- module Compute
3
- class OracleCloud
4
- class Real
5
- def create_image_list (name, description, options={})
6
- # Just in case it's already set
7
- name.sub! "/Compute-#{@identity_domain}/#{@username}/", ''
8
- body_data = {
9
- 'name' => "/Compute-#{@identity_domain}/#{@username}/#{name}",
10
- 'description' => description,
11
- 'default' => options[:default]
12
- }
13
- body_data = body_data.reject {|key, value| value.nil?}
14
- request(
15
- :method => 'POST',
16
- :expects => 201,
17
- :path => "/imagelist/Compute-#{@identity_domain}/#{@username}/",
18
- :body => Fog::JSON.encode(body_data),
19
- :headers => {
20
- 'Content-Type' => 'application/oracle-compute-v3+json'
21
- }
22
- )
23
- end
24
- end
25
- end
26
- end
27
- end
1
+ module Fog
2
+ module Compute
3
+ class OracleCloud
4
+ class Real
5
+ def create_image_list (name, description, options={})
6
+ # Just in case it's already set
7
+ name.sub! "/Compute-#{@identity_domain}/#{@username}/", ''
8
+ body_data = {
9
+ 'name' => "/Compute-#{@identity_domain}/#{@username}/#{name}",
10
+ 'description' => description,
11
+ 'default' => options[:default]
12
+ }
13
+ body_data = body_data.reject {|key, value| value.nil?}
14
+ request(
15
+ :method => 'POST',
16
+ :expects => 201,
17
+ :path => "/imagelist/Compute-#{@identity_domain}/#{@username}/",
18
+ :body => Fog::JSON.encode(body_data),
19
+ :headers => {
20
+ 'Content-Type' => 'application/oracle-compute-v3+json'
21
+ }
22
+ )
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end