Test:Provide a setup phase for cord-tester which just starts/provisions required containers for testing.
It also starts a container management rpc server for remote container restarts with configuration from tests.
Use simple xmlrpc server for container management over our own in cord-test server.
Add dependencies pertaining to the new change in tester for the dockerfile.
This way, we now can setup the cord-tester in one node and launch the test from a test container in another node in the podd.
Change-Id: Ie99540e5455f46ee515c7c5341af7ec94892e438
diff --git a/src/test/utils/CordTestServer.py b/src/test/utils/CordTestServer.py
index 2037d71..1889536 100644
--- a/src/test/utils/CordTestServer.py
+++ b/src/test/utils/CordTestServer.py
@@ -1,80 +1,99 @@
-#
+#
# Copyright 2016-present Ciena Corporation
#
# Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
-#
+#
# 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.
#
-import SocketServer as socketserver
-import threading
-import socket
-from CordContainer import Onos, Quagga
+from CordContainer import Container, Onos, Quagga, Radius, reinitContainerClients
from nose.tools import nottest
+from SimpleXMLRPCServer import SimpleXMLRPCServer
+import daemon
+import xmlrpclib
+import os
+import json
+import time
+import threading
-##Server to handle container restart requests from test container.
+##Server to handle container restart/stop requests from test container.
##Used now to restart ONOS from vrouter test container
CORD_TEST_HOST = '172.17.0.1'
CORD_TEST_PORT = 25000
-class CordTestServer(socketserver.BaseRequestHandler):
+class QuaggaStopWrapper(Container):
+ def __init__(self, name = Quagga.NAME, image = Quagga.IMAGE, tag = 'latest'):
+ super(QuaggaStopWrapper, self).__init__(name, image, tag = tag)
+ if self.exists():
+ self.kill()
- def restart_onos(self, *args):
+class CordTestServer(object):
+
+ def __restart_onos(self, config = None):
+ onos_config = '{}/network-cfg.json'.format(Onos.host_config_dir)
+ if config is None:
+ try:
+ os.unlink(onos_config)
+ except:
+ pass
print('Restarting ONOS')
- onos = Onos(restart = True)
- self.request.sendall('DONE')
+ Onos(restart = True, network_cfg = config)
+ return 'DONE'
- def restart_quagga(self, *args):
+ def restart_onos(self, kwargs):
+ return self.__restart_onos(**kwargs)
+
+ def __restart_quagga(self, config = None, boot_delay = 30 ):
config_file = Quagga.quagga_config_file
- boot_delay = 15
- if args:
- config_file = args[0]
- if len(args) > 1:
- boot_delay = int(args[1])
- print('Restarting QUAGGA with config file %s, delay %d secs'%(config_file, boot_delay))
- quagga = Quagga(restart = True, config_file = config_file, boot_delay = boot_delay)
- self.request.sendall('DONE')
+ if config is not None:
+ quagga_config = '{}/testrib_gen.conf'.format(Quagga.host_quagga_config)
+ config_file = '{}/testrib_gen.conf'.format(Quagga.guest_quagga_config)
+ with open(quagga_config, 'w+') as fd:
+ fd.write(str(config))
+ print('Restarting QUAGGA with config file %s, delay %d' %(config_file, boot_delay))
+ Quagga(restart = True, config_file = config_file, boot_delay = boot_delay)
+ return 'DONE'
- def restart_radius(self, *args):
- print('Restarting RADIUS Server')
- radius = Radius(restart = True)
- self.request.sendall('DONE')
+ def restart_quagga(self, kwargs):
+ return self.__restart_quagga(**kwargs)
- callback_table = { 'RESTART_ONOS' : restart_onos,
- 'RESTART_QUAGGA' : restart_quagga,
- 'RESTART_RADIUS' : restart_radius,
- }
-
- def handle(self):
- data = self.request.recv(1024).strip()
- cmd = data.split()[0]
+ def stop_quagga(self):
+ quaggaStop = QuaggaStopWrapper()
+ time.sleep(2)
try:
- #args = ' '.join(data.split()[1:])
- args = data.split()[1:]
- except:
- args = None
+ quagga_config_gen = '{}/testrib_gen.conf'.format(Quagga.host_quagga_config)
+ os.unlink(quagga_config_gen)
+ except: pass
+ return 'DONE'
- if self.callback_table.has_key(cmd):
- self.callback_table[cmd](self, *args)
-
-class ThreadedTestServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
- allow_reuse_address = True
+ def restart_radius(self):
+ print('Restarting RADIUS Server')
+ Radius(restart = True)
+ return 'DONE'
@nottest
-def cord_test_server_start():
- server = ThreadedTestServer( (CORD_TEST_HOST, CORD_TEST_PORT), CordTestServer)
- task = threading.Thread(target = server.serve_forever)
- ##terminate when main thread exits
- task.daemon = True
- task.start()
+def cord_test_server_start(daemonize = True, cord_test_host = CORD_TEST_HOST, cord_test_port = CORD_TEST_PORT):
+ server = SimpleXMLRPCServer( (cord_test_host, cord_test_port) )
+ server.register_instance(CordTestServer())
+ if daemonize is True:
+ d = daemon.DaemonContext(files_preserve = [server],
+ detach_process = True)
+ with d:
+ reinitContainerClients()
+ server.serve_forever()
+ else:
+ task = threading.Thread(target = server.serve_forever)
+ ##terminate when main thread exits
+ task.daemon = True
+ task.start()
return server
@nottest
@@ -83,27 +102,44 @@
server.server_close()
@nottest
-def cord_test_onos_restart():
+def get_cord_test_loc():
+ host = os.getenv('CORD_TEST_HOST', CORD_TEST_HOST)
+ port = int(os.getenv('CORD_TEST_PORT', CORD_TEST_PORT))
+ return host, port
+
+def rpc_server_instance():
+ '''Stateless'''
+ host, port = get_cord_test_loc()
+ rpc_server = 'http://{}:{}'.format(host, port)
+ return xmlrpclib.Server(rpc_server, allow_none = True)
+
+@nottest
+def __cord_test_onos_restart(**kwargs):
+ return rpc_server_instance().restart_onos(kwargs)
+
+@nottest
+def cord_test_onos_restart(config = None):
'''Send ONOS restart to server'''
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect( (CORD_TEST_HOST, CORD_TEST_PORT) )
- s.sendall('RESTART_ONOS\n')
- data = s.recv(1024).strip()
- s.close()
+ data = __cord_test_onos_restart(config = config)
if data == 'DONE':
return True
return False
@nottest
-def cord_test_quagga_restart(config_file = None, boot_delay = 30):
+def __cord_test_quagga_restart(**kwargs):
+ return rpc_server_instance().restart_quagga(kwargs)
+
+@nottest
+def cord_test_quagga_restart(config = None, boot_delay = 30):
'''Send QUAGGA restart to server'''
- if config_file is None:
- config_file = Quagga.quagga_config_file
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect( (CORD_TEST_HOST, CORD_TEST_PORT) )
- s.sendall('RESTART_QUAGGA {0} {1}\n'.format(config_file, boot_delay))
- data = s.recv(1024).strip()
- s.close()
+ data = __cord_test_quagga_restart(config = config, boot_delay = boot_delay)
+ if data == 'DONE':
+ return True
+ return False
+
+@nottest
+def cord_test_quagga_stop():
+ data = rpc_server_instance().stop_quagga()
if data == 'DONE':
return True
return False
@@ -111,11 +147,7 @@
@nottest
def cord_test_radius_restart():
'''Send Radius server restart to server'''
- s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- s.connect( (CORD_TEST_HOST, CORD_TEST_PORT) )
- s.sendall('RESTART_RADIUS\n')
- data = s.recv(1024).strip()
- s.close()
+ data = rpc_server_instance().restart_radius()
if data == 'DONE':
return True
return False