1
0
mirror of https://github.com/quay/quay.git synced 2026-01-26 06:21:37 +03:00
Files
quay/endpoints/api/robot_models_interface.py
Ryan Wallace a06cc6fa43 chore: update all black versions to 24.4.2 and run make black (#4754)
* chore(pre-commit): match black version with requirements-dev

* run `make black` against repo

* ci: switch to black 24.4.2

* fix: py312

* fix: flake8 errors

* fix: flake8 conflicts

* chore: add git blame ignore revs file
2025-12-19 11:29:53 -06:00

225 lines
4.8 KiB
Python

from abc import ABCMeta, abstractmethod
from collections import namedtuple
from six import add_metaclass
from endpoints.api import format_date
class Permission(
namedtuple("Permission", ["repository_name", "repository_visibility_name", "role_name"])
):
"""
Permission the relationship between a robot and a repository and whether that robot can see the
repo.
"""
def to_dict(self):
return {
"repository": {
"name": self.repository_name,
"is_public": self.repository_visibility_name == "public",
},
"role": self.role_name,
}
class Team(namedtuple("Team", ["name", "avatar"])):
"""
Team represents a team entry for a robot list entry.
:type name: string
:type avatar: {string -> string}
"""
def to_dict(self):
return {
"name": self.name,
"avatar": self.avatar,
}
class RobotWithPermissions(
namedtuple(
"RobotWithPermissions",
[
"name",
"password",
"created",
"last_accessed",
"teams",
"repository_names",
"description",
],
)
):
"""
RobotWithPermissions is a list of robot entries.
:type name: string
:type password: string
:type created: datetime|None
:type last_accessed: datetime|None
:type teams: [Team]
:type repository_names: [string]
:type description: string
"""
def to_dict(self, include_token=False):
data = {
"name": self.name,
"created": format_date(self.created) if self.created is not None else None,
"last_accessed": (
format_date(self.last_accessed) if self.last_accessed is not None else None
),
"teams": [team.to_dict() for team in self.teams],
"repositories": self.repository_names,
"description": self.description,
}
if include_token:
data["token"] = self.password
return data
class Robot(
namedtuple(
"Robot",
[
"name",
"password",
"created",
"last_accessed",
"description",
"unstructured_metadata",
],
)
):
"""
Robot represents a robot entity.
:type name: string
:type password: string
:type created: datetime|None
:type last_accessed: datetime|None
:type description: string
:type unstructured_metadata: dict
"""
def to_dict(self, include_metadata=False, include_token=False):
data = {
"name": self.name,
"created": format_date(self.created) if self.created is not None else None,
"last_accessed": (
format_date(self.last_accessed) if self.last_accessed is not None else None
),
"description": self.description,
}
if include_token:
data["token"] = self.password
if include_metadata:
data["unstructured_metadata"] = self.unstructured_metadata
return data
@add_metaclass(ABCMeta)
class RobotInterface(object):
"""
Interface that represents all data store interactions required by the Robot API.
"""
@abstractmethod
def get_org_robot(self, robot_shortname, orgname):
"""
Returns:
Robot object
"""
@abstractmethod
def get_user_robot(self, robot_shortname, owning_user):
"""
Returns:
Robot object
"""
@abstractmethod
def create_user_robot(self, robot_shortname, owning_user):
"""
Returns:
Robot object
"""
@abstractmethod
def create_org_robot(self, robot_shortname, orgname):
"""
Returns:
Robot object
"""
@abstractmethod
def delete_robot(self, robot_username):
"""
Returns:
Robot object
"""
@abstractmethod
def regenerate_user_robot_token(self, robot_shortname, owning_user):
"""
Returns:
Robot object
"""
@abstractmethod
def regenerate_org_robot_token(self, robot_shortname, orgname):
"""
Returns:
Robot object
"""
@abstractmethod
def list_entity_robot_permission_teams(
self, prefix, include_permissions=False, include_token=False, limit=None
):
"""
Returns:
list of RobotWithPermissions objects
"""
@abstractmethod
def list_robot_permissions(self, username):
"""
Returns:
list of Robot objects
"""
@abstractmethod
def robot_has_mirror(self, robot_username):
"""
Returns:
True if robot is being used by mirror,
False otherwise.
"""