uffizzi_core 0.1.3 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/app/clients/uffizzi_core/docker_hub_client.rb +2 -0
  3. data/app/clients/uffizzi_core/github_container_registry_client/request_result.rb +7 -0
  4. data/app/clients/uffizzi_core/github_container_registry_client.rb +52 -0
  5. data/app/controllers/concerns/uffizzi_core/dependency_injection_concern.rb +2 -2
  6. data/app/controllers/uffizzi_core/api/cli/v1/account/credentials_controller.rb +45 -9
  7. data/app/controllers/uffizzi_core/api/cli/v1/projects/compose_files_controller.rb +2 -2
  8. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments/application_controller.rb +1 -1
  9. data/app/controllers/uffizzi_core/api/cli/v1/projects/deployments_controller.rb +41 -10
  10. data/app/controllers/uffizzi_core/api/cli/v1/projects/secrets_controller.rb +18 -26
  11. data/app/controllers/uffizzi_core/application_controller.rb +9 -3
  12. data/app/errors/uffizzi_core/deployment/image_pull_error.rb +10 -0
  13. data/app/forms/uffizzi_core/api/cli/v1/account/credential/check_credential_form.rb +16 -0
  14. data/app/forms/uffizzi_core/api/cli/v1/account/credential/create_form.rb +1 -1
  15. data/app/forms/uffizzi_core/api/cli/v1/compose_file/check_credentials_form.rb +2 -2
  16. data/app/forms/uffizzi_core/api/cli/v1/compose_file/cli_form.rb +1 -18
  17. data/app/forms/uffizzi_core/api/cli/v1/compose_file/template_form.rb +1 -1
  18. data/app/forms/uffizzi_core/api/cli/v1/deployment/update_form.rb +90 -0
  19. data/app/forms/uffizzi_core/api/cli/v1/project/update_form.rb +1 -31
  20. data/app/forms/uffizzi_core/api/cli/v1/secret/bulk_assign_form.rb +39 -0
  21. data/app/jobs/uffizzi_core/deployment/manage_deploy_activity_item_job.rb +22 -3
  22. data/app/lib/uffizzi_core/rbac/user_access_service.rb +12 -14
  23. data/app/models/uffizzi_core/account.rb +1 -19
  24. data/app/models/uffizzi_core/activity_item.rb +1 -6
  25. data/app/models/uffizzi_core/build.rb +1 -1
  26. data/app/models/uffizzi_core/comment.rb +1 -1
  27. data/app/models/uffizzi_core/compose_file.rb +1 -1
  28. data/app/models/uffizzi_core/config_file.rb +1 -1
  29. data/app/models/uffizzi_core/container.rb +1 -1
  30. data/app/models/uffizzi_core/container_config_file.rb +1 -1
  31. data/app/models/uffizzi_core/coupon.rb +1 -1
  32. data/app/models/uffizzi_core/credential/github_container_registry.rb +4 -0
  33. data/app/models/uffizzi_core/credential.rb +3 -6
  34. data/app/models/uffizzi_core/deployment.rb +11 -2
  35. data/app/models/uffizzi_core/event.rb +1 -1
  36. data/app/models/uffizzi_core/invitation.rb +1 -1
  37. data/app/models/uffizzi_core/membership.rb +1 -1
  38. data/app/models/uffizzi_core/payment.rb +1 -1
  39. data/app/models/uffizzi_core/price.rb +1 -1
  40. data/app/models/uffizzi_core/product.rb +1 -1
  41. data/app/models/uffizzi_core/project.rb +5 -11
  42. data/app/models/uffizzi_core/rating.rb +1 -1
  43. data/app/models/uffizzi_core/repo/github_container_registry.rb +4 -0
  44. data/app/models/uffizzi_core/repo.rb +1 -11
  45. data/app/models/uffizzi_core/role.rb +2 -2
  46. data/app/models/uffizzi_core/secret.rb +9 -0
  47. data/app/models/uffizzi_core/template.rb +1 -1
  48. data/app/models/uffizzi_core/user.rb +1 -1
  49. data/app/models/uffizzi_core/user_project.rb +1 -1
  50. data/app/policies/uffizzi_core/api/cli/v1/account/credentials_policy.rb +8 -0
  51. data/app/policies/uffizzi_core/api/cli/v1/projects/deployments_policy.rb +4 -0
  52. data/app/repositories/uffizzi_core/credential_repo.rb +17 -22
  53. data/app/repositories/uffizzi_core/deployment_repo.rb +1 -0
  54. data/app/serializers/uffizzi_core/api/cli/v1/projects/deployment_serializer/container_serializer.rb +8 -0
  55. data/app/serializers/uffizzi_core/api/cli/v1/projects/secret_serializer.rb +5 -0
  56. data/app/serializers/uffizzi_core/controller/apply_config_file/config_file_serializer.rb +5 -0
  57. data/app/serializers/uffizzi_core/controller/create_credential/credential_serializer.rb +7 -3
  58. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer/config_file_serializer.rb +8 -0
  59. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer/container_config_file_serializer.rb +7 -0
  60. data/app/serializers/uffizzi_core/controller/deploy_containers/container_serializer.rb +4 -3
  61. data/app/services/uffizzi_core/activity_item_service.rb +16 -26
  62. data/app/services/uffizzi_core/compose_file/builders/container_builder_service.rb +11 -18
  63. data/app/services/uffizzi_core/compose_file/container_service.rb +13 -9
  64. data/app/services/uffizzi_core/compose_file/dependencies_service.rb +1 -0
  65. data/app/services/uffizzi_core/compose_file/services_options_service.rb +2 -2
  66. data/app/services/uffizzi_core/compose_file_service.rb +148 -0
  67. data/app/services/uffizzi_core/container_service.rb +1 -16
  68. data/app/services/uffizzi_core/controller_service.rb +7 -1
  69. data/app/services/uffizzi_core/credential_service.rb +2 -2
  70. data/app/services/uffizzi_core/deployment_service.rb +28 -7
  71. data/app/services/uffizzi_core/github_container_registry/credential_service.rb +24 -0
  72. data/app/services/uffizzi_core/manage_activity_items_service.rb +4 -19
  73. data/app/services/uffizzi_core/repo_service.rb +2 -137
  74. data/app/services/uffizzi_core/user_generator_service.rb +78 -0
  75. data/config/locales/en.activerecord.yml +5 -0
  76. data/config/locales/en.yml +4 -1
  77. data/config/routes.rb +6 -2
  78. data/db/migrate/20220309110201_remove_secrets_from_projects.rb +7 -0
  79. data/db/migrate/20220310110150_create_project_secrets.rb +14 -0
  80. data/db/migrate/20220329123323_rename_project_secrets_to_secrets.rb +7 -0
  81. data/db/migrate/20220329124542_add_resource_to_secrets.rb +7 -0
  82. data/db/migrate/20220329143241_remove_project_ref_from_secrets.rb +7 -0
  83. data/lib/tasks/uffizzi_core_tasks.rake +5 -0
  84. data/lib/uffizzi_core/engine.rb +35 -0
  85. data/lib/uffizzi_core/version.rb +1 -1
  86. data/lib/uffizzi_core.rb +1 -30
  87. data/swagger/v1/swagger.json +220 -11
  88. metadata +45 -25
  89. data/app/clients/uffizzi_core/github/app_client.rb +0 -19
  90. data/app/clients/uffizzi_core/github/installation_client.rb +0 -11
  91. data/app/clients/uffizzi_core/github/user_client.rb +0 -51
  92. data/app/errors/uffizzi_core/compose_file/not_found_error.rb +0 -4
  93. data/app/forms/uffizzi_core/api/cli/v1/project/delete_secret_form.rb +0 -27
  94. data/app/jobs/uffizzi_core/deployment/send_github_preview_message_job.rb +0 -13
  95. data/app/services/uffizzi_core/cli/compose_file_service.rb +0 -203
  96. data/app/services/uffizzi_core/compose_file/builders/github_repo_builder_service.rb +0 -59
  97. data/app/services/uffizzi_core/compose_file/services_options/build_service.rb +0 -93
  98. data/app/services/uffizzi_core/compose_file/update_service.rb +0 -29
  99. data/app/services/uffizzi_core/github/app_service.rb +0 -51
  100. data/app/services/uffizzi_core/github/credential_service.rb +0 -124
  101. data/app/services/uffizzi_core/github/message_service.rb +0 -20
  102. data/app/services/uffizzi_core/github_service.rb +0 -28
  103. data/app/services/uffizzi_core/user_access_service.rb +0 -14
