diff options
Diffstat (limited to 'testcases')
-rwxr-xr-x | testcases/Controllers/ODL/OpenDaylightTesting.py | 2 | ||||
-rw-r--r-- | testcases/Controllers/ONOS/Sfc/Sfc.py | 1 | ||||
-rwxr-xr-x | testcases/Controllers/ONOS/Teston/onosfunctest.py | 1 | ||||
-rwxr-xr-x | testcases/OpenStack/rally/run_rally-cert.py | 2 | ||||
-rwxr-xr-x | testcases/OpenStack/tempest/gen_tempest_conf.py | 2 | ||||
-rwxr-xr-x | testcases/OpenStack/tempest/run_tempest.py | 7 | ||||
-rw-r--r-- | testcases/OpenStack/vPing/vping_util.py | 1 | ||||
-rwxr-xr-x | testcases/features/copper.py | 5 | ||||
-rwxr-xr-x | testcases/features/doctor.py | 5 | ||||
-rwxr-xr-x | testcases/features/domino.py | 5 | ||||
-rwxr-xr-x | testcases/features/promise.py | 1 | ||||
-rwxr-xr-x | testcases/features/sfc/sfc.py | 106 | ||||
-rw-r--r-- | testcases/vnf/vIMS/orchestrator.py | 103 | ||||
-rwxr-xr-x | testcases/vnf/vIMS/vIMS.py | 8 | ||||
-rwxr-xr-x | testcases/vnf/vRNC/parser.py | 5 |
15 files changed, 114 insertions, 140 deletions
diff --git a/testcases/Controllers/ODL/OpenDaylightTesting.py b/testcases/Controllers/ODL/OpenDaylightTesting.py index 22df9f667..173de87f9 100755 --- a/testcases/Controllers/ODL/OpenDaylightTesting.py +++ b/testcases/Controllers/ODL/OpenDaylightTesting.py @@ -172,7 +172,7 @@ class ODLTestCases: details['description'] = result.suite.name details['tests'] = visitor.get_data() if not ft_utils.push_results_to_db( - "functest", "odl", cls.logger, start_time, stop_time, + "functest", "odl", start_time, stop_time, result.suite.status, details): cls.logger.error("Cannot push ODL results to DB") return False diff --git a/testcases/Controllers/ONOS/Sfc/Sfc.py b/testcases/Controllers/ONOS/Sfc/Sfc.py index a52019875..99d07aaed 100644 --- a/testcases/Controllers/ONOS/Sfc/Sfc.py +++ b/testcases/Controllers/ONOS/Sfc/Sfc.py @@ -217,7 +217,6 @@ class Sfc: logger.info("Result is " + status) functest_utils.push_results_to_db("functest", "onos_sfc", - logger, start_time, stop_time, status, diff --git a/testcases/Controllers/ONOS/Teston/onosfunctest.py b/testcases/Controllers/ONOS/Teston/onosfunctest.py index 2790e6941..717df82aa 100755 --- a/testcases/Controllers/ONOS/Teston/onosfunctest.py +++ b/testcases/Controllers/ONOS/Teston/onosfunctest.py @@ -249,7 +249,6 @@ def OnosTest(): functest_utils.push_results_to_db("functest", "onos", - logger, start_time, stop_time, status, diff --git a/testcases/OpenStack/rally/run_rally-cert.py b/testcases/OpenStack/rally/run_rally-cert.py index 43096c19e..e04ecbc52 100755 --- a/testcases/OpenStack/rally/run_rally-cert.py +++ b/testcases/OpenStack/rally/run_rally-cert.py @@ -359,7 +359,6 @@ def run_task(test_name): logger.debug("Push Rally detailed results into DB") functest_utils.push_results_to_db("functest", "Rally_details", - logger, start_time, stop_time, status, @@ -492,7 +491,6 @@ def main(): logger.debug("Pushing Rally summary into DB...") functest_utils.push_results_to_db("functest", case_name, - logger, start_time, stop_time, status, diff --git a/testcases/OpenStack/tempest/gen_tempest_conf.py b/testcases/OpenStack/tempest/gen_tempest_conf.py index 4aa814a51..688a92402 100755 --- a/testcases/OpenStack/tempest/gen_tempest_conf.py +++ b/testcases/OpenStack/tempest/gen_tempest_conf.py @@ -116,7 +116,7 @@ def main(): if not os.path.exists(TEMPEST_RESULTS_DIR): os.makedirs(TEMPEST_RESULTS_DIR) - deployment_dir = ft_utils.get_deployment_dir(logger) + deployment_dir = ft_utils.get_deployment_dir() configure_tempest_multisite(deployment_dir) diff --git a/testcases/OpenStack/tempest/run_tempest.py b/testcases/OpenStack/tempest/run_tempest.py index fbb65dbb7..3fa9b368e 100755 --- a/testcases/OpenStack/tempest/run_tempest.py +++ b/testcases/OpenStack/tempest/run_tempest.py @@ -164,7 +164,7 @@ def configure_tempest(deployment_dir): logger.debug("Generating new tempest.conf file...") cmd = "rally verify genconfig" - ft_utils.execute_command(cmd, logger) + ft_utils.execute_command(cmd) logger.debug("Finding tempest.conf file...") if not os.path.isfile(tempest_conf_file): @@ -226,7 +226,7 @@ def generate_test_list(deployment_dir, mode): testr_mode = 'tempest.api.' + mode cmd = ("cd " + deployment_dir + ";" + "testr list-tests " + testr_mode + ">" + TEMPEST_RAW_LIST + ";cd") - ft_utils.execute_command(cmd, logger) + ft_utils.execute_command(cmd) def apply_tempest_blacklist(): @@ -371,7 +371,6 @@ def run_tempest(OPTION): try: ft_utils.push_results_to_db("functest", case_name, - None, start_time, stop_time, status, @@ -397,7 +396,7 @@ def main(): if not os.path.exists(TEMPEST_RESULTS_DIR): os.makedirs(TEMPEST_RESULTS_DIR) - deployment_dir = ft_utils.get_deployment_dir(logger) + deployment_dir = ft_utils.get_deployment_dir() create_tempest_resources() if "" == args.conf: diff --git a/testcases/OpenStack/vPing/vping_util.py b/testcases/OpenStack/vPing/vping_util.py index 8e9ce23ec..bdd118118 100644 --- a/testcases/OpenStack/vPing/vping_util.py +++ b/testcases/OpenStack/vPing/vping_util.py @@ -453,7 +453,6 @@ def push_result(report, case, start_time, stop_time, details): logger.debug("Pushing vPing %s results into DB..." % case) ft_utils.push_results_to_db('functest', case, - logger, start_time, stop_time, details['status'], diff --git a/testcases/features/copper.py b/testcases/features/copper.py index 73def7db2..b1df99a52 100755 --- a/testcases/features/copper.py +++ b/testcases/features/copper.py @@ -40,7 +40,7 @@ def main(): start_time = time.time() - ret_val = functest_utils.execute_command(cmd, logger, exit_on_error=False) + ret_val = functest_utils.execute_command(cmd, exit_on_error=False) stop_time = time.time() duration = round(stop_time - start_time, 1) @@ -56,14 +56,13 @@ def main(): 'duration': duration, 'status': test_status, } - functest_utils.logger_test_results(logger, "Copper", + functest_utils.logger_test_results("Copper", "copper-notification", details['status'], details) try: if args.report: functest_utils.push_results_to_db("copper", "copper-notification", - logger, start_time, stop_time, details['status'], diff --git a/testcases/features/doctor.py b/testcases/features/doctor.py index 6e6f26f37..5fc0713f9 100755 --- a/testcases/features/doctor.py +++ b/testcases/features/doctor.py @@ -38,7 +38,7 @@ def main(): cmd = 'cd %s/tests && ./run.sh' % DOCTOR_REPO start_time = time.time() - ret = functest_utils.execute_command(cmd, logger, info=True, + ret = functest_utils.execute_command(cmd, info=True, exit_on_error=False) stop_time = time.time() @@ -59,13 +59,12 @@ def main(): status = "FAIL" if details['status'] == "OK": status = "PASS" - functest_utils.logger_test_results(logger, "Doctor", + functest_utils.logger_test_results("Doctor", "doctor-notification", status, details) if args.report: functest_utils.push_results_to_db("doctor", "doctor-notification", - logger, start_time, stop_time, status, diff --git a/testcases/features/domino.py b/testcases/features/domino.py index cc98f546d..aaf38047b 100755 --- a/testcases/features/domino.py +++ b/testcases/features/domino.py @@ -39,7 +39,7 @@ def main(): cmd = 'cd %s && ./tests/run_multinode.sh' % DOMINO_REPO start_time = time.time() - ret = functest_utils.execute_command(cmd, logger, exit_on_error=False) + ret = functest_utils.execute_command(cmd, exit_on_error=False) stop_time = time.time() duration = round(stop_time - start_time, 1) @@ -65,14 +65,13 @@ def main(): elif details['status'] == "SKIPPED": status = "SKIP" - functest_utils.logger_test_results(logger, "Domino", + functest_utils.logger_test_results("Domino", "domino-multinode", status, details) if args.report: if status is not "SKIP": functest_utils.push_results_to_db("domino", "domino-multinode", - logger, start_time, stop_time, status, diff --git a/testcases/features/promise.py b/testcases/features/promise.py index 3f58dcee8..47e360ca3 100755 --- a/testcases/features/promise.py +++ b/testcases/features/promise.py @@ -242,7 +242,6 @@ def main(): functest_utils.push_results_to_db("promise", "promise", - logger, start_time, stop_time, status, diff --git a/testcases/features/sfc/sfc.py b/testcases/features/sfc/sfc.py index 3cf1052b6..4f08d23da 100755 --- a/testcases/features/sfc/sfc.py +++ b/testcases/features/sfc/sfc.py @@ -260,15 +260,16 @@ def main(): try: while 1: - (stdin, stdout, stderr) = ssh.exec_command("ps lax | grep python") - if "vxlan_tool.py" in stdout.readlines()[0]: + (stdin, stdout, stderr) = ssh.exec_command( + "ps aux | grep \"vxlan_tool.py\" | grep -v grep") + if len(stdout.readlines()) > 0: logger.debug("HTTP firewall started") break else: logger.debug("HTTP firewall not started") time.sleep(3) - except: - logger.error("vxlan_tool not started in SF1") + except Exception: + logger.exception("vxlan_tool not started in SF1") # SSH TO START THE VXLAN_TOOL ON SF2 try: @@ -284,15 +285,16 @@ def main(): try: while 1: - (stdin, stdout, stderr) = ssh.exec_command("ps lax | grep python") - if "vxlan_tool.py" in stdout.readlines()[0]: + (stdin, stdout, stderr) = ssh.exec_command( + "ps aux | grep \"vxlan_tool.py\" | grep -v grep") + if len(stdout.readlines()) > 0: logger.debug("SSH firewall started") break else: logger.debug("SSH firewall not started") time.sleep(3) - except: - logger.error("vxlan_tool not started in SF2") + except Exception: + logger.exception("vxlan_tool not started in SF2") # SSH to modify the classification flows in compute @@ -303,51 +305,55 @@ def main(): shell=True, stdout=subprocess.PIPE) - # SSH TO EXECUTE cmd_client + logger.info("Waiting for 60 seconds before TEST") + for j in range(0, 6): + logger.info("Test starting in {0} seconds".format(str((6 - j)*10))) + time.sleep(10) + i = 0 + + # SSH TO EXECUTE cmd_client logger.info("TEST STARTED") try: ssh.connect(floatip_client, username="root", password="opnfv", timeout=2) command = "nc -w 5 -zv " + instance_ip_2 + " 22 2>&1" (stdin, stdout, stderr) = ssh.exec_command(command) + + # WRITE THE CORRECT WAY TO DO LOGGING + if "timed out" in stdout.readlines()[0]: + logger.info('\033[92m' + "TEST 1 [PASSED] " + "==> SSH BLOCKED" + '\033[0m') + i = i + 1 + else: + logger.error('\033[91m' + "TEST 1 [FAILED] " + "==> SSH NOT BLOCKED" + '\033[0m') + return except: logger.debug("Waiting for %s..." % floatip_client) time.sleep(6) # timeout -= 1 - # WRITE THE CORRECT WAY TO DO LOGGING - i = 0 - if "timed out" in stdout.readlines()[0]: - logger.info('\033[92m' + "TEST 1 [PASSED] " - "==> SSH BLOCKED" + '\033[0m') - i = i + 1 - else: - logger.error('\033[91m' + "TEST 1 [FAILED] " - "==> SSH NOT BLOCKED" + '\033[0m') - return - # SSH TO EXECUTE cmd_client - try: ssh.connect(floatip_client, username="root", password="opnfv", timeout=2) command = "nc -w 5 -zv " + instance_ip_2 + " 80 2>&1" (stdin, stdout, stderr) = ssh.exec_command(command) + + if "succeeded" in stdout.readlines()[0]: + logger.info('\033[92m' + "TEST 2 [PASSED] " + "==> HTTP WORKS" + '\033[0m') + i = i + 1 + else: + logger.error('\033[91m' + "TEST 2 [FAILED] " + "==> HTTP BLOCKED" + '\033[0m') + return except: logger.debug("Waiting for %s..." % floatip_client) time.sleep(6) # timeout -= 1 - if "succeeded" in stdout.readlines()[0]: - logger.info('\033[92m' + "TEST 2 [PASSED] " - "==> HTTP WORKS" + '\033[0m') - i = i + 1 - else: - logger.error('\033[91m' + "TEST 2 [FAILED] " - "==> HTTP BLOCKED" + '\033[0m') - return - # CHANGE OF CLASSIFICATION # logger.info("Changing the classification") tacker_classi = "/home/opnfv/repos/functest/testcases/features/sfc/" + \ @@ -373,48 +379,47 @@ def main(): password="opnfv", timeout=2) command = "nc -w 5 -zv " + instance_ip_2 + " 80 2>&1" (stdin, stdout, stderr) = ssh.exec_command(command) + + if "timed out" in stdout.readlines()[0]: + logger.info('\033[92m' + "TEST 3 [WORKS] " + "==> HTTP BLOCKED" + '\033[0m') + i = i + 1 + else: + logger.error('\033[91m' + "TEST 3 [FAILED] " + "==> HTTP NOT BLOCKED" + '\033[0m') + return except: logger.debug("Waiting for %s..." % floatip_client) time.sleep(6) # timeout -= 1 - if "timed out" in stdout.readlines()[0]: - logger.info('\033[92m' + "TEST 3 [WORKS] " - "==> HTTP BLOCKED" + '\033[0m') - i = i + 1 - else: - logger.error('\033[91m' + "TEST 3 [FAILED] " - "==> HTTP NOT BLOCKED" + '\033[0m') - return - # SSH TO EXECUTE cmd_client - try: ssh.connect(floatip_client, username="root", password="opnfv", timeout=2) command = "nc -w 5 -zv " + instance_ip_2 + " 22 2>&1" (stdin, stdout, stderr) = ssh.exec_command(command) + + if "succeeded" in stdout.readlines()[0]: + logger.info('\033[92m' + "TEST 4 [WORKS] " + "==> SSH WORKS" + '\033[0m') + i = i + 1 + else: + logger.error('\033[91m' + "TEST 4 [FAILED] " + "==> SSH BLOCKED" + '\033[0m') + return except: logger.debug("Waiting for %s..." % floatip_client) time.sleep(6) # timeout -= 1 - if "succeeded" in stdout.readlines()[0]: - logger.info('\033[92m' + "TEST 4 [WORKS] " - "==> SSH WORKS" + '\033[0m') - i = i + 1 - else: - logger.error('\033[91m' + "TEST 4 [FAILED] " - "==> SSH BLOCKED" + '\033[0m') - return - if i == 4: for x in range(0, 5): logger.info('\033[92m' + "SFC TEST WORKED" " :) \n" + '\033[0m') # TODO report results to DB - # functest_utils.logger_test_results(logger, "SFC", + # functest_utils.logger_test_results("SFC", # "odl-sfc", # status, details) # see doctor, promise, domino, ... @@ -422,7 +427,6 @@ def main(): # logger.info("Pushing odl-SFC results") # functest_utils.push_results_to_db("functest", # "odl-sfc", - # logger, # start_time, # stop_time, # status, diff --git a/testcases/vnf/vIMS/orchestrator.py b/testcases/vnf/vIMS/orchestrator.py index 3da3fb063..3e5117ffd 100644 --- a/testcases/vnf/vIMS/orchestrator.py +++ b/testcases/vnf/vIMS/orchestrator.py @@ -10,22 +10,26 @@ # which accompanies this distribution, and is available at # http://www.apache.org/licenses/LICENSE-2.0 ######################################################################## -import subprocess32 as subprocess + import os import shutil +import subprocess32 as subprocess import yaml + from git import Repo +import functest.utils.functest_logger as ft_logger + class orchestrator: - def __init__(self, testcase_dir, inputs={}, logger=None): + def __init__(self, testcase_dir, inputs={}): self.testcase_dir = testcase_dir self.blueprint_dir = testcase_dir + 'cloudify-manager-blueprint/' self.input_file = 'inputs.yaml' self.manager_blueprint = False self.config = inputs - self.logger = logger + self.logger = ft_logger.Logger("Orchestrator").getLogger() self.manager_up = False def set_credentials(self, username, password, tenant_name, auth_url): @@ -56,28 +60,22 @@ class orchestrator: if 0 < len(nameservers): self.config['dns_subnet_1'] = nameservers[0] - def set_logger(self, logger): - self.logger = logger - def download_manager_blueprint(self, manager_blueprint_url, manager_blueprint_branch): if self.manager_blueprint: - if self.logger: - self.logger.info( - "cloudify manager server blueprint is " - "already downloaded !") + self.logger.info( + "cloudify manager server blueprint is " + "already downloaded !") else: - if self.logger: - self.logger.info( - "Downloading the cloudify manager server blueprint") - download_result = download_blueprints( + self.logger.info( + "Downloading the cloudify manager server blueprint") + download_result = self._download_blueprints( manager_blueprint_url, manager_blueprint_branch, self.blueprint_dir) if not download_result: - if self.logger: - self.logger.error("Failed to download manager blueprint") + self.logger.error("Failed to download manager blueprint") exit(-1) else: self.manager_blueprint = True @@ -87,8 +85,7 @@ class orchestrator: def deploy_manager(self): if self.manager_blueprint: - if self.logger: - self.logger.info("Writing the inputs file") + self.logger.info("Writing the inputs file") with open(self.blueprint_dir + "inputs.yaml", "w") as f: f.write(yaml.dump(self.config, default_style='"')) f.close() @@ -102,8 +99,7 @@ class orchestrator: if os.path.isfile(home + key_file): os.remove(home + key_file) - if self.logger: - self.logger.info("Launching the cloudify-manager deployment") + self.logger.info("Launching the cloudify-manager deployment") script = "set -e; " script += ("source " + self.testcase_dir + "venv_cloudify/bin/activate; ") @@ -120,14 +116,12 @@ class orchestrator: if error: return error - if self.logger: - self.logger.info("Cloudify-manager server is UP !") + self.logger.info("Cloudify-manager server is UP !") self.manager_up = True def undeploy_manager(self): - if self.logger: - self.logger.info("Launching the cloudify-manager undeployment") + self.logger.info("Launching the cloudify-manager undeployment") self.manager_up = False @@ -137,38 +131,33 @@ class orchestrator: cmd = "/bin/bash -c '" + script + "'" execute_command(cmd, self.logger) - if self.logger: - self.logger.info( - "Cloudify-manager server has been successfully removed!") + self.logger.info( + "Cloudify-manager server has been successfully removed!") def download_upload_and_deploy_blueprint(self, blueprint, config, bp_name, dep_name): - if self.logger: - self.logger.info("Downloading the {0} blueprint".format( - blueprint['file_name'])) - download_result = download_blueprints(blueprint['url'], - blueprint['branch'], - self.testcase_dir + - blueprint['destination_folder']) + self.logger.info("Downloading the {0} blueprint".format( + blueprint['file_name'])) + destination_folder = self.testcase_dir + \ + blueprint['destination_folder'] + download_result = self._download_blueprints(blueprint['url'], + blueprint['branch'], + destination_folder) if not download_result: - if self.logger: - self.logger.error( - "Failed to download blueprint {0}". - format(blueprint['file_name'])) + self.logger.error( + "Failed to download blueprint {0}". + format(blueprint['file_name'])) exit(-1) - if self.logger: - self.logger.info("Writing the inputs file") + self.logger.info("Writing the inputs file") with open(self.testcase_dir + blueprint['destination_folder'] + "/inputs.yaml", "w") as f: f.write(yaml.dump(config, default_style='"')) - f.close() - if self.logger: - self.logger.info("Launching the {0} deployment".format(bp_name)) + self.logger.info("Launching the {0} deployment".format(bp_name)) script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; " script += ("cd " + self.testcase_dir + blueprint['destination_folder'] + "; ") @@ -183,12 +172,10 @@ class orchestrator: error = execute_command(cmd, self.logger, 2000) if error: return error - if self.logger: - self.logger.info("The deployment of {0} is ended".format(dep_name)) + self.logger.info("The deployment of {0} is ended".format(dep_name)) def undeploy_deployment(self, dep_name): - if self.logger: - self.logger.info("Launching the {0} undeployment".format(dep_name)) + self.logger.info("Launching the {0} undeployment".format(dep_name)) script = "source " + self.testcase_dir + "venv_cloudify/bin/activate; " script += "cd " + self.testcase_dir + "; " script += ("cfy executions start -w uninstall -d " + dep_name + @@ -199,8 +186,16 @@ class orchestrator: try: execute_command(cmd, self.logger) except: - if self.logger: - self.logger.error("Clearwater undeployment failed") + self.logger.error("Clearwater undeployment failed") + + def _download_blueprints(blueprint_url, branch, dest_path): + if os.path.exists(dest_path): + shutil.rmtree(dest_path) + try: + Repo.clone_from(blueprint_url, dest_path, branch=branch) + return True + except: + return False def execute_command(cmd, logger, timeout=1800): @@ -237,13 +232,3 @@ def execute_command(cmd, logger, timeout=1800): result += lines[len(lines) - 2] result += lines[len(lines) - 1] return result - - -def download_blueprints(blueprint_url, branch, dest_path): - if os.path.exists(dest_path): - shutil.rmtree(dest_path) - try: - Repo.clone_from(blueprint_url, dest_path, branch=branch) - return True - except: - return False diff --git a/testcases/vnf/vIMS/vIMS.py b/testcases/vnf/vIMS/vIMS.py index 32e8fc11d..634a17952 100755 --- a/testcases/vnf/vIMS/vIMS.py +++ b/testcases/vnf/vIMS/vIMS.py @@ -117,7 +117,6 @@ def step_failure(step_name, error_msg): status = "PASS" functest_utils.push_results_to_db("functest", "vims", - None, TESTCASE_START_TIME, stop_time, status, @@ -239,7 +238,6 @@ def test_clearwater(): functest_utils.push_results_to_db("functest", "vims", - logger, TESTCASE_START_TIME, end_time_ts, status, @@ -343,7 +341,7 @@ def main(): public_auth_url = keystone.service_catalog.url_for( service_type='identity', endpoint_type='publicURL') - cfy = orchestrator(VIMS_DATA_DIR, CFY_INPUTS, logger) + cfy = orchestrator(VIMS_DATA_DIR, CFY_INPUTS) cfy.set_credentials(username=ks_creds['username'], password=ks_creds[ 'password'], tenant_name=ks_creds['tenant_name'], @@ -402,10 +400,10 @@ def main(): logger.info("Prepare virtualenv for cloudify-cli") cmd = "chmod +x " + VIMS_DIR + "create_venv.sh" - functest_utils.execute_command(cmd, logger) + functest_utils.execute_command(cmd) time.sleep(3) cmd = VIMS_DIR + "create_venv.sh " + VIMS_DATA_DIR - functest_utils.execute_command(cmd, logger) + functest_utils.execute_command(cmd) cfy.download_manager_blueprint( CFY_MANAGER_BLUEPRINT['url'], CFY_MANAGER_BLUEPRINT['branch']) diff --git a/testcases/vnf/vRNC/parser.py b/testcases/vnf/vRNC/parser.py index d22ca8ea4..37e84d87c 100755 --- a/testcases/vnf/vRNC/parser.py +++ b/testcases/vnf/vRNC/parser.py @@ -41,7 +41,6 @@ def main(): start_time = time.time() ret = functest_utils.execute_command(cmd, - logger, info=True, exit_on_error=False) stop_time = time.time() @@ -51,8 +50,7 @@ def main(): start_time, stop_time) - functest_utils.logger_test_results(logger, - project, + functest_utils.logger_test_results(project, case_name, status, details) @@ -61,7 +59,6 @@ def main(): logger.debug("Report Parser Results to DB......") functest_utils.push_results_to_db(project, case_name, - logger, start_time, stop_time, status, |