uffizzi_core 0.1.3

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 (240) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +201 -0
  3. data/README.md +46 -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 +139 -0
  14. data/app/clients/uffizzi_core/github/app_client.rb +19 -0
  15. data/app/clients/uffizzi_core/github/installation_client.rb +11 -0
  16. data/app/clients/uffizzi_core/github/user_client.rb +51 -0
  17. data/app/clients/uffizzi_core/google_registry_client/request_result.rb +5 -0
  18. data/app/clients/uffizzi_core/google_registry_client.rb +42 -0
  19. data/app/contexts/uffizzi_core/base_context.rb +12 -0
  20. data/app/contexts/uffizzi_core/project_context.rb +13 -0
  21. data/app/contexts/uffizzi_core/webhooks_context.rb +9 -0
  22. data/app/controllers/concerns/uffizzi_core/auth_management.rb +23 -0
  23. data/app/controllers/concerns/uffizzi_core/authorization_concern.rb +38 -0
  24. data/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb +19 -0
  25. data/app/controllers/uffizzi_core/api/cli/v1/account/application_controller.rb +7 -0
  26. data/app/controllers/uffizzi_core/api/cli/v1/account/credentials_controller.rb +55 -0
  27. data/app/controllers/uffizzi_core/api/cli/v1/application_controller.rb +5 -0
  28. data/app/controllers/uffizzi_core/api/cli/v1/projects/application_controller.rb +11 -0
  29. data/app/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller.rb +93 -0
  30. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/activity_items_controller.rb +36 -0
  31. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/application_controller.rb +7 -0
  32. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/application_controller.rb +8 -0
  33. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers/logs_controller.rb +27 -0
  34. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/containers_controller.rb +24 -0
  35. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/events_controller.rb +29 -0
  36. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb +148 -0
  37. data/app/controllers/uffizzi_core/api/cli/v1/projects/secrets_controller.rb +69 -0
  38. data/app/controllers/uffizzi_core/api/cli/v1/projects_controller.rb +19 -0
  39. data/app/controllers/uffizzi_core/api/cli/v1/sessions_controller.rb +43 -0
  40. data/app/controllers/uffizzi_core/application_controller.rb +51 -0
  41. data/app/errors/uffizzi_core/compose_file/build_error.rb +4 -0
  42. data/app/errors/uffizzi_core/compose_file/credential_error.rb +4 -0
  43. data/app/errors/uffizzi_core/compose_file/not_found_error.rb +4 -0
  44. data/app/errors/uffizzi_core/compose_file/parse_error.rb +4 -0
  45. data/app/errors/uffizzi_core/compose_file/secrets_error.rb +4 -0
  46. data/app/errors/uffizzi_core/deployment_not_found_error.rb +10 -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 +39 -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 +91 -0
  55. data/app/forms/uffizzi_core/api/cli/v1/project/delete_secret_form.rb +27 -0
  56. data/app/forms/uffizzi_core/api/cli/v1/project/update_form.rb +40 -0
  57. data/app/forms/uffizzi_core/api/cli/v1/session_create_form.rb +29 -0
  58. data/app/forms/uffizzi_core/api/cli/v1/template/create_form.rb +65 -0
  59. data/app/forms/uffizzi_core/application_form.rb +11 -0
  60. data/app/forms/uffizzi_core/application_form_without_active_record.rb +17 -0
  61. data/app/forms/uffizzi_core/mass_assignment_control_concern.rb +22 -0
  62. data/app/helpers/uffizzi_core/application_helper.rb +6 -0
  63. data/app/jobs/uffizzi_core/account/create_credential_job.rb +10 -0
  64. data/app/jobs/uffizzi_core/activity_item/docker/update_digest_job.rb +11 -0
  65. data/app/jobs/uffizzi_core/application_job.rb +7 -0
  66. data/app/jobs/uffizzi_core/config_file/apply_job.rb +31 -0
  67. data/app/jobs/uffizzi_core/credential/docker_hub/create_webhook_job.rb +15 -0
  68. data/app/jobs/uffizzi_core/deployment/create_credential_job.rb +32 -0
  69. data/app/jobs/uffizzi_core/deployment/create_credentials_job.rb +17 -0
  70. data/app/jobs/uffizzi_core/deployment/create_job.rb +15 -0
  71. data/app/jobs/uffizzi_core/deployment/create_webhooks_job.rb +13 -0
  72. data/app/jobs/uffizzi_core/deployment/delete_credential_job.rb +13 -0
  73. data/app/jobs/uffizzi_core/deployment/delete_job.rb +11 -0
  74. data/app/jobs/uffizzi_core/deployment/deploy_containers_job.rb +27 -0
  75. data/app/jobs/uffizzi_core/deployment/manage_deploy_activity_item_job.rb +19 -0
  76. data/app/jobs/uffizzi_core/deployment/send_github_preview_message_job.rb +13 -0
  77. data/app/lib/uffizzi_core/rbac/user_access_service.rb +21 -0
  78. data/app/mailers/uffizzi_core/application_mailer.rb +8 -0
  79. data/app/models/concerns/uffizzi_core/hashid_concern.rb +25 -0
  80. data/app/models/concerns/uffizzi_core/state_machine_concern.rb +16 -0
  81. data/app/models/uffizzi_core/account.rb +101 -0
  82. data/app/models/uffizzi_core/activity_item/docker.rb +4 -0
  83. data/app/models/uffizzi_core/activity_item/github.rb +4 -0
  84. data/app/models/uffizzi_core/activity_item/memory_limit.rb +4 -0
  85. data/app/models/uffizzi_core/activity_item.rb +58 -0
  86. data/app/models/uffizzi_core/application_record.rb +7 -0
  87. data/app/models/uffizzi_core/build.rb +39 -0
  88. data/app/models/uffizzi_core/comment.rb +16 -0
  89. data/app/models/uffizzi_core/compose_file.rb +57 -0
  90. data/app/models/uffizzi_core/config_file.rb +24 -0
  91. data/app/models/uffizzi_core/container.rb +100 -0
  92. data/app/models/uffizzi_core/container_config_file.rb +8 -0
  93. data/app/models/uffizzi_core/continuous_preview.rb +4 -0
  94. data/app/models/uffizzi_core/coupon.rb +5 -0
  95. data/app/models/uffizzi_core/credential/amazon.rb +4 -0
  96. data/app/models/uffizzi_core/credential/azure.rb +4 -0
  97. data/app/models/uffizzi_core/credential/docker_hub.rb +4 -0
  98. data/app/models/uffizzi_core/credential/github.rb +4 -0
  99. data/app/models/uffizzi_core/credential/google.rb +4 -0
  100. data/app/models/uffizzi_core/credential.rb +64 -0
  101. data/app/models/uffizzi_core/database.rb +4 -0
  102. data/app/models/uffizzi_core/database_offering.rb +4 -0
  103. data/app/models/uffizzi_core/deployment.rb +77 -0
  104. data/app/models/uffizzi_core/event.rb +13 -0
  105. data/app/models/uffizzi_core/invitation.rb +27 -0
  106. data/app/models/uffizzi_core/membership.rb +16 -0
  107. data/app/models/uffizzi_core/payment.rb +11 -0
  108. data/app/models/uffizzi_core/price.rb +9 -0
  109. data/app/models/uffizzi_core/product.rb +11 -0
  110. data/app/models/uffizzi_core/project.rb +66 -0
  111. data/app/models/uffizzi_core/rating.rb +20 -0
  112. data/app/models/uffizzi_core/repo/amazon.rb +4 -0
  113. data/app/models/uffizzi_core/repo/azure.rb +4 -0
  114. data/app/models/uffizzi_core/repo/docker_hub.rb +4 -0
  115. data/app/models/uffizzi_core/repo/github.rb +4 -0
  116. data/app/models/uffizzi_core/repo/google.rb +4 -0
  117. data/app/models/uffizzi_core/repo.rb +39 -0
  118. data/app/models/uffizzi_core/role.rb +17 -0
  119. data/app/models/uffizzi_core/template.rb +19 -0
  120. data/app/models/uffizzi_core/user.rb +62 -0
  121. data/app/models/uffizzi_core/user_project.rb +14 -0
  122. data/app/policies/uffizzi_core/api/cli/v1/account/credentials_policy.rb +11 -0
  123. data/app/policies/uffizzi_core/api/cli/v1/projects/compose_files_policy.rb +15 -0
  124. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments/activity_items_policy.rb +7 -0
  125. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments/containers_policy.rb +7 -0
  126. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments/events_policy.rb +7 -0
  127. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments_policy.rb +23 -0
  128. data/app/policies/uffizzi_core/api/cli/v1/projects/secrets_policy.rb +15 -0
  129. data/app/policies/uffizzi_core/api/cli/v1/projects_policy.rb +7 -0
  130. data/app/policies/uffizzi_core/application_policy.rb +12 -0
  131. data/app/repositories/uffizzi_core/activity_item_repo.rb +9 -0
  132. data/app/repositories/uffizzi_core/basic_order_repo.rb +11 -0
  133. data/app/repositories/uffizzi_core/build_repo.rb +23 -0
  134. data/app/repositories/uffizzi_core/comment_repo.rb +11 -0
  135. data/app/repositories/uffizzi_core/compose_file_repo.rb +11 -0
  136. data/app/repositories/uffizzi_core/config_file_repo.rb +40 -0
  137. data/app/repositories/uffizzi_core/container_repo.rb +25 -0
  138. data/app/repositories/uffizzi_core/credential_repo.rb +36 -0
  139. data/app/repositories/uffizzi_core/deployment_repo.rb +23 -0
  140. data/app/repositories/uffizzi_core/event_repo.rb +9 -0
  141. data/app/repositories/uffizzi_core/membership_repo.rb +10 -0
  142. data/app/repositories/uffizzi_core/price_repo.rb +11 -0
  143. data/app/repositories/uffizzi_core/product_repo.rb +11 -0
  144. data/app/repositories/uffizzi_core/project_repo.rb +10 -0
  145. data/app/repositories/uffizzi_core/repo_repo.rb +10 -0
  146. data/app/repositories/uffizzi_core/template_repo.rb +87 -0
  147. data/app/repositories/uffizzi_core/usage_repo.rb +9 -0
  148. data/app/repositories/uffizzi_core/user_repo.rb +11 -0
  149. data/app/responders/uffizzi_core/json_responder.rb +13 -0
  150. data/app/serializers/uffizzi_core/api/cli/v1/account/credential_serializer.rb +9 -0
  151. data/app/serializers/uffizzi_core/api/cli/v1/project_serializer.rb +7 -0
  152. data/app/serializers/uffizzi_core/api/cli/v1/projects/compose_file_serializer.rb +7 -0
  153. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/container_serializer.rb +23 -0
  154. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/user_serializer.rb +11 -0
  155. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer.rb +74 -0
  156. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/activity_item_serializer.rb +24 -0
  157. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer/config_file_serializer.rb +6 -0
  158. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer/container_config_file_serializer.rb +7 -0
  159. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployments/container_serializer.rb +30 -0
  160. data/app/serializers/uffizzi_core/api/cli/v1/user_serializer/account_serializer.rb +5 -0
  161. data/app/serializers/uffizzi_core/api/cli/v1/user_serializer.rb +7 -0
  162. data/app/serializers/uffizzi_core/base_serializer.rb +7 -0
  163. data/app/serializers/uffizzi_core/controller/create_credential/credential_serializer.rb +17 -0
  164. data/app/serializers/uffizzi_core/controller/create_deployment/deployment_serializer.rb +5 -0
  165. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb +53 -0
  166. data/app/serializers/uffizzi_core/controller/deploy_containers/credential_serializer.rb +5 -0
  167. data/app/services/uffizzi_core/account_service.rb +21 -0
  168. data/app/services/uffizzi_core/activity_item_service.rb +98 -0
  169. data/app/services/uffizzi_core/amazon/credential_service.rb +31 -0
  170. data/app/services/uffizzi_core/amazon_service.rb +45 -0
  171. data/app/services/uffizzi_core/azure/credential_service.rb +18 -0
  172. data/app/services/uffizzi_core/cli/compose_file_service.rb +203 -0
  173. data/app/services/uffizzi_core/compose_file/builders/config_files_builder_service.rb +31 -0
  174. data/app/services/uffizzi_core/compose_file/builders/container_builder_service.rb +225 -0
  175. data/app/services/uffizzi_core/compose_file/builders/docker_repo_builder_service.rb +25 -0
  176. data/app/services/uffizzi_core/compose_file/builders/github_repo_builder_service.rb +59 -0
  177. data/app/services/uffizzi_core/compose_file/builders/template_builder_service.rb +45 -0
  178. data/app/services/uffizzi_core/compose_file/builders/variables_builder_service.rb +58 -0
  179. data/app/services/uffizzi_core/compose_file/config_files_service.rb +52 -0
  180. data/app/services/uffizzi_core/compose_file/config_option_service.rb +37 -0
  181. data/app/services/uffizzi_core/compose_file/configs_options_service.rb +26 -0
  182. data/app/services/uffizzi_core/compose_file/container_service.rb +64 -0
  183. data/app/services/uffizzi_core/compose_file/continuous_preview_options_service.rb +57 -0
  184. data/app/services/uffizzi_core/compose_file/dependencies_service.rb +55 -0
  185. data/app/services/uffizzi_core/compose_file/errors_service.rb +46 -0
  186. data/app/services/uffizzi_core/compose_file/github_dependencies_service.rb +38 -0
  187. data/app/services/uffizzi_core/compose_file/ingress_options_service.rb +49 -0
  188. data/app/services/uffizzi_core/compose_file/secrets_options_service.rb +28 -0
  189. data/app/services/uffizzi_core/compose_file/services_options/build_service.rb +93 -0
  190. data/app/services/uffizzi_core/compose_file/services_options/command_service.rb +18 -0
  191. data/app/services/uffizzi_core/compose_file/services_options/configs_service.rb +51 -0
  192. data/app/services/uffizzi_core/compose_file/services_options/deploy_service.rb +44 -0
  193. data/app/services/uffizzi_core/compose_file/services_options/entrypoint_service.rb +18 -0
  194. data/app/services/uffizzi_core/compose_file/services_options/env_file_service.rb +34 -0
  195. data/app/services/uffizzi_core/compose_file/services_options/environment_service.rb +20 -0
  196. data/app/services/uffizzi_core/compose_file/services_options/image_service.rb +89 -0
  197. data/app/services/uffizzi_core/compose_file/services_options/secrets_service.rb +35 -0
  198. data/app/services/uffizzi_core/compose_file/services_options_service.rb +55 -0
  199. data/app/services/uffizzi_core/compose_file/template_service.rb +55 -0
  200. data/app/services/uffizzi_core/compose_file/update_service.rb +29 -0
  201. data/app/services/uffizzi_core/compose_file/variables_service.rb +25 -0
  202. data/app/services/uffizzi_core/compose_file_service.rb +33 -0
  203. data/app/services/uffizzi_core/container_service.rb +57 -0
  204. data/app/services/uffizzi_core/controller_service.rb +80 -0
  205. data/app/services/uffizzi_core/credential_service.rb +44 -0
  206. data/app/services/uffizzi_core/deployment_service.rb +274 -0
  207. data/app/services/uffizzi_core/docker_hub/credential_service.rb +15 -0
  208. data/app/services/uffizzi_core/docker_hub_service.rb +77 -0
  209. data/app/services/uffizzi_core/github/app_service.rb +51 -0
  210. data/app/services/uffizzi_core/github/credential_service.rb +124 -0
  211. data/app/services/uffizzi_core/github/message_service.rb +20 -0
  212. data/app/services/uffizzi_core/github_service.rb +28 -0
  213. data/app/services/uffizzi_core/google/credential_service.rb +18 -0
  214. data/app/services/uffizzi_core/logs_service.rb +33 -0
  215. data/app/services/uffizzi_core/manage_activity_items_service.rb +166 -0
  216. data/app/services/uffizzi_core/project_service.rb +38 -0
  217. data/app/services/uffizzi_core/repo_service.rb +178 -0
  218. data/app/services/uffizzi_core/response_service.rb +13 -0
  219. data/app/services/uffizzi_core/template_service.rb +21 -0
  220. data/app/services/uffizzi_core/token_service.rb +19 -0
  221. data/app/services/uffizzi_core/user_access_service.rb +14 -0
  222. data/app/utils/uffizzi_core/converters.rb +33 -0
  223. data/app/validators/uffizzi_core/email_validator.rb +9 -0
  224. data/app/validators/uffizzi_core/environment_variable_list_validator.rb +15 -0
  225. data/app/validators/uffizzi_core/image_command_args_validator.rb +21 -0
  226. data/config/initializers/rswag_api.rb +15 -0
  227. data/config/initializers/rswag_ui.rb +15 -0
  228. data/config/initializers/swagger_yard.rb +17 -0
  229. data/config/locales/en.activerecord.yml +18 -0
  230. data/config/locales/en.yml +61 -0
  231. data/config/routes.rb +55 -0
  232. data/db/migrate/20220218121438_create_uffizzi_core_tables.rb +375 -0
  233. data/db/migrate/20220325113342_add_name_to_uffizzi_containers.rb +7 -0
  234. data/db/seeds.rb +16 -0
  235. data/lib/tasks/uffizzi_core_tasks.rake +14 -0
  236. data/lib/uffizzi_core/engine.rb +15 -0
  237. data/lib/uffizzi_core/version.rb +5 -0
  238. data/lib/uffizzi_core.rb +60 -0
  239. data/swagger/v1/swagger.json +1278 -0
  240. metadata +935 -0
