From 43a2ae004094a12b5820294f54c537ebfc2c1032 Mon Sep 17 00:00:00 2001 From: Raphael Defosseux Date: Fri, 3 Feb 2023 10:24:55 +0100 Subject: [PATCH] style(ci): using and debugging the new LocalCmd class Signed-off-by: Raphael Defosseux --- ci-scripts/cls_cmd.py | 17 +-- ci-scripts/cls_containerize.py | 253 +++++++++++++++------------------ 2 files changed, 124 insertions(+), 146 deletions(-) diff --git a/ci-scripts/cls_cmd.py b/ci-scripts/cls_cmd.py index 12eb75e7da..cd7716bc16 100644 --- a/ci-scripts/cls_cmd.py +++ b/ci-scripts/cls_cmd.py @@ -74,32 +74,27 @@ class Cmd(metaclass=abc.ABCMeta): class LocalCmd(Cmd): def __init__(self, d = None): self.cwd = d + if self.cwd is not None: + logging.debug(f'Working dir will be {self.cwd}') self.cp = sp.CompletedProcess(args='', returncode=0, stdout='') def run(self, line, timeout=300, silent=False, reportNonZero=True): - if type(line) is str: - line = [s for s in line.split(' ') if len(s) > 0] if not silent: - logging.debug(' '.join(line)) + logging.info(line) try: - ret = sp.run(line, cwd=self.cwd, stdout=sp.PIPE, stderr=sp.STDOUT, timeout=timeout) + ret = sp.run(line, shell=True, cwd=self.cwd, stdout=sp.PIPE, stderr=sp.STDOUT, timeout=timeout) except Exception as e: ret = sp.CompletedProcess(args=line, returncode=255, stdout=f'Exception: {str(e)}'.encode('utf-8')) if ret.stdout is None: ret.stdout = b'' ret.stdout = ret.stdout.decode('utf-8').strip() if reportNonZero and ret.returncode != 0: - cmd = ' '.join(ret.args) - logging.warning(f'command "{cmd}" returned non-zero returncode {ret.returncode}: output:\n{ret.stdout}') + logging.warning(f'command "{ret.args}" returned non-zero returncode {ret.returncode}: output:\n{ret.stdout}') self.cp = ret return ret def command(self, commandline, expectedline=None, timeout=300, silent=False, resync=False): - line = [s for s in commandline.split(' ') if len(s) > 0] - if line[0] == 'cd': - self.cd(line[1], silent) - else: - self.run(line, timeout, silent) + self.run(commandline, timeout, silent) return 0 def close(self): diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index ca98b967a0..44c90c994f 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -40,6 +40,7 @@ import subprocess import time import pyshark import threading +import cls_cmd from multiprocessing import Process, Lock, SimpleQueue from zipfile import ZipFile @@ -732,57 +733,42 @@ class Containerize(): sys.exit('Insufficient Parameter') if lIpAddr != 'none': logging.debug('Pulling images onto server: ' + lIpAddr) - mySSH = SSH.SSHConnection() - mySSH.open(lIpAddr, lUserName, lPassWord) + myCmd = cls_cmd.RemoteCmd(lIpAddr) else: logging.debug('Pulling images locally') + myCmd = cls_cmd.LocalCmd() cmd = 'docker login -u oaicicd -p oaicicd porcepix.sboai.cs.eurecom.fr' - if lIpAddr != 'none': - mySSH.command(cmd, '\$', 5) - response = mySSH.getBefore() - else: - response = self.run_cmd_local_host(cmd) - if re.search('Login Succeeded', response) is None: + response = myCmd.run(cmd) + if re.search('Login Succeeded', response.stdout) is None: msg = 'Could not log into local registry' logging.error(msg) - if lIpAddr != 'none': - mySSH.close() + myCmd.close() HTML.CreateHtmlTestRow(msg, 'KO', CONST.ALL_PROCESSES_OK) return False for image in self.imageToPull: tagToUse = self.ImageTagToUse(image) cmd = f'docker pull {tagToUse}' - if lIpAddr != 'none': - mySSH.command(cmd, '\$', 120) - response = mySSH.getBefore() - else: - response = self.run_cmd_local_host(cmd) - if re.search('Status: Downloaded newer image for |Status: Image is up to date for', response) is None: + response = myCmd.run(cmd, timeout=120) + if re.search('Status: Downloaded newer image for |Status: Image is up to date for', response.stdout) is None: logging.debug(response) msg = f'Could not pull {image} from local registry : {tagToUse}' logging.error(msg) - if lIpAddr != 'none': - mySSH.close() + myCmd.close() HTML.CreateHtmlTestRow('msg', 'KO', CONST.ALL_PROCESSES_OK) return False cmd = 'docker logout porcepix.sboai.cs.eurecom.fr' - if lIpAddr != 'none': - mySSH.command(cmd, '\$', 5) - response = mySSH.getBefore() - else: - response = self.run_cmd_local_host(cmd) - if re.search('Removing login credentials', response) is None: + response = myCmd.run(cmd) + if re.search('Removing login credentials', response.stdout) is None: msg = 'Could not log off from local registry' logging.error(msg) - mySSH.close() + myCmd.close() HTML.CreateHtmlTestRow(msg, 'KO', CONST.ALL_PROCESSES_OK) return False - if lIpAddr != 'none': - mySSH.close() + myCmd.close() HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) return True @@ -809,21 +795,17 @@ class Containerize(): sys.exit('Insufficient Parameter') if lIpAddr != 'none': logging.debug('Removing test images from server: ' + lIpAddr) - mySSH = SSH.SSHConnection() - mySSH.open(lIpAddr, lUserName, lPassWord) + myCmd = cls_cmd.RemoteCmd(lIpAddr) else: logging.debug('Removing test images locally') + myCmd = cls_cmd.LocalCmd() imageNames = ['oai-enb', 'oai-gnb', 'oai-lte-ue', 'oai-nr-ue', 'oai-lte-ru'] for image in imageNames: - cmd = f'docker rmi {self.ImageTagToUse(image)} || true' - if lIpAddr != 'none': - mySSH.command(cmd, '\$', 5) - else: - self.run_cmd_local_host(cmd) + cmd = f'docker rmi {self.ImageTagToUse(image)}' + myCmd.run(cmd, reportNonZero=False) - if lIpAddr != 'none': - mySSH.close() + myCmd.close() HTML.CreateHtmlTestRow('N/A', 'OK', CONST.ALL_PROCESSES_OK) return True @@ -1046,42 +1028,45 @@ class Containerize(): def DeployGenObject(self, HTML, RAN, UE): self.exitStatus = 0 logging.debug('\u001B[1m Checking Services to deploy\u001B[0m') - cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose config --services' - try: - listServices = self.run_cmd_local_host(cmd) - except Exception as e: + # Implicitly we are running locally + myCmd = cls_cmd.LocalCmd(d = self.yamlPath[0]) + cmd = 'docker-compose config --services' + listServices = myCmd.run(cmd) + if listServices.returncode != 0: + myCmd.close() self.exitStatus = 1 HTML.CreateHtmlTestRow('SVC not Found', 'KO', CONST.ALL_PROCESSES_OK) return for reqSvc in self.services[0].split(' '): - res = re.search(reqSvc, listServices) + res = re.search(reqSvc, listServices.stdout) if res is None: logging.error(reqSvc + ' not found in specified docker-compose') self.exitStatus = 1 if (self.exitStatus == 1): + myCmd.close() HTML.CreateHtmlTestRow('SVC not Found', 'KO', CONST.ALL_PROCESSES_OK) return - cmd = 'cd ' + self.yamlPath[0] + ' && cp docker-compose.y*ml docker-compose-ci.yml' - self.run_cmd_local_host(cmd, silent=self.displayedNewTags) + cmd = 'cp docker-compose.y*ml docker-compose-ci.yml' + myCmd.command(cmd, silent=self.displayedNewTags) imageNames = ['oai-enb', 'oai-gnb', 'oai-lte-ue', 'oai-nr-ue', 'oai-lte-ru'] for image in imageNames: tagToUse = self.ImageTagToUse(image) - cmd = f'cd {self.yamlPath[0]} && sed -i -e "s@oaisoftwarealliance/{image}:develop@{tagToUse}@" docker-compose-ci.yml' - self.run_cmd_local_host(cmd, silent=self.displayedNewTags) - silent=self.displayedNewTags = True + cmd = f'sed -i -e "s@oaisoftwarealliance/{image}:develop@{tagToUse}@" docker-compose-ci.yml' + myCmd.command(cmd, silent=self.displayedNewTags) + self.displayedNewTags = True - cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml up -d ' + self.services[0] - try: - deployStatus = self.run_cmd_local_host(cmd, 100) - except Exception as e: + cmd = 'docker-compose -f docker-compose-ci.yml up -d ' + self.services[0] + deployStatus = myCmd.run(cmd, timeout=100) + if deployStatus.returncode != 0: + myCmd.close() self.exitStatus = 1 logging.error('Could not deploy') HTML.CreateHtmlTestRow('Could not deploy', 'KO', CONST.ALL_PROCESSES_OK) return logging.debug('\u001B[1m Checking if all deployed healthy\u001B[0m') - cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps -a' + cmd = 'docker-compose -f docker-compose-ci.yml ps -a' count = 0 healthy = 0 restarting = 0 @@ -1089,10 +1074,10 @@ class Containerize(): while (count < 10): count += 1 containerStatus = [] - deployStatus = self.run_cmd_local_host(cmd, 30, silent=True) + deployStatus = myCmd.run(cmd, 30, silent=True) healthy = 0 restarting = 0 - for state in deployStatus.split('\n'): + for state in deployStatus.stdout.split('\n'): state = state.strip() res = re.search('Name|NAME|----------', state) if res is not None: @@ -1112,7 +1097,7 @@ class Containerize(): if re.search('\(healthy\)', state) is not None: healthy += 1 if re.search('rfsim4g-db-init.*Exit 0', state) is not None or re.search('rfsim4g-db-init.*Exited \(0\)', state) is not None: - self.run_cmd_local_host('docker rm -f rfsim4g-db-init || true', 30, silent=True) + myCmd.run('docker rm -f rfsim4g-db-init', timeout=30, silent=True, reportNonZero=False) if re.search('Restarting', state) is None: containerStatus.append(state) else: @@ -1127,10 +1112,12 @@ class Containerize(): if newCont == 'rfsim4g-db-init': continue cmd = 'docker inspect -f "{{.Config.Image}}" ' + newCont - imageName = self.run_cmd_local_host(cmd, 30, silent=True) - imageName = str(imageName).strip() + imageInspect = myCmd.run(cmd, timeout=30, silent=True) + imageName = str(imageInspect.stdout).strip() cmd = 'docker image inspect --format "{{.RepoTags}}\t{{.Size}} bytes\t{{.Created}}\t{{.Id}}" ' + imageName - imagesInfo += self.run_cmd_local_host(cmd, 30, silent=True) + imageInspect = myCmd.run(cmd, 30, silent=True) + imagesInfo += imageInspect.stdout.strip() + myCmd.close() html_queue = SimpleQueue() html_cell = '
\n'
@@ -1168,8 +1155,10 @@ class Containerize():
 			pass
 
 	def CaptureOnDockerNetworks(self):
