1) add & update below funtion for the buildservice.py 73/63473/3
authorYonghee Han <onstudy@samsung.com>
Thu, 24 Mar 2016 07:18:51 +0000 (16:18 +0900)
committerpark <sk7.park@samsung.com>
Thu, 24 Mar 2016 07:47:46 +0000 (00:47 -0700)
----------------------------------------------------
update_buildstatus
update_info
link_projectDev
get_user_meta
create_copy_pac
get_dependson
show_upstream_rev
disable_build_flag
default_build_flag
2) Make file at packages depends & revision of OBS for the job_buildlog.py

Change-Id: I0d71f26ab270cd9ac54cdd48e2613963102856db

common/buildservice.py [changed mode: 0644->0755]
job_buildlogs.py

old mode 100644 (file)
new mode 100755 (executable)
index fe3aac6..779157f
@@ -526,6 +526,11 @@ class BuildService(OSC):
 
         return (targetprj, targetpkg)
 
+    def update_buildstatus(self,info,prj,pkg=None):
+        saved_info = self.get_info(prj, pkg)
+        saved_info["buildstatus"]=info["buildstatus"]
+        self.set_description(json.dumps(saved_info), prj, pkg)
+
     def update_info(self, info, prj, pkg=None):
         """Updated jsoned info dictionary, saved in description."""
         saved_info = self.get_info(prj, pkg)
@@ -547,6 +552,10 @@ class BuildService(OSC):
             else:
                 # reset 'images'
                 saved_info['images'] = info['images']
+            if 'snapshot' in info:
+                saved_info['snapshot'] = info['snapshot']
+            if 'chksnap' in info:
+                saved_info['chksnap'] = info['chksnap']
         self.set_description(json.dumps(saved_info), prj, pkg)
 
     def get_info(self, prj, pkg=None):
@@ -631,6 +640,41 @@ class BuildService(OSC):
 
         self.set_meta(ElementTree.tostring(xml_root), project)
 
