class ref_create_project_obs(object):
""" create reference project to obs """
- profiles = ast.literal_eval(os.getenv("REF_ACTIVE_PRJS"))
+ if os.getenv("REF_ACTIVE_PRJS"):
+ profiles = ast.literal_eval(os.getenv("REF_ACTIVE_PRJS"))
+ else:
+ profiles = ''
pattern = r'tizen[0-9a-zA-Z_\-\.]*[0-9]{8}.[0-9]{1,2}'
def setup_profile(self, project, repo_path=None):
else:
return [results[-1]]
+ def update_build_flag_project(self, build, target, flag=None):
+ """
+ Update a build flag on project
+ """
+ if flag is None: # None is disable
+ build.disable_build_flag(target, repo = None, flag="publish", status="disable")
+ build.disable_build_flag(target, repo = None, flag="build", status="disable")
+ else: # default
+ build.default_build_flag(target, repo = None, flag="build")
+ build.default_build_flag(target, repo = None, flag="publish")
+
def create_project(self, build, target, info, meta, config, baserefproject=None):
"""
create project
#print ElementTree.tostring(xml_meta)
#add target person
- element = ElementTree.Element('person', {"userid": "%s" % (os.getenv("GERRIT_USERNAME")),"role": "maintainer"})
+ element = ElementTree.Element('person', {"userid": "%s" % (os.getenv("OBS_API_USERNAME")),
+ "role": "maintainer"})
xml_meta.append(element)
print ElementTree.tostring(xml_meta)
build.set_meta(ElementTree.tostring(xml_meta), target)
build.disable_build_flag(target, repo = None, flag="publish", status="disable")
#disable build flag
build.disable_build_flag(target, repo = None, flag="build", status="disable")
- #disable debuginfo flag
- build.disable_build_flag(target, repo = None, flag="debuginfo", status="disable")
- #disable useforbuild flag
- build.disable_build_flag(target, repo = None, flag="useforbuild", status="disable")
print "\nTarget project %s created" %(target)
return True
else:
"</service></services>"
"""
ret_dict = {}
-
sourceinfo = remote_build.get_sourceinfo_list(profile)
upload_packages=""
if packages:
_git = _url.split(os.getenv('GIT_CACHE_DIR')+'/')[1]
elif len(_url.split(os.getenv('GERRIT_FETCH_URL')+'/')) == 2:
_git = _url.split(os.getenv('GIT_CACHE_DIR')+'/')[1]
+ elif len(_url.split(os.getenv('GERRIT_SSHPORT')+'/')) == 2:
+ _git = _url.split(os.getenv('GERRIT_SSHPORT')+'/')[1]
if param.get('name') == 'revision':
_rev = param.text
build.disable_build_flag(this_project, repo = None, flag='build', status='disable')
build.disable_build_flag(this_project, repo = None, flag='publish', status='disable')
- build.disable_build_flag(this_project, repo = None, flag="debuginfo", status="disable")
- build.disable_build_flag(this_project, repo = None, flag="useforbuild", status="disable")
#build.link_project(this_project, src=target, linktype=None)
print 'Profile %s updated to %s' % (this_project, target)
- def run_ref_create_project_obs(self):
-
- force_trigger = False
+ def precheck_all_error_package(self, build, target):
+ """
+ Precheck all error package list from project
+ """
- print '---[JOB STARTED]-------------------------'
+ need_runservice = []
+ for _wait in range(0,30):
+ sys.stdout.flush()
+ sleep(10) # Wait 10 seconds...
+ viewinfofile = build.get_source_viewinfo(target, nofilename=0)
+ root = ElementTree.parse(viewinfofile).getroot()
+ errpackages = ''
+ errpackages = [ s.get('package') for s in root.iter('sourceinfo') if s.findall('error') ]
+ for x in root.iter('sourceinfo'):
+ for y in x.findall('filename'):
+ if '_service:gbs:service-error.spec' in y.text:
+ errpackages.append(x.get('package'))
+ break
+ for y in x.findall('error'):
+ print x.get('package'),y.text
+ if 'bad build configuration, no build type' in y.text:
+ errpackages.remove(x.get('package'))
+ print errpackages
+ if errpackages:
+ print ' 5-1) Under packages are still... (%d)\n %s' % (len(errpackages), errpackages)
+ # Retrigger git sync
+ for item in errpackages:
+ pkgview = ElementTree.fromstring(build.get_source_info(target, item))
+ for sv in pkgview.findall('serviceinfo'):
+ if sv.get('code') != 'failed': continue
+ for er in sv.findall('error'):
+ print ' %s %s with cause: (%s)' % (item, sv.get('code'), er.text)
+ need_runservice.append(item)
+ sys.stdout.flush()
+ sleep(30) # Wait 30 seconds...
+ for item in need_runservice:
+ print ' runservice for %s' % item
+ build.runservice(target, item)
+ need_runservice = []
+ else:
+ print ' 5-2) All packages imported.'
+ break
- obs_api = os.getenv("REF_TARGET_OBS_API_URL")
- obs_user = os.getenv("REF_TARGET_OBS_API_USERNAME")
- obs_passwd = os.getenv("REF_TARGET_OBS_API_PASSWD")
+ return errpackages
- remote_obs_api = os.getenv("REF_REMOTE_OBS_API_URL")
- remote_obs_user = os.getenv("REF_REMOTE_OBS_API_USERNAME")
- remote_obs_passwd = os.getenv("REF_REMOTE_OBS_API_PASSWD")
+ def run_ref_create_project_obs(self, obs_api, obs_user, obs_passwd,
+ remote_obs_api, remote_obs_user, remote_obs_passwd,
+ gerrit_env, fields=None):
- # default value is null
- if os.getenv("REF_GERRIT_NAME"):
- gerrit_env = GerritEnv(os.getenv("REF_GERRIT_NAME"))
- else:
- gerrit_env = GerritEnv("")
+ print '---[JOB STARTED]-------------------------'
remote_meta = ''
config = ''
todo_dict = {}
- # precheck profile
- fields = ''
- fields = trigger_info(os.getenv('TRIGGER_INFO'))
-
- # Check if we've got required field in TRIGGER_INFO
- for field in ('repo_path', 'build_id', 'project'):
- if field not in fields:
- print 'Error: TRIGGER_INFO doesn\'t contain %s' % field
- return -1
-
self.profile = self.setup_profile(fields['project'], fields['repo_path'])
if not self.profile:
print 'Skip Sync OBS project %s' % fields['project']
todo_dict = self.list_packages_from_remote(build_src, build, src, target)
else:
print "\n 0-2) project already exists: %s" %(target)
- todo_dict = self.list_packages_from_remote(build_src, build, target, target, existing=True)
+ todo_dict = self.list_packages_from_remote(build_src, build, src, target, existing=True)
print '\nListing from Remote Done at %s' % (str(datetime.now()))
print 'todo_dict(%d):' % (len(todo_dict))
if ret_dict_add:
todo_dict.update(ret_dict_add)
print '\nAdd Remove Done at %s' % (str(datetime.now()))
-
+
print "\n********"
print " 4) compare package project "
manifest_packages = self.get_manifest_filelists_snapshot(self.profile, \
print "\n********"
print " 5) Precheck all error package list from project"
+ errpackages = self.precheck_all_error_package(build, target)
- need_runservice = []
- for _wait in range(0,30):
+ print "\n********"
+ print " 6) create related packages \n"
+ self.create_related_packages(remote_build, build, profile, target)
+
+ print "\n********"
+ print " 7) Sync Done..."
+
+ if errpackages:
+ return 1
+ return 0
+
+ def run_copy_project_obs(self, obs_api, obs_user, obs_passwd,
+ remote_obs_api, remote_obs_user, remote_obs_passwd,
+ gerrit_env, fields=None):
+ """ copy project """
+
+ print '---[JOB STARTED]-------------------------'
+
+ remote_meta = ''
+ config = ''
+ remote_package_list = ''
+
+ todo_dict = {}
+
+ print '\nJOB Started at %s' % (str(datetime.now()))
+
+ #### remote buildservice ####
+ remote_build = BuildService(remote_obs_api, remote_obs_user, remote_obs_passwd)
+ #### target buildservice ####
+ build = BuildService(obs_api, obs_user, obs_passwd, \
+ remote_obs_api, remote_obs_user, remote_obs_passwd)
+
+ src = profile = fields['SRC_PROJECT']
+ target = fields['DEST_PROJECT']
+
+ build_src = build
+ print "src = %s , target = %s" %(src, target)
+
+ print " 0) Get meta, config, package list from remote [ %s ]" % (profile)
+ remote_meta = remote_build.get_meta(profile)
+ config = remote_build.get_project_config(profile)
+ remote_package_list = [ p for p in remote_build.get_sourceinfo_list(profile) ]
+ print '\nGet Package List from Remote Done at %s' % (str(datetime.now()))
+ if 'patchinfo' in remote_package_list:
+ remote_package_list.remove('patchinfo')
+ print 'Please check patchinfo'
+
+ print "\n 0-1) copy package list (%d):\n %s" %(len(remote_package_list), remote_package_list)
+ if not build.exists(target):
+ print "\n 0-2) create project: %s" %(target)
+ self.create_project(build, target, None, remote_meta, config)
+ todo_dict = self.list_packages_from_remote(build_src, build, src, target)
+ else:
+ print "\n 0-2) project already exists: %s" %(target)
+ todo_dict = self.list_packages_from_remote(build_src, build, target, target, existing=True)
+
+ print '\nListing from Remote Done at %s' % (str(datetime.now()))
+ print 'todo_dict(%d):' % (len(todo_dict))
+
+ if True:
+ package_list = [ x for x in todo_dict ]
+ print "\n********"
+ print " 1) package list of target project \n %s" %(package_list)
+
+ packages = self.remove_duplicates(package_list, remote_package_list)
+ print "\n********"
+ print " 2) remove package %s" %(packages)
+ for pkgname in packages:
+ del todo_dict[pkgname]
+ #build.delete_package(target, pkgname)
+
+ packages = self.remove_duplicates(remote_package_list, package_list)
+ print "\n********"
+ print " 3) add packages %s" %(packages)
+ if packages:
+ ret_dict_add = self.list_packages_from_remote(\
+ remote_build, build, profile, target, packages=packages)
+ if ret_dict_add:
+ todo_dict.update(ret_dict_add)
+ print '\nAdd Remove Done at %s' % (str(datetime.now()))
+
+ print '\n 4-1) Final packages to be updated %d' % len(todo_dict)
sys.stdout.flush()
- sleep(10) # Wait 10 seconds...
- viewinfofile = build.get_source_viewinfo(target, nofilename=0)
- root = ElementTree.parse(viewinfofile).getroot()
- errpackages = ''
- errpackages = [ s.get('package') for s in root.iter('sourceinfo') if s.findall('error') ]
- for x in root.iter('sourceinfo'):
- for y in x.findall('filename'):
- if '_service:gbs:service-error.spec' in y.text:
- errpackages.append(x.get('package'))
- break
- for y in x.findall('error'):
- print x.get('package'),y.text
- if 'bad build configuration, no build type' in y.text:
- errpackages.remove(x.get('package'))
- print errpackages
- if errpackages:
- print ' 5-1) Under packages are still... (%d)\n %s' % (len(errpackages), errpackages)
- # Retrigger git sync
- for item in errpackages:
- pkgview = ElementTree.fromstring(build.get_source_info(target, item))
- for sv in pkgview.findall('serviceinfo'):
- if sv.get('code') != 'failed': continue
- for er in sv.findall('error'):
- print ' %s %s with cause: (%s)' % (item, sv.get('code'), er.text)
- need_runservice.append(item)
- sys.stdout.flush()
- sleep(30) # Wait 30 seconds...
- for item in need_runservice:
- print ' runservice for %s' % item
- build.runservice(target, item)
- need_runservice = []
- else:
- print ' 5-2) All packages imported.'
- break
+ self.update_packages(remote_build, build, profile, target, todo_dict)
+ print '\nUpdate Packages Done at %s' % (str(datetime.now()))
+
+ print "\n********"
+ print " 5) Precheck all error package list from project"
+ errpackages = self.precheck_all_error_package(build, target)
print "\n********"
print " 6) create related packages \n"
print "\n********"
print " 7) Sync Done..."
- # importrpm trigger next
- fields['profile'] = profile
- fields['target'] = target
- trigger_next("REF_IMPORT_RPM_OBS", fields)
+ self.update_build_flag_project(build, target, flag=True)
+ print "\n********"
+ print " 8) Update build flag=default..."
if errpackages:
return 1
return 0
- def main(self):
+ def main(self, action=None):
+ """
+ main
+ """
print('-----[JOB STARTED: ref_create_project_obs ]-----')
+
for loop in range(1):
try:
- return self.run_ref_create_project_obs()
+ if action == 'create' or action is None:
+
+ remote_obs_api = obs_api = os.getenv("REF_TARGET_OBS_API_URL")
+ remote_obs_user = obs_user = os.getenv("REF_TARGET_OBS_API_USERNAME")
+ remote_obs_passwd = obs_passwd = os.getenv("REF_TARGET_OBS_API_PASSWD")
+ gerrit_env = GerritEnv("")
+
+ fields = trigger_info(os.getenv('TRIGGER_INFO'))
+ # Check if we've got required field in TRIGGER_INFO
+ for field in ('repo_path', 'build_id', 'project'):
+ if field not in fields:
+ print 'Error: TRIGGER_INFO doesn\'t contain %s' % field
+ return -1
+
+ return self.run_ref_create_project_obs(obs_api, obs_user, obs_passwd,
+ remote_obs_api, remote_obs_user, remote_obs_passwd,
+ gerrit_env, fields)
+ elif action == 'copy':
+
+ remote_obs_api = obs_api = os.getenv("REF_TARGET_OBS_API_URL")
+ remote_obs_user = obs_user = os.getenv("REF_TARGET_OBS_API_USERNAME")
+ remote_obs_passwd = obs_passwd = os.getenv("REF_TARGET_OBS_API_PASSWD")
+ gerrit_env = GerritEnv("")
+
+ if os.getenv('SRC_PROJECT') and os.getenv('DEST_PROJECT'):
+ fields = {'SRC_PROJECT': os.getenv('SRC_PROJECT'),
+ 'DEST_PROJECT': os.getenv('DEST_PROJECT')}
+ else:
+ fields = trigger_info(os.getenv('TRIGGER_INFO'))
+ # Check if we've got required field in TRIGGER_INFO
+ for field in ('SRC_PROJECT', 'DEST_PROJECT'):
+ if field not in fields:
+ print 'Error: TRIGGER_INFO doesn\'t contain %s' % field
+ return -1
+
+ return self.run_copy_project_obs(obs_api, obs_user, obs_passwd,
+ remote_obs_api, remote_obs_user, remote_obs_passwd,
+ gerrit_env, fields)
+ elif action == 'remote-create':
+
+ obs_api = os.getenv("REF_TARGET_OBS_API_URL")
+ obs_user = os.getenv("REF_TARGET_OBS_API_USERNAME")
+ obs_passwd = os.getenv("REF_TARGET_OBS_API_PASSWD")
+
+ remote_obs_api = os.getenv("REF_REMOTE_OBS_API_URL")
+ remote_obs_user = os.getenv("REF_REMOTE_OBS_API_USERNAME")
+ remote_obs_passwd = os.getenv("REF_REMOTE_OBS_API_PASSWD")
+ # default value is null
+ if os.getenv("REF_GERRIT_NAME"):
+ gerrit_env = GerritEnv(os.getenv("REF_GERRIT_NAME"))
+ else:
+ gerrit_env = GerritEnv("")
+
+ fields = trigger_info(os.getenv('TRIGGER_INFO'))
+ # Check if we've got required field in TRIGGER_INFO
+ for field in ('repo_path', 'build_id', 'project'):
+ if field not in fields:
+ print 'Error: TRIGGER_INFO doesn\'t contain %s' % field
+ return -1
+
+ return self.run_ref_create_project_obs(obs_api, obs_user, obs_passwd,
+ remote_obs_api, remote_obs_user, remote_obs_passwd,
+ gerrit_env, fields)
+
+ else:
+ print 'not enable action = %s' %(action)
+ return -1
except Exception, err:
- print 'run_ref_create_project_obs operation failed, retrying...'
+ print 'run_ef_create_project_obs operation failed, retrying...'
print err
raise LocalError("FAIL %s" % (err))
sleep(5)
try:
trigger = ref_create_project_obs()
- sys.exit(trigger.main())
+ sys.exit(trigger.main(sys.argv[1]))
except Exception as e:
print(e)
sys.exit(1)