Skip to content

Commit a8fab7e

Browse files
authored
Merge pull request #23 from chrisgavin/fix-maintainer-sync
Fix syncing team maintainers.
2 parents 2a367f8 + a3ecee9 commit a8fab7e

File tree

7 files changed

+134
-30
lines changed

7 files changed

+134
-30
lines changed

lib/entitlements/backend/github_team/provider.rb

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,23 @@ def diff_existing_updated_metadata(existing_group, group, base_diff)
198198
Entitlements.logger.info "CHANGE github_parent_team from #{existing_parent_team} to #{changed_parent_team} for #{existing_group.dn} in #{github.org}"
199199
end
200200
end
201+
202+
existing_maintainers = existing_group.metadata_fetch_if_exists("team_maintainers")
203+
changed_maintainers = group.metadata_fetch_if_exists("team_maintainers")
204+
if existing_maintainers != changed_maintainers
205+
base_diff[:metadata] ||= {}
206+
if existing_maintainers.nil? && !changed_maintainers.nil?
207+
base_diff[:metadata][:team_maintainers] = "add"
208+
Entitlements.logger.info "ADD github_team_maintainers #{changed_maintainers} to #{existing_group.dn} in #{github.org}"
209+
elsif !existing_maintainers.nil? && changed_maintainers.nil?
210+
base_diff[:metadata][:team_maintainers] = "remove"
211+
Entitlements.logger.info "REMOVE (NOOP) github_team_maintainers #{existing_maintainers} from #{existing_group.dn} in #{github.org}"
212+
else
213+
base_diff[:metadata][:team_maintainers] = "change"
214+
Entitlements.logger.info "CHANGE github_team_maintainers from #{existing_maintainers} to #{changed_maintainers} for #{existing_group.dn} in #{github.org}"
215+
end
216+
end
217+
201218
base_diff
202219
end
203220

lib/entitlements/backend/github_team/service.rb

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,10 @@ def read_team(entitlement_group)
104104
end
105105
end
106106

107+
maintainers = teamdata[:members].select { |u| teamdata[:roles][u] == "maintainer" }
108+
team_metadata = team_metadata || {}
109+
team_metadata = team_metadata.merge({"team_maintainers" => maintainers.any? ? maintainers.join(",") : nil})
110+
107111
team = Entitlements::Backend::GitHubTeam::Models::Team.new(
108112
team_id: teamdata[:team_id],
109113
team_name: team_identifier,
@@ -326,11 +330,12 @@ def team_by_name(org_name:, team_name:)
326330
# team_slug - Identifier of the team to retrieve.
327331
#
328332
# Returns a data structure with team data.
329-
Contract String => { members: C::ArrayOf[String], team_id: Integer, parent_team_name: C::Or[String, nil] }
333+
Contract String => { members: C::ArrayOf[String], team_id: Integer, parent_team_name: C::Or[String, nil], roles: C::HashOf[String => String] }
330334
def graphql_team_data(team_slug)
331335
cursor = nil
332336
team_id = nil
333337
result = []
338+
roles = {}
334339
sanity_counter = 0
335340

336341
while sanity_counter < 100
@@ -348,6 +353,7 @@ def graphql_team_data(team_slug)
348353
node {
349354
login
350355
}
356+
role
351357
cursor
352358
}
353359
}
@@ -375,12 +381,17 @@ def graphql_team_data(team_slug)
375381
buffer = edges.map { |e| e.fetch("node").fetch("login").downcase }
376382
result.concat buffer
377383

384+
edges.each do |e|
385+
role = e.fetch("role").downcase
386+
roles[e.fetch("node").fetch("login").downcase] = role
387+
end
388+
378389
cursor = edges.last.fetch("cursor")
379390
next if cursor && buffer.size == max_graphql_results
380391
break
381392
end
382393

383-
{ members: result, team_id:, parent_team_name: }
394+
{ members: result, team_id:, parent_team_name:, roles: }
384395
end
385396

386397
# Ensure that the given team ID actually matches up to the team slug on GitHub. This is in place

spec/acceptance/github-server/web.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ def graphql_team_query(query)
7373
cursor_flag = cursor.nil?
7474
members.each do |m|
7575
next if !cursor_flag && Base64.strict_encode64(m) != cursor
76-
edges << { "node" => { "login" => m }, "cursor" => Base64.strict_encode64(m) } if cursor_flag
76+
edges << { "node" => { "login" => m }, "role" => "MEMBER", "cursor" => Base64.strict_encode64(m) } if cursor_flag
7777
cursor_flag = true
7878
break if edges.size >= first
7979
end

spec/acceptance/tests/01_basic_webserver_github_connectivity_spec.rb

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
node {
5252
login
5353
}
54+
role
5455
cursor
5556
}
5657
},
@@ -78,13 +79,13 @@
7879
"databaseId" => 6,
7980
"members" => {
8081
"edges" => [
81-
{ "node" => { "login" => "cheetoh" }, "cursor" => "Y2hlZXRvaA==" },
82-
{ "node" => { "login" => "khaomanee" }, "cursor" => "a2hhb21hbmVl" },
83-
{ "node" => { "login" => "nebelung" }, "cursor" => "bmViZWx1bmc=" },
84-
{ "node" => { "login" => "ojosazules" }, "cursor" => "b2pvc2F6dWxlcw==" }
82+
{ "node" => { "login" => "cheetoh" }, "role" => "MEMBER", "cursor" => "Y2hlZXRvaA==" },
83+
{ "node" => { "login" => "khaomanee" }, "role" => "MEMBER", "cursor" => "a2hhb21hbmVl" },
84+
{ "node" => { "login" => "nebelung" }, "role" => "MEMBER", "cursor" => "bmViZWx1bmc=" },
85+
{ "node" => { "login" => "ojosazules" }, "role" => "MEMBER", "cursor" => "b2pvc2F6dWxlcw==" }
8586
]
8687
},
87-
"parentTeam" => { "slug" => nil }
88+
"parentTeam" => { "slug" => nil },
8889
}
8990
}
9091
}