-		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml config | grep com.docker.network.bridge.name | sed -e "s@^.*name: @@"'
-		networkNames = self.run_cmd_local_host(cmd, silent=True)
+		myCmd = cls_cmd.LocalCmd(d = self.yamlPath[0])
+		cmd = 'docker-compose -f docker-compose-ci.yml config | grep com.docker.network.bridge.name | sed -e "s@^.*name: @@"'
+		networkNames = myCmd.run(cmd, silent=True)
+		myCmd.close()
 		if re.search('4g.*rfsimulator', self.yamlPath[0]) is not None:
 			# Excluding any traffic from LTE-UE container (192.168.61.30)
 			# From the trf-gen, keeping only PING traffic
@@ -1183,7 +1172,7 @@ class Containerize():
 		else:
 			return
 		interfaces = []
-		for name in networkNames.split('\n'):
+		for name in networkNames.stdout.split('\n'):
 			if re.search('rfsim', name) is not None or re.search('l2sim', name) is not None:
 				interfaces.append(name)
 		ymlPath = self.yamlPath[0].split('/')
@@ -1195,28 +1184,30 @@ class Containerize():
 
 	def UndeployGenObject(self, HTML, RAN, UE):
 		self.exitStatus = 0
+		# Implicitly we are running locally
 		ymlPath = self.yamlPath[0].split('/')
 		logPath = '../cmake_targets/log/' + ymlPath[1]
