From a3a7464a8de96e219f40049fdd03b41cb8eb65ca Mon Sep 17 00:00:00 2001 From: Russell Bryant Date: Sat, 10 Mar 2012 13:12:27 -0500 Subject: Sort results from describe_instances in EC2 API. Fix bug 827619. This bug pointed out that EC2 sorts the results of of describe_instances by the launch time. Make our implementation of the EC2 API behave the same way. Previously, instances coming out of the db API were sorted by the key we wanted, but in the opposite order. You can now specify both a sort key and order. The behavior is the same by default, but the EC2 API sets the parameter to do an ascending sort. Change-Id: Ifd0bc79ad4c4c8c45809dbb1ac2dadf8abcfd4c3 --- nova/compute/api.py | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) (limited to 'nova/compute') diff --git a/nova/compute/api.py b/nova/compute/api.py index 71d7627d5..79e490395 100644 --- a/nova/compute/api.py +++ b/nova/compute/api.py @@ -1028,7 +1028,8 @@ class API(base.Base): inst['name'] = instance['name'] return inst - def get_all(self, context, search_opts=None): + def get_all(self, context, search_opts=None, sort_key='created_at', + sort_dir='desc'): """Get all instances filtered by one of the given parameters. If there is no filter and the context is an admin, it will retrieve @@ -1036,6 +1037,10 @@ class API(base.Base): Deleted instances will be returned by default, unless there is a search option that says otherwise. + + The results will be returned sorted in the order specified by the + 'sort_dir' parameter using the key specified in the 'sort_key' + parameter. """ #TODO(bcwaldon): determine the best argument for target here @@ -1101,7 +1106,8 @@ class API(base.Base): except ValueError: return [] - inst_models = self._get_instances_by_filters(context, filters) + inst_models = self._get_instances_by_filters(context, filters, + sort_key, sort_dir) # Convert the models to dictionaries instances = [] @@ -1113,7 +1119,7 @@ class API(base.Base): return instances - def _get_instances_by_filters(self, context, filters): + def _get_instances_by_filters(self, context, filters, sort_key, sort_dir): if 'ip6' in filters or 'ip' in filters: res = self.network_api.get_instance_uuids_by_ip_filter(context, filters) @@ -1122,7 +1128,8 @@ class API(base.Base): uuids = set([r['instance_uuid'] for r in res]) filters['uuid'] = uuids - return self.db.instance_get_all_by_filters(context, filters) + return self.db.instance_get_all_by_filters(context, filters, sort_key, + sort_dir) @wrap_check_policy @check_instance_state(vm_state=[vm_states.ACTIVE, vm_states.SHUTOFF]) -- cgit