示例#1
0
def format_image_notification(image):
    """
    Given a glance.domain.Image object, return a dictionary of relevant
    notification information. We purposely do not include 'location'
    as it may contain credentials.
    """
    return {
        "id": image.image_id,
        "name": image.name,
        "status": image.status,
        "created_at": timeutils.isotime(image.created_at),
        "updated_at": timeutils.isotime(image.updated_at),
        "min_disk": image.min_disk,
        "min_ram": image.min_ram,
        "protected": image.protected,
        "checksum": image.checksum,
        "owner": image.owner,
        "disk_format": image.disk_format,
        "container_format": image.container_format,
        "size": image.size,
        "virtual_size": image.virtual_size,
        "is_public": image.visibility == "public",
        "properties": dict(image.extra_properties),
        "tags": list(image.tags),
        "deleted": False,
        "deleted_at": None,
    }
示例#2
0
 def test_task_delete_notification(self):
     now = timeutils.isotime()
     self.task_repo_proxy.remove(self.task_stub_proxy)
     output_logs = self.notifier.get_logs()
     self.assertEqual(1, len(output_logs))
     output_log = output_logs[0]
     self.assertEqual('INFO', output_log['notification_type'])
     self.assertEqual('task.delete', output_log['event_type'])
     self.assertEqual(self.task.task_id, output_log['payload']['id'])
     self.assertEqual(
         timeutils.isotime(self.task.updated_at),
         output_log['payload']['updated_at']
     )
     self.assertEqual(
         timeutils.isotime(self.task.created_at),
         output_log['payload']['created_at']
     )
     self.assertEqual(
         now,
         output_log['payload']['deleted_at']
     )
     if 'location' in output_log['payload']:
         self.fail('Notification contained location field.')
     # Verify newly added fields 'image_id', 'user_id' and
     # 'request_id' are not part of notification yet
     self.assertTrue('image_id' not in output_log['payload'])
     self.assertTrue('user_id' not in output_log['payload'])
     self.assertTrue('request_id' not in output_log['payload'])
示例#3
0
def format_image_notification(image):
    """
    Given a glance.domain.Image object, return a dictionary of relevant
    notification information. We purposely do not include 'location'
    as it may contain credentials.
    """
    return {
        'id': image.image_id,
        'name': image.name,
        'status': image.status,
        'created_at': timeutils.isotime(image.created_at),
        'updated_at': timeutils.isotime(image.updated_at),
        'min_disk': image.min_disk,
        'min_ram': image.min_ram,
        'protected': image.protected,
        'checksum': image.checksum,
        'owner': image.owner,
        'disk_format': image.disk_format,
        'container_format': image.container_format,
        'size': image.size,
        'virtual_size': image.virtual_size,
        'is_public': image.visibility == 'public',
        'properties': dict(image.extra_properties),
        'tags': list(image.tags),
        'deleted': False,
        'deleted_at': None,
    }
示例#4
0
    def _format_image(self, image):
        def _get_image_locations(image):
            try:
                return list(image.locations)
            except exception.Forbidden:
                return []

        try:
            image_view = dict(image.extra_properties)
            attributes = [
                'name', 'disk_format', 'container_format', 'visibility',
                'size', 'virtual_size', 'status', 'checksum', 'protected',
                'min_ram', 'min_disk', 'owner'
            ]
            for key in attributes:
                image_view[key] = getattr(image, key)
            image_view['id'] = image.image_id
            image_view['created_at'] = timeutils.isotime(image.created_at)
            image_view['updated_at'] = timeutils.isotime(image.updated_at)

            if CONF.show_multiple_locations:
                locations = _get_image_locations(image)
                if locations:
                    image_view['locations'] = []
                    for loc in locations:
                        tmp = dict(loc)
                        tmp.pop('id', None)
                        tmp.pop('status', None)
                        image_view['locations'].append(tmp)
                else:
                    # NOTE (flwang): We will still show "locations": [] if
                    # image.locations is None to indicate it's allowed to show
                    # locations but it's just non-existent.
                    image_view['locations'] = []
                    LOG.debug(
                        "There is not available location "
                        "for image %s", image.image_id)

            if CONF.show_image_direct_url:
                locations = _get_image_locations(image)
                if locations:
                    # Choose best location configured strategy
                    l = location_strategy.choose_best_location(locations)
                    image_view['direct_url'] = l['url']
                else:
                    LOG.debug(
                        "There is not available location "
                        "for image %s", image.image_id)

            image_view['tags'] = list(image.tags)
            image_view['self'] = self._get_image_href(image)
            image_view['file'] = self._get_image_href(image, 'file')
            image_view['schema'] = '/v2/schemas/image'
            image_view = self.schema.filter(image_view)  # domain
            return image_view
        except exception.Forbidden as e:
            raise webob.exc.HTTPForbidden(explanation=e.msg)
示例#5
0
 def _format_image_member(self, member):
     member_view = {}
     attributes = ['member_id', 'image_id', 'status']
     for key in attributes:
         member_view[key] = getattr(member, key)
     member_view['created_at'] = timeutils.isotime(member.created_at)
     member_view['updated_at'] = timeutils.isotime(member.updated_at)
     member_view['schema'] = '/v2/schemas/member'
     member_view = self.schema.filter(member_view)
     return member_view
 def _format_image_member(self, member):
     member_view = {}
     attributes = ['member_id', 'image_id', 'status']
     for key in attributes:
         member_view[key] = getattr(member, key)
     member_view['created_at'] = timeutils.isotime(member.created_at)
     member_view['updated_at'] = timeutils.isotime(member.updated_at)
     member_view['schema'] = '/v2/schemas/member'
     member_view = self.schema.filter(member_view)
     return member_view
示例#7
0
def format_metadef_tag_notification(metadef_tag):
    return {
        "namespace": metadef_tag.namespace,
        "name": metadef_tag.name,
        "name_old": metadef_tag.name,
        "created_at": timeutils.isotime(metadef_tag.created_at),
        "updated_at": timeutils.isotime(metadef_tag.updated_at),
        "deleted": False,
        "deleted_at": None,
    }
示例#8
0
def format_metadef_tag_notification(metadef_tag):
    return {
        'namespace': metadef_tag.namespace,
        'name': metadef_tag.name,
        'name_old': metadef_tag.name,
        'created_at': timeutils.isotime(metadef_tag.created_at),
        'updated_at': timeutils.isotime(metadef_tag.updated_at),
        'deleted': False,
        'deleted_at': None,
    }
示例#9
0
    def _format_image(self, image):

        def _get_image_locations(image):
            try:
                return list(image.locations)
            except exception.Forbidden:
                return []

        try:
            image_view = dict(image.extra_properties)
            attributes = ['name', 'disk_format', 'container_format',
                          'visibility', 'size', 'virtual_size', 'status',
                          'checksum', 'protected', 'min_ram', 'min_disk',
                          'owner']
            for key in attributes:
                image_view[key] = getattr(image, key)
            image_view['id'] = image.image_id
            image_view['created_at'] = timeutils.isotime(image.created_at)
            image_view['updated_at'] = timeutils.isotime(image.updated_at)

            if CONF.show_multiple_locations:
                locations = _get_image_locations(image)
                if locations:
                    image_view['locations'] = []
                    for loc in locations:
                        tmp = dict(loc)
                        tmp.pop('id', None)
                        tmp.pop('status', None)
                        image_view['locations'].append(tmp)
                else:
                    # NOTE (flwang): We will still show "locations": [] if
                    # image.locations is None to indicate it's allowed to show
                    # locations but it's just non-existent.
                    image_view['locations'] = []
                    LOG.debug("There is not available location "
                              "for image %s", image.image_id)

            if CONF.show_image_direct_url:
                locations = _get_image_locations(image)
                if locations:
                    # Choose best location configured strategy
                    l = location_strategy.choose_best_location(locations)
                    image_view['direct_url'] = l['url']
                else:
                    LOG.debug("There is not available location "
                              "for image %s", image.image_id)

            image_view['tags'] = list(image.tags)
            image_view['self'] = self._get_image_href(image)
            image_view['file'] = self._get_image_href(image, 'file')
            image_view['schema'] = '/v2/schemas/image'
            image_view = self.schema.filter(image_view)  # domain
            return image_view
        except exception.Forbidden as e:
            raise webob.exc.HTTPForbidden(explanation=e.msg)
示例#10
0
def format_metadef_resource_type_notification(metadef_resource_type):
    return {
        "namespace": metadef_resource_type.namespace,
        "name": metadef_resource_type.name,
        "name_old": metadef_resource_type.name,
        "prefix": metadef_resource_type.prefix,
        "properties_target": metadef_resource_type.properties_target,
        "created_at": timeutils.isotime(metadef_resource_type.created_at),
        "updated_at": timeutils.isotime(metadef_resource_type.updated_at),
        "deleted": False,
        "deleted_at": None,
    }
示例#11
0
 def test_task_create_notification(self):
     self.task_repo_proxy.add(self.task_stub_proxy)
     output_logs = self.notifier.get_logs()
     self.assertEqual(1, len(output_logs))
     output_log = output_logs[0]
     self.assertEqual("INFO", output_log["notification_type"])
     self.assertEqual("task.create", output_log["event_type"])
     self.assertEqual(self.task.task_id, output_log["payload"]["id"])
     self.assertEqual(timeutils.isotime(self.task.updated_at), output_log["payload"]["updated_at"])
     self.assertEqual(timeutils.isotime(self.task.created_at), output_log["payload"]["created_at"])
     if "location" in output_log["payload"]:
         self.fail("Notification contained location field.")
示例#12
0
def format_metadef_resource_type_notification(metadef_resource_type):
    return {
        'namespace': metadef_resource_type.namespace,
        'name': metadef_resource_type.name,
        'name_old': metadef_resource_type.name,
        'prefix': metadef_resource_type.prefix,
        'properties_target': metadef_resource_type.properties_target,
        'created_at': timeutils.isotime(metadef_resource_type.created_at),
        'updated_at': timeutils.isotime(metadef_resource_type.updated_at),
        'deleted': False,
        'deleted_at': None,
    }
示例#13
0
def format_image_member_notification(image_member):
    """Given a glance.domain.ImageMember object, return a dictionary of relevant
    notification information.
    """
    return {
        'image_id': image_member.image_id,
        'member_id': image_member.member_id,
        'status': image_member.status,
        'created_at': timeutils.isotime(image_member.created_at),
        'updated_at': timeutils.isotime(image_member.updated_at),
        'deleted': False,
        'deleted_at': None,
    }
示例#14
0
def format_image_member_notification(image_member):
    """Given a glance.domain.ImageMember object, return a dictionary of relevant
    notification information.
    """
    return {
        "image_id": image_member.image_id,
        "member_id": image_member.member_id,
        "status": image_member.status,
        "created_at": timeutils.isotime(image_member.created_at),
        "updated_at": timeutils.isotime(image_member.updated_at),
        "deleted": False,
        "deleted_at": None,
    }
示例#15
0
    def _assert_image_member_with_notifier(self, output_log, deleted=False):
        self.assertEqual(self.image_member.member_id, output_log["payload"]["member_id"])
        self.assertEqual(self.image_member.image_id, output_log["payload"]["image_id"])
        self.assertEqual(self.image_member.status, output_log["payload"]["status"])
        self.assertEqual(timeutils.isotime(self.image_member.created_at), output_log["payload"]["created_at"])
        self.assertEqual(timeutils.isotime(self.image_member.updated_at), output_log["payload"]["updated_at"])

        if deleted:
            self.assertTrue(output_log["payload"]["deleted"])
            self.assertIsNotNone(output_log["payload"]["deleted_at"])
        else:
            self.assertFalse(output_log["payload"]["deleted"])
            self.assertIsNone(output_log["payload"]["deleted_at"])
示例#16
0
def format_metadef_namespace_notification(metadef_namespace):
    return {
        'namespace': metadef_namespace.namespace,
        'namespace_old': metadef_namespace.namespace,
        'display_name': metadef_namespace.display_name,
        'protected': metadef_namespace.protected,
        'visibility': metadef_namespace.visibility,
        'owner': metadef_namespace.owner,
        'description': metadef_namespace.description,
        'created_at': timeutils.isotime(metadef_namespace.created_at),
        'updated_at': timeutils.isotime(metadef_namespace.updated_at),
        'deleted': False,
        'deleted_at': None,
    }
