def stage_file_task(file_id): """Stage the file from the archive, then call status """ Cart.database_connect() try: cart_file = File.get(File.id == file_id) mycart = cart_file.cart cart_utils = Cartutils() cart_utils.set_file_status(cart_file, mycart, 'staging', False) #make sure cart wasnt deleted before pulling file if mycart.deleted_date: Cart.database_close() return except DoesNotExist: Cart.database_close() return archive_request = ArchiveRequests() try: archive_request.stage_file(cart_file.file_name) except requests.exceptions.RequestException as ex: error_msg = 'Failed to stage with error: ' + str(ex) cart_utils.set_file_status(cart_file, mycart, 'error', error_msg) Cart.database_close() cart_utils.prepare_bundle(mycart.id) return #successful stage so move on to status Cart.database_close() status_file_task.delay(file_id)
def test_prep_bundle_staging(self): """test getting bundle ready with a file in staging state""" data = json.loads(cart_json_helper()) file_ids = data['fileids'] Cart.database_connect() mycart = Cart(cart_uid=343, status='staging') mycart.save() cart_utils = Cartutils() cart_utils.update_cart_files(mycart, file_ids) get_files_locally(mycart.id) for cart_file in File.select().where(File.cart == mycart.id): cart_file.status = 'staging' cart_file.save() cart_utils.prepare_bundle( mycart.id) #hitting more coverage, set files to staged for cart_file in File.select().where(File.cart == mycart.id): cart_file.status = 'staged' cart_file.save() cart_utils.prepare_bundle(mycart.id) #call again after file update status = mycart.status cartid = mycart.id while status == 'staging': mycart = Cart.get(Cart.id == cartid) status = mycart.status Cart.database_close() self.assertEqual(status, 'ready')
def test_stage_files(self): """test getting bundle files ready""" data = json.loads(cart_json_helper()) file_ids = data['fileids'] Cart.database_connect() mycart = Cart(cart_uid=747, status='staging') mycart.save() cart_utils = Cartutils() cart_utils.update_cart_files(mycart, file_ids) stage_files(file_ids, mycart.id) cart_utils.prepare_bundle(mycart.id) status = mycart.status cartid = mycart.id while status == 'staging': mycart = Cart.get(Cart.id == cartid) status = mycart.status Cart.database_close() self.assertEqual(status, 'ready')
def test_prep_bundle_error(self): """test getting bundle ready with a file in error state""" data = json.loads(cart_json_helper()) file_ids = data['fileids'] Cart.database_connect() mycart = Cart(cart_uid=343, status='staging') mycart.save() cart_utils = Cartutils() cart_utils.update_cart_files(mycart, file_ids) get_files_locally(mycart.id) for cart_file in File.select().where(File.cart == mycart.id): cart_file.status = 'error' cart_file.save() cart_utils.prepare_bundle(mycart.id) status = mycart.status cartid = mycart.id while status == 'staging': mycart = Cart.get(Cart.id == cartid) status = mycart.status Cart.database_close() self.assertEqual(status, 'error')
def status_file_task(file_id): """Status a file from the archive. If ready then pull the file""" Cart.database_connect() cart_file = File.get(File.id == file_id) mycart = cart_file.cart cart_utils = Cartutils() #make sure cart wasnt deleted before pulling file if mycart.deleted_date: Cart.database_close() return #check to see if file is available to pull from archive interface archive_request = ArchiveRequests() try: response = archive_request.status_file(cart_file.file_name) except requests.exceptions.RequestException as ex: error_msg = 'Failed to status file with error: ' + str(ex) cart_utils.set_file_status(cart_file, mycart, 'error', error_msg) Cart.database_close() cart_utils.prepare_bundle(mycart.id) return ready = cart_utils.check_file_ready_pull(response, cart_file, mycart) #Check to see if ready to pull. If not recall this to check again # error on less then 0. No coverage on recall since it just calls the method again if ready < 0: Cart.database_close() cart_utils.prepare_bundle(mycart.id) return elif not ready: # pragma: no cover Cart.database_close() status_file_task.delay(file_id) return #ready so try to pull file pull_file.delay(file_id, ready['filepath'], ready['modtime'], False)
def pull_file(file_id, filepath, modtime, record_error): """Pull a file from the archive """ Cart.database_connect() try: cart_file = File.get(File.id == file_id) mycart = cart_file.cart cart_utils = Cartutils() #make sure cart wasnt deleted before pulling file if mycart.deleted_date: Cart.database_close() return except DoesNotExist: Cart.database_close() return archive_request = ArchiveRequests() try: archive_request.pull_file(cart_file.file_name, filepath, cart_file.hash_value, cart_file.hash_type) cart_utils.set_file_status(cart_file, mycart, 'staged', False) os.utime(filepath, (int(float(modtime)), int(float(modtime)))) Cart.database_close() except requests.exceptions.RequestException as ex: #if request fails...try a second time, if that fails write error if record_error: error_msg = 'Failed to pull with error: ' + str(ex) cart_utils.set_file_status(cart_file, mycart, 'error', error_msg) Cart.database_close() cart_utils.prepare_bundle(mycart.id) else: pull_file.delay(file_id, filepath, modtime, True) Cart.database_close() except ValueError as ex: error_msg = 'Failed to pull with error: ' + str(ex) cart_utils.set_file_status(cart_file, mycart, 'error', error_msg) Cart.database_close() cart_utils.prepare_bundle(mycart.id) cart_utils.prepare_bundle(mycart.id)