From b6daabc2b5c9f5e84a3622bd438f61c8a20dd1e8 Mon Sep 17 00:00:00 2001 From: hardy Date: Tue, 13 Apr 2021 21:19:54 +0200 Subject: [PATCH] tentative to improve Module control encapsulation --- ci-scripts/ci_ueinfra.yaml | 5 +- ci-scripts/cls_module_ue.py | 73 +++++++++++++++--------- ci-scripts/cls_oaicitest.py | 12 ++-- ci-scripts/main.py | 2 +- ci-scripts/xml_files/fr1_nsa_quectel.xml | 53 ++++++++++------- 5 files changed, 87 insertions(+), 58 deletions(-) diff --git a/ci-scripts/ci_ueinfra.yaml b/ci-scripts/ci_ueinfra.yaml index e62943e683..1ca913072c 100644 --- a/ci-scripts/ci_ueinfra.yaml +++ b/ci-scripts/ci_ueinfra.yaml @@ -2,9 +2,12 @@ idefix: ID: idefix State : enabled Kind : quectel - Process : quectel-CM + Process : + Name : quectel-CM + Cmd : /home/oaicicd/quectel-CM/quectel-CM -s oai.ipv4 -4 WakeupScript : ci_ctl_qtel.py /dev/ttyUSB2 wup DetachScript : ci_ctl_qtel.py /dev/ttyUSB2 detach + PLMN : 22201 UENetwork : wwan0 HostIPAddress : 192.168.18.188 HostUsername : oaicicd diff --git a/ci-scripts/cls_module_ue.py b/ci-scripts/cls_module_ue.py index 6aa4265571..4586be33e8 100644 --- a/ci-scripts/cls_module_ue.py +++ b/ci-scripts/cls_module_ue.py @@ -56,7 +56,8 @@ class Module_UE: for k, v in Module.items(): setattr(self, k, v) self.UEIPAddress = "" - + #dictionary linking command names and related module scripts + self.cmd_dict= {"wup": self.WakeupScript,"detach":self.DetachScript}#dictionary of function scripts @@ -65,56 +66,72 @@ class Module_UE: #-----------------$ #this method checks if the specified Process is running on the server hosting the module - def CheckIsModule(self): + #if not it will be started + def CheckCMProcess(self): HOST=self.HostIPAddress - COMMAND="ps aux | grep " + self.Process + " | grep -v grep " + COMMAND="ps aux | grep " + self.Process['Name'] + " | grep -v grep " logging.debug(COMMAND) ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) result = ssh.stdout.readlines() if len(result)!=0: - logging.debug(self.Process + " process found") + logging.debug(self.Process['Name'] + " process found") return True - else: - logging.debug(self.Process + " process NOT found") - return False + else:#start process and check again + logging.debug(self.Process['Name'] + " process NOT found") + #starting the process + logging.debug('Starting ' + self.Process['Name']) + mySSH = sshconnection.SSHConnection() + mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword) + mySSH.command('echo ' + self.HostPassword + ' | sudo -S ' + self.Process['Cmd'] + ' &','\$',5) + mySSH.close() + #checking the process + HOST=self.HostIPAddress + COMMAND="ps aux | grep " + self.Process['Name'] + " | grep -v grep " + logging.debug(COMMAND) + ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) + result = ssh.stdout.readlines() + if len(result)!=0: + logging.debug(self.Process['Name'] + " process found") + return True + else: + logging.debug(self.Process['Name'] + " process NOT found") + return False - #Wakeup/Detach can probably be improved with encapsulation of the command such def Command(self, command) - #this method wakes up the module by calling the specified python script - def WakeUp(self): + #Generic command function, using function pointers dictionary + def Command(self,cmd): mySSH = sshconnection.SSHConnection() mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword) - mySSH.command('echo ' + self.HostPassword + ' | sudo -S python3 ' + self.WakeupScript + ' ','\$',5) + mySSH.command('echo ' + self.HostPassword + ' | sudo -S python3 ' + self.cmd_dict[cmd],'\$',5) time.sleep(5) - logging.debug("Module wake-up") + logging.debug("Module "+ cmd) mySSH.close() - #this method detaches the module by calling the specified python script - def Detach(self): - mySSH = sshconnection.SSHConnection() - mySSH.open(self.HostIPAddress, self.HostUsername, self.HostPassword) - mySSH.command('echo ' + self.HostPassword + ' | sudo -S python3 ' + self.DetachScript + ' ','\$',5) - time.sleep(5) - logging.debug("Module detach") - mySSH.close() #this method retrieves the Module IP address (not the Host IP address) def GetModuleIPAddress(self): HOST=self.HostIPAddress - COMMAND="ip a show dev " + self.UENetwork + " | grep inet | grep " + self.UENetwork - ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) - response = ssh.stdout.readlines() - if len(response)!=0: + response= [] + tentative = 10 + while (len(response)==0) and (tentative>0): + COMMAND="ip a show dev " + self.UENetwork + " | grep inet | grep " + self.UENetwork + logging.debug(COMMAND) + ssh = subprocess.Popen(["ssh", "%s" % HOST, COMMAND],shell=False,stdout=subprocess.PIPE,stderr=subprocess.PIPE) + response = ssh.stdout.readlines() + tentative-=1 + time.sleep(10) + if (tentative==0) and (len(response)==0): + logging.debug('\u001B[1;37;41m Module IP Address Not Found! Time expired \u001B[0m') + return -1 + else: #check response result = re.search('inet (?P[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)', response[0].decode("utf-8") ) if result is not None: if result.group('moduleipaddress') is not None: self.UEIPAddress = result.group('moduleipaddress') logging.debug('\u001B[1mUE Module IP Address is ' + self.UEIPAddress + '\u001B[0m') + return 0 else: logging.debug('\u001B[1;37;41m Module IP Address Not Found! \u001B[0m') - else: - logging.debug('\u001B[1;37;41m Module IP Address Not Found! \u001B[0m') - else: - logging.debug('\u001B[1;37;41m Module IP Address Not Found! \u001B[0m') + return -1 diff --git a/ci-scripts/cls_oaicitest.py b/ci-scripts/cls_oaicitest.py index 9bcfa458ba..06cc814a11 100644 --- a/ci-scripts/cls_oaicitest.py +++ b/ci-scripts/cls_oaicitest.py @@ -386,13 +386,13 @@ class OaiCiTest(): else: #if an ID is specified, it is a module from the yaml infrastructure file #RH Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id]) - is_module=Module_UE.CheckIsModule() + is_module=Module_UE.CheckCMProcess() if is_module: - Module_UE.WakeUp() + Module_UE.Command("wup") Module_UE.GetModuleIPAddress() HTML.CreateHtmlTestRow(Module_UE.UEIPAddress, 'OK', CONST.ALL_PROCESSES_OK) self.UEIPAddresses.append(Module_UE.UEIPAddress) - logging.debug('UEs IP addresses : '+ self.UEIPAddresses) + logging.debug('UE IP addresss : '+ Module_UE.UEIPAddress) def InitializeOAIUE(self,HTML,RAN,EPC,COTS_UE): if self.UEIPAddress == '' or self.UEUserName == '' or self.UEPassword == '' or self.UESourceCodePath == '': @@ -1039,7 +1039,7 @@ class OaiCiTest(): except: os.kill(os.getppid(),signal.SIGUSR1) - def DetachUE(self,HTML,RAN,EPC,COTS_UE): + def DetachUE(self,HTML,RAN,EPC,COTS_UE,InfraUE): if self.ue_id=='':#no ID specified, then it is a COTS controlled by ADB if self.ADBIPAddress == '' or self.ADBUserName == '' or self.ADBPassword == '': HELP.GenericHelp(CONST.Version) @@ -1073,9 +1073,9 @@ class OaiCiTest(): cnt += 1 else:#if an ID is specified, it is a module from the yaml infrastructure file Module_UE = cls_module_ue.Module_UE(InfraUE.ci_ue_infra[self.ue_id]) - is_module=Module_UE.CheckIsModule() + is_module=Module_UE.CheckCMProcess() if is_module: - Module_UE.Detach() + Module_UE.Command("detach") Module_UE.GetModuleIPAddress() HTML.CreateHtmlTestRow(Module_UE.UEIPAddress, 'OK', CONST.ALL_PROCESSES_OK) diff --git a/ci-scripts/main.py b/ci-scripts/main.py index 5a26e3a5ed..2396a73d92 100644 --- a/ci-scripts/main.py +++ b/ci-scripts/main.py @@ -717,7 +717,7 @@ elif re.match('^TesteNB$', mode, re.IGNORECASE) or re.match('^TestUE$', mode, re elif action == 'Attach_UE': CiTestObj.AttachUE(HTML,RAN,EPC,COTS_UE) elif action == 'Detach_UE': - CiTestObj.DetachUE(HTML,RAN,EPC,COTS_UE) + CiTestObj.DetachUE(HTML,RAN,EPC,COTS_UE,InfraUE) elif action == 'DataDisable_UE': CiTestObj.DataDisableUE(HTML) elif action == 'DataEnable_UE': diff --git a/ci-scripts/xml_files/fr1_nsa_quectel.xml b/ci-scripts/xml_files/fr1_nsa_quectel.xml index a1604af7b3..e1e19cbbf8 100644 --- a/ci-scripts/xml_files/fr1_nsa_quectel.xml +++ b/ci-scripts/xml_files/fr1_nsa_quectel.xml @@ -29,7 +29,7 @@ 040000 000001 010000 - 000001 + 000002 050000 050001 000001 @@ -37,6 +37,8 @@ 000001 070001 000001 + 010002 + 000001 080001 080000 @@ -46,14 +48,14 @@ Initialize_UE Initialize Quectel - idefix + idefix Detach_UE Detach UE - idefix + idefix @@ -64,13 +66,13 @@ 0 0 lte - + Initialize_eNB Initialize gNB - -O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpb210.conf -E + -O ci-scripts/conf_files/gnb.band78.tm1.fr1.106PRB.usrpn310.conf -q 1 1 nr @@ -79,9 +81,16 @@ IdleSleep Sleep - 10 + 5 + + IdleSleep + Sleep + 30 + + + Ping Ping: 20pings in 20sec @@ -98,25 +107,25 @@ 50 - - Iperf - iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile) - -u -b 20M -t 20 -i 1 + + Iperf + iperf (DL/20Mbps/UDP)(20 sec)(single-ue profile) + -u -b 20M -t 20 -i 1 DL - idefix - 50 - single-ue - + idefix + 50 + single-ue + - - Iperf - iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile) - -u -b 3M -t 20 -i 1 + + Iperf + iperf (UL/3Mbps/UDP)(20 sec)(single-ue profile) + -u -b 3M -t 20 -i 1 UL - idefix - 50 - single-ue - + idefix + 50 + single-ue +