shipit-engine 0.5.2 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (274) hide show
  1. checksums.yaml +4 -4
  2. data/app/controllers/concerns/shipit/api/cacheable.rb +13 -0
  3. data/app/controllers/concerns/shipit/api/paginable.rb +37 -0
  4. data/app/controllers/concerns/shipit/api/rendering.rb +25 -0
  5. data/app/controllers/concerns/{api/paginable.rb → shipit/pagination.rb} +5 -13
  6. data/app/controllers/shipit/api/base_controller.rb +68 -0
  7. data/app/controllers/shipit/api/deploys_controller.rb +17 -0
  8. data/app/controllers/shipit/api/hooks_controller.rb +53 -0
  9. data/app/controllers/shipit/api/locks_controller.rb +32 -0
  10. data/app/controllers/shipit/api/outputs_controller.rb +17 -0
  11. data/app/controllers/shipit/api/stacks_controller.rb +21 -0
  12. data/app/controllers/shipit/api/tasks_controller.rb +20 -0
  13. data/app/controllers/shipit/commit_checks_controller.rb +26 -0
  14. data/app/controllers/shipit/deploys_controller.rb +47 -0
  15. data/app/controllers/shipit/github_authentication_controller.rb +27 -0
  16. data/app/controllers/shipit/rollbacks_controller.rb +26 -0
  17. data/app/controllers/shipit/shipit_controller.rb +62 -0
  18. data/app/controllers/shipit/stacks_controller.rb +81 -0
  19. data/app/controllers/shipit/status_controller.rb +7 -0
  20. data/app/controllers/shipit/tasks_controller.rb +48 -0
  21. data/app/controllers/shipit/webhooks_controller.rb +101 -0
  22. data/app/helpers/shipit/chunks_helper.rb +8 -0
  23. data/app/helpers/shipit/deploys_helper.rb +28 -0
  24. data/app/helpers/shipit/github_url_helper.rb +48 -0
  25. data/app/helpers/shipit/shipit_helper.rb +64 -0
  26. data/app/helpers/shipit/stacks_helper.rb +78 -0
  27. data/app/helpers/shipit/tasks_helper.rb +11 -0
  28. data/app/jobs/shipit/background_job.rb +24 -0
  29. data/app/jobs/shipit/background_job/unique.rb +28 -0
  30. data/app/jobs/shipit/cache_deploy_spec_job.rb +12 -0
  31. data/app/jobs/shipit/chunk_rollup_job.rb +21 -0
  32. data/app/jobs/shipit/clear_git_cache_job.rb +9 -0
  33. data/app/jobs/shipit/deliver_hook_job.rb +9 -0
  34. data/app/jobs/shipit/destroy_stack_job.rb +9 -0
  35. data/app/jobs/shipit/emit_event_job.rb +10 -0
  36. data/app/jobs/shipit/fetch_commit_stats_job.rb +9 -0
  37. data/app/jobs/shipit/fetch_deployed_revision_job.rb +23 -0
  38. data/app/jobs/shipit/git_mirror_update_job.rb +12 -0
  39. data/app/jobs/shipit/github_sync_job.rb +55 -0
  40. data/app/jobs/shipit/perform_commit_checks_job.rb +7 -0
  41. data/app/jobs/shipit/perform_task_job.rb +57 -0
  42. data/app/jobs/shipit/refresh_github_user_job.rb +9 -0
  43. data/app/jobs/shipit/refresh_statuses_job.rb +14 -0
  44. data/app/jobs/shipit/setup_github_hook_job.rb +11 -0
  45. data/app/models/shipit/anonymous_user.rb +43 -0
  46. data/app/models/shipit/api_client.rb +44 -0
  47. data/app/models/shipit/commit.rb +209 -0
  48. data/app/models/shipit/commit_checks.rb +90 -0
  49. data/app/models/shipit/delivery.rb +47 -0
  50. data/app/models/shipit/deploy.rb +153 -0
  51. data/app/models/shipit/deploy_spec.rb +150 -0
  52. data/app/models/shipit/deploy_spec/bundler_discovery.rb +61 -0
  53. data/app/models/shipit/deploy_spec/capistrano_discovery.rb +29 -0
  54. data/app/models/shipit/deploy_spec/file_system.rb +64 -0
  55. data/app/models/shipit/deploy_spec/pypi_discovery.rb +34 -0
  56. data/app/models/shipit/deploy_spec/rubygems_discovery.rb +34 -0
  57. data/app/models/shipit/github_hook.rb +148 -0
  58. data/app/models/shipit/hook.rb +86 -0
  59. data/app/models/shipit/membership.rb +8 -0
  60. data/app/models/shipit/missing_status.rb +21 -0
  61. data/app/models/shipit/output_chunk.rb +11 -0
  62. data/app/models/shipit/rollback.rb +31 -0
  63. data/app/models/shipit/stack.rb +308 -0
  64. data/app/models/shipit/status.rb +44 -0
  65. data/app/models/shipit/status_group.rb +35 -0
  66. data/app/models/shipit/task.rb +201 -0
  67. data/app/models/shipit/task_definition.rb +38 -0
  68. data/app/models/shipit/team.rb +69 -0
  69. data/app/models/shipit/unknown_status.rb +43 -0
  70. data/app/models/shipit/user.rb +83 -0
  71. data/app/models/shipit/variable_definition.rb +21 -0
  72. data/app/serializers/concerns/shipit/conditional_attributes.rb +22 -0
  73. data/app/serializers/shipit/anonymous_user_serializer.rb +4 -0
  74. data/app/serializers/shipit/commit_serializer.rb +8 -0
  75. data/app/serializers/shipit/deploy_serializer.rb +15 -0
  76. data/app/serializers/shipit/hook_serializer.rb +12 -0
  77. data/app/serializers/shipit/rollback_serializer.rb +7 -0
  78. data/app/serializers/shipit/short_commit_serializer.rb +9 -0
  79. data/app/serializers/shipit/stack_serializer.rb +33 -0
  80. data/app/serializers/shipit/tail_task_serializer.rb +39 -0
  81. data/app/serializers/shipit/task_serializer.rb +30 -0
  82. data/app/serializers/shipit/user_serializer.rb +5 -0
  83. data/app/views/{commits → shipit/commits}/_commit.html.erb +1 -1
  84. data/app/views/{commits → shipit/commits}/_commit_author.html.erb +0 -0
  85. data/app/views/{deploys → shipit/deploys}/_checklist.html.erb +0 -0
  86. data/app/views/{deploys → shipit/deploys}/_checks.html.erb +0 -0
  87. data/app/views/{deploys → shipit/deploys}/_concurrent_deploy_warning.html.erb +0 -0
  88. data/app/views/{deploys → shipit/deploys}/_deploy.html.erb +1 -1
  89. data/app/views/{deploys → shipit/deploys}/_monitoring.html.erb +0 -0
  90. data/app/views/{deploys → shipit/deploys}/_summary.html.erb +0 -0
  91. data/app/views/{deploys → shipit/deploys}/new.html.erb +3 -3
  92. data/app/views/{deploys → shipit/deploys}/rollback.html.erb +2 -2
  93. data/app/views/{deploys → shipit/deploys}/show.html.erb +1 -1
  94. data/app/views/{github_authentication → shipit/github_authentication}/failed.html.erb +0 -0
  95. data/app/views/{stacks → shipit/stacks}/_header.html.erb +0 -0
  96. data/app/views/{stacks → shipit/stacks}/index.html.erb +0 -0
  97. data/app/views/{stacks → shipit/stacks}/new.html.erb +0 -0
  98. data/app/views/{stacks → shipit/stacks}/settings.html.erb +1 -1
  99. data/app/views/{stacks → shipit/stacks}/show.html.erb +2 -2
  100. data/app/views/{statuses → shipit/statuses}/_group.html.erb +1 -1
  101. data/app/views/{statuses → shipit/statuses}/_status.html.erb +0 -0
  102. data/app/views/{tasks → shipit/tasks}/_task.html.erb +1 -1
  103. data/app/views/{tasks → shipit/tasks}/_task_output.html.erb +1 -1
  104. data/app/views/{tasks → shipit/tasks}/index.html.erb +1 -1
  105. data/app/views/{tasks → shipit/tasks}/new.html.erb +1 -1
  106. data/app/views/{tasks → shipit/tasks}/show.html.erb +1 -1
  107. data/db/migrate/20160104151742_increase_tasks_type_size_back.rb +5 -0
  108. data/db/migrate/20160104151833_convert_sti_columns.rb +10 -0
  109. data/lib/shipit.rb +11 -10
  110. data/lib/shipit/command.rb +171 -0
  111. data/lib/shipit/commands.rb +25 -0
  112. data/lib/shipit/deploy_commands.rb +21 -0
  113. data/lib/shipit/engine.rb +3 -0
  114. data/lib/shipit/rollback_commands.rb +7 -0
  115. data/lib/shipit/stack_commands.rb +60 -0
  116. data/lib/shipit/task_commands.rb +68 -0
  117. data/lib/shipit/version.rb +1 -1
  118. data/lib/tasks/cron.rake +3 -3
  119. data/test/controllers/api/base_controller_test.rb +18 -14
  120. data/test/controllers/api/deploys_controller_test.rb +56 -52
  121. data/test/controllers/api/hooks_controller_test.rb +62 -58
  122. data/test/controllers/api/locks_controller_test.rb +38 -34
  123. data/test/controllers/api/outputs_controller_test.rb +15 -11
  124. data/test/controllers/api/stacks_controller_test.rb +56 -52
  125. data/test/controllers/api/tasks_controller_test.rb +30 -26
  126. data/test/controllers/commit_checks_controller_test.rb +29 -27
  127. data/test/controllers/deploys_controller_test.rb +68 -66
  128. data/test/controllers/github_authentication_controller_test.rb +9 -7
  129. data/test/controllers/rollbacks_controller_test.rb +43 -41
  130. data/test/controllers/stacks_controller_test.rb +131 -128
  131. data/test/controllers/status_controller_test.rb +8 -6
  132. data/test/controllers/tasks_controller_test.rb +70 -68
  133. data/test/controllers/webhooks_controller_test.rb +127 -125
  134. data/test/dummy/db/development.sqlite3 +0 -0
  135. data/test/dummy/db/schema.rb +2 -2
  136. data/test/dummy/db/seeds.rb +133 -131
  137. data/test/dummy/db/test.sqlite3 +0 -0
  138. data/test/fixtures/{api_clients.yml → shipit/api_clients.yml} +0 -0
  139. data/test/fixtures/{commits.yml → shipit/commits.yml} +0 -0
  140. data/test/fixtures/{deliveries.yml → shipit/deliveries.yml} +0 -0
  141. data/test/fixtures/{github_hooks.yml → shipit/github_hooks.yml} +4 -4
  142. data/test/fixtures/{hooks.yml → shipit/hooks.yml} +0 -0
  143. data/test/fixtures/{memberships.yml → shipit/memberships.yml} +0 -0
  144. data/test/fixtures/{output_chunks.yml → shipit/output_chunks.yml} +0 -0
  145. data/test/fixtures/{stacks.yml → shipit/stacks.yml} +0 -0
  146. data/test/fixtures/{statuses.yml → shipit/statuses.yml} +0 -0
  147. data/test/fixtures/{tasks.yml → shipit/tasks.yml} +8 -8
  148. data/test/fixtures/{teams.yml → shipit/teams.yml} +0 -0
  149. data/test/fixtures/{users.yml → shipit/users.yml} +0 -0
  150. data/test/helpers/api_helper.rb +1 -1
  151. data/test/helpers/fixture_aliases_helper.rb +4 -4
  152. data/test/jobs/cache_deploy_spec_job_test.rb +15 -13
  153. data/test/jobs/chunk_rollup_job_test.rb +30 -28
  154. data/test/jobs/deliver_hook_job_test.rb +11 -9
  155. data/test/jobs/destroy_stack_job_test.rb +11 -9
  156. data/test/jobs/emit_event_job_test.rb +10 -8
  157. data/test/jobs/fetch_commit_stats_job_test.rb +10 -8
  158. data/test/jobs/fetch_deployed_revision_job_test.rb +24 -22
  159. data/test/jobs/github_sync_job_test.rb +51 -49
  160. data/test/jobs/perform_task_job_test.rb +78 -76
  161. data/test/jobs/refresh_github_user_job_test.rb +10 -8
  162. data/test/jobs/refresh_status_job_test.rb +14 -12
  163. data/test/jobs/unique_job_test.rb +18 -15
  164. data/test/models/api_client_test.rb +20 -18
  165. data/test/models/commit_checks_test.rb +63 -61
  166. data/test/models/commits_test.rb +317 -314
  167. data/test/models/delivery_test.rb +29 -27
  168. data/test/models/deploys_test.rb +289 -287
  169. data/test/models/github_hook_test.rb +45 -43
  170. data/test/models/hook_test.rb +44 -42
  171. data/test/models/membership_test.rb +9 -7
  172. data/test/models/missing_status_test.rb +16 -14
  173. data/test/models/output_chunk_test.rb +14 -12
  174. data/test/models/rollbacks_test.rb +14 -12
  175. data/test/models/stacks_test.rb +272 -270
  176. data/test/models/status_group_test.rb +18 -16
  177. data/test/models/status_test.rb +42 -40
  178. data/test/models/task_definitions_test.rb +27 -25
  179. data/test/models/team_test.rb +39 -37
  180. data/test/models/users_test.rb +61 -59
  181. data/test/unit/command_test.rb +43 -41
  182. data/test/unit/commands_test.rb +8 -6
  183. data/test/unit/csv_serializer_test.rb +28 -26
  184. data/test/unit/deploy_commands_test.rb +179 -176
  185. data/test/unit/deploy_spec_test.rb +237 -235
  186. data/test/unit/github_url_helper_test.rb +19 -17
  187. data/test/unit/shipit_test.rb +44 -42
  188. metadata +139 -137
  189. data/app/controllers/api/base_controller.rb +0 -66
  190. data/app/controllers/api/deploys_controller.rb +0 -15
  191. data/app/controllers/api/hooks_controller.rb +0 -51
  192. data/app/controllers/api/locks_controller.rb +0 -30
  193. data/app/controllers/api/outputs_controller.rb +0 -15
  194. data/app/controllers/api/stacks_controller.rb +0 -19
  195. data/app/controllers/api/tasks_controller.rb +0 -18
  196. data/app/controllers/commit_checks_controller.rb +0 -24
  197. data/app/controllers/concerns/api/cacheable.rb +0 -11
  198. data/app/controllers/concerns/api/rendering.rb +0 -23
  199. data/app/controllers/concerns/pagination.rb +0 -25
  200. data/app/controllers/deploys_controller.rb +0 -45
  201. data/app/controllers/github_authentication_controller.rb +0 -25
  202. data/app/controllers/rollbacks_controller.rb +0 -24
  203. data/app/controllers/shipit_controller.rb +0 -54
  204. data/app/controllers/stacks_controller.rb +0 -79
  205. data/app/controllers/status_controller.rb +0 -5
  206. data/app/controllers/tasks_controller.rb +0 -46
  207. data/app/controllers/webhooks_controller.rb +0 -99
  208. data/app/helpers/chunks_helper.rb +0 -6
  209. data/app/helpers/deploys_helper.rb +0 -26
  210. data/app/helpers/github_url_helper.rb +0 -46
  211. data/app/helpers/shipit_helper.rb +0 -62
  212. data/app/helpers/stacks_helper.rb +0 -76
  213. data/app/helpers/tasks_helper.rb +0 -9
  214. data/app/jobs/background_job.rb +0 -22
  215. data/app/jobs/background_job/unique.rb +0 -26
  216. data/app/jobs/cache_deploy_spec_job.rb +0 -10
  217. data/app/jobs/chunk_rollup_job.rb +0 -19
  218. data/app/jobs/clear_git_cache_job.rb +0 -7
  219. data/app/jobs/deliver_hook_job.rb +0 -7
  220. data/app/jobs/destroy_stack_job.rb +0 -7
  221. data/app/jobs/emit_event_job.rb +0 -8
  222. data/app/jobs/fetch_commit_stats_job.rb +0 -7
  223. data/app/jobs/fetch_deployed_revision_job.rb +0 -21
  224. data/app/jobs/git_mirror_update_job.rb +0 -10
  225. data/app/jobs/github_sync_job.rb +0 -53
  226. data/app/jobs/perform_commit_checks_job.rb +0 -5
  227. data/app/jobs/perform_task_job.rb +0 -55
  228. data/app/jobs/refresh_github_user_job.rb +0 -7
  229. data/app/jobs/refresh_statuses_job.rb +0 -12
  230. data/app/jobs/setup_github_hook_job.rb +0 -9
  231. data/app/models/anonymous_user.rb +0 -41
  232. data/app/models/api_client.rb +0 -42
  233. data/app/models/commit.rb +0 -207
  234. data/app/models/commit_checks.rb +0 -88
  235. data/app/models/delivery.rb +0 -45
  236. data/app/models/deploy.rb +0 -151
  237. data/app/models/deploy_spec.rb +0 -148
  238. data/app/models/deploy_spec/bundler_discovery.rb +0 -59
  239. data/app/models/deploy_spec/capistrano_discovery.rb +0 -27
  240. data/app/models/deploy_spec/file_system.rb +0 -62
  241. data/app/models/deploy_spec/pypi_discovery.rb +0 -32
  242. data/app/models/deploy_spec/rubygems_discovery.rb +0 -32
  243. data/app/models/github_hook.rb +0 -144
  244. data/app/models/hook.rb +0 -84
  245. data/app/models/membership.rb +0 -6
  246. data/app/models/missing_status.rb +0 -18
  247. data/app/models/output_chunk.rb +0 -9
  248. data/app/models/rollback.rb +0 -29
  249. data/app/models/stack.rb +0 -306
  250. data/app/models/status.rb +0 -42
  251. data/app/models/status_group.rb +0 -33
  252. data/app/models/task.rb +0 -197
  253. data/app/models/task_definition.rb +0 -36
  254. data/app/models/team.rb +0 -67
  255. data/app/models/unknown_status.rb +0 -41
  256. data/app/models/user.rb +0 -81
  257. data/app/models/variable_definition.rb +0 -19
  258. data/app/serializers/anonymous_user_serializer.rb +0 -2
  259. data/app/serializers/commit_serializer.rb +0 -6
  260. data/app/serializers/concerns/conditional_attributes.rb +0 -20
  261. data/app/serializers/deploy_serializer.rb +0 -13
  262. data/app/serializers/hook_serializer.rb +0 -10
  263. data/app/serializers/rollback_serializer.rb +0 -5
  264. data/app/serializers/short_commit_serializer.rb +0 -7
  265. data/app/serializers/stack_serializer.rb +0 -31
  266. data/app/serializers/tail_task_serializer.rb +0 -37
  267. data/app/serializers/task_serializer.rb +0 -28
  268. data/app/serializers/user_serializer.rb +0 -3
  269. data/lib/command.rb +0 -169
  270. data/lib/commands.rb +0 -23
  271. data/lib/deploy_commands.rb +0 -19
  272. data/lib/rollback_commands.rb +0 -5
  273. data/lib/stack_commands.rb +0 -58
  274. data/lib/task_commands.rb +0 -66
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 5426e5013d5212ede90d2822ff120284f476a065
4
- data.tar.gz: 7aadb634611342fb72106ed6a7b0ec3f10dbfa6a
3
+ metadata.gz: eec3ad56957753526c730d8e7aaa24eceb08aafb
4
+ data.tar.gz: f02335b4c8b8d8dea3ddadc8de5c4351339a289f
5
5
  SHA512:
