Skip to content

Commit

Permalink
Merge pull request #385 from kikkomep/fix/ghapp-repo-owner-identifica…
Browse files Browse the repository at this point in the history
…tion

feat: extend automatic workflow registration to all members of the GH organisation
  • Loading branch information
kikkomep authored Mar 13, 2024
2 parents 23019d9 + 8dbda57 commit 8286a4f
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 34 deletions.
29 changes: 23 additions & 6 deletions lifemonitor/integrations/github/controllers.py
Original file line number Diff line number Diff line change
Expand Up @@ -423,11 +423,17 @@ def create(event: GithubEvent):
logger.warning("Is Tag: %r", repo_info.tag)
logger.warning("Is Branch: %r", repo_info.branch)

# workflow submitter
submitter = services.identify_workflow_version_submitter(event.repository_reference)
if not submitter:
logger.warning("Unable to identify the submitter of the workflow version")
return

if repo_info.branch:
try:
__check_for_issues_and_register__(repo_info,
event.sender.user.github_settings,
event.sender.user.registry_settings,
submitter.github_settings,
submitter.registry_settings,
True)
except Exception as e:
logger.exception(e)
Expand Down Expand Up @@ -457,10 +463,16 @@ def delete(event: GithubEvent):
logger.warning("Is Tag: %s", repo_info.tag)
logger.warning("Is Branch: %s", repo_info.branch)

# workflow submitter
submitter = services.identify_workflow_version_submitter(event.repository_reference)
if not submitter:
logger.warning("Unable to identify the submitter of the workflow version")
return

if repo_info.tag or repo_info.branch:
try:
workflow_version = services.delete_repository_workflow_version(repo_info,
registries=event.sender.user.registry_settings.registries)
registries=submitter.registry_settings.registries)
if workflow_version:
__notify_workflow_version_event__(repo_info, workflow_version, action='deleted')
except Exception as e:
Expand Down Expand Up @@ -490,12 +502,17 @@ def push(event: GithubEvent):
logger.debug("Tree: %r", repo.trees_url)
logger.debug("Commit: %r", repo.rev)

# workflow submitter
submitter = services.identify_workflow_version_submitter(event.repository_reference)
if not submitter:
logger.warning("Unable to identify the submitter of the workflow version")
return

if not repo_info.ref or repo_info.deleted:
logger.debug("Repo ref not defined or branch/tag deleted: %r", repo)
else:
settings: GithubUserSettings = event.sender.user.github_settings
__check_for_issues_and_register__(repo_info, settings,
event.sender.user.registry_settings, True)
__check_for_issues_and_register__(repo_info, submitter.github_settings,
submitter.registry_settings, True)

return "No content", 204
except Exception as e:
Expand Down
61 changes: 33 additions & 28 deletions lifemonitor/integrations/github/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,16 +104,46 @@ def __get_registries_map__(w: Workflow, registries: List[str]):


def find_workflow_version(repository_reference: GithubRepositoryReference) -> Tuple[Workflow, WorkflowVersion]:
# found the existing workflow associated with repo
# get a reference to the github workflow registry for this installation
github_registry: GithubWorkflowRegistry = repository_reference.event.installation.github_registry
# find the workflow
workflow_version = None
workflow = github_registry.find_workflow(repository_reference.repository.full_name)
if workflow:
# get the workflow version (the one associated with the branch or tag of the repository)
workflow_version = workflow.versions.get(repository_reference.branch or repository_reference.tag, None)
logger.debug("Found workflow version: %r", workflow_version)
return workflow, workflow_version


def identify_workflow_version_submitter(repository_reference: GithubRepositoryReference) -> User:
""" Identify the submitter of the workflow version.
The submitter is the user who trigger a github event on the repository.
If the "sender" of the event is not a LifeMonitor user, the submitter is the user who triggered the event
for the registration of the first workflow version (e.g., the user who registered the LifeMonitor Github app on the github repository).
"""
# search user identity
submitter = None
try:
identity: OAuthIdentity = repository_reference.event.sender
submitter = identity.user
logger.debug("Found a Github identity for the sender %r --> %r, %r", repository_reference.event.sender, identity, submitter)
except OAuthIdentityNotFoundException as e:
logger.warning("Github identity of the sender '%r' doesn't match with any LifeMonitor user identity", repository_reference.owner_id)
if logger.isEnabledFor(logging.DEBUG):
logger.exception(e)

# fallback the submitter to the original submitter of the workflow
# (i.e., the user who registered the LifeMonitor Github app on the github repository)
if not submitter:
# get the workflow
workflow, _ = find_workflow_version(repository_reference)
if workflow:
submitter = workflow.earliest_version.submitter

return submitter


def register_repository_workflow(repository_reference: GithubRepositoryReference, registries: List[str] = None) -> WorkflowVersion:
logger.debug("Repository ref: %r", repository_reference)
# set a reference to LifeMonitorService
Expand All @@ -139,15 +169,7 @@ def register_repository_workflow(repository_reference: GithubRepositoryReference
workflow_version = repository_reference.branch or repository_reference.tag

# search user identity
submitter = None
try:
identity: OAuthIdentity = repository_reference.event.sender
submitter = identity.user
logger.debug("Found a Github identity for the sender %r --> %r, %r", repository_reference.event.sender, identity, submitter)
except OAuthIdentityNotFoundException as e:
logger.warning("Github identity of the sender '%r' doesn't match with any LifeMonitor user identity", repository_reference.owner_id)
if logger.isEnabledFor(logging.DEBUG):
logger.exception(e)
submitter = identify_workflow_version_submitter(repository_reference)

# set the repo link
repo_link = f"{hosting_service.uri}/{repo.full_name}.git"
Expand All @@ -158,11 +180,6 @@ def register_repository_workflow(repository_reference: GithubRepositoryReference
if workflow:
logger.debug("Found workflow associated with the repo: %r", workflow)

# fallback the submitter to the original submitter of the workflow
# (i.e., the user who registered the LifeMonitor Github app on the github repository)
if not submitter:
submitter = workflow.earliest_version.submitter

# look up the existing workflow version
current_wv = wv = workflow.versions.get(workflow_version, None)

Expand Down Expand Up @@ -239,14 +256,7 @@ def delete_repository_workflow_version(repository_reference: GithubRepositoryRef
workflow_version = repository_reference.branch or repository_reference.tag

# search user identity
submitter = None
try:
identity: OAuthIdentity = repository_reference.event.sender
submitter = identity.user
except OAuthIdentityNotFoundException as e:
logger.warning("Github identity of the sender '%r' doesn't match with any LifeMonitor user identity", repository_reference.owner_id)
if logger.isEnabledFor(logging.DEBUG):
logger.exception(e)
submitter = identify_workflow_version_submitter(repository_reference)

# set the repo link
repo_link = f"{hosting_service.uri}/{repo.full_name}.git"
Expand All @@ -260,11 +270,6 @@ def delete_repository_workflow_version(repository_reference: GithubRepositoryRef
logger.warning(f"No workflow associated with '{repo.full_name}' found")
else:

# fallback the submitter to the original submitter of the workflow
# (i.e., the user who registered the LifeMonitor Github app on the github repository)
if not submitter:
submitter = w.earliest_version.submitter

# try to find the workflow version
wv = lm.get_user_workflow_version(submitter, w.uuid, workflow_version)
if not wv:
Expand Down

0 comments on commit 8286a4f

Please sign in to comment.