+		myCmd = cls_cmd.LocalCmd(d = self.yamlPath[0])
 
-		cmd = 'cd ' + self.yamlPath[0] + ' && cp docker-compose.y*ml docker-compose-ci.yml'
-		self.run_cmd_local_host(cmd, silent=self.displayedNewTags)
+		cmd = 'cp docker-compose.y*ml docker-compose-ci.yml'
+		myCmd.command(cmd, silent=self.displayedNewTags)
 		imageNames = ['oai-enb', 'oai-gnb', 'oai-lte-ue', 'oai-nr-ue', 'oai-lte-ru']
 		for image in imageNames:
 			tagToUse = self.ImageTagToUse(image)
-			cmd = f'cd {self.yamlPath[0]} && sed -i -e "s@oaisoftwarealliance/{image}:develop@{tagToUse}@" docker-compose-ci.yml'
-			self.run_cmd_local_host(cmd, silent=self.displayedNewTags)
-		silent=self.displayedNewTags = True
+			cmd = f'sed -i -e "s@oaisoftwarealliance/{image}:develop@{tagToUse}@" docker-compose-ci.yml'
+			myCmd.command(cmd, silent=self.displayedNewTags)
+		self.displayedNewTags = True
 
 		# check which containers are running for log recovery later
-		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps --all'
-		deployStatusLogs = self.run_cmd_local_host(cmd, 30)
+		cmd = 'docker-compose -f docker-compose-ci.yml ps --all'
+		deployStatusLogs = myCmd.run(cmd, timeout=30)
 
 		# Stop the containers to shut down objects
 		logging.debug('\u001B[1m Stopping containers \u001B[0m')
