trigger imager jobs after repo created
authorHasan Wan <hasan.wan@intel.com>
Wed, 29 May 2013 02:27:36 +0000 (10:27 +0800)
committerHasan Wan <hasan.wan@intel.com>
Wed, 29 May 2013 09:45:09 +0000 (17:45 +0800)
Change-Id: I0ffced291ba57a20b064abfc4d2ba03a1779314f
Signed-off-by: Hasan Wan <hasan.wan@intel.com>
common/builddata.py
job_pre_release_obs.py

index fc6e4f3..aa73238 100644 (file)
@@ -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
 
index 5d66c91..8593ca0 100755 (executable)
@@ -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: