Skip to content

Commit b09ebc1

Browse files
committed
update tests and add a bit more logging
1 parent 17053cc commit b09ebc1

File tree

2 files changed

+183
-136
lines changed

2 files changed

+183
-136
lines changed

lib/entitlements/backend/github_team/service.rb

Lines changed: 56 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ class TeamNotFound < RuntimeError; end
3232
ou: String,
3333
ignore_not_found: C::Maybe[C::Bool],
3434
] => C::Any
35-
def initialize(addr: nil, org:, token:, ou:, ignore_not_found: false)
35+
def initialize(org:, token:, ou:, addr: nil, ignore_not_found: false)
3636
super
3737
Entitlements.cache[:github_team_members] ||= {}
3838
Entitlements.cache[:github_team_members][org_signature] ||= {}
@@ -107,8 +107,8 @@ def read_team(entitlement_group)
107107
end
108108

109109
maintainers = teamdata[:members].select { |u| teamdata[:roles][u] == "maintainer" }
110-
team_metadata = team_metadata || {}
111-
team_metadata = team_metadata.merge({"team_maintainers" => maintainers.any? ? maintainers.join(",") : nil})
110+
team_metadata ||= {}
111+
team_metadata = team_metadata.merge({ "team_maintainers" => maintainers.any? ? maintainers.join(",") : nil })
112112

113113
team = Entitlements::Backend::GitHubTeam::Models::Team.new(
114114
team_id: teamdata[:team_id],
@@ -139,7 +139,7 @@ def read_team(entitlement_group)
139139
def from_predictive_cache?(entitlement_group)
140140
team_identifier = entitlement_group.cn.downcase
141141
read_team(entitlement_group) unless @team_cache[team_identifier]
142-
(@team_cache[team_identifier] && @team_cache[team_identifier][:cache]) ? true : false
142+
@team_cache[team_identifier] && @team_cache[team_identifier][:cache] ? true : false
143143
end
144144

145145
# Declare the entry to be invalid for a specific team, and if the prior knowledge
@@ -192,7 +192,7 @@ def sync_team(desired_state, current_state)
192192
if desired_metadata["parent_team_name"].nil?
193193
Entitlements.logger.debug "sync_team(team=#{current_state.team_name}): IGNORING GitHub Parent Team DELETE"
194194
else
195-
# :nocov:
195+
# :nocov:
196196
Entitlements.logger.debug "sync_team(#{current_state.team_name}=#{current_state.team_id}): Parent team change found - From #{current_metadata["parent_team_name"] || "No Parent Team"} to #{desired_metadata["parent_team_name"]}"
197197
desired_parent_team_id = team_by_name(org_name: org, team_name: desired_metadata["parent_team_name"])[:id]
198198
unless desired_parent_team_id.nil?
@@ -240,17 +240,20 @@ def sync_team(desired_state, current_state)
240240
Entitlements.logger.debug "sync_team(#{current_state.team_name}=#{current_state.team_id}): Textual change but no semantic change in maintainers. It is remains: #{current_maintainers.to_a}."
241241
else
242242
Entitlements.logger.debug "sync_team(#{current_state.team_name}=#{current_state.team_id}): Maintainer members change found - From #{current_maintainers.to_a} to #{desired_maintainers.to_a}"
243-
added_maintainers.select! { |username| add_user_to_team(user: username, team: current_state, role: "maintainer") }
243+
added_maintainers.select! do |username|
244+
add_user_to_team(user: username, team: current_state, role: "maintainer")
245+
end
244246

245247
## We only touch previous maintainers who are actually still going to be members of the team
246248
removed_maintainers = removed_maintainers.intersection(desired_team_members)
247249
## Downgrade membership to default (role: "member")
248-
removed_maintainers.select! { |username| add_user_to_team(user: username, team: current_state, role: "member") }
250+
removed_maintainers.select! do |username|
251+
add_user_to_team(user: username, team: current_state, role: "member")
252+
end
249253
end
250254
end
251255
end
252256

253-
254257
Entitlements.logger.debug "sync_team(#{current_state.team_name}=#{current_state.team_id}): Added #{added_members.count}, removed #{removed_members.count}"
255258
added_members.any? || removed_members.any? || added_maintainers.any? || removed_maintainers.any? || changed_parent_team
256259
end
@@ -264,39 +267,41 @@ def sync_team(desired_state, current_state)
264267
entitlement_group: Entitlements::Models::Group,
265268
] => C::Bool
266269
def create_team(entitlement_group:)
270+
team_name = entitlement_group.cn.downcase
271+
team_options = { name: team_name, repo_names: [], privacy: "closed" }
272+
267273
begin
268-
team_name = entitlement_group.cn.downcase
269-
team_options = { name: team_name, repo_names: [], privacy: "closed" }
274+
entitlement_metadata = entitlement_group.metadata
275+
unless entitlement_metadata["parent_team_name"].nil?
270276

