Add new feature
authorYonghee Han <onstudy@samsung.com>
Wed, 30 May 2018 12:55:32 +0000 (21:55 +0900)
committerYonghee Han <onstudy@samsung.com>
Thu, 31 Jan 2019 01:21:23 +0000 (10:21 +0900)
add a base_id and a ref_id in build.xml
Find information about the project meta.

Change-Id: Ieff23224121377e971a27e95df8435e35ecf1d89

common/builddata.py
common/buildservice.py
common/repomaker.py
job_create_snapshot.py

index 0594e6b..ded14e5 100644 (file)
@@ -36,12 +36,22 @@ class BuildData(object):
 
     def __init__(self, build_id=None):
         self.build_id = build_id
+        self.base_id = None
+        self.ref_id = None
         self.targets = OrderedDict()
 
     def add_target(self, target):
         """Add (or update) target to the list of targets."""
         self.targets[target["name"]] = target
 
+    def set_base_id(self, base_id):
+        """ Set Base id """
+        self.base_id = base_id
+
+    def set_ref_id(self, ref_id):
+        """ Set Ref id """
+        self.ref_id = ref_id
+
     def load(self, xml):
         """Load build data from string."""
 
@@ -99,6 +109,13 @@ class BuildData(object):
         """Format build data as xml."""
         content = '<?xml version="1.0"?><build version="1.0">'\
                   '<id>%s</id>' % self.build_id
+        # set base id
+        if self.base_id:
+            content += '<base_id>%s</base_id>' % self.base_id
+
+        # set ref id
+        if self.ref_id:
+            content += '<ref_id>%s</ref_id>' % self.ref_id
 
         # build targets
         content += '<buildtargets>'
index b18c041..3f41f53 100755 (executable)
@@ -1483,4 +1483,15 @@ class BuildService(OSC):
 
         return None
 
+    def get_path_project(self, project):
+        """Get arch though project and repo name"""
+
+        path_project = []
+        meta_xml = self.get_meta(project)
+        xml_root = ElementTree.fromstringlist(meta_xml)
+        for repo_element in xml_root.findall('repository'):
+            for element in repo_element.findall('path'):
+                if element.get('project'):
+                    path_project.append(element.get('project'))
+        return list(set(path_project))
 
index ebfe364..85698f7 100644 (file)
@@ -307,6 +307,27 @@ class RepoMaker(object):
         except BuildDataError, err:
             raise RepoMakerError("Unable to generate build.xml: %s" % err)
 
+    def update_extend_builddata(self, base_id=None, ref_id=None):
+        """
+        Update or create build.xml
+        Args:
+            base id : id of Base snapshot
+            ref id : id of Ref Project
+        """
+        try:
+            bdata = BuildData(self.build_id)
+            # Create or update build.xml
+            outf = os.path.join(self.outdir, 'build.xml')
+            if os.path.exists(outf):
+                bdata.load(open(outf).read())
+            if base_id:
+                bdata.set_base_id(base_id)
+            if ref_id:
+                bdata.set_ref_id(ref_id)
+            bdata.save(outf)
+        except BuildDataError, err:
+            raise RepoMakerError("Unable to generate build.xml: %s" % err)
+
     def gen_manifest_info(self, name, gerrit_fetch_url, gerrit_review_url):
         """
         Generate manifest for repo
index 86e71ef..b5b253f 100755 (executable)
@@ -107,7 +107,7 @@ def trigger_image_creation(trigger_data):
                                        "PURPOSE": "JENKINS_IMAGER", \
                                        "REQUESTED_NUM_EXECUTORS": "%d" % count})
 
-def make_repo(project, backenddb, base_path, live_repo_base):
+def make_repo(project, backenddb, base_path, live_repo_base, base_id=None, ref_id=None):
     """
     make repo.
 
@@ -192,7 +192,7 @@ def make_repo(project, backenddb, base_path, live_repo_base):
                           }
                 trigger_next("BUILD-MONITOR-5-%s" % bm_stage, bm_data)
             raise LocalError("Image configuration not found in %s" %
-                              local_path)
+                             local_path)
 
         repos.update(repomaker.repos)
         imagedatas[repo['Name']] = repomaker.imagedata
@@ -213,7 +213,6 @@ def make_repo(project, backenddb, base_path, live_repo_base):
             bm_pkg_url = bm_repo_dir.replace(base_path, bm_base_url)
             #print '[%s] bm_base_url(%s), base_path(%s), bm_pkg_url(%s)\n' \
             #      % (__file__, bm_base_url, base_path, bm_pkg_url)
-
             # get rpm files
             bm_pkg_name_lst = []
             bm_pkg_mdate_lst = []
@@ -317,6 +316,14 @@ def make_repo(project, backenddb, base_path, live_repo_base):
         #                 os.getenv('NOREPLY_EMAIL_SENDER'), \
         #                 os.getenv('MAILINGLIST_SYSTEM').split(','))
 
+    # Update base id and ref id of the builddata.
+    if base_id or ref_id:
+        try:
+            repomaker = RepoMaker(local_build_id, local_path)
+            repomaker.update_extend_builddata(base_id, ref_id)
+        except Exception as err:
+            print err
+
     return {'project': project,
             'repo': repos,
             'repo_path': os.path.join(local_dir, local_build_id),
@@ -383,12 +390,56 @@ def main():
                   }
         trigger_next("BUILD-MONITOR-1-%s" % bm_stage, bm_data)
 
+    # Get link project
+    ref_project_id = None
+    try:
+        ref_project_id = build.get_link_project_info(project)
+        if ref_project_id:
+            l_project = ref_project_id
+            loop_count = 10
+            while loop_count >= 0:
+                l_project = build.get_link_project_info(l_project)
+                if l_project == None:
+                    break;
+                else:
+                    ref_project_id = l_project
+                    loop_count -= 1
+        print "ref Project:",ref_project_id
+    except Exception as err:
+        ref_project_id = None
+        print "ref Project is None"
+
     # Init backend database
     redis_host = os.getenv("REDIS_HOST")
     redis_port = int(os.getenv("REDIS_PORT"))
     backenddb = BackendDB(redis_host, redis_port)
 
-    repo_data = make_repo(project, backenddb, base_path, live_repo_base)
+    # Find base project or base release id
+    base_release_id = None
+    try:
+        base_projects = build.get_path_project(project)
+        if base_projects:
+            base_project = base_projects[0]
+            repo_name = backenddb.get_obs_repo_map()[base_project]
+            release_name = backenddb.get_repos()[repo_name]['Release']
+            release_id = backenddb.get_release_ids()[repo_name]
+            base_release_id = "%s_%s" %(release_name, release_id)
+            print 'base release id:',base_release_id
+    except Exception as err:
+        loop_count = 10
+        while loop_count >= 0:
+            base_projects = build.get_path_project(base_project)
+            if base_projects:
+                old_base_project = base_project = base_projects[0]
+                print base_project
+                loop_count -= 1
+            else:
+                base_release_id = old_base_project
+                break
+        print 'base release id is',base_release_id
+
+    repo_data = make_repo(project, backenddb, base_path, live_repo_base, \
+                          base_release_id, ref_project_id)
 
     # update/create the latest repo link
     make_latest_link(os.path.join(base_path, repo_data['repo_path']))
@@ -413,7 +464,7 @@ def main():
     # remove unused item
     data.pop('imagedata')
 
-    #INSERT MANIFEST DATA TO BUILDMONITOR 
+    #INSERT MANIFEST DATA TO BUILDMONITOR
     if buildmonitor_enabled:
         if data.get('manifestdata'):
             bm_stage = 'Update_Manifest'