import os
import sys
+import re
-from common.buildtrigger import trigger_info
+from common.buildtrigger import trigger_info, trigger_next
from common.buildservice import BuildService
from common.repomaker import find_files, extract_ks, RepoMaker, RepoMakerError
from common.backenddb import BackendDB, BackendDBError
"""Local error exception."""
pass
-def make_repo(project, repo, redis_host, redis_port):
+def update_ks(images_ks, backenddb):
+ """
+ update the repo url point to right URL and add prerelease repo
+ url with highest priority
+ Args:
+ images_ks (truple list): [(ks_file_name, ks_file_content),]
+ backenddb (BackendDB): backend database instance
+ """
+ # update ULRs in ks file
+ for name, content in images_ks:
+ new_ks_lines = []
+ for line in content.splitlines():
+ if line.startswith('repo ') and \
+ 'baseurl=' in line and \
+ '@BUILD_ID@' in line:
+ match = re.match("repo --name=([\w\-\.]*) --baseurl=.*",
+ line)
+ if match:
+ release_name = match.group(1)
+ # Get repo info from backend DB
+ repo = backenddb.get_repo_by_name(release_name)
+ repo_url = os.path.join(os.getenv("URL_PUBLIC_REPO_BASE", "/"),
+ repo['snapshot_path'],
+ repo['latest_snapshot'])
+ line = re.sub(r'--baseurl=http.*@BUILD_ID@',
+ r'--baseurl=%s' %repo_url, line)
+ new_ks_lines.append(line.strip())
+ yield name.replace('.ks', ''), '\n'.join(new_ks_lines)
+
+def trigger_image_creation(images_ks, build_id):
+ """
+ trigger_image_creation:
+ Prepare the data and trigger the image_creation jobs
+ Args:
+ images_ks (truple list): [(ks_file_name, ks_file_content),]
+ build_id (str): the pre-release repo build_id
+ """
+ index = 0
+ data = {}
+ for name, kickstart in images_ks:
+ data['name'] = name
+ data['kickstart'] = kickstart
+ data['buildid'] = build_id
+ data['images_path'] = os.path.join("images", name)
+ trigger_next('%s/image_trigger_%s' %(os.getenv('WORKSPACE'), index),
+ data)
+ index = index + 1
+
+def make_repo(project, repo, backenddb):
"""
make repo.
Args:
project (str): OBS pre-release project name
repo (str): name of the OBS live repository
+ backenddb (BackendDB): backenddb instance
Raises:
LocalError if can't create repos or can't find image configurations
"""
# Make build id from latest snapshot + project suffix
try:
- data = BackendDB(redis_host, redis_port).get_repos()[project]
+ data = backenddb.get_repos()[project]
except BackendDBError, err:
raise LocalError("Can't get information about project '%s': %s" \
% (project, str(err)))
# TODO: remove output_dir
# Assuming that there can be just one image-configurations- rpm in the repo
-
if not repomaker.images:
# repomaker did not found image-configurations in pre_release repo,
- # let's take it from target repo
+ # let's take it from target repo, only one package repo is enough
path_target_repo = os.path.join(os.getenv('PATH_REPO_BASE', '/srv/download'),
- data['snapshot_path'],
- latest_snapshot,
- 'repos',
- repo)
+ data['snapshot_path'],
+ latest_snapshot,
+ data['packages_path'][0])
# Add image configuration to pre-release repo
repomaker.add_images(get_ks_files(path_target_repo))
if not repomaker.images:
raise LocalError("Image configuration not found")
- for name, content in repomaker.images:
- # TODO: Update urls in .ks file and add .ks files to repomaker again
- # start image creation
- pass
+ images_ks = update_ks(repomaker.images, backenddb)
+
+ # TODO: update repo builddata with new image ks
+
+ # trigger image creation jobs
+ trigger_image_creation(images_ks, build_id)
def get_ks_files(repo_dir, prefix="image-configurations-"):
"""
Generates:
tuple (name, content) for found .ks files
"""
- for rpm in find_files(repo_dir, prefix=prefix, suffix='.rpm'):
+ for rpm in find_files(repo_dir, prefix=prefix, suffix='noarch.rpm'):
for name, content in extract_ks(rpm):
yield name, content
project = content.get("project")
build = BuildService(obs_api, obs_user, obs_passwd)
+ # Init backend database
+ redis_host = os.getenv("REDIS_HOST")
+ redis_port = os.getenv("REDIS_PORT")
+ backenddb = BackendDB(redis_host, redis_port)
+
if action == 'create_images':
- redis_host = os.getenv("REDIS_HOST")
- redis_port = os.getenv("REDIS_PORT")
repo = content.get("repo")
+ make_repo(project, repo, backenddb)
# TODO: sync_repo(output_dir)
- make_repo(project, repo, redis_host, redis_port)
- create_images(project, repo)
+
elif action == 'cleanup':
build.cleanup(project, "Cleaned up by %s" % name)
else: