From 202439f4096336f2b7402411c8b33a401e87af74 Mon Sep 17 00:00:00 2001 From: "Mark J. Washenberger" Date: Thu, 14 Jun 2012 16:45:24 -0400 Subject: [PATCH] Add link descriptor objects to schemas Part of blueprint api-v2-links Change-Id: I1e03b38c51931a380c197def88501c4dd483273c --- glance/schema.py | 34 ++++++++++++++++++-- glance/tests/unit/test_schema.py | 54 ++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 2 deletions(-) diff --git a/glance/schema.py b/glance/schema.py index 5b2ef096..57b31d97 100644 --- a/glance/schema.py +++ b/glance/schema.py @@ -20,11 +20,12 @@ from glance.common import exception class Schema(object): - def __init__(self, name, properties=None): + def __init__(self, name, properties=None, links=None): self.name = name if properties is None: properties = {} self.properties = properties + self.links = links def validate(self, obj): try: @@ -55,11 +56,14 @@ class Schema(object): self.properties.update(properties) def raw(self): - return { + raw = { 'name': self.name, 'properties': self.properties, 'additionalProperties': False, } + if self.links: + raw['links'] = self.links + return raw class PermissiveSchema(Schema): @@ -70,3 +74,29 @@ class PermissiveSchema(Schema): raw = super(PermissiveSchema, self).raw() raw['additionalProperties'] = {'type': 'string'} return raw + + +class CollectionSchema(object): + + def __init__(self, name, item_schema): + self.name = name + self.item_schema = item_schema + + def raw(self): + return { + 'name': self.name, + 'properties': { + self.name: { + 'type': 'array', + 'items': self.item_schema.raw(), + }, + 'first': {'type': 'string'}, + 'next': {'type': 'string'}, + 'schema': {'type': 'string'}, + }, + 'links': [ + {'rel': 'first', 'href': '{first}'}, + {'rel': 'next', 'href': '{next}'}, + {'rel': 'describedby', 'href': '{schema}'}, + ], + } diff --git a/glance/tests/unit/test_schema.py b/glance/tests/unit/test_schema.py index 39bd1009..e83c4635 100644 --- a/glance/tests/unit/test_schema.py +++ b/glance/tests/unit/test_schema.py @@ -76,6 +76,34 @@ class TestBasicSchema(test_utils.BaseTestCase): self.assertEqual(self.schema.raw(), expected) +class TestBasicSchemaLinks(test_utils.BaseTestCase): + + def setUp(self): + super(TestBasicSchemaLinks, self).setUp() + properties = { + 'ham': {'type': 'string'}, + 'eggs': {'type': 'string'}, + } + links = [ + {'rel': 'up', 'href': '/menu'}, + ] + self.schema = glance.schema.Schema('basic', properties, links) + + def test_raw_json_schema(self): + expected = { + 'name': 'basic', + 'properties': { + 'ham': {'type': 'string'}, + 'eggs': {'type': 'string'}, + }, + 'links': [ + {'rel': 'up', 'href': '/menu'}, + ], + 'additionalProperties': False, + } + self.assertEqual(self.schema.raw(), expected) + + class TestPermissiveSchema(test_utils.BaseTestCase): def setUp(self): @@ -109,3 +137,29 @@ class TestPermissiveSchema(test_utils.BaseTestCase): 'additionalProperties': {'type': 'string'}, } self.assertEqual(self.schema.raw(), expected) + + +class TestCollectionSchema(test_utils.BaseTestCase): + + def test_raw_json_schema(self): + item_properties = {'cheese': {'type': 'string'}} + item_schema = glance.schema.Schema('mouse', item_properties) + collection_schema = glance.schema.CollectionSchema('mice', item_schema) + expected = { + 'name': 'mice', + 'properties': { + 'mice': { + 'type': 'array', + 'items': item_schema.raw(), + }, + 'first': {'type': 'string'}, + 'next': {'type': 'string'}, + 'schema': {'type': 'string'}, + }, + 'links': [ + {'rel': 'first', 'href': '{first}'}, + {'rel': 'next', 'href': '{next}'}, + {'rel': 'describedby', 'href': '{schema}'}, + ], + } + self.assertEqual(collection_schema.raw(), expected)