diff --git a/doc/source/cli/data/glance.csv b/doc/source/cli/data/glance.csv index 90f7aeb15f..349e90ea4e 100644 --- a/doc/source/cli/data/glance.csv +++ b/doc/source/cli/data/glance.csv @@ -32,7 +32,7 @@ md-namespace-resource-type-list,image metadef resource type list,List resource t md-namespace-show,image metadef namespace show,Describe a specific metadata definitions namespace. md-namespace-tags-delete,,Delete all metadata definitions tags inside a specific namespace. md-namespace-update,,Update an existing metadata definitions namespace. -md-object-create,,Create a new metadata definitions object inside a namespace. +md-object-create,image metadef object create,Create a new metadata definitions object inside a namespace. md-object-delete,,Delete a specific metadata definitions object inside a namespace. md-object-list,,List metadata definitions objects inside a specific namespace. md-object-property-show,,Describe a specific metadata definitions property inside an object. diff --git a/openstackclient/image/v2/metadef_objects.py b/openstackclient/image/v2/metadef_objects.py new file mode 100644 index 0000000000..7e83bdcb25 --- /dev/null +++ b/openstackclient/image/v2/metadef_objects.py @@ -0,0 +1,75 @@ +# Copyright 2012-2013 OpenStack Foundation +# +# 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. +# + +"""Image V2 Action Implementations""" + + +from osc_lib.command import command +from osc_lib import utils + +from openstackclient.i18n import _ + + +def _format_object(md_object): + fields_to_show = ( + 'created_at', + 'description', + 'name', + 'namespace_name', + 'properties', + 'required', + 'updated_at', + ) + + return ( + fields_to_show, + utils.get_item_properties( + md_object, + fields_to_show, + ), + ) + + +class CreateMetadefObjects(command.ShowOne): + _description = _("Create a metadef object") + + def get_parser(self, prog_name): + parser = super().get_parser(prog_name) + parser.add_argument( + "--namespace", + metavar="", + help=_("Metadef namespace to create the metadef object in (name)"), + ) + parser.add_argument( + "name", + metavar='', + help=_('New metadef object name'), + ) + return parser + + def take_action(self, parsed_args): + image_client = self.app.client_manager.image + + namespace = image_client.get_metadef_namespace( + parsed_args.namespace, + ) + data = image_client.create_metadef_object( + namespace=namespace.namespace, + name=parsed_args.name, + ) + + fields, value = _format_object(data) + + return fields, value diff --git a/openstackclient/tests/unit/image/v2/fakes.py b/openstackclient/tests/unit/image/v2/fakes.py index a63d4c525e..37aacb0480 100644 --- a/openstackclient/tests/unit/image/v2/fakes.py +++ b/openstackclient/tests/unit/image/v2/fakes.py @@ -20,6 +20,7 @@ from openstack.image.v2 import _proxy from openstack.image.v2 import image from openstack.image.v2 import member from openstack.image.v2 import metadef_namespace +from openstack.image.v2 import metadef_object from openstack.image.v2 import metadef_property from openstack.image.v2 import metadef_resource_type from openstack.image.v2 import service_info as _service_info @@ -314,3 +315,46 @@ def create_resource_types(attrs=None, count=2): metadef_resource_types.append(create_one_resource_type(attrs)) return metadef_resource_types + + +def create_one_metadef_object(attrs=None): + """Create a fake MetadefNamespace member. + + :param attrs: A dictionary with all attributes of metadef_namespace member + :type attrs: dict + :return: a list of MetadefNamespace objects + :rtype: list of `metadef_namespace.MetadefNamespace` + """ + attrs = attrs or {} + + metadef_objects_list = { + 'created_at': '2014-09-19T18:20:56Z', + 'description': 'The CPU limits with control parameters.', + 'name': 'CPU Limits', + 'properties': { + 'quota:cpu_period': { + 'description': 'The enforcement interval', + 'maximum': 1000000, + 'minimum': 1000, + 'title': 'Quota: CPU Period', + 'type': 'integer', + }, + 'quota:cpu_quota': { + 'description': 'The maximum allowed bandwidth', + 'title': 'Quota: CPU Quota', + 'type': 'integer', + }, + 'quota:cpu_shares': { + 'description': 'The proportional weighted', + 'title': 'Quota: CPU Shares', + 'type': 'integer', + }, + }, + 'required': [], + 'schema': '/v2/schemas/metadefs/object', + 'updated_at': '2014-09-19T18:20:56Z', + } + + # Overwrite default attributes if there are some attributes set + metadef_objects_list.update(attrs) + return metadef_object.MetadefObject(**metadef_objects_list) diff --git a/openstackclient/tests/unit/image/v2/test_metadef_objects.py b/openstackclient/tests/unit/image/v2/test_metadef_objects.py new file mode 100644 index 0000000000..b33256f16b --- /dev/null +++ b/openstackclient/tests/unit/image/v2/test_metadef_objects.py @@ -0,0 +1,62 @@ +# Copyright 2012-2013 OpenStack Foundation +# +# 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. + +from openstackclient.image.v2 import metadef_objects +from openstackclient.tests.unit.image.v2 import fakes + + +class TestMetadefObjectsCreate(fakes.TestImagev2): + _metadef_namespace = fakes.create_one_metadef_namespace() + _metadef_objects = fakes.create_one_metadef_object() + + expected_columns = ( + 'created_at', + 'description', + 'name', + 'namespace_name', + 'properties', + 'required', + 'updated_at', + ) + expected_data = ( + _metadef_objects.created_at, + _metadef_objects.description, + _metadef_objects.name, + _metadef_objects.namespace_name, + _metadef_objects.properties, + _metadef_objects.required, + _metadef_objects.updated_at, + ) + + def setUp(self): + super().setUp() + + self.image_client.create_metadef_object.return_value = ( + self._metadef_objects + ) + self.cmd = metadef_objects.CreateMetadefObjects(self.app, None) + + def test_namespace_create(self): + arglist = [ + '--namespace', + self._metadef_namespace.namespace, + self._metadef_objects.name, + ] + verifylist = [] + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + columns, data = self.cmd.take_action(parsed_args) + + self.assertEqual(self.expected_columns, columns) + self.assertEqual(self.expected_data, data) diff --git a/releasenotes/notes/add-metadef-object-create-3939ee1453585484.yaml b/releasenotes/notes/add-metadef-object-create-3939ee1453585484.yaml new file mode 100644 index 0000000000..250a1452a8 --- /dev/null +++ b/releasenotes/notes/add-metadef-object-create-3939ee1453585484.yaml @@ -0,0 +1,5 @@ +--- +features: + - | + Add ``image metadef object show`` command to create the + metadata definitions objects inside a specific namespace diff --git a/setup.cfg b/setup.cfg index 0a579a7967..a8c3e5e602 100644 --- a/setup.cfg +++ b/setup.cfg @@ -397,6 +397,8 @@ openstack.image.v2 = image_metadef_namespace_set = openstackclient.image.v2.metadef_namespaces:SetMetadefNameSpace image_metadef_namespace_show = openstackclient.image.v2.metadef_namespaces:ShowMetadefNameSpace + image_metadef_object_create = openstackclient.image.v2.metadef_objects:CreateMetadefObjects + image_metadef_property_create = openstackclient.image.v2.metadef_properties:CreateMetadefProperty image_metadef_property_list = openstackclient.image.v2.metadef_properties:ListMetadefProperties image_metadef_property_show = openstackclient.image.v2.metadef_properties:ShowMetadefProperty