| #!/usr/bin/env python3 |
| |
| # |
| # Copyright 2016 RIFT.IO Inc |
| # |
| # 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 argparse |
| import asyncio |
| import logging |
| import os |
| import sys |
| import unittest |
| import re |
| import psutil |
| import types |
| |
| import xmlrunner |
| |
| import gi |
| gi.require_version('RwDtsToyTaskletYang', '1.0') |
| gi.require_version('RwManifestYang', '1.0') |
| gi.require_version('RwVcsYang', '1.0') |
| |
| import gi.repository.RwManifestYang as rwmanifest |
| import gi.repository.RwVcsYang as rwvcs |
| import gi.repository.RwDtsToyTaskletYang as toyyang |
| import gi.repository.RwYang as RwYang |
| import rift.auto.session |
| import rift.vcs.vcs |
| |
| import rift.tasklets |
| import rift.test.dts |
| |
| if sys.version_info < (3, 4, 4): |
| asyncio.ensure_future = asyncio.async |
| |
| class LaunchPad(rift.test.dts.AbstractDTSTest): |
| """ |
| DTS GI interface unittests |
| |
| Note: Each tests uses a list of asyncio.Events for staging through the |
| test. These are required here because we are bring up each coroutine |
| ("tasklet") at the same time and are not implementing any re-try |
| mechanisms. For instance, this is used in numerous tests to make sure that |
| a publisher is up and ready before the subscriber sends queries. Such |
| event lists should not be used in production software. |
| """ |
| def setUp(self): |
| """ |
| 1. Creates an asyncio loop |
| 2. Triggers the hook configure_test |
| """ |
| def scheduler_tick(self, *args): |
| self.call_soon(self.stop) |
| self.run_forever() |
| |
| # Init params: loop & timers |
| self.loop = asyncio.new_event_loop() |
| |
| self.loop.scheduler_tick = types.MethodType(scheduler_tick, self.loop) |
| |
| self.asyncio_timer = None |
| self.stop_timer = None |
| self.__class__.id_cnt += 1 |
| self.configure_test(self.loop, self.__class__.id_cnt) |
| |
| @classmethod |
| def configure_schema(cls): |
| schema = RwYang.Model.load_and_merge_schema(rwvcs.get_schema(), 'librwcal_yang_gen.so', 'Rwcal') |
| cls.model = RwYang.Model.create_libyang() |
| cls.model.load_schema_ypbc(schema) |
| xml = cls.manifest.to_xml_v2(cls.model, 1) |
| xml = re.sub('rw-manifest:', '', xml) |
| xml = re.sub('<manifest xmlns:rw-manifest="http://riftio.com/ns/riftware-1.0/rw-manifest">', '<?xml version="1.0" ?>\n<manifest xmlns="http://riftio.com/ns/riftware-1.0/rw-manifest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://riftio.com/ns/riftware-1.0/rw-manifest ./rw-manifest.xsd">', xml) |
| xml = '\n'.join(xml.split('\n')[1:]) |
| with open('lptestmanifest.xml', 'w') as f: |
| f.write(str(xml)) |
| f.close() |
| return schema |
| |
| |
| @classmethod |
| def configure_manifest(cls): |
| manifest = rwmanifest.Manifest() |
| manifest.bootstrap_phase = rwmanifest.BootstrapPhase.from_dict({ |
| "rwmgmt": { |
| "northbound_listing": [ "platform_schema_listing.txt", "platform_mgmt_schema_listing.txt", "cli_launchpad_schema_listing.txt" ] |
| }, |
| "rwtasklet": { |
| "plugin_name": "rwinit-c" |
| }, |
| "rwtrace": { |
| "enable": True, |
| "level": 5, |
| }, |
| "log": { |
| "enable": True, |
| "severity": 4, |
| "bootstrap_time": 30, |
| "console_severity": 4 |
| }, |
| "ip_addrs_list": [ |
| { |
| "ip_addr": "127.0.0.1", |
| } |
| ], |
| "zookeeper": { |
| "master_ip": "127.0.0.1", |
| "unique_ports": False, |
| "zake": False |
| }, |
| "serf": { |
| "start": True |
| }, |
| "rwvm": { |
| "instances": [ |
| { |
| "component_name": "msgbroker", |
| "config_ready": True |
| }, |
| { |
| "component_name": "dtsrouter", |
| "config_ready": True |
| } |
| ] |
| }, |
| # "rwsecurity": { |
| # "use_ssl": True, |
| # "cert": "/net/mahi/localdisk/kelayath/ws/coreha/etc/ssl/current.cert", |
| # "key": "/net/mahi/localdisk/kelayath/ws/coreha/etc/ssl/current.key" |
| # } |
| }) |
| manifest.init_phase = rwmanifest.InitPhase.from_dict({ |
| "environment": { |
| "python_variable": [ |
| "vm_ip_address = '127.0.0.1'", |
| "rw_component_name = 'vm-launchpad'", |
| "instance_id = 1", |
| "component_type = 'rwvm'", |
| ], |
| "component_name": "$python(rw_component_name)", |
| "instance_id": "$python(instance_id)", |
| "component_type": "$python(rw_component_type)" |
| }, |
| "settings": { |
| "rwmsg": { |
| "multi_broker": { |
| "enable": False |
| } |
| }, |
| "rwdtsrouter": { |
| "multi_dtsrouter": { |
| "enable": True |
| } |
| }, |
| "rwvcs": { |
| "collapse_each_rwvm": False, |
| "collapse_each_rwprocess": False |
| } |
| } |
| }) |
| manifest.inventory = rwmanifest.Inventory.from_dict({ |
| "component": [ |
| { |
| "component_name": "master", |
| "component_type": "RWCOLLECTION", |
| "rwcollection": { |
| "collection_type": "rwcolony", |
| "event_list": { |
| "event": [{ |
| "name": "onentry", |
| "action": [{ |
| "name": "Start vm-launchpad for master", |
| "start": { |
| "python_variable": ["vm_ip_address = '127.0.0.1'"], |
| "component_name": "vm-launchpad", |
| "instance_id": "1", |
| "config_ready": True |
| } |
| }] |
| }] |
| } |
| } |
| }, |
| { |
| "component_name": "vm-launchpad", |
| "component_type": "RWVM", |
| "rwvm": { |
| "leader": True, |
| "event_list": { |
| "event": [{ |
| "name": "onentry", |
| "action": [ |
| { |
| "name": "Start the master", |
| "start": { |
| "component_name": "master", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.Proc_1.Restconf", |
| "start": { |
| "component_name": "RW.Proc_1.Restconf", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.Proc_3.CalProxy", |
| "start": { |
| "component_name": "RW.Proc_3.CalProxy", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.Proc_4.nfvi-metrics-monitor", |
| "start": { |
| "component_name": "RW.Proc_4.nfvi-metrics-monitor", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.Proc_5.network-services-manager", |
| "start": { |
| "component_name": "RW.Proc_5.network-services-manager", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.Proc_6.virtual-network-function-manager", |
| "start": { |
| "component_name": "RW.Proc_6.virtual-network-function-manager", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.Proc_7.virtual-network-service", |
| "start": { |
| "component_name": "RW.Proc_7.virtual-network-service", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.Proc_8.nfvi-metrics-monitor", |
| "start": { |
| "component_name": "RW.Proc_8.nfvi-metrics-monitor", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.MC.UI", |
| "start": { |
| "component_name": "RW.MC.UI", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| # { |
| # "name": "Start the RW.COMPOSER.UI", |
| # "start": { |
| # "component_name": "RW.COMPOSER.UI", |
| # "config_ready": True |
| # } |
| # }, |
| { |
| "name": "Start the RW.Proc_10.launchpad", |
| "start": { |
| "component_name": "RW.Proc_10.launchpad", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.Proc_11.Resource-Manager", |
| "start": { |
| "component_name": "RW.Proc_11.Resource-Manager", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the RW.uAgent", |
| "start": { |
| "python_variable": ["cmdargs_str = '--confd-proto AF_INET --confd-ip 127.0.0.1'"], |
| "component_name": "RW.uAgent", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| }, |
| { |
| "name": "Start the logd", |
| "start": { |
| "component_name": "logd", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| } |
| } |
| ] |
| }] |
| } |
| } |
| }, |
| # { |
| # "component_name": "RW.CLI", |
| # "component_type": "PROC", |
| # "native_proc": { |
| # "exe_path": "./usr/bin/rwcli", |
| # "args": "--netconf_host 127.0.0.1 --netconf_port 2022 --schema_listing cli_launchpad_schema_listing.txt", |
| # } |
| # }, |
| { |
| "component_name": "RW.Proc_1.Restconf", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start RW.Restconf for RW.Proc_1.Restconf", |
| "component_name": "RW.Restconf", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "RW.Restconf", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/restconf", |
| "plugin_name": "restconf" |
| } |
| }, |
| { |
| "component_name": "RW.Proc_3.CalProxy", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start RW.CalProxy for RW.Proc_3.CalProxy", |
| "component_name": "RW.CalProxy", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "RW.CalProxy", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwcalproxytasklet", |
| "plugin_name": "rwcalproxytasklet" |
| } |
| }, |
| { |
| "component_name": "RW.Proc_4.nfvi-metrics-monitor", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start nfvi-metrics-monitor for RW.Proc_4.nfvi-metrics-monitor", |
| "component_name": "nfvi-metrics-monitor", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "nfvi-metrics-monitor", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwmonitor", |
| "plugin_name": "rwmonitor" |
| } |
| }, |
| { |
| "component_name": "RW.Proc_5.network-services-manager", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start network-services-manager for RW.Proc_5.network-services-manager", |
| "component_name": "network-services-manager", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "network-services-manager", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwnsmtasklet", |
| "plugin_name": "rwnsmtasklet" |
| } |
| }, |
| { |
| "component_name": "RW.Proc_6.virtual-network-function-manager", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start virtual-network-function-manager for RW.Proc_6.virtual-network-function-manager", |
| "component_name": "virtual-network-function-manager", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "virtual-network-function-manager", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwvnfmtasklet", |
| "plugin_name": "rwvnfmtasklet" |
| } |
| }, |
| { |
| "component_name": "RW.Proc_7.virtual-network-service", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start virtual-network-service for RW.Proc_7.virtual-network-service", |
| "component_name": "virtual-network-service", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "virtual-network-service", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwvnstasklet", |
| "plugin_name": "rwvnstasklet" |
| } |
| }, |
| { |
| "component_name": "RW.Proc_8.nfvi-metrics-monitor", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start nfvi-metrics-monitor for RW.Proc_8.nfvi-metrics-monitor", |
| "component_name": "nfvi-metrics-monitor", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "RW.MC.UI", |
| "component_type": "PROC", |
| "native_proc": { |
| "exe_path": "./usr/share/rw.ui/skyquake/scripts/launch_ui.sh", |
| } |
| }, |
| { |
| "component_name": "RW.COMPOSER.UI", |
| "component_type": "PROC", |
| "native_proc": { |
| "exe_path": "./usr/share/composer/scripts/launch_composer.sh", |
| } |
| }, |
| { |
| "component_name": "RW.Proc_9.Configuration-Manager", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start Configuration-Manager for RW.Proc_9.Configuration-Manager", |
| "component_name": "Configuration-Manager", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "Configuration-Manager", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwconmantasklet", |
| "plugin_name": "rwconmantasklet" |
| } |
| }, |
| { |
| "component_name": "RW.Proc_10.launchpad", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start launchpad for RW.Proc_10.launchpad", |
| "component_name": "launchpad", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "launchpad", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwlaunchpad", |
| "plugin_name": "rwlaunchpad" |
| } |
| }, |
| { |
| "component_name": "RW.Proc_11.Resource-Manager", |
| "component_type": "RWPROC", |
| "rwproc": { |
| "tasklet": [{ |
| "name": "Start Resource-Manager for RW.Proc_11.Resource-Manager", |
| "component_name": "Resource-Manager", |
| "recovery_action": "RESTART", |
| "config_ready": True |
| }] |
| } |
| }, |
| { |
| "component_name": "Resource-Manager", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwresmgrtasklet", |
| "plugin_name": "rwresmgrtasklet" |
| } |
| }, |
| { |
| "component_name": "RW.uAgent", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwuagent-c", |
| "plugin_name": "rwuagent-c" |
| } |
| }, |
| { |
| "component_name": "logd", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwlogd-c", |
| "plugin_name": "rwlogd-c" |
| } |
| }, |
| { |
| "component_name": "msgbroker", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwmsgbroker-c", |
| "plugin_name": "rwmsgbroker-c" |
| } |
| }, |
| { |
| "component_name": "dtsrouter", |
| "component_type": "RWTASKLET", |
| "rwtasklet": { |
| "plugin_directory": "./usr/lib/rift/plugins/rwdtsrouter-c", |
| "plugin_name": "rwdtsrouter-c" |
| } |
| } |
| ] |
| }) |
| return manifest |
| |
| def tearDown(self): |
| tasklist = { 'reaperd', |
| 'rwlogd-report-c', |
| 'launch_ui.sh' } |
| for proc in psutil.process_iter(): |
| if proc.name() in tasklist: |
| print("killing", proc.name()) |
| try: |
| proc.kill() |
| except: |
| print(proc.name(), "no longer exists") |
| self.loop.stop() |
| self.loop.close() |
| |
| |
| class LaunchPadTest(LaunchPad): |
| """ |
| DTS GI interface unittests |
| |
| Note: Each tests uses a list of asyncio.Events for staging through the |
| test. These are required here because we are bring up each coroutine |
| ("tasklet") at the same time and are not implementing any re-try |
| mechanisms. For instance, this is used in numerous tests to make sure that |
| a publisher is up and ready before the subscriber sends queries. Such |
| event lists should not be used in production software. |
| """ |
| @asyncio.coroutine |
| def inventory(self): |
| res_iter = yield from self.dts_mgmt.query_read('/rw-base:vcs/rw-base:info', flags=0) |
| for i in res_iter: |
| info_result = yield from i |
| components = info_result.result.components.component_info |
| recvd_list = {} |
| for component in components: |
| recvd_list[component.component_name] = (component.instance_id, |
| component.rwcomponent_parent, |
| component.component_type, |
| component.state) |
| return recvd_list |
| |
| @asyncio.coroutine |
| def issue_vcrash(self, component_type): |
| # critical_components = {'msgbroker', 'dtsrouter'} |
| critical_components = {'msgbroker', 'dtsrouter', 'RW.uAgent'} |
| comp_inventory = yield from self.inventory() |
| for component in comp_inventory: |
| if ((comp_inventory[component])[2] == component_type): |
| inst = (comp_inventory[component])[0] |
| if (component in critical_components): |
| print(component, 'Marked as CRITICAL - Not restarting') |
| else: |
| print('Crashing ', component_type,component) |
| vcrash_input = rwvcs.VCrashInput(instance_name=component+'-'+str(inst)) |
| query_iter = yield from self.dts_mgmt.query_rpc( xpath="/rw-vcs:vcrash", |
| flags=0, msg=vcrash_input) |
| yield from asyncio.sleep(1, loop=self.loop) |
| restarted_inventory = yield from self.inventory() |
| self.assertTrue(restarted_inventory[component][3] != 'TO_RECOVER') |
| |
| def test_launch_pad(self): |
| """ |
| Verify the launchpad setup functions |
| The test will progress through stages defined by the events list: |
| 0: mission_control setup is brought up |
| 2: Tasklet/PROC/VM restarts tested to confirm recovery is proper |
| """ |
| |
| print("{{{{{{{{{{{{{{{{{{{{STARTING - mano recovery test") |
| # confd_host="127.0.0.1" |
| |
| events = [asyncio.Event(loop=self.loop) for _ in range(2)] |
| |
| @asyncio.coroutine |
| def sub(): |
| |
| tinfo = self.new_tinfo('sub') |
| self.dts_mgmt = rift.tasklets.DTS(tinfo, self.schema, self.loop) |
| |
| # Sleep for DTS registrations to complete |
| print('.........................................................') |
| print('........SLEEPING 80 seconds for system to come up........') |
| yield from asyncio.sleep(80, loop=self.loop) |
| print('........RESUMING........') |
| |
| @asyncio.coroutine |
| def issue_vstop(component,inst,flag=0): |
| vstop_input = rwvcs.VStopInput(instance_name=component+'-'+(str(inst))) |
| query_iter = yield from self.dts_mgmt.query_rpc( xpath="/rw-vcs:vstop", |
| flags=flag, msg=vstop_input) |
| yield from asyncio.sleep(1, loop=self.loop) |
| |
| |
| |
| @asyncio.coroutine |
| def issue_vstart(component, parent, recover=False): |
| vstart_input = rwvcs.VStartInput() |
| vstart_input.component_name = component |
| vstart_input.parent_instance = parent |
| vstart_input.recover = recover |
| query_iter = yield from self.dts_mgmt.query_rpc( xpath="/rw-vcs:vstart", |
| flags=0, msg=vstart_input) |
| yield from asyncio.sleep(1, loop=self.loop) |
| |
| @asyncio.coroutine |
| def issue_start_stop(comp_inventory, component_type): |
| # critical_components = {'msgbroker', 'dtsrouter'} |
| critical_components = {'msgbroker', 'dtsrouter', 'RW.uAgent'} |
| for component in comp_inventory: |
| if ((comp_inventory[component])[2] == component_type): |
| inst = (comp_inventory[component])[0] |
| parent = (comp_inventory[component])[1] |
| if (component in critical_components): |
| print(component, 'Marked as CRITICAL - Not restarting') |
| else: |
| print('Stopping ', component_type,component) |
| yield from issue_vstop(component,inst) |
| restarted_inventory = yield from self.inventory() |
| # self.assertEqual(restarted_inventory[component][3],'TO_RECOVER') |
| print('Starting ',component_type,component) |
| yield from issue_vstart(component, parent, recover=True) |
| restarted_inventory = yield from self.inventory() |
| self.assertTrue(restarted_inventory[component][3] != 'TO_RECOVER') |
| |
| yield from asyncio.sleep(20, loop=self.loop) |
| comp_inventory = yield from self.inventory() |
| yield from issue_start_stop(comp_inventory, 'RWTASKLET') |
| # yield from issue_start_stop(comp_inventory, 'RWPROC') |
| # yield from self.issue_vcrash('RWTASKLET') |
| |
| yield from asyncio.sleep(20, loop=self.loop) |
| restarted_inventory = yield from self.inventory() |
| # critical_components = {'msgbroker', 'dtsrouter', 'RW.uAgent'} |
| for comp in comp_inventory: |
| self.assertEqual(str(comp_inventory[comp]), str(restarted_inventory[comp])) |
| # if (comp not in critical_components): |
| # inst = (comp_inventory[comp])[0] |
| # yield from issue_vstop(comp,inst) |
| |
| events[1].set() |
| |
| asyncio.ensure_future(sub(), loop=self.loop) |
| self.run_until(events[1].is_set, timeout=260) |
| |
| |
| def main(): |
| plugin_dir = os.path.join(os.environ["RIFT_INSTALL"], "usr/lib/rift/plugins") |
| if 'DTS_TEST_PUB_DIR' not in os.environ: |
| os.environ['DTS_TEST_PUB_DIR'] = os.path.join(plugin_dir, 'dtstestpub') |
| |
| if 'RIFT_NO_SUDO_REAPER' not in os.environ: |
| os.environ['RIFT_NO_SUDO_REAPER'] = '1' |
| |
| if 'MESSAGE_BROKER_DIR' not in os.environ: |
| os.environ['MESSAGE_BROKER_DIR'] = os.path.join(plugin_dir, 'rwmsgbroker-c') |
| |
| if 'ROUTER_DIR' not in os.environ: |
| os.environ['ROUTER_DIR'] = os.path.join(plugin_dir, 'rwdtsrouter-c') |
| |
| if 'RW_VAR_RIFT' not in os.environ: |
| os.environ['RW_VAR_RIFT'] = '1' |
| |
| if 'INSTALLDIR' in os.environ: |
| os.chdir(os.environ.get('INSTALLDIR')) |
| |
| # if 'RWMSG_BROKER_SHUNT' not in os.environ: |
| # os.environ['RWMSG_BROKER_SHUNT'] = '1' |
| |
| if 'TEST_ENVIRON' not in os.environ: |
| os.environ['TEST_ENVIRON'] = '1' |
| |
| if 'RW_MANIFEST' not in os.environ: |
| os.environ['RW_MANIFEST'] = os.path.join(install_dir, 'lptestmanifest.xml') |
| |
| parser = argparse.ArgumentParser() |
| parser.add_argument('-v', '--verbose', action='store_true') |
| args, _ = parser.parse_known_args() |
| |
| |
| runner = xmlrunner.XMLTestRunner(output=os.environ["RIFT_MODULE_TEST"]) |
| unittest.main(testRunner=runner) |
| |
| if __name__ == '__main__': |
| main() |
| |
| # vim: sw=4 |