From: Sapan Bhatia Date: Tue, 22 Sep 2009 13:46:14 +0000 (+0000) Subject: Adding rspec manager for openflow, courtesy Srini@stanford X-Git-Tag: sfa-0.9-3~59 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=29b3410aea3c3c875bb210472517130e5ff2e412;p=sfa.git Adding rspec manager for openflow, courtesy Srini@stanford --- diff --git a/sfa/rspecs/aggregates/openflow.xml b/sfa/rspecs/aggregates/openflow.xml new file mode 100755 index 00000000..77e11b04 --- /dev/null +++ b/sfa/rspecs/aggregates/openflow.xml @@ -0,0 +1,52 @@ + + + + 1.0 + + + + 0012e2b8f3d2 + + 0 + allow10001 + allow10001 + + + 1 + allow10001 + allow10001 + + + 3 + allow10001 + allow10001 + + + tcp:openflow4.stanford.edu:10001 + + + + + 0012e2786763 + + 0 + allow10001 + allow10001 + + + tcp:openflow4.stanford.edu:10001 + + + + + 0012e27831f3 + + 8 + allow10001 + allow10001 + + + tcp:openflow4.stanford.edu:10001 + + + diff --git a/sfa/rspecs/aggregates/rspec_manager_openflow.py b/sfa/rspecs/aggregates/rspec_manager_openflow.py new file mode 100755 index 00000000..8b3a0c08 --- /dev/null +++ b/sfa/rspecs/aggregates/rspec_manager_openflow.py @@ -0,0 +1,149 @@ +from sfa.util.faults import * +from sfa.util.misc import * +from sfa.util.rspec import Rspec +from sfa.server.registry import Registries +from sfa.plc.nodes import * +from sfa.util.config import Config + +import sys +import socket +import struct + +# Message IDs for all the GENI light calls +# This will be used by the aggrMgr controller +SFA_GET_RESOURCES = 101 +SFA_CREATE_SLICE = 102 +SFA_START_SLICE = 103 +SFA_STOP_SLICE = 104 +SFA_DELETE_SLICE = 105 +SFA_GET_SLICES = 106 +SFA_RESET_SLICES = 107 + +DEBUG = 1 + +def print_buffer(buf): + for i in range(0,len(buf)): + print('%x' % buf[i]) + +def extract(sock): + # Shud we first obtain the message length? + # msg_len = socket.ntohs(sock.recv(2)) + msg = "" + + while (1): + try: + chunk = sock.recv(1) + except socket.error, message: + if 'timed out' in message: + break + else: + sys.exit("Socket error: " + message) + + if len(chunk) == 0: + break + msg += chunk + + print 'done extracting response from aggrMgr' + return msg + +def connect(server, port): + '''Connect to the Aggregate Manager module''' + sock = socket.socket ( socket.AF_INET, socket.SOCK_STREAM ) + sock.connect ( ( server, port) ) + sock.settimeout(1) + print 'connected to aggregate manager module' + return sock + +def connect_aggrMgr(): + (aggr_mgr_ip, aggr_mgr_port) = Config().get_openflow_aggrMgr_info() + print """Connecting to port %d of %s""" % (aggr_mgr_port, aggr_mgr_ip) + return connect(aggr_mgr_ip, aggr_mgr_port) + +def generate_slide_id(cred, hrn): + if cred == None: + cred = "" + if hrn == None: + hrn = "" + #return str(cred) + '_' + str(hrn) + return str(hrn) + +def msg_aggrMgr(cred, hrn, msg_id): + slice_id = generate_slide_id(cred, hrn) + + msg = struct.pack('> B%ds' % len(slice_id), msg_id, slice_id) + buf = struct.pack('> H', len(msg)+2) + msg + + try: + aggrMgr_sock = connect_aggrMgr() + aggrMgr_sock.send(buf) + aggrMgr_sock.close() + return 1 + except socketerror, message: + print "Socket error" + except IOerror, message: + print "IO error" + return 0 + +def start_slice(cred, hrn): + if DEBUG: print "Received start_slice call" + return msg_aggrMgr(SFA_START_SLICE) + +def stop_slice(cred, hrn): + if DEBUG: print "Received stop_slice call" + return msg_aggrMgr(SFA_STOP_SLICE) + +def delete_slice(cred, hrn): + if DEBUG: print "Received delete_slice call" + return msg_aggrMgr(SFA_DELETE_SLICE) + +def reset_slices(cred, hrn): + if DEBUG: print "Received reset_slices call" + return msg_aggrMgr(SFA_RESET_SLICES) + +def create_slice(cred, hrn, rspec): + if DEBUG: print "Received create_slice call" + slice_id = generate_slide_id(cred, hrn) + + msg = struct.pack('> B%ds%ds' % (len(slice_id)+1, len(rspec)), SFA_CREATE_SLICE, slice_id, rspec) + buf = struct.pack('> H', len(msg)+2) + msg + + try: + aggrMgr_sock = connect_aggrMgr() + aggrMgr_sock.send(buf) + aggrMgr_sock.close() + print "Sent %d bytes and closing connection" % len(buf) + return 1 + except socketerror, message: + print "Socket error" + except IOerror, message: + print "IO error" + return 0 + +def get_rspec(cred, hrn=None): + if DEBUG: print "Received get_rspec call" + slice_id = generate_slide_id(cred, hrn) + + msg = struct.pack('> B%ds' % len(slice_id), SFA_GET_RESOURCES, slice_id) + buf = struct.pack('> H', len(msg)+2) + msg + + try: + aggrMgr_sock = connect_aggrMgr() + aggrMgr_sock.send(buf) + resource_list = extract(aggrMgr_sock); + aggrMgr_sock.close() + + return resource_list + except socketerror, message: + print "Socket error" + except IOerror, message: + print "IO error" + return None + +#def main(): +# r = Rspec() +# r.parseFile(sys.argv[1]) +# rspec = r.toDict() +# create_slice(None,'plc',rspec) + +#if __name__ == "__main__": +# main()