From 75a87df739effe840e6cb39c976002e99b49c796 Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Wed, 22 Jun 2011 13:31:28 -0500 Subject: Round 1 of backup with rotation. --- nova/compute/api.py | 32 ++++++++++++++++++++++++++++++-- nova/compute/manager.py | 20 ++++++++++++++++++-- 2 files changed, 48 insertions(+), 4 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/api.py b/nova/compute/api.py index a7ea88d51..365aa1c5d 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -701,18 +701,46 @@ class API(base.Base): raise exception.Error(_("Unable to find host for Instance %s") % instance_id) + def backup(self, context, instance_id, backup_type, rotation): + """Backup the given instance + + instance_id - int - id representing the instance + backup_type - str - whether it's 'daily' or 'weekly' + rotation - int - number of backups to keep around + """ + name = backup_type # daily backups are called 'daily' + recv_meta = self._snapshot(context, instance_id, name, backup_type, + rotation=rotation) + return recv_meta + def snapshot(self, context, instance_id, name): """Snapshot the given instance. :returns: A dict containing image metadata """ - properties = {'instance_id': str(instance_id), + return self._snapshot(context, instance_id, name, 'snapshot') + + def _snapshot(self, context, instance_id, name, image_type, rotation=None): + """Snapshot an instance on this host. + + :param context: security context + :param instance_id: nova.db.sqlalchemy.models.Instance.Id + :param name: string for name of the snapshot + :param image_type: snapshot | daily | weekly + :param rotation: int representing how many backups to keep around; + None if rotation shouldn't be used (as in the case of snapshots) + """ + instance = db.api.instance_get(context, instance_id) + properties = {'instance_uuid': instance['uuid'], 'user_id': str(context.user_id), 'image_state': 'creating'} + if image_type != 'snapshot': + properties['backup_type'] = image_type sent_meta = {'name': name, 'is_public': False, 'status': 'creating', 'properties': properties} recv_meta = self.image_service.create(context, sent_meta) - params = {'image_id': recv_meta['id']} + params = {'image_id': recv_meta['id'], 'image_type': image_type, + 'rotation': rotation} self._cast_compute_message('snapshot_instance', context, instance_id, params=params) return recv_meta diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 4e006e677..bc6981c58 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -473,8 +473,17 @@ class ComputeManager(manager.SchedulerDependentManager): self._update_state(context, instance_id) @exception.wrap_exception - def snapshot_instance(self, context, instance_id, image_id): - """Snapshot an instance on this host.""" + def snapshot_instance(self, context, instance_id, image_id, + image_type='snapshot', rotation=None): + """Snapshot an instance on this host. + + :param context: security context + :param instance_id: nova.db.sqlalchemy.models.Instance.Id + :param image_id: glance.db.sqlalchemy.models.Image.Id + :param image_type: snapshot | daily | weekly + :param rotation: int representing how many backups to keep around; + None if rotation shouldn't be used (as in the case of snapshots) + """ context = context.elevated() instance_ref = self.db.instance_get(context, instance_id) @@ -493,6 +502,13 @@ class ComputeManager(manager.SchedulerDependentManager): 'expected: %(running)s)') % locals()) self.driver.snapshot(instance_ref, image_id) + if rotation: + self.rotate_backups(context, instance_id, image_type, rotation) + + def rotate_backups(self, context, instance_id, image_type, rotation): + """ + """ + pass @exception.wrap_exception @checks_instance_lock -- cgit From ab2a77d0c6f738fe70b5d5a77fa7f97bf1f1f88b Mon Sep 17 00:00:00 2001 From: Rick Harris Date: Wed, 22 Jun 2011 16:14:01 -0500 Subject: Adding backup rotation --- nova/compute/api.py | 7 +++---- nova/compute/manager.py | 40 ++++++++++++++++++++++++++++++++++------ 2 files changed, 37 insertions(+), 10 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/api.py b/nova/compute/api.py index 365aa1c5d..c0cb2e18a 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -722,7 +722,7 @@ class API(base.Base): def _snapshot(self, context, instance_id, name, image_type, rotation=None): """Snapshot an instance on this host. - + :param context: security context :param instance_id: nova.db.sqlalchemy.models.Instance.Id :param name: string for name of the snapshot @@ -733,9 +733,8 @@ class API(base.Base): instance = db.api.instance_get(context, instance_id) properties = {'instance_uuid': instance['uuid'], 'user_id': str(context.user_id), - 'image_state': 'creating'} - if image_type != 'snapshot': - properties['backup_type'] = image_type + 'image_state': 'creating', + 'image_type': image_type} sent_meta = {'name': name, 'is_public': False, 'status': 'creating', 'properties': properties} recv_meta = self.image_service.create(context, sent_meta) diff --git a/nova/compute/manager.py b/nova/compute/manager.py index bc6981c58..44abd5d89 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -43,6 +43,7 @@ import time import functools from eventlet import greenthread +from operator import itemgetter from nova import exception from nova import flags @@ -476,7 +477,7 @@ class ComputeManager(manager.SchedulerDependentManager): def snapshot_instance(self, context, instance_id, image_id, image_type='snapshot', rotation=None): """Snapshot an instance on this host. - + :param context: security context :param instance_id: nova.db.sqlalchemy.models.Instance.Id :param image_id: glance.db.sqlalchemy.models.Image.Id @@ -502,13 +503,40 @@ class ComputeManager(manager.SchedulerDependentManager): 'expected: %(running)s)') % locals()) self.driver.snapshot(instance_ref, image_id) - if rotation: - self.rotate_backups(context, instance_id, image_type, rotation) + if rotation and image_type == 'snapshot': + raise exception.ImageRotationNotAllowed + elif rotation: + instance_uuid = instance_ref['uuid'] + self.rotate_backups(context, instance_uuid, image_type, rotation) - def rotate_backups(self, context, instance_id, image_type, rotation): - """ + def rotate_backups(self, context, instance_uuid, image_type, rotation): + """Delete excess backups associated to an instance. + + Instances are allowed a fixed number of backups (the rotation number); + this method deletes the oldest backups that exceed the rotation + threshold. + + :param context: security context + :param instance_uuid: string representing uuid of instance + :param image_type: snapshot | daily | weekly + :param rotation: int representing how many backups to keep around; + None if rotation shouldn't be used (as in the case of snapshots) """ - pass + image_service = nova.image.get_default_image_service() + filters = {'property-image-type': image_type, + 'property-instance-uuid': instance_uuid} + images = image_service.detail(context, filters=filters) + if len(images) > rotation: + # Sort oldest (by created_at) to end of list + images.sort(key=itemgetter('created_at'), reverse=True) + + # NOTE(sirp): this deletes all backups that exceed the rotation + # limit + excess = len(images) - rotation + for i in xrange(excess): + image = images.pop() + image_id = image['id'] + image_service.delete(context, image_id) @exception.wrap_exception @checks_instance_lock -- cgit From 63a9216ecbaab20fc7dfb82afb9fe0e2f3fbded4 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Thu, 23 Jun 2011 15:35:26 -0500 Subject: Adding missing import. --- nova/compute/manager.py | 1 + 1 file changed, 1 insertion(+) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 44abd5d89..3c849286e 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -47,6 +47,7 @@ from operator import itemgetter from nova import exception from nova import flags +import nova.image from nova import log as logging from nova import manager from nova import network -- cgit From 2028222a5ed47dc82b49f51969d237c4eece50e7 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Thu, 23 Jun 2011 16:17:54 -0500 Subject: Fixed filter property and added logging. --- nova/compute/manager.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 3c849286e..d0ca1ff0d 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -524,9 +524,10 @@ class ComputeManager(manager.SchedulerDependentManager): None if rotation shouldn't be used (as in the case of snapshots) """ image_service = nova.image.get_default_image_service() - filters = {'property-image-type': image_type, - 'property-instance-uuid': instance_uuid} + filters = {'property-image_type': image_type, + 'property-instance_uuid': instance_uuid} images = image_service.detail(context, filters=filters) + LOG.debug(_("Found %d images (rotation: %d)" % (len(images), rotation))) if len(images) > rotation: # Sort oldest (by created_at) to end of list images.sort(key=itemgetter('created_at'), reverse=True) @@ -534,9 +535,11 @@ class ComputeManager(manager.SchedulerDependentManager): # NOTE(sirp): this deletes all backups that exceed the rotation # limit excess = len(images) - rotation + LOG.debug(_("Rotating out %d backups" % excess)) for i in xrange(excess): image = images.pop() image_id = image['id'] + LOG.debug(_("Deleting image %d" % image_id)) image_service.delete(context, image_id) @exception.wrap_exception -- cgit From e3c1a6742b16add04d76631b9dbd4f2ef016e0b3 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Thu, 23 Jun 2011 16:19:08 -0500 Subject: PEP8 cleanup. --- nova/compute/manager.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index d0ca1ff0d..4bd7d434e 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -527,7 +527,8 @@ class ComputeManager(manager.SchedulerDependentManager): filters = {'property-image_type': image_type, 'property-instance_uuid': instance_uuid} images = image_service.detail(context, filters=filters) - LOG.debug(_("Found %d images (rotation: %d)" % (len(images), rotation))) + LOG.debug(_("Found %d images (rotation: %d)" % + (len(images), rotation))) if len(images) > rotation: # Sort oldest (by created_at) to end of list images.sort(key=itemgetter('created_at'), reverse=True) -- cgit From a045cd5fdd00b3e52f46181017077146abe8df9f Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Thu, 23 Jun 2011 16:54:28 -0500 Subject: Fixed syntax errors. --- nova/compute/manager.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 4bd7d434e..ca66d0387 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -527,9 +527,10 @@ class ComputeManager(manager.SchedulerDependentManager): filters = {'property-image_type': image_type, 'property-instance_uuid': instance_uuid} images = image_service.detail(context, filters=filters) - LOG.debug(_("Found %d images (rotation: %d)" % - (len(images), rotation))) - if len(images) > rotation: + num_images = len(images) + LOG.debug(_("Found %(num_images)d images (rotation: %(rotation)d)" + % locals())) + if num_images > rotation: # Sort oldest (by created_at) to end of list images.sort(key=itemgetter('created_at'), reverse=True) -- cgit From 594d5c7a98f2b4e6ea2d866f10c67cbdaa88ce0c Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Fri, 24 Jun 2011 15:03:01 -0500 Subject: Refactored backup rotate. --- nova/compute/api.py | 33 ++++++++++++++++++++------------- nova/compute/manager.py | 29 ++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 22 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/api.py b/nova/compute/api.py index c0cb2e18a..9c6f0ef9d 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -701,32 +701,38 @@ class API(base.Base): raise exception.Error(_("Unable to find host for Instance %s") % instance_id) - def backup(self, context, instance_id, backup_type, rotation): + def backup(self, context, instance_id, name, backup_type, rotation): """Backup the given instance - instance_id - int - id representing the instance - backup_type - str - whether it's 'daily' or 'weekly' - rotation - int - number of backups to keep around - """ + :param instance_id: nova.db.sqlalchemy.models.Instance.Id + :param name: name of the backup or snapshot name = backup_type # daily backups are called 'daily' - recv_meta = self._snapshot(context, instance_id, name, backup_type, - rotation=rotation) + :param rotation: int representing how many backups to keep around; + None if rotation shouldn't be used (as in the case of snapshots) + """ + recv_meta = self._create_image(context, instance_id, name, 'backup', + backup_type=backup_type, rotation=rotation) return recv_meta def snapshot(self, context, instance_id, name): """Snapshot the given instance. + :param instance_id: nova.db.sqlalchemy.models.Instance.Id + :param name: name of the backup or snapshot + :returns: A dict containing image metadata """ - return self._snapshot(context, instance_id, name, 'snapshot') + return self._create_image(context, instance_id, name, 'snapshot') - def _snapshot(self, context, instance_id, name, image_type, rotation=None): - """Snapshot an instance on this host. + def _create_image(self, context, instance_id, name, image_type, + backup_type=None, rotation=None): + """Create snapshot or backup for an instance on this host. :param context: security context :param instance_id: nova.db.sqlalchemy.models.Instance.Id :param name: string for name of the snapshot - :param image_type: snapshot | daily | weekly + :param image_type: snapshot | backup + :param backup_type: daily | weekly :param rotation: int representing how many backups to keep around; None if rotation shouldn't be used (as in the case of snapshots) """ @@ -734,12 +740,13 @@ class API(base.Base): properties = {'instance_uuid': instance['uuid'], 'user_id': str(context.user_id), 'image_state': 'creating', - 'image_type': image_type} + 'image_type': image_type, + 'backup_type': backup_type} sent_meta = {'name': name, 'is_public': False, 'status': 'creating', 'properties': properties} recv_meta = self.image_service.create(context, sent_meta) params = {'image_id': recv_meta['id'], 'image_type': image_type, - 'rotation': rotation} + 'backup_type': backup_type, 'rotation': rotation} self._cast_compute_message('snapshot_instance', context, instance_id, params=params) return recv_meta diff --git a/nova/compute/manager.py b/nova/compute/manager.py index ca66d0387..1458ea41f 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -476,13 +476,15 @@ class ComputeManager(manager.SchedulerDependentManager): @exception.wrap_exception def snapshot_instance(self, context, instance_id, image_id, - image_type='snapshot', rotation=None): + image_type='snapshot', backup_type=None, + rotation=None): """Snapshot an instance on this host. :param context: security context :param instance_id: nova.db.sqlalchemy.models.Instance.Id :param image_id: glance.db.sqlalchemy.models.Image.Id - :param image_type: snapshot | daily | weekly + :param image_type: snapshot | backup + :param backup_type: daily | weekly :param rotation: int representing how many backups to keep around; None if rotation shouldn't be used (as in the case of snapshots) """ @@ -504,13 +506,21 @@ class ComputeManager(manager.SchedulerDependentManager): 'expected: %(running)s)') % locals()) self.driver.snapshot(instance_ref, image_id) - if rotation and image_type == 'snapshot': + + if image_type == 'snapshot' and rotation: raise exception.ImageRotationNotAllowed - elif rotation: - instance_uuid = instance_ref['uuid'] - self.rotate_backups(context, instance_uuid, image_type, rotation) + elif image_type == 'backup': + if rotation: + instance_uuid = instance_ref['uuid'] + self.rotate_backups(context, instance_uuid, backup_type, + rotation) + else: + raise exception.RotationRequiredForBackup + else: + raise Exception(_('Image type not recognized %s') % image_type) + - def rotate_backups(self, context, instance_uuid, image_type, rotation): + def rotate_backups(self, context, instance_uuid, backup_type, rotation): """Delete excess backups associated to an instance. Instances are allowed a fixed number of backups (the rotation number); @@ -519,12 +529,13 @@ class ComputeManager(manager.SchedulerDependentManager): :param context: security context :param instance_uuid: string representing uuid of instance - :param image_type: snapshot | daily | weekly + :param backup_type: daily | weekly :param rotation: int representing how many backups to keep around; None if rotation shouldn't be used (as in the case of snapshots) """ image_service = nova.image.get_default_image_service() - filters = {'property-image_type': image_type, + filters = {'property-image_type': 'backup', + 'property-backup_type': backup_type, 'property-instance_uuid': instance_uuid} images = image_service.detail(context, filters=filters) num_images = len(images) -- cgit From a1b9aea9d12eaa32f869e5a4a59b01788e6c836d Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Fri, 24 Jun 2011 15:04:34 -0500 Subject: PEP8 cleanup. --- nova/compute/api.py | 2 +- nova/compute/manager.py | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/api.py b/nova/compute/api.py index 9c6f0ef9d..efd6d166b 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -719,7 +719,7 @@ class API(base.Base): :param instance_id: nova.db.sqlalchemy.models.Instance.Id :param name: name of the backup or snapshot - + :returns: A dict containing image metadata """ return self._create_image(context, instance_id, name, 'snapshot') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 1458ea41f..d4e1d3a1e 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -506,7 +506,7 @@ class ComputeManager(manager.SchedulerDependentManager): 'expected: %(running)s)') % locals()) self.driver.snapshot(instance_ref, image_id) - + if image_type == 'snapshot' and rotation: raise exception.ImageRotationNotAllowed elif image_type == 'backup': @@ -519,7 +519,6 @@ class ComputeManager(manager.SchedulerDependentManager): else: raise Exception(_('Image type not recognized %s') % image_type) - def rotate_backups(self, context, instance_uuid, backup_type, rotation): """Delete excess backups associated to an instance. -- cgit From 3b85d8080ee06436873bd2e4d8f358e4686da1bf Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Fri, 24 Jun 2011 15:18:05 -0500 Subject: Fixed snapshot logic. --- nova/compute/manager.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index d4e1d3a1e..8708768fb 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -507,8 +507,9 @@ class ComputeManager(manager.SchedulerDependentManager): self.driver.snapshot(instance_ref, image_id) - if image_type == 'snapshot' and rotation: - raise exception.ImageRotationNotAllowed + if image_type == 'snapshot': + if rotation: + raise exception.ImageRotationNotAllowed elif image_type == 'backup': if rotation: instance_uuid = instance_ref['uuid'] -- cgit From 883992df19441544deb9aa5f60f2a77ab1f46567 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Mon, 27 Jun 2011 16:50:17 -0500 Subject: Review feedback. --- nova/compute/manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 9d71ff922..156b197e1 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -523,14 +523,14 @@ class ComputeManager(manager.SchedulerDependentManager): if image_type == 'snapshot': if rotation: - raise exception.ImageRotationNotAllowed + raise exception.ImageRotationNotAllowed() elif image_type == 'backup': if rotation: instance_uuid = instance_ref['uuid'] self.rotate_backups(context, instance_uuid, backup_type, rotation) else: - raise exception.RotationRequiredForBackup + raise exception.RotationRequiredForBackup() else: raise Exception(_('Image type not recognized %s') % image_type) -- cgit From ec574986212b694bfed8109545b4b4dc578ec8f4 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Tue, 28 Jun 2011 14:49:40 -0500 Subject: Review feedback. --- nova/compute/manager.py | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 156b197e1..fc9a89379 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -547,15 +547,30 @@ class ComputeManager(manager.SchedulerDependentManager): :param rotation: int representing how many backups to keep around; None if rotation shouldn't be used (as in the case of snapshots) """ + # NOTE(jk0): Eventually extract this out to the ImageService? + def fetch_images(): + images = [] + offset = 0 + while True: + batch = image_service.detail(context, filters=filters, + offset=offset) + if not batch: + break + images += batch + offset += len(batch) + return images + image_service = nova.image.get_default_image_service() filters = {'property-image_type': 'backup', 'property-backup_type': backup_type, 'property-instance_uuid': instance_uuid} - images = image_service.detail(context, filters=filters) + + images = fetch_images() num_images = len(images) LOG.debug(_("Found %(num_images)d images (rotation: %(rotation)d)" % locals())) if num_images > rotation: + # TODO(jk0): Use db-level sorting in glance when it hits trunk. # Sort oldest (by created_at) to end of list images.sort(key=itemgetter('created_at'), reverse=True) -- cgit From ee2eb1f712a87e73832618be6b79f74301d74a41 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Tue, 28 Jun 2011 14:58:34 -0500 Subject: Whoops. --- nova/compute/manager.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index fc9a89379..6a7bb73cb 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -550,14 +550,14 @@ class ComputeManager(manager.SchedulerDependentManager): # NOTE(jk0): Eventually extract this out to the ImageService? def fetch_images(): images = [] - offset = 0 + marker = 0 while True: batch = image_service.detail(context, filters=filters, - offset=offset) + marker=marker) if not batch: break images += batch - offset += len(batch) + marker += len(batch) return images image_service = nova.image.get_default_image_service() -- cgit From ec1afee8399818db2ba11952a61c924da73f57a0 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Tue, 28 Jun 2011 15:17:23 -0500 Subject: OOPS --- nova/compute/manager.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 6a7bb73cb..fdb231e9e 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -550,14 +550,14 @@ class ComputeManager(manager.SchedulerDependentManager): # NOTE(jk0): Eventually extract this out to the ImageService? def fetch_images(): images = [] - marker = 0 + marker = None while True: batch = image_service.detail(context, filters=filters, marker=marker) if not batch: break images += batch - marker += len(batch) + marker = batch[-1]['id'] return images image_service = nova.image.get_default_image_service() -- cgit From d0ff8a737111e9155fd59816afa5c4fc2b34bb4c Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Tue, 28 Jun 2011 16:54:25 -0500 Subject: Let glance handle sorting. --- nova/compute/manager.py | 5 ----- 1 file changed, 5 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index fdb231e9e..f81e793fe 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -43,7 +43,6 @@ import time import functools from eventlet import greenthread -from operator import itemgetter from nova import exception from nova import flags @@ -570,10 +569,6 @@ class ComputeManager(manager.SchedulerDependentManager): LOG.debug(_("Found %(num_images)d images (rotation: %(rotation)d)" % locals())) if num_images > rotation: - # TODO(jk0): Use db-level sorting in glance when it hits trunk. - # Sort oldest (by created_at) to end of list - images.sort(key=itemgetter('created_at'), reverse=True) - # NOTE(sirp): this deletes all backups that exceed the rotation # limit excess = len(images) - rotation -- cgit From 0ca902cb90ea824ef199601b65dbc52e6c713079 Mon Sep 17 00:00:00 2001 From: Josh Kearney Date: Tue, 28 Jun 2011 18:50:17 -0500 Subject: Review feedback --- nova/compute/manager.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'nova/compute') diff --git a/nova/compute/manager.py b/nova/compute/manager.py index 404a2176b..40a640083 100644 --- a/nova/compute/manager.py +++ b/nova/compute/manager.py @@ -571,7 +571,7 @@ class ComputeManager(manager.SchedulerDependentManager): marker = None while True: batch = image_service.detail(context, filters=filters, - marker=marker) + marker=marker, sort_key='created_at', sort_dir='desc') if not batch: break images += batch -- cgit