CI: Use latest actions and reusable workflows
[releng/lftools.git] / lftools / github_helper.py
1 # SPDX-License-Identifier: EPL-1.0
2 ##############################################################################
3 # Copyright (c) 2019 The Linux Foundation and others.
4 #
5 # All rights reserved. This program and the accompanying materials
6 # are made available under the terms of the Eclipse Public License v1.0
7 # which accompanies this distribution, and is available at
8 # http://www.eclipse.org/legal/epl-v10.html
9 ##############################################################################
10 """Github stub."""
11
12 from __future__ import print_function
13
14 import logging
15 import sys
16
17 from github import Github, GithubException
18
19 from lftools import config
20
21 log = logging.getLogger(__name__)
22
23
24 def helper_list(ctx, organization, repos, audit, full, teams, team, repofeatures):
25     """List options for github org repos."""
26     # Optionally pick token based on gitub org
27
28     if config.has_section("github"):
29         token = config.get_setting("github", "token")
30     else:
31         section = "github.{}".format(organization)
32         token = config.get_setting(section, "token")
33
34     g = Github(token)
35     orgName = organization
36
37     try:
38         org = g.get_organization(orgName)
39     except GithubException as ghe:
40         log.error(ghe)
41
42     # Extend this to check if a repo exists
43     if repos:
44         print("All repos for organization: ", orgName)
45         repos = org.get_repos()
46         for repo in repos:
47             log.info(repo.name)
48
49     if audit:
50         log.info("{} members without 2fa:".format(orgName))
51         try:
52             members = org.get_members(filter_="2fa_disabled")
53         except GithubException as ghe:
54             log.error(ghe)
55         for member in members:
56             log.info(member.login)
57         log.info("{} outside collaborators without 2fa:".format(orgName))
58         try:
59             collaborators = org.get_outside_collaborators(filter_="2fa_disabled")
60         except GithubException as ghe:
61             log.error(ghe)
62         for collaborator in collaborators:
63             log.info(collaborator.login)
64
65     if repofeatures:
66         repos = org.get_repos()
67         for repo in repos:
68             log.info("{} wiki:{} issues:{}".format(repo.name, repo.has_wiki, repo.has_issues))
69             issues = repo.get_issues
70             for issue in issues():
71                 log.info("{}".format(issue))
72
73     if full:
74         log.info("---")
75         log.info("#  All owners for {}:".format(orgName))
76         log.info("{}-owners:".format(orgName))
77
78         try:
79             members = org.get_members(role="admin")
80         except GithubException as ghe:
81             log.error(ghe)
82         for member in members:
83             log.info("  - '{}'".format(member.login))
84         log.info("#  All members for {}".format(orgName))
85         log.info("{}-members:".format(orgName))
86
87         try:
88             members = org.get_members()
89         except GithubException as ghe:
90             log.error(ghe)
91         for member in members:
92             log.info("  - '{}'".format(member.login))
93         log.info("#  All members and all teams for {}".format(orgName))
94
95         try:
96             teams = org.get_teams
97         except GithubException as ghe:
98             log.error(ghe)
99         for team in teams():
100             log.info("{}:".format(team.name))
101             for user in team.get_members():
102                 log.info("  - '{}'".format(user.login))
103             log.info("")
104         teams = None
105
106     if teams:
107         try:
108             teams = org.get_teams
109         except GithubException as ghe:
110             log.error(ghe)
111         for team in teams():
112             log.info("{}".format(team.name))
113
114     if team:
115         try:
116             teams = org.get_teams
117         except GithubException as ghe:
118             log.error(ghe)
119
120         team_members = []
121
122         for t in teams():
123             if t.name == team:
124                 log.info("{}".format(t.name))
125                 for user in t.get_members():
126                     team_members.append(user.login)
127                     log.info("  - '{}'".format(user.login))
128
129         return team_members
130
131
132 def prvotes(organization, repo, pr):
133     """Get votes on a github pr."""
134     token = config.get_setting("github", "token")
135     g = Github(token)
136     orgName = organization
137     try:
138         org = g.get_organization(orgName)
139     except GithubException as ghe:
140         log.error(ghe)
141
142     repo = org.get_repo(repo)
143     approval_list = []
144     author = repo.get_pull(pr).user.login
145     approval_list.append(author)
146
147     pr_mergable = repo.get_pull(pr).mergeable
148     log.info("MERGEABLE: {}".format(pr_mergable))
149
150     approvals = repo.get_pull(pr).get_reviews()
151     for approve in approvals:
152         if approve.state == ("APPROVED"):
153             approval_list.append(approve.user.login)
154     return approval_list
155
156
157 def helper_user_github(ctx, organization, user, team, delete, admin):
158     """Add and Remove users from an org team."""
159     token = config.get_setting("github", "token")
160     g = Github(token)
161     orgName = organization
162     try:
163         org = g.get_organization(orgName)
164     except GithubException as ghe:
165         log.error(ghe)
166     try:
167         user_object = g.get_user(user)
168         log.info(user_object)
169     except GithubException as ghe:
170         log.error(ghe)
171         log.info("user {} not found".format(user))
172         sys.exit(1)
173     # check if user is a member
174     try:
175         is_member = org.has_in_members(user_object)
176         log.info("Is {} a member of org {}".format(user, is_member))
177     except GithubException as ghe:
178         log.error(ghe)
179     # get teams
180     try:
181         teams = org.get_teams
182     except GithubException as ghe:
183         log.error(ghe)
184
185     # set team to proper object
186     my_teams = [team]
187     this_team = [team for team in teams() if team.name in my_teams]
188     for t in this_team:
189         team_id = t.id
190     team = org.get_team(team_id)
191     teams = []
192     teams.append(team)
193
194     if delete:
195         if is_member:
196             try:
197                 team.remove_membership(user_object)
198             except GithubException as ghe:
199                 log.error(ghe)
200             log.info("Removing user {} from {}".format(user_object, team))
201         else:
202             log.info("{} is not a member of org cannot delete".format(user))
203             # TODO add revoke invite
204             log.info("Code does not handle revoking invitations.")
205
206     if user and not delete:
207         if admin and is_member:
208             try:
209                 team.add_membership(member=user_object, role="maintainer")
210             except GithubException as ghe:
211                 log.error(ghe)
212         if admin and not is_member:
213             try:
214                 org.invite_user(user=user_object, role="admin", teams=teams)
215             except GithubException as ghe:
216                 log.error(ghe)
217             log.info("Sending Admin invite to {} for {}".format(user_object, team))
218
219         if not admin and is_member:
220             try:
221                 team.add_membership(member=user_object, role="member")
222             except GithubException as ghe:
223                 log.error(ghe)
224
225         if not admin and not is_member:
226             try:
227                 org.invite_user(user=user_object, teams=teams)
228             except GithubException as ghe:
229                 log.error(ghe)
230             log.info("Sending invite to {} for {}".format(user_object, team))