Convert marker format for listing manageable resources

The marker for listing manageable resources is the "reference"
property which should be dict.

We should convert and check its format before using.

Change-Id: I190ff8506e0056d685ce429c2fa275b097f9e635
Closes-bug: #1657992
This commit is contained in:
wangxiyuan
2017-05-19 10:00:46 +08:00
parent e2fda841d5
commit 8a736209ed
2 changed files with 19 additions and 2 deletions

View File

@@ -911,7 +911,8 @@ class VolumeUtilsTestCase(test.TestCase):
result = volume_utils.extract_id_from_snapshot_name(snap_name)
self.assertIsNone(result)
def test_paginate_entries_list_with_marker(self):
@ddt.data({"name": "vol02"}, '{"name": "vol02"}')
def test_paginate_entries_list_with_marker(self, marker):
entries = [{'reference': {'name': 'vol03'}, 'size': 1},
{'reference': {'name': 'vol01'}, 'size': 3},
{'reference': {'name': 'vol02'}, 'size': 3},
@@ -922,7 +923,7 @@ class VolumeUtilsTestCase(test.TestCase):
expected = [{'reference': {'name': 'vol04'}, 'size': 2},
{'reference': {'name': 'vol03'}, 'size': 1},
{'reference': {'name': 'vol05'}, 'size': 1}]
res = volume_utils.paginate_entries_list(entries, {'name': 'vol02'}, 3,
res = volume_utils.paginate_entries_list(entries, marker, 3,
1, ['size', 'reference'],
['desc', 'asc'])
self.assertEqual(expected, res)
@@ -942,6 +943,14 @@ class VolumeUtilsTestCase(test.TestCase):
['reference'], ['desc'])
self.assertEqual(expected, res)
def test_paginate_entries_list_marker_invalid_format(self):
entries = [{'reference': {'name': 'vol03'}, 'size': 1},
{'reference': {'name': 'vol01'}, 'size': 3}]
self.assertRaises(exception.InvalidInput,
volume_utils.paginate_entries_list,
entries, "invalid_format", 3, None,
['size', 'reference'], ['desc', 'asc'])
def test_paginate_entries_list_marker_not_found(self):
entries = [{'reference': {'name': 'vol03'}, 'size': 1},
{'reference': {'name': 'vol01'}, 'size': 3}]

View File

@@ -17,6 +17,7 @@
import ast
import functools
import json
import math
import operator
from os import urandom
@@ -839,6 +840,13 @@ def paginate_entries_list(entries, marker, limit, offset, sort_keys,
if offset is None:
offset = 0
if marker:
if not isinstance(marker, dict):
try:
marker = json.loads(marker)
except ValueError:
msg = _('marker %s can not be analysed, please use json like '
'format') % marker
raise exception.InvalidInput(reason=msg)
start_index = -1
for i, entry in enumerate(sorted_entries):
if entry['reference'] == marker: