Checked in updated openflow rspec manager from Srini
[sfa.git] / sfa / rspecs / aggregates / rspec_manager_openflow.py
1 from sfa.util.faults import *
2 from sfa.util.misc import *
3 from sfa.util.rspec import Rspec
4 from sfa.server.registry import Registries
5 from sfa.plc.nodes import *
6 import sys
7
8 # Probably the following is not essential
9 #from soaplib.wsgi_soap import SimpleWSGISoapApp
10 #from soaplib.serializers.primitive import *
11 #from soaplib.serializers.clazz import *
12
13 import socket
14 import struct
15
16 SOAP_INTERFACE_PORT = 7889
17 AGGREGATE_MANAGER_PORT = 2603
18 AGGREGATE_MANAGER_IP = 'localhost'
19 #AGGREGATE_MANAGER_IP = 'openflowvisor.stanford.edu'
20
21 # Message IDs for all the GENI light calls
22 # This will be used by the aggrMgr controller
23 SFA_GET_RESOURCES = 101
24 SFA_CREATE_SLICE = 102
25 SFA_START_SLICE = 103
26 SFA_STOP_SLICE = 104
27 SFA_DELETE_SLICE = 105
28 SFA_GET_SLICES = 106
29 SFA_RESET_SLICES = 107
30
31 DEBUG = 1
32
33 def print_buffer(buf):
34     for i in range(0,len(buf)):
35         print('%x' % buf[i])
36
37 def extract(sock):
38     # Shud we first obtain the message length?
39     # msg_len = socket.ntohs(sock.recv(2))
40     msg = ""
41
42     while (1):
43         try:
44             chunk = sock.recv(1)
45         except socket.error, message:
46             if 'timed out' in message:
47                 break
48             else:
49                 sys.exit("Socket error: " + message)
50
51         if len(chunk) == 0:
52             break
53         msg += chunk
54
55     print 'done extracting response from aggrMgr'
56     return msg
57    
58 def connect(server, port):
59     '''Connect to the Aggregate Manager module'''
60     sock = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
61     sock.connect ( ( server, port) )
62     sock.settimeout(1)
63     print 'connected to aggregate manager module'
64     return sock
65     
66 def connect_aggrMgr():
67     return connect(AGGREGATE_MANAGER_IP, AGGREGATE_MANAGER_PORT)
68
69 def generate_slide_id(cred, hrn):
70     if cred == None:
71         cred = ""
72     if hrn == None:
73         hrn = ""
74     return cred + '_' + hrn
75
76 def msg_aggrMgr(cred, hrn, msg_id):
77     slice_id = generate_slide_id(cred, hrn)
78
79     msg = struct.pack('> B%ds' % len(slice_id), msg_id, slice_id)
80     buf = struct.pack('> H', len(msg)+2) + msg
81
82     try:
83         aggrMgr_sock = connect_aggrMgr()
84         aggrMgr_sock.send(buf)
85         aggrMgr_sock.close()
86         return 1
87     except socketerror, message:
88         print "Socket error"
89     except IOerror, message:
90         print "IO error"
91     return 0
92
93 def start_slice(cred, hrn):
94     if DEBUG: print "Received start_slice call"
95     return msg_aggrMgr(SFA_START_SLICE)
96
97 def stop_slice(cred, hrn):
98     if DEBUG: print "Received stop_slice call"
99     return msg_aggrMgr(SFA_STOP_SLICE)
100
101 def delete_slice(cred, hrn):
102     if DEBUG: print "Received delete_slice call"
103     return msg_aggrMgr(SFA_DELETE_SLICE)
104
105 def reset_slices(cred, hrn):
106     if DEBUG: print "Received reset_slices call"
107     return msg_aggrMgr(SFA_RESET_SLICES)
108
109 def create_slice(cred, hrn, rspec):
110     if DEBUG: print "Received create_slice call"
111     slice_id = generate_slide_id(cred, hrn)
112
113     msg = struct.pack('> B%ds%ds' % len(slice_id), SFA_CREATE_SLICE, slice_id, rspec)
114     buf = struct.pack('> H', len(msg)+2) + msg
115
116     try:
117         aggrMgr_sock = connect_aggrMgr()
118         aggrMgr_sock.send(buf)
119         aggrMgr_sock.close()
120         return 1
121     except socketerror, message:
122         print "Socket error"
123     except IOerror, message:
124         print "IO error"
125     return 0
126
127 def get_resources(cred, hrn=None):
128     if DEBUG: print "Received get_resources call"
129     slice_id = generate_slide_id(cred, hrn)
130
131     msg = struct.pack('> B%ds' % len(slice_id), SFA_GET_RESOURCES, slice_id)
132     buf = struct.pack('> H', len(msg)+2) + msg
133
134     try:
135         aggrMgr_sock = connect_aggrMgr()
136         aggrMgr_sock.send(buf)
137         resource_list = extract(aggrMgr_sock);
138         aggrMgr_sock.close()
139
140         return resource_list 
141     except socketerror, message:
142         print "Socket error"
143     except IOerror, message:
144         print "IO error"
145     return None
146
147 def fetch_context(slice_hrn, user_hrn, contexts):
148     return None
149
150 def main():
151     r = Rspec()
152     r.parseFile(sys.argv[1])
153     rspec = r.toDict()
154     create_slice(None,'plc',rspec)
155     
156 if __name__ == "__main__":
157     main()