Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
heptapod
heptapod
Commits
eb3042bf6b18
Commit
41e89139
authored
Oct 10, 2019
by
GitLab Bot
Browse files
Add latest changes from gitlab-org/gitlab@master
parent
e16f446a7a29
Changes
28
Hide whitespace changes
Inline
Side-by-side
app/controllers/concerns/render_service_results.rb
0 → 100644
View file @
eb3042bf
# frozen_string_literal: true
module
RenderServiceResults
extend
ActiveSupport
::
Concern
def
success_response
(
result
)
render
({
status:
result
[
:http_status
],
json:
result
[
:body
]
})
end
def
continue_polling_response
render
({
status: :no_content
,
json:
{
status:
_
(
'processing'
),
message:
_
(
'Not ready yet. Try again later.'
)
}
})
end
def
error_response
(
result
)
render
({
status:
result
[
:http_status
]
||
:bad_request
,
json:
{
status:
result
[
:status
],
message:
result
[
:message
]
}
})
end
end
app/controllers/projects/environments/prometheus_api_controller.rb
View file @
eb3042bf
# frozen_string_literal: true
class
Projects::Environments::PrometheusApiController
<
Projects
::
ApplicationController
include
RenderServiceResults
before_action
:authorize_read_prometheus!
before_action
:environment
...
...
@@ -12,21 +14,10 @@ def proxy
proxy_params
).
execute
if
result
.
nil?
return
render
status: :no_content
,
json:
{
status:
_
(
'processing'
),
message:
_
(
'Not ready yet. Try again later.'
)
}
end
if
result
[
:status
]
==
:success
render
status:
result
[
:http_status
],
json:
result
[
:body
]
else
render
(
status:
result
[
:http_status
]
||
:bad_request
,
json:
{
status:
result
[
:status
],
message:
result
[
:message
]
}
)
end
return
continue_polling_response
if
result
.
nil?
return
error_response
(
result
)
if
result
[
:status
]
==
:error
success_response
(
result
)
end
private
...
...
app/controllers/projects/grafana_api_controller.rb
0 → 100644
View file @
eb3042bf
# frozen_string_literal: true
class
Projects::GrafanaApiController
<
Projects
::
ApplicationController
include
RenderServiceResults
def
proxy
result
=
::
Grafana
::
ProxyService
.
new
(
project
,
params
[
:datasource_id
],
params
[
:proxy_path
],
query_params
.
to_h
).
execute
return
continue_polling_response
if
result
.
nil?
return
error_response
(
result
)
if
result
[
:status
]
==
:error
success_response
(
result
)
end
private
def
query_params
params
.
permit
(
:query
,
:start
,
:end
,
:step
)
end
end
app/controllers/projects/merge_requests/diffs_controller.rb
View file @
eb3042bf
...
...
@@ -7,7 +7,7 @@ class Projects::MergeRequests::DiffsController < Projects::MergeRequests::Applic
before_action
:apply_diff_view_cookie!
before_action
:commit
,
except: :diffs_batch
before_action
:define_diff_vars
,
except: :diffs_batch
before_action
:define_diff_comment_vars
,
except: :diffs_batch
before_action
:define_diff_comment_vars
,
except:
[
:diffs_batch
,
:diffs_metadata
]
def
show
render_diffs
...
...
@@ -37,6 +37,11 @@ def diffs_batch
render
json:
PaginatedDiffSerializer
.
new
(
current_user:
current_user
).
represent
(
diffs
,
options
)
end
def
diffs_metadata
render
json:
DiffsMetadataSerializer
.
new
(
project:
@merge_request
.
project
)
.
represent
(
@diffs
,
additional_attributes
)
end
private
def
preloadable_mr_relations
...
...
app/helpers/diff_helper.rb
View file @
eb3042bf
...
...
@@ -203,8 +203,8 @@ def toggle_whitespace_link(url, options)
link_to
"
#{
hide_whitespace?
?
'Show'
:
'Hide'
}
whitespace changes"
,
url
,
class:
options
[
:class
]
end
def
render_overflow_warning?
(
diff
_files
)
diffs
=
@merge_request_diff
.
presence
||
diff_files
def
render_overflow_warning?
(
diff
s_collection
)
diffs
=
@merge_request_diff
.
presence
||
diffs_collection
.
diff_files
diffs
.
overflow?
end
...
...
app/models/grafana_integration.rb
View file @
eb3042bf
...
...
@@ -13,4 +13,8 @@ class GrafanaIntegration < ApplicationRecord
addressable_url:
{
enforce_sanitization:
true
,
ascii_only:
true
}
validates
:token
,
:project
,
presence:
true
def
client
@client
||=
::
Grafana
::
Client
.
new
(
api_url:
grafana_url
.
chomp
(
'/'
),
token:
token
)
end
end
app/models/repository_language.rb
View file @
eb3042bf
...
...
@@ -7,7 +7,7 @@ class RepositoryLanguage < ApplicationRecord
default_scope
{
includes
(
:programming_language
)
}
validates
:project
,
presence:
true
validates
:share
,
inclusion:
{
in:
0
..
100
,
message:
"The share of a lanuage is between 0 and 100"
}
validates
:share
,
inclusion:
{
in:
0
..
100
,
message:
"The share of a lan
g
uage is between 0 and 100"
}
validates
:programming_language
,
uniqueness:
{
scope: :project_id
}
delegate
:name
,
:color
,
to: :programming_language
...
...
app/serializers/diff_file_metadata_entity.rb
0 → 100644
View file @
eb3042bf
# frozen_string_literal: true
class
DiffFileMetadataEntity
<
Grape
::
Entity
expose
:added_lines
expose
:removed_lines
expose
:new_path
expose
:old_path
expose
:new_file?
,
as: :new_file
expose
:deleted_file?
,
as: :deleted_file
end
app/serializers/diffs_entity.rb
View file @
eb3042bf
...
...
@@ -53,7 +53,7 @@ class DiffsEntity < Grape::Entity
# rubocop: enable CodeReuse/ActiveRecord
expose
:render_overflow_warning
do
|
diffs
|
render_overflow_warning?
(
diffs
.
diff_files
)
render_overflow_warning?
(
diffs
)
end
expose
:email_patch_path
,
if:
->
(
*
)
{
merge_request
}
do
|
diffs
|
...
...
app/serializers/diffs_metadata_entity.rb
0 → 100644
View file @
eb3042bf
# frozen_string_literal: true
class
DiffsMetadataEntity
<
DiffsEntity
unexpose
:diff_files
expose
:diff_files
,
using:
DiffFileMetadataEntity
end
app/serializers/diffs_metadata_serializer.rb
0 → 100644
View file @
eb3042bf
# frozen_string_literal: true
class
DiffsMetadataSerializer
<
BaseSerializer
entity
DiffsMetadataEntity
end
app/services/grafana/proxy_service.rb
0 → 100644
View file @
eb3042bf
# frozen_string_literal: true
# Proxies calls to a Grafana-integrated Prometheus instance
# through the Grafana proxy API
# This allows us to fetch and render metrics in GitLab from a Prometheus
# instance for which dashboards are configured in Grafana
module
Grafana
class
ProxyService
<
BaseService
include
ReactiveCaching
self
.
reactive_cache_key
=
->
(
service
)
{
service
.
cache_key
}
self
.
reactive_cache_lease_timeout
=
30
.
seconds
self
.
reactive_cache_refresh_interval
=
30
.
seconds
self
.
reactive_cache_worker_finder
=
->
(
_id
,
*
args
)
{
from_cache
(
*
args
)
}
attr_accessor
:project
,
:datasource_id
,
:proxy_path
,
:query_params
# @param project_id [Integer] Project id for which grafana is configured.
#
# See #initialize for other parameters.
def
self
.
from_cache
(
project_id
,
datasource_id
,
proxy_path
,
query_params
)
project
=
Project
.
find
(
project_id
)
new
(
project
,
datasource_id
,
proxy_path
,
query_params
)
end
# @param project [Project] Project for which grafana is configured.
# @param datasource_id [String] Grafana datasource id for Prometheus instance
# @param proxy_path [String] Path to Prometheus endpoint; EX) 'api/v1/query_range'
# @param query_params [Hash<String, String>] Supported params: [query, start, end, step]
def
initialize
(
project
,
datasource_id
,
proxy_path
,
query_params
)
@project
=
project
@datasource_id
=
datasource_id
@proxy_path
=
proxy_path
@query_params
=
query_params
end
def
execute
return
cannot_proxy_response
unless
client
with_reactive_cache
(
*
cache_key
)
{
|
result
|
result
}
end
def
calculate_reactive_cache
(
*
)
return
cannot_proxy_response
unless
client
response
=
client
.
proxy_datasource
(
datasource_id:
datasource_id
,
proxy_path:
proxy_path
,
query:
query_params
)
success
(
http_status:
response
.
code
,
body:
response
.
body
)
rescue
::
Grafana
::
Client
::
Error
=>
error
service_unavailable_response
(
error
)
end
# Required for ReactiveCaching; Usage overridden by
# self.reactive_cache_worker_finder
def
id
nil
end
def
cache_key
[
project
.
id
,
datasource_id
,
proxy_path
,
query_params
]
end
private
def
client
project
.
grafana_integration
&
.
client
end
def
service_unavailable_response
(
exception
)
error
(
exception
.
message
,
:service_unavailable
)
end
def
cannot_proxy_response
error
(
'Proxy support for this API is not available currently'
)
end
end
end
app/views/projects/diffs/_diffs.html.haml
View file @
eb3042bf
...
...
@@ -21,7 +21,7 @@
=
parallel_diff_btn
=
render
'projects/diffs/stats'
,
diff_files:
diff_files
-
if
render_overflow_warning?
(
diff
_file
s
)
-
if
render_overflow_warning?
(
diffs
)
=
render
'projects/diffs/warning'
,
diff_files:
diffs
.files
{
data:
{
can_create_note:
can_create_note
}
}
...
...
changelogs/unreleased/28781-migrate-pages-metadata-in-background.yml
0 → 100644
View file @
eb3042bf
---
title
:
Schedule background migration to populate pages metadata
merge_request
:
17993
author
:
type
:
added
changelogs/unreleased/feature-default-cluster-to-vpc-enabled.yml
0 → 100644
View file @
eb3042bf
---
title
:
Create clusters with VPC-Native enabled
merge_request
:
18284
author
:
type
:
changed
changelogs/unreleased/osw-diffs-metadata-endpoint.yml
0 → 100644
View file @
eb3042bf
---
title
:
Introduce a lightweight diffs_metadata endpoint
merge_request
:
18104
author
:
type
:
added
changelogs/unreleased/sy-grafana-proxy.yml
0 → 100644
View file @
eb3042bf
---
title
:
Add endpoint to proxy requests to grafana's proxy endpoint
merge_request
:
18210
author
:
type
:
added
config/routes/project.rb
View file @
eb3042bf
...
...
@@ -186,6 +186,10 @@
resource
:import
,
only:
[
:new
,
:create
,
:show
]
resource
:avatar
,
only:
[
:show
,
:destroy
]
get
'grafana/proxy/:datasource_id/*proxy_path'
,
to:
'grafana_api#proxy'
,
as: :grafana_api
end
# End of the /-/ scope.
...
...
@@ -282,6 +286,7 @@
get
:pipelines
get
:diffs
,
to:
'merge_requests/diffs#show'
get
:diffs_batch
,
to:
'merge_requests/diffs#diffs_batch'
get
:diffs_metadata
,
to:
'merge_requests/diffs#diffs_metadata'
get
:widget
,
to:
'merge_requests/content#widget'
get
:cached_widget
,
to:
'merge_requests/content#cached_widget'
end
...
...
db/post_migrate/20191002031332_schedule_pages_metadata_migration.rb
0 → 100644
View file @
eb3042bf
# frozen_string_literal: true
class
SchedulePagesMetadataMigration
<
ActiveRecord
::
Migration
[
5.2
]
include
Gitlab
::
Database
::
MigrationHelpers
DOWNTIME
=
false
BATCH_SIZE
=
10_000
MIGRATION
=
'MigratePagesMetadata'
disable_ddl_transaction!
class
Project
<
ActiveRecord
::
Base
include
::
EachBatch
self
.
table_name
=
'projects'
end
def
up
say
"Scheduling `
#{
MIGRATION
}
` jobs"
# At the time of writing there are ~10_669_292 records to be inserted for GitLab.com,
# batches of 10_000 with delay interval of 2 minutes gives us an estimate of close to 36 hours.
queue_background_migration_jobs_by_range_at_intervals
(
Project
,
MIGRATION
,
2
.
minutes
,
batch_size:
BATCH_SIZE
)
end
def
down
# no-op
end
end
lib/google_api/cloud_platform/client.rb
View file @
eb3042bf
...
...
@@ -96,6 +96,9 @@ def make_cluster_options(cluster_name, cluster_size, machine_type, legacy_abac,
legacy_abac:
{
enabled:
legacy_abac
},
ip_allocation_policy:
{
use_ip_aliases:
true
},
addons_config:
enable_addons
.
each_with_object
({})
do
|
addon
,
hash
|
hash
[
addon
]
=
{
disabled:
false
}
end
...
...
Prev
1
2
Next
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment