def _create_label_helper(self): label = rpc_utils.create_plan_label(self._plan) group = afe_models.AtomicGroup.objects.get( name=rpc_utils.PLANNER_ATOMIC_GROUP_NAME) self.assertFalse(group.invalid) self.assertEqual(label.atomic_group, group) return (label, group)
def submit_plan(name, hosts, host_labels, tests, support=None, label_override=None, additional_parameters=None): """ Submits a plan to the Test Planner @param name: the name of the plan @param hosts: a list of hostnames @param host_labels: a list of host labels. The hosts under test will update to reflect changes in the label @param tests: an ordered list of dictionaries: alias: an alias for the test control_file: the test control file is_server: True if is a server-side control file estimated_runtime: estimated number of hours this test will run @param support: the global support script @param label_override: label to prepend to all AFE jobs for this test plan. Defaults to the plan name. @param additional_parameters: A mapping of AdditionalParameters to apply to this test plan, as an ordered list. Each item of the list is a dictionary: hostname_regex: A regular expression; the additional parameter in the value will be applied if the hostname matches this regex param_type: The type of additional parameter param_values: A dictionary of key=value pairs for this parameter example: [{'hostname_regex': 'host[0-9]', 'param_type': 'Verify', 'param_values': {'key1': 'value1', 'key2': 'value2'}}, {'hostname_regex': '.*', 'param_type': 'Verify', 'param_values': {'key': 'value'}}] Currently, the only (non-site-specific) param_type available is 'Verify'. Setting these parameters allows the user to specify arguments to the job.run_test('verify_test', ...) line at the beginning of the wrapped control file for each test """ host_objects = [] label_objects = [] for host in hosts or []: try: host_objects.append( afe_models.Host.valid_objects.get(hostname=host)) except afe_models.Host.DoesNotExist: raise model_logic.ValidationError( {'hosts': 'host %s does not exist' % host}) for label in host_labels or []: try: label_objects.append( afe_models.Label.valid_objects.get(name=label)) except afe_models.Label.DoesNotExist: raise model_logic.ValidationError( {'host_labels': 'host label %s does not exist' % label}) aliases_seen = set() test_required_fields = ('alias', 'control_file', 'is_server', 'estimated_runtime') for test in tests: for field in test_required_fields: if field not in test: raise model_logic.ValidationError( {'tests': 'field %s is required' % field}) alias = test['alias'] if alias in aliases_seen: raise model_logic.Validationerror( {'tests': 'alias %s occurs more than once' % alias}) aliases_seen.add(alias) plan, created = models.Plan.objects.get_or_create(name=name) if not created: raise model_logic.ValidationError( {'name': 'Plan name %s already exists' % name}) try: rpc_utils.set_additional_parameters(plan, additional_parameters) label = rpc_utils.create_plan_label(plan) try: for i, test in enumerate(tests): control, _ = models.ControlFile.objects.get_or_create( contents=test['control_file']) models.TestConfig.objects.create( plan=plan, alias=test['alias'], control_file=control, is_server=test['is_server'], execution_order=i, estimated_runtime=test['estimated_runtime']) plan.label_override = label_override plan.support = support or '' plan.save() plan.owners.add(afe_models.User.current_user()) for host in host_objects: planner_host = models.Host.objects.create(plan=plan, host=host) plan.host_labels.add(*label_objects) rpc_utils.start_plan(plan, label) return plan.id except: label.delete() raise except: plan.delete() raise
def submit_plan(name, hosts, host_labels, tests, support=None, label_override=None, additional_parameters=None): """ Submits a plan to the Test Planner @param name: the name of the plan @param hosts: a list of hostnames @param host_labels: a list of host labels. The hosts under test will update to reflect changes in the label @param tests: an ordered list of dictionaries: alias: an alias for the test control_file: the test control file is_server: True if is a server-side control file estimated_runtime: estimated number of hours this test will run @param support: the global support script @param label_override: label to prepend to all AFE jobs for this test plan. Defaults to the plan name. @param additional_parameters: A mapping of AdditionalParameters to apply to this test plan, as an ordered list. Each item of the list is a dictionary: hostname_regex: A regular expression; the additional parameter in the value will be applied if the hostname matches this regex param_type: The type of additional parameter param_values: A dictionary of key=value pairs for this parameter example: [{'hostname_regex': 'host[0-9]', 'param_type': 'Verify', 'param_values': {'key1': 'value1', 'key2': 'value2'}}, {'hostname_regex': '.*', 'param_type': 'Verify', 'param_values': {'key': 'value'}}] Currently, the only (non-site-specific) param_type available is 'Verify'. Setting these parameters allows the user to specify arguments to the job.run_test('verify_test', ...) line at the beginning of the wrapped control file for each test """ host_objects = [] label_objects = [] for host in hosts or []: try: host_objects.append( afe_models.Host.valid_objects.get(hostname=host)) except afe_models.Host.DoesNotExist: raise model_logic.ValidationError( {'hosts': 'host %s does not exist' % host}) for label in host_labels or []: try: label_objects.append(afe_models.Label.valid_objects.get(name=label)) except afe_models.Label.DoesNotExist: raise model_logic.ValidationError( {'host_labels': 'host label %s does not exist' % label}) aliases_seen = set() test_required_fields = ( 'alias', 'control_file', 'is_server', 'estimated_runtime') for test in tests: for field in test_required_fields: if field not in test: raise model_logic.ValidationError( {'tests': 'field %s is required' % field}) alias = test['alias'] if alias in aliases_seen: raise model_logic.Validationerror( {'tests': 'alias %s occurs more than once' % alias}) aliases_seen.add(alias) plan, created = models.Plan.objects.get_or_create(name=name) if not created: raise model_logic.ValidationError( {'name': 'Plan name %s already exists' % name}) try: rpc_utils.set_additional_parameters(plan, additional_parameters) label = rpc_utils.create_plan_label(plan) try: for i, test in enumerate(tests): control, _ = models.ControlFile.objects.get_or_create( contents=test['control_file']) models.TestConfig.objects.create( plan=plan, alias=test['alias'], control_file=control, is_server=test['is_server'], execution_order=i, estimated_runtime=test['estimated_runtime']) plan.label_override = label_override plan.support = support or '' plan.save() plan.owners.add(afe_models.User.current_user()) for host in host_objects: planner_host = models.Host.objects.create(plan=plan, host=host) plan.host_labels.add(*label_objects) rpc_utils.start_plan(plan, label) return plan.id except: label.delete() raise except: plan.delete() raise