-		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml stop -t3'
-		try:
-			deployStatus = self.run_cmd_local_host(cmd, 100)
-		except Exception as e:
+		cmd = 'docker-compose -f docker-compose-ci.yml stop -t3'
+		deployStatus = myCmd.run(cmd, timeout=100)
+		if deployStatus.returncode != 0:
+			myCmd.close()
 			self.exitStatus = 1
 			logging.error('Could not stop containers')
 			HTML.CreateHtmlTestRow('Could not stop', 'KO', CONST.ALL_PROCESSES_OK)
@@ -1224,7 +1215,12 @@ class Containerize():
 			return
 
 		anyLogs = False
-		for state in deployStatusLogs.split('\n'):
+		logging.debug('Working dir is now . (ie ci-scripts)')
+		myCmd.cwd = '.'
+		myCmd.command(f'mkdir -p {logPath}')
+		logging.debug(f'Working dir is now {logPath}')
+		myCmd.cwd = logPath
+		for state in deployStatusLogs.stdout.split('\n'):
 			res = re.search('Name|NAME|----------', state)
 			if res is not None:
 				continue
@@ -1234,33 +1230,26 @@ class Containerize():
 			if res is not None:
 				anyLogs = True
 				cName = res.group('container_name')
-				cmd = 'cd ' + self.yamlPath[0] + ' && docker logs ' + cName + ' > ' + cName + '.log 2>&1'
-				self.run_cmd_local_host(cmd, 30)
+				cmd = 'docker logs ' + cName + ' > ' + cName + '.log 2>&1'
+				myCmd.run(cmd, timeout=30, reportNonZero=False)
 				if re.search('magma-mme', cName) is not None:
