X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FAddSliceAttribute.py;h=ad324374821ad69fe7f357cb9766ce10f5e622c9;hb=c5dc8ffa107ed7facb930c419e3f561653aefcc1;hp=22e7a38a92e1e36f3768f6103c1e480836d5e2bc;hpb=067d815a444d454c6fb45c50e242353e65c0e4d6;p=plcapi.git diff --git a/PLC/Methods/AddSliceAttribute.py b/PLC/Methods/AddSliceAttribute.py index 22e7a38..ad32437 100644 --- a/PLC/Methods/AddSliceAttribute.py +++ b/PLC/Methods/AddSliceAttribute.py @@ -5,6 +5,7 @@ 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.NodeGroups import NodeGroup, NodeGroups from PLC.InitScripts import InitScript, InitScripts from PLC.Auth import Auth @@ -32,14 +33,17 @@ class AddSliceAttribute(Method): Mixed(SliceAttribute.fields['attribute_type_id'], SliceAttribute.fields['name']), Mixed(SliceAttribute.fields['value'], - InitScript.fields['initscript_id']), + InitScript.fields['name']), Mixed(Node.fields['node_id'], - Node.fields['hostname']) + Node.fields['hostname'], + None), + Mixed(NodeGroup.fields['nodegroup_id'], + NodeGroup.fields['name']) ] returns = Parameter(int, 'New slice_attribute_id (> 0) if successful') - def call(self, auth, slice_id_or_name, attribute_type_id_or_name, value, node_id_or_hostname = None): + def call(self, auth, slice_id_or_name, attribute_type_id_or_name, value, node_id_or_hostname = None, nodegroup_id_or_name = None): slices = Slices(self.api, [slice_id_or_name]) if not slices: raise PLCInvalidArgument, "No such slice" @@ -63,15 +67,15 @@ class AddSliceAttribute(Method): 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 attribute_type['name'] in ['initscript']: + initscripts = InitScripts(self.api, {'enabled': True, 'name': 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_type_id'] = attribute_type['attribute_type_id'] - slice_attribute['value'] = value + slice_attribute['value'] = unicode(value) # Sliver attribute if node is specified if node_id_or_hostname is not None: @@ -82,9 +86,27 @@ class AddSliceAttribute(Method): if node['node_id'] not in slice['node_ids']: raise PLCInvalidArgument, "Node not in the specified slice" - slice_attribute['node_id'] = node['node_id'] + # Sliver attribute shared accross nodes if nodegroup is sepcified + if nodegroup_id_or_name is not None: + nodegroups = NodeGroups(self.api, [nodegroup_id_or_name]) + if not nodegroups: + raise PLCInvalidArgument, "No such nodegroup" + nodegroup = nodegroups[0] + + slice_attribute['nodegroup_id'] = nodegroup['nodegroup_id'] + + # Check if slice attribute alreay exists + slice_attributes_check = SliceAttributes(self.api, {'slice_id': slice['slice_id'], 'name': attribute_type['name'], 'value': value}) + for slice_attribute_check in slice_attributes_check: + if 'node_id' in slice_attribute and slice_attribute['node_id'] == slice_attribute_check['node_id']: + raise PLCInvalidArgument, "Sliver attribute already exists" + if 'nodegroup_id' in slice_attribute and slice_attribute['nodegroup_id'] == slice_attribute_check['nodegroup_id']: + raise PLCInvalidArgument, "Slice attribute already exists for this nodegroup" + if node_id_or_hostname is None and nodegroup_id_or_name is None: + raise PLCInvalidArgument, "Slice attribute already exists" + slice_attribute.sync() self.event_objects = {'SliceAttribute': [slice_attribute['slice_attribute_id']]}