From bb194c3e8e8676210d24a4b310fff49669541a60 Mon Sep 17 00:00:00 2001 From: Enol Fernandez Date: Mon, 16 Jan 2017 18:01:52 +0000 Subject: [PATCH] Add categories to resource links Text rendering of OCCI includes the category of the link associated to a resource. This helps clients to select the links based on their kinds. Change-Id: Ibd803cb26566e40b5fc589cdea6d111eaec36e03 Closes-Bug: #1656844 --- ooi/occi/rendering/headers.py | 4 ++++ ooi/tests/unit/occi/renderings/base.py | 9 +++++++++ ooi/tests/unit/occi/renderings/test_header.py | 12 +++++++++--- ooi/tests/unit/occi/renderings/test_json.py | 2 ++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/ooi/occi/rendering/headers.py b/ooi/occi/rendering/headers.py index f86efb4..8d7c522 100644 --- a/ooi/occi/rendering/headers.py +++ b/ooi/occi/rendering/headers.py @@ -172,6 +172,10 @@ class LinkRenderer(EntityRenderer): "self": url} l = '<%(location)s>; rel="%(scheme)s%(term)s"; self="%(self)s"' % d ret.append(l) + categories = [self.obj.kind.type_id] + for m in self.obj.mixins: + categories.append(m.type_id) + ret.append('category="%s"' % ' '.join(categories)) for a in self.obj.attributes: if self.obj.attributes[a].value is None: continue diff --git a/ooi/tests/unit/occi/renderings/base.py b/ooi/tests/unit/occi/renderings/base.py index 498c9d0..4e4f98a 100644 --- a/ooi/tests/unit/occi/renderings/base.py +++ b/ooi/tests/unit/occi/renderings/base.py @@ -151,3 +151,12 @@ class BaseRendererTest(ooi.tests.base.TestCase): r = self.renderer.get_renderer(r1) observed = r.render() self.assertResourceLink(r1, r2, observed) + + def test_resource_link_with_mixins(self): + r1 = resource.Resource(None, []) + r2 = resource.Resource(None, []) + r1.link(r2, [mixin.Mixin("s1", "term", "title"), + mixin.Mixin("s2", "term", "title")]) + r = self.renderer.get_renderer(r1) + observed = r.render() + self.assertResourceLink(r1, r2, observed) diff --git a/ooi/tests/unit/occi/renderings/test_header.py b/ooi/tests/unit/occi/renderings/test_header.py index 8a0b8f1..a9ecc30 100644 --- a/ooi/tests/unit/occi/renderings/test_header.py +++ b/ooi/tests/unit/occi/renderings/test_header.py @@ -139,12 +139,18 @@ class TestOCCIHeaderRendering(base.BaseRendererTest): self.assertEqual(rel, parsed[1]) self_ = 'self="%s"' % link.location self.assertEqual(self_, parsed[2]) + expected_cats = [link.kind.type_id] + expected_cats.extend([m.type_id for m in link.mixins]) + category_field = parsed[3].split('=') + self.assertEqual('category', category_field[0]) + link_cats = category_field[1][1:-1].split() + self.assertItemsEqual(expected_cats, link_cats) source = 'occi.core.source="%s"' % obj1.location - self.assertIn(source, parsed[3:]) + self.assertIn(source, parsed[4:]) target = 'occi.core.target="%s"' % obj2.location - self.assertIn(target, parsed[3:]) + self.assertIn(target, parsed[4:]) id = 'occi.core.id="%s"' % link.id - self.assertIn(id, parsed[3:]) + self.assertIn(id, parsed[4:]) break else: self.fail("One link was expected") diff --git a/ooi/tests/unit/occi/renderings/test_json.py b/ooi/tests/unit/occi/renderings/test_json.py index 03340c8..1607f5a 100644 --- a/ooi/tests/unit/occi/renderings/test_json.py +++ b/ooi/tests/unit/occi/renderings/test_json.py @@ -89,6 +89,8 @@ class TestOCCIJsonRendering(base.BaseRendererTest): }, "title": obj.title, } + if obj.mixins: + link["mixins"] = [m.type_id for m in obj.mixins] self.assertEqual(link, json.loads(observed)) def assertMixedCollection(self, kind, resource, observed):