271-
begin
272-
entitlement_metadata = entitlement_group.metadata
273-
unless entitlement_metadata["parent_team_name"].nil?
274-
275-
begin
276-
parent_team_data = graphql_team_data(entitlement_metadata["parent_team_name"])
277-
team_options[:parent_team_id] = parent_team_data[:team_id]
278-
rescue TeamNotFound
279-
# if the parent team does not exist, create it (think `mkdir -p` logic here)
280-
result = octokit.create_team(
281-
org,
282-
{ name: entitlement_metadata["parent_team_name"], repo_names: [], privacy: "closed" }
283-
)
284-
team_options[:parent_team_id] = result[:id]
285-
end
277+
begin
278+
parent_team_data = graphql_team_data(entitlement_metadata["parent_team_name"])
279+
team_options[:parent_team_id] = parent_team_data[:team_id]
280+
rescue TeamNotFound
281+
# if the parent team does not exist, create it (think `mkdir -p` logic here)
282+
result = octokit.create_team(
283+
org,
284+
{ name: entitlement_metadata["parent_team_name"], repo_names: [], privacy: "closed" }
285+
)
286+
287+
Entitlements.logger.debug "created parent team #{entitlement_metadata["parent_team_name"]} with id #{result[:id]}"
286288

287-
Entitlements.logger.debug "create_team(team=#{team_name}) Parent team #{entitlement_metadata["parent_team_name"]} with id #{parent_team_data[:team_id]} found"
289+
team_options[:parent_team_id] = result[:id]
288290
end
289-
rescue Entitlements::Models::Group::NoMetadata
290-
Entitlements.logger.debug "create_team(team=#{team_name}) No metadata found"
291-
end
292291

293-
Entitlements.logger.debug "create_team(team=#{team_name})"
294-
octokit.create_team(org, team_options)
295-
true
296-
rescue Octokit::UnprocessableEntity => e
297-
Entitlements.logger.debug "create_team(team=#{team_name}) ERROR - #{e.message}"
298-
false
292+
Entitlements.logger.debug "create_team(team=#{team_name}) Parent team #{entitlement_metadata["parent_team_name"]} with id #{team_options[:parent_team_id]} found"
293+
end
294+
rescue Entitlements::Models::Group::NoMetadata
295+
Entitlements.logger.debug "create_team(team=#{team_name}) No metadata found"
299296
end
297+
298+
Entitlements.logger.debug "create_team(team=#{team_name})"
299+
result = octokit.create_team(org, team_options)
300+
Entitlements.logger.debug "created team #{team_name} with id #{result[:id]}"
301+
true
302+
rescue Octokit::UnprocessableEntity => e
303+
Entitlements.logger.debug "create_team(team=#{team_name}) ERROR - #{e.message}"
304+
false
300305
end
301306

302307
# Update a team
@@ -309,15 +314,14 @@ def create_team(entitlement_group:)
309314
metadata: C::Or[Hash, nil]
310315
] => C::Bool
311316
def update_team(team:, metadata: {})
312-
begin
313-
Entitlements.logger.debug "update_team(team=#{team.team_name})"
314-
options = { name: team.team_name, repo_names: [], privacy: "closed", parent_team_id: metadata[:parent_team_id] }
315-
octokit.update_team(team.team_id, options)
316-
true
317-
rescue Octokit::UnprocessableEntity => e
318-
Entitlements.logger.debug "update_team(team=#{team.team_name}) ERROR - #{e.message}"
319-
false
320-
end
317+
Entitlements.logger.debug "update_team(team=#{team.team_name})"
318+
options = { name: team.team_name, repo_names: [], privacy: "closed",
319+
parent_team_id: metadata[:parent_team_id] }
320+
octokit.update_team(team.team_id, options)
321+
true
322+
rescue Octokit::UnprocessableEntity => e
323+
Entitlements.logger.debug "update_team(team=#{team.team_name}) ERROR - #{e.message}"
324+
false
321325
end
322326

323327
# Gets a team by name
@@ -343,7 +347,8 @@ def team_by_name(org_name:, team_name:)
343347
# team_slug - Identifier of the team to retrieve.
344348
#
345349
# Returns a data structure with team data.
346-
Contract String => { members: C::ArrayOf[String], team_id: Integer, parent_team_name: C::Or[String, nil], roles: C::HashOf[String => String] }
350+
Contract String => { members: C::ArrayOf[String], team_id: Integer, parent_team_name: C::Or[String, nil],
351+
roles: C::HashOf[String => String] }
347352
def graphql_team_data(team_slug)
348353
cursor = nil
349354
team_id = nil
@@ -381,9 +386,7 @@ def graphql_team_data(team_slug)
381386
end
382387

383388
team = response[:data].fetch("data").fetch("organization").fetch("team")
384-
if team.nil?
385-
raise TeamNotFound, "Requested team #{team_slug} does not exist in #{org}!"
386-
end
389+
raise TeamNotFound, "Requested team #{team_slug} does not exist in #{org}!" if team.nil?
387390

388391
team_id = team.fetch("databaseId")
389392
parent_team_name = team.dig("parentTeam", "slug")
@@ -401,6 +404,7 @@ def graphql_team_data(team_slug)
401404

402405
cursor = edges.last.fetch("cursor")
403406
next if cursor && buffer.size == max_graphql_results
407+
404408
break
405409
end
406410

@@ -426,6 +430,7 @@ def validate_team_id_and_slug!(team_id, team_slug)
426430
team_data[:slug]
427431
end
428432
return if @validation_cache[team_id] == team_slug
433+
429434
raise "validate_team_id_and_slug! mismatch: team_id=#{team_id} expected=#{team_slug.inspect} got=#{@validation_cache[team_id].inspect}"
430435
end
431436

@@ -443,10 +448,11 @@ def validate_team_id_and_slug!(team_id, team_slug)
443448
] => C::Bool
444449
def add_user_to_team(user:, team:, role: "member")
445450
return false unless org_members.include?(user.downcase)
446-
unless role == "member" || role == "maintainer"
451+
unless ["member", "maintainer"].include?(role)
447452
# :nocov:
448453
raise "add_user_to_team role mismatch: team_id=#{team.team_id} user=#{user} expected role=maintainer/member got=#{role}"
449454
end
455+
450456
Entitlements.logger.debug "#{identifier} add_user_to_team(user=#{user}, org=#{org}, team_id=#{team.team_id}, role=#{role})"
451457
validate_team_id_and_slug!(team.team_id, team.team_name)
452458

@@ -473,6 +479,7 @@ def add_user_to_team(user:, team:, role: "member")
473479
] => C::Bool
474480
def remove_user_from_team(user:, team:)
475481
return false unless org_members.include?(user.downcase)
482+
476483
Entitlements.logger.debug "#{identifier} remove_user_from_team(user=#{user}, org=#{org}, team_id=#{team.team_id})"
477484
validate_team_id_and_slug!(team.team_id, team.team_name)
478485
octokit.remove_team_membership(team.team_id, user)

0 commit comments

Comments
 (0)