Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorGitLab Bot <gitlab-bot@gitlab.com>2019-11-14 06:06:25 +0300
committerGitLab Bot <gitlab-bot@gitlab.com>2019-11-14 06:06:25 +0300
commit29c01c6c91558358c37ba45b03f240632bfb918d (patch)
treec6475afaf98ce740e8ba5fe227e7bd4a95b692cd /app
parenteed996ac33a60d5fd8315a62fec8beaa8e907e69 (diff)
Add latest changes from gitlab-org/gitlab@master
Diffstat (limited to 'app')
-rw-r--r--app/assets/javascripts/ide/components/repo_editor.vue1
-rw-r--r--app/assets/javascripts/vue_shared/components/content_viewer/content_viewer.vue6
-rw-r--r--app/assets/javascripts/vue_shared/components/content_viewer/viewers/markdown_viewer.vue6
-rw-r--r--app/controllers/concerns/preview_markdown.rb22
-rw-r--r--app/models/clusters/applications/elastic_stack.rb29
-rw-r--r--app/models/clusters/concerns/application_core.rb18
-rw-r--r--app/models/environment.rb5
-rw-r--r--app/models/project.rb2
-rw-r--r--app/services/base_service.rb12
-rw-r--r--app/services/commits/change_service.rb5
-rw-r--r--app/services/commits/create_service.rb13
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,