Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/group.rb')
-rw-r--r--app/models/group.rb53
1 files changed, 53 insertions, 0 deletions
diff --git a/app/models/group.rb b/app/models/group.rb
index 71f58a5fd1a..c38ddbdf6fb 100644
--- a/app/models/group.rb
+++ b/app/models/group.rb
@@ -18,6 +18,8 @@ class Group < Namespace
ACCESS_REQUEST_APPROVERS_TO_BE_NOTIFIED_LIMIT = 10
+ UpdateSharedRunnersError = Class.new(StandardError)
+
has_many :group_members, -> { where(requested_at: nil) }, dependent: :destroy, as: :source # rubocop:disable Cop/ActiveRecordDependent
alias_method :members, :group_members
has_many :users, through: :group_members
@@ -89,6 +91,8 @@ class Group < Namespace
scope :with_users, -> { includes(:users) }
+ scope :by_id, ->(groups) { where(id: groups) }
+
class << self
def sort_by_attribute(method)
if method == 'storage_size_desc'
@@ -504,6 +508,55 @@ class Group < Namespace
preloader.preload(self, shared_with_group_links: [shared_with_group: :route])
end
+ def shared_runners_allowed?
+ shared_runners_enabled? || allow_descendants_override_disabled_shared_runners?
+ end
+
+ def parent_allows_shared_runners?
+ return true unless has_parent?
+
+ parent.shared_runners_allowed?
+ end
+
+ def parent_enabled_shared_runners?
+ return true unless has_parent?
+
+ parent.shared_runners_enabled?
+ end
+
+ def enable_shared_runners!
+ raise UpdateSharedRunnersError, 'Shared Runners disabled for the parent group' unless parent_enabled_shared_runners?
+
+ update_column(:shared_runners_enabled, true)
+ end
+
+ def disable_shared_runners!
+ group_ids = self_and_descendants
+ return if group_ids.empty?
+
+ Group.by_id(group_ids).update_all(shared_runners_enabled: false)
+
+ all_projects.update_all(shared_runners_enabled: false)
+ end
+
+ def allow_descendants_override_disabled_shared_runners!
+ raise UpdateSharedRunnersError, 'Shared Runners enabled' if shared_runners_enabled?
+ raise UpdateSharedRunnersError, 'Group level shared Runners not allowed' unless parent_allows_shared_runners?
+
+ update_column(:allow_descendants_override_disabled_shared_runners, true)
+ end
+
+ def disallow_descendants_override_disabled_shared_runners!
+ raise UpdateSharedRunnersError, 'Shared Runners enabled' if shared_runners_enabled?
+
+ group_ids = self_and_descendants
+ return if group_ids.empty?
+
+ Group.by_id(group_ids).update_all(allow_descendants_override_disabled_shared_runners: false)
+
+ all_projects.update_all(shared_runners_enabled: false)
+ end
+
private
def update_two_factor_requirement