Adding some sfatables-specific stuff in here.
[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 from sfa.util.config import Config
7
8 import sys
9 import socket
10 import struct
11
12 # Message IDs for all the GENI light calls
13 # This will be used by the aggrMgr controller
14 SFA_GET_RESOURCES = 101
15 SFA_CREATE_SLICE = 102
16 SFA_START_SLICE = 103
17 SFA_STOP_SLICE = 104
18 SFA_DELETE_SLICE = 105
19 SFA_GET_SLICES = 106
20 SFA_RESET_SLICES = 107
21
22 DEBUG = 1
23
24 def print_buffer(buf):
25     for i in range(0,len(buf)):
26         print('%x' % buf[i])
27
28 def extract(sock):
29     # Shud we first obtain the message length?
30     # msg_len = socket.ntohs(sock.recv(2))
31     msg = ""
32
33     while (1):
34         try:
35             chunk = sock.recv(1)
36         except socket.error, message:
37             if 'timed out' in message:
38                 break
39             else:
40                 sys.exit("Socket error: " + message)
41
42         if len(chunk) == 0:
43             break
44         msg += chunk
45
46     print 'done extracting response from aggrMgr'
47     return msg
48    
49 def connect(server, port):
50     '''Connect to the Aggregate Manager module'''
51     sock = socket.socket ( socket.AF_INET, socket.SOCK_STREAM )
52     sock.connect ( ( server, port) )
53     sock.settimeout(1)
54     print 'connected to aggregate manager module'
55     return sock
56     
57 def connect_aggrMgr():
58     (aggr_mgr_ip, aggr_mgr_port) = Config().get_openflow_aggrMgr_info()
59     print """Connecting to port %d of %s""" % (aggr_mgr_port, aggr_mgr_ip)
60     return connect(aggr_mgr_ip, aggr_mgr_port)
61
62 def generate_slide_id(cred, hrn):
63     if cred == None:
64         cred = ""
65     if hrn == None:
66         hrn = ""
67     #return str(cred) + '_' + str(hrn)
68     return str(hrn)
69
70 def msg_aggrMgr(cred, hrn, msg_id):
71     slice_id = generate_slide_id(cred, hrn)
72
73     msg = struct.pack('> B%ds' % len(slice_id), msg_id, slice_id)
74     buf = struct.pack('> H', len(msg)+2) + msg
75
76     try:
77         aggrMgr_sock = connect_aggrMgr()
78         aggrMgr_sock.send(buf)
79         aggrMgr_sock.close()
80         return 1
81     except socketerror, message:
82         print "Socket error"
83     except IOerror, message:
84         print "IO error"
85     return 0
86
87 def start_slice(cred, hrn):
88     if DEBUG: print "Received start_slice call"
89     return msg_aggrMgr(SFA_START_SLICE)
90
91 def stop_slice(cred, hrn):
92     if DEBUG: print "Received stop_slice call"
93     return msg_aggrMgr(SFA_STOP_SLICE)
94
95 def delete_slice(cred, hrn):
96     if DEBUG: print "Received delete_slice call"
97     return msg_aggrMgr(SFA_DELETE_SLICE)
98
99 def reset_slices(cred, hrn):
100     if DEBUG: print "Received reset_slices call"
101     return msg_aggrMgr(SFA_RESET_SLICES)
102
103 def create_slice(cred, hrn, rspec):
104     if DEBUG: print "Received create_slice call"
105     slice_id = generate_slide_id(cred, hrn)
106
107     msg = struct.pack('> B%ds%ds' % (len(slice_id)+1, len(rspec)), SFA_CREATE_SLICE, slice_id, rspec)
108     buf = struct.pack('> H', len(msg)+2) + msg
109
110     try:
111         aggrMgr_sock = connect_aggrMgr()
112         aggrMgr_sock.send(buf)
113         aggrMgr_sock.close()
114         print "Sent %d bytes and closing connection" % len(buf)
115         return 1
116     except socketerror, message:
117         print "Socket error"
118     except IOerror, message:
119         print "IO error"
120     return 0
121
122 def get_rspec(cred, hrn=None):
123     if DEBUG: print "Received get_rspec call"
124     slice_id = generate_slide_id(cred, hrn)
125
126     msg = struct.pack('> B%ds' % len(slice_id), SFA_GET_RESOURCES, slice_id)
127     buf = struct.pack('> H', len(msg)+2) + msg
128
129     try:
130         aggrMgr_sock = connect_aggrMgr()
131         aggrMgr_sock.send(buf)
132         resource_list = extract(aggrMgr_sock);
133         aggrMgr_sock.close()
134
135         return resource_list 
136     except socketerror, message:
137         print "Socket error"
138     except IOerror, message:
139         print "IO error"
140     return None
141
142 def fetch_context(slice_hrn, user_hrn, contexts):
143     return None
144
145 #def main():
146 #    r = Rspec()
147 #    r.parseFile(sys.argv[1])
148 #    rspec = r.toDict()
149 #    create_slice(None,'plc',rspec)
150     
151 #if __name__ == "__main__":
152 #    main()