@@ -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::Google < UffizziCore::Credential
4
+ end
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Credential < UffizziCore::ApplicationRecord
4
+ include AASM
5
+ include UffizziCore::CredentialRepo
6
+
7
+ self.table_name = UffizziCore.table_names[:credentials]
8
+
9
+ belongs_to :account
10
+
11
+ before_destroy :remove_token
12
+
13
+ validates :registry_url, presence: true
14
+
15
+ aasm :state, column: :state do
16
+ state :not_connected, initial: true
17
+ state :active
18
+ state :unauthorized
19
+
20
+ event :activate do
21
+ transitions from: [:not_connected, :unauthorized], to: :active
22
+ end
23
+
24
+ event :unauthorize do
25
+ transitions from: [:not_connected, :active], to: :unauthorized
26
+ end
27
+ end
28
+
29
+ def github?
30
+ type == UffizziCore::Credential::Github.name
31
+ end
32
+
33
+ def docker_hub?
34
+ type == UffizziCore::Credential::DockerHub.name
35
+ end
36
+
37
+ def azure?
38
+ type == UffizziCore::Credential::Azure.name
39
+ end
40
+
41
+ def google?
42
+ type == UffizziCore::Credential::Google.name
43
+ end
44
+
45
+ def amazon?
46
+ type == UffizziCore::Credential::Amazon.name
47
+ end
48
+
49
+ private
50
+
51
+ def remove_token
52
+ account.projects.find_each do |project|
53
+ project.deployments.find_each do |deployment|
54
+ containers = deployment.containers
55
+ attributes = { continuously_deploy: UffizziCore::Container::STATE_DISABLED }
56
+
57
+ containers.with_github_repo.update_all(attributes) if github?
58
+ containers.with_docker_hub_repo.update_all(attributes) if docker_hub?
59
+ end
60
+ end
61
+
62
+ UffizziCore::Credential::RemoveInstallationJob.perform_async(provider_ref) if github?
63
+ end
64
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Database < UffizziCore::ApplicationRecord
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::DatabaseOffering < UffizziCore::ApplicationRecord
4
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @model Deployment
4
+ #
5
+ # @property id [integer]
6
+ # @property project_id [integer]
7
+ # @property kind [string]
8
+ # @property state [string]
9
+ # @property preview_url [string]
10
+ # @property tag [string]
11
+ # @property branch [string]
12
+ # @property commit [string]
13
+ # @property image_id [string]
14
+ # @property created_at [date-time]
15
+ # @property updated_at [date-time]
16
+ # @property ingress_container_ready [boolean]
17
+ # @property ingress_container_state [string]
18
+ # @property creation_source [string]
19
+ # @property contaners [array]
20
+ # @property deployed_by [object]
21
+
22
+ class UffizziCore::Deployment < UffizziCore::ApplicationRecord
23
+ include AASM
24
+ include UffizziCore::StateMachineConcern
25
+ include UffizziCore::DeploymentRepo
26
+ extend Enumerize
27
+
28
+ self.table_name = UffizziCore.table_names[:deployments]
29
+
30
+ enumerize :kind, in: [:standard, :performance, :enterprise, :free], predicates: true, default: :standard
31
+
32
+ belongs_to :project, touch: true
33
+ belongs_to :deployed_by, class_name: UffizziCore::User.name, foreign_key: :deployed_by_id, optional: true
34
+ belongs_to :template, optional: true
35
+ belongs_to :compose_file, optional: true
36
+
37
+ has_many :credentials, through: :project
38
+ has_many :containers, dependent: :destroy, index_errors: true
39
+ has_many :activity_items, dependent: :destroy
40
+
41
+ has_one :ingress_container, -> { where(receive_incoming_requests: true) }, class_name: UffizziCore::Container.name
42
+
43
+ validates :kind, presence: true
44
+
45
+ enumerize :creation_source, in: [:manual, :continuous_preview, :compose_file_manual, :compose_file_continuous_preview], predicates: true,
46
+ scope: true, default: :manual
47
+
48
+ accepts_nested_attributes_for :containers, allow_destroy: true
49
+
50
+ after_destroy_commit :clean
51
+
52
+ def active_containers
53
+ containers.active
54
+ end
55
+
56
+ aasm(:state) do
57
+ state :active, initial: true
58
+ state :disabled
59
+
60
+ event :activate do
61
+ transitions from: [:disabled], to: :active
62
+ end
63
+
64
+ event :disable, after: :after_disable do
65
+ transitions from: [:active], to: :disabled
66
+ end
67
+ end
68
+
69
+ def after_disable
70
+ clean
71
+ end
72
+
73
+ def clean
74
+ active_containers.each(&:disable!)
75
+ UffizziCore::Deployment::DeleteJob.perform_async(id)
76
+ end
77
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Event < UffizziCore::ApplicationRecord
4
+ include UffizziCore::EventRepo
5
+ extend Enumerize
6
+
7
+ self.table_name = UffizziCore.table_names[:events]
8
+
9
+ enumerize :state, in: [:queued, :successful, :deployed, :failed, :building, :timeout, :cancelled, :deploying], predicates: true,
10
+ scope: true
11
+
12
+ belongs_to :activity_item, touch: true
13
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Invitation < UffizziCore::ApplicationRecord
4
+ include AASM
5
+ include UffizziCore::StateMachineConcern
6
+ extend Enumerize
7
+
8
+ self.table_name = UffizziCore.table_names[:invitations]
9
+
10
+ enumerize :role, in: [:admin, :developer, :viewer], predicates: true
11
+
12
+ belongs_to :entityable, polymorphic: true
13
+ belongs_to :invited_by, class_name: UffizziCore::User.name, foreign_key: :invited_by_id
14
+ belongs_to :invitee, class_name: UffizziCore::User.name, foreign_key: :invitee_id, optional: true
15
+
16
+ validates :email, presence: true, 'uffizzi_core/email': true
17
+ validates :token, presence: true, uniqueness: true
18
+
19
+ aasm(:status) do
20
+ state :pending, initial: true
21
+ state :accepted
22
+
23
+ event :accept do
24
+ transitions from: :pending, to: :accepted
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Membership < UffizziCore::ApplicationRecord
4
+ include UffizziCore::MembershipRepo
5
+ extend Enumerize
6
+
7
+ self.table_name = UffizziCore.table_names[:memberships]
8
+
9
+ enumerize :role, in: [:admin, :developer, :viewer], predicates: true
10
+ validates :role, presence: true
11
+
12
+ belongs_to :account
13
+ belongs_to :user
14
+
15
+ validates :role, presence: true
16
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Payment < UffizziCore::ApplicationRecord
4
+ self.table_name = UffizziCore.table_names[:payments]
5
+
6
+ belongs_to :account
7
+
8
+ scope :succeeded, -> { where(status: :succeeded) }
9
+ scope :pending, -> { where(status: :pending) }
10
+ scope :failed, -> { where(status: :failed) }
11
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Price < UffizziCore::ApplicationRecord
4
+ include UffizziCore::PriceRepo
5
+
6
+ self.table_name = UffizziCore.table_names[:prices]
7
+
8
+ belongs_to :product
9
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Product < UffizziCore::ApplicationRecord
4
+ include UffizziCore::ProductRepo
5
+
6
+ self.table_name = UffizziCore.table_names[:products]
7
+
8
+ has_one :price, dependent: :destroy
9
+
10
+ UffizziCore::Product.inheritance_column = :sti
11
+ end
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ # @model
4
+ # @property slug [string]
5
+
6
+ class UffizziCore::Project < UffizziCore::ApplicationRecord
7
+ include AASM
8
+ include UffizziCore::StateMachineConcern
9
+ include UffizziCore::ProjectRepo
10
+
11
+ self.table_name = UffizziCore.table_names[:projects]
12
+
13
+ belongs_to :account
14
+
15
+ has_many :repos
16
+ has_many :deployments, dependent: :destroy
17
+ has_many :user_projects, dependent: :destroy
18
+ has_many :users, through: :user_projects
19
+ has_many :invitations, as: :entityable
20
+ has_many :config_files, dependent: :destroy
21
+ has_many :templates, dependent: :destroy
22
+ has_many :credentials, through: :account
23
+ has_many :compose_files, dependent: :destroy
24
+
25
+ validates :name, presence: true, uniqueness: { scope: :account }
26
+ validates :secrets, 'uffizzi_core/environment_variable_list': true, allow_nil: true
27
+
28
+ aasm(:state) do
29
+ state :active, initial: true
30
+ state :disabled
31
+
32
+ event :activate do
33
+ transitions from: [:disabled], to: :active
34
+ end
35
+
36
+ event :disable, after: :after_disable do
37
+ transitions from: [:active], to: :disabled
38
+ end
39
+ end
40
+
41
+ def any_paid_deployments?
42
+ !all_deployments_free?
43
+ end
44
+
45
+ def all_deployments_free?
46
+ active_deployments.all?(&:free?)
47
+ end
48
+
49
+ def after_disable
50
+ update(name: "#{name} deleted #{DateTime.current.strftime('%H:%M:%S-%m%d%Y')}")
51
+ update(slug: "#{slug} deleted #{DateTime.current.strftime('%H:%M:%S-%m%d%Y')}")
52
+ disable_deployments
53
+ end
54
+
55
+ def active_deployments
56
+ deployments.active
57
+ end
58
+
59
+ def disable_deployments
60
+ active_deployments.each(&:disable!)
61
+ end
62
+
63
+ def compose_file
64
+ compose_files.main.first
65
+ end
66
+ end
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Rating < UffizziCore::ApplicationRecord
4
+ include AASM
5
+
6
+ self.table_name = UffizziCore.table_names[:ratings]
7
+
8
+ aasm(:state) do
9
+ state :active, initial: true
10
+ state :disabled
11
+
12
+ event :activate do
13
+ transitions from: [:disabled], to: :active
14
+ end
15
+
16
+ event :disable do
17
+ transitions from: [:active], to: :disabled
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::Amazon < UffizziCore::Repo
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::Azure < UffizziCore::Repo
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::DockerHub < UffizziCore::Repo
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::Github < UffizziCore::Repo
4
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo::Google < UffizziCore::Repo
4
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Repo < UffizziCore::ApplicationRecord
4
+ extend Enumerize
5
+ include UffizziCore::RepoRepo
6
+
7
+ self.table_name = UffizziCore.table_names[:repos]
8
+
9
+ enumerize :kind, in: [:buildpacks18, :dockerfile, :dotnet, :gatsby, :barestatic], predicates: true
10
+
11
+ belongs_to :project
12
+ has_one :container, inverse_of: :repo, dependent: :destroy
13
+ has_many :builds, dependent: :destroy
14
+
15
+ validates :dockerfile_path, presence: true, if: :dockerfile?
16
+ validates :delete_preview_after, numericality: { greater_than: 0, only_integer: true }, allow_nil: true
17
+
18
+ def github?
19
+ type == UffizziCore::Repo::Github.name
20
+ end
21
+
22
+ def docker_hub?
23
+ type == UffizziCore::Repo::DockerHub.name
24
+ end
25
+
26
+ def azure?
27
+ type == UffizziCore::Repo::Azure.name
28
+ end
29
+
30
+ def google?
31
+ type == UffizziCore::Repo::Google.name
32
+ end
33
+
34
+ def url
35
+ return unless github?
36
+
37
+ ['https://github.com', namespace, name].join('/')
38
+ end
39
+ end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Role < UffizziCore::ApplicationRecord
4
+ self.table_name = UffizziCore.table_names[:roles]
5
+
6
+ has_and_belongs_to_many :users, join_table: UffizziCore.table_names[:users_roles]
7
+
8
+ belongs_to :resource,
9
+ polymorphic: true,
10
+ optional: true
11
+
12
+ validates :resource_type,
13
+ inclusion: { in: Rolify.resource_types },
14
+ allow_nil: true
15
+
16
+ scopify
17
+ end
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ class UffizziCore::Template < UffizziCore::ApplicationRecord
4
+ include UffizziCore::TemplateRepo
5
+ extend Enumerize
6
+
7
+ self.table_name = UffizziCore.table_names[:templates]
8
+
9
+ belongs_to :added_by, class_name: UffizziCore::User.name, foreign_key: :added_by_id
10
+ belongs_to :project, touch: true
11
+ belongs_to :compose_file, optional: true
12
+
13
+ has_many :deployments, dependent: :nullify
14
+
15
+ enumerize :creation_source, in: [:manual, :compose_file, :system], predicates: true, scope: true
16
+
17
+ validates :name, presence: true
18
+ validates :name, uniqueness: { scope: :project }, if: -> { compose_file.blank? || compose_file.kind.main? }
19
+ end