Base net-virt CLI files on top of which ONOS specific changes will be done
diff --git a/cli/sdncon/rest/poll.py b/cli/sdncon/rest/poll.py
new file mode 100755
index 0000000..bfd0573
--- /dev/null
+++ b/cli/sdncon/rest/poll.py
@@ -0,0 +1,128 @@
+#!/usr/bin/env python
+#
+# Copyright (c) 2013 Big Switch Networks, Inc.
+#
+# Licensed under the Eclipse Public License, Version 1.0 (the
+# "License"); you may not use this file except in compliance with the
+# License. You may obtain a copy of the License at
+#
+# http://www.eclipse.org/legal/epl-v10.html
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied. See the License for the specific language governing
+# permissions and limitations under the License.
+#
+
+"""Polling interface for the polling services setup by the rest API"""
+
+import sys, os, time, random, json
+
+from packetstreamer import PacketStreamer
+from packetstreamer.ttypes import *
+
+from thrift import Thrift
+from thrift.transport import TSocket
+from thrift.transport import TTransport
+from thrift.protocol import TBinaryProtocol
+
+def sample_func(request, environ):
+ data = {
+ 'pid': os.getpid(),
+ 'random': int(random.random()*100),
+ }
+
+ return {
+ 'status': '200 OK',
+ 'body': json.dumps(data),
+ 'headers': [('Content-type', 'application/json')], # list of tuples
+ }
+
+def getPackets_func(request, environ, sessionid):
+ retData = {}
+
+ try:
+ # Make socket
+ transport = TSocket.TSocket('localhost', 9090)
+ # Buffering is critical. Raw sockets are very slow
+ transport = TTransport.TFramedTransport(transport)
+ # Wrap in a protocol
+ protocol = TBinaryProtocol.TBinaryProtocol(transport)
+ # Create a client to use the protocol encoder
+ client = PacketStreamer.Client(protocol)
+ # Connect!
+ transport.open()
+
+ packets = client.getPackets(sessionid)
+
+ # Close!
+ transport.close()
+
+ retData = {
+ 'status': '200 OK',
+ 'body': json.dumps(packets),
+ 'headers': [('Content-type', 'application/json')], # list of tuples
+ }
+
+ except Thrift.TException, tx:
+ retData = {
+ 'status': '500 Internal Server Error',
+ 'body': 'error: %s'%tx.message,
+ 'headers': [('Content-type', 'application/json')], # list of tuples
+ }
+
+ return retData
+
+# The polling service
+# The service is driven by the urlpatterns tuples that list the specific function
+# to use for a matching pattern in URL. The pattern should not include initial '^/poll'.
+# For Example:
+# (r'^/sample', sample_func)
+#from sdncon.rest.poll import sample_func
+urlpatterns = [
+ (r'^/packets/(?P<sessionid>[A-Za-z0-9_.\-]+)/?$', getPackets_func),
+ (r'^/sample', sample_func)
+]
+
+import re, wsgiref.util
+
+def compile_patterns(urlpatterns):
+ return map(lambda pat: (re.compile(pat[0]), pat[1]), urlpatterns)
+
+def main(environ, start_response):
+ patterns = compile_patterns(urlpatterns)
+ request = environ['PATH_INFO']
+ response = None
+ status, body = '404 Not Found', 'Sorry, the requested resource "%s" was not found."' % request
+ headers = []
+ for (pat, func) in patterns:
+ m = pat.match(request)
+ if m:
+ args = m.groups()
+ if args:
+ response = func(request, environ, *args)
+ else:
+ response = func(request, environ)
+
+ status, body = response['status'], response['body']
+ if 'headers' in response:
+ headers.extend(response['headers'])
+ break
+ if 'Cache-Control' not in headers:
+ headers.append(('Cache-Control', 'no-cache'))
+ if 'Content-type' not in headers:
+ headers.append(('Content-type', 'text/plain'))
+ if 'Content-Length' not in headers:
+ headers.append(('Content-Length', str(len(body))))
+ start_response(status, headers)
+ return [body]
+
+if __name__ == "__main__":
+ def start_response(x, y):
+ print 'Status:', x
+ print 'Headers:', y
+
+ print 'Sample', sample_func(None, None)
+ print 'Response:', main({'PATH_INFO':'/sample/100'}, start_response)
+ print 'Response:', main({'PATH_INFO':'/xsample/100'}, start_response)