Exemple #1
0
    def get_object(self, container_name, object_name):
        container = self.get_container(container_name)
        object_name_cleaned = self._clean_object_name(object_name)
        path = self._namespace_path(container_name) + "/" + object_name_cleaned

        try:
            result = self.connection.request(path + "?metadata/system")
            system_meta = self._emc_meta(result)

            result = self.connection.request(path + "?metadata/user")
            user_meta = self._emc_meta(result)
        except AtmosError as e:
            if e.code != 1003:
                raise
            raise ObjectDoesNotExistError(e, self, object_name)

        last_modified = time.strptime(system_meta["mtime"],
                                      "%Y-%m-%dT%H:%M:%SZ")
        last_modified = time.strftime("%a, %d %b %Y %H:%M:%S GMT",
                                      last_modified)
        extra = {
            "object_id": system_meta["objectid"],
            "last_modified": last_modified
        }
        data_hash = user_meta.pop("md5", "")
        return Object(
            object_name,
            int(system_meta["size"]),
            data_hash,
            extra,
            user_meta,
            container,
            self,
        )
Exemple #2
0
    def get_object(self, container_name, object_name):
        """
       >>> driver = DummyStorageDriver('key', 'secret')
       >>> driver.get_object('unknown', 'unknown') #doctest: +IGNORE_EXCEPTION_DETAIL
       Traceback (most recent call last):
       ContainerDoesNotExistError:
       >>> container = driver.create_container(container_name='test container 1')
       >>> container
       <Container: name=test container 1, provider=Dummy Storage Provider>
       >>> driver.get_object(
       ...  'test container 1', 'unknown') #doctest: +IGNORE_EXCEPTION_DETAIL
       Traceback (most recent call last):
       ObjectDoesNotExistError:
       >>> obj = container.upload_object_via_stream(object_name='test object',
       ...      iterator=DummyFileObject(5, 10), extra={})
       >>> obj
       <Object: name=test object, size=50, hash=None, provider=Dummy Storage Provider ...>
       """

        self.get_container(container_name)
        container_objects = self._containers[container_name]['objects']
        if object_name not in container_objects:
            raise ObjectDoesNotExistError(object_name=object_name,
                                          value=None,
                                          driver=self)

        return container_objects[object_name]
Exemple #3
0
    def test_202(self):
        resource_id = 'eb93fde9-0cc6-4339-b7d6-f6e838e78f1c'
        self.raw_email_storage.fetch_text.side_effect = throw(
            ObjectDoesNotExistError(None, None, None))

        _, status = self._execute_action(resource_id)
        self.assertEqual(status, 202)
Exemple #4
0
    def get_object(self, container_name, object_name):
        container = self.get_container(container_name)
        object_name_cleaned = self._clean_object_name(object_name)
        path = self._namespace_path(container_name) + '/' + object_name_cleaned

        try:
            result = self.connection.request(path + '?metadata/system')
            system_meta = self._emc_meta(result)

            result = self.connection.request(path + '?metadata/user')
            user_meta = self._emc_meta(result)
        except AtmosError as e:
            if e.code != 1003:
                raise
            raise ObjectDoesNotExistError(e, self, object_name)

        last_modified = time.strptime(system_meta['mtime'],
                                      '%Y-%m-%dT%H:%M:%SZ')
        last_modified = time.strftime('%a, %d %b %Y %H:%M:%S GMT',
                                      last_modified)
        extra = {
            'object_id': system_meta['objectid'],
            'last_modified': last_modified
        }
        data_hash = user_meta.pop('md5', '')
        return Object(object_name, int(system_meta['size']), data_hash, extra,
                      user_meta, container, self)
Exemple #5
0
    def get_object_cdn_url(self, obj):
        """
        >>> driver = DummyStorageDriver('key', 'secret')
        >>> container_name = 'test container 1'
        >>> container = driver.create_container(container_name=container_name)
        >>> container
        <Container: name=test container 1, provider=Dummy Storage Provider>
        >>> obj = container.upload_object_via_stream(
        ...      object_name='test object 5',
        ...      iterator=DummyFileObject(5, 10), extra={})
        >>> obj.name
        'test object 5'
        >>> obj.get_cdn_url()
        'http://www.test.com/object/test_object_5'

        @inherits: :class:`StorageDriver.get_object_cdn_url`
        """

        container_name = obj.container.name
        container_objects = self._containers[container_name]['objects']
        if obj.name not in container_objects:
            raise ObjectDoesNotExistError(object_name=obj.name,
                                          value=None,
                                          driver=self)

        return container_objects[obj.name].meta_data['cdn_url']
Exemple #6
0
 def get_object(self, container_name, obj_id):
     self._check_credentials()
     try:
         container = self.get_container(container_name)
         return container[obj_id]
     except KeyError:
         raise ObjectDoesNotExistError(object_name=obj_id, driver=self, value=None)
Exemple #7
0
 def delete_object(self, obj):
     path = self._namespace_path(obj.container.name + '/' + obj.name)
     try:
         self.connection.request(path, method='DELETE')
     except AtmosError, e:
         if e.code != 1003:
             raise
         raise ObjectDoesNotExistError(e, self, obj.name)
Exemple #8
0
 def delete_object(self, obj):
     self._check_credentials()
     try:
         container = self.get_container(CONTAINER_NAME)
         container.pop(obj.name)
         return True
     except KeyError:
         raise ObjectDoesNotExistError(object_name=obj.name, driver=self, value=None)
Exemple #9
0
 def delete_object(self, obj):
     object_path = self._get_object_path(obj.container, obj.name)
     try:
         self.connection.session.data_objects.unlink(object_path)
         return True
     except DataObjectDoesNotExist:
         raise ObjectDoesNotExistError(value=None,
                                       driver=self,
                                       object_name=obj.name)
Exemple #10
0
    def delete_object(self, obj):
        object_path = self._get_object_path(obj.container, obj.name)
        response = self.connection.request(object_path, method="DELETE")
        if response.status == httplib.NO_CONTENT:
            return True
        elif response.status == httplib.NOT_FOUND:
            raise ObjectDoesNotExistError(value=None, driver=self, object_name=obj.name)

        return False
Exemple #11
0
 def delete_object(self, obj):
     path = (self._namespace_path(obj.container.name) + "/" +
             self._clean_object_name(obj.name))
     try:
         self.connection.request(path, method="DELETE")
     except AtmosError as e:
         if e.code != 1003:
             raise
         raise ObjectDoesNotExistError(e, self, obj.name)
     return True
Exemple #12
0
    def get_object(self, container_name, object_name):
        container = self.get_container(container_name=container_name)
        objects = self.iterate_container_objects(container=container)

        obj = next((obj for obj in objects if obj.name == object_name), None)

        if obj is not None:
            return obj
        else:
            raise ObjectDoesNotExistError(value=None, driver=self,
                                          object_name=object_name)
Exemple #13
0
 def delete_object(self, obj):
     path = self._namespace_path(obj.container.name) + '/' +\
         self._clean_object_name(obj.name)
     try:
         self.connection.request(path, method='DELETE')
     except AtmosError:
         e = sys.exc_info()[1]
         if e.code != 1003:
             raise
         raise ObjectDoesNotExistError(e, self, obj.name)
     return True
Exemple #14
0
    def get_object(self, container_name, object_name):
        container = self.get_container(container_name=container_name)
        object_path = self._get_object_path(container, object_name)
        response = self.connection.request(object_path, method="HEAD")

        if response.status == httplib.OK:
            obj = self._headers_to_object(
                object_name=object_name, container=container, headers=response.headers
            )
            return obj

        raise ObjectDoesNotExistError(value=None, driver=self, object_name=object_name)
Exemple #15
0
    def delete_object(self, obj):
        object_name = self._clean_object_name(name=obj.name)
        response = self.connection.request('/%s/%s' % (obj.container.name,
                                                       object_name),
                                           method='DELETE')
        if response.status == httplib.NO_CONTENT:
            return True
        elif response.status == httplib.NOT_FOUND:
            raise ObjectDoesNotExistError(value=None, driver=self,
                                         object_name=obj.name)

        return False
Exemple #16
0
    def get_object(self, container_name, object_name):
        container = self.get_container(container_name)
        response = self.connection.request('/%s/%s' %
                                           (container_name, object_name),
                                           method='HEAD')
        if response.status in [httplib.OK, httplib.NO_CONTENT]:
            obj = self._headers_to_object(object_name, container,
                                          response.headers)
            return obj
        elif response.status == httplib.NOT_FOUND:
            raise ObjectDoesNotExistError(None, self, object_name)

        raise LibcloudError('Unexpected status code: %s' % (response.status))
