Endpoint and dao method for updating job status.

This commit is contained in:
Adam Shimali
2016-02-04 20:55:09 +00:00
parent c395069bb9
commit bec4bbe04e
4 changed files with 84 additions and 4 deletions

View File

@@ -2,9 +2,15 @@ from app import db
from app.models import Job from app.models import Job
def save_job(job): def save_job(job, update_dict={}):
db.session.add(job) if update_dict:
db.session.commit() update_dict.pop('id')
update_dict.pop('service')
update_dict.pop('template')
Job.query.filter_by(id=job.id).update(update_dict)
else:
db.session.add(job)
db.session.commit()
def get_job(service_id, job_id): def get_job(service_id, job_id):

View File

@@ -8,6 +8,7 @@ from flask import (
current_app current_app
) )
from sqlalchemy.exc import SQLAlchemyError
from sqlalchemy.exc import DataError from sqlalchemy.exc import DataError
from sqlalchemy.orm.exc import NoResultFound from sqlalchemy.orm.exc import NoResultFound
@@ -19,7 +20,8 @@ from app.dao.jobs_dao import (
from app.schemas import ( from app.schemas import (
job_schema, job_schema,
jobs_schema jobs_schema,
job_schema_load_json
) )
job = Blueprint('job', __name__, url_prefix='/service/<service_id>/job') job = Blueprint('job', __name__, url_prefix='/service/<service_id>/job')
@@ -56,6 +58,19 @@ def create_job(service_id):
return jsonify(data=job_schema.dump(job).data), 201 return jsonify(data=job_schema.dump(job).data), 201
@job.route('/<job_id>', methods=['PUT'])
def update_job(service_id, job_id):
job = get_job(service_id, job_id)
update_dict, errors = job_schema_load_json.load(request.get_json())
if errors:
return jsonify(result="error", message=errors), 400
try:
save_job(job, update_dict=update_dict)
except Exception as e:
return jsonify(result="error", message=str(e)), 400
return jsonify(data=job_schema.dump(job).data), 200
def _enqueue_job(job): def _enqueue_job(job):
aws_region = current_app.config['AWS_REGION'] aws_region = current_app.config['AWS_REGION']
queue_name = current_app.config['NOTIFY_JOB_QUEUE'] queue_name = current_app.config['NOTIFY_JOB_QUEUE']

View File

@@ -1,4 +1,5 @@
import uuid import uuid
import json
from app.dao.jobs_dao import ( from app.dao.jobs_dao import (
save_job, save_job,
@@ -79,3 +80,23 @@ def test_get_all_jobs(notify_db, notify_db_session, sample_template):
sample_template) sample_template)
jobs_from_db = _get_jobs() jobs_from_db = _get_jobs()
assert len(jobs_from_db) == 5 assert len(jobs_from_db) == 5
def test_update_job(notify_db, notify_db_session, sample_job):
assert sample_job.status == 'pending'
update_dict = {
'id': sample_job.id,
'service': sample_job.service.id,
'template': sample_job.template.id,
'bucket_name': sample_job.bucket_name,
'file_name': sample_job.file_name,
'original_file_name': sample_job.original_file_name,
'status': 'in progress'
}
save_job(sample_job, update_dict=update_dict)
job_from_db = Job.query.get(sample_job.id)
assert job_from_db.status == 'in progress'

View File

@@ -125,6 +125,44 @@ def test_create_job(notify_api, notify_db, notify_db_session, sample_template):
assert expected_message['bucket_name'] == bucket_name assert expected_message['bucket_name'] == bucket_name
def test_get_update_job_status(notify_api,
notify_db,
notify_db_session,
sample_job):
assert sample_job.status == 'pending'
job_id = str(sample_job.id)
service_id = str(sample_job.service.id)
update_data = {
'id': job_id,
'service': service_id,
'template': sample_job.template.id,
'bucket_name': sample_job.bucket_name,
'file_name': sample_job.file_name,
'original_file_name': sample_job.original_file_name,
'status': 'in progress'
}
with notify_api.test_request_context():
with notify_api.test_client() as client:
path = url_for('job.update_job', service_id=service_id, job_id=job_id)
auth_header = create_authorization_header(service_id=service_id,
path=path,
method='PUT',
request_body=json.dumps(update_data))
headers = [('Content-Type', 'application/json'), auth_header]
response = client.put(path, headers=headers, data=json.dumps(update_data))
assert response.status_code == 200
resp_json = json.loads(response.get_data(as_text=True))
assert resp_json['data']['status'] == 'in progress'
def _setup_jobs(notify_db, notify_db_session, template, number_of_jobs=5): def _setup_jobs(notify_db, notify_db_session, template, number_of_jobs=5):
for i in range(number_of_jobs): for i in range(number_of_jobs):
create_job(notify_db, notify_db_session, service=template.service, create_job(notify_db, notify_db_session, service=template.service,