Update the repo structure of prerelease
authorLin Yang <lin.a.yang@intel.com>
Mon, 21 Apr 2014 08:02:59 +0000 (16:02 +0800)
committerYang Lin <lin.a.yang@intel.com>
Wed, 30 Apr 2014 02:34:04 +0000 (10:34 +0800)
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 <lin.a.yang@intel.com>
job_pre_release_obs.py

index c35efb3..02bb012 100755 (executable)
@@ -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)