6
- metadata.gz: 1181813ddadc3e0bf49276542a4f44506d500f5c6cbd3214c3e4bd20f3774ba75eb4bd65fa32318af80769341b135b9edde114f21edac1024af31cf631852e01
7
- data.tar.gz: 3cd714bc2387ece2d228d2d4ed27ce721dd24690e862c8f5412d2b76f5107b58effbcdde8388f79f3c4a49209fb1fd1e729ce278333843aa76212d978081c908
6
+ metadata.gz: 34f44b9cc7315992879ae69fe283fe76a8f250f5244376fd7cd5ef49688fba8ba3234b91aa0304349ace86fbdd15d8bc0bbce3cc1fcdf7d608459ce958c48d86
7
+ data.tar.gz: 7f4116a87a98201a0be003d3baeaa38dba7fb3d3a0cc131bb7ccf974daec70c16da76b3959f1ee238255d4b2dc057cfff610bb6cc51a24e345a12c78426169e2
@@ -0,0 +1,13 @@
1
+ module Shipit
2
+ module Api
3
+ module Cacheable
4
+ def render_resources(resources, *)
5
+ super if stale?(etag: resources, last_modified: resources.map(&:updated_at).max, template: false)
6
+ end
7
+
8
+ def render_resource(resource, *)
9
+ super if stale?(etag: resource, last_modified: resource.updated_at, template: false)
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,37 @@
1
+ module Shipit
2
+ module Api
3
+ module Paginable
4
+ extend ActiveSupport::Concern
5
+
6
+ LINK = 'Link'.freeze
7
+
8
+ included do
9
+ class_attribute :max_page_size
10
+ class_attribute :default_page_size
11
+ class_attribute :default_order
12
+
13
+ self.max_page_size = 100
14
+ self.default_page_size = 30
15
+ self.default_order = {id: :desc}.freeze
16
+ end
17
+
18
+ private
19
+
20
+ def render_resources(resource, *)
21
+ paginator = Shipit::Paginator.new(
22
+ resource,
23
+ self,
24
+ order: default_order,
25
+ max_page_size: max_page_size,
26
+ default_page_size: default_page_size,
27
+ )
28
+ headers[LINK] = render_links(paginator.links)
29
+ super(paginator.to_a)
30
+ end
31
+
32
+ def render_links(links)
33
+ links.map { |rel, url| %(<#{url}>; rel="#{rel}") }.join(', ')
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,25 @@
1
+ module Shipit
2
+ module Api
3
+ module Rendering
4
+ private
5
+
6
+ def render_resources(resources, options = {})
7
+ options[:json] = resources
8
+ render options
9
+ end
10
+
11
+ def render_resource(resource, options = {})
12
+ if resource.destroyed?
13
+ options[:status] = :no_content
14
+ options[:text] = nil
15
+ elsif resource.errors.any?
16
+ options[:json] = {errors: resource.errors}
17
+ options[:status] = :unprocessable_entity
18
+ else
19
+ options[:json] = resource
20
+ end
21
+ render options
22
+ end
23
+ end
24
+ end
25
+ end
@@ -1,9 +1,7 @@
1
- module Api
2
- module Paginable
1
+ module Shipit
2
+ module Pagination
3
3
  extend ActiveSupport::Concern
4
4
 
5
- LINK = 'Link'.freeze
6
-
7
5
  included do
8
6
  class_attribute :max_page_size
9
7
  class_attribute :default_page_size
@@ -16,20 +14,14 @@ module Api
16
14
 
17
15
  private
18
16
 
19
- def render_resources(resource, *)
20
- paginator = Shipit::Paginator.new(
21
- resource,
17
+ def paginate(relation)
18
+ Shipit::Paginator.new(
19
+ relation,
22
20
  self,
23
21
  order: default_order,
24
22
  max_page_size: max_page_size,
25
23
  default_page_size: default_page_size,
26
24
  )
27
- headers[LINK] = render_links(paginator.links)
28
- super(paginator.to_a)
29
- end
30
-
31
- def render_links(links)
32
- links.map { |rel, url| %(<#{url}>; rel="#{rel}") }.join(', ')
33
25
  end
34
26
  end
35
27
  end
@@ -0,0 +1,68 @@
1
+ module Shipit
2
+ module Api
3
+ class BaseController < ActionController::Base
4
+ include Shipit::Engine.routes.url_helpers
5
+ include Rendering
6
+ include Cacheable
7
+ include Paginable
8
+
9
+ rescue_from ApiClient::InsufficientPermission, with: :insufficient_permission
10
+ rescue_from TaskDefinition::NotFound, with: :not_found
11
+
12
+ class << self
13
+ def require_permission(operation, scope, options = {})
14
+ before_action(options) { require_permission!(operation, scope) }
15
+ end
16
+ end
17
+
18
+ before_action :authenticate_api_client
19
+
20
+ def index
21
+ render json: {stacks_url: api_stacks_url}
22
+ end
23
+
24
+ private
25
+
26
+ def authenticate_api_client
27
+ @current_api_client = authenticate_with_http_basic do |*parts|
28
+ token = parts.select(&:present?).join('--')
29
+ ApiClient.authenticate(token)
30
+ end
31
+ return if @current_api_client
32
+ headers['WWW-Authenticate'] = 'Basic realm="Authentication token"'
33
+ render status: :unauthorized, json: {message: 'Bad credentials'}
34
+ end
35
+
36
+ attr_reader :current_api_client
37
+
38
+ def current_user
39
+ @current_user ||= identify_user || AnonymousUser.new
40
+ end
41
+
42
+ def identify_user
43
+ user_login = request.headers['X-Shipit-User'].presence
44
+ User.find_by(login: user_login) if user_login
45
+ end
46
+
47
+ def stacks
48
+ @stacks ||= current_api_client.stack_id? ? Stack.where(id: current_api_client.stack_id) : Stack.all
49
+ end
50
+
51
+ def stack
52
+ @stack ||= stacks.from_param!(params[:stack_id])
53
+ end
54
+
55
+ def require_permission!(operation, scope)
56
+ current_api_client.check_permissions!(operation, scope)
57
+ end
58
+
59
+ def insufficient_permission(error)
60
+ render status: :forbidden, json: {message: error.message}
61
+ end
62
+
63
+ def not_found(_error)
64
+ render status: :not_found, json: {status: '404', error: 'Not Found'}
65
+ end
66
+ end
67
+ end
68
+ end
@@ -0,0 +1,17 @@
1
+ module Shipit
2
+ module Api
3
+ class DeploysController < BaseController
4
+ require_permission :deploy, :stack
5
+
6
+ params do
7
+ requires :sha, String, length: {in: 6..40}
8
+ accepts :force, Boolean, default: false
9
+ end
10
+ def create
11
+ commit = stack.commits.by_sha(params.sha) || param_error!(:sha, 'Unknown revision')
12
+ param_error!(:force, "Can't deploy a locked stack") if !params.force && stack.locked?
13
+ render_resource stack.trigger_deploy(commit, current_user), status: :accepted
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,53 @@
1
+ module Shipit
2
+ module Api
3
+ class HooksController < BaseController
4
+ require_permission :read, :hook, only: %i(index show)
5
+ require_permission :write, :hook, only: %i(create update destroy)
6
+
7
+ def index
8
+ render_resources hooks
9
+ end
10
+
11
+ def show
12
+ render json: hook
13
+ end
14
+
15
+ params do
16
+ requires :url, String
17
+ requires :events, Array[String]
18
+ accepts :content_type, String
19
+ end
20
+ def create
21
+ render_resource hooks.create(params)
22
+ end
23
+
24
+ params do
25
+ accepts :url, String
26
+ accepts :events, Array[String]
27
+ accepts :content_type, String
28
+ end
29
+ def update
30
+ hook.update(params)
31
+ render_resource hook
32
+ end
33
+
34
+ def destroy
35
+ render_resource hook.destroy
36
+ end
37
+
38
+ private
39
+
40
+ def hook
41
+ hooks.find(params[:id])
42
+ end
43
+
44
+ def hooks
45
+ Hook.where(stack_id: stack_id)
46
+ end
47
+
48
+ def stack_id
49
+ stack.id if params[:stack_id].present?
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,32 @@
1
+ module Shipit
2
+ module Api
3
+ class LocksController < BaseController
4
+ require_permission :lock, :stack
5
+
6
+ params do
7
+ requires :reason, String, presence: true
8
+ end
9
+ def create
10
+ if stack.locked?
11
+ render json: {message: 'Already locked'}, status: :conflict
12
+ else
13
+ stack.update(lock_reason: params.reason, lock_author: current_user)
14
+ render_resource stack
15
+ end
16
+ end
17
+
18
+ params do
19
+ requires :reason, String, presence: true
20
+ end
21
+ def update
22
+ stack.update(lock_reason: params.reason, lock_author: current_user)
23
+ render_resource stack
24
+ end
25
+
26
+ def destroy
27
+ stack.update(lock_reason: nil, lock_author: nil)
28
+ render_resource stack
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,17 @@
1
+ module Shipit
2
+ module Api
3
+ class OutputsController < BaseController
4
+ require_permission :read, :stack
5
+
6
+ def show
7
+ render plain: task.chunk_output
8
+ end
9
+
10
+ private
11
+
12
+ def task
13
+ @task ||= stack.tasks.find(params[:task_id])
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,21 @@
1
+ module Shipit
2
+ module Api
3
+ class StacksController < BaseController
4
+ require_permission :read, :stack
5
+
6
+ def index
7
+ render_resources stacks
8
+ end
9
+
10
+ def show
11
+ render_resource stack
12
+ end
13
+
14
+ private
15
+
16
+ def stack
17
+ @stack ||= stacks.from_param!(params[:id])
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,20 @@
1
+ module Shipit
2
+ module Api
3
+ class TasksController < BaseController
4
+ require_permission :read, :stack
5
+ require_permission :deploy, :stack, only: :trigger
6
+
7
+ def index
8
+ render_resources stack.tasks
9
+ end
10
+
11
+ def show
12
+ render_resource stack.tasks.find(params[:id])
13
+ end
14
+
15
+ def trigger
16
+ render_resource stack.trigger_task(params[:task_name], current_user), status: :accepted
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,26 @@
1
+ module Shipit
2
+ class CommitChecksController < ShipitController
3
+ params do
4
+ accepts :since, Integer, default: 0
5
+ end
6
+ def tail
7
+ output = checks.output(since: params.since)
8
+ next_offset = params.since + output.bytesize
9
+ url = stack_tail_commit_checks_path(stack, sha: commit.sha, since: next_offset) unless checks.finished?
10
+
11
+ render json: {url: url, output: output, status: checks.status}
12
+ end
13
+
14
+ private
15
+
16
+ delegate :checks, to: :commit
17
+
18
+ def commit
19
+ @commit ||= stack.commits.find_by_sha!(params[:sha])
20
+ end
21
+
22
+ def stack
23
+ @stack ||= Stack.from_param!(params[:stack_id])
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,47 @@
1
+ module Shipit
2
+ class DeploysController < ShipitController
3
+ include ChunksHelper
4
+
5
+ before_action :load_stack
6
+ before_action :load_deploy, only: %i(show rollback)
7
+ before_action :load_until_commit, only: :create
8
+
9
+ def new
10
+ @commit = @stack.commits.by_sha!(params[:sha])
11
+ @commit.checks.schedule if @stack.checks?
12
+ @deploy = @stack.deploys.new(until_commit: @commit, since_commit: @stack.last_deployed_commit)
13
+ end
14
+
15
+ def show
16
+ end
17
+
18
+ def create
19
+ return redirect_to new_stack_deploy_path(@stack, sha: @until_commit.sha) if !params[:force] && @stack.deploying?
20
+
21
+ @deploy = @stack.trigger_deploy(@until_commit, current_user, env: deploy_params[:env])
22
+ respond_with(@deploy.stack, @deploy)
23
+ end
24
+
25
+ def rollback
26
+ @rollback = @deploy.build_rollback
27
+ end
28
+
29
+ private
30
+
31
+ def load_deploy
32
+ @deploy = @stack.deploys.find(params[:id])
33
+ end
34
+
35
+ def load_stack
36
+ @stack ||= Stack.from_param!(params[:stack_id])
37
+ end
38
+
39
+ def load_until_commit
40
+ @until_commit = @stack.commits.find(deploy_params[:until_commit_id])
41
+ end
42
+
43
+ def deploy_params
44
+ @deploy_params ||= params.require(:deploy).permit(:until_commit_id, env: @stack.deploy_variables.map(&:name))
45
+ end
46
+ end
47
+ end