From 7764fbf4b173842797ca6ab1ff02614aacece152 Mon Sep 17 00:00:00 2001 From: Sandrine Avakian Date: Fri, 15 Nov 2013 14:59:33 +0100 Subject: [PATCH] Adding file to be completed by cortexlab testbed calls to get the nodes, leases and slices. --- sfa/cortexlab/cortexlabnodes.py | 137 ++++++++++++++++++++++++++++++++ 1 file changed, 137 insertions(+) create mode 100644 sfa/cortexlab/cortexlabnodes.py diff --git a/sfa/cortexlab/cortexlabnodes.py b/sfa/cortexlab/cortexlabnodes.py new file mode 100644 index 00000000..15ef6e62 --- /dev/null +++ b/sfa/cortexlab/cortexlabnodes.py @@ -0,0 +1,137 @@ +""" +File used to handle all the nodes querying: +- get nodes list along with their properties +""" + +class CortexlabQueryNodes: + def __init__(self): + + pass + + def get_all_nodes(self, node_filter_dict=None, return_fields_list=None): + """ + Get all the nodes and their properties. Called by GetNodes. + Filtering on nodes properties can be done here or in GetNodes. + Search for specific nodes if some filters are + specified.Returns all the nodes properties if no return_fields_list + given. + TODO: Define which properties have to be listed here. Useful ones: + node architecture, radio type, position (x,y,z) + + :param node_filter_dict: dictionary of lists with node properties. For + instance, if you want to look for a specific node with its hrn, + the node_filter_dict should be {'hrn': [hrn_of_the_node]} + :type node_filter_dict: dict + :param return_fields_list: list of specific fields the user wants to be + returned. + :type return_fields_list: list + :returns: list of dictionaries with node properties + :rtype: list + """ + node_dict_list = None + # Get the nodes here, eventually filter here + # See iotlabapi.py GetNodes to get the filtering (node_filter_dict and + # return_fields_list ) part, if necessary + node_dict_list = [ + {'hrn': 'iotlab.wsn430-11.devlille.iot-lab.info', + 'archi': 'wsn430', 'mobile': 'True', + 'hostname': 'wsn430-11.devlille.iot-lab.info', + 'site': 'devlille', 'mobility_type': 'None', + 'boot_state': 'Suspected', + 'node_id': 'wsn430-11.devlille.iot-lab.info', + 'radio': 'cc2420', 'posx': '2.3', 'posy': '2.3', + 'node_number': 11, 'posz': '1'}, + {'hrn': 'iotlab.wsn430-10.devlille.iot-lab.info', + 'archi': 'wsn430', 'mobile': 'True', + 'hostname': 'wsn430-10.devlille.iot-lab.info', + 'site': 'devlille', 'mobility_type': 'None', + 'boot_state': 'Alive', 'node_id': 'wsn430-10.devlille.iot-lab.info', + 'radio': 'cc2420', 'posx': '1.3', 'posy': '2.3', 'node_number': 10, + 'posz': '1'}, + {'hrn': 'iotlab.wsn430-1.devlille.iot-lab.info', + 'archi': 'wsn430', 'mobile': 'False', + 'hostname': 'wsn430-1.devlille.iot-lab.info', + 'site': 'devlille', 'mobility_type': 'None', + 'boot_state': 'Alive', 'node_id': 'wsn430-1.devlille.iot-lab.info', + 'radio': 'cc2420', 'posx': '0.3', 'posy': '0.3', 'node_number': 1, + 'posz': '1'} ] + return node_dict_list + + + + + def get_sites(self, site_filter_name_list=None, return_fields_list=None): + + """Get the different cortexlab sites and for each sites, the nodes + hostnames on this site. + + :param site_filter_name_list: used to specify specific sites + :param return_fields_list: fields that has to be returned + :type site_filter_name_list: list + :type return_fields_list: list + """ + site_dict_list = None + site_dict_list = [ + {'address_ids': [], 'slice_ids': [], 'name': 'iotlab', + 'node_ids': [u'wsn430-11.devlille.iot-lab.info', + u'wsn430-10.devlille.iot-lab.info', u'wsn430-1.devlille.iot-lab.info'], + 'url': 'https://portal.senslab.info', 'person_ids': [], + 'site_tag_ids': [], 'enabled': True, 'site': 'devlille', + 'longitude': '- 2.10336', 'pcu_ids': [], 'max_slivers': None, + 'max_slices': None, 'ext_consortium_id': None, 'date_created': None, + 'latitude': '48.83726', 'is_public': True, 'peer_site_id': None, + 'peer_id': None, 'abbreviated_name': 'iotlab'}] + # list of dict with mandatory keys ['name', 'node_ids', 'longitude', + # 'site' ]. Value for key node_ids is a hostname list. + # See iotlabapi.py GetSites to get the filtering + return site_dict_list + + + def get_reserved_nodes(self, username): + """Get list of leases. Get the leases for the username if specified, + otherwise get all the leases. + :param username: user's LDAP login + :type username: string + :returns: list of reservations dict + :rtype: dict list + + """ + reserved_nodes_list_dict = None + return reserved_nodes_list_dict + + def schedule_experiment(self, lease_dict): + """Schedule/ run an experiment based on the information provided in the + lease dictionary. + + :param lease_dict: contains lease_start_time, + lease_duration, added_nodes, slice_name , slice_user, grain: + :type lease_dict: dictionary + + """ + answer = {} + answer['id'] = None #experiment id + answer['msg'] = None #message in case of error + + # Launch the experiment here + + return answer + + def delete_experiment(self, experiment_id, username): + """ + Delete the experiment designated by its experiment id and its + user. + TODO: If the username is not necessary to delete the lease, then you can + remove it from the parameters, given that you propagate the changes + + :param experiment_id: experiment identifier + :type experiment_id : integer + :param username: user's LDAP login + :type username: string + :returns: dict with delete status {'status': True of False} + :rtype: dict + """ + # Delete the experiment here. Ret['status'] should be True or False + # depending if the delete was effective or not. + ret = {} + ret['status'] = None + return ret \ No newline at end of file -- 2.43.0