CC-5888: Handle file deletion if the file is stored in the cloud

This commit is contained in:
drigato 2014-07-15 17:20:04 -04:00
parent 8e714bcb64
commit aaee522ec6
7 changed files with 134 additions and 39 deletions

View file

@ -3,7 +3,7 @@ import logging
import uuid
from libcloud.storage.providers import get_driver
from libcloud.storage.types import Provider, ContainerDoesNotExistError
from libcloud.storage.types import Provider, ContainerDoesNotExistError, ObjectDoesNotExistError
class CloudStorageUploader:
def __init__(self, provider, bucket, api_key, api_key_secret):
@ -17,15 +17,16 @@ class CloudStorageUploader:
file_name, extension = os.path.splitext(file_base_name)
object_name = "%s_%s%s" % (file_name, str(uuid.uuid4()), extension)
cls = get_driver(getattr(Provider, self._provider))
driver = cls(self._api_key, self._api_key_secret)
#cls = get_driver(getattr(Provider, self._provider))
driver = self.get_cloud_driver()
try:
container = driver.get_container(self._bucket)
except ContainerDoesNotExistError:
container = driver.create_container(self._bucket)
extra = {'meta_data': {'filename': file_base_name}}
extra = {'meta_data': {'filename': file_base_name},
'acl': 'public-read-write'}
with open(audio_file_path, 'rb') as iterator:
obj = driver.upload_object_via_stream(iterator=iterator,
@ -33,14 +34,32 @@ class CloudStorageUploader:
object_name=object_name,
extra=extra)
metadata["filesize"] = os.path.getsize(audio_file_path)
'''remove file from organize directory'''
try:
os.remove(audio_file_path)
except OSError:
logging.info("Could not remove %s" % audio_file_path)
logging.info("Could not remove %s from organize directory" % audio_file_path)
metadata["s3_object_name"] = object_name
return metadata
def delete_obj(self, object_name):
pass
def delete_obj(self, obj_name):
driver = self.get_cloud_driver()
return_msg = dict()
return_msg["success"] = False
try:
cloud_obj = driver.get_object(container_name=self._bucket,
object_name=obj_name)
return_msg["filesize"] = getattr(cloud_obj, 'size')
return_msg["success"] = driver.delete_object(obj=cloud_obj)
return return_msg
except ObjectDoesNotExistError:
logging.info("Could not find object on %s" % self._provider)
def get_cloud_driver(self):
cls = get_driver(getattr(Provider, self._provider))
return cls(self._api_key, self._api_key_secret)

View file

@ -162,19 +162,26 @@ class MessageListener:
'''
try:
msg_dict = json.loads(body)
audio_file_path = msg_dict["tmp_file_path"]
#final_file_path = msg_dict["final_file_path"]
import_directory = msg_dict["import_directory"]
original_filename = msg_dict["original_filename"]
callback_url = msg_dict["callback_url"]
api_key = msg_dict["api_key"]
message_type = msg_dict["message_type"]
callback_url = msg_dict["callback_url"]
if event_type == "upload":
if message_type == "upload":
audio_file_path = msg_dict["tmp_file_path"]
import_directory = msg_dict["import_directory"]
original_filename = msg_dict["original_filename"]
audio_metadata = self.spawn_analyzer_process(audio_file_path, import_directory, original_filename)
StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata)
elif event_type == "delete":
pass
elif message_type == "delete":
object_name = msg_dict["object_name"]
csu = CloudStorageUploader(self._provider, self._bucket, self._api_key, self._api_key_secret)
response = csu.delete_obj(object_name)
if response["success"]:
audio_metadata = dict()
audio_metadata["delete_success"] = True
audio_metadata["filesize"] = response["filesize"]
StatusReporter.report_success_to_callback_url(callback_url, api_key, audio_metadata)
except KeyError as e:
# A field in msg_dict that we needed was missing (eg. audio_file_path)