X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FAddNode.py;h=0ee13f5a3f2cb64a60ddf9974ee0967a39098dce;hb=bd0cbf4f7f2e4cf7ceda500bfa6f98c0a700018b;hp=b702b53a896c060ca1a2c54b337a25da8b3629fc;hpb=1f8c38dd1357c93e4be8d94456b7274a591d2db4;p=plcapi.git diff --git a/PLC/Methods/AddNode.py b/PLC/Methods/AddNode.py index b702b53..0ee13f5 100644 --- a/PLC/Methods/AddNode.py +++ b/PLC/Methods/AddNode.py @@ -1,13 +1,18 @@ from PLC.Faults import * +from PLC.Auth import Auth from PLC.Method import Method from PLC.Parameter import Parameter, Mixed -from PLC.Nodes import Node, Nodes -from PLC.NodeGroups import NodeGroup, NodeGroups +from PLC.Table import Row +from PLC.Namespace import hostname_to_hrn +from PLC.Peers import Peers from PLC.Sites import Site, Sites -from PLC.Auth import Auth +from PLC.Nodes import Node, Nodes +from PLC.TagTypes import TagTypes +from PLC.NodeTags import NodeTags, NodeTag +from PLC.Methods.AddNodeTag import AddNodeTag +from PLC.Methods.UpdateNodeTag import UpdateNodeTag -can_update = lambda (field, value): field in \ - ['hostname', 'boot_state', 'model', 'version'] +can_update = ['hostname', 'node_type', 'boot_state', 'model', 'version'] class AddNode(Method): """ @@ -22,30 +27,33 @@ class AddNode(Method): roles = ['admin', 'pi', 'tech'] - node_fields = dict(filter(can_update, Node.fields.items())) + accepted_fields = Row.accepted_fields(can_update,Node.fields) + accepted_fields.update(Node.tags) accepts = [ Auth(), Mixed(Site.fields['site_id'], Site.fields['login_base']), - node_fields + accepted_fields ] returns = Parameter(int, 'New node_id (> 0) if successful') - event_type = 'Add' - object_type = 'Node' - object_ids = [] - def call(self, auth, site_id_or_login_base, node_fields): - node_fields = dict(filter(can_update, node_fields.items())) + + [native,tags,rejected]=Row.split_fields(node_fields,[Node.fields,Node.tags]) + + # type checking + native = Row.check_fields(native, self.accepted_fields) + if rejected: + raise PLCInvalidArgument, "Cannot add Node with column(s) %r"%rejected # Get site information sites = Sites(self.api, [site_id_or_login_base]) if not sites: raise PLCInvalidArgument, "No such site" - site = sites.values()[0] + site = sites[0] # Authenticated function assert self.caller is not None @@ -59,10 +67,36 @@ class AddNode(Method): else: assert self.caller['person_id'] in site['person_ids'] - node = Node(self.api, node_fields) + node = Node(self.api, native) node['site_id'] = site['site_id'] node.sync() - self.object_ids = [site['site_id'], node['node_id']] + # since hostname was specified lets add the 'hrn' node tag + root_auth = self.api.config.PLC_HRN_ROOT + login_base = site['login_base'] + tags['hrn'] = hostname_to_hrn(root_auth, login_base, node['hostname']) + + for (tagname,value) in tags.iteritems(): + # the tagtype instance is assumed to exist, just check that + tag_types = TagTypes(self.api,{'tagname':tagname}) + if not tag_types: + raise PLCInvalidArgument,"No such TagType %s"%tagname + tag_type = tag_types[0] + node_tags=NodeTags(self.api,{'tagname':tagname,'node_id':node['node_id']}) + if not node_tags: + node_tag = NodeTag(self.api) + node_tag['node_id'] = node['node_id'] + node_tag['tag_type_id'] = tag_type['tag_type_id'] + node_tag['tagname'] = tagname + node_tag['value'] = value + node_tag.sync() + else: + node_tag = node_tags[0] + node_tag['value'] = value + node_tag.sync() + + self.event_objects = {'Site': [site['site_id']], + 'Node': [node['node_id']]} + self.message = "Node %d=%s created" % (node['node_id'],node['hostname']) return node['node_id']