Commit 6c0fc62e authored by Grzegorz Bizon's avatar Grzegorz Bizon

Take branch access into account when stopping environment

parent e533d43a
...@@ -85,8 +85,8 @@ class Deployment < ActiveRecord::Base ...@@ -85,8 +85,8 @@ class Deployment < ActiveRecord::Base
end end
def stop_action def stop_action
return nil unless on_stop.present? return unless on_stop.present?
return nil unless manual_actions return unless manual_actions
@stop_action ||= manual_actions.find_by(name: on_stop) @stop_action ||= manual_actions.find_by(name: on_stop)
end end
......
...@@ -122,6 +122,12 @@ class Environment < ActiveRecord::Base ...@@ -122,6 +122,12 @@ class Environment < ActiveRecord::Base
available? && stop_action.present? available? && stop_action.present?
end end
def can_trigger_stop_action?(current_user)
return false unless stop_action?
stop_action.can_play?(current_user)
end
def stop_with_action!(current_user) def stop_with_action!(current_user)
return unless available? return unless available?
......
...@@ -6,9 +6,10 @@ module Ci ...@@ -6,9 +6,10 @@ module Ci
@ref = branch_name @ref = branch_name
return unless has_ref? return unless has_ref?
return unless can?(current_user, :create_deployment, project)
environments.each do |environment| environments.each do |environment|
next unless can?(current_user, :create_deployment, project) next unless environment.can_trigger_stop_action?(current_user)
environment.stop_with_action!(current_user) environment.stop_with_action!(current_user)
end end
...@@ -21,8 +22,9 @@ module Ci ...@@ -21,8 +22,9 @@ module Ci
end end
def environments def environments
@environments ||= @environments ||= EnvironmentsFinder
EnvironmentsFinder.new(project, current_user, ref: @ref, recently_updated: true).execute .new(project, current_user, ref: @ref, recently_updated: true)
.execute
end end
end end
end end
...@@ -20,14 +20,18 @@ FactoryGirl.define do ...@@ -20,14 +20,18 @@ FactoryGirl.define do
after(:create) do |environment, evaluator| after(:create) do |environment, evaluator|
pipeline = create(:ci_pipeline, project: environment.project) pipeline = create(:ci_pipeline, project: environment.project)
deployable = create(:ci_build, name: "#{environment.name}:deploy",
pipeline: pipeline)
deployment = create(:deployment, deployment = create(:deployment,
environment: environment, environment: environment,
project: environment.project, project: environment.project,
deployable: deployable,
ref: evaluator.ref, ref: evaluator.ref,
sha: environment.project.commit(evaluator.ref).id) sha: environment.project.commit(evaluator.ref).id)
teardown_build = create(:ci_build, :manual, teardown_build = create(:ci_build, :manual,
name: "#{deployment.environment.name}:teardown", name: "#{environment.name}:teardown",
pipeline: pipeline) pipeline: pipeline)
deployment.update_column(:on_stop, teardown_build.name) deployment.update_column(:on_stop, teardown_build.name)
......
...@@ -155,6 +155,31 @@ describe Environment, models: true do ...@@ -155,6 +155,31 @@ describe Environment, models: true do
end end
end end
describe '#can_trigger_stop_action?' do
let(:user) { create(:user) }
let(:project) { create(:project) }
let(:environment) do
create(:environment, :with_review_app, project: project)
end
context 'when user can trigger stop action' do
before do
project.add_developer(user)
end
it 'returns value that evaluates to true' do
expect(environment.can_trigger_stop_action?(user)).to be_truthy
end
end
context 'when user is not allowed to trigger stop action' do
it 'returns value that evaluates to false' do
expect(environment.can_trigger_stop_action?(user)).to be_falsey
end
end
end
describe '#stop_with_action!' do describe '#stop_with_action!' do
let(:user) { create(:admin) } let(:user) { create(:admin) }
......
...@@ -55,8 +55,22 @@ describe Ci::StopEnvironmentsService, services: true do ...@@ -55,8 +55,22 @@ describe Ci::StopEnvironmentsService, services: true do
end end
context 'when user does not have permission to stop environment' do context 'when user does not have permission to stop environment' do
context 'when user has no access to manage deployments' do
before do
project.team << [user, :guest]
end
it 'does not stop environment' do
expect_environment_not_stopped_on('master')
end
end
end
context 'when branch for stop action is protected' do
before do before do
project.team << [user, :guest] project.add_developer(user)
create(:protected_branch, :no_one_can_push,
name: 'master', project: project)
end end
it 'does not stop environment' do it 'does not stop environment' do
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment