Skip to content
Snippets Groups Projects
Verified Commit 02154350 authored by Matija Čupić's avatar Matija Čupić
Browse files

Refactor CheckGcpProjectBillingWorker

parent bafab35e
No related branches found
No related tags found
No related merge requests found
Loading
Loading
@@ -39,12 +39,12 @@ class Projects::Clusters::GcpController < Projects::ApplicationController
 
def verify_billing
case google_project_billing_status
when 'true'
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
when nil
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
 
@cluster = ::Clusters::Cluster.new(create_params)
Loading
Loading
@@ -81,9 +81,7 @@ class Projects::Clusters::GcpController < Projects::ApplicationController
end
 
def google_project_billing_status
Gitlab::Redis::SharedState.with do |redis|
redis.get(CheckGcpProjectBillingWorker.redis_shared_state_key_for(token_in_session))
end
CheckGcpProjectBillingWorker.get_billing_state(token_in_session)
end
 
def token_in_session
Loading
Loading
Loading
Loading
@@ -22,8 +22,11 @@ class CheckGcpProjectBillingWorker
end
end
 
def self.redis_shared_state_key_for(token)
"gitlab:gcp:#{Digest::SHA1.hexdigest(token)}:billing_enabled"
def self.get_billing_state(token)
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
 
def perform(token_key)
Loading
Loading
@@ -33,15 +36,9 @@ class CheckGcpProjectBillingWorker
return unless token
return unless try_obtain_lease_for(token)
 
billing_enabled_projects = CheckGcpProjectBillingService.new.execute(token)
update_billing_change_counter(check_previous_state(token), !billing_enabled_projects.empty?)
Gitlab::Redis::SharedState.with do |redis|
redis.set(self.class.redis_shared_state_key_for(token),
!billing_enabled_projects.empty?,
ex: BILLING_TIMEOUT)
end
billing_enabled_state = !CheckGcpProjectBillingService.new.execute(token).empty?
update_billing_change_counter(self.class.get_billing_state(token), billing_enabled_state)
self.class.set_billing_state(token, billing_enabled_state)
end
 
private
Loading
Loading
@@ -54,11 +51,14 @@ class CheckGcpProjectBillingWorker
"gitlab:gcp:session:#{token_key}"
end
 
def billing_changed_counter
@billing_changed_counter ||= Gitlab::Metrics.counter(
:gcp_billing_change_count,
"Counts the number of times a GCP project changed billing_enabled state from false to true"
)
def self.redis_shared_state_key_for(token)
"gitlab:gcp:#{Digest::SHA1.hexdigest(token)}:billing_enabled"
end
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
 
def try_obtain_lease_for(token)
Loading
Loading
@@ -67,14 +67,15 @@ class CheckGcpProjectBillingWorker
.try_obtain
end
 
def check_previous_state(token)
Gitlab::Redis::SharedState.with do |redis|
redis.get(self.class.redis_shared_state_key_for(token))
end
def billing_changed_counter
@billing_changed_counter ||= Gitlab::Metrics.counter(
:gcp_billing_change_count,
"Counts the number of times a GCP project changed billing_enabled state from false to true"
)
end
 
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
end
Loading
Loading
Loading
Loading
@@ -7,7 +7,7 @@ describe CheckGcpProjectBillingWorker do
subject { described_class.new.perform('token_key') }
 
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)
end
 
Loading
Loading
@@ -28,11 +28,8 @@ describe CheckGcpProjectBillingWorker do
end
 
it 'stores billing status in redis' do
redis_double = double
expect(CheckGcpProjectBillingService).to receive_message_chain(:new, :execute).and_return([double])
expect(Gitlab::Redis::SharedState).to receive(:with).and_yield(redis_double)
expect(redis_double).to receive(:set).with(described_class.redis_shared_state_key_for(token), anything, anything)
expect(described_class).to receive(:set_billing_state).with(token, true)
 
subject
end
Loading
Loading
@@ -53,7 +50,7 @@ describe CheckGcpProjectBillingWorker do
 
context 'when there is no token in redis' 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
 
it 'does not call the service' do
Loading
Loading
@@ -70,15 +67,12 @@ describe CheckGcpProjectBillingWorker do
before do
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')
Gitlab::Redis::SharedState.with do |redis|
allow(redis).to receive(:set)
end
allow(described_class).to receive(:set_billing_state)
end
 
context 'when previous state was false' 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
 
context 'when the current state is false' do
Loading
Loading
@@ -108,7 +102,7 @@ describe CheckGcpProjectBillingWorker do
 
context 'when previous state was true' 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])
end
 
Loading
Loading
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment