def testjob(request, job): job = get_restricted_job(request.user, pk=job, request=request) data = ResultsView(request, model=TestSuite, table_class=TestJobResultsTable) suite_table = TestJobResultsTable( data.get_table_data().filter(job=job) ) failed_definitions = [] yaml_dict = OrderedDict() if TestData.objects.filter(testjob=job).exists(): # some duplicates can exist, so get would fail here and [0] is quicker than try except. testdata = TestData.objects.filter( testjob=job).prefetch_related('actionlevels__testcase', 'actionlevels__testcase__suite')[0] if job.state == TestJob.STATE_FINISHED: # returns something like ['singlenode-advanced', 'smoke-tests-basic', 'smoke-tests-basic'] executed = [ { case.action_metadata['test_definition_start']: case.action_metadata.get('success', '')} for case in TestCase.objects.filter( suite__in=TestSuite.objects.filter(job=job)) if case.action_metadata and 'test_definition_start' in case.action_metadata and case.suite.name == 'lava'] submitted = [ actiondata.testcase.action_metadata for actiondata in testdata.actionlevels.all() if actiondata.testcase and 'test-runscript-overlay' in actiondata.action_name] # compare with a dict similar to created in executed for item in submitted: if executed and {item['name']: item['success']} not in executed: comparison = {} if item['from'] != 'inline': comparison['repository'] = item['repository'] comparison['path'] = item['path'] comparison['name'] = item['name'] comparison['uuid'] = item['success'] failed_definitions.append(comparison) # hide internal python objects, like OrderedDict for data in testdata.attributes.all().order_by('name'): yaml_dict[str(data.name)] = str(data.value) RequestConfig(request, paginate={"per_page": suite_table.length}).configure(suite_table) template = loader.get_template("lava_results_app/job.html") return HttpResponse(template.render( { 'bread_crumb_trail': BreadCrumbTrail.leading_to(testjob, job=job.id), 'job': job, 'job_link': pklink(job), 'suite_table': suite_table, 'metadata': yaml_dict, 'failed_definitions': failed_definitions, 'condition_choices': simplejson.dumps( QueryCondition.get_condition_choices(job) ), 'available_content_types': simplejson.dumps( QueryCondition.get_similar_job_content_types() ), }, request=request))
def testcase(request, job, pk, case): """ Each testcase can appear multiple times in the same testsuite and testjob, the action_data.action_level distinguishes each testcase. :param request: http request object :param job: ID of the TestJob :param pk: the name of the TestSuite :param case: the name of one or more TestCase objects in the TestSuite """ test_suite = get_object_or_404(TestSuite, name=pk, job=job) job = get_object_or_404(TestJob, pk=job) test_cases = TestCase.objects.filter(name=case, suite=test_suite) return render_to_response( "lava_results_app/case.html", { 'bread_crumb_trail': BreadCrumbTrail.leading_to(testcase, pk=pk, job=job.id, case=case), 'job': job, 'suite': test_suite, 'job_link': pklink(job), 'test_cases': test_cases, }, RequestContext(request))
def suite(request, job, pk): job = get_object_or_404(TestJob, pk=job) check_request_auth(request, job) test_suite = get_object_or_404(TestSuite, name=pk, job=job) data = SuiteView(request, model=TestCase, table_class=SuiteTable) suite_table = SuiteTable(data.get_table_data().filter(suite=test_suite)) RequestConfig(request, paginate={ "per_page": suite_table.length }).configure(suite_table) template = loader.get_template("lava_results_app/suite.html") return HttpResponse( template.render( { 'bread_crumb_trail': BreadCrumbTrail.leading_to(suite, pk=pk, job=job.id), 'job': job, 'job_link': pklink(job), 'content_type_id': ContentType.objects.get_for_model(TestCase).id, 'suite_name': pk, 'suite_table': suite_table, 'bug_links': BugLink.objects.filter( object_id=test_suite.id, content_type_id=ContentType.objects.get_for_model( TestSuite).id, ) }, request=request))
def testjob(request, job): job = get_restricted_job(request.user, pk=job, request=request) data = ResultsView(request, model=TestSuite, table_class=TestJobResultsTable) suite_table = TestJobResultsTable( data.get_table_data().filter(job=job), request=request ) failed_definitions = [] yaml_dict = OrderedDict() if hasattr(job, "testdata"): for data in job.testdata.attributes.all().order_by("name"): yaml_dict[str(data.name)] = str(data.value) RequestConfig(request, paginate={"per_page": suite_table.length}).configure( suite_table ) template = loader.get_template("lava_results_app/job.html") return HttpResponse( template.render( { "bread_crumb_trail": BreadCrumbTrail.leading_to(testjob, job=job.id), "job": job, "job_link": pklink(job), "suite_table": suite_table, "metadata": yaml_dict, "condition_choices": simplejson.dumps( QueryCondition.get_condition_choices(job) ), "available_content_types": simplejson.dumps( QueryCondition.get_similar_job_content_types() ), }, request=request, ) )
def testcase(request, job, pk, case): """ Each testcase can appear multiple times in the same testsuite and testjob, the action_data.action_level distinguishes each testcase. :param request: http request object :param job: ID of the TestJob :param pk: the name of the TestSuite :param case: the name of one or more TestCase objects in the TestSuite """ test_suite = get_object_or_404(TestSuite, name=pk, job=job) job = get_restricted_job(request.user, pk=job, request=request) test_cases = TestCase.objects.filter(name=case, suite=test_suite) template = loader.get_template("lava_results_app/case.html") return HttpResponse( template.render( { 'bread_crumb_trail': BreadCrumbTrail.leading_to( testcase, pk=pk, job=job.id, case=case), 'job': job, 'suite': test_suite, 'job_link': pklink(job), 'test_cases': test_cases, 'bug_links': BugLink.objects.filter( object_id__in=test_cases.values_list('id', flat=True), content_type_id=ContentType.objects.get_for_model( TestCase).id, ) }, request=request))
def suite(request, job, pk): job = get_restricted_job(request.user, pk=job, request=request) test_suite = get_object_or_404(TestSuite, name=pk, job=job) data = SuiteView(request, model=TestCase, table_class=SuiteTable) suite_table = SuiteTable(data.get_table_data().filter(suite=test_suite)) RequestConfig(request, paginate={"per_page": suite_table.length}).configure( suite_table ) template = loader.get_template("lava_results_app/suite.html") return HttpResponse( template.render( { "bread_crumb_trail": BreadCrumbTrail.leading_to( suite, pk=pk, job=job.id ), "job": job, "job_link": pklink(job), "testsuite_content_type_id": ContentType.objects.get_for_model( TestSuite ).id, "suite_name": pk, "suite_id": test_suite.id, "suite_table": suite_table, "bug_links": BugLink.objects.filter( object_id=test_suite.id, content_type_id=ContentType.objects.get_for_model(TestSuite).id, ), }, request=request, ) )
def suite(request, job, pk): job = get_restricted_job(request.user, pk=job, request=request) test_suite = get_object_or_404(TestSuite, name=pk, job=job) data = SuiteView(request, model=TestCase, table_class=SuiteTable) suite_table = SuiteTable( data.get_table_data().filter(suite=test_suite) ) RequestConfig(request, paginate={"per_page": suite_table.length}).configure(suite_table) template = loader.get_template("lava_results_app/suite.html") return HttpResponse(template.render( { 'bread_crumb_trail': BreadCrumbTrail.leading_to(suite, pk=pk, job=job.id), 'job': job, 'job_link': pklink(job), 'testsuite_content_type_id': ContentType.objects.get_for_model( TestSuite).id, 'suite_name': pk, 'suite_id': test_suite.id, 'suite_table': suite_table, 'bug_links': BugLink.objects.filter( object_id=test_suite.id, content_type_id=ContentType.objects.get_for_model( TestSuite).id, ) }, request=request))
def testcase(request, job, pk, case): """ Each testcase can appear multiple times in the same testsuite and testjob, the action_data.action_level distinguishes each testcase. :param request: http request object :param job: ID of the TestJob :param pk: the name of the TestSuite :param case: the name of one or more TestCase objects in the TestSuite """ test_suite = get_object_or_404(TestSuite, name=pk, job=job) job = get_restricted_job(request.user, pk=job, request=request) test_cases = TestCase.objects.filter(name=case, suite=test_suite) test_sets = TestSet.objects.filter(name=case, suite=test_suite) extra_source = {} logger = logging.getLogger('dispatcher-master') for extra_case in test_cases: try: f_metadata = yaml.load(extra_case.metadata, Loader=yaml.CLoader) except TypeError: logger.info("Unable to load extra case metadata for %s", extra_case) f_metadata = {} extra_data = f_metadata.get('extra', None) if extra_data and isinstance(extra_data, unicode) and os.path.exists(extra_data): with open(f_metadata['extra'], 'r') as extra_file: items = yaml.load(extra_file, Loader=yaml.CLoader) # hide the !!python OrderedDict prefix from the output. for key, value in items.items(): extra_source.setdefault(extra_case.id, '') extra_source[extra_case.id] += "%s: %s\n" % (key, value) template = loader.get_template("lava_results_app/case.html") return HttpResponse( template.render( { 'bread_crumb_trail': BreadCrumbTrail.leading_to( testcase, pk=pk, job=job.id, case=case), 'job': job, 'sets': test_sets, 'suite': test_suite, 'job_link': pklink(job), 'extra_source': extra_source, 'test_cases': test_cases, 'bug_links': BugLink.objects.filter( object_id__in=test_cases.values_list('id', flat=True), content_type_id=ContentType.objects.get_for_model( TestCase).id, ) }, request=request))
def testjob(request, job): job = get_object_or_404(TestJob, pk=job) data = ResultsView(request, model=TestSuite, table_class=ResultsTable) suite_table = ResultsTable( data.get_table_data().filter(job=job) ) RequestConfig(request, paginate={"per_page": suite_table.length}).configure(suite_table) return render_to_response( "lava_results_app/job.html", { 'bread_crumb_trail': BreadCrumbTrail.leading_to(testjob, job=job.id), 'job': job, 'job_link': pklink(job), 'suite_table': suite_table, }, RequestContext(request))
def testset(request, job, ts, pk, case): job = get_object_or_404(TestJob, pk=job) test_suite = get_object_or_404(TestSuite, name=pk, job=job) test_set = get_object_or_404(TestSet, name=ts, suite=test_suite) test_cases = TestCase.objects.filter(name=case, test_set=test_set) return render_to_response( "lava_results_app/case.html", { 'bread_crumb_trail': BreadCrumbTrail.leading_to( testset, pk=pk, job=job.id, ts=ts, case=case), 'job': job, 'suite': test_suite, 'job_link': pklink(job), 'test_cases': test_cases, }, RequestContext(request))
def testset(request, job, ts, pk, case): job = get_restricted_job(request.user, pk=job, request=request) test_suite = get_object_or_404(TestSuite, name=pk, job=job) test_set = get_object_or_404(TestSet, name=ts, suite=test_suite) test_cases = TestCase.objects.filter(name=case, test_set=test_set) template = loader.get_template("lava_results_app/case.html") return HttpResponse(template.render( { 'bread_crumb_trail': BreadCrumbTrail.leading_to( testset, pk=pk, job=job.id, ts=ts, case=case), 'job': job, 'suite': test_suite, 'job_link': pklink(job), 'test_cases': test_cases, }, request=request))
def suite(request, job, pk): job = get_object_or_404(TestJob, pk=job) test_suite = get_object_or_404(TestSuite, name=pk, job=job) data = SuiteView(request, model=TestCase, table_class=SuiteTable) suite_table = SuiteTable( data.get_table_data().filter(suite=test_suite) ) RequestConfig(request, paginate={"per_page": suite_table.length}).configure(suite_table) return render_to_response( "lava_results_app/suite.html", { 'bread_crumb_trail': BreadCrumbTrail.leading_to(suite, pk=pk, job=job.id), 'job': job, 'job_link': pklink(job), 'suite_name': pk, 'suite_table': suite_table, }, RequestContext(request))
def testcase(request, job, pk, case): """ Each testcase can appear multiple times in the same testsuite and testjob, the action_data.action_level distinguishes each testcase. :param request: http request object :param job: ID of the TestJob :param pk: the name of the TestSuite :param case: the name of one or more TestCase objects in the TestSuite """ test_suite = get_object_or_404(TestSuite, name=pk, job=job) job = get_restricted_job(request.user, pk=job, request=request) test_cases = TestCase.objects.filter(name=case, suite=test_suite) test_sets = TestSet.objects.filter(name=case, suite=test_suite) extra_source = '' logger = logging.getLogger('dispatcher-master') for extra_case in test_cases: try: f_metadata = yaml.load(extra_case.metadata, Loader=yaml.CLoader) except TypeError: logger.info("Unable to load extra case metadata for %s", extra_case) f_metadata = {} extra_data = f_metadata.get('extra', None) if extra_data and isinstance(extra_data, unicode) and os.path.exists(extra_data): with open(f_metadata['extra'], 'r') as extra_file: items = yaml.load(extra_file, Loader=yaml.CLoader) # hide the !!python OrderedDict prefix from the output. for key, value in items.items(): extra_source += "%s: %s\n" % (key, value) template = loader.get_template("lava_results_app/case.html") return HttpResponse(template.render( { 'bread_crumb_trail': BreadCrumbTrail.leading_to(testcase, pk=pk, job=job.id, case=case), 'job': job, 'sets': test_sets, 'suite': test_suite, 'job_link': pklink(job), 'extra_source': extra_source, 'test_cases': test_cases, 'bug_links': BugLink.objects.filter( object_id__in=test_cases.values_list('id', flat=True), content_type_id=ContentType.objects.get_for_model( TestCase).id, ) }, request=request))
def testjob(request, job): job = get_restricted_job(request.user, pk=job, request=request) data = ResultsView(request, model=TestSuite, table_class=TestJobResultsTable) suite_table = TestJobResultsTable(data.get_table_data().filter(job=job), request=request) failed_definitions = [] yaml_dict = OrderedDict() with contextlib.suppress(TestData.DoesNotExist): # some duplicates can exist, so get would fail here and [0] is quicker than try except. testdata = TestData.objects.filter(testjob=job)[0] # hide internal python objects, like OrderedDict for data in testdata.attributes.all().order_by("name"): yaml_dict[str(data.name)] = str(data.value) RequestConfig(request, paginate={ "per_page": suite_table.length }).configure(suite_table) template = loader.get_template("lava_results_app/job.html") return HttpResponse( template.render( { "bread_crumb_trail": BreadCrumbTrail.leading_to(testjob, job=job.id), "job": job, "job_link": pklink(job), "suite_table": suite_table, "metadata": yaml_dict, "condition_choices": simplejson.dumps(QueryCondition.get_condition_choices(job)), "available_content_types": simplejson.dumps( QueryCondition.get_similar_job_content_types()), }, request=request, ))
def testset(request, job, ts, pk, case): job = get_restricted_job(request.user, pk=job, request=request) test_suite = get_object_or_404(TestSuite, name=pk, job=job) test_set = get_object_or_404(TestSet, name=ts, suite=test_suite) test_cases = TestCase.objects.filter(name=case, test_set=test_set) template = loader.get_template("lava_results_app/case.html") return HttpResponse( template.render( { "bread_crumb_trail": BreadCrumbTrail.leading_to( testset, pk=pk, job=job.id, ts=ts, case=case ), "job": job, "suite": test_suite, "job_link": pklink(job), "test_cases": test_cases, }, request=request, ) )
def testjob(request, job): job = get_restricted_job(request.user, pk=job, request=request) data = ResultsView(request, model=TestSuite, table_class=TestJobResultsTable) suite_table = TestJobResultsTable(data.get_table_data().filter(job=job)) failed_definitions = [] yaml_dict = OrderedDict() if TestData.objects.filter(testjob=job).exists(): # some duplicates can exist, so get would fail here and [0] is quicker than try except. testdata = TestData.objects.filter(testjob=job).prefetch_related( "actionlevels__testcase", "actionlevels__testcase__suite" )[0] if job.state == TestJob.STATE_FINISHED: # returns something like ['singlenode-advanced', 'smoke-tests-basic', 'smoke-tests-basic'] executed = [ { case.action_metadata[ "test_definition_start" ]: case.action_metadata.get("success", "") } for case in TestCase.objects.filter( suite__in=TestSuite.objects.filter(job=job) ) if case.action_metadata and "test_definition_start" in case.action_metadata and case.suite.name == "lava" ] submitted = [ actiondata.testcase.action_metadata for actiondata in testdata.actionlevels.all() if actiondata.testcase and "test-runscript-overlay" in actiondata.action_name ] # compare with a dict similar to created in executed for item in submitted: if executed and {item["name"]: item["success"]} not in executed: comparison = {} if item["from"] != "inline": comparison["repository"] = item["repository"] comparison["path"] = item["path"] comparison["name"] = item["name"] comparison["uuid"] = item["success"] failed_definitions.append(comparison) # hide internal python objects, like OrderedDict for data in testdata.attributes.all().order_by("name"): yaml_dict[str(data.name)] = str(data.value) RequestConfig(request, paginate={"per_page": suite_table.length}).configure( suite_table ) template = loader.get_template("lava_results_app/job.html") return HttpResponse( template.render( { "bread_crumb_trail": BreadCrumbTrail.leading_to(testjob, job=job.id), "job": job, "job_link": pklink(job), "suite_table": suite_table, "metadata": yaml_dict, "failed_definitions": failed_definitions, "condition_choices": simplejson.dumps( QueryCondition.get_condition_choices(job) ), "available_content_types": simplejson.dumps( QueryCondition.get_similar_job_content_types() ), }, request=request, ) )
except TypeError: # In some old version of LAVA, extra_data is not a string but an OrderedDict # In this case, just skip it. pass template = loader.get_template("lava_results_app/case.html") trail_id = case.id if case else test_sets.first().name return HttpResponse( template.render( { "bread_crumb_trail": BreadCrumbTrail.leading_to( testcase, pk=test_suite.name, job=job.id, case_id=trail_id ), "job": job, "sets": test_sets, "suite": test_suite, "job_link": pklink(job), "extra_source": extra_source, "test_cases": test_cases, "bug_links": BugLink.objects.filter( object_id__in=test_cases.values_list("id", flat=True), content_type_id=ContentType.objects.get_for_model(TestCase).id, ), }, request=request, ) ) def testcase_yaml(request, pk): testcase = get_object_or_404(TestCase, pk=pk) check_request_auth(request, testcase.suite.job)
trail_id = case.id if case else test_sets.first().name return HttpResponse( template.render( { "bread_crumb_trail": BreadCrumbTrail.leading_to( testcase, pk=test_suite.name, job=job.id, case_id=trail_id), "job": job, "sets": test_sets, "suite": test_suite, "job_link": pklink(job), "extra_source": extra_source, "test_cases": test_cases, "bug_links": BugLink.objects.filter( object_id__in=test_cases.values_list("id", flat=True), content_type_id=ContentType.objects.get_for_model( TestCase).id, ), }, request=request, ))
def render(self, record, table=None): # FIXME: handle job & device visibility return pklink(record.job)
def testjob(request, job): job = get_restricted_job(request.user, pk=job, request=request) data = ResultsView(request, model=TestSuite, table_class=ResultsTable) suite_table = ResultsTable(data.get_table_data().filter(job=job)) failed_definitions = [] yaml_dict = OrderedDict() if TestData.objects.filter(testjob=job).exists(): # some duplicates can exist, so get would fail here and [0] is quicker than try except. testdata = TestData.objects.filter(testjob=job).prefetch_related( 'actionlevels__testcase', 'actionlevels__testcase__suite')[0] if job.status in [TestJob.INCOMPLETE, TestJob.COMPLETE]: # returns something like ['singlenode-advanced', 'smoke-tests-basic', 'smoke-tests-basic'] executed = [{ case.action_metadata['test_definition_start']: case.action_metadata.get('success', '') } for case in TestCase.objects.filter( suite__in=TestSuite.objects.filter(job=job)) if case.action_metadata and 'test_definition_start' in case.action_metadata and case.suite.name == 'lava'] submitted = [ actiondata.testcase.action_metadata for actiondata in testdata.actionlevels.all() if actiondata.testcase and 'test-runscript-overlay' in actiondata.action_name ] # compare with a dict similar to created in executed for item in submitted: if executed and { item['name']: item['success'] } not in executed: comparison = {} if item['from'] != 'inline': comparison['repository'] = item['repository'] comparison['path'] = item['path'] comparison['name'] = item['name'] comparison['uuid'] = item['success'] failed_definitions.append(comparison) # hide internal python objects, like OrderedDict for data in testdata.attributes.all().order_by('name'): yaml_dict[str(data.name)] = str(data.value) RequestConfig(request, paginate={ "per_page": suite_table.length }).configure(suite_table) template = loader.get_template("lava_results_app/job.html") return HttpResponse( template.render( { 'bread_crumb_trail': BreadCrumbTrail.leading_to(testjob, job=job.id), 'job': job, 'job_link': pklink(job), 'suite_table': suite_table, 'metadata': yaml_dict, 'content_type_id': ContentType.objects.get_for_model(TestSuite).id, 'failed_definitions': failed_definitions, 'condition_choices': simplejson.dumps(QueryCondition.get_condition_choices(job)), 'available_content_types': simplejson.dumps( QueryCondition.get_similar_job_content_types()), }, request=request))
def testcase(request, case_id, job=None, pk=None): """ Each testcase can appear multiple times in the same testsuite and testjob, the action_data.action_level distinguishes each testcase. This view supports multiple ways to obtain test case/set. First is by test case ID, second by job ID, suite name and test case name and third by job ID, suite name and test set name. :param request: http request object :param job: ID of the TestJob :param pk: the name of the TestSuite :param case_id: the name or ID of one TestCase object in the TestSuite """ test_sets = None try: case = TestCase.objects.get(pk=case_id) except (TestCase.DoesNotExist, ValueError): case = TestCase.objects.filter(name=case_id, suite__name=pk, suite__job__id=job).first() if not case: test_sets = TestSet.objects.filter(name=case_id) if not test_sets: raise Http404( "No TestCase/TestSet matches the given parameters.") if not job: job = case.suite.job # Auth check purposes only. job = get_restricted_job(request.user, pk=job.id, request=request) else: job = get_restricted_job(request.user, pk=job, request=request) if not pk: test_suite = case.suite else: test_suite = get_object_or_404(TestSuite, name=pk, job=job) if test_sets: # No test case was found. test_sets = test_sets.filter(suite=test_suite) test_cases = TestCase.objects.none() else: test_cases = TestCase.objects.filter(name=case.name, suite=test_suite) extra_source = {} logger = logging.getLogger('lava-master') for extra_case in test_cases: try: f_metadata = yaml.load(extra_case.metadata, Loader=yaml.CLoader) if not f_metadata: continue except TypeError: logger.info("Unable to load extra case metadata for %s", extra_case) continue extra_data = f_metadata.get('extra') try: if extra_data and os.path.exists(extra_data): with open(f_metadata['extra'], 'r') as extra_file: items = yaml.load(extra_file, Loader=yaml.CLoader) # hide the !!python OrderedDict prefix from the output. for key, value in items.items(): extra_source.setdefault(extra_case.id, '') extra_source[extra_case.id] += "%s: %s\n" % (key, value) except TypeError: # In some old version of LAVA, extra_data is not a string but an OrderedDict # In this case, just skip it. pass template = loader.get_template("lava_results_app/case.html") trail_id = case.id if case else test_sets.first().name return HttpResponse(template.render( { 'bread_crumb_trail': BreadCrumbTrail.leading_to(testcase, pk=test_suite.name, job=job.id, case_id=trail_id), 'job': job, 'sets': test_sets, 'suite': test_suite, 'job_link': pklink(job), 'extra_source': extra_source, 'test_cases': test_cases, 'bug_links': BugLink.objects.filter( object_id__in=test_cases.values_list('id', flat=True), content_type_id=ContentType.objects.get_for_model( TestCase).id, ) }, request=request))