def prepare_matrix(self, jobs, recipes, label=None): data = OrderedDict() if not label: label = create_matrix(settings.PREVIOUS_DAYS) for job in jobs: job.recipes = dict() data[job.whiteboard] = job for recipe in recipes: whiteboard = recipe.job.template.whiteboard lb = render_label(recipe.get_dict(), data[whiteboard].grouprecipes) tmp_recipe = data[whiteboard].recipes if lb not in tmp_recipe: tmp_recipe[lb] = dict() tmp_recipe[lb]["job"] = whiteboard tmp_recipe[lb]["days"] = OrderedDict() tmp_recipe[lb]["label"] = lb for d in label: tmp_recipe[lb]["days"][d] = { "recipe": None, "schedule": []} labeldate = recipe.get_date().date() # recipe isn't in range of date # FIXME if labeldate not in tmp_recipe[lb]["days"]: continue tmp_recipe[lb]["days"][labeldate]["recipe"] = recipe tmp_recipe[lb]["days"][labeldate]["schedule"].append(recipe.uid) return data
def prepare_matrix(self, jobs, recipes, label=None): data, reschedule = OrderedDict(), 0 if not label: label = create_matrix(settings.PREVIOUS_DAYS) for job in jobs: job.recipes = dict() data[job.whiteboard] = job for recipe in recipes: whiteboard = recipe.job.template.whiteboard lb = render_label(recipe.get_dict(), data[whiteboard].grouprecipes) tmp_recipe = data[whiteboard].recipes if lb not in tmp_recipe: tmp_recipe[lb] = dict() tmp_recipe[lb]["job"] = whiteboard tmp_recipe[lb]["days"] = OrderedDict() tmp_recipe[lb]["label"] = lb for d in label: tmp_recipe[lb]["days"][d] = { "recipe": None, "schedule": []} labeldate = recipe.get_date().date() # recipe isn't in range of date # FIXME if labeldate not in tmp_recipe[lb]["days"]: continue tmp_recipe[lb]["days"][labeldate]["recipe"] = recipe tmp_recipe[lb]["days"][labeldate]["schedule"].append(recipe.uid) return data
def __expand_task_grouprecipes_template(self, task): """If Task-s JobTemplate have "Grouprecipes" template set (e.g. "{{arch}}"), render that template (i.e. get actual value for the template)""" tmp = { "arch": task["recipe__arch__name"], "distro": task["recipe__distro__name"], "distro_label": task["recipe__distro__name"], "whiteboard": task["recipe__whiteboard"], "alias": task["alias"], } return render_label(tmp, task["recipe__job__template__grouprecipes"])
def prepare_matrix(self, tests=[], periodschedules=[]): """Load info about from DB and return it in template friendly object.""" out_dict = {} # template friendly data structure # Determine plain list of period schedule IDs periodschedule_ids = self.__get_period_ids(periodschedules) # Set list of tables and fields for the query and create initial # version of the filter (filter by "test_id" will be added later # in the loop below) relations = [ 'test', 'recipe', 'recipe__arch', 'recipe__distro', 'recipe__job', 'recipe__job__template', 'recipe__job__schedule' ] fields = [ 'test_id', 'id', 'uid', 'result', 'status', 'statusbyuser', 'alias', 'recipe__id', 'recipe__uid', 'recipe__status', 'recipe__resultrate', 'recipe__whiteboard', 'recipe__statusbyuser', 'recipe__arch__name', 'recipe__result', 'recipe__distro__name', 'recipe__job__id', 'recipe__job__uid', 'recipe__job__template__id', 'recipe__job__template__whiteboard', 'recipe__job__template__grouprecipes', 'recipe__job__schedule__id', 'recipe__job__schedule__counter', 'recipe__job__schedule__period_id', ] filters = {} filters['recipe__job__schedule__id__in'] = periodschedule_ids filters['test_id__in'] = [test.id for test in tests] # Now add all the tests info into the output data for test in tests: # Popupate tests (no matter if runs in given periodschedules # exists - we are interested in empty tests as well) if test.id not in out_dict: out_dict[test.id] = { 'name': test.name, 'test_id': test.id, 'owner__name': test.owner.name, 'owner__email': test.owner.email, 'get_absolute_url': test.get_absolute_url(), 'get_reposituory_url': test.get_reposituory_url(), 'get_detail_url': test.get_detail_url(), 'test__groups__name': [], 'data': {}, } # Populate test's groups if test.groups.name not in out_dict[test.id]['test__groups__name']: out_dict[test.id]['test__groups__name'].append( test.groups.name) # Finally execute the query data = Task.objects.filter(**filters).select_related(*relations).only( *fields) # Reorder data into tempate friendly data structure for i in data: # Populate period schedules (because one test can run in 'Daily # automation' and 'Weekly automation' and...) if i.recipe.job.schedule.period_id not in out_dict[ i.test.id]['data']: title = '' for p in periodschedules[i.recipe.job.schedule.period_id]: if p['id'] == i.recipe.job.schedule.id: title = p['period__title'] break out_dict[i.test.id]['data'][ i.recipe.job.schedule.period_id] = { 'title': title, 'data': {}, } # Popupate job (just general info common for more nightly runs) if i.recipe.job.template.id not in out_dict[i.test.id]['data'][ i.recipe.job.schedule.period_id]['data']: out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id][ 'data'][i.recipe.job.template.id] = { 'template__whiteboard': i.recipe.job.template.whiteboard, 'template__id': i.recipe.job.template.id, 'data': {}, } # Popupate recipe (just general info common for more nightly # runs) tmp = { "arch": i.recipe.arch.name, "distro": i.recipe.distro.name, "distro_label": i.recipe.distro.name, "whiteboard": i.recipe.whiteboard, "alias": i.alias, } recipe_matcher = render_label(tmp, i.recipe.job.template.grouprecipes) if recipe_matcher not in out_dict[i.test.id]['data'][ i.recipe.job.schedule.period_id]['data'][ i.recipe.job.template.id]['data']: out_dict[i.test.id]['data'][ i.recipe.job.schedule.period_id]['data'][ i.recipe.job.template.id]['data'][recipe_matcher] = { 'data': {}, } # Populate schedule if i.recipe.job.schedule.id not in out_dict[i.test.id]['data'][ i.recipe.job.schedule.period_id]['data'][ i.recipe.job.template. id]['data'][recipe_matcher]['data']: out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id][ 'data'][i.recipe.job.template.id]['data'][recipe_matcher][ 'data'][i.recipe.job.schedule.id] = { 'counter': i.recipe.job.schedule.counter, 'data': {}, } # Populate task (i.e. test run) if i.id not in out_dict[i.test.id]['data'][ i.recipe.job.schedule.period_id]['data'][ i.recipe.job.template.id]['data'][recipe_matcher][ 'data'][i.recipe.job.schedule.id]['data']: out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id][ 'data'][i.recipe.job.template.id]['data'][recipe_matcher][ 'data'][i.recipe.job.schedule.id]['data'][i.id] = { 'uid': i.uid, 'id': i.id, 'result': i.get_result(), 'status': i.status, # i.recipe.get_status(), 'is_running': i.recipe.is_running(), 'recipe__id': i.recipe.id, 'recipe__uid': i.recipe.get_uid, 'recipe__result': i.recipe.get_result(), 'recipe__resultrate': i.recipe.resultrate, 'recipe__job__uid': i.recipe.job.uid, } return out_dict
def prepare_matrix(self, test_ids=[], periodschedules=[]): """Load info about from DB and return it in template friendly object.""" out_dict = {} # template friendly data structure # Determine plain list of period schedule IDs periodschedule_ids = self.__get_period_ids(periodschedules) # Set list of tables and fields for the query and create initial # version of the filter (filter by "test_id" will be added later # in the loop below) relations = ['test', 'test__owner', 'test__git', 'recipe', 'recipe__arch', 'recipe__distro', 'recipe__job', 'recipe__job__template', 'recipe__job__schedule'] fields = [ 'test__id', 'test__name', 'test__folder', 'test__owner__id', 'test__owner__name', 'test__owner__email', 'test__git__id', 'test__git__localurl', 'test__groups__name', 'id', 'uid', 'result', 'status', 'statusbyuser', 'alias', 'recipe__id', 'recipe__uid', 'recipe__status', 'recipe__resultrate', 'recipe__whiteboard', 'recipe__statusbyuser', 'recipe__arch__name', 'recipe__result', 'recipe__distro__name', 'recipe__job__id', 'recipe__job__uid', 'recipe__job__template__id', 'recipe__job__template__whiteboard', 'recipe__job__template__grouprecipes', 'recipe__job__schedule__id', 'recipe__job__schedule__counter', 'recipe__job__schedule__period_id', ] filters = {} filters['recipe__job__schedule__id__in'] = periodschedule_ids # Now process all the tests for test_id in test_ids: filters['test_id'] = test_id data = Task.objects.filter( **filters).select_related(*relations).only(*fields) # Reorder data into tempate friendly data structure for i in data: # Popupate tests if i.test.id not in out_dict: out_dict[i.test.id] = { 'name': i.test.name, 'owner__name': i.test.owner.name, 'owner__email': i.test.owner.email, 'get_absolute_url': i.test.get_absolute_url(), 'get_reposituory_url': i.test.get_reposituory_url(), 'get_detail_url': i.test.get_detail_url(), 'test__groups__name': [], 'data': {}, } # Populate test's groups if i.test.groups.name not in out_dict[ i.test.id]['test__groups__name']: out_dict[i.test.id]['test__groups__name'].append( i.test.groups.name) # Populate period schedules (because one test can run in 'Daily # automation' and 'Weekly automation' and...) if i.recipe.job.schedule.period_id not in out_dict[ i.test.id]['data']: title = '' for p in periodschedules[i.recipe.job.schedule.period_id]: if p['id'] == i.recipe.job.schedule.id: title = p['period__title'] break out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id] = { 'title': title, 'data': {}, } # Popupate job (just general info common for more nightly runs) if i.recipe.job.template.id not in out_dict[i.test.id][ 'data'][i.recipe.job.schedule.period_id]['data']: out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id]['data'][i.recipe.job.template.id] = { 'template__whiteboard': i.recipe.job.template.whiteboard, 'data': {}, } # Popupate recipe (just general info common for more nightly # runs) tmp = { "arch": i.recipe.arch.name, "distro": i.recipe.distro.name, "distro_label": i.recipe.distro.name, "whiteboard": i.recipe.whiteboard, "alias": i.alias, } recipe_matcher = render_label( tmp, i.recipe.job.template.grouprecipes) if recipe_matcher not in out_dict[i.test.id]['data'][ i.recipe.job.schedule.period_id]['data'][i.recipe.job.template.id]['data']: out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id]['data'][i.recipe.job.template.id]['data'][recipe_matcher] = { 'data': {}, } # Populate schedule if i.recipe.job.schedule.id not in out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id][ 'data'][i.recipe.job.template.id]['data'][recipe_matcher]['data']: out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id]['data'][i.recipe.job.template.id]['data'][recipe_matcher]['data'][i.recipe.job.schedule.id] = { 'counter': i.recipe.job.schedule.counter, 'data': {}, } # Populate task (i.e. test run) if i.id not in out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id]['data'][ i.recipe.job.template.id]['data'][recipe_matcher]['data'][i.recipe.job.schedule.id]['data']: out_dict[i.test.id]['data'][i.recipe.job.schedule.period_id]['data'][i.recipe.job.template.id]['data'][recipe_matcher]['data'][i.recipe.job.schedule.id]['data'][i.id] = { 'uid': i.uid, 'result': i.get_result(), 'status': i.recipe.get_status(), 'is_running': i.recipe.is_running(), 'recipe__id': i.recipe.id, 'recipe__uid': i.recipe.uid, 'recipe__result': i.recipe.get_result(), 'recipe__resultrate': i.recipe.resultrate, 'recipe__job__uid': i.recipe.job.uid, } return out_dict