From 44ca640a3e7724c2b7a0695ab10909ab6c04936f Mon Sep 17 00:00:00 2001 From: Hasan Wan Date: Wed, 29 May 2013 10:27:36 +0800 Subject: [PATCH] trigger imager jobs after repo created Change-Id: I0ffced291ba57a20b064abfc4d2ba03a1779314f Signed-off-by: Hasan Wan --- common/builddata.py | 13 +++++--- job_pre_release_obs.py | 89 ++++++++++++++++++++++++++++++++++++++++---------- 2 files changed, 80 insertions(+), 22 deletions(-) diff --git a/common/builddata.py b/common/builddata.py index fc6e4f3..aa73238 100644 --- a/common/builddata.py +++ b/common/builddata.py @@ -64,10 +64,15 @@ class BuildData(object): try: bconf = get_elem(btarget, "buildconf") - target["buildconf"]={"location": get_elem(bconf, "location").getAttribute("href"), - "checksum": {"type": get_elem(bconf, "checksum").getAttribute("type"), - "value": get_elem(bconf, "checksum").firstChild.data} - } + target["buildconf"]={ + "location": + get_elem(bconf, "location").getAttribute("href"), + "checksum": + {"type": + get_elem(bconf, "checksum").getAttribute("type"), + "value": + get_elem(bconf, "checksum").firstChild.data} + } except BuildDataError: pass diff --git a/job_pre_release_obs.py b/job_pre_release_obs.py index 5d66c91..8593ca0 100755 --- a/job_pre_release_obs.py +++ b/job_pre_release_obs.py @@ -7,8 +7,9 @@ This code is called by jenkins jobs triggered by OBS events. 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 @@ -17,20 +18,69 @@ class LocalError(Exception): """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))) @@ -57,25 +107,25 @@ def make_repo(project, repo, redis_host, redis_port): # 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-"): """ @@ -88,7 +138,7 @@ 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 @@ -111,13 +161,16 @@ def main(name, action): 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: -- 2.7.4