示例#17
0
 def test_task_create_notification(self):
     self.task_repo_proxy.add(self.task_stub_proxy)
     output_logs = self.notifier.get_logs()
     self.assertEqual(1, len(output_logs))
     output_log = output_logs[0]
     self.assertEqual('INFO', output_log['notification_type'])
     self.assertEqual('task.create', output_log['event_type'])
     self.assertEqual(self.task.task_id, output_log['payload']['id'])
     self.assertEqual(timeutils.isotime(self.task.updated_at),
                      output_log['payload']['updated_at'])
     self.assertEqual(timeutils.isotime(self.task.created_at),
                      output_log['payload']['created_at'])
     if 'location' in output_log['payload']:
         self.fail('Notification contained location field.')
示例#18
0
def format_metadef_namespace_notification(metadef_namespace):
    return {
        "namespace": metadef_namespace.namespace,
        "namespace_old": metadef_namespace.namespace,
        "display_name": metadef_namespace.display_name,
        "protected": metadef_namespace.protected,
        "visibility": metadef_namespace.visibility,
        "owner": metadef_namespace.owner,
        "description": metadef_namespace.description,
        "created_at": timeutils.isotime(metadef_namespace.created_at),
        "updated_at": timeutils.isotime(metadef_namespace.updated_at),
        "deleted": False,
        "deleted_at": None,
    }
示例#19
0
 def _format_task_stub(self, schema, task):
     task_view = {
         'id': task.task_id,
         'type': task.type,
         'status': task.status,
         'owner': task.owner,
         'created_at': timeutils.isotime(task.created_at),
         'updated_at': timeutils.isotime(task.updated_at),
         'self': self._get_task_location(task),
         'schema': '/v2/schemas/task'
     }
     if task.expires_at:
         task_view['expires_at'] = timeutils.isotime(task.expires_at)
     task_view = schema.filter(task_view)  # domain
     return task_view
示例#20
0
 def _format_task_stub(self, schema, task):
     task_view = {
         'id': task.task_id,
         'type': task.type,
         'status': task.status,
         'owner': task.owner,
         'created_at': timeutils.isotime(task.created_at),
         'updated_at': timeutils.isotime(task.updated_at),
         'self': self._get_task_location(task),
         'schema': '/v2/schemas/task'
     }
     if task.expires_at:
         task_view['expires_at'] = timeutils.isotime(task.expires_at)
     task_view = schema.filter(task_view)  # domain
     return task_view
示例#21
0
def format_task_notification(task):
    # NOTE(nikhil): input is not passed to the notifier payload as it may
    # contain sensitive info.
    return {
        "id": task.task_id,
        "type": task.type,
        "status": task.status,
        "result": None,
        "owner": task.owner,
        "message": None,
        "expires_at": timeutils.isotime(task.expires_at),
        "created_at": timeutils.isotime(task.created_at),
        "updated_at": timeutils.isotime(task.updated_at),
        "deleted": False,
        "deleted_at": None,
    }
示例#22
0
    def to_wsme_model(model, db_entity, self_link=None, schema=None):
        # Return the wsme_attributes names:values as a dict
        names = []
        for attribute in model._wsme_attributes:
            names.append(attribute.name)

        values = {}
        for name in names:
            value = getattr(db_entity, name, None)
            if value is not None:
                if type(value) == datetime:
                    iso_datetime_value = timeutils.isotime(value)
                    values.update({name: iso_datetime_value})
                else:
                    values.update({name: value})

        if schema:
            values['schema'] = schema

        model_object = model(**values)

        # 'self' kwarg is used in wsme.types.Base.__init__(self, ..) and
        # conflicts during initialization. self_link is a proxy field to self.
        if self_link:
            model_object.self = self_link

        return model_object
示例#23
0
    def get_all_locations(self):
        """Returns a list of image id and location tuple from scrub queue.

        :returns: a list of image id, location id and uri tuple from
            scrub queue

        """
        ret = []

        for image in self._get_all_images():
            deleted_at = image.get('deleted_at')
            if not deleted_at:
                continue
            # NOTE: Strip off microseconds which may occur after the last '.,'
            # Example: 2012-07-07T19:14:34.974216
            deleted_at = timeutils.isotime(deleted_at)
            date_str = deleted_at.rsplit('.', 1)[0].rsplit(',', 1)[0]
            delete_time = calendar.timegm(
                time.strptime(date_str, "%Y-%m-%dT%H:%M:%SZ"))

            if delete_time + self.scrub_time > time.time():
                continue

            for loc in image['locations']:
                if loc['status'] != 'pending_delete':
                    continue

                if self.metadata_encryption_key:
                    uri = crypt.urlsafe_decrypt(self.metadata_encryption_key,
                                                loc['url'])
                else:
                    uri = loc['url']

                ret.append((image['id'], loc['id'], uri))
        return ret
示例#24
0
    def to_wsme_model(model, db_entity, self_link=None, schema=None):
        # Return the wsme_attributes names:values as a dict
        names = []
        for attribute in model._wsme_attributes:
            names.append(attribute.name)

        values = {}
        for name in names:
            value = getattr(db_entity, name, None)
            if value is not None:
                if type(value) == datetime:
                    iso_datetime_value = timeutils.isotime(value)
                    values.update({name: iso_datetime_value})
                else:
                    values.update({name: value})

        if schema:
            values['schema'] = schema

        model_object = model(**values)

        # 'self' kwarg is used in wsme.types.Base.__init__(self, ..) and
        # conflicts during initialization. self_link is a proxy field to self.
        if self_link:
            model_object.self = self_link

        return model_object
示例#25
0
def format_task_notification(task):
    # NOTE(nikhil): input is not passed to the notifier payload as it may
    # contain sensitive info.
    return {
        'id': task.task_id,
        'type': task.type,
        'status': task.status,
        'result': None,
        'owner': task.owner,
        'message': None,
        'expires_at': timeutils.isotime(task.expires_at),
        'created_at': timeutils.isotime(task.created_at),
        'updated_at': timeutils.isotime(task.updated_at),
        'deleted': False,
        'deleted_at': None,
    }
示例#26
0
 def remove(self, member):
     super(ImageMemberRepoProxy, self).remove(member)
     self.send_notification('image.member.delete',
                            member,
                            extra_payload={
                                'deleted': True,
                                'deleted_at': timeutils.isotime()
                            })
示例#27
0
 def remove(self, image):
     super(ImageRepoProxy, self).remove(image)
     self.send_notification('image.delete',
                            image,
                            extra_payload={
                                'deleted': True,
                                'deleted_at': timeutils.isotime()
                            })
示例#28
0
 def remove(self, metadef_namespace):
     result = super(MetadefNamespaceRepoProxy, self).remove(metadef_namespace)
     self.send_notification(
         "metadef_namespace.delete",
         metadef_namespace,
         extra_payload={"deleted": True, "deleted_at": timeutils.isotime()},
     )
     return result
示例#29
0
 def remove(self, metadef_namespace):
     result = super(MetadefNamespaceRepoProxy, self).remove(
         metadef_namespace)
     self.send_notification(
         'metadef_namespace.delete', metadef_namespace,
         extra_payload={'deleted': True, 'deleted_at': timeutils.isotime()}
     )
     return result
示例#30
0
    def test_get_image_details_with_changes_since(self):
        """Tests that a detailed call can be filtered by changes-since"""
        dt1 = timeutils.utcnow() - datetime.timedelta(1)
        iso1 = timeutils.isotime(dt1)

        dt2 = timeutils.utcnow() + datetime.timedelta(1)
        iso2 = timeutils.isotime(dt2)

        dt3 = timeutils.utcnow() + datetime.timedelta(2)

        dt4 = timeutils.utcnow() + datetime.timedelta(3)
        iso4 = timeutils.isotime(dt4)

        UUID3 = _gen_uuid()
        extra_fixture = self.get_fixture(id=UUID3, name='fake image #3')

        db_api.image_create(self.context, extra_fixture)
        db_api.image_destroy(self.context, UUID3)

        UUID4 = _gen_uuid()
        extra_fixture = self.get_fixture(id=UUID4,
                                         name='fake image #4',
                                         created_at=dt3,
                                         updated_at=dt3)

        db_api.image_create(self.context, extra_fixture)

        # Check a standard list, 4 images in db (2 deleted)
        images = self.client.get_images_detailed(filters={})
        self.assertEqualImages(images, (UUID4, UUID2), unjsonify=False)

        # Expect 3 images (1 deleted)
        filters = {'changes-since': iso1}
        images = self.client.get_images(filters=filters)
        self.assertEqualImages(images, (UUID4, UUID3, UUID2), unjsonify=False)

        # Expect 1 images (0 deleted)
        filters = {'changes-since': iso2}
        images = self.client.get_images_detailed(filters=filters)
        self.assertEqualImages(images, (UUID4, ), unjsonify=False)

        # Expect 0 images (0 deleted)
        filters = {'changes-since': iso4}
        images = self.client.get_images(filters=filters)
        self.assertEqualImages(images, (), unjsonify=False)
