Skip to content
Snippets Groups Projects

[BE] Provide script to run on console for bulk assignment

Merged Mohamed Hamda requested to merge 431619-script-draft into master
All threads resolved!
Files
5
@@ -5,6 +5,7 @@
@@ -5,6 +5,7 @@
# add_on_purchase = GitlabSubscriptions::AddOnPurchase.find_by(add_on: GitlabSubscriptions::AddOn.code_suggestions.last)
# add_on_purchase = GitlabSubscriptions::AddOnPurchase.find_by(add_on: GitlabSubscriptions::AddOn.code_suggestions.last)
# 2. Set the `usernames` variable to point to your usernames array
# 2. Set the `usernames` variable to point to your usernames array
# usernames = ["user1", "user2", "user3", "user4", "user5"]
# usernames = ["user1", "user2", "user3", "user4", "user5"]
 
# If reading from a CSV file usernames = CSV.read(FILE_PATH, headers: true).map { |row| row['username'] }
# 3. Execute the bulk assignment:
# 3. Execute the bulk assignment:
# ```ruby
# ```ruby
# DuoPro::BulkUserAssignment.new(usernames, add_on_purchase).execute!
# DuoPro::BulkUserAssignment.new(usernames, add_on_purchase).execute!
@@ -17,7 +18,8 @@
@@ -17,7 +18,8 @@
module DuoPro
module DuoPro
class BulkUserAssignment
class BulkUserAssignment
# rubocop: disable CodeReuse/ActiveRecord -- Script does not belong to the codebase
include GitlabSubscriptions::SubscriptionHelper
 
attr_reader :usernames, :add_on_purchase, :success_assignments, :failed_assignments
attr_reader :usernames, :add_on_purchase, :success_assignments, :failed_assignments
def initialize(usernames, add_on_purchase)
def initialize(usernames, add_on_purchase)
@@ -28,10 +30,19 @@ def initialize(usernames, add_on_purchase)
@@ -28,10 +30,19 @@ def initialize(usernames, add_on_purchase)
end
end
def execute!
def execute!
 
return 'Running on SaaS detected; this class is for self-managed instances only' if gitlab_saas?
return 'AddOn not purchased' unless add_on_purchase
return 'AddOn not purchased' unless add_on_purchase
 
process_users(usernames)
 
 
{ success_assignments: success_assignments, failed_assignments: failed_assignments }
 
end
 
 
private
 
 
def process_users(usernames)
usernames.each do |username|
usernames.each do |username|
user_to_be_assigned = find_user_by_username(username)
user_to_be_assigned = User.find_by_username(username)
unless user_to_be_assigned
unless user_to_be_assigned
log_failed_assignment("User is not found: #{username}")
log_failed_assignment("User is not found: #{username}")
@@ -40,25 +51,13 @@ def execute!
@@ -40,25 +51,13 @@ def execute!
result = assign!(user_to_be_assigned)
result = assign!(user_to_be_assigned)
if result[:errors].empty?
if result[:errors].include?("NO_SEATS_AVAILABLE")
log_success_assignment(result[:user])
log_no_seats_avilable(result, username)
else
break
log_failed_assignment("Failed to assign seat to user: #{username}, Errors: #{result[:errors]}")
if result[:errors].include?("NO_SEATS_AVAILABLE")
failed_assignments << "##No seats are left; users starting from @#{username} onwards were not assigned.##"
break
end
end
end
end
{ success_assignments: success_assignments, failed_assignments: failed_assignments }
end
private
log_result(result, username)
end
def find_user_by_username(username)
User.find_by(username: username)
end
end
def assign!(user)
def assign!(user)
@@ -67,20 +66,28 @@ def assign!(user)
@@ -67,20 +66,28 @@ def assign!(user)
user: user
user: user
).execute
).execute
if create_service.success?
{ errors: create_service.errors }
{ user: user, errors: create_service.errors }
else
{ errors: create_service.errors }
end
end
end
def log_success_assignment(user)
def log_no_seats_avilable(result, username)
success_assignments << "User assigned: #{user.username}"
log_failed_assignment("Failed to assign seat to user: #{username}, Errors: #{result[:errors]}")
 
log_failed_assignment("##No seats are left; users starting from @#{username} onwards were not assigned.##")
 
end
 
 
def log_success_assignment(username)
 
success_assignments << "User assigned: #{username}"
end
end
def log_failed_assignment(message)
def log_failed_assignment(message)
failed_assignments << message
failed_assignments << message
end
end
# rubocop: enable CodeReuse/ActiveRecord
 
def log_result(result, username)
 
if result[:errors].empty?
 
log_success_assignment(username)
 
else
 
log_failed_assignment("Failed to assign seat to user: #{username}, Errors: #{result[:errors]}")
 
end
 
end
end
end
end
end
Loading