make destination lookaside configurable

This commit is contained in:
Louis Abel 2023-07-03 12:43:36 -07:00
parent c4dc7195bb
commit df30fa4c72
Signed by: label
GPG Key ID: 3331F061D1D9990E
4 changed files with 145 additions and 9 deletions

View File

@ -20,3 +20,8 @@ in the RESF (such as Rocky Linux).
* GitPython (python3-GitPython or via pip) * GitPython (python3-GitPython or via pip)
* lxml (python3-lxml or via pip) * lxml (python3-lxml or via pip)
* rpm (python3-rpm) * rpm (python3-rpm)
## Example Scripts
Example scripts are found in the `examples` directory, which can utilize
parts of the pv2 module.

18
examples/import_pkg.py Normal file
View File

@ -0,0 +1,18 @@
#!/usr/bin/python3
"""
Import a source RPM into a git forge using pv2
"""
import argparse
import pv2.importer as importutil
parser = argparse.ArgumentParser(description="ISO Compose")
parser.add_argument('--giturl', type=str, required=True)
parser.add_argument('--branch', type=str, required=True)
parser.add_argument('--srpm', type=str, required=True)
parser.add_argument('--release', type=str, required=False, default='')
results = parser.parse_args()
# pylint: disable=line-too-long
classy = importutil.SrpmImport(git_url_path=results.giturl, srpm_path=results.srpm, branch=results.branch, release=results.release)
classy.pkg_import()

View File

@ -9,6 +9,7 @@ import re
import shutil import shutil
from pv2.util import gitutil, fileutil, rpmutil, processor, generic from pv2.util import gitutil, fileutil, rpmutil, processor, generic
from pv2.util import error as err from pv2.util import error as err
from pv2.util import constants as const
__all__ = [ __all__ = [
'Import', 'Import',
@ -99,12 +100,18 @@ class Import:
return metadata return metadata
@staticmethod @staticmethod
def import_lookaside(repo_path: str, repo_name: str, branch: str, file_dict: dict): def import_lookaside(
repo_path: str,
repo_name: str,
branch: str,
file_dict: dict,
dest_lookaside: str = '/var/www/html/sources'
):
""" """
Attempts to move the lookaside files if they don't exist to their Attempts to move the lookaside files if they don't exist to their
hashed name. hashed name.
""" """
dest_dir = f'/var/www/html/sources/{repo_name}/{branch}' dest_dir = f'{dest_lookaside}/{repo_name}/{branch}'
if not os.path.exists(dest_dir): if not os.path.exists(dest_dir):
os.makedirs(dest_dir, 0o755) os.makedirs(dest_dir, 0o755)
for name, sha in file_dict.items(): for name, sha in file_dict.items():
@ -129,6 +136,7 @@ class Import:
source_path = f'{repo_path}/{name}' source_path = f'{repo_path}/{name}'
os.remove(source_path) os.remove(source_path)
# pylint: disable=too-many-instance-attributes
class SrpmImport(Import): class SrpmImport(Import):
""" """
Import class for importing rpms to a git service Import class for importing rpms to a git service
@ -146,6 +154,7 @@ class SrpmImport(Import):
distprefix: str = 'el', distprefix: str = 'el',
git_user: str = 'git', git_user: str = 'git',
org: str = 'rpms', org: str = 'rpms',
dest_lookaside: str = '/var/www/html/sources',
verify_signature: bool = False verify_signature: bool = False
): ):
""" """
@ -160,6 +169,7 @@ class SrpmImport(Import):
verify_signature) verify_signature)
self.__release = release self.__release = release
self.__dist_prefix = distprefix self.__dist_prefix = distprefix
self.__dest_lookaside = dest_lookaside
pkg_name = self.__srpm_metadata['name'] pkg_name = self.__srpm_metadata['name']
git_url = f'ssh://{git_user}@{git_url_path}/{org}/{pkg_name}.git' git_url = f'ssh://{git_user}@{git_url_path}/{org}/{pkg_name}.git'
@ -259,7 +269,8 @@ class SrpmImport(Import):
if skip_lookaside: if skip_lookaside:
self.skip_import_lookaside(git_repo_path, sources) self.skip_import_lookaside(git_repo_path, sources)
else: else:
self.import_lookaside(git_repo_path, self.rpm_name, branch, sources) self.import_lookaside(git_repo_path, self.rpm_name, branch,
sources, self.dest_lookaside)
gitutil.add_all(repo) gitutil.add_all(repo)
@ -347,6 +358,14 @@ class SrpmImport(Import):
""" """
return self.__dist_prefix return self.__dist_prefix
@property
def dest_lookaside(self):
"""
Returns the destination path for the local lookaside
"""
return self.__dest_lookaside
# pylint: disable=too-many-instance-attributes
class GitImport(Import): class GitImport(Import):
""" """
Import class for importing from git (e.g. pagure or gitlab) Import class for importing from git (e.g. pagure or gitlab)
@ -365,10 +384,12 @@ class GitImport(Import):
git_url_path: str, git_url_path: str,
release: str, release: str,
branch: str, branch: str,
upstream_lookaside: str = '',
dest_lookaside: str = '/var/www/html/sources',
dest_branch: str = '',
distprefix: str = 'el', distprefix: str = 'el',
git_user: str = 'git', git_user: str = 'git',
org: str = 'rpms', org: str = 'rpms'
verify_signature: bool = False
): ):
""" """
Init the class. Init the class.
@ -378,12 +399,49 @@ class GitImport(Import):
""" """
self.__rpm = package self.__rpm = package
self.__release = release self.__release = release
source_git_url = f'https://{source_git_url_path}/{source_git_org_path}/{package}.git' self.__source_git_url = f'https://{source_git_url_path}/{source_git_org_path}/{package}.git'
git_url = f'ssh://{git_user}@{git_url_path}/{org}/{package}.git' self.__git_url = f'ssh://{git_user}@{git_url_path}/{org}/{package}.git'
self.__git_url = git_url
self.__dist_prefix = distprefix self.__dist_prefix = distprefix
self.__dist_tag = f'.{distprefix}{release}' self.__dist_tag = f'.{distprefix}{release}'
self.__branch = branch self.__branch = branch
self.__dest_branch = branch
self.__dest_lookaside = dest_lookaside
self.__upstream_lookaside = upstream_lookaside
if len(dest_branch) > 0:
self.__dest_branch = dest_branch
def pkg_import(self, skip_lookaside: bool = False):
"""
Actually perform the import
If skip_lookaside is True, source files will just be deleted rather
than uploaded to lookaside.
"""
check_source_repo = gitutil.lsremote(self.source_git_url)
check_dest_repo = gitutil.lsremote(self.source_git_url)
source_git_repo_path = f'/var/tmp/{self.rpm_name}-source'
dest_git_repo_path = f'/var/tmp/{self.rpm_name}'
source_branch = self.source_branch
dest_branch = self.dest_branch
repo_tags = []
@staticmethod
def __get_lookaside_template_path(source):
"""
Attempts to return the lookaside template
"""
# This is an extremely hacky way to return the right value. In python
# 3.10, match-case was introduced. However, we need to assume that
# python 3.9 is the lowest used version for this module, so we need to
# be inefficient until we no longer use EL9 as the base line.
return {
'rocky8': const.GitConstants.ROCKY8_LOOKASIDE_PATH,
'rocky': const.GitConstants.ROCKY_LOOKASIDE_PATH,
'centos': const.GitConstants.CENTOS_LOOKASIDE_PATH,
'stream': const.GitConstants.STREAM_LOOKASIDE_PATH,
'fedora': const.GitConstants.FEDORA_LOOKASIDE_PATH,
}.get(source, None)
@property @property
def rpm_name(self): def rpm_name(self):
@ -391,3 +449,45 @@ class GitImport(Import):
Returns the name of the RPM we're working with Returns the name of the RPM we're working with
""" """
return self.__rpm return self.__rpm
@property
def source_branch(self):
"""
Returns the starting branch
"""
return self.__branch
@property
def dest_branch(self):
"""
Returns the starting branch
"""
return self.__dest_branch
@property
def source_git_url(self):
"""
Returns the source git url
"""
return self.__source_git_url
@property
def dest_git_url(self):
"""
Returns the destination git url
"""
return self.__git_url
@property
def dist_tag(self):
"""
Returns the dist tag
"""
return self.__dist_tag
@property
def dest_lookaside(self):
"""
Returns destination local lookaside
"""
return self.__dest_lookaside

