Refactor CheckGcpProjectBillingWorker

This commit is contained in:
Matija Čupić 2018-02-08 16:57:14 +01:00
parent bafab35e84
commit 0215435058
No known key found for this signature in database
GPG key ID: 4BAF84FFACD2E5DE
3 changed files with 34 additions and 41 deletions

View file

@ -39,12 +39,12 @@ class Projects::Clusters::GcpController < Projects::ApplicationController
def verify_billing def verify_billing
case google_project_billing_status case google_project_billing_status
when 'true' when nil
return
when 'false'
flash[:alert] = _('Please <a href=%{link_to_billing} target="_blank" rel="noopener noreferrer">enable billing for one of your projects to be able to create a Kubernetes cluster</a>, then try again.').html_safe % { link_to_billing: "https://console.cloud.google.com/freetrial?utm_campaign=2018_cpanel&utm_source=gitlab&utm_medium=referral" }
else
flash[:alert] = _('We could not verify that one of your projects on GCP has billing enabled. Please try again.') flash[:alert] = _('We could not verify that one of your projects on GCP has billing enabled. Please try again.')
when false
flash[:alert] = _('Please <a href=%{link_to_billing} target="_blank" rel="noopener noreferrer">enable billing for one of your projects to be able to create a Kubernetes cluster</a>, then try again.').html_safe % { link_to_billing: "https://console.cloud.google.com/freetrial?utm_campaign=2018_cpanel&utm_source=gitlab&utm_medium=referral" }
when true
return
end end
@cluster = ::Clusters::Cluster.new(create_params) @cluster = ::Clusters::Cluster.new(create_params)
@ -81,9 +81,7 @@ class Projects::Clusters::GcpController < Projects::ApplicationController
end end
def google_project_billing_status def google_project_billing_status
Gitlab::Redis::SharedState.with do |redis| CheckGcpProjectBillingWorker.get_billing_state(token_in_session)
redis.get(CheckGcpProjectBillingWorker.redis_shared_state_key_for(token_in_session))
end
end end
def token_in_session def token_in_session

View file

@ -22,8 +22,11 @@ class CheckGcpProjectBillingWorker
end end
end end
def self.redis_shared_state_key_for(token) def self.get_billing_state(token)
"gitlab:gcp:#{Digest::SHA1.hexdigest(token)}:billing_enabled" Gitlab::Redis::SharedState.with do |redis|
value = redis.get(redis_shared_state_key_for(token))
ActiveRecord::Type::Boolean.new.type_cast_from_user(value)
end
end end
def perform(token_key) def perform(token_key)
@ -33,15 +36,9 @@ class CheckGcpProjectBillingWorker
return unless token return unless token
return unless try_obtain_lease_for(token) return unless try_obtain_lease_for(token)
billing_enabled_projects = CheckGcpProjectBillingService.new.execute(token) billing_enabled_state = !CheckGcpProjectBillingService.new.execute(token).empty?
update_billing_change_counter(self.class.get_billing_state(token), billing_enabled_state)
update_billing_change_counter(check_previous_state(token), !billing_enabled_projects.empty?) self.class.set_billing_state(token, billing_enabled_state)
Gitlab::Redis::SharedState.with do |redis|
redis.set(self.class.redis_shared_state_key_for(token),
!billing_enabled_projects.empty?,
ex: BILLING_TIMEOUT)
end
end end
private private
@ -54,11 +51,14 @@ class CheckGcpProjectBillingWorker
"gitlab:gcp:session:#{token_key}" "gitlab:gcp:session:#{token_key}"
end end
def billing_changed_counter def self.redis_shared_state_key_for(token)
@billing_changed_counter ||= Gitlab::Metrics.counter( "gitlab:gcp:#{Digest::SHA1.hexdigest(token)}:billing_enabled"
:gcp_billing_change_count, end
"Counts the number of times a GCP project changed billing_enabled state from false to true"
) def self.set_billing_state(token, value)
Gitlab::Redis::SharedState.with do |redis|
redis.set(redis_shared_state_key_for(token), value, ex: BILLING_TIMEOUT)
end
end end
def try_obtain_lease_for(token) def try_obtain_lease_for(token)
@ -67,14 +67,15 @@ class CheckGcpProjectBillingWorker
.try_obtain .try_obtain
end end
def check_previous_state(token) def billing_changed_counter
Gitlab::Redis::SharedState.with do |redis| @billing_changed_counter ||= Gitlab::Metrics.counter(
redis.get(self.class.redis_shared_state_key_for(token)) :gcp_billing_change_count,
end "Counts the number of times a GCP project changed billing_enabled state from false to true"
)
end end
def update_billing_change_counter(previous_state, current_state) def update_billing_change_counter(previous_state, current_state)
return unless previous_state == 'false' && current_state return unless !previous_state && current_state
billing_changed_counter.increment billing_changed_counter.increment
end end

View file

@ -7,7 +7,7 @@ describe CheckGcpProjectBillingWorker do
subject { described_class.new.perform('token_key') } subject { described_class.new.perform('token_key') }
before do before do
allow_any_instance_of(described_class).to receive(:check_previous_state) allow(described_class).to receive(:get_billing_state)
allow_any_instance_of(described_class).to receive(:update_billing_change_counter) allow_any_instance_of(described_class).to receive(:update_billing_change_counter)
end end
@ -28,11 +28,8 @@ describe CheckGcpProjectBillingWorker do
end end
it 'stores billing status in redis' do it 'stores billing status in redis' do
redis_double = double
expect(CheckGcpProjectBillingService).to receive_message_chain(:new, :execute).and_return([double]) expect(CheckGcpProjectBillingService).to receive_message_chain(:new, :execute).and_return([double])
expect(Gitlab::Redis::SharedState).to receive(:with).and_yield(redis_double) expect(described_class).to receive(:set_billing_state).with(token, true)
expect(redis_double).to receive(:set).with(described_class.redis_shared_state_key_for(token), anything, anything)
subject subject
end end
@ -53,7 +50,7 @@ describe CheckGcpProjectBillingWorker do
context 'when there is no token in redis' do context 'when there is no token in redis' do
before do before do
allow_any_instance_of(described_class).to receive(:get_session_token).and_return(nil) allow(described_class).to receive(:get_session_token).and_return(nil)
end end
it 'does not call the service' do it 'does not call the service' do
@ -70,15 +67,12 @@ describe CheckGcpProjectBillingWorker do
before do before do
allow(described_class).to receive(:get_session_token).and_return('bogustoken') allow(described_class).to receive(:get_session_token).and_return('bogustoken')
allow_any_instance_of(described_class).to receive(:try_obtain_lease_for).and_return('randomuuid') allow_any_instance_of(described_class).to receive(:try_obtain_lease_for).and_return('randomuuid')
allow(described_class).to receive(:set_billing_state)
Gitlab::Redis::SharedState.with do |redis|
allow(redis).to receive(:set)
end
end end
context 'when previous state was false' do context 'when previous state was false' do
before do before do
expect_any_instance_of(described_class).to receive(:check_previous_state).and_return('false') expect(described_class).to receive(:get_billing_state).and_return(false)
end end
context 'when the current state is false' do context 'when the current state is false' do
@ -108,7 +102,7 @@ describe CheckGcpProjectBillingWorker do
context 'when previous state was true' do context 'when previous state was true' do
before do before do
expect_any_instance_of(described_class).to receive(:check_previous_state).and_return('true') expect(described_class).to receive(:get_billing_state).and_return(true)
expect(CheckGcpProjectBillingService).to receive_message_chain(:new, :execute).and_return([double]) expect(CheckGcpProjectBillingService).to receive_message_chain(:new, :execute).and_return([double])
end end