-					cmd = 'cd ' + self.yamlPath[0] + ' && docker cp -L ' + cName + ':/var/log/mme.log ' + cName + '-full.log'
-					self.run_cmd_local_host(cmd, 30)
+					cmd = 'docker cp -L ' + cName + ':/var/log/mme.log ' + cName + '-full.log'
+					myCmd.run(cmd, timeout=30, reportNonZero=False)
 		fullStatus = True
 		if anyLogs:
-			cmd = 'mkdir -p '+ logPath + ' && cp ' + self.yamlPath[0] + '/*.log ' + logPath
-			deployStatus = self.run_cmd_local_host(cmd)
-
 			# Analyzing log file(s)!
 			listOfPossibleRanContainers = ['enb', 'gnb', 'cu', 'du']
 			for container in listOfPossibleRanContainers:
-				filenames = self.yamlPath[0] + '/*-oai-' + container + '.log'
+				filenames = './*-oai-' + container + '.log'
 				cmd = 'ls ' + filenames
-				containerStatus = True
-				try:
-					lsStatus = self.run_cmd_local_host(cmd, silent=True)
-					filenames = str(lsStatus).strip()
-				except:
-					containerStatus = False
-				if not containerStatus:
+				lsStatus = myCmd.run(cmd, silent=True, reportNonZero=False)
+				if lsStatus.returncode != 0:
 					continue
+				filenames = str(lsStatus.stdout).strip()
 
 				for filename in filenames.split('\n'):
 					logging.debug('\u001B[1m Analyzing xNB logfile ' + filename + ' \u001B[0m')
-					logStatus = RAN.AnalyzeLogFile_eNB(filename, HTML, self.ran_checkers)
+					logStatus = RAN.AnalyzeLogFile_eNB(f'{logPath}/{filename}', HTML, self.ran_checkers)
 					if (logStatus < 0):
 						fullStatus = False
 						self.exitStatus = 1
@@ -1270,42 +1259,40 @@ class Containerize():
 
 			listOfPossibleUeContainers = ['lte-ue*', 'nr-ue*']
 			for container in listOfPossibleUeContainers:
-				filenames = self.yamlPath[0] + '/*-oai-' + container + '.log'
+				filenames = './*-oai-' + container + '.log'
 				cmd = 'ls ' + filenames
 				containerStatus = True
-				try:
-					lsStatus = self.run_cmd_local_host(cmd, silent=True)
-					filenames = str(lsStatus).strip()
-				except:
-					containerStatus = False
-				if not containerStatus:
+				lsStatus = myCmd.run(cmd, silent=True, reportNonZero=False)
+				if lsStatus.returncode != 0:
 					continue
+				filenames = str(lsStatus.stdout).strip()
 
 				for filename in filenames.split('\n'):
 					logging.debug('\u001B[1m Analyzing UE logfile ' + filename + ' \u001B[0m')
-					logStatus = UE.AnalyzeLogFile_UE(filename, HTML, RAN)
+					logStatus = UE.AnalyzeLogFile_UE(f'{logPath}/{filename}', HTML, RAN)
 					if (logStatus < 0):
 						fullStatus = False
 						HTML.CreateHtmlTestRow('UE log Analysis', 'KO', logStatus)
 					else:
 						HTML.CreateHtmlTestRow('UE log Analysis', 'OK', CONST.ALL_PROCESSES_OK)
 
-			cmd = 'rm ' + self.yamlPath[0] + '/*.log'
-			deployStatus = self.run_cmd_local_host(cmd)
 			if self.tsharkStarted:
 				self.tsharkStarted = True
-				cmd = 'killall tshark || true'
-				self.run_cmd_local_host(cmd)
+				cmd = 'killall tshark'
+				myCmd.run(cmd, reportNonZero=False)
 				ymlPath = self.yamlPath[0].split('/')