Exemple #17
0
    def delete_object(self, obj):
        container_name = self._encode_container_name(obj.container.name)
        object_name = self._encode_object_name(obj.name)

        response = self.connection.request(
            '/%s/%s' % (container_name, object_name), method='DELETE')

        if response.status == httplib.NO_CONTENT:
            return True
        elif response.status == httplib.NOT_FOUND:
            raise ObjectDoesNotExistError(value='', object_name=object_name,
                                          driver=self)

        raise LibcloudError('Unexpected status code: %s' % (response.status))
Exemple #18
0
    def delete_object(self, obj):
        """
        @inherits: :class:`StorageDriver.delete_object`
        """
        object_path = self._get_object_path(obj.container, obj.name)
        response = self.connection.request(object_path, method='DELETE')

        if response.status == httplib.ACCEPTED:
            return True
        elif response.status == httplib.NOT_FOUND:
            raise ObjectDoesNotExistError(value=None, driver=self,
                                          object_name=obj.name)

        return False
Exemple #19
0
    def _open_archive_file(self, archive: TarFile, name: str) -> IO[bytes]:
        while True:
            member = archive.next()
            if member is None:
                break
            if member.name == name:
                fobj = archive.extractfile(member)
                if fobj is None:
                    break
                return fobj

        raise ObjectDoesNotExistError(
            'File {} is missing in archive'.format(name),
            self._file_storage._driver, archive.name)
Exemple #20
0
    def test_202(self):
        resource_id = 'eb93fde9-0cc6-4339-b7d6-f6e838e78f1c'

        self.raw_email_storage.fetch_text.side_effect = throw(
            ObjectDoesNotExistError(None, None, None))

        _, status = self._execute_action(resource_id)

        self.assertEqual(status, 202)
        self.raw_email_storage.fetch_text.assert_called_once_with(resource_id)
        self.assertFalse(self.raw_email_storage.delete.called)
        self.assertFalse(self.email_storage.store_object.called)
        self.assertFalse(self.pending_storage.store_text.called)
        self.assertFalse(self.email_parser.called)
    def _open_archive_file(self, archive: TarFile, name: str) -> IO[bytes]:
        while True:
            member = archive.next()
            if member is None:
                break
            if member.name == name:
                fobj = archive.extractfile(member)
                if fobj is None:
                    break
                return fobj

        # noinspection PyProtectedMember
        raise ObjectDoesNotExistError(f'File {name} is missing in archive',
                                      self._file_storage._driver, archive.name)
Exemple #22
0
    def get_object(self, container_name, object_name):
        container = self.get_container(container_name)
        path = container_name + '/' + object_name
        path = self._namespace_path(path)

        try:
            result = self.connection.request(path + '?metadata/system')
            system_meta = self._emc_meta(result)

            result = self.connection.request(path + '?metadata/user')
            user_meta = self._emc_meta(result)
        except AtmosError, e:
            if e.code != 1003:
                raise
            raise ObjectDoesNotExistError(e, self, object_name)
Exemple #23
0
 def get_object(self, container_name, object_name):
     container = self.get_container(container_name)
     if self.object_exists(container_name, object_name):
         obj = Object(object_name,
                      size=None,
                      hash=None,
                      extra=None,
                      meta_data=None,
                      container=container,
                      driver=self)
         return obj
     else:
         raise ObjectDoesNotExistError(value=None,
                                       driver=self,
                                       object_name=object_name)
Exemple #24
0
 def get_object(self, container_path, object_name):
     try:
         container = self.get_container(container_path)
     except CollectionDoesNotExist:
         raise ContainerDoesNotExistError(value=None,
                                          driver=self,
                                          container_name=container_path)
     try:
         obj_path = self._get_object_path(container, object_name)
         data_obj = self.connection.session.data_objects.get(obj_path)
         return self._to_obj(data_obj, container)
     except DataObjectDoesNotExist:
         raise ObjectDoesNotExistError(value=None,
                                       driver=self,
                                       object_name=object_name)
Exemple #25
0
    def get_object(self, container_name, object_name):
        # TODO: Figure out what is going on when the object or container does not exist
        # - it seems that Amazon just keeps the connection open and doesn't return a
        # response.
        container = self.get_container(container_name=container_name)
        response = self.connection.request('/%s/%s' % (container_name,
                                                       object_name),
                                           method='HEAD')
        if response.status == httplib.OK:
            obj = self._headers_to_object(object_name=object_name,
                                          container=container,
                                          headers=response.headers)
            return obj

        raise ObjectDoesNotExistError(value=None, driver=self,
                                      object_name=object_name)
