Skip to content

Commit e638736

Browse files
authored
Merge pull request #1187 from AlmaLinux/fix_scripts
Fix repo syncs and repo backups in our scripts
2 parents a64cd5a + 5481737 commit e638736

File tree

2 files changed

+91
-45
lines changed

2 files changed

+91
-45
lines changed

scripts/backup_beta_repos.py

Lines changed: 38 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -5,42 +5,43 @@
55
import pprint
66
import typing
77

8-
from alws.utils.pulp_client import PulpClient
8+
from alws.utils import pulp_client as pulp_cli
99
from scripts.utils.pulp import get_pulp_params
1010

11-
1211
PROG_NAME = "backup_beta_repositories"
1312
# We search using startswith
1413
PLATFORM_REPO_MAP = {
1514
"almalinux_9": "AlmaLinux-9-beta-AlmaLinux-9",
1615
"almalinux_10": "eabdullin1-almalinux10-beta-almalinux-10",
16+
"almalinux_10_epel": "eabdullin1-epel-al-almalinux-10",
1717
}
1818

1919
ReposType = typing.List[typing.Dict[str, typing.Any]]
2020

21+
2122
async def find_pulp_repos(
22-
name_starts: str,
23-
pulp_client: typing.Optional[PulpClient] = None
23+
name_starts: str, pulp_client: typing.Optional[pulp_cli.PulpClient] = None
2424
) -> ReposType:
2525
if not pulp_client:
2626
host, user, password = get_pulp_params()
27-
pulp_client = PulpClient(host, user, password)
27+
pulp_client = pulp_cli.PulpClient(host, user, password)
2828
repositories = await pulp_client.get_rpm_repositories_by_params(
29-
{"name__startswith": name_starts})
29+
{"name__startswith": name_starts}
30+
)
3031
repositories = [r for r in repositories if "backup" not in r["name"]]
3132

3233
return repositories
3334

3435

3536
async def create_pulp_backup_repos(
36-
repos: ReposType,
37-
dry_run: bool = False,
38-
pulp_client: typing.Optional[PulpClient] = None
37+
repos: ReposType,
38+
dry_run: bool = False,
39+
pulp_client: typing.Optional[pulp_cli.PulpClient] = None,
3940
) -> typing.Dict[str, typing.Dict[str, typing.Any]]:
4041
logger = logging.getLogger(PROG_NAME)
4142
if not pulp_client:
4243
host, user, password = get_pulp_params()
43-
pulp_client = PulpClient(host, user, password)
44+
pulp_client = pulp_cli.PulpClient(host, user, password)
4445

