Sleds/nightly_orchestration/test_controller.py

106 lines
3.7 KiB
Python
Raw Normal View History

2025-03-13 21:28:38 +00:00
#######################################################################
#
# This class is used to test each QA server on whether packages are successfully
# processed through SLEDS, utilizing the orc.sh script. The test will return
# a zero if it succeeds. The test is meant to be executed nightly, called by
# Jenkins, with the result affecting each QA server's test status on the
# docserver homepage.
#
# Note that java code actually checks this directory for the package: /sl/SLSync/testdata/NO_PI/src/
#
# Developer: Craig Millis
# Date: 060117
#
#######################################################################
import sys, os.path, subprocess, datetime, json, glob, getpass
class TestController:
msg = ''
test_result = 0
test_dir = '/group/it/auto_test/nightly_orchestration/packages'
network = 'SLCustomer_Test_Data'
workorder = 'SampleTestWorkorder'
test_results_dir = './test_results'
stdout_dir = './stdout'
def __init__(self):
dt_start = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
self.path_to_packages = os.path.abspath(self.test_dir) + '/' + self.network + '/' + self.workorder
if not os.path.exists(self.stdout_dir):
os.makedirs(self.stdout_dir)
if not os.path.exists(self.test_results_dir):
os.makedirs(self.test_results_dir)
self.set_packages()
for package in self.packages:
print package
self.process_package(package)
p = subprocess.Popen( ['facter'], stdout=subprocess.PIPE )
p.wait()
facts = p.stdout.readlines()
facts = dict(k.split(' => ') for k in [s.strip() for s in facts if ' => ' in s])
data = {}
if os.environ['myenv']:
myenv = os.environ['myenv']
else:
myenv = 'unknown'
data['myenv'] = myenv
data['test_result'] = self.test_result
data['dt_start'] = dt_start
data['dt_end'] = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
data['ipaddress'] = facts['ipaddress']
data['msg'] = self.msg
from pprint import pprint
pprint(data)
with open(self.test_results_dir + '/' + myenv + '.json', 'w') as outfile:
json.dump(data, outfile)
def process_package(self, package):
file_path = self.path_to_packages + '/' + package
stdout_path = self.stdout_dir + '/' + os.path.splitext(package)[0] + '.txt'
print stdout_path
if os.path.exists(stdout_path):
os.remove(stdout_path)
if os.path.exists(file_path) == False:
msg = '|Missing ' + os.path.abspath(file_path) + '...continuing'
self.msg = self.msg + msg
return
else:
msg = '|Processing ' + os.path.basename(file_path)
self.msg = self.msg + msg
print msg
cli = "/sequencelogic/bin/orc.sh -f '" + package + "' --test-directory " + os.path.abspath(self.test_dir) + " com.sequencelogic.robot.workflow.Orchestration 2>&1 | tee '" + stdout_path + "' ; test ${PIPESTATUS[0]} -eq 0"
print cli
test_result = 0 #this is used if next line is omitted (for testing this script)
if getpass.getuser() == 'sequencelogic':
print 'user is sequencelogic'
test_result = subprocess.call([cli], shell=True)
self.msg = self.msg + '|test_result: ' + str(test_result)
self.test_result = max(test_result, self.test_result)
def set_packages(self):
self.msg = self.msg + '|Getting packages from ' + self.path_to_packages
#get all pdf files in the test_dir
current_dir = os.path.abspath('.')
os.chdir(self.path_to_packages)
self.packages = glob.glob("*.pdf")
os.chdir(current_dir)
from pprint import pprint
pprint(self.packages)
#only process certain packages
#self.packages = self.packages[7:8]
#from pprint import pprint
#pprint(self.packages)