-				cmd = 'mv /tmp/capture_' + ymlPath[1] + '.pcap ' + logPath + ' || true'
-				copyStatus = self.run_cmd_local_host(cmd, 100)
+				# The working dir is still logPath
+				cmd = 'mv /tmp/capture_' + ymlPath[1] + '.pcap .'
+				myCmd.run(cmd, timeout=100, reportNonZero=False)
 				self.tsharkStarted = False
 
 		logging.debug('\u001B[1m Undeploying \u001B[0m')
-		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml down'
-		try:
-			deployStatus = self.run_cmd_local_host(cmd, 100)
-		except Exception as e:
+		logging.debug(f'Working dir is back {self.yamlPath[0]}')
+		myCmd.cwd = self.yamlPath[0]
+		cmd = 'docker-compose -f docker-compose-ci.yml down'
+		deployStatus = myCmd.run(cmd, timeout=100)
+		if deployStatus.returncode != 0:
+			myCmd.close()
 			self.exitStatus = 1
 			logging.error('Could not undeploy')
 			HTML.CreateHtmlTestRow('Could not undeploy', 'KO', CONST.ALL_PROCESSES_OK)
@@ -1314,8 +1301,9 @@ class Containerize():
 
 		self.deployedContainers = []
 		# Cleaning any created tmp volume
-		cmd = 'docker volume prune --force || true'
-		deployStatus = self.run_cmd_local_host(cmd, 100)
+		cmd = 'docker volume prune --force'
+		deployStatus = myCmd.run(cmd, timeout=100, reportNonZero=False)
+		myCmd.close()
 
 		if fullStatus:
 			HTML.CreateHtmlTestRow('n/a', 'OK', CONST.ALL_PROCESSES_OK)
@@ -1330,11 +1318,12 @@ class Containerize():
 		logPath = '../cmake_targets/log/' + ymlPath[1]
 
 		# if the containers are running, recover the logs!
-		cmd = 'cd ' + self.yamlPath[0] + ' && docker-compose -f docker-compose-ci.yml ps --all'
-		deployStatus = self.run_cmd_local_host(cmd, 30)
+		myCmd = cls_cmd.LocalCmd(d = self.yamlPath[0])
+		cmd = 'docker-compose -f docker-compose-ci.yml ps --all'
+		deployStatus = myCmd.run(cmd, timeout=30)
 		cmd = 'docker stats --no-stream --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}" '
 		anyLogs = False
-		for state in deployStatus.split('\n'):
+		for state in deployStatus.stdout.split('\n'):
 			res = re.search('Name|NAME|----------', state)
 			if res is not None:
 				continue
@@ -1346,10 +1335,11 @@ class Containerize():
 				cmd += res.group('container_name') + ' '
 		message = ''
 		if anyLogs:
-			stats = self.run_cmd_local_host(cmd, 30)
-			for statLine in stats.split('\n'):
+			stats = myCmd.run(cmd, timeout=30)
+			for statLine in stats.stdout.split('\n'):
 				logging.debug(statLine)
 				message += statLine + '\n'
+		myCmd.close()
 
 		html_queue = SimpleQueue()
 		html_cell = '