示例#31
0
 def remove(self, task):
     result = super(TaskRepoProxy, self).remove(task)
     self.send_notification('task.delete',
                            task,
                            extra_payload={
                                'deleted': True,
                                'deleted_at': timeutils.isotime()
                            })
     return result
示例#32
0
    def _assert_image_member_with_notifier(self, output_log, deleted=False):
        self.assertEqual(self.image_member.member_id,
                         output_log['payload']['member_id'])
        self.assertEqual(self.image_member.image_id,
                         output_log['payload']['image_id'])
        self.assertEqual(self.image_member.status,
                         output_log['payload']['status'])
        self.assertEqual(timeutils.isotime(self.image_member.created_at),
                         output_log['payload']['created_at'])
        self.assertEqual(timeutils.isotime(self.image_member.updated_at),
                         output_log['payload']['updated_at'])

        if deleted:
            self.assertTrue(output_log['payload']['deleted'])
            self.assertIsNotNone(output_log['payload']['deleted_at'])
        else:
            self.assertFalse(output_log['payload']['deleted'])
            self.assertIsNone(output_log['payload']['deleted_at'])
示例#33
0
 def test_task_create_notification(self):
     self.task_repo_proxy.add(self.task_stub_proxy)
     output_logs = self.notifier.get_logs()
     self.assertEqual(1, len(output_logs))
     output_log = output_logs[0]
     self.assertEqual('INFO', output_log['notification_type'])
     self.assertEqual('task.create', output_log['event_type'])
     self.assertEqual(self.task.task_id, output_log['payload']['id'])
     self.assertEqual(
         timeutils.isotime(self.task.updated_at),
         output_log['payload']['updated_at']
     )
     self.assertEqual(
         timeutils.isotime(self.task.created_at),
         output_log['payload']['created_at']
     )
     if 'location' in output_log['payload']:
         self.fail('Notification contained location field.')
示例#34
0
    def _assert_image_member_with_notifier(self, output_log, deleted=False):
        self.assertEqual(self.image_member.member_id,
                         output_log['payload']['member_id'])
        self.assertEqual(self.image_member.image_id,
                         output_log['payload']['image_id'])
        self.assertEqual(self.image_member.status,
                         output_log['payload']['status'])
        self.assertEqual(timeutils.isotime(self.image_member.created_at),
                         output_log['payload']['created_at'])
        self.assertEqual(timeutils.isotime(self.image_member.updated_at),
                         output_log['payload']['updated_at'])

        if deleted:
            self.assertTrue(output_log['payload']['deleted'])
            self.assertIsNotNone(output_log['payload']['deleted_at'])
        else:
            self.assertFalse(output_log['payload']['deleted'])
            self.assertIsNone(output_log['payload']['deleted_at'])
示例#35
0
def format_metadef_object_notification(metadef_object):
    object_properties = metadef_object.properties or {}
    properties = []
    for name, prop in six.iteritems(object_properties):
        object_property = _format_metadef_object_property(name, prop)
        properties.append(object_property)

    return {
        "namespace": metadef_object.namespace,
        "name": metadef_object.name,
        "name_old": metadef_object.name,
        "properties": properties,
        "required": metadef_object.required,
        "description": metadef_object.description,
        "created_at": timeutils.isotime(metadef_object.created_at),
        "updated_at": timeutils.isotime(metadef_object.updated_at),
        "deleted": False,
        "deleted_at": None,
    }
    def test_get_image_details_with_changes_since(self):
        """Tests that a detailed call can be filtered by changes-since"""
        dt1 = timeutils.utcnow() - datetime.timedelta(1)
        iso1 = timeutils.isotime(dt1)

        dt2 = timeutils.utcnow() + datetime.timedelta(1)
        iso2 = timeutils.isotime(dt2)

        dt3 = timeutils.utcnow() + datetime.timedelta(2)

        dt4 = timeutils.utcnow() + datetime.timedelta(3)
        iso4 = timeutils.isotime(dt4)

        UUID3 = _gen_uuid()
        extra_fixture = self.get_fixture(id=UUID3, name='fake image #3')

        db_api.image_create(self.context, extra_fixture)
        db_api.image_destroy(self.context, UUID3)

        UUID4 = _gen_uuid()
        extra_fixture = self.get_fixture(id=UUID4, name='fake image #4',
                                         created_at=dt3, updated_at=dt3)

        db_api.image_create(self.context, extra_fixture)

        # Check a standard list, 4 images in db (2 deleted)
        images = self.client.get_images_detailed(filters={})
        self.assertEqualImages(images, (UUID4, UUID2), unjsonify=False)

        # Expect 3 images (1 deleted)
        filters = {'changes-since': iso1}
        images = self.client.get_images(filters=filters)
        self.assertEqualImages(images, (UUID4, UUID3, UUID2), unjsonify=False)

        # Expect 1 images (0 deleted)
        filters = {'changes-since': iso2}
        images = self.client.get_images_detailed(filters=filters)
        self.assertEqualImages(images, (UUID4,), unjsonify=False)

        # Expect 0 images (0 deleted)
        filters = {'changes-since': iso4}
        images = self.client.get_images(filters=filters)
        self.assertEqualImages(images, (), unjsonify=False)