Exemple #26
0
    def get_object(self, container_name, object_name):
        """
        @inherits: :class:`StorageDriver.get_object`
        """

        container = self.get_container(container_name=container_name)
        object_path = self._get_object_path(container, object_name)

        response = self.connection.request(object_path, method='HEAD')

        if response.status == httplib.OK:
            obj = self._response_to_object(object_name, container, response)
            return obj

        raise ObjectDoesNotExistError(value=None, driver=self,
                                      object_name=object_name)
Exemple #27
0
    def _get_object(self,
                    obj,
                    callback,
                    callback_kwargs,
                    response,
                    success_status_code=None):
        """
        Call passed callback and start transfer of the object'

        :param obj: Object instance.
        :type obj: :class:`Object`

        :param callback: Function which is called with the passed
            callback_kwargs
        :type callback: :class:`function`

        :param callback_kwargs: Keyword arguments which are passed to the
             callback.
        :type callback_kwargs: ``dict``

        :param response: Response instance.
        :type response: :class:`Response`

        :param success_status_code: Status code which represents a successful
                                    transfer (defaults to httplib.OK)
        :type success_status_code: ``int``

        :return: ``True`` on success, ``False`` otherwise.
        :rtype: ``bool``
        """
        success_status_code = success_status_code or httplib.OK

        if not isinstance(success_status_code, (list, tuple)):
            success_status_codes = [success_status_code]
        else:
            success_status_codes = success_status_code

        if response.status in success_status_codes:
            return callback(**callback_kwargs)
        elif response.status == httplib.NOT_FOUND:
            raise ObjectDoesNotExistError(object_name=obj.name,
                                          value="",
                                          driver=self)

        raise LibcloudError(value="Unexpected status code: %s" %
                            (response.status),
                            driver=self)
Exemple #28
0
    def _make_object(self, container, object_name):
        """
        Create an object instance

        @param container: Container.
        @type container: L{Container}

        @param object_name: Object name.
        @type object_name: C{str}

        @return: Object instance.
        @rtype: L{Object}
        """

        full_path = os.path.join(self.base_path, container.name, object_name)

        if os.path.isdir(full_path):
            raise ObjectError(value=None, driver=self, object_name=object_name)

        try:
            stat = os.stat(full_path)
        except Exception:
            raise ObjectDoesNotExistError(value=None,
                                          driver=self,
                                          object_name=object_name)

        # Make a hash for the file based on the metadata. We can safely
        # use only the mtime attribute here. If the file contents change,
        # the underlying file-system will change mtime
        data_hash = self._get_hash_function()
        data_hash.update(str(stat.st_mtime))
        data_hash = data_hash.hexdigest()

        extra = {}
        extra['creation_time'] = stat.st_ctime
        extra['access_time'] = stat.st_atime
        extra['modify_time'] = stat.st_mtime

        return Object(name=object_name,
                      size=stat.st_size,
                      extra=extra,
                      driver=self,
                      container=container,
                      hash=data_hash,
                      meta_data=None)
Exemple #29
0
    def _get_object(self, obj, callback, callback_args):
        container_name = obj.container.name
        object_name = obj.name

        response = self.connection.request('/%s/%s' %
                                           (container_name, object_name),
                                           raw=True)

        callback_args['response'] = response.response

        if response.status == httplib.OK:
            return callback(**callback_args)
        elif response.status == httplib.NOT_FOUND:
            raise ObjectDoesNotExistError(object_name=object_name,
                                          driver=self,
                                          value='')

        raise LibcloudError('Unexpected status code: %s' % (response.status))
    def _get_object(self,
                    obj,
                    callback,
                    callback_kwargs,
                    response,
                    success_status_code=None):
        """
        Call passed callback and start transfer of the object'

        @type obj: C{Object}
        @param obj: Object instance.

        @type callback: C{Function}
        @param callback: Function which is called with the passed
            callback_kwargs

        @type callback_kwargs: C{dict}
        @param callback_kwargs: Keyword arguments which are passed to the
             callback.

        @typed response: L{Response}
        @param response: Response instance.

        @type success_status_code: C{int}
        @param success_status_code: Status code which represents a successful
                                    transfer (defaults to httplib.OK)

        @return: True on success, False otherwise.
        @rtype: C{bool}
        """
        success_status_code = success_status_code or httplib.OK

        if response.status == success_status_code:
            return callback(**callback_kwargs)
        elif response.status == httplib.NOT_FOUND:
            raise ObjectDoesNotExistError(object_name=obj.name,
                                          value='',
                                          driver=self)

        raise LibcloudError(value='Unexpected status code: %s' %
                            (response.status),
                            driver=self)