4546
result = {}
4647
for repo in repos:
@@ -51,8 +52,9 @@ async def create_pulp_backup_repos(
5152
backup_repo = await pulp_client.get_rpm_repository(backup_repo_name)
5253
if not backup_repo:
5354
url, href = await pulp_client.create_rpm_repository(
54-
backup_repo_name, create_publication=True,
55-
base_path_start="backups"
55+
backup_repo_name,
56+
create_publication=True,
57+
base_path_start="backups",
5658
)
5759
logger.info("Backup repository URL: %s, href: %s", url, href)
5860
backup_repo = await pulp_client.get_rpm_repository(backup_repo_name)
@@ -64,7 +66,8 @@ async def _main(repos_to_backup, dry_run: bool = False):
6466
logger = logging.getLogger(PROG_NAME)
6567
logger.debug("Acquiring Pulp connection data and creating client")
6668
host, user, password = get_pulp_params()
67-
pulp_client = PulpClient(host, user, password)
69+
pulp_cli.PULP_SEMAPHORE = asyncio.Semaphore(10)
70+
pulp_client = pulp_cli.PulpClient(host, user, password)
6871
logger.info("Searching for all beta repositories")
6972
repos = []
7073
for repo_to_backup in repos_to_backup:
@@ -82,13 +85,9 @@ async def _main(repos_to_backup, dry_run: bool = False):
8285
version_href = repo["latest_version_href"]
8386
logger.debug("Version href: %s", version_href)
8487
pkgs = await pulp_client.get_rpm_packages(
85-
include_fields=fields,
86-
repository_version=version_href,
87-
limit=1000
88-
)
89-
modules = await pulp_client.get_modules(
90-
repository_version=version_href
88+
include_fields=fields, repository_version=version_href, limit=1000
9189
)
90+
modules = await pulp_client.get_modules(repository_version=version_href)
9291
for entity in itertools.chain(pkgs, modules):
9392
hrefs.append(entity["pulp_href"])
9493
backup_repo = backup_repos[repo["name"]]
@@ -109,7 +108,8 @@ async def _main(repos_to_backup, dry_run: bool = False):
109108
)
110109
remove_tasks.append(
111110
pulp_client.modify_repository(
112-
repo["pulp_href"], add=[], remove=hrefs)
111+
repo["pulp_href"], add=[], remove=hrefs
112+
)
113113
)
114114
if not repo.get("autopublish", False):
115115
publications_tasks.append(
@@ -132,16 +132,27 @@ async def _main(repos_to_backup, dry_run: bool = False):
132132

133133
def main():
134134
parser = argparse.ArgumentParser(PROG_NAME)
135-
parser.add_argument("-v", "--verbose", action="store_true", default=False,
136-
help="Enable verbose output")
137-
parser.add_argument("-d", "--dry-run", action="store_true", default=False,
138-
help="Output everything that will happen, "
139-
"but do not create/modify anything")
135+
parser.add_argument(
136+
"-v",
137+
"--verbose",
138+
action="store_true",
139+
default=False,
140+
help="Enable verbose output",
141+
)
142+
parser.add_argument(
143+
"-d",
144+
"--dry-run",
145+
action="store_true",
146+
default=False,
147+
help="Output everything that will happen, "
148+
"but do not create/modify anything",
149+
)
140150
for platform in PLATFORM_REPO_MAP:
141151
parser.add_argument(
142-
f"--{platform}", f"--{platform.replace('_', '-')}",
152+
f"--{platform}",
153+
f"--{platform.replace('_', '-')}",
143154
help=f"Create backups of {platform} beta repos",
144-
action="store_true"
155+
action="store_true",
145156
)
146157
args = parser.parse_args()
147158

scripts/bootstrap_repositories.py

Lines changed: 53 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import asyncio
12
import os
23
import sys
34
import typing
@@ -147,7 +148,9 @@ async def get_repository(
147148
async def get_remote(repo_info: dict, remote_sync_policy: str):
148149
async with open_async_session(key=get_async_db_key()) as db:
149150
remote_payload = repo_info.copy()
150-
remote_payload["name"] = f'{repo_info["name"]}-{repo_info["arch"]}'
151+
remote_payload["name"] = (
152+
f'{repo_info["name"]}-{repo_info["arch"]}-{remote_sync_policy}'
153+
)
151154
remote_payload.pop("type", None)
152155
remote_payload.pop("debug", False)
153156
remote_payload.pop("production", False)
@@ -231,6 +234,43 @@ async def add_repositories_to_platform(
231234
)
232235

233236

237+
async def sync_repositories(repo_sync_list: list, pulp_client: PulpClient):
238+
sync_tasks = []
239+
publish_tasks = []
240+
241+
async def sync_repo(repo_, remote_, policy):
242+
logging.info('Syncing repository %s from %s', repo_, remote_)
243+
try:
244+
await pulp_client.sync_rpm_repo_from_remote(
245+
repo_,
246+
remote_,
247+
policy,
248+
wait_for_result=True,
249+
)
250+
except Exception:
251+
logging.exception('Cannot sync repository %s', repo_)
252+
253+
async def publish_repo(repo_):
254+
logging.info('Publishing repo %s', repo_)
255+
try:
256+
await pulp_client.create_rpm_publication(repo['repo_href'])
257+
except Exception:
258+
logging.exception('Cannot publish repository %s', repo_)
259+
260+
for repo in repo_sync_list:
261+
sync_tasks.append(
262+
sync_repo(
263+
repo['repo_href'],
264+
repo['remote_href'],
265+
repo['sync_policy'],
266+
)
267+
)
268+
publish_tasks.append(publish_repo(repo['repo_href']))
269+
async with asyncio.Semaphore(5):
270+
await asyncio.gather(*sync_tasks)
271+
await asyncio.gather(*publish_tasks)
272+
273+
234274
def main():
235275
pulp_host = os.environ["PULP_HOST"]
236276
pulp_user = os.environ["PULP_USER"]
@@ -302,6 +342,7 @@ def main():
302342
repo["pulp_href"],
303343
)
304344

345+
repos_to_sync = []
305346
for repo_info in repositories_data:
306347
logger.info(
307348
"Creating repository from the following data: %s",
@@ -336,7 +377,7 @@ def main():
336377
remote = sync(get_remote(repo_info, remote_sync_policy))
337378
pulp_remote = sync(
338379
pulp_client.get_rpm_remote(
339-
f'{repo_info["name"]}-{repo_info["arch"]}',
380+
f'{repo_info["name"]}-{repo_info["arch"]}-{remote_sync_policy}',
340381
)
341382
)
342383
if pulp_remote['pulp_href'] != remote.pulp_href:
@@ -354,22 +395,16 @@ def main():
354395
if args.no_sync:
355396
logger.info("Synchronization from remote is disabled, skipping")
356397
continue
357-
try:
358-
logger.info("Syncing %s from %s...", repository, remote)
359-
sync(
360-
pulp_client.sync_rpm_repo_from_remote(
361-
repository.pulp_href,
362-
remote.pulp_href,
363-
sync_policy=repo_sync_policy,
364-
wait_for_result=True,
365-
)
366-
)
367-
sync(pulp_client.create_rpm_publication(repository.pulp_href))
368-
logger.info("Repository %s sync is completed", repository)
369-
except Exception as e:
370-
logger.info(
371-
"Repository %s sync is failed: \n%s", repository, str(e)
372-
)
398+
logger.info("Appending %s to sync from %s...", repository, remote)
399+
repo_sync_info = {
400+
'repo_href': repository.pulp_href,
401+
'remote_href': remote.pulp_href,
402+
'sync_policy': repo_sync_policy,
403+
}
404+
repos_to_sync.append(repo_sync_info)
405+
if repos_to_sync and not args.no_sync:
406+
sync(sync_repositories(repos_to_sync, pulp_client))
407+
return
373408
sync(add_repositories_to_platform(platform_data, repository_ids))
374409
sync(add_owner_id())
375410

0 commit comments

Comments
 (0)