Stop always encoding resource

This makes sure we do not try to guess the mechanism used by the server if it
ever changes.

The test is changed to not make UUID with / in it working. This won't
work for a lot of reasons, and it should probably not work, so it's the
responsibility of the caller to not use a / in the resource id.

Change-Id: Ic7ce4033ee13c65e6f542f52ebf15d8f271deee6
This commit is contained in:
Julien Danjou 2016-12-20 16:27:50 +01:00
parent 3615beca8f
commit 641ac0861b
4 changed files with 6 additions and 42 deletions

View File

@ -13,14 +13,11 @@
from oslo_utils import uuidutils
from gnocchiclient.tests.functional import base
from gnocchiclient import utils
class ResourceClientTest(base.ClientTestBase):
RESOURCE_ID = uuidutils.generate_uuid()
RESOURCE_ID2 = uuidutils.generate_uuid()
RAW_RESOURCE_ID2 = uuidutils.generate_uuid() + "/foo"
RESOURCE_ID2 = utils.encode_resource_id(RAW_RESOURCE_ID2)
RESOURCE_ID2 = "foo"
PROJECT_ID = uuidutils.generate_uuid()
def test_help(self):
@ -123,10 +120,9 @@ class ResourceClientTest(base.ClientTestBase):
result = self.gnocchi(
'resource', params=("create %s -t generic "
"-a project_id:%s"
) % (self.RAW_RESOURCE_ID2, self.PROJECT_ID))
) % (self.RESOURCE_ID2, self.PROJECT_ID))
resource2 = self.details_multiple(result)[0]
self.assertEqual(self.RESOURCE_ID2, resource2["id"])
self.assertEqual(self.RAW_RESOURCE_ID2,
self.assertEqual(self.RESOURCE_ID2,
resource2["original_resource_id"])
self.assertEqual(self.PROJECT_ID, resource2["project_id"])
self.assertNotEqual('None', resource2["started_at"])
@ -141,7 +137,8 @@ class ResourceClientTest(base.ClientTestBase):
"--limit 1"
) % (self.PROJECT_ID, self.RESOURCE_ID))
resource_limit = self.parser.listing(result)[0]
self.assertEqual(self.RESOURCE_ID2, resource_limit["id"])
self.assertEqual(self.RESOURCE_ID2,
resource_limit["original_resource_id"])
self.assertEqual(self.PROJECT_ID, resource_limit["project_id"])
self.assertEqual(resource2["started_at"], resource_limit["started_at"])
@ -180,7 +177,7 @@ class ResourceClientTest(base.ClientTestBase):
resource1 = self.details_multiple(result1)[0]
resource2 = self.details_multiple(result2)[0]
self.assertEqual(self.RESOURCE_ID, resource1['id'])
self.assertEqual(self.RESOURCE_ID2, resource2['id'])
self.assertEqual(self.RESOURCE_ID2, resource2['original_resource_id'])
result3 = self.gnocchi(
'resource batch delete ',
params=("'id in [%s, %s]' "

View File

@ -12,8 +12,6 @@
# License for the specific language governing permissions and limitations
# under the License.
import uuid
import pyparsing as pp
import six
from six.moves.urllib import parse as urllib_parse
@ -217,27 +215,6 @@ def build_pagination_options(details=False, history=False,
return "%s" % "&".join(options)
# uuid5 namespace for id transformation.
# NOTE(chdent): This UUID must stay the same, forever, across all
# of gnocchi to preserve its value as a URN namespace.
RESOURCE_ID_NAMESPACE = uuid.UUID('0a7a15ff-aa13-4ac2-897c-9bdf30ce175b')
def encode_resource_id(value):
try:
try:
return str(uuid.UUID(value))
except ValueError:
if len(value) <= 255:
if six.PY2:
value = value.encode('utf-8')
return str(uuid.uuid5(RESOURCE_ID_NAMESPACE, value))
raise ValueError(
'transformable resource id >255 max allowed characters')
except Exception as e:
raise ValueError(e)
def get_client(obj):
if hasattr(obj.app, 'client_manager'):
# NOTE(sileht): cliff objects loaded by OSC

View File

@ -64,7 +64,6 @@ class MetricManager(base.Manager):
self._ensure_metric_is_uuid(metric)
url = self.metric_url + metric
else:
resource_id = utils.encode_resource_id(resource_id)
url = (self.resource_url % resource_id) + metric
return self._get(url).json()
@ -93,7 +92,6 @@ class MetricManager(base.Manager):
raise TypeError("metric_name is required if resource_id is set")
del metric['resource_id']
resource_id = utils.encode_resource_id(resource_id)
metric = {metric_name: metric}
metric = self._post(
self.resource_url % resource_id,
@ -114,7 +112,6 @@ class MetricManager(base.Manager):
self._ensure_metric_is_uuid(metric)
url = self.metric_url + metric
else:
resource_id = utils.encode_resource_id(resource_id)
url = self.resource_url % resource_id + metric
self._delete(url)
@ -133,7 +130,6 @@ class MetricManager(base.Manager):
self._ensure_metric_is_uuid(metric)
url = self.metric_url + metric + "/measures"
else:
resource_id = utils.encode_resource_id(resource_id)
url = self.resource_url % resource_id + metric + "/measures"
return self._post(
url, headers={'Content-Type': "application/json"},
@ -205,7 +201,6 @@ class MetricManager(base.Manager):
self._ensure_metric_is_uuid(metric)
url = self.metric_url + metric + "/measures"
else:
resource_id = utils.encode_resource_id(resource_id)
url = self.resource_url % resource_id + metric + "/measures"
return self._get(url, params=params).json()

View File

@ -55,7 +55,6 @@ class ResourceManager(base.Manager):
:type history: bool
"""
history = "/history" if history else ""
resource_id = utils.encode_resource_id(resource_id)
url = self.url + "%s/%s%s" % (resource_type, resource_id, history)
return self._get(url).json()
@ -80,7 +79,6 @@ class ResourceManager(base.Manager):
"""
qs = utils.build_pagination_options(details, False, limit, marker,
sorts)
resource_id = utils.encode_resource_id(resource_id)
url = "%s%s/%s/history?%s" % (self.url, resource_type, resource_id, qs)
return self._get(url).json()
@ -107,8 +105,6 @@ class ResourceManager(base.Manager):
:param resource: Attribute of the resource
:type resource: dict
"""
resource_id = utils.encode_resource_id(resource_id)
return self._patch(
self.url + resource_type + "/" + resource_id,
headers={'Content-Type': "application/json"},
@ -120,7 +116,6 @@ class ResourceManager(base.Manager):
:param resource_id: ID of the resource
:type resource_id: str
"""
resource_id = utils.encode_resource_id(resource_id)
self._delete(self.url + "generic/" + resource_id)
def batch_delete(self, query, resource_type="generic"):