X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FAddSliceAttribute.py;h=22e7a38a92e1e36f3768f6103c1e480836d5e2bc;hb=067d815a444d454c6fb45c50e242353e65c0e4d6;hp=b8d3a0cbcb4e251d7d3aef6475ebeb2f5026521d;hpb=dc507ccf50fba436a80b8cbf2da7a6353af8e10c;p=plcapi.git diff --git a/PLC/Methods/AddSliceAttribute.py b/PLC/Methods/AddSliceAttribute.py index b8d3a0c..22e7a38 100644 --- a/PLC/Methods/AddSliceAttribute.py +++ b/PLC/Methods/AddSliceAttribute.py @@ -1,11 +1,12 @@ from PLC.Faults import * from PLC.Method import Method from PLC.Parameter import Parameter, Mixed -from PLC.Attributes import Attribute, Attributes +from PLC.SliceAttributeTypes import SliceAttributeType, SliceAttributeTypes from PLC.Slices import Slice, Slices from PLC.Nodes import Node, Nodes from PLC.SliceAttributes import SliceAttribute, SliceAttributes -from PLC.Auth import PasswordAuth +from PLC.InitScripts import InitScript, InitScripts +from PLC.Auth import Auth class AddSliceAttribute(Method): """ @@ -25,28 +26,29 @@ class AddSliceAttribute(Method): roles = ['admin', 'pi', 'user'] accepts = [ - PasswordAuth(), + Auth(), Mixed(SliceAttribute.fields['slice_id'], SliceAttribute.fields['name']), - Mixed(SliceAttribute.fields['attribute_id'], + Mixed(SliceAttribute.fields['attribute_type_id'], SliceAttribute.fields['name']), - SliceAttribute.fields['value'], + Mixed(SliceAttribute.fields['value'], + InitScript.fields['initscript_id']), Mixed(Node.fields['node_id'], Node.fields['hostname']) ] returns = Parameter(int, 'New slice_attribute_id (> 0) if successful') - def call(self, auth, slice_id_or_name, attribute_id_or_name, value, node_id_or_hostname = None): - slices = Slices(self.api, [slice_id_or_name]).values() + def call(self, auth, slice_id_or_name, attribute_type_id_or_name, value, node_id_or_hostname = None): + slices = Slices(self.api, [slice_id_or_name]) if not slices: raise PLCInvalidArgument, "No such slice" slice = slices[0] - attributes = Attributes(self.api, [attribute_id_or_name]).values() - if not attributes: - raise PLCInvalidArgument, "No such attribute" - attribute = attributes[0] + attribute_types = SliceAttributeTypes(self.api, [attribute_type_id_or_name]) + if not attribute_types: + raise PLCInvalidArgument, "No such slice attribute type" + attribute_type = attribute_types[0] if 'admin' not in self.caller['roles']: if self.caller['person_id'] in slice['person_ids']: @@ -56,18 +58,24 @@ class AddSliceAttribute(Method): elif slice['site_id'] not in self.caller['site_ids']: raise PLCPermissionDenied, "Specified slice not associated with any of your sites" - if attribute['min_role_id'] is not None and \ - min(self.caller['role_ids']) > attribute['min_role_id']: - raise PLCPermissionDenied, "Not allowed to set the specified attribute" + if attribute_type['min_role_id'] is not None and \ + min(self.caller['role_ids']) > attribute_type['min_role_id']: + raise PLCPermissionDenied, "Not allowed to set the specified slice attribute" + + # if initscript is specified, validate value + if attribute_type['name'] in ['plc_initscript_id']: + initscripts = InitScripts(self.api, [value]) + if not initscripts: + raise PLCInvalidArgument, "No such plc initscript" slice_attribute = SliceAttribute(self.api) slice_attribute['slice_id'] = slice['slice_id'] - slice_attribute['attribute_id'] = attribute['attribute_id'] + slice_attribute['attribute_type_id'] = attribute_type['attribute_type_id'] slice_attribute['value'] = value # Sliver attribute if node is specified if node_id_or_hostname is not None: - nodes = Nodes(self.api, [node_id_or_hostname]).values() + nodes = Nodes(self.api, [node_id_or_hostname]) if not nodes: raise PLCInvalidArgument, "No such node" node = nodes[0] @@ -78,5 +86,6 @@ class AddSliceAttribute(Method): slice_attribute['node_id'] = node['node_id'] slice_attribute.sync() + self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]} return slice_attribute['slice_attribute_id']