From: Mark Huang Date: Tue, 3 Oct 2006 19:32:53 +0000 (+0000) Subject: slice attribute methods X-Git-Tag: pycurl-7_13_1~663 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=dc507ccf50fba436a80b8cbf2da7a6353af8e10c;p=plcapi.git slice attribute methods --- diff --git a/PLC/Methods/AddAttribute.py b/PLC/Methods/AddAttribute.py new file mode 100644 index 0000000..ca990cb --- /dev/null +++ b/PLC/Methods/AddAttribute.py @@ -0,0 +1,37 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Attributes import Attribute, Attributes +from PLC.Auth import PasswordAuth + +class AddAttribute(Method): + """ + Adds a new type of attribute. Any fields specified in optional_vals + are used, otherwise defaults are used. + + Returns the new attribute_id (> 0) if successful, faults otherwise. + """ + + roles = ['admin'] + + can_update = lambda (field, value): field in \ + ['description', 'min_role_id'] + update_fields = dict(filter(can_update, Attribute.fields.items())) + + accepts = [ + PasswordAuth(), + Attribute.fields['name'], + update_fields + ] + + returns = Parameter(int, 'New attribute_id (> 0) if successful') + + def call(self, auth, name, optional_vals = {}): + if filter(lambda field: field not in self.update_fields, optional_vals): + raise PLCInvalidArgument, "Invalid field specified" + + attribute = Attribute(self.api, optional_vals) + attribute['name'] = name + attribute.sync() + + return attribute['attribute_id'] diff --git a/PLC/Methods/AddSliceAttribute.py b/PLC/Methods/AddSliceAttribute.py new file mode 100644 index 0000000..b8d3a0c --- /dev/null +++ b/PLC/Methods/AddSliceAttribute.py @@ -0,0 +1,82 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Attributes import Attribute, Attributes +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Auth import PasswordAuth + +class AddSliceAttribute(Method): + """ + Sets the specified attribute of the slice (or sliver, if + node_id_or_hostname is specified) to the specified value. + + Attributes may require the caller to have a particular role in + order to be set or changed. Users may only set attributes of + slices or slivers of which they are members. PIs may only set + attributes of slices or slivers at their sites, or of which they + are members. Admins may set attributes of any slice or sliver. + + Returns the new slice_attribute_id (> 0) if successful, faults + otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + PasswordAuth(), + Mixed(SliceAttribute.fields['slice_id'], + SliceAttribute.fields['name']), + Mixed(SliceAttribute.fields['attribute_id'], + SliceAttribute.fields['name']), + SliceAttribute.fields['value'], + 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() + 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] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + 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" + + slice_attribute = SliceAttribute(self.api) + slice_attribute['slice_id'] = slice['slice_id'] + slice_attribute['attribute_id'] = attribute['attribute_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() + if not nodes: + raise PLCInvalidArgument, "No such node" + node = nodes[0] + + if node['node_id'] not in slice['node_ids']: + raise PLCInvalidArgument, "Node not in the specified slice" + + slice_attribute['node_id'] = node['node_id'] + + slice_attribute.sync() + + return slice_attribute['slice_attribute_id'] diff --git a/PLC/Methods/DeleteAttribute.py b/PLC/Methods/DeleteAttribute.py new file mode 100644 index 0000000..aafce7d --- /dev/null +++ b/PLC/Methods/DeleteAttribute.py @@ -0,0 +1,32 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Attributes import Attribute, Attributes +from PLC.Auth import PasswordAuth + +class DeleteAttribute(Method): + """ + Deletes the specified slice attribute. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + accepts = [ + PasswordAuth(), + Mixed(Attribute.fields['attribute_id'], + Attribute.fields['name']), + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, attribute_id_or_name): + attributes = Attributes(self.api, [attribute_id_or_name]).values() + if not attributes: + raise PLCInvalidArgument, "No such attribute" + attribute = attributes[0] + + attribute.delete() + + return 1 diff --git a/PLC/Methods/DeleteSliceAttribute.py b/PLC/Methods/DeleteSliceAttribute.py new file mode 100644 index 0000000..16d5104 --- /dev/null +++ b/PLC/Methods/DeleteSliceAttribute.py @@ -0,0 +1,61 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.Auth import PasswordAuth + +class DeleteSliceAttribute(Method): + """ + Deletes the specified slice or sliver attribute. + + Attributes may require the caller to have a particular role in + order to be deleted. Users may only delete attributes of + slices or slivers of which they are members. PIs may only delete + attributes of slices or slivers at their sites, or of which they + are members. Admins may delete attributes of any slice or sliver. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + PasswordAuth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + SliceAttribute.fields['slice_attribute_id'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, slice_attribute_id): + slices = Slices(self.api, [slice_id_or_name]).values() + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + slice_attributes = SliceAttributes(self.api, [slice_attribute_id]).values() + if not slice_attributes: + raise PLCInvalidArgument, "No such slice attribute" + slice_attribute = slice_attributes[0] + + if slice_attribute['slice_attribute_id'] not in slice['slice_attribute_ids']: + raise PLCInvalidArgument, "Invalid slice attribute ID" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + if slice_attribute['min_role_id'] is not None and \ + min(self.caller['role_ids']) > slice_attribute['min_role_id']: + raise PLCPermissionDenied, "Not allowed to delete the specified attribute" + + slice_attribute.delete() + + return 1 diff --git a/PLC/Methods/GetAttributes.py b/PLC/Methods/GetAttributes.py new file mode 100644 index 0000000..87b4b43 --- /dev/null +++ b/PLC/Methods/GetAttributes.py @@ -0,0 +1,27 @@ +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Auth import PasswordAuth +from PLC.Attributes import Attribute, Attributes + +class GetAttributes(Method): + """ + Return an array of structs containing details about all possible + slice and node attributes. If attribute_id_or_name_list is + specified, only the specified attributes will be queried. + """ + + roles = ['admin', 'pi', 'user', 'tech'] + + accepts = [ + PasswordAuth(), + [Mixed(Attribute.fields['attribute_id'], + Attribute.fields['name'])], + ] + + returns = [Attribute.fields] + + def call(self, auth, attribute_id_or_name_list = None): + # Get slice attribute information + attributes = Attributes(self.api, attribute_id_or_name_list).values() + + return attributes diff --git a/PLC/Methods/GetSliceAttributes.py b/PLC/Methods/GetSliceAttributes.py new file mode 100644 index 0000000..a3335c0 --- /dev/null +++ b/PLC/Methods/GetSliceAttributes.py @@ -0,0 +1,56 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Slices import Slice, Slices +from PLC.Nodes import Node, Nodes +from PLC.Auth import PasswordAuth + +class GetSliceAttributes(Method): + """ + Get an array of structs containing the values of slice and sliver + attributes. An attribute is a sliver attribute if the node_id + field is set. If slice_attribute_id_list is specified, only the + specified attributes will be queried, if set. + + Users may only query attributes of slices or slivers of which they + are members. PIs may only query attributes of slices or slivers at + their sites, or of which they are members. Admins may query + attributes of any slice or sliver. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + PasswordAuth(), + Mixed(Slice.fields['slice_id'], + Slice.fields['name']), + [SliceAttribute.fields['slice_attribute_id']], + ] + + returns = [SliceAttribute.fields] + + def call(self, auth, slice_id_or_name, slice_attribute_id_list = None): + slices = Slices(self.api, [slice_id_or_name]).values() + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + if slice_attribute_id_list is None: + slice_attribute_id_list = slice['slice_attribute_ids'] + else: + if set(slice_attribute_id_list).intersection(slice['slice_attribute_ids']) != \ + set(slice_attribute_id_list): + raise PLCInvalidArgument, "Invalid slice attribute ID(s)" + + slice_attributes = SliceAttributes(self.api, slice_attribute_id_list).values() + + return slice_attributes diff --git a/PLC/Methods/UpdateAttribute.py b/PLC/Methods/UpdateAttribute.py new file mode 100644 index 0000000..cffc9da --- /dev/null +++ b/PLC/Methods/UpdateAttribute.py @@ -0,0 +1,43 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.Attributes import Attribute, Attributes +from PLC.Auth import PasswordAuth + +class UpdateAttribute(Method): + """ + Updates the parameters of an existing attribute with the values in + update_fields. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin'] + + can_update = lambda (field, value): field in \ + ['description', 'min_role_id'] + update_fields = dict(filter(can_update, Attribute.fields.items())) + + accepts = [ + PasswordAuth(), + Mixed(Attribute.fields['attribute_id'], + Attribute.fields['name']), + update_fields + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, attribute_id_or_name, update_fields): + if filter(lambda field: field not in self.update_fields, update_fields): + raise PLCInvalidArgument, "Invalid field specified" + + attributes = Attributes(self.api, [attribute_id_or_name]).values() + if not attributes: + raise PLCInvalidArgument, "No such attribute" + attribute = attributes[0] + + attribute.update(update_fields) + + attribute.sync() + + return 1 diff --git a/PLC/Methods/UpdateSliceAttribute.py b/PLC/Methods/UpdateSliceAttribute.py new file mode 100644 index 0000000..2efd280 --- /dev/null +++ b/PLC/Methods/UpdateSliceAttribute.py @@ -0,0 +1,61 @@ +from PLC.Faults import * +from PLC.Method import Method +from PLC.Parameter import Parameter, Mixed +from PLC.SliceAttributes import SliceAttribute, SliceAttributes +from PLC.Slices import Slice, Slices +from PLC.Auth import PasswordAuth + +class UpdateSliceAttribute(Method): + """ + Updates the value of an existing slice or sliver attribute. + + Users may only update attributes of slices or slivers of which + they are members. PIs may only update attributes of slices or + slivers at their sites, or of which they are members. Admins may + update attributes of any slice or sliver. + + Returns 1 if successful, faults otherwise. + """ + + roles = ['admin', 'pi', 'user'] + + accepts = [ + PasswordAuth(), + Mixed(SliceAttribute.fields['slice_id'], + SliceAttribute.fields['name']), + SliceAttribute.fields['slice_attribute_id'], + SliceAttribute.fields['value'] + ] + + returns = Parameter(int, '1 if successful') + + def call(self, auth, slice_id_or_name, slice_attribute_id, value): + slices = Slices(self.api, [slice_id_or_name]).values() + if not slices: + raise PLCInvalidArgument, "No such slice" + slice = slices[0] + + slice_attributes = SliceAttributes(self.api, [slice_attribute_id]).values() + if not slice_attributes: + raise PLCInvalidArgument, "No such slice attribute" + slice_attribute = slice_attributes[0] + + if slice_attribute['slice_attribute_id'] not in slice['slice_attribute_ids']: + raise PLCInvalidArgument, "Invalid slice attribute ID" + + if 'admin' not in self.caller['roles']: + if self.caller['person_id'] in slice['person_ids']: + pass + elif 'pi' not in self.caller['roles']: + raise PLCPermissionDenied, "Not a member of the specified slice" + elif slice['site_id'] not in self.caller['site_ids']: + raise PLCPermissionDenied, "Specified slice not associated with any of your sites" + + if slice_attribute['min_role_id'] is not None and \ + min(self.caller['role_ids']) > slice_attribute['min_role_id']: + raise PLCPermissionDenied, "Not allowed to update the specified attribute" + + slice_attribute['value'] = value + slice_attribute.sync() + + return 1