def check_health_checks(app_configs, **kwargs): errors = [] for device in Device.objects.all(): ht = device.get_health_check() ht_disabled = device.device_type.disable_health_check # All active devices should have a health check, # provided that health checks are not disabled for this device type. if device.health == Device.HEALTH_RETIRED: continue if ht is None and not ht_disabled: errors.append(Warning("No health check", obj=device.hostname)) continue # An empty file is an error, provided health checks are not disabled # for this device type. if not ht and not ht_disabled: errors.append(Warning("Empty health check", obj=device.hostname)) continue # Check that the health check job is valid if ht: try: validate_job(ht) except SubmissionException as exc: errors.append( Error("Invalid health check: '%s'" % exc, obj=device.hostname)) return errors
def check_health_checks(app_configs, **kwargs): errors = [] for device in Device.objects.all(): ht = device.get_health_check() ht_disabled = device.device_type.disable_health_check # All active devices should have a health check, # provided that health checks are not disabled for this device type. if device.health == Device.HEALTH_RETIRED: continue if ht is None and not ht_disabled: errors.append(Warning("No health check", obj=device.hostname)) continue # An empty file is an error, provided health checks are not disabled # for this device type. if not ht and not ht_disabled: errors.append(Warning("Empty health check", obj=device.hostname)) continue # Check that the health check job is valid if ht: try: validate_job(ht) except SubmissionException as exc: errors.append(Error("Invalid health check: '%s'" % exc, obj=device.hostname)) return errors
def testjob_submission(job_definition, user, check_device=None): """ Single submission frontend for JSON or YAML :param job_definition: string of the job submission :param user: user attempting the submission :param check_device: set specified device as the target **and** thereby set job as a health check job. (JSON only) :return: a job or a list of jobs :raises: SubmissionException, Device.DoesNotExist, DeviceType.DoesNotExist, DevicesUnavailableException, JSONDataError, JSONDecodeError, ValueError """ if is_deprecated_json(job_definition): allow_health = False job_json = simplejson.loads(job_definition) target_device = None if 'target' in job_json: target_device = Device.objects.get(hostname=job_json['target']) if check_device: job_json['target'] = check_device.hostname job_json['health-check'] = True job_definition = simplejson.dumps(job_json) allow_health = True try: # returns a single job or a list (not a QuerySet) of job objects. job = TestJob.from_json_and_user(job_definition, user, health_check=allow_health) if isinstance(job, list): # multinode health checks not supported return job job.health_check = allow_health if check_device: job.requested_device = check_device elif target_device: job.requested_device = target_device job.save(update_fields=['health_check', 'requested_device']) except (JSONDataError, ValueError) as exc: if check_device: check_device.put_into_maintenance_mode( user, "Job submission failed for health job for %s: %s" % (check_device, exc)) raise JSONDataError("Health check job submission failed for %s: %s" % (check_device, exc)) else: raise JSONDataError("Job submission failed: %s" % exc) else: validate_job(job_definition) # returns a single job or a list (not a QuerySet) of job objects. job = TestJob.from_yaml_and_user(job_definition, user) if check_device and isinstance(check_device, Device) and not isinstance(job, list): # the slave must neither know nor care if this is a health check, # only the master cares and that has the database connection. job.health_check = True job.requested_device = check_device job.save(update_fields=['health_check', 'requested_device']) return job
def testjob_submission(job_definition, user, check_device=None, original_job=None): """ Single submission frontend for JSON or YAML :param job_definition: string of the job submission :param user: user attempting the submission :param check_device: set specified device as the target **and** thereby set job as a health check job. (JSON only) :return: a job or a list of jobs :raises: SubmissionException, Device.DoesNotExist, DeviceType.DoesNotExist, DevicesUnavailableException, JSONDataError, JSONDecodeError, ValueError """ if is_deprecated_json(job_definition): allow_health = False job_json = simplejson.loads(job_definition) target_device = None if 'target' in job_json: target_device = Device.objects.get(hostname=job_json['target']) if check_device: job_json['target'] = check_device.hostname job_json['health-check'] = True job_definition = simplejson.dumps(job_json) allow_health = True try: # returns a single job or a list (not a QuerySet) of job objects. job = TestJob.from_json_and_user(job_definition, user, health_check=allow_health) if isinstance(job, list): # multinode health checks not supported return job job.health_check = allow_health if check_device: job.requested_device = check_device elif target_device: job.requested_device = target_device job.save(update_fields=['health_check', 'requested_device']) except (JSONDataError, ValueError) as exc: if check_device: check_device.put_into_maintenance_mode( user, "Job submission failed for health job for %s: %s" % (check_device, exc)) raise JSONDataError("Health check job submission failed for %s: %s" % (check_device, exc)) else: raise JSONDataError("Job submission failed: %s" % exc) else: validate_job(job_definition) # returns a single job or a list (not a QuerySet) of job objects. job = TestJob.from_yaml_and_user(job_definition, user, original_job=original_job) if check_device and isinstance(check_device, Device) and not isinstance(job, list): # the slave must neither know nor care if this is a health check, # only the master cares and that has the database connection. job.health_check = True job.requested_device = check_device job.save(update_fields=['health_check', 'requested_device']) return job
def testjob_submission(job_definition, user, original_job=None): """ Single submission frontend for YAML :param job_definition: string of the job submission :param user: user attempting the submission :return: a job or a list of jobs :raises: SubmissionException, Device.DoesNotExist, DeviceType.DoesNotExist, DevicesUnavailableException, ValueError """ validate_job(job_definition) # returns a single job or a list (not a QuerySet) of job objects. job = TestJob.from_yaml_and_user(job_definition, user, original_job=original_job) return job
def testjob_submission(job_definition, user, original_job=None): """ Single submission frontend for YAML :param job_definition: string of the job submission :param user: user attempting the submission :return: a job or a list of jobs :raises: SubmissionException, Device.DoesNotExist, DeviceType.DoesNotExist, DevicesUnavailableException, ValueError """ validate_job(job_definition) # returns a single job or a list (not a QuerySet) of job objects. job = TestJob.from_yaml_and_user(job_definition, user, original_job=original_job) return job