View File

@ -6,7 +6,8 @@ All constants
__all__ = [ __all__ = [
'RpmConstants', 'RpmConstants',
'ErrorConstants', 'ErrorConstants',
'MockConstants' 'MockConstants',
'GitConstants'
] ]
# pylint: disable=too-few-public-methods # pylint: disable=too-few-public-methods
@ -177,3 +178,15 @@ class MockConstants:
MOCK_EXIT_SIGHUP_RECEIVED = 129 MOCK_EXIT_SIGHUP_RECEIVED = 129
MOCK_EXIT_SIGPIPE_RECEIVED = 141 MOCK_EXIT_SIGPIPE_RECEIVED = 141
MOCK_EXIT_SIGTERM_RECEIVED = 143 MOCK_EXIT_SIGTERM_RECEIVED = 143
class GitConstants:
"""
All git related constants
"""
CENTOS_LOOKASIDE_PATH = 'https://git.centos.org/sources/${PKG_NAME}/${BRANCH}/${HASH}'
# pylint: disable=line-too-long
STREAM_LOOKASIDE_PATH = 'https://sources.stream.centos.org/sources/rpms/${PKG_NAME}/${FILENAME}/${HASH_TYPE}/${FILENAME}'
FEDORA_LOOKASIDE_PATH = 'https://src.fedoraproject.org/repo/pkgs/${PKG_NAME}/${FILENAME}/${HASH_TYPE}/${FILENAME}'
ROCKY8_LOOKASIDE_PATH = 'https://rocky-linux-sources-staging.a1.rockylinux.org/${HASH}'
ROCKY_LOOKASIDE_PATH = 'https://sources.build.resf.org/${HASH}'