@@ -1,203 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::Cli::ComposeFileService
4
- class << self
5
- def create(params, kind)
6
- compose_file_form = create_compose_form(params, kind)
7
-
8
- process_compose_file(compose_file_form, params)
9
- end
10
-
11
- def update(compose_file, params)
12
- compose_file_form = create_update_compose_form(compose_file, params)
13
-
14
- process_compose_file(compose_file_form, params)
15
- end
16
-
17
- def parse(compose_content, compose_payload = {})
18
- compose_data = load_compose_data(compose_content)
19
- check_config_options_format(compose_data)
20
- configs_data = UffizziCore::ComposeFile::ConfigsOptionsService.parse(compose_data['configs'])
21
- secrets_data = UffizziCore::ComposeFile::SecretsOptionsService.parse(compose_data['secrets'])
22
- containers_data = UffizziCore::ComposeFile::ServicesOptionsService.parse(compose_data['services'], configs_data, secrets_data,
23
- compose_payload)
24
-
25
- continuous_preview_option = UffizziCore::ComposeFile::ConfigOptionService.continuous_preview_option(compose_data)
26
- continuous_preview_data = UffizziCore::ComposeFile::ContinuousPreviewOptionsService.parse(continuous_preview_option)
27
-
28
- ingress_option = UffizziCore::ComposeFile::ConfigOptionService.ingress_option(compose_data)
29
- ingress_data = UffizziCore::ComposeFile::IngressOptionsService.parse(ingress_option, compose_data['services'])
30
-
31
- {
32
- containers: containers_data,
33
- ingress: ingress_data,
34
- continuous_preview: continuous_preview_data,
35
- }
36
- end
37
-
38
- def load_repositories(compose_data, credential)
39
- containers = github_containers(compose_data)
40
- return [] if containers.empty?
41
-
42
- search_query = 'fork:true '
43
- search_query += containers.reduce('') do |query, container|
44
- query += "repo:#{credential.username}/#{container[:build][:repository_name]} "
45
- query
46
- end
47
-
48
- UffizziCore::Github::CredentialService.search_repositories(credential, search_query)
49
- end
50
-
51
- def check_github_branches(compose_data, repositories, credential)
52
- containers = github_containers_with_branches(compose_data)
53
- return [] if containers.empty?
54
-
55
- containers.map do |container|
56
- repository = repositories.detect { |item| item[:clone_url].to_s.start_with?(container[:build][:repository_url]) }
57
- error_message = I18n.t('compose.repository_not_found', repository_url: container[:build][:repository_url])
58
- raise UffizziCore::ComposeFile::NotFoundError, error_message if repository.nil?
59
-
60
- branch = begin
61
- UffizziCore::Github::CredentialService.branch(credential, repository[:id], container[:build][:branch])
62
- rescue Octokit::NotFound
63
- nil
64
- end
65
-
66
- error_message = I18n.t('compose.invalid_branch', branch: container[:build][:branch],
67
- repository_url: container[:build][:repository_url])
68
- raise UffizziCore::ComposeFile::NotFoundError, error_message if branch.nil?
69
- end
70
- end
71
-
72
- def build_template_attributes(compose_data, source, credentials, project, compose_dependencies = [], compose_repositories = [])
73
- builder = UffizziCore::ComposeFile::Builders::TemplateBuilderService.new(credentials, project, compose_repositories)
74
-
75
- builder.build_attributes(compose_data, compose_dependencies, source)
76
- end
77
-
78
- def containers_credentials(compose_data, credentials)
79
- containers = compose_data[:containers]
80
- detected_credentials = containers.map do |container|
81
- UffizziCore::ComposeFile::ContainerService.credential_for_container(container, credentials)
82
- end
83
-
84
- result = []
85
- detected_credentials.compact
86
- .group_by { |credential| credential[:id] }
87
- .each_pair { |_id, value| result << value.first }
88
- result
89
- end
90
-
91
- private
92
-
93
- def process_compose_file(compose_file_form, params)
94
- credential = compose_file_form.project.account.credentials.github.last
95
- cli_form = create_cli_form(compose_file_form.content, credential)
96
- return [compose_file_form, cli_form.errors] if cli_form.invalid?
97
-
98
- dependencies = params[:dependencies].to_a
99
- compose_data = cli_form.compose_data
100
- compose_dependencies = build_compose_dependecies(compose_data, compose_file_form.path, dependencies)
101
- cli_form.compose_dependencies = compose_dependencies
102
-
103
- persist!(compose_file_form, cli_form)
104
- end
105
-
106
- def create_compose_form(params, kind)
107
- compose_file_params = params[:compose_file_params]
108
- compose_file_form = UffizziCore::Api::Cli::V1::ComposeFile::CreateForm.new(compose_file_params)
109
- compose_file_form.project = params[:project]
110
- compose_file_form.added_by = params[:user]
111
- compose_file_form.content = compose_file_params[:content]
112
- compose_file_form.kind = kind
113
- payload_dependencies = prepare_compose_file_dependencies(params[:dependencies])
114
- compose_file_form.payload['dependencies'] = payload_dependencies
115
-
116
- compose_file_form
117
- end
118
-
119
- def create_update_compose_form(compose_file, params)
120
- compose_file_form = compose_file.becomes(UffizziCore::Api::Cli::V1::ComposeFile::UpdateForm)
121
- compose_file_params = params[:compose_file_params]
122
- compose_file_form.assign_attributes(compose_file_params)
123
- payload_dependencies = prepare_compose_file_dependencies(params[:dependencies])
124
- compose_file_form.payload['dependencies'] = payload_dependencies
125
-
126
- compose_file_form
127
- end
128
-
129
- def create_cli_form(content, credential)
130
- cli_form = UffizziCore::Api::Cli::V1::ComposeFile::CliForm.new
131
- cli_form.content = content
132
- cli_form.credential = credential
133
-
134
- cli_form
135
- end
136
-
137
- def build_compose_dependecies(compose_data, compose_path, dependencies)
138
- return [] if dependencies.empty?
139
-
140
- UffizziCore::ComposeFile::DependenciesService.build_dependencies(compose_data, compose_path, dependencies)
141
- end
142
-
143
- def prepare_compose_file_dependencies(compose_dependencies)
144
- compose_dependencies.map do |dependency|
145
- {
146
- path: dependency[:path],
147
- }
148
- end
149
- end
150
-
151
- def persist!(compose_file_form, cli_form)
152
- errors = []
153
- ActiveRecord::Base.transaction do
154
- if !compose_file_form.save
155
- errors = compose_file_form.errors
156
- raise ActiveRecord::Rollback
157
- end
158
-
159
- config_files_service = UffizziCore::ComposeFile::ConfigFilesService.new(compose_file_form)
160
- errors = config_files_service.create_config_files(cli_form.compose_dependencies)
161
- raise ActiveRecord::Rollback if errors.present?
162
-
163
- project = compose_file_form.project
164
- user = compose_file_form.added_by
165
- template_service = UffizziCore::ComposeFile::TemplateService.new(cli_form, project, user)
166
- errors = template_service.create_template(compose_file_form)
167
-
168
- raise ActiveRecord::Rollback if errors.present?
169
- end
170
- [compose_file_form, errors]
171
- end
172
-
173
- def load_compose_data(compose_content)
174
- begin
175
- compose_data = YAML.safe_load(compose_content)
176
- rescue Psych::SyntaxError
177
- raise UffizziCore::ComposeFile::ParseError, 'Invalid compose file'
178
- end
179
-
180
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.unsupported_file') if compose_data.nil?
181
-
182
- compose_data
183
- end
184
-
185
- def check_config_options_format(compose_data)
186
- options = UffizziCore::ComposeFile::ConfigOptionService.config_options(compose_data)
187
-
188
- options.each do |option|
189
- next if UffizziCore::ComposeFile::ConfigOptionService.valid_option_format?(option)
190
-
191
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.invalid_config_option', value: option)
192
- end
193
- end
194
-
195
- def github_containers(compose_data)
196
- compose_data[:containers].select { |container| UffizziCore::ComposeFile::ContainerService.github?(container) }
197
- end
198
-
199
- def github_containers_with_branches(compose_data)
200
- github_containers(compose_data).reject { |container| container[:build][:branch].nil? }
201
- end
202
- end
203
- end
@@ -1,59 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::ComposeFile::Builders::GithubRepoBuilderService
4
- attr_accessor :repositories
5
-
6
- def initialize(repositories)
7
- @repositories = repositories
8
- end
9
-
10
- def build_attributes(build_data)
11
- repository_data = repository(build_data[:repository_name])
12
-
13
- {
14
- kind: repository_kind(build_data),
15
- name: build_data[:repository_name],
16
- slug: build_data[:repository_name],
17
- type: UffizziCore::Repo::Github.name,
18
- branch: branch(build_data, repository_data),
19
- namespace: build_data[:account_name],
20
- is_private: nil,
21
- description: repository_data[:description],
22
- repository_id: repository_data[:id],
23
- dockerfile_path: build_data[:dockerfile],
24
- dockerfile_context_path: build_data[:dockerfile_context_path],
25
- args: args(build_data),
26
- }
27
- end
28
-
29
- private
30
-
31
- def branch(build_data, repository_data)
32
- build_data[:branch] || repository_data[:default_branch]
33
- end
34
-
35
- def repository(name)
36
- repo = repositories.detect { |repository| repository.name.downcase == name.downcase }
37
-
38
- raise UffizziCore::ComposeFile::BuildError, I18n.t('compose.repo_not_found', name: name) if repo.nil?
39
-
40
- repo
41
- end
42
-
43
- def repository_kind(build_data)
44
- if build_data[:dockerfile].present?
45
- UffizziCore::Repo.kind.dockerfile
46
- else
47
- UffizziCore::Repo.kind.barestatic
48
- end
49
- end
50
-
51
- def args(build_data)
52
- build_data[:args].map do |arg|
53
- {
54
- name: arg[:name],
55
- value: arg[:value],
56
- }
57
- end
58
- end
59
- end
@@ -1,93 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::ComposeFile::ServicesOptions::BuildService
4
- extend UffizziCore::ComposeFile::VariablesService
5
-
6
- class << self
7
- def parse(build_data, compose_payload)
8
- return {} if build_data.blank?
9
-
10
- args = parse_args(build_data)
11
-
12
- repository_url, branch, dockerfile_context_path = parse_context(build_data, compose_payload)
13
- repository_parts = repository_url.split('/').last(2)
14
- account_name = repository_parts.first
15
- repository_name = repository_parts.last
16
- dockerfile = build_data['dockerfile'].blank? ? ::Settings.compose.dockerfile_default_path : build_data['dockerfile']
17
-
18
- {
19
- repository_url: repository_url,
20
- account_name: account_name,
21
- repository_name: repository_name,
22
- branch: branch,
23
- dockerfile: dockerfile,
24
- dockerfile_context_path: dockerfile_context_path,
25
- args: args,
26
- }
27
- end
28
-
29
- private
30
-
31
- def parse_args(build_data)
32
- args = build_data['args']
33
- return [] if args.nil?
34
-
35
- case args
36
- when Array
37
- args.map { |arg| parse_variable_from_string(arg) }
38
- when Hash
39
- args.to_a.map { |arg| parse_variable_from_array(arg) }
40
- else
41
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.invalid_type', option: :args)
42
- end
43
- end
44
-
45
- def parse_context(build_data, compose_payload)
46
- if build_data.is_a?(String)
47
- parse_context_from_inline_syntax(build_data, compose_payload)
48
- else
49
- parse_context_from_long_syntax(build_data, compose_payload)
50
- end
51
- end
52
-
53
- def parse_repository_url_fragment(fragment)
54
- branch, dockerfile_context_path = fragment.split(':')
55
-
56
- [branch, dockerfile_context_path]
57
- end
58
-
59
- def valid_url?(url)
60
- URI(url).host.present? && URI(url).host =~ /\w+\.\w+/ && URI(url).path.present?
61
- end
62
-
63
- def parse_context_from_inline_syntax(context, compose_payload)
64
- if compose_payload[:repository_url].blank?
65
- raise UffizziCore::ComposeFile::ParseError,
66
- I18n.t('compose.build_context_unknown_repository')
67
- end
68
-
69
- repository_url = compose_payload[:repository_url]
70
- branch = compose_payload[:branch]
71
- dockerfile_context_path = UffizziCore::ComposeFile::ConfigOptionService.prepare_file_path_value(context)
72
-
73
- [repository_url, branch, dockerfile_context_path]
74
- end
75
-
76
- def parse_context_from_long_syntax(build_data, compose_payload)
77
- context = build_data['context']
78
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.build_context_no_specified') if context.blank?
79
-
80
- if valid_url?(context)
81
- uri = URI(context)
82
- repository_url = "#{uri.scheme}://#{uri.host}#{uri.path}"
83
- branch, dockerfile_context_path = parse_repository_url_fragment(uri.fragment.to_s)
84
- else
85
- repository_url, branch, dockerfile_context_path = parse_context_from_inline_syntax(context, compose_payload)
86
- end
87
-
88
- raise UffizziCore::ComposeFile::ParseError, I18n.t('compose.invalid_context', value: context) if repository_url.blank?
89
-
90
- [repository_url, branch, dockerfile_context_path]
91
- end
92
- end
93
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::ComposeFile::UpdateService
4
- def initialize(user, project)
5
- @user = user
6
- @project = project
7
- end
8
-
9
- def update(compose_file, params)
10
- compose_file_form = compose_file.becomes(ComposeFile::UpdateForm)
11
- compose_file_form.assign_attributes(params)
12
- credential = compose_file_form.project.account.credentials.github.last
13
- compose_file_github_form = ComposeFileService.create_compose_file_github_form(compose_file_form, credential)
14
-
15
- if compose_file_github_form.invalid?
16
- if compose_file_github_form.compose_content_data.present?
17
- compose_file_form.content = compose_file_github_form.compose_content_data[:content]
18
- end
19
-
20
- return [compose_file_form, compose_file_github_form.errors]
21
- end
22
-
23
- compose_file_depedencies = compose_file_github_form.compose_dependencies
24
- compose_file_form.payload['dependencies'] = ComposeFileService.prepare_compose_file_dependencies(compose_file_depedencies)
25
- compose_file_form.content = compose_file_github_form.compose_content_data[:content]
26
-
27
- ComposeFileService.persist!(compose_file_form, compose_file_github_form)
28
- end
29
- end
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::Github::AppService
4
- class << self
5
- def create_preview_message_into_pull_request(deployment)
6
- project = deployment.project
7
- credential = project.credentials.github.last
8
- return if credential.nil?
9
-
10
- pull_request_payload = deployment.continuous_preview_payload['pull_request']
11
- installation_id = credential.provider_ref
12
- message = UffizziCore::Github::MessageService.build_preview_message(deployment)
13
-
14
- create_comment(installation_id, pull_request_payload['repository_full_name'], pull_request_payload['id'], message)
15
- end
16
-
17
- private
18
-
19
- def create_comment(installation_id, repository, issue_id, message)
20
- access_token = create_installation_access_token(installation_id)
21
-
22
- installation_client = UffizziCore::Github::InstallationClient.new(access_token)
23
-
24
- installation_client.add_comment(repository, issue_id, message)
25
- end
26
-
27
- def create_installation_access_token(installation_id)
28
- access_token_response = app_client.create_app_installation_access_token(installation_id)
29
- access_token_response[:token]
30
- end
31
-
32
- def app_client
33
- UffizziCore::Github::AppClient.new(generate_jwt_token)
34
- end
35
-
36
- def generate_jwt_token
37
- rsa_armor = '-----'
38
- parts = Settings.github.private_key.split(rsa_armor)
39
- parts[2].gsub!(/\s/, "\n")
40
- private_key = OpenSSL::PKey::RSA.new(parts.join(rsa_armor))
41
-
42
- payload = {}.tap do |opts|
43
- opts[:iat] = Time.now.to_i
44
- opts[:exp] = opts[:iat] + 60
45
- opts[:iss] = Settings.github.app_id
46
- end
47
-
48
- JWT.encode(payload, private_key, 'RS256')
49
- end
50
- end
51
- end
@@ -1,124 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::Github::CredentialService
4
- class << self
5
- def repository_contains_file?(credential, repository_id, branch, path)
6
- client(credential).contents?(repository_id, ref: branch, path: path)
7
- rescue Octokit::Unauthorized
8
- Rails.logger.warn("broken credentials, repository_contains_file? credential_id=#{credential.id}")
9
- credential.unauthorize! unless credential.unauthorized?
10
- raise
11
- end
12
-
13
- def credential_correct?(credential)
14
- valid_installation?(credential)
15
- rescue Octokit::Unauthorized
16
- false
17
- end
18
-
19
- def search_repositories(credential, search_query)
20
- result = client(credential).search_repositories(search_query)
21
-
22
- result[:items]
23
- rescue Octokit::UnprocessableEntity
24
- []
25
- end
26
-
27
- def repositories(credential, query = '', page = 1)
28
- repo_attributes = {
29
- sort: :updated,
30
- page: page,
31
- }
32
-
33
- repos = client(credential).installation_repositories(credential.provider_ref, repo_attributes)
34
- filter_repos(repos, query)
35
- rescue Octokit::Unauthorized
36
- Rails.logger.warn("broken credentials, repositories credential_id=#{credential.id}")
37
- credential.unauthorize! unless credential.unauthorized?
38
- raise
39
- end
40
-
41
- def branches(credential, repository_id)
42
- client(credential).branches(repository_id)
43
- rescue Octokit::Unauthorized
44
- Rails.logger.warn("broken credentials, branches credential_id=#{credential.id}")
45
- credential.unauthorize! unless credential.unauthorized?
46
- raise
47
- end
48
-
49
- def branch(credential, repository_id, branch)
50
- client(credential).branch(repository_id, branch)
51
- rescue Octokit::Unauthorized
52
- Rails.logger.warn("broken credentials, branch credential_id=#{credential.id}")
53
- credential.unauthorize! unless credential.unauthorized?
54
- raise
55
- end
56
-
57
- def commit(credential, repository_id, commit_sha)
58
- commit = client(credential).commit(repository_id, commit_sha)
59
-
60
- {
61
- message: commit[:message],
62
- committer: commit[:committer][:name],
63
- commit: commit_sha,
64
- }
65
- rescue Octokit::Unauthorized
66
- Rails.logger.warn("broken credentials, commit credential_id=#{credential.id}")
67
- credential.unauthorize! unless credential.unauthorized?
68
- raise
69
- end
70
-
71
- def contents(credential, repository_id, options)
72
- client(credential).contents(repository_id, options)
73
- rescue Octokit::Unauthorized
74
- Rails.logger.warn("broken credentials, contents credential_id=#{credential.id}")
75
- credential.unauthorize! unless credential.unauthorized?
76
- raise
77
- end
78
-
79
- def repo(credential, repository_id)
80
- client(credential).repo(repository_id)
81
- rescue Octokit::Unauthorized
82
- Rails.logger.warn("broken credentials, repo credential_id=#{credential.id}")
83
- credential.unauthorize! unless credential.unauthorized?
84
- raise
85
- end
86
-
87
- def repo_url(credential, repository_id)
88
- repo = repo(credential, repository_id)
89
- repo[:clone_url].split(%r{https://}).last
90
- end
91
-
92
- def file_content(credential, repository_id, branch, file_path)
93
- file = contents(credential, repository_id, ref: branch, path: file_path)
94
- Base64.decode64(file[:content])
95
- rescue Octokit::Unauthorized
96
- Rails.logger.warn("broken credentials, file_content credential_id=#{credential.id}")
97
- credential.unauthorize! unless credential.unauthorized?
98
- raise
99
- end
100
-
101
- private
102
-
103
- def client(credential)
104
- UffizziCore::Github::UserClient.new(credential.password)
105
- end
106
-
107
- def valid_installation?(credential)
108
- user_installations = client(credential).user_installations
109
-
110
- installation = user_installations.detect do |user_installation|
111
- user_installation[:id].to_s == credential.provider_ref
112
- end
113
-
114
- installation.present?
115
- end
116
-
117
- def filter_repos(repos, query)
118
- return repos if query.blank?
119
-
120
- prepared_query = query.downcase
121
- repos.select { |repo| repo.full_name.downcase.include?(prepared_query) || repo.description&.downcase&.include?(prepared_query) }
122
- end
123
- end
124
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::Github::MessageService
4
- class << self
5
- def build_preview_message(deployment)
6
- preview_url = UffizziCore::DeploymentService.build_preview_url(deployment)
7
- deployment_url = UffizziCore::DeploymentService.build_deployment_url(deployment)
8
-
9
- "**This branch has been deployed using Uffizzi.**
10
-
11
- Preview URL:
12
- https://#{preview_url}
13
-
14
- View deployment details here:
15
- https://#{deployment_url}
16
-
17
- This is an automated comment. To turn off commenting, visit uffizzi.com."
18
- end
19
- end
20
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::GithubService
4
- class << self
5
- def send_preview_message(deployment)
6
- image = deployment.continuous_preview_payload['pull_request']['repository_full_name']
7
- containers = deployment.containers.where(image: image)
8
- repo = UffizziCore::Repo.find_by(id: containers.select(:repo_id))
9
-
10
- preview_message_is_enabled = !!repo.share_to_github
11
-
12
- return if !preview_message_is_enabled
13
-
14
- continuous_preview_payload = deployment.continuous_preview_payload
15
- pull_request_payload = continuous_preview_payload['pull_request']
16
- new_preview_message = UffizziCore::Github::MessageService.build_preview_message(deployment)
17
-
18
- return if new_preview_message == pull_request_payload['message']
19
-
20
- pull_request_payload['message'] = new_preview_message
21
- continuous_preview_payload['pull_request'] = pull_request_payload
22
-
23
- deployment.update(continuous_preview_payload: continuous_preview_payload)
24
-
25
- UffizziCore::Github::AppService.create_preview_message_into_pull_request(deployment)
26
- end
27
- end
28
- end
@@ -1,14 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- class UffizziCore::UserAccessService
4
- attr_accessor :user_access_module
5
-
6
- delegate :admin_access_to_account?, :developer_access_to_account?, :viewer_access_to_account?,
7
- :admin_or_developer_access_to_account?, :any_access_to_account?, :admin_access_to_project?,
8
- :developer_access_to_project?, :viewer_access_to_project?, :admin_or_developer_access_to_project?,
9
- :any_access_to_project?, :global_admin?, to: :@user_access_module
10
-
11
- def initialize(user_access_module)
12
- @user_access_module = user_access_module
13
- end
14
- end