示例#37
0
 def remove(self, metadef_tag):
     result = super(MetadefTagRepoProxy, self).remove(metadef_tag)
     self.send_notification('metadef_tag.delete',
                            metadef_tag,
                            extra_payload={
                                'deleted': True,
                                'deleted_at': timeutils.isotime(),
                                'namespace': metadef_tag.namespace.namespace
                            })
     return result
示例#38
0
def format_metadef_object_notification(metadef_object):
    object_properties = metadef_object.properties or {}
    properties = []
    for name, prop in six.iteritems(object_properties):
        object_property = _format_metadef_object_property(name, prop)
        properties.append(object_property)

    return {
        'namespace': metadef_object.namespace,
        'name': metadef_object.name,
        'name_old': metadef_object.name,
        'properties': properties,
        'required': metadef_object.required,
        'description': metadef_object.description,
        'created_at': timeutils.isotime(metadef_object.created_at),
        'updated_at': timeutils.isotime(metadef_object.updated_at),
        'deleted': False,
        'deleted_at': None,
    }
示例#39
0
 def remove(self, metadef_tag):
     result = super(MetadefTagRepoProxy, self).remove(metadef_tag)
     self.send_notification(
         'metadef_tag.delete', metadef_tag,
         extra_payload={
             'deleted': True,
             'deleted_at': timeutils.isotime(),
             'namespace': metadef_tag.namespace.namespace
         }
     )
     return result
示例#40
0
    def _format_service(self, service):
        try:
            service_view = dict(service.extra_properties)
            attributes = [
                'name', 'schema', 'port', 'host', 'endpoint', 'status',
                'total_size', 'avail_size', 'disk_wwn', 'file_system_uuid',
                'storage_dir'
            ]
            for key in attributes:
                service_view[key] = getattr(service, key)

            service_view['id'] = service.id
            service_view['self'] = self._get_service_href(service)
            service_view['used_size'] = service.total_size - service.avail_size
            service_view['created_at'] = timeutils.isotime(service.created_at)
            service_view['updated_at'] = timeutils.isotime(service.updated_at)
            service_view['tags'] = list(service.tags)

            return service_view
        except exception.Forbidden as e:
            raise webob.exc.HTTPForbidden(explanation=e.msg)
示例#41
0
 def remove(self, md_resource_type):
     result = super(MetadefResourceTypeRepoProxy, self).remove(
         md_resource_type)
     self.send_notification(
         'metadef_resource_type.delete', md_resource_type,
         extra_payload={
             'deleted': True,
             'deleted_at': timeutils.isotime(),
             'namespace': md_resource_type.namespace.namespace
         }
     )
     return result
示例#42
0
 def remove(self, md_resource_type):
     result = super(MetadefResourceTypeRepoProxy, self).remove(md_resource_type)
     self.send_notification(
         "metadef_resource_type.delete",
         md_resource_type,
         extra_payload={
             "deleted": True,
             "deleted_at": timeutils.isotime(),
             "namespace": md_resource_type.namespace.namespace,
         },
     )
     return result
