From 16ac068b0d8e29be7c17850e03ef7be720ecc1ba Mon Sep 17 00:00:00 2001 From: Lin Yang Date: Mon, 21 Apr 2014 16:02:59 +0800 Subject: [PATCH] Update the repo structure of prerelease As the same as regular snapshot, merge all repos of prerelease project into one single snapshot. Fixes: #1819 Change-Id: I05a05f3a389aa27fb6ddfcd887ed9f8d7e4f817b Signed-off-by: Lin Yang --- job_pre_release_obs.py | 119 +++++++++++++++++++++++-------------------------- 1 file changed, 55 insertions(+), 64 deletions(-) diff --git a/job_pre_release_obs.py b/job_pre_release_obs.py index c35efb3..02bb012 100755 --- a/job_pre_release_obs.py +++ b/job_pre_release_obs.py @@ -22,7 +22,7 @@ class LocalError(Exception): """Local error exception.""" pass -def update_ks(imagedata, snapshot_id, pkg_urls): +def update_ks(imagedata, snapshot_id, pkg_urls, repo_name): """ update the repo url point to right URL and add prerelease repo url with highest priority @@ -63,7 +63,7 @@ def update_ks(imagedata, snapshot_id, pkg_urls): return images_ks def trigger_image_creation(images_ks, build_id, path_repo, - project, url_pub_base): + project, url_pub_base, repo_name): """ trigger_image_creation: Prepare the data and trigger the image_creation jobs @@ -76,12 +76,13 @@ def trigger_image_creation(images_ks, build_id, path_repo, data = {'name': name, 'kickstart': kickstart, 'buildid': build_id, - 'images_path': os.path.join("images", name), + 'images_path': os.path.join("images", repo_name, name), 'project': project, 'repo_path': path_repo, + 'repo': repo_name, 'url_pub_base': url_pub_base } - trigger_next('%s/image_trigger_%s' % (os.getenv('WORKSPACE'), index), + trigger_next('%s/image_trigger_%s_%s' % (os.getenv('WORKSPACE'), repo_name, index), data) def make_repo(project, repo, backenddb, base_url, base_path, live_repo_base): @@ -100,8 +101,7 @@ def make_repo(project, repo, backenddb, base_url, base_path, live_repo_base): target_project, tstamp = get_info_from_prerelease_project_name(project) try: - snapshot = Snapshot(backenddb, base_path, obs_project=target_project, - obs_repo=repo) + snapshot = Snapshot(backenddb, base_path, obs_project=target_project) except SnapshotError, err: raise LocalError("Error getting snapshot info: %s" % str(err)) @@ -111,40 +111,45 @@ def make_repo(project, repo, backenddb, base_url, base_path, live_repo_base): raise LocalError("Error getting prerelease info: %s" % str(err)) # Convert live repo to download structure - repomaker = RepoMaker(prerelease.build_id, - os.path.join(prerelease.path, prerelease.build_id)) live_repo_path = os.path.join(live_repo_base, project.replace(':', ':/')) + targets = snapshot.targets + + for repo in targets: + repomaker = RepoMaker(prerelease.build_id, os.path.join(prerelease.path, + prerelease.build_id)) + try: + repomaker.add_repo(live_repo_path, repo['Name'], repo['Architectures'], move=False) + except RepoMakerError, err: + raise LocalError("Unable to create download repo: %s" % err) + + # Assuming that there can be just one image-configurations- rpm in the repo + if not repomaker.has_images(): + # repomaker did not found image-configurations in pre_release repo, + # let's take it from target repo, only one package repo is enough + + # Add image configuration to prerelease repo + for rpm in find_files(os.path.join(snapshot.path, 'repos', repo['Name']), + prefix="image-configurations-", + suffix='noarch.rpm'): + repomaker.load_imagedata(repo['Name'], rpm) + + if not repomaker.has_images(): + raise LocalError("Image configuration not found in %s" % snapshot.path) + + # Update ks files + images_ks = update_ks(repomaker.imagedata, snapshot.build_id, + prerelease.pkg_urls(repo['Name']), repo['Name']) + + # Generate image info to builddata/ dir + repomaker.gen_image_info(images_ks) + + # trigger image creation jobs + trigger_image_creation(images_ks, prerelease.build_id, + os.path.join(prerelease.dir, prerelease.build_id), + project, base_url, repo['Name']) + - try: - repomaker.add_repo(live_repo_path, repo, snapshot.archs, move=False) - except RepoMakerError, err: - raise LocalError("Unable to create download repo: %s" % err) - - # Assuming that there can be just one image-configurations- rpm in the repo - if not repomaker.has_images(): - # repomaker did not found image-configurations in pre_release repo, - # let's take it from target repo, only one package repo is enough - - # Add image configuration to prerelease repo - for rpm in find_files(snapshot.path, - prefix="image-configurations-", - suffix='noarch.rpm'): - repomaker.load_imagedata(rpm) - - if not repomaker.has_images(): - raise LocalError("Image configuration not found in %s" % snapshot.path) - - # Update ks files - images_ks = update_ks(repomaker.imagedata, snapshot.build_id, - prerelease.pkg_urls) - # Generate image info to builddata/ dir - repomaker.gen_image_info(images_ks) - - # trigger image creation jobs - trigger_image_creation(images_ks, prerelease.build_id, - os.path.join(prerelease.dir, prerelease.build_id), - project, base_url) def get_published_repos(repo_path_base, time_stamp): """ Search publised repository recursively @@ -206,34 +211,20 @@ def project_cleanup(backenddb, build, base_path, base_url, event_dict): # Delete the prerelease project build.cleanup(prerelease_project_name, "Cleaned up by backend automaticly") - # We don't have project repo names. Let's try to find them. - for repomap in backenddb.get_obs_repo_map(): - # if it starts from target_project it may be it - prefix = '%s:' % target_project - if not repomap.startswith(prefix): - continue - obs_repo = repomap.split(prefix)[-1] - - # Avoid false positives caused by cases 'IVI' and 'IVI:Release' - # repo name should not contain colons - if ':' in obs_repo: - continue - - # Get prerelease data from db - try: - snapshot = Snapshot(backenddb, base_path, - obs_project=target_project, obs_repo=obs_repo) - prerelease = snapshot.get_prerelease(base_url, time_stamp) - except SnapshotError, err: - raise LocalError("Error getting prerelease data: %s" % str(err)) + # Get prerelease data from db + try: + snapshot = Snapshot(backenddb, base_path, obs_project=target_project) + prerelease = snapshot.get_prerelease(base_url, time_stamp) + except SnapshotError, err: + raise LocalError("Error getting prerelease data: %s" % str(err)) - # remove latest snapshot from prerelease_path as we need to clean up - # published repos from old snapshots too - root = prerelease.path.split(prerelease.snapshot)[0] + # remove latest snapshot from prerelease_path as we need to clean up + # published repos from old snapshots too + root = prerelease.path.split(prerelease.snapshot.build_id)[0] - for path in get_published_repos(root, time_stamp): - print 'Removing the repo: %s' % path - shutil.rmtree(path) + for path in get_published_repos(root, time_stamp): + print 'Removing the repo: %s' % path + shutil.rmtree(path) def main(action): """Script entry point. @@ -266,7 +257,7 @@ def main(action): # them not published repo_status = build.get_repo_state(project) for target_arch, status in repo_status.items(): - if target_arch.split('/')[0] == repo and status != 'published': + if status != 'published': print "Skipping prerelease repository creation as OBS "\ "repository: %s/%s/%s is't published yet." \ % (project, repo, target_arch) -- 2.7.4