diff options
author | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-14 06:06:25 +0300 |
---|---|---|
committer | GitLab Bot <gitlab-bot@gitlab.com> | 2019-11-14 06:06:25 +0300 |
commit | 29c01c6c91558358c37ba45b03f240632bfb918d (patch) | |
tree | c6475afaf98ce740e8ba5fe227e7bd4a95b692cd /app | |
parent | eed996ac33a60d5fd8315a62fec8beaa8e907e69 (diff) |
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r-- | app/assets/javascripts/ide/components/repo_editor.vue | 1 | ||||
-rw-r--r-- | app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue | 6 | ||||
-rw-r--r-- | app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue | 6 | ||||
-rw-r--r-- | app/controllers/concerns/preview_markdown.rb | 22 | ||||
-rw-r--r-- | app/models/clusters/applications/elastic_stack.rb | 29 | ||||
-rw-r--r-- | app/models/clusters/concerns/application_core.rb | 18 | ||||
-rw-r--r-- | app/models/environment.rb | 5 | ||||
-rw-r--r-- | app/models/project.rb | 2 | ||||
-rw-r--r-- | app/services/base_service.rb | 12 | ||||
-rw-r--r-- | app/services/commits/change_service.rb | 5 | ||||
-rw-r--r-- | app/services/commits/create_service.rb | 13 |
11 files changed, 101 insertions, 18 deletions
diff --git a/app/assets/javascripts/ide/components/repo_editor.vue b/app/assets/javascripts/ide/components/repo_editor.vue index 3bf8308ccea..08b3e8a34d6 100644 --- a/app/assets/javascripts/ide/components/repo_editor.vue +++ b/app/assets/javascripts/ide/components/repo_editor.vue @@ -301,6 +301,7 @@ export default { v-if="showContentViewer" :content="file.content || file.raw" :path="file.rawPath || file.path" + :file-path="file.path" :file-size="file.size" :project-path="file.projectId" :type="fileType" diff --git a/app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue b/app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue index 1e6f4c376c1..66155ddcdd9 100644 --- a/app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue +++ b/app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue @@ -18,6 +18,11 @@ export default { required: false, default: 0, }, + filePath: { + type: String, + required: false, + default: '', + }, projectPath: { type: String, required: false, @@ -52,6 +57,7 @@ export default { <component :is="viewer" :path="path" + :file-path="filePath" :file-size="fileSize" :project-path="projectPath" :content="content" diff --git a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue index 655f0054887..c50304f057d 100644 --- a/app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue +++ b/app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue @@ -16,6 +16,11 @@ export default { type: String, required: true, }, + filePath: { + type: String, + required: false, + default: '', + }, projectPath: { type: String, required: true, @@ -48,6 +53,7 @@ export default { this.isLoading = true; const postBody = { text: this.content, + path: this.filePath, }; const postOptions = { cancelToken: axiosSource.token, diff --git a/app/controllers/concerns/preview_markdown.rb b/app/controllers/concerns/preview_markdown.rb index 1d84ddfba97..c7c9f2e9b70 100644 --- a/app/controllers/concerns/preview_markdown.rb +++ b/app/controllers/concerns/preview_markdown.rb @@ -7,17 +7,8 @@ module PreviewMarkdown def preview_markdown result = PreviewMarkdownService.new(@project, current_user, markdown_service_params).execute - markdown_params = - case controller_name - when 'wikis' then { pipeline: :wiki, project_wiki: @project_wiki, page_slug: params[:id] } - when 'snippets' then { skip_project_check: true } - when 'groups' then { group: group } - when 'projects' then projects_filter_params - else {} - end - render json: { - body: view_context.markdown(result[:text], markdown_params), + body: view_context.markdown(result[:text], markdown_context_params), references: { users: result[:users], suggestions: SuggestionSerializer.new.represent_diff(result[:suggestions]), @@ -38,5 +29,16 @@ module PreviewMarkdown def markdown_service_params params end + + def markdown_context_params + case controller_name + when 'wikis' then { pipeline: :wiki, project_wiki: @project_wiki, page_slug: params[:id] } + when 'snippets' then { skip_project_check: true } + when 'groups' then { group: group } + when 'projects' then projects_filter_params + else {} + end.merge(requested_path: params[:path]) + end + # rubocop:enable Gitlab/ModuleWithInstanceVariables end diff --git a/app/models/clusters/applications/elastic_stack.rb b/app/models/clusters/applications/elastic_stack.rb index addf092fc5e..8589f8c00cb 100644 --- a/app/models/clusters/applications/elastic_stack.rb +++ b/app/models/clusters/applications/elastic_stack.rb @@ -5,12 +5,15 @@ module Clusters class ElasticStack < ApplicationRecord VERSION = '1.8.0' + ELASTICSEARCH_PORT = 9200 + self.table_name = 'clusters_applications_elastic_stacks' include ::Clusters::Concerns::ApplicationCore include ::Clusters::Concerns::ApplicationStatus include ::Clusters::Concerns::ApplicationVersion include ::Clusters::Concerns::ApplicationData + include ::Gitlab::Utils::StrongMemoize default_value_for :version, VERSION @@ -49,6 +52,28 @@ module Clusters ) end + def elasticsearch_client + strong_memoize(:elasticsearch_client) do + next unless kube_client + + proxy_url = kube_client.proxy_url('service', 'elastic-stack-elasticsearch-client', ::Clusters::Applications::ElasticStack::ELASTICSEARCH_PORT, Gitlab::Kubernetes::Helm::NAMESPACE) + + Elasticsearch::Client.new(url: proxy_url) do |faraday| + # ensures headers containing auth data are appended to original client options + faraday.headers.merge!(kube_client.headers) + # ensure TLS certs are properly verified + faraday.ssl[:verify] = kube_client.ssl_options[:verify_ssl] + faraday.ssl[:cert_store] = kube_client.ssl_options[:cert_store] + end + + rescue Kubeclient::HttpError => error + # If users have mistakenly set parameters or removed the depended clusters, + # `proxy_url` could raise an exception because gitlab can not communicate with the cluster. + # We check for a nil client in downstream use and behaviour is equivalent to an empty state + log_exception(error, :failed_to_create_elasticsearch_client) + end + end + private def specification @@ -74,6 +99,10 @@ module Clusters Gitlab::Kubernetes::KubectlCmd.delete("pvc", "--selector", "release=elastic-stack") ].compact end + + def kube_client + cluster&.kubeclient&.core_client + end end end end diff --git a/app/models/clusters/concerns/application_core.rb b/app/models/clusters/concerns/application_core.rb index 979cf0645f5..21b98534808 100644 --- a/app/models/clusters/concerns/application_core.rb +++ b/app/models/clusters/concerns/application_core.rb @@ -60,6 +60,24 @@ module Clusters # Override if your application needs any action after # being uninstalled by Helm end + + def logger + @logger ||= Gitlab::Kubernetes::Logger.build + end + + def log_exception(error, event) + logger.error({ + exception: error.class.name, + status_code: error.error_code, + cluster_id: cluster&.id, + application_id: id, + class_name: self.class.name, + event: event, + message: error.message + }) + + Gitlab::Sentry.track_acceptable_exception(error, extra: { cluster_id: cluster&.id, application_id: id }) + end end end end diff --git a/app/models/environment.rb b/app/models/environment.rb index 6bc244b1df4..569299ad4b4 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -12,7 +12,7 @@ class Environment < ApplicationRecord has_one :last_deployment, -> { success.order('deployments.id DESC') }, class_name: 'Deployment' has_one :last_deployable, through: :last_deployment, source: 'deployable', source_type: 'CommitStatus' has_one :last_pipeline, through: :last_deployable, source: 'pipeline' - has_one :last_visible_deployment, -> { visible.distinct_on_environment }, class_name: 'Deployment' + has_one :last_visible_deployment, -> { visible.distinct_on_environment }, inverse_of: :environment, class_name: 'Deployment' has_one :last_visible_deployable, through: :last_visible_deployment, source: 'deployable', source_type: 'CommitStatus' has_one :last_visible_pipeline, through: :last_visible_deployable, source: 'pipeline' @@ -66,6 +66,9 @@ class Environment < ApplicationRecord scope :for_project, -> (project) { where(project_id: project) } scope :with_deployment, -> (sha) { where('EXISTS (?)', Deployment.select(1).where('deployments.environment_id = environments.id').where(sha: sha)) } scope :unfoldered, -> { where(environment_type: nil) } + scope :with_rank, -> do + select('environments.*, rank() OVER (PARTITION BY project_id ORDER BY id DESC)') + end state_machine :state, initial: :available do event :start do diff --git a/app/models/project.rb b/app/models/project.rb index 8b31a7ea48b..1df2a981658 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -287,7 +287,7 @@ class Project < ApplicationRecord has_many :variables, class_name: 'Ci::Variable' has_many :triggers, class_name: 'Ci::Trigger' has_many :environments - has_many :unfoldered_environments, -> { unfoldered.available }, class_name: 'Environment' + has_many :environments_for_dashboard, -> { from(with_rank.unfoldered.available, :environments).where('rank <= 3') }, class_name: 'Environment' has_many :deployments has_many :pipeline_schedules, class_name: 'Ci::PipelineSchedule' has_many :project_deploy_tokens diff --git a/app/services/base_service.rb b/app/services/base_service.rb index c39edd5c114..bc0b968f516 100644 --- a/app/services/base_service.rb +++ b/app/services/base_service.rb @@ -50,16 +50,24 @@ class BaseService private - def error(message, http_status = nil) + # Return a Hash with an `error` status + # + # message - Error message to include in the Hash + # http_status - Optional HTTP status code override (default: nil) + # pass_back - Additional attributes to be included in the resulting Hash + def error(message, http_status = nil, pass_back: {}) result = { message: message, status: :error - } + }.reverse_merge(pass_back) result[:http_status] = http_status if http_status result end + # Return a Hash with a `success` status + # + # pass_back - Additional attributes to be included in the resulting Hash def success(pass_back = {}) pass_back[:status] = :success pass_back diff --git a/app/services/commits/change_service.rb b/app/services/commits/change_service.rb index fbf71f02837..661e654406e 100644 --- a/app/services/commits/change_service.rb +++ b/app/services/commits/change_service.rb @@ -23,14 +23,15 @@ module Commits message, start_project: @start_project, start_branch_name: @start_branch) - rescue Gitlab::Git::Repository::CreateTreeError + rescue Gitlab::Git::Repository::CreateTreeError => ex act = action.to_s.dasherize type = @commit.change_type_title(current_user) error_msg = "Sorry, we cannot #{act} this #{type} automatically. " \ "This #{type} may already have been #{act}ed, or a more recent " \ "commit may have updated some of its content." - raise ChangeError, error_msg + + raise ChangeError.new(error_msg, ex.error_code) end end end diff --git a/app/services/commits/create_service.rb b/app/services/commits/create_service.rb index b5401a8ea37..b42494563b2 100644 --- a/app/services/commits/create_service.rb +++ b/app/services/commits/create_service.rb @@ -3,7 +3,15 @@ module Commits class CreateService < ::BaseService ValidationError = Class.new(StandardError) - ChangeError = Class.new(StandardError) + class ChangeError < StandardError + attr_reader :error_code + + def initialize(message, error_code = nil) + super(message) + + @error_code = error_code + end + end def initialize(*args) super @@ -21,8 +29,9 @@ module Commits new_commit = create_commit! success(result: new_commit) + rescue ChangeError => ex + error(ex.message, pass_back: { error_code: ex.error_code }) rescue ValidationError, - ChangeError, Gitlab::Git::Index::IndexError, Gitlab::Git::CommitError, Gitlab::Git::PreReceiveError, |