\n' + message + '
' @@ -1357,17 +1347,18 @@ class Containerize(): HTML.CreateHtmlTestRowQueue(self.pingOptions, 'OK', 1, html_queue) def PingFromContainer(self, HTML, RAN, UE): + myCmd = cls_cmd.LocalCmd() self.exitStatus = 0 ymlPath = self.yamlPath[0].split('/') logPath = '../cmake_targets/log/' + ymlPath[1] cmd = 'mkdir -p ' + logPath - deployStatus = self.run_cmd_local_host(cmd, silent=True) + myCmd.run(cmd, silent=True) - cmd = 'docker exec ' + self.pingContName + ' /bin/bash -c "ping ' + self.pingOptions + '" 2>&1 | tee ' + logPath + '/ping_' + HTML.testCase_id + '.log || true' + cmd = 'docker exec ' + self.pingContName + ' /bin/bash -c "ping ' + self.pingOptions + '" 2>&1 | tee ' + logPath + '/ping_' + HTML.testCase_id + '.log' + pingStatus = myCmd.run(cmd, timeout=100, reportNonZero=False) + myCmd.close() - deployStatus = self.run_cmd_local_host(cmd, 100) - - result = re.search(', (?P[0-9\.]+)% packet loss, time [0-9\.]+ms', deployStatus) + result = re.search(', (?P[0-9\.]+)% packet loss, time [0-9\.]+ms', pingStatus.stdout) if result is None: self.PingExit(HTML, RAN, UE, False, 'Packet Loss Not Found') return @@ -1377,7 +1368,7 @@ class Containerize(): self.PingExit(HTML, RAN, UE, False, 'Packet Loss is 100%') return - result = re.search('rtt min\/avg\/max\/mdev = (?P[0-9\.]+)\/(?P[0-9\.]+)\/(?P[0-9\.]+)\/[0-9\.]+ ms', deployStatus) + result = re.search('rtt min\/avg\/max\/mdev = (?P[0-9\.]+)\/(?P[0-9\.]+)\/(?P[0-9\.]+)\/[0-9\.]+ ms', pingStatus.stdout) if result is None: self.PingExit(HTML, RAN, UE, False, 'Ping RTT_Min RTT_Avg RTT_Max Not Found!') return @@ -1430,35 +1421,37 @@ class Containerize(): self.exitStatus = 1 def IperfFromContainer(self, HTML, RAN, UE): + myCmd = cls_cmd.LocalCmd() self.exitStatus = 0 ymlPath = self.yamlPath[0].split('/') logPath = '../cmake_targets/log/' + ymlPath[1] cmd = 'mkdir -p ' + logPath - logStatus = self.run_cmd_local_host(cmd, silent=True) + myCmd.run(cmd, silent=True) # Start the server process cmd = f'docker exec -d {self.svrContName} /bin/bash -c "nohup iperf {self.svrOptions} > /tmp/iperf_server.log 2>&1"' - self.run_cmd_local_host(cmd) + myCmd.run(cmd, reportNonZero=False) time.sleep(3) # Start the client process cmd = f'docker exec {self.cliContName} /bin/bash -c "iperf {self.cliOptions}" 2>&1 | tee {logPath}/iperf_client_{HTML.testCase_id}.log' - clientStatus = self.run_cmd_local_host(cmd, 100) + clientStatus = myCmd.run(cmd, timeout=100) # Stop the server process cmd = f'docker exec {self.svrContName} /bin/bash -c "pkill iperf"' - self.run_cmd_local_host(cmd) + myCmd.run(cmd) time.sleep(3) serverStatusFilename = f'{logPath}/iperf_server_{HTML.testCase_id}.log' cmd = f'docker cp {self.svrContName}:/tmp/iperf_server.log {serverStatusFilename}' - self.run_cmd_local_host(cmd, 30) + myCmd.run(cmd, timeout=60) + myCmd.close() # clientStatus was retrieved above. The serverStatus was # written in the background, then copied to the local machine with open(serverStatusFilename, 'r') as f: serverStatus = f.read() - (iperfStatus, msg) = AnalyzeIperf(self.cliOptions, clientStatus, serverStatus) + (iperfStatus, msg) = AnalyzeIperf(self.cliOptions, clientStatus.stdout, serverStatus) if iperfStatus: logging.info('\u001B[1m Iperf Test PASS\u001B[0m') else: @@ -1594,13 +1587,3 @@ class Containerize(): if result is None: mySSH.command('echo ' + password + ' | sudo -S iptables -P FORWARD ACCEPT', '\$', 10) mySSH.close() - - def run_cmd_local_host(self, lCmd, lTimeout=10, silent=False): - if not silent: - logging.info(lCmd) - result = subprocess.run(lCmd, shell=True, check=True, - universal_newlines=True, - stdout=subprocess.PIPE, - stderr=subprocess.STDOUT, - timeout=lTimeout) - return str(result.stdout)