示例#43
0
 def remove(self, metadef_tag):
     result = super(MetadefTagRepoProxy, self).remove(metadef_tag)
     self.send_notification(
         "metadef_tag.delete",
         metadef_tag,
         extra_payload={
             "deleted": True,
             "deleted_at": timeutils.isotime(),
             "namespace": metadef_tag.namespace.namespace,
         },
     )
     return result
示例#44
0
 def _format_task(self, schema, task):
     task_view = {
         'id': task.task_id,
         'input': task.task_input,
         'type': task.type,
         'status': task.status,
         'owner': task.owner,
         'message': task.message,
         'result': task.result,
         'created_at': timeutils.isotime(task.created_at),
         'updated_at': timeutils.isotime(task.updated_at),
         'self': self._get_task_location(task),
         'schema': '/v2/schemas/task'
     }
     if task.image_id:
         task_view['image_id'] = task.image_id
     if task.request_id:
         task_view['request_id'] = task.request_id
     if task.user_id:
         task_view['user_id'] = task.user_id
     if task.expires_at:
         task_view['expires_at'] = timeutils.isotime(task.expires_at)
     task_view = schema.filter(task_view)  # domain
     return task_view
示例#45
0
文件: scrubber.py 项目: mahak/glance
    def get_all_locations(self):
        """Returns a list of image id and location tuple from scrub queue.

        :returns: a list of image id, location id and uri tuple from
            scrub queue

        """
        ret = []

        for image in self._get_all_images():
            deleted_at = image.get('deleted_at')
            if not deleted_at:
                continue
            # NOTE: Strip off microseconds which may occur after the last '.,'
            # Example: 2012-07-07T19:14:34.974216
            deleted_at = timeutils.isotime(deleted_at)
            date_str = deleted_at.rsplit('.', 1)[0].rsplit(',', 1)[0]
            delete_time = calendar.timegm(time.strptime(date_str,
                                                        "%Y-%m-%dT%H:%M:%SZ"))

            if delete_time + self.scrub_time > time.time():
                continue

            for loc in image['locations']:
                if loc['status'] != 'pending_delete':
                    continue

                if self.metadata_encryption_key:
                    uri = crypt.urlsafe_decrypt(self.metadata_encryption_key,
                                                loc['url'])
                else:
                    uri = loc['url']

                # if multi-store is enabled then we need to pass backend
                # to delete the image.
                backend = loc['metadata'].get('backend')
                if CONF.enabled_backends:
                    ret.append((image['id'], loc['id'], uri, backend))
                else:
                    ret.append((image['id'], loc['id'], uri))
        return ret
示例#46
0
 def test_now_roundtrip(self):
     time_str = timeutils.isotime()
     now = timeutils.parse_isotime(time_str)
     self.assertEqual(now.tzinfo, iso8601.iso8601.UTC)
     self.assertEqual(timeutils.isotime(now), time_str)
示例#47
0
 def test_east_roundtrip(self):
     time_str = '2012-02-14T20:53:07-07:00'
     east = timeutils.parse_isotime(time_str)
     self.assertEqual(east.tzinfo.tzname(None), '-07:00')
     self.assertEqual(timeutils.isotime(east), time_str)
示例#48
0
 def test_west_roundtrip(self):
     time_str = '2012-02-14T20:53:07+11:30'
     west = timeutils.parse_isotime(time_str)
     self.assertEqual(west.tzinfo.tzname(None), '+11:30')
     self.assertEqual(timeutils.isotime(west), time_str)
示例#49
0
 def test_iso8601_from_timestamp(self):
     utcnow = timeutils.utcnow()
     iso = timeutils.isotime(utcnow)
     ts = calendar.timegm(utcnow.timetuple())
     self.assertEqual(iso, timeutils.iso8601_from_timestamp(ts))
示例#50
0
 def test_isotimei_micro_second_precision(self):
     with mock.patch('datetime.datetime') as datetime_mock:
         datetime_mock.utcnow.return_value = self.skynet_self_aware_ms_time
         dt = timeutils.isotime(subsecond=True)
         self.assertEqual(dt, self.skynet_self_aware_time_ms_str)
示例#51
0
 def test_isotime(self):
     with mock.patch('datetime.datetime') as datetime_mock:
         datetime_mock.utcnow.return_value = self.skynet_self_aware_time
         dt = timeutils.isotime()
         self.assertEqual(dt, self.skynet_self_aware_time_str)