+    def link_projectDev(self, project, src=None, linktype="all", buildtype="local", blocktype="local", repo=None):
+        """
+        modify the meta conf to make it linked with src project
+        """
+        if src and not self.exists(src):
+            raise ObsError('base project: %s not exists' % src)
+
+        if not self.exists(project):
+            raise ObsError('project: %s not exists' % project)
+
+        meta_xml = self.get_meta(project)
+        xml_root = ElementTree.fromstringlist(meta_xml)
+
+        if xml_root.find('link') is not None:
+            raise ObsError('project: %s already linked with %s'
+                           %(project, xml_root.find('link').get('project')))
+        # Add linked project
+        link_element = ElementTree.Element('link',
+                                           {"project": "%s" %src})
+        xml_root.append(link_element)
+
+        # remove repo
+        if not repo == None:
+           for repo_element in xml_root.findall('repository'):
+              if not repo_element.get('name') == repo:
+                 xml_root.remove(repo_element)
+
+        # Set linkedbuild attribute for all repositories
+        for repo_element in xml_root.findall('repository'):
+            repo_element.set('linkedbuild', linktype)
+            repo_element.set('rebuild', buildtype)
+            repo_element.set('block', blocktype) 
+
+        self.set_meta(ElementTree.tostring(xml_root), project)
+
     def unlink_project(self, project):
         """
         modify the meta conf to unlink the project
@@ -706,3 +750,88 @@ class BuildService(OSC):
                     elem.remove(subelem)
         ElementTree.SubElement(elem, value)
         self.set_meta(ElementTree.tostring(root), project, package)
+
+    def get_user_meta(self,apiurl, user):
+        u = core.makeurl(apiurl, ['person', core.quote_plus(user)])
+        try:
+            f = core.http_GET(u)
+            return ''.join(f.readlines())
+        except urllib2.HTTPError:
+            print 'user \'%s\' not found' % user
+            return None
+
+    def create_copy_pac(self, src_project, src_package, dst_project, dst_package,
+                        client_side_copy=False, keep_maintainers=False,keep_develproject=False,
+                        expand=False, revision=None, comment=None,
+                        force_meta_update=None, keep_link=None):
+        """create a copy of package
+           Copying can be done by downloading the files from one package and commit
+           them into the other by uploading them (client-side copy) --
+           or by the server, in a single api call.
+        """
+        core.copy_pac(self.apiurl, src_project, src_package, self.apiurl, dst_project, dst_package,
+                      client_side_copy,revision)
+
+    def get_dependson(self, project, repo, arch, packages=None, reverse=None):
+        """
+        get_dependson
+        """
+        query = []
+
+        if packages:
+            for p in packages:
+                query.append('package=%s' % core.quote_plus(p))
+
+        if reverse:
+            query.append('view=revpkgnames')
+        else:
+            query.append('view=pkgnames')
+
+        url = core.makeurl(self.apiurl, ['build', project, repo, arch,'_builddepinfo'],query=query)
+        return core.http_GET(url).read()
+
+    def show_upstream_rev(self, project, package, revision=None, expand=False, linkrev=None, meta=False, include_service_files=False):
+        """
+        show upstream rev
+        """
+        return core.show_upstream_rev(self.apiurl, project, package, revision, expand, linkrev, meta, include_service_files)
+
+    def disable_build_flag(self, prj,repo, flag, status):
+        """disable build flag for the project """
+        #Started POST "/source/acl-link?cmd=set_flag&flag=build&status=disable"
+        query = { 'cmd': 'set_flag' }
+        if flag:
+            query['flag'] = flag
+        if repo:
+            query['repository'] = repo
+        if status:
+            query['status'] = status
+
+        u = core.makeurl(self.apiurl, ['source', prj], query=query)
+        try:
+            print u
+            f = core.http_POST(u)
+        except urllib2.HTTPError, e:
+            e.osc_msg = 'could not trigger disable build flag for project \'%s\'' % (prj)
+            raise
+
+        return
+
+    def default_build_flag(self, prj, repo, flag):
+        """default build flag for the project """
+        # Started POST "/source/acl-link?cmd=remove_flag&flag=build
+        query = { 'cmd': 'remove_flag' }
+        if repo:
+            query['repository'] = repo
+        if flag:
+            query['flag'] = flag
+
+        u = core.makeurl(self.apiurl, ['source', prj], query=query)
+        try:
+            print u
+            f = core.http_POST(u)
+        except urllib2.HTTPError, e:
+            e.osc_msg = 'could not trigger default build flag for project \'%s\'' % (prj)
+            raise
+        return
+
index eb114ec..47c8910 100755 (executable)
@@ -28,6 +28,7 @@ import shutil
 from xml.dom import minidom
 
 from common.buildtrigger import trigger_info
+from common.buildservice import BuildService
 from common.utils import sync
 
 def restructure_output_dir(package_build_dict, target_path):
@@ -94,6 +95,12 @@ def main():
 
     project = content.get("project")
 
+    obs_api = os.getenv("OBS_API_URL")
+    obs_user = os.getenv("OBS_API_USERNAME")
+    obs_passwd = os.getenv("OBS_API_PASSWD")
+   
+    build = BuildService(obs_api, obs_user, obs_passwd)
+
     for repository in content.get("repo").keys():
         project_logs_base = os.path.join(build_base_path,
                                          project,
@@ -108,6 +115,29 @@ def main():
                                             'buildlogs',
                                             repository))
 
+    # Make file at packages depends of OBS
+    os.makedirs(os.path.join(sync_out_dir,'builddata','depends'))
+    reverse = 1
+    repo_status = build.get_repo_state(project)
+    for target_arch,status in repo_status.items():
+        repo = target_arch.split("/")[0]
+        arch = target_arch.split("/")[1]
+        xml = build.get_dependson(project, repo, arch, None, reverse)
+
+        file_name = os.path.join(sync_out_dir,'builddata','depends',"%s_%s_%s_revpkgdepends.xml"%(project,repo,arch))
+        #print file_name
+        with open(file_name, 'w') as xml_file:
+            xml_file.write(xml)             
+
+    # Make file at packages revision of OBS
+    packages_rev = dict()
+    for package in build.get_package_list(project):
+        packages_rev[package] = build.show_upstream_rev(project, package)
+    file_name = os.path.join(sync_out_dir,'builddata','depends', '%s_pkgrevisions.xml' % project)
+    #print str(packages_rev)
+    with open(file_name, 'w') as rev_file:
+        rev_file.write(str(packages_rev))
+
     # sync to donwload server
     sync(sync_out_dir, sync_dest)