From 43a30d5e8fe5e5a0b9c70b2ec5232d853355e165 Mon Sep 17 00:00:00 2001 From: Sandrine Avakian Date: Mon, 21 Nov 2011 14:52:38 +0100 Subject: [PATCH] Modified files to get an Rspec from OAR. Returns list of nodes from OAR. --- sfa/managers/aggregate_manager_slab.py | 10 +- sfa/senslab/OARrestapi.py | 4 +- sfa/senslab/OARrspec.py | 160 ++++++++++++++++++------- 3 files changed, 127 insertions(+), 47 deletions(-) diff --git a/sfa/managers/aggregate_manager_slab.py b/sfa/managers/aggregate_manager_slab.py index 15de0ce9..d887a6e0 100644 --- a/sfa/managers/aggregate_manager_slab.py +++ b/sfa/managers/aggregate_manager_slab.py @@ -22,7 +22,9 @@ from sfa.util.record import * from sfa.trust.credential import Credential import sfa.plc.peers as peers from sfa.plc.network import * -from sfa.senslab.OARrestapi import * +#from sfa.senslab.OARrestapi import * +from sfa.senslab.slabdriver import SlabDriver +from sfa.util.config import Config #from sfa.senslab.api import SfaAPI #from sfa.plc.aggregate import Aggregate #from sfa.plc.slices import * @@ -348,8 +350,8 @@ def ListSlices(api, creds, call_id): def ListResources(api, creds, options,call_id): print >>sys.stderr, 'RESOURCES AGGREGATE' - OARImporter = OARapi() - + #OARImporter = OARapi() + driver = SlabDriver(Config()) if Callids().already_handled(call_id): return "" # get slice's hrn from options xrn = options.get('geni_slice_urn', '') @@ -393,7 +395,7 @@ def ListResources(api, creds, options,call_id): rspec = OAR_rspec.get_rspec(slice_xrn=xrn, version=rspec_version) - print >>sys.stderr, '\r\n OARImporter.GetNodes()', OARImporter.GetNodes() + print >>sys.stderr, '\r\n Slabdriver.GetNodes()', driver.GetNodes() print >>sys.stderr, ' \r\n **************RSPEC' , rspec diff --git a/sfa/senslab/OARrestapi.py b/sfa/senslab/OARrestapi.py index 816d09da..79ec3435 100644 --- a/sfa/senslab/OARrestapi.py +++ b/sfa/senslab/OARrestapi.py @@ -115,7 +115,8 @@ class OARGETParser: def AddPosY(self,tuplelist,value): tuplelist.append(('posy',value)) - + def AddBootState(self,tuplelist,value): + tuplelist.append(('boot_state',str(value))) def ParseVersion(self) : print self.raw_json @@ -249,6 +250,7 @@ class OARGETParser: 'mobile': AddMobility, 'posx': AddPosX, 'posy': AddPosY, + 'state':AddBootState, } diff --git a/sfa/senslab/OARrspec.py b/sfa/senslab/OARrspec.py index e5fdc2e0..fcf58da3 100644 --- a/sfa/senslab/OARrspec.py +++ b/sfa/senslab/OARrspec.py @@ -7,16 +7,28 @@ import httplib import json -from sfa.util.xrn import * -from sfa.util.plxrn import * -#from sfa.rspecs.sfa_rspec import SfaRSpec -from sfa.rspecs.rspec import RSpec -#from sfa.rspecs.pg_rspec import PGRSpec -#from sfa.rspecs.rspec_version import RSpecVersion from sfa.rspecs.version_manager import VersionManager from sfa.senslab.OARrestapi import * from sfa.senslab.slabdriver import SlabDriver from sfa.util.config import Config +from sfa.util.xrn import hrn_to_urn, urn_to_hrn, urn_to_sliver_id +from sfa.util.plxrn import PlXrn, hostname_to_urn, hrn_to_pl_slicename + +from sfa.rspecs.rspec import RSpec +from sfa.rspecs.elements.hardware_type import HardwareType +from sfa.rspecs.elements.node import Node +#from sfa.rspecs.elements.link import Link +#from sfa.rspecs.elements.sliver import Sliver +#from sfa.rspecs.elements.login import Login +#from sfa.rspecs.elements.location import Location +#from sfa.rspecs.elements.interface import Interface +#from sfa.rspecs.elements.services import Services +#from sfa.rspecs.elements.pltag import PLTag +from sfa.util.topology import Topology +from sfa.rspecs.version_manager import VersionManager +#from sfa.plc.vlink import get_tc_rate +from sfa.util.sfatime import epochparse + class OARrspec: @@ -52,8 +64,7 @@ class OARrspec: for node in self.driver.GetNodes(): #for node in self.OARImporter.GetNodes(): self.nodes[node['node_id']] = node - print >>sys.stderr,'prepare_nodes:node', node - + #def prepare_interfaces(self, force=False): #if not self.interfaces or force: #for interface in self.api.plshell.GetInterfaces(self.api.plauth): @@ -72,6 +83,7 @@ class OARrspec: if not self.prepared or force: #self.prepare_sites(force) self.prepare_nodes(force) + #self.prepare_links(force) #self.prepare_interfaces(force) #self.prepare_node_tags(force) @@ -83,19 +95,105 @@ class OARrspec: #tags = [self.node_tags[tag_id] for tag_id in node['node_tag_ids']] node['network'] = self.driver.root_auth node['network_urn'] = hrn_to_urn(node['network'], 'authority+am') - node['urn'] = hostname_to_urn(node['network'], node['site_login_base'], node['hostname']) + #node['urn'] = hostname_to_urn(node['network'], node['site_login_base'], node['hostname']) node['site_urn'] = hrn_to_urn(PlXrn.site_hrn(node['network'], node['site_login_base']), 'authority+sa') + node['urn'] = hostname_to_urn(node['network'], node['site_login_base'], node['hostname']) + #node['urn'] = PlXrn(auth=node['network']+'.',hostname=node['hostname']).get_urn() + #node['site'] = site #node['interfaces'] = interfaces #node['tags'] = tags - #print >>sys.stderr, "\r\n OAR prepare ", node - - self.prepared = True - print >>sys.stderr, " \r\n \t\t prepare prepare_nodes \r\n %s " %(self.nodes) + + self.prepared = True + print >>sys.stderr, "\r\n OARrspec prepare node 10",self.nodes[10] + #print >>sys.stderr, " \r\n \t\t prepare prepare_nodes \r\n %s " %(self.nodes) + + def get_nodes(self): + filtre = {} + #tags_filter = {} + #if slice and 'node_ids' in slice and slice['node_ids']: + #filter['node_id'] = slice['node_ids'] + #tags_filter=filter.copy() + + #filter.update({'peer_id': None}) + nodes = self.driver.GetNodes(filtre) + + #site_ids = [] + interface_ids = [] + tag_ids = [] + nodes_dict = {} + for node in nodes: + #site_ids.append(node['site_id']) + #interface_ids.extend(node['interface_ids']) + #tag_ids.extend(node['node_tag_ids']) + nodes_dict[node['node_id']] = node + + # get sites + #sites_dict = self.get_sites({'site_id': site_ids}) + # get interfaces + #interfaces = self.get_interfaces({'interface_id':interface_ids}) + # get tags + #node_tags = self.get_node_tags(tags_filter) + # get initscripts + #pl_initscripts = self.get_pl_initscripts() + + #links = self.get_links(sites_dict, nodes_dict, interfaces) + + rspec_nodes = [] + for node in nodes: + # skip whitelisted nodes + #if node['slice_ids_whitelist']: + #if not slice or slice['slice_id'] not in node['slice_ids_whitelist']: + #continue + rspec_node = Node() + # xxx how to retrieve site['login_base'] + #site_id=node['site_id'] + #site=sites_dict[site_id] + rspec_node['component_id'] = hostname_to_urn(self.driver.root_auth, node['site_login_base'], node['hostname']) + rspec_node['component_name'] = node['hostname'] + rspec_node['component_manager_id'] = hrn_to_urn(self.driver.root_auth, 'authority+sa') + rspec_node['authority_id'] = hrn_to_urn(PlXrn.site_hrn(self.driver.root_auth, node['site_login_base']), 'authority+sa') + rspec_node['boot_state'] = node['boot_state'] + rspec_node['exclusive'] = 'True' + rspec_node['hardware_types']= [HardwareType({'name': 'senslab sensor node'})] + # only doing this because protogeni rspec needs + # to advertise available initscripts + #rspec_node['pl_initscripts'] = pl_initscripts.values() + # add site/interface info to nodes. + # assumes that sites, interfaces and tags have already been prepared. + #site = sites_dict[node['site_id']] + #if site['longitude'] and site['latitude']: + #location = Location({'longitude': site['longitude'], 'latitude': site['latitude']}) + #rspec_node['location'] = location + rspec_node['interfaces'] = [] + #if_count=0 + #for if_id in node['interface_ids']: + #interface = Interface(interfaces[if_id]) + #interface['ipv4'] = interface['ip'] + #interface['component_id'] = PlXrn(auth=self.api.hrn, interface='node%s:eth%s' % (node['node_id'], if_count)).get_urn() + #rspec_node['interfaces'].append(interface) + #if_count+=1 + + #tags = [PLTag(node_tags[tag_id]) for tag_id in node['node_tag_ids']] + rspec_node['tags'] = [] + #if node['node_id'] in slivers: + ## add sliver info + #sliver = slivers[node['node_id']] + #rspec_node['sliver_id'] = sliver['sliver_id'] + #rspec_node['client_id'] = node['hostname'] + #rspec_node['slivers'] = [sliver] + + ## slivers always provide the ssh service + #login = Login({'authentication': 'ssh-keys', 'hostname': node['hostname'], 'port':'22'}) + #service = Services({'login': login}) + #rspec_node['services'] = [service] + rspec_nodes.append(rspec_node) + return (rspec_nodes) + #from plc/aggregate.py def get_rspec(self, slice_xrn=None, version = None): - print>>sys.stderr, " \r\n OARrspec \t\t get_spec **************\r\n" - self.prepare() + print>>sys.stderr, " \r\n OARrspec \t\t get_rspec **************\r\n" + #self.prepare() rspec = None version_manager = VersionManager() @@ -109,33 +207,11 @@ class OARrspec: rspec_version = version_manager._get_version(version.type, version.version, 'manifest') rspec = RSpec(version=rspec_version, user_options=self.user_options) - rspec.version.add_nodes(self.nodes.values()) - print >>sys.stderr, 'after add_nodes' + + nodes = self.get_nodes() + rspec.version.add_nodes(nodes) + + print >>sys.stderr, 'after add_nodes ' - #rspec.add_links(self.links.values()) - - #if slice_xrn: - ## get slice details - #slice_hrn, _ = urn_to_hrn(slice_xrn) - #slice_name = hrn_to_pl_slicename(slice_hrn) - #slices = self.api.plshell.GetSlices(self.api.plauth, slice_name) - #if slices: - #slice = slices[0] - #slivers = [] - #tags = self.api.plshell.GetSliceTags(self.api.plauth, slice['slice_tag_ids']) - #for node_id in slice['node_ids']: - #sliver = {} - #sliver['hostname'] = self.nodes[node_id]['hostname'] - #sliver['tags'] = [] - #slivers.append(sliver) - #for tag in tags: - ## if tag isn't bound to a node then it applies to all slivers - #if not tag['node_id']: - #sliver['tags'].append(tag) - #else: - #tag_host = self.nodes[tag['node_id']]['hostname'] - #if tag_host == sliver['hostname']: - #sliver.tags.append(tag) - #rspec.add_slivers(slivers) return rspec.toxml() -- 2.45.2