Support for Metadata Definition Catalog for Tags
This set provides API and shell commands support for: - CRUD on metadef_tags; Change-Id: I09bdf43edee6fff615d223f1a6df7c15a1e40565 Implements: blueprint metadefs-tags-cli DocImpact
This commit is contained in:
@@ -0,0 +1,183 @@
|
||||
# Copyright 2015 OpenStack Foundation.
|
||||
# All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
||||
# not use this file except in compliance with the License. You may obtain
|
||||
# a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
import testtools
|
||||
|
||||
from glanceclient.tests import utils
|
||||
from glanceclient.v2 import metadefs
|
||||
|
||||
NAMESPACE1 = 'Namespace1'
|
||||
TAG1 = 'Tag1'
|
||||
TAG2 = 'Tag2'
|
||||
TAGNEW1 = 'TagNew1'
|
||||
TAGNEW2 = 'TagNew2'
|
||||
TAGNEW3 = 'TagNew3'
|
||||
|
||||
|
||||
def _get_tag_fixture(tag_name, **kwargs):
|
||||
tag = {
|
||||
"name": tag_name
|
||||
}
|
||||
tag.update(kwargs)
|
||||
return tag
|
||||
|
||||
|
||||
data_fixtures = {
|
||||
"/v2/metadefs/namespaces/%s/tags" % NAMESPACE1: {
|
||||
"GET": (
|
||||
{},
|
||||
{
|
||||
"tags": [
|
||||
_get_tag_fixture(TAG1),
|
||||
_get_tag_fixture(TAG2)
|
||||
]
|
||||
}
|
||||
),
|
||||
"POST": (
|
||||
{},
|
||||
{
|
||||
'tags': [
|
||||
_get_tag_fixture(TAGNEW2),
|
||||
_get_tag_fixture(TAGNEW3)
|
||||
]
|
||||
}
|
||||
),
|
||||
"DELETE": (
|
||||
{},
|
||||
{}
|
||||
)
|
||||
},
|
||||
"/v2/metadefs/namespaces/%s/tags/%s" % (NAMESPACE1, TAGNEW1): {
|
||||
"POST": (
|
||||
{},
|
||||
_get_tag_fixture(TAGNEW1)
|
||||
)
|
||||
},
|
||||
"/v2/metadefs/namespaces/%s/tags/%s" % (NAMESPACE1, TAG1): {
|
||||
"GET": (
|
||||
{},
|
||||
_get_tag_fixture(TAG1)
|
||||
),
|
||||
"PUT": (
|
||||
{},
|
||||
_get_tag_fixture(TAG2)
|
||||
),
|
||||
"DELETE": (
|
||||
{},
|
||||
{}
|
||||
)
|
||||
},
|
||||
"/v2/metadefs/namespaces/%s/tags/%s" % (NAMESPACE1, TAG2): {
|
||||
"GET": (
|
||||
{},
|
||||
_get_tag_fixture(TAG2)
|
||||
),
|
||||
},
|
||||
"/v2/metadefs/namespaces/%s/tags/%s" % (NAMESPACE1, TAGNEW2): {
|
||||
"GET": (
|
||||
{},
|
||||
_get_tag_fixture(TAGNEW2)
|
||||
),
|
||||
},
|
||||
"/v2/metadefs/namespaces/%s/tags/%s" % (NAMESPACE1, TAGNEW3): {
|
||||
"GET": (
|
||||
{},
|
||||
_get_tag_fixture(TAGNEW3)
|
||||
),
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
schema_fixtures = {
|
||||
"metadefs/tag": {
|
||||
"GET": (
|
||||
{},
|
||||
{
|
||||
"additionalProperties": True,
|
||||
"name": {
|
||||
"type": "string"
|
||||
},
|
||||
"created_at": {
|
||||
"type": "string",
|
||||
"description": ("Date and time of tag creation"
|
||||
" (READ-ONLY)"),
|
||||
"format": "date-time"
|
||||
},
|
||||
"updated_at": {
|
||||
"type": "string",
|
||||
"description": ("Date and time of the last tag"
|
||||
" modification (READ-ONLY)"),
|
||||
"format": "date-time"
|
||||
},
|
||||
'properties': {}
|
||||
}
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class TestTagController(testtools.TestCase):
|
||||
def setUp(self):
|
||||
super(TestTagController, self).setUp()
|
||||
self.api = utils.FakeAPI(data_fixtures)
|
||||
self.schema_api = utils.FakeSchemaAPI(schema_fixtures)
|
||||
self.controller = metadefs.TagController(self.api, self.schema_api)
|
||||
|
||||
def test_list_tag(self):
|
||||
tags = list(self.controller.list(NAMESPACE1))
|
||||
|
||||
actual = [tag.name for tag in tags]
|
||||
self.assertEqual([TAG1, TAG2], actual)
|
||||
|
||||
def test_get_tag(self):
|
||||
tag = self.controller.get(NAMESPACE1, TAG1)
|
||||
self.assertEqual(TAG1, tag.name)
|
||||
|
||||
def test_create_tag(self):
|
||||
tag = self.controller.create(NAMESPACE1, TAGNEW1)
|
||||
self.assertEqual(TAGNEW1, tag.name)
|
||||
|
||||
def test_create_multiple_tags(self):
|
||||
properties = {
|
||||
'tags': [TAGNEW2, TAGNEW3]
|
||||
}
|
||||
tags = self.controller.create_multiple(NAMESPACE1, **properties)
|
||||
actual = [tag.name for tag in tags]
|
||||
self.assertEqual([TAGNEW2, TAGNEW3], actual)
|
||||
|
||||
def test_update_tag(self):
|
||||
properties = {
|
||||
'name': TAG2
|
||||
}
|
||||
tag = self.controller.update(NAMESPACE1, TAG1, **properties)
|
||||
self.assertEqual(TAG2, tag.name)
|
||||
|
||||
def test_delete_tag(self):
|
||||
self.controller.delete(NAMESPACE1, TAG1)
|
||||
expect = [
|
||||
('DELETE',
|
||||
'/v2/metadefs/namespaces/%s/tags/%s' % (NAMESPACE1, TAG1),
|
||||
{},
|
||||
None)]
|
||||
self.assertEqual(expect, self.api.calls)
|
||||
|
||||
def test_delete_all_tags(self):
|
||||
self.controller.delete_all(NAMESPACE1)
|
||||
expect = [
|
||||
('DELETE',
|
||||
'/v2/metadefs/namespaces/%s/tags' % NAMESPACE1,
|
||||
{},
|
||||
None)]
|
||||
self.assertEqual(expect, self.api.calls)
|
||||
@@ -1096,3 +1096,107 @@ class ShellV2Test(testtools.TestCase):
|
||||
['name', 'description'],
|
||||
field_settings={
|
||||
'description': {'align': 'l', 'max_width': 50}})
|
||||
|
||||
def test_do_md_tag_create(self):
|
||||
args = self._make_args({'namespace': 'MyNamespace',
|
||||
'name': 'MyTag'})
|
||||
with mock.patch.object(self.gc.metadefs_tag,
|
||||
'create') as mocked_create:
|
||||
expect_tag = {}
|
||||
expect_tag['namespace'] = 'MyNamespace'
|
||||
expect_tag['name'] = 'MyTag'
|
||||
|
||||
mocked_create.return_value = expect_tag
|
||||
|
||||
test_shell.do_md_tag_create(self.gc, args)
|
||||
|
||||
mocked_create.assert_called_once_with('MyNamespace', 'MyTag')
|
||||
utils.print_dict.assert_called_once_with(expect_tag)
|
||||
|
||||
def test_do_md_tag_update(self):
|
||||
args = self._make_args({'namespace': 'MyNamespace',
|
||||
'tag': 'MyTag',
|
||||
'name': 'NewTag'})
|
||||
with mock.patch.object(self.gc.metadefs_tag,
|
||||
'update') as mocked_update:
|
||||
expect_tag = {}
|
||||
expect_tag['namespace'] = 'MyNamespace'
|
||||
expect_tag['name'] = 'NewTag'
|
||||
|
||||
mocked_update.return_value = expect_tag
|
||||
|
||||
test_shell.do_md_tag_update(self.gc, args)
|
||||
|
||||
mocked_update.assert_called_once_with('MyNamespace', 'MyTag',
|
||||
name='NewTag')
|
||||
utils.print_dict.assert_called_once_with(expect_tag)
|
||||
|
||||
def test_do_md_tag_show(self):
|
||||
args = self._make_args({'namespace': 'MyNamespace',
|
||||
'tag': 'MyTag',
|
||||
'sort_dir': 'desc'})
|
||||
with mock.patch.object(self.gc.metadefs_tag, 'get') as mocked_get:
|
||||
expect_tag = {}
|
||||
expect_tag['namespace'] = 'MyNamespace'
|
||||
expect_tag['tag'] = 'MyTag'
|
||||
|
||||
mocked_get.return_value = expect_tag
|
||||
|
||||
test_shell.do_md_tag_show(self.gc, args)
|
||||
|
||||
mocked_get.assert_called_once_with('MyNamespace', 'MyTag')
|
||||
utils.print_dict.assert_called_once_with(expect_tag)
|
||||
|
||||
def test_do_md_tag_delete(self):
|
||||
args = self._make_args({'namespace': 'MyNamespace',
|
||||
'tag': 'MyTag'})
|
||||
with mock.patch.object(self.gc.metadefs_tag,
|
||||
'delete') as mocked_delete:
|
||||
test_shell.do_md_tag_delete(self.gc, args)
|
||||
|
||||
mocked_delete.assert_called_once_with('MyNamespace', 'MyTag')
|
||||
|
||||
def test_do_md_namespace_tags_delete(self):
|
||||
args = self._make_args({'namespace': 'MyNamespace'})
|
||||
with mock.patch.object(self.gc.metadefs_tag,
|
||||
'delete_all') as mocked_delete_all:
|
||||
test_shell.do_md_namespace_tags_delete(self.gc, args)
|
||||
|
||||
mocked_delete_all.assert_called_once_with('MyNamespace')
|
||||
|
||||
def test_do_md_tag_list(self):
|
||||
args = self._make_args({'namespace': 'MyNamespace'})
|
||||
with mock.patch.object(self.gc.metadefs_tag, 'list') as mocked_list:
|
||||
expect_tags = [{'namespace': 'MyNamespace',
|
||||
'tag': 'MyTag'}]
|
||||
|
||||
mocked_list.return_value = expect_tags
|
||||
|
||||
test_shell.do_md_tag_list(self.gc, args)
|
||||
|
||||
mocked_list.assert_called_once_with('MyNamespace')
|
||||
utils.print_list.assert_called_once_with(
|
||||
expect_tags,
|
||||
['name'],
|
||||
field_settings={
|
||||
'description': {'align': 'l', 'max_width': 50}})
|
||||
|
||||
def test_do_md_tag_create_multiple(self):
|
||||
args = self._make_args({'namespace': 'MyNamespace',
|
||||
'delim': ',',
|
||||
'names': 'MyTag1, MyTag2'})
|
||||
with mock.patch.object(
|
||||
self.gc.metadefs_tag, 'create_multiple') as mocked_create_tags:
|
||||
expect_tags = [{'tags': [{'name': 'MyTag1'}, {'name': 'MyTag2'}]}]
|
||||
|
||||
mocked_create_tags.return_value = expect_tags
|
||||
|
||||
test_shell.do_md_tag_create_multiple(self.gc, args)
|
||||
|
||||
mocked_create_tags.assert_called_once_with(
|
||||
'MyNamespace', tags=['MyTag1', 'MyTag2'])
|
||||
utils.print_list.assert_called_once_with(
|
||||
expect_tags,
|
||||
['name'],
|
||||
field_settings={
|
||||
'description': {'align': 'l', 'max_width': 50}})
|
||||
|
||||
Reference in New Issue
Block a user