Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
c3f467d2
Commit
c3f467d2
authored
Jul 08, 2019
by
GitLab Bot
Browse files
Options
Browse Files
Download
Plain Diff
Automatic merge of gitlab-org/gitlab-ce master
parents
33147147
886521c7
Changes
12
Show whitespace changes
Inline
Side-by-side
Showing
12 changed files
with
268 additions
and
254 deletions
+268
-254
app/controllers/projects/deployments_controller.rb
app/controllers/projects/deployments_controller.rb
+8
-6
app/models/deployment.rb
app/models/deployment.rb
+0
-42
app/models/deployment_metrics.rb
app/models/deployment_metrics.rb
+61
-0
app/models/environment_status.rb
app/models/environment_status.rb
+14
-4
app/serializers/environment_status_entity.rb
app/serializers/environment_status_entity.rb
+3
-3
changelogs/unreleased/63475-fix-n-1.yml
changelogs/unreleased/63475-fix-n-1.yml
+5
-0
spec/controllers/projects/deployments_controller_spec.rb
spec/controllers/projects/deployments_controller_spec.rb
+26
-48
spec/controllers/projects/merge_requests_controller_spec.rb
spec/controllers/projects/merge_requests_controller_spec.rb
+16
-0
spec/models/deployment_metrics_spec.rb
spec/models/deployment_metrics_spec.rb
+126
-0
spec/models/deployment_spec.rb
spec/models/deployment_spec.rb
+0
-147
spec/models/environment_status_spec.rb
spec/models/environment_status_spec.rb
+1
-2
spec/serializers/environment_status_entity_spec.rb
spec/serializers/environment_status_entity_spec.rb
+8
-2
No files found.
app/controllers/projects/deployments_controller.rb
View file @
c3f467d2
...
@@ -15,24 +15,22 @@ class Projects::DeploymentsController < Projects::ApplicationController
...
@@ -15,24 +15,22 @@ class Projects::DeploymentsController < Projects::ApplicationController
# rubocop: enable CodeReuse/ActiveRecord
# rubocop: enable CodeReuse/ActiveRecord
def
metrics
def
metrics
return
render_404
unless
deployment
.
has_metrics?
return
render_404
unless
deployment
_metrics
.
has_metrics?
@metrics
=
deployment
.
metrics
@metrics
=
deployment
_metrics
.
metrics
if
@metrics
&
.
any?
if
@metrics
&
.
any?
render
json:
@metrics
,
status: :ok
render
json:
@metrics
,
status: :ok
else
else
head
:no_content
head
:no_content
end
end
rescue
NotImplementedError
render_404
end
end
def
additional_metrics
def
additional_metrics
return
render_404
unless
deployment
.
has_metrics?
return
render_404
unless
deployment
_metrics
.
has_metrics?
respond_to
do
|
format
|
respond_to
do
|
format
|
format
.
json
do
format
.
json
do
metrics
=
deployment
.
additional_metrics
metrics
=
deployment
_metrics
.
additional_metrics
if
metrics
.
any?
if
metrics
.
any?
render
json:
metrics
render
json:
metrics
...
@@ -45,6 +43,10 @@ class Projects::DeploymentsController < Projects::ApplicationController
...
@@ -45,6 +43,10 @@ class Projects::DeploymentsController < Projects::ApplicationController
private
private
def
deployment_metrics
@deployment_metrics
||=
DeploymentMetrics
.
new
(
deployment
.
project
,
deployment
)
end
# rubocop: disable CodeReuse/ActiveRecord
# rubocop: disable CodeReuse/ActiveRecord
def
deployment
def
deployment
@deployment
||=
environment
.
deployments
.
find_by
(
iid:
params
[
:id
])
@deployment
||=
environment
.
deployments
.
find_by
(
iid:
params
[
:id
])
...
...
app/models/deployment.rb
View file @
c3f467d2
...
@@ -85,11 +85,6 @@ class Deployment < ApplicationRecord
...
@@ -85,11 +85,6 @@ class Deployment < ApplicationRecord
Commit
.
truncate_sha
(
sha
)
Commit
.
truncate_sha
(
sha
)
end
end
# Deprecated - will be replaced by a persisted cluster_id
def
deployment_platform_cluster
environment
.
deployment_platform
&
.
cluster
end
def
execute_hooks
def
execute_hooks
deployment_data
=
Gitlab
::
DataBuilder
::
Deployment
.
build
(
self
)
deployment_data
=
Gitlab
::
DataBuilder
::
Deployment
.
build
(
self
)
project
.
execute_services
(
deployment_data
,
:deployment_hooks
)
project
.
execute_services
(
deployment_data
,
:deployment_hooks
)
...
@@ -176,45 +171,8 @@ class Deployment < ApplicationRecord
...
@@ -176,45 +171,8 @@ class Deployment < ApplicationRecord
deployed_at
&
.
to_time
&
.
in_time_zone
&
.
to_s
(
:medium
)
deployed_at
&
.
to_time
&
.
in_time_zone
&
.
to_s
(
:medium
)
end
end
def
has_metrics?
success?
&&
prometheus_adapter
&
.
can_query?
end
def
metrics
return
{}
unless
has_metrics?
metrics
=
prometheus_adapter
.
query
(
:deployment
,
self
)
metrics
&
.
merge
(
deployment_time:
finished_at
.
to_i
)
||
{}
end
def
additional_metrics
return
{}
unless
has_metrics?
metrics
=
prometheus_adapter
.
query
(
:additional_metrics_deployment
,
self
)
metrics
&
.
merge
(
deployment_time:
finished_at
.
to_i
)
||
{}
end
private
private
def
prometheus_adapter
service
=
project
.
find_or_initialize_service
(
'prometheus'
)
if
service
.
can_query?
service
else
cluster_prometheus
end
end
# TODO remove fallback case to deployment_platform_cluster.
# Otherwise we will continue to pay the performance penalty described in
# https://gitlab.com/gitlab-org/gitlab-ce/issues/63475
def
cluster_prometheus
cluster_with_fallback
=
cluster
||
deployment_platform_cluster
cluster_with_fallback
.
application_prometheus
if
cluster_with_fallback
&
.
application_prometheus_available?
end
def
ref_path
def
ref_path
File
.
join
(
environment
.
ref_path
,
'deployments'
,
iid
.
to_s
)
File
.
join
(
environment
.
ref_path
,
'deployments'
,
iid
.
to_s
)
end
end
...
...
app/models/deployment_metrics.rb
0 → 100644
View file @
c3f467d2
# frozen_string_literal: true
class
DeploymentMetrics
include
Gitlab
::
Utils
::
StrongMemoize
attr_reader
:project
,
:deployment
delegate
:cluster
,
to: :deployment
def
initialize
(
project
,
deployment
)
@project
=
project
@deployment
=
deployment
end
def
has_metrics?
deployment
.
success?
&&
prometheus_adapter
&
.
can_query?
end
def
metrics
return
{}
unless
has_metrics?
metrics
=
prometheus_adapter
.
query
(
:deployment
,
deployment
)
metrics
&
.
merge
(
deployment_time:
deployment
.
finished_at
.
to_i
)
||
{}
end
def
additional_metrics
return
{}
unless
has_metrics?
metrics
=
prometheus_adapter
.
query
(
:additional_metrics_deployment
,
deployment
)
metrics
&
.
merge
(
deployment_time:
deployment
.
finished_at
.
to_i
)
||
{}
end
private
def
prometheus_adapter
strong_memoize
(
:prometheus_adapter
)
do
service
=
project
.
find_or_initialize_service
(
'prometheus'
)
if
service
.
can_query?
service
else
cluster_prometheus
end
end
end
# TODO remove fallback case to deployment_platform_cluster.
# Otherwise we will continue to pay the performance penalty described in
# https://gitlab.com/gitlab-org/gitlab-ce/issues/63475
#
# Removal issue: https://gitlab.com/gitlab-org/gitlab-ce/issues/64105
def
cluster_prometheus
cluster_with_fallback
=
cluster
||
deployment_platform_cluster
cluster_with_fallback
.
application_prometheus
if
cluster_with_fallback
&
.
application_prometheus_available?
end
def
deployment_platform_cluster
deployment
.
environment
.
deployment_platform
&
.
cluster
end
end
app/models/environment_status.rb
View file @
c3f467d2
...
@@ -3,11 +3,10 @@
...
@@ -3,11 +3,10 @@
class
EnvironmentStatus
class
EnvironmentStatus
include
Gitlab
::
Utils
::
StrongMemoize
include
Gitlab
::
Utils
::
StrongMemoize
attr_reader
:environment
,
:merge_request
,
:sha
attr_reader
:
project
,
:
environment
,
:merge_request
,
:sha
delegate
:id
,
to: :environment
delegate
:id
,
to: :environment
delegate
:name
,
to: :environment
delegate
:name
,
to: :environment
delegate
:project
,
to: :environment
delegate
:status
,
to: :deployment
,
allow_nil:
true
delegate
:status
,
to: :deployment
,
allow_nil:
true
delegate
:deployed_at
,
to: :deployment
,
allow_nil:
true
delegate
:deployed_at
,
to: :deployment
,
allow_nil:
true
...
@@ -21,7 +20,8 @@ class EnvironmentStatus
...
@@ -21,7 +20,8 @@ class EnvironmentStatus
build_environments_status
(
mr
,
user
,
mr
.
merge_pipeline
)
build_environments_status
(
mr
,
user
,
mr
.
merge_pipeline
)
end
end
def
initialize
(
environment
,
merge_request
,
sha
)
def
initialize
(
project
,
environment
,
merge_request
,
sha
)
@project
=
project
@environment
=
environment
@environment
=
environment
@merge_request
=
merge_request
@merge_request
=
merge_request
@sha
=
sha
@sha
=
sha
...
@@ -33,6 +33,12 @@ class EnvironmentStatus
...
@@ -33,6 +33,12 @@ class EnvironmentStatus
end
end
end
end
def
has_metrics?
strong_memoize
(
:has_metrics
)
do
deployment_metrics
.
has_metrics?
end
end
def
changes
def
changes
return
[]
if
project
.
route_map_for
(
sha
).
nil?
return
[]
if
project
.
route_map_for
(
sha
).
nil?
...
@@ -48,6 +54,10 @@ class EnvironmentStatus
...
@@ -48,6 +54,10 @@ class EnvironmentStatus
PAGE_EXTENSIONS
=
/\A\.(s?html?|php|asp|cgi|pl)\z/i
.
freeze
PAGE_EXTENSIONS
=
/\A\.(s?html?|php|asp|cgi|pl)\z/i
.
freeze
def
deployment_metrics
@deployment_metrics
||=
DeploymentMetrics
.
new
(
project
,
deployment
)
end
def
build_change
(
file
)
def
build_change
(
file
)
public_path
=
project
.
public_path_for_source_path
(
file
.
new_path
,
sha
)
public_path
=
project
.
public_path_for_source_path
(
file
.
new_path
,
sha
)
return
if
public_path
.
nil?
return
if
public_path
.
nil?
...
@@ -67,7 +77,7 @@ class EnvironmentStatus
...
@@ -67,7 +77,7 @@ class EnvironmentStatus
pipeline
.
environments
.
available
.
map
do
|
environment
|
pipeline
.
environments
.
available
.
map
do
|
environment
|
next
unless
Ability
.
allowed?
(
user
,
:read_environment
,
environment
)
next
unless
Ability
.
allowed?
(
user
,
:read_environment
,
environment
)
EnvironmentStatus
.
new
(
environment
,
mr
,
pipeline
.
sha
)
EnvironmentStatus
.
new
(
pipeline
.
project
,
environment
,
mr
,
pipeline
.
sha
)
end
.
compact
end
.
compact
end
end
private_class_method
:build_environments_status
private_class_method
:build_environments_status
...
...
app/serializers/environment_status_entity.rb
View file @
c3f467d2
...
@@ -11,7 +11,7 @@ class EnvironmentStatusEntity < Grape::Entity
...
@@ -11,7 +11,7 @@ class EnvironmentStatusEntity < Grape::Entity
project_environment_path
(
es
.
project
,
es
.
environment
)
project_environment_path
(
es
.
project
,
es
.
environment
)
end
end
expose
:metrics_url
,
if:
->
(
*
)
{
can_read_environment?
&&
deployment
.
has_metrics?
}
do
|
es
|
expose
:metrics_url
,
if:
->
(
*
)
{
can_read_environment?
&&
has_metrics?
}
do
|
es
|
metrics_project_environment_deployment_path
(
es
.
project
,
es
.
environment
,
es
.
deployment
)
metrics_project_environment_deployment_path
(
es
.
project
,
es
.
environment
,
es
.
deployment
)
end
end
...
@@ -45,8 +45,8 @@ class EnvironmentStatusEntity < Grape::Entity
...
@@ -45,8 +45,8 @@ class EnvironmentStatusEntity < Grape::Entity
object
.
environment
object
.
environment
end
end
def
deployment
def
has_metrics?
object
.
deployment
object
.
has_metrics?
end
end
def
project
def
project
...
...
changelogs/unreleased/63475-fix-n-1.yml
0 → 100644
View file @
c3f467d2
---
title
:
Improve performance of MergeRequestsController#ci_environment_status endpoint
merge_request
:
30224
author
:
type
:
performance
spec/controllers/projects/deployments_controller_spec.rb
View file @
c3f467d2
...
@@ -41,34 +41,26 @@ describe Projects::DeploymentsController do
...
@@ -41,34 +41,26 @@ describe Projects::DeploymentsController do
describe
'GET #metrics'
do
describe
'GET #metrics'
do
let
(
:deployment
)
{
create
(
:deployment
,
:success
,
project:
project
,
environment:
environment
)
}
let
(
:deployment
)
{
create
(
:deployment
,
:success
,
project:
project
,
environment:
environment
)
}
before
do
allow
(
controller
).
to
receive
(
:deployment
).
and_return
(
deployment
)
end
context
'when metrics are disabled'
do
context
'when metrics are disabled'
do
before
do
allow
(
deployment
).
to
receive
(
:has_metrics?
).
and_return
false
end
it
'responds with not found'
do
it
'responds with not found'
do
get
:metrics
,
params:
deployment_params
(
id:
deployment
.
id
)
get
:metrics
,
params:
deployment_params
(
id:
deployment
.
to_param
)
expect
(
response
).
to
be_not_found
expect
(
response
).
to
be_not_found
end
end
end
end
context
'when metrics are enabled'
do
context
'when metrics are enabled'
do
before
do
allow
(
deployment
).
to
receive
(
:has_metrics?
).
and_return
true
end
context
'when environment has no metrics'
do
context
'when environment has no metrics'
do
before
do
before
do
expect
(
deployment
).
to
receive
(
:metrics
).
and_return
(
nil
)
expect_next_instance_of
(
DeploymentMetrics
)
do
|
deployment_metrics
|
allow
(
deployment_metrics
).
to
receive
(
:has_metrics?
).
and_return
(
true
)
expect
(
deployment_metrics
).
to
receive
(
:metrics
).
and_return
(
nil
)
end
end
end
it
'returns a empty response 204 resposne'
do
it
'returns a empty response 204 resposne'
do
get
:metrics
,
params:
deployment_params
(
id:
deployment
.
id
)
get
:metrics
,
params:
deployment_params
(
id:
deployment
.
to_param
)
expect
(
response
).
to
have_gitlab_http_status
(
204
)
expect
(
response
).
to
have_gitlab_http_status
(
204
)
expect
(
response
.
body
).
to
eq
(
''
)
expect
(
response
.
body
).
to
eq
(
''
)
end
end
...
@@ -84,11 +76,15 @@ describe Projects::DeploymentsController do
...
@@ -84,11 +76,15 @@ describe Projects::DeploymentsController do
end
end
before
do
before
do
expect
(
deployment
).
to
receive
(
:metrics
).
and_return
(
empty_metrics
)
expect_next_instance_of
(
DeploymentMetrics
)
do
|
deployment_metrics
|
allow
(
deployment_metrics
).
to
receive
(
:has_metrics?
).
and_return
(
true
)
expect
(
deployment_metrics
).
to
receive
(
:metrics
).
and_return
(
empty_metrics
)
end
end
end
it
'returns a metrics JSON document'
do
it
'returns a metrics JSON document'
do
get
:metrics
,
params:
deployment_params
(
id:
deployment
.
id
)
get
:metrics
,
params:
deployment_params
(
id:
deployment
.
to_param
)
expect
(
response
).
to
be_ok
expect
(
response
).
to
be_ok
expect
(
json_response
[
'success'
]).
to
be
(
true
)
expect
(
json_response
[
'success'
]).
to
be
(
true
)
...
@@ -96,54 +92,32 @@ describe Projects::DeploymentsController do
...
@@ -96,54 +92,32 @@ describe Projects::DeploymentsController do
expect
(
json_response
[
'last_update'
]).
to
eq
(
42
)
expect
(
json_response
[
'last_update'
]).
to
eq
(
42
)
end
end
end
end
context
'when metrics service does not implement deployment metrics'
do
before
do
allow
(
deployment
).
to
receive
(
:metrics
).
and_raise
(
NotImplementedError
)
end
it
'responds with not found'
do
get
:metrics
,
params:
deployment_params
(
id:
deployment
.
id
)
expect
(
response
).
to
be_not_found
end
end
end
end
end
end
describe
'GET #additional_metrics'
do
describe
'GET #additional_metrics'
do
let
(
:deployment
)
{
create
(
:deployment
,
:success
,
project:
project
,
environment:
environment
)
}
let
(
:deployment
)
{
create
(
:deployment
,
:success
,
project:
project
,
environment:
environment
)
}
before
do
allow
(
controller
).
to
receive
(
:deployment
).
and_return
(
deployment
)
end
context
'when metrics are disabled'
do
context
'when metrics are disabled'
do
before
do
allow
(
deployment
).
to
receive
(
:has_metrics?
).
and_return
false
end
it
'responds with not found'
do
it
'responds with not found'
do
get
:metrics
,
params:
deployment_params
(
id:
deployment
.
id
)
get
:metrics
,
params:
deployment_params
(
id:
deployment
.
to_param
)
expect
(
response
).
to
be_not_found
expect
(
response
).
to
be_not_found
end
end
end
end
context
'when metrics are enabled'
do
context
'when metrics are enabled'
do
let
(
:prometheus_adapter
)
{
double
(
'prometheus_adapter'
,
can_query?:
true
)
}
before
do
allow
(
deployment
).
to
receive
(
:prometheus_adapter
).
and_return
(
prometheus_adapter
)
end
context
'when environment has no metrics'
do
context
'when environment has no metrics'
do
before
do
before
do
expect
(
deployment
).
to
receive
(
:additional_metrics
).
and_return
({})
expect_next_instance_of
(
DeploymentMetrics
)
do
|
deployment_metrics
|
allow
(
deployment_metrics
).
to
receive
(
:has_metrics?
).
and_return
(
true
)
expect
(
deployment_metrics
).
to
receive
(
:additional_metrics
).
and_return
({})
end
end
end
it
'returns a empty response 204 response'
do
it
'returns a empty response 204 response'
do
get
:additional_metrics
,
params:
deployment_params
(
id:
deployment
.
id
,
format: :json
)
get
:additional_metrics
,
params:
deployment_params
(
id:
deployment
.
to_param
,
format: :json
)
expect
(
response
).
to
have_gitlab_http_status
(
204
)
expect
(
response
).
to
have_gitlab_http_status
(
204
)
expect
(
response
.
body
).
to
eq
(
''
)
expect
(
response
.
body
).
to
eq
(
''
)
end
end
...
@@ -159,11 +133,15 @@ describe Projects::DeploymentsController do
...
@@ -159,11 +133,15 @@ describe Projects::DeploymentsController do
end
end
before
do
before
do
expect
(
deployment
).
to
receive
(
:additional_metrics
).
and_return
(
empty_metrics
)
expect_next_instance_of
(
DeploymentMetrics
)
do
|
deployment_metrics
|
allow
(
deployment_metrics
).
to
receive
(
:has_metrics?
).
and_return
(
true
)
expect
(
deployment_metrics
).
to
receive
(
:additional_metrics
).
and_return
(
empty_metrics
)
end
end
end
it
'returns a metrics JSON document'
do
it
'returns a metrics JSON document'
do
get
:additional_metrics
,
params:
deployment_params
(
id:
deployment
.
id
,
format: :json
)
get
:additional_metrics
,
params:
deployment_params
(
id:
deployment
.
to_param
,
format: :json
)
expect
(
response
).
to
be_ok
expect
(
response
).
to
be_ok
expect
(
json_response
[
'success'
]).
to
be
(
true
)
expect
(
json_response
[
'success'
]).
to
be
(
true
)
...
...
spec/controllers/projects/merge_requests_controller_spec.rb
View file @
c3f467d2
...
@@ -878,6 +878,22 @@ describe Projects::MergeRequestsController do
...
@@ -878,6 +878,22 @@ describe Projects::MergeRequestsController do
expect
(
control_count
).
to
be
<=
137
expect
(
control_count
).
to
be
<=
137
end
end
it
'has no N+1 issues for environments'
,
:request_store
,
retry:
0
do
# First run to insert test data from lets, which does take up some 30 queries
get_ci_environments_status
control_count
=
ActiveRecord
::
QueryRecorder
.
new
(
skip_cached:
false
)
{
get_ci_environments_status
}.
count
environment2
=
create
(
:environment
,
project:
forked
)
create
(
:deployment
,
:succeed
,
environment:
environment2
,
sha:
sha
,
ref:
'master'
,
deployable:
build
)
# TODO address the last 11 queries
# See https://gitlab.com/gitlab-org/gitlab-ce/issues/63952 (5 queries)
# And https://gitlab.com/gitlab-org/gitlab-ce/issues/64105 (6 queries)
leeway
=
11
expect
{
get_ci_environments_status
}.
not_to
exceed_all_query_limit
(
control_count
+
leeway
)
end
def
get_ci_environments_status
(
extra_params
=
{})
def
get_ci_environments_status
(
extra_params
=
{})
params
=
{
params
=
{
namespace_id:
merge_request
.
project
.
namespace
.
to_param
,
namespace_id:
merge_request
.
project
.
namespace
.
to_param
,
...
...
spec/models/deployment_metrics_spec.rb
0 → 100644
View file @
c3f467d2
# frozen_string_literal: true
require
'spec_helper'
describe
DeploymentMetrics
do
describe
'#has_metrics?'
do
subject
{
described_class
.
new
(
deployment
.
project
,
deployment
).
has_metrics?
}
context
'when deployment is failed'
do
let
(
:deployment
)
{
create
(
:deployment
,
:failed
)
}
it
{
is_expected
.
to
be_falsy
}
end
context
'when deployment is success'
do
let
(
:deployment
)
{
create
(
:deployment
,
:success
)
}
context
'without a monitoring service'
do
it
{
is_expected
.
to
be_falsy
}
end
context
'with a Prometheus Service'
do
let
(
:prometheus_service
)
{
instance_double
(
PrometheusService
,
can_query?:
true
)
}
before
do
allow
(
deployment
.
project
).
to
receive
(
:find_or_initialize_service
).
with
(
'prometheus'
).
and_return
prometheus_service
end
it
{
is_expected
.
to
be_truthy
}
end
context
'with a Prometheus Service that cannot query'
do
let
(
:prometheus_service
)
{
instance_double
(
PrometheusService
,
can_query?:
false
)
}
before
do
allow
(
deployment
.
project
).
to
receive
(
:find_or_initialize_service
).
with
(
'prometheus'
).
and_return
prometheus_service
end
it
{
is_expected
.
to
be_falsy
}
end
context
'with a cluster Prometheus'
do
let
(
:deployment
)
{
create
(
:deployment
,
:success
,
:on_cluster
)
}
let!
(
:prometheus
)
{
create
(
:clusters_applications_prometheus
,
:installed
,
cluster:
deployment
.
cluster
)
}
before
do
expect
(
deployment
.
cluster
.
application_prometheus
).
to
receive
(
:can_query?
).
and_return
(
true
)
end
it
{
is_expected
.
to
be_truthy
}
end
context
'fallback deployment platform'
do
let
(
:cluster
)
{
create
(
:cluster
,
:provided_by_user
,
environment_scope:
'*'
,
projects:
[
deployment
.
project
])
}
let!
(
:prometheus
)
{
create
(
:clusters_applications_prometheus
,
:installed
,
cluster:
cluster
)
}
before
do
expect
(
deployment
.
project
).
to
receive
(
:deployment_platform
).
and_return
(
cluster
.
platform
)
expect
(
cluster
.
application_prometheus
).
to
receive
(
:can_query?
).
and_return
(
true
)
end
it
{
is_expected
.
to
be_truthy
}
end
end
end
describe
'#metrics'
do
let
(
:deployment
)
{
create
(
:deployment
,
:success
)
}
let
(
:prometheus_adapter
)
{
instance_double
(
PrometheusService
,
can_query?:
true
)
}
let
(
:deployment_metrics
)
{
described_class
.
new
(
deployment
.
project
,
deployment
)
}
subject
{
deployment_metrics
.
metrics
}
context
'metrics are disabled'
do
it
{
is_expected
.
to
eq
({})
}
end
context
'metrics are enabled'
do
let
(
:simple_metrics
)
do
{
success:
true
,
metrics:
{},
last_update:
42
}
end
before
do
allow
(
deployment_metrics
).
to
receive
(
:prometheus_adapter
).
and_return
(
prometheus_adapter
)
expect
(
prometheus_adapter
).
to
receive
(
:query
).
with
(
:deployment
,
deployment
).
and_return
(
simple_metrics
)
end
it
{
is_expected
.
to
eq
(
simple_metrics
.
merge
({
deployment_time:
deployment
.
created_at
.
to_i
}))
}
end
end
describe
'#additional_metrics'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:deployment
)
{
create
(
:deployment
,
:succeed
,
project:
project
)
}
let
(
:deployment_metrics
)
{
described_class
.
new
(
deployment
.
project
,
deployment
)
}
subject
{
deployment_metrics
.
additional_metrics
}
context
'metrics are disabled'
do
it
{
is_expected
.
to
eq
({})
}
end
context
'metrics are enabled'
do
let
(
:simple_metrics
)
do
{
success:
true
,
metrics:
{},
last_update:
42
}
end
let
(
:prometheus_adapter
)
{
instance_double
(
'prometheus_adapter'
,
can_query?:
true
)
}
before
do
allow
(
deployment_metrics
).
to
receive
(
:prometheus_adapter
).
and_return
(
prometheus_adapter
)
expect
(
prometheus_adapter
).
to
receive
(
:query
).
with
(
:additional_metrics_deployment
,
deployment
).
and_return
(
simple_metrics
)
end
it
{
is_expected
.
to
eq
(
simple_metrics
.
merge
({
deployment_time:
deployment
.
created_at
.
to_i
}))
}
end
end
end
spec/models/deployment_spec.rb
View file @
c3f467d2
...
@@ -295,125 +295,6 @@ describe Deployment do
...
@@ -295,125 +295,6 @@ describe Deployment do
end
end
end
end
describe
'#has_metrics?'
do
subject
{
deployment
.
has_metrics?
}
context
'when deployment is failed'
do
let
(
:deployment
)
{
create
(
:deployment
,
:failed
)
}
it
{
is_expected
.
to
be_falsy
}
end
context
'when deployment is success'
do
let
(
:deployment
)
{
create
(
:deployment
,
:success
)
}
context
'without a monitoring service'
do
it
{
is_expected
.
to
be_falsy
}
end
context
'with a Prometheus Service'
do
let
(
:prometheus_service
)
{
double
(
:prometheus_service
,
can_query?:
true
)
}
before
do
allow
(
deployment
.
project
).
to
receive
(
:find_or_initialize_service
).
with
(
'prometheus'
).
and_return
prometheus_service
end
it
{
is_expected
.
to
be_truthy
}
end
context
'with a Prometheus Service that cannot query'
do
let
(
:prometheus_service
)
{
double
(
:prometheus_service
,
can_query?:
false
)
}
before
do
allow
(
deployment
.
project
).
to
receive
(
:find_or_initialize_service
).
with
(
'prometheus'
).
and_return
prometheus_service
end
it
{
is_expected
.
to
be_falsy
}
end
context
'with a cluster Prometheus'
do
let
(
:deployment
)
{
create
(
:deployment
,
:success
,
:on_cluster
)
}
let!
(
:prometheus
)
{
create
(
:clusters_applications_prometheus
,
:installed
,
cluster:
deployment
.
cluster
)
}
before
do
expect
(
deployment
.
cluster
.
application_prometheus
).
to
receive
(
:can_query?
).
and_return
(
true
)
end
it
{
is_expected
.
to
be_truthy
}
end
context
'fallback deployment platform'
do
let
(
:cluster
)
{
create
(
:cluster
,
:provided_by_user
,
environment_scope:
'*'
,
projects:
[
deployment
.
project
])
}
let!
(
:prometheus
)
{
create
(
:clusters_applications_prometheus
,
:installed
,
cluster:
cluster
)
}
before
do
expect
(
deployment
.
project
).
to
receive
(
:deployment_platform
).
and_return
(
cluster
.
platform
)
expect
(
cluster
.
application_prometheus
).
to
receive
(
:can_query?
).
and_return
(
true
)
end
it
{
is_expected
.
to
be_truthy
}
end
end
end
describe
'#metrics'
do
let
(
:deployment
)
{
create
(
:deployment
,
:success
)
}
let
(
:prometheus_adapter
)
{
double
(
'prometheus_adapter'
,
can_query?:
true
)
}
subject
{
deployment
.
metrics
}
context
'metrics are disabled'
do
it
{
is_expected
.
to
eq
({})
}
end
context
'metrics are enabled'
do
let
(
:simple_metrics
)
do
{
success:
true
,
metrics:
{},
last_update:
42
}
end
before
do
allow
(
deployment
).
to
receive
(
:prometheus_adapter
).
and_return
(
prometheus_adapter
)
allow
(
prometheus_adapter
).
to
receive
(
:query
).
with
(
:deployment
,
deployment
).
and_return
(
simple_metrics
)
end
it
{
is_expected
.
to
eq
(
simple_metrics
.
merge
({
deployment_time:
deployment
.
created_at
.
to_i
}))
}
end
end
describe
'#additional_metrics'
do
let
(
:project
)
{
create
(
:project
,
:repository
)
}
let
(
:deployment
)
{
create
(
:deployment
,
:succeed
,
project:
project
)
}
subject
{
deployment
.
additional_metrics
}
context
'metrics are disabled'
do
it
{
is_expected
.
to
eq
({})
}
end
context
'metrics are enabled'
do
let
(
:simple_metrics
)
do
{
success:
true
,
metrics:
{},
last_update:
42
}
end
let
(
:prometheus_adapter
)
{
double
(
'prometheus_adapter'
,
can_query?:
true
)
}
before
do
allow
(
deployment
).
to
receive
(
:prometheus_adapter
).
and_return
(
prometheus_adapter
)
allow
(
prometheus_adapter
).
to
receive
(
:query
).
with
(
:additional_metrics_deployment
,
deployment
).
and_return
(
simple_metrics
)
end
it
{
is_expected
.
to
eq
(
simple_metrics
.
merge
({
deployment_time:
deployment
.
created_at
.
to_i
}))
}
end
end
describe
'#stop_action'
do
describe
'#stop_action'
do
let
(
:build
)
{
create
(
:ci_build
)
}
let
(
:build
)
{
create
(
:ci_build
)
}
...
@@ -441,32 +322,4 @@ describe Deployment do
...
@@ -441,32 +322,4 @@ describe Deployment do
end
end
end
end
end
end
describe
'#deployment_platform_cluster'
do
let
(
:deployment
)
{
create
(
:deployment
)
}
let
(
:project
)
{
deployment
.
project
}
let
(
:environment
)
{
deployment
.
environment
}
subject
{
deployment
.
deployment_platform_cluster
}
before
do
expect
(
project
).
to
receive
(
:deployment_platform
)
.
with
(
environment:
environment
.
name
).
and_call_original
end
context
'project has no deployment platform'
do
before
do
expect
(
project
.
clusters
).
to
be_empty
end
it
{
is_expected
.
to
be_nil
}
end
context
'project has a deployment platform'
do
let!
(
:cluster
)
{
create
(
:cluster
,
projects:
[
project
])
}
let!
(
:platform
)
{
create
(
:cluster_platform_kubernetes
,
cluster:
cluster
)
}
it
{
is_expected
.
to
eq
cluster
}
end
end
end
end
spec/models/environment_status_spec.rb
View file @
c3f467d2
...
@@ -11,11 +11,10 @@ describe EnvironmentStatus do
...
@@ -11,11 +11,10 @@ describe EnvironmentStatus do
let
(
:merge_request
)
{
create
(
:merge_request
,
:deployed_review_app
,
deployment:
deployment
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
:deployed_review_app
,
deployment:
deployment
)
}
let
(
:sha
)
{
deployment
.
sha
}
let
(
:sha
)
{
deployment
.
sha
}
subject
(
:environment_status
)
{
described_class
.
new
(
environment
,
merge_request
,
sha
)
}
subject
(
:environment_status
)
{
described_class
.
new
(
project
,
environment
,
merge_request
,
sha
)
}
it
{
is_expected
.
to
delegate_method
(
:id
).
to
(
:environment
)
}
it
{
is_expected
.
to
delegate_method
(
:id
).
to
(
:environment
)
}
it
{
is_expected
.
to
delegate_method
(
:name
).
to
(
:environment
)
}
it
{
is_expected
.
to
delegate_method
(
:name
).
to
(
:environment
)
}
it
{
is_expected
.
to
delegate_method
(
:project
).
to
(
:environment
)
}
it
{
is_expected
.
to
delegate_method
(
:deployed_at
).
to
(
:deployment
)
}
it
{
is_expected
.
to
delegate_method
(
:deployed_at
).
to
(
:deployment
)
}
it
{
is_expected
.
to
delegate_method
(
:status
).
to
(
:deployment
)
}
it
{
is_expected
.
to
delegate_method
(
:status
).
to
(
:deployment
)
}
...
...
spec/serializers/environment_status_entity_spec.rb
View file @
c3f467d2
...
@@ -9,7 +9,7 @@ describe EnvironmentStatusEntity do
...
@@ -9,7 +9,7 @@ describe EnvironmentStatusEntity do
let
(
:project
)
{
deployment
.
project
}
let
(
:project
)
{
deployment
.
project
}
let
(
:merge_request
)
{
create
(
:merge_request
,
:deployed_review_app
,
deployment:
deployment
)
}
let
(
:merge_request
)
{
create
(
:merge_request
,
:deployed_review_app
,
deployment:
deployment
)
}
let
(
:environment_status
)
{
EnvironmentStatus
.
new
(
environment
,
merge_request
,
merge_request
.
diff_head_sha
)
}
let
(
:environment_status
)
{
EnvironmentStatus
.
new
(
project
,
environment
,
merge_request
,
merge_request
.
diff_head_sha
)
}
let
(
:entity
)
{
described_class
.
new
(
environment_status
,
request:
request
)
}
let
(
:entity
)
{
described_class
.
new
(
environment_status
,
request:
request
)
}
subject
{
entity
.
as_json
}
subject
{
entity
.
as_json
}
...
@@ -55,8 +55,14 @@ describe EnvironmentStatusEntity do
...
@@ -55,8 +55,14 @@ describe EnvironmentStatusEntity do
before
do
before
do
project
.
add_maintainer
(
user
)
project
.
add_maintainer
(
user
)
allow
(
deployment
).
to
receive
(
:prometheus_adapter
).
and_return
(
prometheus_adapter
)
allow
(
deployment
).
to
receive
(
:prometheus_adapter
).
and_return
(
prometheus_adapter
)
allow
(
prometheus_adapter
).
to
receive
(
:query
).
with
(
:deployment
,
deployment
).
and_return
(
simple_metrics
)
allow
(
entity
).
to
receive
(
:deployment
).
and_return
(
deployment
)
allow
(
entity
).
to
receive
(
:deployment
).
and_return
(
deployment
)
expect_next_instance_of
(
DeploymentMetrics
)
do
|
deployment_metrics
|
allow
(
deployment_metrics
).
to
receive
(
:prometheus_adapter
).
and_return
(
prometheus_adapter
)
allow
(
prometheus_adapter
).
to
receive
(
:query
)
.
with
(
:deployment
,
deployment
).
and_return
(
simple_metrics
)
end
end
end
context
'when deployment succeeded'
do
context
'when deployment succeeded'
do
...
...
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