uffizzi-core 0.1.12

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 (257) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/README.md +52 -0
  4. data/Rakefile +31 -0
  5. data/app/assets/config/uffizzi_core_manifest.js +1 -0
  6. data/app/assets/stylesheets/uffizzi_core/application.css +15 -0
  7. data/app/clients/uffizzi_core/amazon_registry_client.rb +18 -0
  8. data/app/clients/uffizzi_core/azure_registry_client/request_result.rb +5 -0
  9. data/app/clients/uffizzi_core/azure_registry_client.rb +42 -0
  10. data/app/clients/uffizzi_core/controller_client/request_result.rb +5 -0
  11. data/app/clients/uffizzi_core/controller_client.rb +106 -0
  12. data/app/clients/uffizzi_core/docker_hub_client/request_result.rb +7 -0
  13. data/app/clients/uffizzi_core/docker_hub_client.rb +141 -0
  14. data/app/clients/uffizzi_core/github_container_registry_client/request_result.rb +7 -0
  15. data/app/clients/uffizzi_core/github_container_registry_client.rb +52 -0
  16. data/app/clients/uffizzi_core/google_registry_client/request_result.rb +5 -0
  17. data/app/clients/uffizzi_core/google_registry_client.rb +42 -0
  18. data/app/contexts/uffizzi_core/base_context.rb +12 -0
  19. data/app/contexts/uffizzi_core/project_context.rb +13 -0
  20. data/app/contexts/uffizzi_core/webhooks_context.rb +9 -0
  21. data/app/controllers/concerns/uffizzi_core/auth_management.rb +23 -0
  22. data/app/controllers/concerns/uffizzi_core/authorization_concern.rb +38 -0
  23. data/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb +19 -0
  24. data/app/controllers/uffizzi_core/api/cli/v1/account/application_controller.rb +7 -0
  25. data/app/controllers/uffizzi_core/api/cli/v1/account/credentials_controller.rb +91 -0
  26. data/app/controllers/uffizzi_core/api/cli/v1/application_controller.rb +5 -0
  27. data/app/controllers/uffizzi_core/api/cli/v1/projects/application_controller.rb +11 -0
  28. data/app/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller.rb +93 -0
  29. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/activity_items_controller.rb +36 -0
  30. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/application_controller.rb +7 -0
  31. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/application_controller.rb +8 -0
  32. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/logs_controller.rb +27 -0
  33. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers_controller.rb +24 -0
  34. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/events_controller.rb +29 -0
  35. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb +179 -0
  36. data/app/controllers/uffizzi_core/api/cli/v1/projects/secrets_controller.rb +61 -0
  37. data/app/controllers/uffizzi_core/api/cli/v1/projects_controller.rb +85 -0
  38. data/app/controllers/uffizzi_core/api/cli/v1/sessions_controller.rb +43 -0
  39. data/app/controllers/uffizzi_core/application_controller.rb +57 -0
  40. data/app/errors/uffizzi_core/compose_file/build_error.rb +4 -0
  41. data/app/errors/uffizzi_core/compose_file/credential_error.rb +4 -0
  42. data/app/errors/uffizzi_core/compose_file/parse_error.rb +4 -0
  43. data/app/errors/uffizzi_core/compose_file/secrets_error.rb +4 -0
  44. data/app/errors/uffizzi_core/deployment/image_pull_error.rb +10 -0
  45. data/app/errors/uffizzi_core/deployment_not_found_error.rb +10 -0
  46. data/app/forms/uffizzi_core/api/cli/v1/account/credential/check_credential_form.rb +16 -0
  47. data/app/forms/uffizzi_core/api/cli/v1/account/credential/create_form.rb +26 -0
  48. data/app/forms/uffizzi_core/api/cli/v1/compose_file/check_credentials_form.rb +21 -0
  49. data/app/forms/uffizzi_core/api/cli/v1/compose_file/cli_form.rb +22 -0
  50. data/app/forms/uffizzi_core/api/cli/v1/compose_file/create_form.rb +13 -0
  51. data/app/forms/uffizzi_core/api/cli/v1/compose_file/template_form.rb +44 -0
  52. data/app/forms/uffizzi_core/api/cli/v1/compose_file/update_form.rb +9 -0
  53. data/app/forms/uffizzi_core/api/cli/v1/config_file/create_form.rb +11 -0
  54. data/app/forms/uffizzi_core/api/cli/v1/deployment/create_form.rb +92 -0
  55. data/app/forms/uffizzi_core/api/cli/v1/deployment/update_form.rb +90 -0
  56. data/app/forms/uffizzi_core/api/cli/v1/project/create_form.rb +7 -0
  57. data/app/forms/uffizzi_core/api/cli/v1/project/update_form.rb +10 -0
  58. data/app/forms/uffizzi_core/api/cli/v1/secret/bulk_assign_form.rb +39 -0
  59. data/app/forms/uffizzi_core/api/cli/v1/session_create_form.rb +29 -0
  60. data/app/forms/uffizzi_core/api/cli/v1/template/create_form.rb +65 -0
  61. data/app/forms/uffizzi_core/application_form.rb +11 -0
  62. data/app/forms/uffizzi_core/application_form_without_active_record.rb +17 -0
  63. data/app/forms/uffizzi_core/mass_assignment_control_concern.rb +22 -0
  64. data/app/helpers/uffizzi_core/application_helper.rb +6 -0
  65. data/app/jobs/uffizzi_core/account/create_credential_job.rb +10 -0
  66. data/app/jobs/uffizzi_core/activity_item/docker/update_digest_job.rb +11 -0
  67. data/app/jobs/uffizzi_core/application_job.rb +7 -0
  68. data/app/jobs/uffizzi_core/config_file/apply_job.rb +31 -0
  69. data/app/jobs/uffizzi_core/credential/docker_hub/create_webhook_job.rb +15 -0
  70. data/app/jobs/uffizzi_core/deployment/create_credential_job.rb +32 -0
  71. data/app/jobs/uffizzi_core/deployment/create_credentials_job.rb +17 -0
  72. data/app/jobs/uffizzi_core/deployment/create_job.rb +15 -0
  73. data/app/jobs/uffizzi_core/deployment/create_webhooks_job.rb +13 -0
  74. data/app/jobs/uffizzi_core/deployment/delete_credential_job.rb +13 -0
  75. data/app/jobs/uffizzi_core/deployment/delete_job.rb +11 -0
  76. data/app/jobs/uffizzi_core/deployment/deploy_containers_job.rb +27 -0
  77. data/app/jobs/uffizzi_core/deployment/manage_deploy_activity_item_job.rb +38 -0
  78. data/app/lib/uffizzi_core/concerns/models/activity_item.rb +39 -0
  79. data/app/lib/uffizzi_core/concerns/models/credential.rb +65 -0
  80. data/app/lib/uffizzi_core/concerns/models/repo.rb +33 -0
  81. data/app/lib/uffizzi_core/rbac/user_access_service.rb +45 -0
  82. data/app/mailers/uffizzi_core/application_mailer.rb +8 -0
  83. data/app/models/concerns/uffizzi_core/hashid_concern.rb +25 -0
  84. data/app/models/concerns/uffizzi_core/state_machine_concern.rb +16 -0
  85. data/app/models/uffizzi_core/account.rb +83 -0
  86. data/app/models/uffizzi_core/activity_item/docker.rb +4 -0
  87. data/app/models/uffizzi_core/activity_item/github.rb +4 -0
  88. data/app/models/uffizzi_core/activity_item/memory_limit.rb +4 -0
  89. data/app/models/uffizzi_core/activity_item.rb +53 -0
  90. data/app/models/uffizzi_core/application_record.rb +7 -0
  91. data/app/models/uffizzi_core/build.rb +39 -0
  92. data/app/models/uffizzi_core/comment.rb +16 -0
  93. data/app/models/uffizzi_core/compose_file.rb +57 -0
  94. data/app/models/uffizzi_core/config_file.rb +24 -0
  95. data/app/models/uffizzi_core/container.rb +100 -0
  96. data/app/models/uffizzi_core/container_config_file.rb +8 -0
  97. data/app/models/uffizzi_core/continuous_preview.rb +4 -0
  98. data/app/models/uffizzi_core/coupon.rb +5 -0
  99. data/app/models/uffizzi_core/credential/amazon.rb +4 -0
  100. data/app/models/uffizzi_core/credential/azure.rb +4 -0
  101. data/app/models/uffizzi_core/credential/docker_hub.rb +4 -0
  102. data/app/models/uffizzi_core/credential/github.rb +4 -0
  103. data/app/models/uffizzi_core/credential/github_container_registry.rb +4 -0
  104. data/app/models/uffizzi_core/credential/google.rb +4 -0
  105. data/app/models/uffizzi_core/credential.rb +61 -0
  106. data/app/models/uffizzi_core/database.rb +4 -0
  107. data/app/models/uffizzi_core/database_offering.rb +4 -0
  108. data/app/models/uffizzi_core/deployment.rb +86 -0
  109. data/app/models/uffizzi_core/event.rb +13 -0
  110. data/app/models/uffizzi_core/invitation.rb +27 -0
  111. data/app/models/uffizzi_core/membership.rb +16 -0
  112. data/app/models/uffizzi_core/payment.rb +11 -0
  113. data/app/models/uffizzi_core/price.rb +9 -0
  114. data/app/models/uffizzi_core/product.rb +11 -0
  115. data/app/models/uffizzi_core/project.rb +67 -0
  116. data/app/models/uffizzi_core/rating.rb +20 -0
  117. data/app/models/uffizzi_core/repo/amazon.rb +4 -0
  118. data/app/models/uffizzi_core/repo/azure.rb +4 -0
  119. data/app/models/uffizzi_core/repo/docker_hub.rb +4 -0
  120. data/app/models/uffizzi_core/repo/github.rb +4 -0
  121. data/app/models/uffizzi_core/repo/github_container_registry.rb +4 -0
  122. data/app/models/uffizzi_core/repo/google.rb +4 -0
  123. data/app/models/uffizzi_core/repo.rb +29 -0
  124. data/app/models/uffizzi_core/role.rb +17 -0
  125. data/app/models/uffizzi_core/secret.rb +9 -0
  126. data/app/models/uffizzi_core/template.rb +19 -0
  127. data/app/models/uffizzi_core/user.rb +62 -0
  128. data/app/models/uffizzi_core/user_project.rb +14 -0
  129. data/app/policies/uffizzi_core/api/cli/v1/account/credentials_policy.rb +19 -0
  130. data/app/policies/uffizzi_core/api/cli/v1/projects/compose_files_policy.rb +15 -0
  131. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments/activity_items_policy.rb +7 -0
  132. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments/containers_policy.rb +7 -0
  133. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments/events_policy.rb +7 -0
  134. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments_policy.rb +27 -0
  135. data/app/policies/uffizzi_core/api/cli/v1/projects/secrets_policy.rb +15 -0
  136. data/app/policies/uffizzi_core/api/cli/v1/projects_policy.rb +19 -0
  137. data/app/policies/uffizzi_core/application_policy.rb +12 -0
  138. data/app/repositories/uffizzi_core/activity_item_repo.rb +9 -0
  139. data/app/repositories/uffizzi_core/basic_order_repo.rb +11 -0
  140. data/app/repositories/uffizzi_core/build_repo.rb +23 -0
  141. data/app/repositories/uffizzi_core/comment_repo.rb +11 -0
  142. data/app/repositories/uffizzi_core/compose_file_repo.rb +11 -0
  143. data/app/repositories/uffizzi_core/config_file_repo.rb +40 -0
  144. data/app/repositories/uffizzi_core/container_repo.rb +25 -0
  145. data/app/repositories/uffizzi_core/credential_repo.rb +31 -0
  146. data/app/repositories/uffizzi_core/deployment_repo.rb +24 -0
  147. data/app/repositories/uffizzi_core/event_repo.rb +9 -0
  148. data/app/repositories/uffizzi_core/membership_repo.rb +10 -0
  149. data/app/repositories/uffizzi_core/price_repo.rb +11 -0
  150. data/app/repositories/uffizzi_core/product_repo.rb +11 -0
  151. data/app/repositories/uffizzi_core/project_repo.rb +10 -0
  152. data/app/repositories/uffizzi_core/repo_repo.rb +10 -0
  153. data/app/repositories/uffizzi_core/template_repo.rb +87 -0
  154. data/app/repositories/uffizzi_core/usage_repo.rb +9 -0
  155. data/app/repositories/uffizzi_core/user_repo.rb +11 -0
  156. data/app/responders/uffizzi_core/json_responder.rb +13 -0
  157. data/app/serializers/uffizzi_core/api/cli/v1/account/credential_serializer.rb +9 -0
  158. data/app/serializers/uffizzi_core/api/cli/v1/project_serializer/compose_file_serializer.rb +7 -0
  159. data/app/serializers/uffizzi_core/api/cli/v1/project_serializer/deployment_serializer.rb +13 -0
  160. data/app/serializers/uffizzi_core/api/cli/v1/project_serializer.rb +30 -0
  161. data/app/serializers/uffizzi_core/api/cli/v1/projects/compose_file_serializer.rb +7 -0
  162. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/container_serializer.rb +32 -0
  163. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/user_serializer.rb +11 -0
  164. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer.rb +74 -0
  165. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/activity_item_serializer.rb +24 -0
  166. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer/config_file_serializer.rb +6 -0
  167. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer.rb +7 -0
  168. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer.rb +30 -0
  169. data/app/serializers/uffizzi_core/api/cli/v1/projects/secret_serializer.rb +5 -0
  170. data/app/serializers/uffizzi_core/api/cli/v1/short_project_serializer.rb +7 -0
  171. data/app/serializers/uffizzi_core/api/cli/v1/user_serializer/account_serializer.rb +5 -0
  172. data/app/serializers/uffizzi_core/api/cli/v1/user_serializer.rb +7 -0
  173. data/app/serializers/uffizzi_core/base_serializer.rb +7 -0
  174. data/app/serializers/uffizzi_core/controller/apply_config_file/config_file_serializer.rb +5 -0
  175. data/app/serializers/uffizzi_core/controller/create_credential/credential_serializer.rb +19 -0
  176. data/app/serializers/uffizzi_core/controller/create_deployment/deployment_serializer.rb +5 -0
  177. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer/config_file_serializer.rb +8 -0
  178. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer.rb +7 -0
  179. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb +70 -0
  180. data/app/serializers/uffizzi_core/controller/deploy_containers/credential_serializer.rb +5 -0
  181. data/app/services/uffizzi_core/account_service.rb +21 -0
  182. data/app/services/uffizzi_core/activity_item_service.rb +88 -0
  183. data/app/services/uffizzi_core/amazon/credential_service.rb +31 -0
  184. data/app/services/uffizzi_core/amazon_service.rb +45 -0
  185. data/app/services/uffizzi_core/azure/credential_service.rb +18 -0
  186. data/app/services/uffizzi_core/compose_file/builders/config_files_builder_service.rb +31 -0
  187. data/app/services/uffizzi_core/compose_file/builders/container_builder_service.rb +222 -0
  188. data/app/services/uffizzi_core/compose_file/builders/docker_repo_builder_service.rb +25 -0
  189. data/app/services/uffizzi_core/compose_file/builders/template_builder_service.rb +45 -0
  190. data/app/services/uffizzi_core/compose_file/builders/variables_builder_service.rb +58 -0
  191. data/app/services/uffizzi_core/compose_file/config_files_service.rb +52 -0
  192. data/app/services/uffizzi_core/compose_file/config_option_service.rb +41 -0
  193. data/app/services/uffizzi_core/compose_file/configs_options_service.rb +26 -0
  194. data/app/services/uffizzi_core/compose_file/container_service.rb +68 -0
  195. data/app/services/uffizzi_core/compose_file/continuous_preview_options_service.rb +57 -0
  196. data/app/services/uffizzi_core/compose_file/dependencies_service.rb +56 -0
  197. data/app/services/uffizzi_core/compose_file/errors_service.rb +46 -0
  198. data/app/services/uffizzi_core/compose_file/github_dependencies_service.rb +38 -0
  199. data/app/services/uffizzi_core/compose_file/ingress_options_service.rb +51 -0
  200. data/app/services/uffizzi_core/compose_file/parsers/services/healthcheck_parser_service.rb +73 -0
  201. data/app/services/uffizzi_core/compose_file/secrets_options_service.rb +28 -0
  202. data/app/services/uffizzi_core/compose_file/services_options/command_service.rb +18 -0
  203. data/app/services/uffizzi_core/compose_file/services_options/configs_service.rb +51 -0
  204. data/app/services/uffizzi_core/compose_file/services_options/deploy_service.rb +44 -0
  205. data/app/services/uffizzi_core/compose_file/services_options/entrypoint_service.rb +18 -0
  206. data/app/services/uffizzi_core/compose_file/services_options/env_file_service.rb +34 -0
  207. data/app/services/uffizzi_core/compose_file/services_options/environment_service.rb +20 -0
  208. data/app/services/uffizzi_core/compose_file/services_options/image_service.rb +89 -0
  209. data/app/services/uffizzi_core/compose_file/services_options/secrets_service.rb +35 -0
  210. data/app/services/uffizzi_core/compose_file/services_options_service.rb +57 -0
  211. data/app/services/uffizzi_core/compose_file/template_service.rb +55 -0
  212. data/app/services/uffizzi_core/compose_file/variables_service.rb +25 -0
  213. data/app/services/uffizzi_core/compose_file_service.rb +181 -0
  214. data/app/services/uffizzi_core/container_service.rb +42 -0
  215. data/app/services/uffizzi_core/controller_service.rb +86 -0
  216. data/app/services/uffizzi_core/credential_service.rb +44 -0
  217. data/app/services/uffizzi_core/deployment_service.rb +307 -0
  218. data/app/services/uffizzi_core/docker_hub/credential_service.rb +15 -0
  219. data/app/services/uffizzi_core/docker_hub_service.rb +77 -0
  220. data/app/services/uffizzi_core/github_container_registry/credential_service.rb +24 -0
  221. data/app/services/uffizzi_core/google/credential_service.rb +18 -0
  222. data/app/services/uffizzi_core/logs_service.rb +33 -0
  223. data/app/services/uffizzi_core/manage_activity_items_service.rb +159 -0
  224. data/app/services/uffizzi_core/project_service.rb +48 -0
  225. data/app/services/uffizzi_core/repo_service.rb +43 -0
  226. data/app/services/uffizzi_core/response_service.rb +13 -0
  227. data/app/services/uffizzi_core/starter_template_service.rb +200 -0
  228. data/app/services/uffizzi_core/template_service.rb +21 -0
  229. data/app/services/uffizzi_core/token_service.rb +19 -0
  230. data/app/services/uffizzi_core/user_access_service.rb +14 -0
  231. data/app/services/uffizzi_core/user_generator_service.rb +84 -0
  232. data/app/utils/uffizzi_core/converters.rb +33 -0
  233. data/app/validators/uffizzi_core/email_validator.rb +9 -0
  234. data/app/validators/uffizzi_core/environment_variable_list_validator.rb +15 -0
  235. data/app/validators/uffizzi_core/image_command_args_validator.rb +21 -0
  236. data/config/initializers/rswag_api.rb +15 -0
  237. data/config/initializers/rswag_ui.rb +15 -0
  238. data/config/initializers/swagger_yard.rb +17 -0
  239. data/config/locales/en.activerecord.yml +23 -0
  240. data/config/locales/en.yml +66 -0
  241. data/config/routes.rb +69 -0
  242. data/db/migrate/20220218121438_create_uffizzi_core_tables.rb +375 -0
  243. data/db/migrate/20220309110201_remove_secrets_from_projects.rb +7 -0
  244. data/db/migrate/20220310110150_create_project_secrets.rb +14 -0
  245. data/db/migrate/20220325113342_add_name_to_uffizzi_containers.rb +7 -0
  246. data/db/migrate/20220329123323_rename_project_secrets_to_secrets.rb +7 -0
  247. data/db/migrate/20220329124542_add_resource_to_secrets.rb +7 -0
  248. data/db/migrate/20220329143241_remove_project_ref_from_secrets.rb +7 -0
  249. data/db/migrate/20220419074956_add_health_check_to_containers.rb +7 -0
  250. data/db/migrate/20220525113412_rename_name_to_uffizzi_containers.rb +7 -0
  251. data/db/seeds.rb +16 -0
  252. data/lib/tasks/uffizzi_core_tasks.rake +19 -0
  253. data/lib/uffizzi_core/engine.rb +15 -0
  254. data/lib/uffizzi_core/version.rb +5 -0
  255. data/lib/uffizzi_core.rb +61 -0
  256. data/swagger/v1/swagger.json +1659 -0
  257. metadata +966 -0
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore::Concerns::Models::ActivityItem
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ include UffizziCore::ActivityItemRepo
8
+
9
+ self.table_name = UffizziCore.table_names[:activity_items]
10
+
11
+ belongs_to :deployment
12
+ belongs_to :container
13
+ belongs_to :build, optional: true
14
+
15
+ has_many :events, dependent: :destroy
16
+
17
+ scope :docker, -> {
18
+ where(type: UffizziCore::ActivityItem::Docker.name)
19
+ }
20
+
21
+ scope :github, -> {
22
+ where(type: UffizziCore::ActivityItem::Github.name)
23
+ }
24
+
25
+ def docker?
26
+ type == UffizziCore::ActivityItem::Docker.name
27
+ end
28
+
29
+ def image
30
+ [namespace, name].compact.join('/')
31
+ end
32
+
33
+ def full_image
34
+ return "#{image}:#{tag}" if docker?
35
+
36
+ ''
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore::Concerns::Models::Credential
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ include AASM
8
+ include UffizziCore::CredentialRepo
9
+
10
+ self.table_name = UffizziCore.table_names[:credentials]
11
+
12
+ belongs_to :account
13
+
14
+ before_destroy :remove_token
15
+
16
+ validates :registry_url, presence: true
17
+
18
+ aasm :state, column: :state do
19
+ state :not_connected, initial: true
20
+ state :active
21
+ state :unauthorized
22
+
23
+ event :activate do
24
+ transitions from: [:not_connected, :unauthorized], to: :active
25
+ end
26
+
27
+ event :unauthorize do
28
+ transitions from: [:not_connected, :active], to: :unauthorized
29
+ end
30
+ end
31
+
32
+ def github_container_registry?
33
+ type == UffizziCore::Credential::GithubContainerRegistry.name
34
+ end
35
+
36
+ def docker_hub?
37
+ type == UffizziCore::Credential::DockerHub.name
38
+ end
39
+
40
+ def azure?
41
+ type == UffizziCore::Credential::Azure.name
42
+ end
43
+
44
+ def google?
45
+ type == UffizziCore::Credential::Google.name
46
+ end
47
+
48
+ def amazon?
49
+ type == UffizziCore::Credential::Amazon.name
50
+ end
51
+
52
+ private
53
+
54
+ def remove_token
55
+ account.projects.find_each do |project|
56
+ project.deployments.find_each do |deployment|
57
+ containers = deployment.containers
58
+ attributes = { continuously_deploy: UffizziCore::Container::STATE_DISABLED }
59
+
60
+ containers.with_docker_hub_repo.update_all(attributes) if docker_hub?
61
+ end
62
+ end
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore::Concerns::Models::Repo
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ extend Enumerize
8
+ include UffizziCore::RepoRepo
9
+
10
+ self.table_name = UffizziCore.table_names[:repos]
11
+
12
+ enumerize :kind, in: [:buildpacks18, :dockerfile, :dotnet, :gatsby, :barestatic], predicates: true
13
+
14
+ belongs_to :project
15
+ has_one :container, inverse_of: :repo, dependent: :destroy
16
+ has_many :builds, dependent: :destroy
17
+
18
+ validates :dockerfile_path, presence: true, if: :dockerfile?
19
+ validates :delete_preview_after, numericality: { greater_than: 0, only_integer: true }, allow_nil: true
20
+
21
+ def docker_hub?
22
+ type == UffizziCore::Repo::DockerHub.name
23
+ end
24
+
25
+ def azure?
26
+ type == UffizziCore::Repo::Azure.name
27
+ end
28
+
29
+ def google?
30
+ type == UffizziCore::Repo::Google.name
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore::Rbac::UserAccessService
4
+ class << self
5
+ def admin_access_to_account?(_user, _account)
6
+ true
7
+ end
8
+
9
+ def developer_access_to_account?(_user, _account)
10
+ true
11
+ end
12
+
13
+ def viewer_access_to_account?(_user, _account)
14
+ true
15
+ end
16
+
17
+ def admin_or_developer_access_to_account?(_user, _account)
18
+ true
19
+ end
20
+
21
+ def any_access_to_account?(_user, _account)
22
+ true
23
+ end
24
+
25
+ def admin_access_to_project?(_user, _project)
26
+ true
27
+ end
28
+
29
+ def developer_access_to_project?(_user, _project)
30
+ true
31
+ end
32
+
33
+ def viewer_access_to_project?(_user, _project)
34
+ true
35
+ end
36
+
37
+ def admin_or_developer_access_to_project?(_user, _project)
38
+ true
39
+ end
40
+
41
+ def any_access_to_project?(_user, _project)
42
+ true
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore
4
+ class ApplicationMailer < ActionMailer::Base
5
+ default from: 'from@example.com'
6
+ layout 'mailer'
7
+ end
8
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore::HashidConcern
4
+ extend ActiveSupport::Concern
5
+
6
+ class_methods do
7
+ def hashid_service
8
+ @hashid_service ||= Hashids.new("#{Rails.application.secrets.secret_key_base}-#{name}")
9
+ end
10
+
11
+ def find_by_hashid(hashid)
12
+ id = hashid_service.decode(hashid.to_s).first
13
+ find_by(id: id)
14
+ end
15
+
16
+ def find_by_hashid!(hashid)
17
+ id = hashid_service.decode(hashid.to_s).first
18
+ find(id)
19
+ end
20
+ end
21
+
22
+ def hashid
23
+ self.class.hashid_service.encode(id)
24
+ end
25
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore::StateMachineConcern
4
+ extend ActiveSupport::Concern
5
+
6
+ class_methods do
7
+ def aasm(attribute, *args)
8
+ attr_accessor(:"#{attribute}_event")
9
+
10
+ define_method("#{attribute}_event=") do |value|
11
+ send(value)
12
+ end
13
+ super(attribute, *args)
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Account < UffizziCore::ApplicationRecord
4
+ include AASM
5
+ include UffizziCore::StateMachineConcern
6
+ extend Enumerize
7
+
8
+ self.table_name = UffizziCore.table_names[:accounts]
9
+
10
+ enumerize :kind, in: [:personal, :organizational], scope: true, predicates: true
11
+ validates :kind, presence: true
12
+ validates :domain, uniqueness: true, if: :domain
13
+
14
+ belongs_to :owner, class_name: UffizziCore::User.name, foreign_key: :owner_id
15
+
16
+ has_many :memberships, dependent: :destroy
17
+ has_many :users, through: :memberships
18
+ has_many :credentials, dependent: :destroy
19
+
20
+ has_many :projects, dependent: :destroy
21
+ has_many :deployments, through: :projects
22
+ has_many :payments, dependent: :destroy
23
+ has_many :invitations, as: :entityable
24
+
25
+ aasm(:state) do
26
+ state :active, initial: true
27
+ state :payment_issue
28
+ state :disabled
29
+ state :draft
30
+
31
+ # next states should be removed after migration
32
+ state :trial
33
+ state :trial_expired
34
+ state :past_due
35
+
36
+ event :activate do
37
+ transitions from: [:payment_issue, :disabled, :trial, :trial_expired, :past_due, :draft], to: :active
38
+ end
39
+
40
+ event :raise_payment_issue, before_success: :update_payment_issue_date do
41
+ transitions from: [:active, :trial, :trial_expired, :past_due, :disabled], to: :payment_issue
42
+ end
43
+
44
+ event :disable, after: :disable_projects do
45
+ transitions from: [:active, :trial, :trial_expired, :past_due, :payment_issue], to: :disabled
46
+ end
47
+ end
48
+
49
+ aasm(:sso_state) do
50
+ state :connection_not_configured, initial: true
51
+ state :connection_disabled
52
+ state :connection_active
53
+
54
+ event :activate_connection do
55
+ transitions from: [:connection_not_configured, :connection_disabled], to: :connection_active
56
+ end
57
+
58
+ event :deactivate_connection do
59
+ transitions from: [:connection_active], to: :connection_disabled
60
+ end
61
+
62
+ event :reset_connection do
63
+ transitions from: [:connection_active, :connection_disabled], to: :connection_not_configured
64
+ end
65
+ end
66
+
67
+ def update_payment_issue_date
68
+ update(payment_issue_at: DateTime.current)
69
+ end
70
+
71
+ def active_projects
72
+ projects.active
73
+ end
74
+
75
+ def disable_projects
76
+ active_projects.each(&:disable_deployments)
77
+ end
78
+
79
+ # This method is deprecated. Don't use it.
80
+ def user
81
+ users.find_by(memberships: { role: UffizziCore::Membership.role.admin })
82
+ end
83
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::ActivityItem::Docker < UffizziCore::ActivityItem
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::ActivityItem::Github < UffizziCore::ActivityItem
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::ActivityItem::MemoryLimit < UffizziCore::ActivityItem
4
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @model
4
+ #
5
+ # @property id [integer]
6
+ # @property namespace [string]
7
+ # @property name(required) [string]
8
+ # @property tag [string]
9
+ # @property branch [string]
10
+ # @property type [string]
11
+ # @property container_id [string]
12
+ # @property commit [string]
13
+ # @property commit_message [string]
14
+ # @property build_id [integer]
15
+ # @property created_at [date]
16
+ # @property updated_at [date]
17
+ # @property data [object]
18
+ # @property digest [string]
19
+ # @property meta [object]
20
+
21
+ class UffizziCore::ActivityItem < UffizziCore::ApplicationRecord
22
+ include UffizziCore::ActivityItemRepo
23
+
24
+ self.table_name = UffizziCore.table_names[:activity_items]
25
+
26
+ belongs_to :deployment
27
+ belongs_to :container
28
+ belongs_to :build, optional: true
29
+
30
+ has_many :events, dependent: :destroy
31
+
32
+ scope :docker, -> {
33
+ where(type: UffizziCore::ActivityItem::Docker.name)
34
+ }
35
+
36
+ scope :github, -> {
37
+ where(type: UffizziCore::ActivityItem::Github.name)
38
+ }
39
+
40
+ def docker?
41
+ type == UffizziCore::ActivityItem::Docker.name
42
+ end
43
+
44
+ def image
45
+ [namespace, name].compact.join('/')
46
+ end
47
+
48
+ def full_image
49
+ return "#{image}:#{tag}" if docker?
50
+
51
+ ''
52
+ end
53
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module UffizziCore
4
+ class ApplicationRecord < ActiveRecord::Base
5
+ self.abstract_class = true
6
+ end
7
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Build < UffizziCore::ApplicationRecord
4
+ include UffizziCore::BuildRepo
5
+
6
+ self.table_name = UffizziCore.table_names[:builds]
7
+
8
+ BUILDING = 1
9
+ SUCCESS = 2
10
+ FAILED = 3
11
+ TIMEOUT = 4
12
+ CANCELLED = 5
13
+
14
+ belongs_to :repo
15
+
16
+ def successful?
17
+ status == SUCCESS
18
+ end
19
+
20
+ def unsuccessful?
21
+ [FAILED, TIMEOUT, CANCELLED].include?(status)
22
+ end
23
+
24
+ def failed?
25
+ status == FAILED
26
+ end
27
+
28
+ def building?
29
+ status == BUILDING
30
+ end
31
+
32
+ def timed_out?
33
+ status == TIMEOUT
34
+ end
35
+
36
+ def cancelled?
37
+ status == CANCELLED
38
+ end
39
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Comment < UffizziCore::ApplicationRecord
4
+ include UffizziCore::CommentRepo
5
+
6
+ self.table_name = UffizziCore.table_names[:comments]
7
+
8
+ has_ancestry(cache_depth: true)
9
+ MAX_DEPTH_LEVEL = 1
10
+
11
+ belongs_to :user
12
+ belongs_to :commentable, polymorphic: true
13
+
14
+ validates :content, length: { maximum: 1500 }, presence: true
15
+ validates :ancestry_depth, numericality: { less_than_or_equal_to: MAX_DEPTH_LEVEL, only_integer: true }
16
+ end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @model ComposeFile
4
+ # @property id [integer]
5
+ # @property source [string]
6
+ # @property path [string]
7
+ # @property content(required) [string]
8
+ # @property auto_deploy [boolean]
9
+ # @property state [string]
10
+ # @property payload [string]
11
+
12
+ class UffizziCore::ComposeFile < UffizziCore::ApplicationRecord
13
+ include UffizziCore::ComposeFileRepo
14
+ include AASM
15
+ extend Enumerize
16
+
17
+ self.table_name = UffizziCore.table_names[:compose_files]
18
+
19
+ belongs_to :project
20
+ belongs_to :added_by, class_name: UffizziCore::User.name, foreign_key: :added_by_id, optional: true
21
+
22
+ has_one :template, dependent: :destroy
23
+ has_many :config_files, dependent: :destroy
24
+ has_many :deployments, dependent: :nullify
25
+
26
+ enumerize :kind, in: [:main, :temporary], predicates: true, scope: :shallow, default: :main
27
+
28
+ validates :project, uniqueness: { scope: :project }, if: -> { kind.main? }
29
+ validates :source, presence: true
30
+ validates :source, uniqueness: { scope: :project }, if: -> { kind.main? }
31
+
32
+ aasm(:auto_deploy) do
33
+ state :disabled, initial: true
34
+ state :enabled
35
+
36
+ event :enable do
37
+ transitions from: [:disabled], to: :enabled
38
+ end
39
+
40
+ event :disable do
41
+ transitions from: [:enabled], to: :disabled
42
+ end
43
+ end
44
+
45
+ aasm(:state) do
46
+ state :valid_file, initial: true
47
+ state :invalid_file
48
+
49
+ event :set_valid do
50
+ transitions from: [:invalid_file], to: :valid_file
51
+ end
52
+
53
+ event :set_invalid do
54
+ transitions from: [:valid_file], to: :invalid_file
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @model
4
+ #
5
+ # @property filename [string]
6
+ # @property kind [string]
7
+ # @property payload [string]
8
+ # @property source [string]
9
+
10
+ class UffizziCore::ConfigFile < UffizziCore::ApplicationRecord
11
+ include UffizziCore::ConfigFileRepo
12
+ extend Enumerize
13
+
14
+ self.table_name = UffizziCore.table_names[:config_files]
15
+
16
+ belongs_to :project
17
+ belongs_to :added_by, class_name: UffizziCore::User.name, foreign_key: :added_by_id, optional: true
18
+ belongs_to :compose_file, optional: true
19
+
20
+ has_many :container_config_files, dependent: :destroy
21
+
22
+ enumerize :kind, in: [:config_map, :secret], default: :config_map, predicates: true
23
+ enumerize :creation_source, in: [:manual, :compose_file, :system], predicates: true, scope: true
24
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @model Container
4
+ #
5
+ # @property id [integer]
6
+ # @property name [string]
7
+ # @property memory_limit [integer]
8
+ # @property memory_request [integer]
9
+ # @property continuously_deploy [string]
10
+ # @property variables [object]
11
+ # @property secret_variables [object]
12
+ # @property container_config_files [ConfigFile]
13
+
14
+ class UffizziCore::Container < UffizziCore::ApplicationRecord
15
+ include UffizziCore::ContainerRepo
16
+ include AASM
17
+ include UffizziCore::StateMachineConcern
18
+ extend Enumerize
19
+
20
+ self.table_name = UffizziCore.table_names[:containers]
21
+
22
+ enumerize :kind, in: [:internal, :user], predicates: true
23
+
24
+ belongs_to :deployment, touch: true
25
+ belongs_to :repo, optional: true
26
+
27
+ has_many :activity_items, dependent: :destroy
28
+ has_many :container_config_files, dependent: :destroy
29
+ has_many :config_files, through: :container_config_files
30
+
31
+ attribute :public, :boolean, default: false
32
+ attribute :port, :integer, default: nil
33
+
34
+ enumerize :source, in: [:github], skip_validations: true
35
+ validates :port,
36
+ presence: true,
37
+ inclusion: { in: 0..65_535 },
38
+ uniqueness: { scope: :deployment_id },
39
+ if: :should_check_port
40
+
41
+ after_commit :check_target_port, on: :create
42
+
43
+ before_save :update_target_port_value, if: :will_save_change_to_port?
44
+ before_create :set_defaults
45
+
46
+ accepts_nested_attributes_for :repo
47
+ accepts_nested_attributes_for :container_config_files, allow_destroy: true
48
+
49
+ validates :variables, 'uffizzi_core/environment_variable_list': true, allow_nil: true
50
+ validates :secret_variables, 'uffizzi_core/environment_variable_list': true, allow_nil: true
51
+ validates :entrypoint, 'uffizzi_core/image_command_args': true, allow_nil: true
52
+ validates :command, 'uffizzi_core/image_command_args': true, allow_nil: true
53
+ validates :tag, presence: true
54
+
55
+ aasm :continuously_deploy, column: :continuously_deploy do
56
+ state :disabled, initial: true
57
+ state :enabled
58
+ end
59
+
60
+ aasm :state, column: :state do
61
+ state :active, initial: true
62
+ state :disabled
63
+
64
+ event :activate do
65
+ transitions from: [:disabled], to: :active
66
+ end
67
+
68
+ event :disable, after: :clean do
69
+ transitions from: [:active], to: :disabled
70
+ end
71
+ end
72
+
73
+ def image_name
74
+ "#{image}:#{tag}"
75
+ end
76
+
77
+ private
78
+
79
+ def should_check_port
80
+ public && active?
81
+ end
82
+
83
+ def clean
84
+ update(public: false, port: nil)
85
+ end
86
+
87
+ def set_defaults
88
+ update_target_port_value
89
+ end
90
+
91
+ def update_target_port_value
92
+ self.target_port = UffizziCore::ContainerService.target_port_value(self)
93
+ end
94
+
95
+ def check_target_port
96
+ if target_port && deployment.containers.where(target_port: target_port).size > 1
97
+ update(target_port: UffizziCore::DeploymentService.find_unused_port(deployment))
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::ContainerConfigFile < UffizziCore::ApplicationRecord
4
+ self.table_name = UffizziCore.table_names[:container_config_files]
5
+
6
+ belongs_to :container
7
+ belongs_to :config_file
8
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::ContinuousPreview < UffizziCore::ApplicationRecord
4
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Coupon < UffizziCore::ApplicationRecord
4
+ self.table_name = UffizziCore.table_names[:coupons]
5
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Credential::Amazon < UffizziCore::Credential
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Credential::Azure < UffizziCore::Credential
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Credential::DockerHub < UffizziCore::Credential
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Credential::Github < UffizziCore::Credential
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Credential::GithubContainerRegistry < UffizziCore::Credential
4
+ end