From e86df238a4320cb113f217546b9ff97b12a9e5d4 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 23 Nov 2015 19:34:14 +0100 Subject: [PATCH] check if code already exists during the creation of the node via rest --- iotronic/api/controllers/v1/node.py | 9 +++++---- iotronic/common/exception.py | 3 ++- iotronic/objects/node.py | 11 +++++++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/iotronic/api/controllers/v1/node.py b/iotronic/api/controllers/v1/node.py index ab18264..75db818 100644 --- a/iotronic/api/controllers/v1/node.py +++ b/iotronic/api/controllers/v1/node.py @@ -216,15 +216,16 @@ class NodesController(rest.RestController): raise exception.MissingParameterValue( _("Location is not specified.")) - """ if Node.name: - if not api_utils.allow_node_logical_names(): - raise exception.NotAcceptable() if not api_utils.is_valid_node_name(Node.name): msg = _("Cannot create node with invalid name %(name)s") raise wsme.exc.ClientSideError(msg % {'name': Node.name}, status_code=400) - """ + + try: + objects.Node.get_by_name(pecan.request.context, Node.name) + except: + raise exception.DuplicateCode(code=Node.code) Node.status = 'DISCONNECTED' Node.uuid = uuidutils.generate_uuid() diff --git a/iotronic/common/exception.py b/iotronic/common/exception.py index e4f57b8..1b76e26 100644 --- a/iotronic/common/exception.py +++ b/iotronic/common/exception.py @@ -159,10 +159,11 @@ class InstanceAssociated(Conflict): message = _("Instance %(instance_uuid)s is already associated with a node," " it cannot be associated with this other node %(node)s") - class DuplicateName(Conflict): message = _("A node with name %(name)s already exists.") +class DuplicateCode(Conflict): + message = _("A node with code %(code)s already exists.") class InvalidUUID(Invalid): message = _("Expected a uuid but received %(uuid)s.") diff --git a/iotronic/objects/node.py b/iotronic/objects/node.py index c410ac7..7417ba4 100644 --- a/iotronic/objects/node.py +++ b/iotronic/objects/node.py @@ -97,6 +97,17 @@ class Node(base.IotronicObject): node = Node._from_db_object(cls(context), db_node) return node + @base.remotable_classmethod + def get_by_name(cls, context, name): + """Find a node based on name and return a Node object. + + :param name: the logical name of a node. + :returns: a :class:`Node` object. + """ + db_node = cls.dbapi.get_node_by_name(name) + node = Node._from_db_object(cls(context), db_node) + return node + @base.remotable_classmethod def get_by_instance_uuid(cls, context, instance_uuid): """Find a node based on the instance uuid and return a Node object.