spec/unit/entitlements/backend/github_team/provider_spec.rb

Lines changed: 71 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
expect(logger).to receive(:debug).with("Loaded cn=grumpy-cats,ou=kittensinc,ou=GitHub,dc=github,dc=fake (id=1001) with 3 member(s)")
141141

142142
allow(subject).to receive(:github).and_return(github)
143-
expect(github).to receive(:graphql_team_data).with(team_identifier).and_return(members: old_members, team_id: 1001, parent_team_name: nil)
143+
expect(github).to receive(:graphql_team_data).with(team_identifier).and_return(members: old_members, team_id: 1001, parent_team_name: nil, roles: Hash[*old_members.collect { |u| [u, "member"] }.flatten])
144144

145145
expect(subject.diff(group)).to eq(empty_result)
146146
end
@@ -153,7 +153,7 @@
153153
cache[:predictive_state] = { by_dn: { team_dn => { members: old_members, metadata: nil } }, invalid: Set.new }
154154

155155
allow(subject).to receive(:github).and_return(github)
156-
expect(github).to receive(:graphql_team_data).with(team_identifier).and_return(members: old_members, team_id: 1001, parent_team_name: nil)
156+
expect(github).to receive(:graphql_team_data).with(team_identifier).and_return(members: old_members, team_id: 1001, parent_team_name: nil, roles: Hash[*old_members.collect { |u| [u, "member"] }.flatten])
157157

158158
expect(subject.diff(group)).to eq(added: Set.new(%w[mainecoon]), removed: Set.new(%w[russianblue]))
159159
end
@@ -360,6 +360,75 @@
360360
metadata: { parent_team: "remove" }
361361
)
362362
end
363+
364+
it "diffs team maintainers change" do
365+
entitlements_group = Entitlements::Models::Group.new(
366+
dn: "cn=diff-cats,ou=Github,dc=github,dc=fake",
367+
members: Set.new(%w[cuddles fluffy morris WHISKERS].map { |u| "uid=#{u},ou=People,dc=kittens,dc=net" }),
368+
metadata: { "team_maintainers" => "cuddles" }
369+
)
370+
371+
github_team = Entitlements::Backend::GitHubTeam::Models::Team.new(
372+
team_id: 2222,
373+
team_name: "diff-cats",
374+
members: Set.new(%w[cuddles fluffy morris WHISKERS].map { |u| "uid=#{u},ou=People,dc=kittens,dc=net" }),
375+
ou: "ou=kittensinc,ou=GitHub,dc=github,dc=fake",
376+
metadata: { "team_maintainers" => "cuddles,fluffy" }
377+
)
378+
379+
result = subject.diff_existing_updated(entitlements_group, github_team)
380+
expect(result).to eq(
381+
added: Set.new,
382+
removed: Set.new,
383+
metadata: { team_maintainers: "change" }
384+
)
385+
end
386+
387+
it "diffs team maintainers add" do
388+
entitlements_group = Entitlements::Models::Group.new(
389+
dn: "cn=diff-cats,ou=Github,dc=github,dc=fake",
390+
members: Set.new(%w[cuddles fluffy morris WHISKERS].map { |u| "uid=#{u},ou=People,dc=kittens,dc=net" }),
391+
metadata: { }
392+
)
393+
394+
github_team = Entitlements::Backend::GitHubTeam::Models::Team.new(
395+
team_id: 2222,
396+
team_name: "diff-cats",
397+
members: Set.new(%w[cuddles fluffy morris WHISKERS].map { |u| "uid=#{u},ou=People,dc=kittens,dc=net" }),
398+
ou: "ou=kittensinc,ou=GitHub,dc=github,dc=fake",
399+
metadata: { "team_maintainers" => "cuddles,fluffy" }
400+
)
401+
402+
result = subject.diff_existing_updated(entitlements_group, github_team)
403+
expect(result).to eq(
404+
added: Set.new,
405+
removed: Set.new,
406+
metadata: { team_maintainers: "add" }
407+
)
408+
end
409+
410+
it "diffs team maintainers removal" do
411+
entitlements_group = Entitlements::Models::Group.new(
412+
dn: "cn=diff-cats,ou=Github,dc=github,dc=fake",
413+
members: Set.new(%w[cuddles fluffy morris WHISKERS].map { |u| "uid=#{u},ou=People,dc=kittens,dc=net" }),
414+
metadata: { "team_maintainers" => "cuddles,fluffy" }
415+
)
416+
417+
github_team = Entitlements::Backend::GitHubTeam::Models::Team.new(
418+
team_id: 2222,
419+
team_name: "diff-cats",
420+
members: Set.new(%w[cuddles fluffy morris WHISKERS].map { |u| "uid=#{u},ou=People,dc=kittens,dc=net" }),
421+
ou: "ou=kittensinc,ou=GitHub,dc=github,dc=fake",
422+
metadata: { }
423+
)
424+
425+
result = subject.diff_existing_updated(entitlements_group, github_team)
426+
expect(result).to eq(
427+
added: Set.new,
428+
removed: Set.new,
429+
metadata: { team_maintainers: "remove" }
430+
)
431+
end
363432
end
364433

365434
describe "#create_github_team_group" do

0 commit comments

Comments
 (0)