def create(self, request, body): if (body is None or body.get('job') is None or body['job'].get('schedule_id') is None): raise webob.exc.HTTPBadRequest() job = body['job'] try: schedule = self.db_api.schedule_get_by_id(job['schedule_id']) except exception.NotFound: raise webob.exc.HTTPNotFound() # Check integrity of schedule and update next run expected_next_run = job.get('next_run') if expected_next_run: expected_next_run = timeutils.parse_isotime(job.get('next_run')) next_run = api_utils.schedule_to_next_run(schedule, timeutils.utcnow()) try: self.db_api.schedule_test_and_set_next_run(schedule['id'], expected_next_run, next_run) except exception.NotFound: msg = _("Specified next run does not match the current next run" " value. This could mean schedule has either changed" "or has already been scheduled since you last expected.") raise webob.exc.HTTPConflict(explanation=msg) # Update schedule last_scheduled values = {} values['last_scheduled'] = timeutils.utcnow() self.db_api.schedule_update(schedule['id'], values) # Create job values = {} values.update(job) values['tenant'] = schedule['tenant'] values['action'] = schedule['action'] values['status'] = 'QUEUED' job_metadata = [] for metadata in schedule['schedule_metadata']: job_metadata.append({ 'key': metadata['key'], 'value': metadata['value'] }) values['job_metadata'] = job_metadata job_action = values['action'] if not 'timeout' in values: values['timeout'] = api_utils.get_new_timeout_by_action(job_action) values['hard_timeout'] = \ api_utils.get_new_timeout_by_action(job_action) job = self.db_api.job_create(values) utils.serialize_datetimes(job) api_utils.serialize_job_metadata(job) job = {'job': job} utils.generate_notification(None, 'qonos.job.create', job, 'INFO') return job
def get_next_job(self, request, worker_id, body): action = body.get("action") try: # Check that worker exists self.db_api.worker_get_by_id(worker_id) except exception.NotFound as e: msg = _("Worker %s could not be found.") % worker_id raise webob.exc.HTTPNotFound(explanation=msg) max_retry = self._job_get_max_retry(action) new_timeout = api_utils.get_new_timeout_by_action(action) job = self.db_api.job_get_and_assign_next_by_action(action, worker_id, max_retry, new_timeout) if job: utils.serialize_datetimes(job) api_utils.serialize_job_metadata(job) return {"job": job}
def get_next_job(self, request, worker_id, body): action = body.get('action') try: # Check that worker exists self.db_api.worker_get_by_id(worker_id) except exception.NotFound: msg = _('Worker %s could not be found.') % worker_id raise webob.exc.HTTPNotFound(explanation=msg) new_timeout = api_utils.get_new_timeout_by_action(action) job = self.db_api.job_get_and_assign_next_by_action( action, worker_id, new_timeout) if job: utils.serialize_datetimes(job) api_utils.serialize_job_metadata(job) return {'job': job}
def create(self, request, body): if (body is None or body.get('job') is None or body['job'].get('schedule_id') is None): raise webob.exc.HTTPBadRequest() job = body['job'] try: schedule = self.db_api.schedule_get_by_id(job['schedule_id']) except exception.NotFound: raise webob.exc.HTTPNotFound() # Check integrity of schedule and update next run expected_next_run = job.get('next_run') if expected_next_run: try: expected_next_run = timeutils.parse_isotime(expected_next_run) expected_next_run = expected_next_run.replace(tzinfo=None) except ValueError as e: msg = _('Invalid "next_run" value. Must be ISO 8601 format') raise webob.exc.HTTPBadRequest(explanation=msg) next_run = api_utils.schedule_to_next_run(schedule, timeutils.utcnow()) next_run = next_run.replace(tzinfo=None) try: self.db_api.schedule_test_and_set_next_run(schedule['id'], expected_next_run, next_run) except exception.NotFound: msg = _("Specified next run does not match the current next run" " value. This could mean schedule has either changed" "or has already been scheduled since you last expected.") raise webob.exc.HTTPConflict(explanation=msg) # Update schedule last_scheduled values = {} values['last_scheduled'] = timeutils.utcnow() self.db_api.schedule_update(schedule['id'], values) # Create job values = {} values.update(job) values['tenant'] = schedule['tenant'] values['action'] = schedule['action'] values['status'] = 'QUEUED' job_metadata = [] for metadata in schedule['schedule_metadata']: job_metadata.append({ 'key': metadata['key'], 'value': metadata['value'] }) values['job_metadata'] = job_metadata job_action = values['action'] if not 'timeout' in values: values['timeout'] = api_utils.get_new_timeout_by_action(job_action) values['hard_timeout'] = \ api_utils.get_new_timeout_by_action(job_action) job = self.db_api.job_create(values) utils.serialize_datetimes(job) api_utils.serialize_job_metadata(job) job = {'job': job} utils.generate_notification(None, 'qonos.job.create', job, 'INFO') return job