From 0aa06742972c077cc0e4dffeb1ef766341964b6c Mon Sep 17 00:00:00 2001 From: hardy Date: Sun, 26 Sep 2021 21:49:31 +0200 Subject: [PATCH 01/12] get test results into dahsboard : part 1 formatting --- ci-scripts/ran_dashboard.py | 91 +++++++++++++++++++++++++++---- ci-scripts/ran_dashboard_cfg.yaml | 12 ++++ 2 files changed, 93 insertions(+), 10 deletions(-) create mode 100644 ci-scripts/ran_dashboard_cfg.yaml diff --git a/ci-scripts/ran_dashboard.py b/ci-scripts/ran_dashboard.py index d9ce62b3b6..7525c8684e 100644 --- a/ci-scripts/ran_dashboard.py +++ b/ci-scripts/ran_dashboard.py @@ -57,7 +57,7 @@ class gDashboard: #worksheet self.sheet = self.ss.worksheet(worksheet) self.ss.del_worksheet(self.sheet) #start by deleting the old sheet - self.sheet = self.ss.add_worksheet(title=worksheet, rows="100", cols="20") #create a new one + self.sheet = self.ss.add_worksheet(title=worksheet, rows="100", cols="30") #create a new one self.d = {} #data dictionary @@ -78,10 +78,21 @@ class gDashboard: row =[dt_string] self.sheet.insert_row(row, index=1, value_input_option='RAW') - #line 2 empty + #line 2 is for the test names (links to jenkins pipeline), updated at the end + #line 3 is for the column names i=3 row =["MR","Created_at","Author","Title","Assignee", "Reviewer", "CAN START","IN PROGRESS","COMPLETED","Review Form","OK MERGE","Merge conflicts"] + + #test 1 + row.append("# PASS") + row.append("# FAIL") + row.append("Last Fail") + #test 2 + row.append("# PASS") + row.append("# FAIL") + row.append("Last Fail") + self.sheet.insert_row(row, index=i, value_input_option='RAW') #line 4 onward, MR data lines @@ -143,15 +154,29 @@ class gDashboard: found=True n+=1 + #add test results, notice : NSA only for the moment (code to be refactored for multiple tests afterwards) + cmd="python3 /home/oaicicd/mysql/sql_connect_dev.py "+str(self.d[x]['iid']) + + process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE) + output = process.stdout.readline() + + tmp=output.decode("utf-8") + tmp=tmp.replace('\'','"') + tmp=tmp.rstrip() + testres = json.loads(tmp) + #build final row to be inserted, the first column is left empty for now, will be filled afterward with hyperlinks to gitlab MR row =["", str(date_time_obj.date()),str(self.d[x]['author']['name']),str(self.d[x]['title']),\ assignee, reviewer,\ - milestone1,milestone2,milestone3,review_form,milestone4,conflicts] + milestone1,milestone2,milestone3,review_form,milestone4,conflicts,\ + testres['PASS'],testres['FAIL']] + #insert the row to worksheet self.sheet.insert_row(row, index=i, value_input_option='RAW') - + + #add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas) i=3 @@ -162,10 +187,39 @@ class gDashboard: hyperlink= '\"'+"https://gitlab.eurecom.fr/oai/openairinterface5g/-/merge_requests/"+ str(self.d[x]['iid']) +'\"' text= '\"'+str(self.d[x]['iid'])+'"' requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) + + cmd="python3 /home/oaicicd/mysql/sql_connect_dev.py "+str(self.d[x]['iid']) + process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE) + output = process.stdout.readline() + tmp=output.decode("utf-8") + tmp=tmp.replace('\'','"') + tmp=tmp.rstrip() + testres = json.loads(tmp) + if len(testres['fails list'])>0: + colIndex=14 + hyperlink= '\"'+ testres['fails link'][0] +'\"' + text= '\"'+testres['fails list'][0]+'"' + requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) i=i+1 body = {"requests": requests} self.ss.batch_update(body) + #line 2 is for the test names + #add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas) + requests=[] + rowIndex=1 + colIndex=12 + hyperlink= '\"'+"https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-Mini-Module/"+'\"' + text= '\"'+'NSA Mini'+'"' + requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) + rowIndex=1 + colIndex=15 + hyperlink= '\"'+"https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module/"+'\"' + text= '\"'+'NR SA'+'"' + requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) + + body = {"requests": requests} + self.ss.batch_update(body) def addHyperlink(self, hyperlink, text, destinationSheetName, rowIndex, colIndex): @@ -207,17 +261,17 @@ class gDashboard: "copyPaste": { "source": { "sheetId": sourceSheetId, - "startRowIndex": 0, + "startRowIndex": 1, "endRowIndex": 40, "startColumnIndex": 0, - "endColumnIndex": 12 + "endColumnIndex": 19 }, "destination": { "sheetId": destinationSheetId, - "startRowIndex": 0, + "startRowIndex": 1, "endRowIndex": 40, "startColumnIndex": 0, - "endColumnIndex": 12 + "endColumnIndex": 19 }, "pasteType": "PASTE_FORMAT" } @@ -280,9 +334,26 @@ class gDashboard: } ) - body = {"requests": requests} - self.ss.batch_update(body) + #group MR related columns +# sheetId = self.ss.worksheet(destinationSheetName)._properties['sheetId'] +# requests.append( +# { +# "addDimensionGroup": { +# "range": { +# "dimension": "COLUMNS", +# "sheetId": sheetId, +# "startIndex": 3, +# "endIndex": 12 +# }, +# } +# } +# ) +# + body = {"requests": requests} + self.ss.batch_update(body) + + def main(): diff --git a/ci-scripts/ran_dashboard_cfg.yaml b/ci-scripts/ran_dashboard_cfg.yaml new file mode 100644 index 0000000000..3f5011f9af --- /dev/null +++ b/ci-scripts/ran_dashboard_cfg.yaml @@ -0,0 +1,12 @@ +LTE-2x2 : #short name used in the dashboard + job : 'RAN-LTE-2x2-Module-OAIEPC' #job name from Jenkins, used in the database + link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-LTE-2x2-Module-OAIEPC' +NSA-B200 : + job : 'RAN-NSA-B200-Module-LTEBOX' + link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-B200-Module-LTEBOX' +NSA-2x2 : + job : 'RAN-NSA-2x2-Module-OAIEPC' + link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-2x2-Module-OAIEPC' +SA-N310 : + job : 'RAN-SA-Module-CN5G' + link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G' \ No newline at end of file From d4e135960b9c309ba6ddca2be17d8a69d16f8b43 Mon Sep 17 00:00:00 2001 From: hardy Date: Sun, 10 Oct 2021 22:10:04 +0200 Subject: [PATCH 02/12] major update / refactoring for ran dashboard, including mysql db and test results table --- .../mysql4testresults/docker-compose.yml | 12 ++ ci-scripts/mysql4testresults/sql_connect.py | 33 ++++ .../{ => ran_dashboard}/ran_dashboard.py | 177 ++++++++++-------- .../ran_dashboard_cfg.yaml | 0 ci-scripts/ran_dashboard/sqlconnect.py | 64 +++++++ 5 files changed, 209 insertions(+), 77 deletions(-) create mode 100644 ci-scripts/mysql4testresults/docker-compose.yml create mode 100644 ci-scripts/mysql4testresults/sql_connect.py rename ci-scripts/{ => ran_dashboard}/ran_dashboard.py (71%) rename ci-scripts/{ => ran_dashboard}/ran_dashboard_cfg.yaml (100%) create mode 100644 ci-scripts/ran_dashboard/sqlconnect.py diff --git a/ci-scripts/mysql4testresults/docker-compose.yml b/ci-scripts/mysql4testresults/docker-compose.yml new file mode 100644 index 0000000000..1c60057ab2 --- /dev/null +++ b/ci-scripts/mysql4testresults/docker-compose.yml @@ -0,0 +1,12 @@ +version: '2' +services: + mysql: + container_name: oaicicd_mysql + restart: always + image: mysql:latest + environment: + MYSQL_ROOT_PASSWORD: 'ucZBc2XRYdvEm59F' + ports: + - "3307:3306" + volumes: + - /home/oaicicd/mysql/data:/var/lib/mysql diff --git a/ci-scripts/mysql4testresults/sql_connect.py b/ci-scripts/mysql4testresults/sql_connect.py new file mode 100644 index 0000000000..333e573e78 --- /dev/null +++ b/ci-scripts/mysql4testresults/sql_connect.py @@ -0,0 +1,33 @@ +import pymysql +import sys +from datetime import datetime + +#This is the script used to write the test results to the mysql DB +#Called by Jenkins pipeline (jenkinsfile) +#Must be located in /home/oaicicid/mysql on the database host +#Usage from Jenkinsfile : +#python3 /home/oaicicd/mysql/sql_connect.py ${JOB_NAME} ${params.eNB_MR} ${params.eNB_Branch} ${env.BUILD_ID} ${env.BUILD_URL} ${StatusForDb} '' + +class SQLConnect: + def __init__(self): + self.connection = pymysql.connect( + host='172.22.0.2', + user='root', + password = 'ucZBc2XRYdvEm59F', + db='oaicicd_tests', + port=3306 + ) + + def put(self,TEST,MR,BRANCH,BUILD,BUILD_LINK,STATUS): + now = datetime.now().strftime("%Y-%m-%d %H:%M:%S") + cur=self.connection.cursor() + cur.execute ('INSERT INTO test_results (TEST,MR,BRANCH,BUILD,BUILD_LINK,STATUS,DATE) VALUES (%s,%s,%s,%s,%s,%s,%s);' , (TEST, MR, BRANCH, BUILD, BUILD_LINK, STATUS, now)) + self.connection.commit() + self.connection.close() + + +if __name__ == "__main__": + mydb=SQLConnect() + mydb.put(sys.argv[1],sys.argv[2],sys.argv[3],sys.argv[4],sys.argv[5],sys.argv[6]) + + diff --git a/ci-scripts/ran_dashboard.py b/ci-scripts/ran_dashboard/ran_dashboard.py similarity index 71% rename from ci-scripts/ran_dashboard.py rename to ci-scripts/ran_dashboard/ran_dashboard.py index 7525c8684e..5fddba1b87 100644 --- a/ci-scripts/ran_dashboard.py +++ b/ci-scripts/ran_dashboard/ran_dashboard.py @@ -42,6 +42,11 @@ import datetime #now() and date formating from datetime import datetime import re import gitlab +import yaml +import os +import pickle + +from sqlconnect import SQLConnect #----------------------------------------------------------- # Class Declaration @@ -58,58 +63,76 @@ class gDashboard: self.sheet = self.ss.worksheet(worksheet) self.ss.del_worksheet(self.sheet) #start by deleting the old sheet self.sheet = self.ss.add_worksheet(title=worksheet, rows="100", cols="30") #create a new one - - self.d = {} #data dictionary + + #init with data sources : git, yaml config file, test results databases + cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """ + self.git = self.__getGitData(cmd) #git data from Gitlab + self.tests = self.__loadCfg('ran_dashboard_cfg.yaml') #tests table setup from yaml + self.db = self.__loadFromDB() #test results from database - def fetchData(self,cmd): + def __loadCfg(self,yaml_file): + with open(yaml_file,'r') as f: + tests = yaml.load(f) + return tests + + def __getGitData(self,cmd): #cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """ process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE) output = process.stdout.readline() tmp=output.decode("utf-8") - self.d = json.loads(tmp) + d = json.loads(tmp) + return d + + def __loadFromDB(self): + mr_list=[] + for x in range(len(self.git)): + mr_list.append(str(self.git[x]['iid'])) + mydb=SQLConnect() + for MR in mr_list: + mydb.get(MR) + mydb.close_connection() + return mydb.data + def gBuild(self, destinationSheetName): - #line 1 : update date/time, format dd/mm/YY H:M:S + ###line 1 : update date/time, format dd/mm/YY H:M:S now = datetime.now() dt_string = "Update : " + now.strftime("%d/%m/%Y %H:%M") row =[dt_string] self.sheet.insert_row(row, index=1, value_input_option='RAW') - #line 2 is for the test names (links to jenkins pipeline), updated at the end + ###line 2 is for the test short names (links to jenkins pipeline), updated at the end - #line 3 is for the column names + ###line 3 is for the column names i=3 row =["MR","Created_at","Author","Title","Assignee", "Reviewer", "CAN START","IN PROGRESS","COMPLETED","Review Form","OK MERGE","Merge conflicts"] - #test 1 - row.append("# PASS") - row.append("# FAIL") - row.append("Last Fail") - #test 2 - row.append("# PASS") - row.append("# FAIL") - row.append("Last Fail") + #tests + for t in range(0,len(self.tests)): + row.append("# PASS") + row.append("# FAIL") + row.append("Last Fail") self.sheet.insert_row(row, index=i, value_input_option='RAW') - #line 4 onward, MR data lines - for x in range(len(self.d)): + ###line 4 onward, MR data lines + for x in range(len(self.git)): i=i+1 - date_time_str = self.d[x]['created_at'] + date_time_str = self.git[x]['created_at'] date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%dT%H:%M:%S.%fZ') milestone1=milestone2=milestone3=milestone4="" - if self.d[x]['milestone']!=None: - if self.d[x]['milestone']['title']=="REVIEW_CAN_START": + if self.git[x]['milestone']!=None: + if self.git[x]['milestone']['title']=="REVIEW_CAN_START": milestone1="X" - elif self.d[x]['milestone']['title']=="REVIEW_IN_PROGRESS": + elif self.git[x]['milestone']['title']=="REVIEW_IN_PROGRESS": milestone2="X" - elif self.d[x]['milestone']['title']=="REVIEW_COMPLETED_AND_APPROVED": + elif self.git[x]['milestone']['title']=="REVIEW_COMPLETED_AND_APPROVED": milestone3="X" - elif self.d[x]['milestone']['title']=="OK_TO_BE_MERGED": + elif self.git[x]['milestone']['title']=="OK_TO_BE_MERGED": milestone4="X" else: pass @@ -117,18 +140,18 @@ class gDashboard: pass #check if empty or not - if self.d[x]['assignee']!=None: - assignee = str(self.d[x]['assignee']['name']) + if self.git[x]['assignee']!=None: + assignee = str(self.git[x]['assignee']['name']) else: assignee = "" #check if empty or not - if len(self.d[x]['reviewers'])!=0: - reviewer = str(self.d[x]['reviewers'][0]['name']) + if len(self.git[x]['reviewers'])!=0: + reviewer = str(self.git[x]['reviewers'][0]['name']) else: reviewer = "" - if self.d[x]['has_conflicts']==True: + if self.git[x]['has_conflicts']==True: conflicts = "YES" else: conflicts = "" @@ -141,12 +164,12 @@ class gDashboard: project = gl.projects.get(project_id) #get the opened MR in the project mrs = project.mergerequests.list(state='opened') + review_form='' for m in range (0,len(mrs)): - if mrs[m].iid==self.d[x]['iid']:#check the iid is the one we are on + if mrs[m].iid==self.git[x]['iid']:#check the iid is the one we are on mr_notes = mrs[m].notes.list(all=True) n=0 found=False - review_form="" while found==False and n0: - colIndex=14 - hyperlink= '\"'+ testres['fails link'][0] +'\"' - text= '\"'+testres['fails list'][0]+'"' - requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) - i=i+1 + mr=str(self.git[x]['iid']) + colIndex=14 + for t in self.tests: + job=self.tests[t]['job'] + if job in self.db[mr]: + if len(self.db[mr][job]['last_fail'])>0: + hyperlink= '\"'+ self.db[mr][job]['last_fail'][1] +'\"' + text= '\"'+self.db[mr][job]['last_fail'][0]+'"' + requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) + colIndex+=3 + i=i+1 #increment row index for next MR + + + body = {"requests": requests} self.ss.batch_update(body) - #line 2 is for the test names + ###line 2 is for the test names #add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas) requests=[] rowIndex=1 colIndex=12 - hyperlink= '\"'+"https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-Mini-Module/"+'\"' - text= '\"'+'NSA Mini'+'"' - requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) - rowIndex=1 - colIndex=15 - hyperlink= '\"'+"https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module/"+'\"' - text= '\"'+'NR SA'+'"' - requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) + for t in self.tests : + hyperlink= '\"'+self.tests[t]['link']+'\"' + short_name= '\"'+ t +'\"' + requests.append(self.addHyperlink(hyperlink, short_name, destinationSheetName, rowIndex, colIndex)) + colIndex+=3 body = {"requests": requests} self.ss.batch_update(body) @@ -264,14 +289,14 @@ class gDashboard: "startRowIndex": 1, "endRowIndex": 40, "startColumnIndex": 0, - "endColumnIndex": 19 + "endColumnIndex": 26 }, "destination": { "sheetId": destinationSheetId, "startRowIndex": 1, "endRowIndex": 40, "startColumnIndex": 0, - "endColumnIndex": 19 + "endColumnIndex": 26 }, "pasteType": "PASTE_FORMAT" } @@ -358,8 +383,6 @@ class gDashboard: def main(): my_gDashboard=gDashboard("/opt/dashboard/g_creds.json", 'OAI RAN Dashboard', 'MR Status') - cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """ - my_gDashboard.fetchData(cmd) my_gDashboard.gBuild("MR Status") my_gDashboard.gFormat("Formating" , "MR Status") diff --git a/ci-scripts/ran_dashboard_cfg.yaml b/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml similarity index 100% rename from ci-scripts/ran_dashboard_cfg.yaml rename to ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml diff --git a/ci-scripts/ran_dashboard/sqlconnect.py b/ci-scripts/ran_dashboard/sqlconnect.py new file mode 100644 index 0000000000..272ff4e50f --- /dev/null +++ b/ci-scripts/ran_dashboard/sqlconnect.py @@ -0,0 +1,64 @@ +import pymysql +import sys +from datetime import datetime +import pickle + + +#This is the script/package used by the dashboard to retrieve the MR test results from the database + +class SQLConnect: + def __init__(self): + self.connection = pymysql.connect( + host='172.22.0.2', + user='root', + password = 'ucZBc2XRYdvEm59F', + db='oaicicd_tests', + port=3306 + ) + self.data={} + + + #retrieve data from mysql database and organize it in a dictionary (per MR passed as argument) + def get(self,MR): + self.data[MR]={} + cur=self.connection.cursor() + + #get counters per test + sql = "select TEST,STATUS, count(*) AS COUNT from test_results where MR=(%s) group by TEST, STATUS;" + cur.execute(sql,MR) + response=cur.fetchall() + if len(response)==0:#no test results yet + self.data[MR]['PASS']='' + self.data[MR]['FAIL']='' + else: + for i in range(0,len(response)): + test=response[i][0] + status=response[i][1] + count=response[i][2] + if test in self.data[MR]: + self.data[MR][test][status]=count + else: + self.data[MR][test]={} + self.data[MR][test][status]=count + + #get last failing build and link + sql = "select TEST,BUILD, BUILD_LINK from test_results where MR=(%s) and STATUS='FAIL' order by DATE DESC;" + cur.execute(sql,MR) + response=cur.fetchall() + if len(response)!=0: + for i in range(0,len(response)): + test=response[i][0] + build=response[i][1] + link=response[i][2] + if 'last_fail' not in self.data[MR][test]: + self.data[MR][test]['last_fail']=[] + self.data[MR][test]['last_fail'].append(build) + self.data[MR][test]['last_fail'].append(link) + + + + #close database connection + def close_connection(self): + self.connection.close() + + From 8dd7e58977d1b370374dbf33bb93a78c8715718c Mon Sep 17 00:00:00 2001 From: hardy Date: Thu, 14 Oct 2021 08:42:30 +0200 Subject: [PATCH 03/12] change to specific run dir --- ci-scripts/Jenkinsfile-git-dashboard | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/ci-scripts/Jenkinsfile-git-dashboard b/ci-scripts/Jenkinsfile-git-dashboard index 6ebd46bc76..0eb82f05b4 100644 --- a/ci-scripts/Jenkinsfile-git-dashboard +++ b/ci-scripts/Jenkinsfile-git-dashboard @@ -33,9 +33,10 @@ pipeline { stages { stage ("gDashboard") { steps { - script { - //retrieve MR data from gitlab and export to gSheet - sh returnStdout: true, script: 'python3 ci-scripts/ran_dashboard.py' + script { + dir ("ci-scripts/ran_dashboard") { + //retrieve MR data from gitlab and export to gSheet + sh returnStdout: true, script: 'python3 ran_dashboard.py' } } } From 90f3e9e2315015e72a6ed13194d6662515ae86e6 Mon Sep 17 00:00:00 2001 From: hardy Date: Thu, 14 Oct 2021 08:45:00 +0200 Subject: [PATCH 04/12] fix missing bracket --- ci-scripts/Jenkinsfile-git-dashboard | 1 + 1 file changed, 1 insertion(+) diff --git a/ci-scripts/Jenkinsfile-git-dashboard b/ci-scripts/Jenkinsfile-git-dashboard index 0eb82f05b4..8c5d773192 100644 --- a/ci-scripts/Jenkinsfile-git-dashboard +++ b/ci-scripts/Jenkinsfile-git-dashboard @@ -37,6 +37,7 @@ pipeline { dir ("ci-scripts/ran_dashboard") { //retrieve MR data from gitlab and export to gSheet sh returnStdout: true, script: 'python3 ran_dashboard.py' + } } } } From 8ccb745d42d47e2d5337f588c890e1b818fb2e01 Mon Sep 17 00:00:00 2001 From: hardy Date: Fri, 15 Oct 2021 11:21:03 +0200 Subject: [PATCH 05/12] add delay to overcome google api quota --- ci-scripts/ran_dashboard/ran_dashboard.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ci-scripts/ran_dashboard/ran_dashboard.py b/ci-scripts/ran_dashboard/ran_dashboard.py index 5fddba1b87..11d14407eb 100644 --- a/ci-scripts/ran_dashboard/ran_dashboard.py +++ b/ci-scripts/ran_dashboard/ran_dashboard.py @@ -45,6 +45,8 @@ import gitlab import yaml import os import pickle +import time + from sqlconnect import SQLConnect @@ -203,6 +205,7 @@ class gDashboard: #insert the final row to worksheet self.sheet.insert_row(row, index=i, value_input_option='RAW') + time.sleep(20) #add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas) From 4b7de3945007d1e6d9f02028871eb5f7000aa7bd Mon Sep 17 00:00:00 2001 From: hardy Date: Fri, 15 Oct 2021 15:11:45 +0200 Subject: [PATCH 06/12] add last_pass --- ci-scripts/ran_dashboard/ran_dashboard.py | 23 +++++++----- ci-scripts/ran_dashboard/sqlconnect.py | 45 ++++++++++++++++++++++- 2 files changed, 58 insertions(+), 10 deletions(-) diff --git a/ci-scripts/ran_dashboard/ran_dashboard.py b/ci-scripts/ran_dashboard/ran_dashboard.py index 11d14407eb..23860f7714 100644 --- a/ci-scripts/ran_dashboard/ran_dashboard.py +++ b/ci-scripts/ran_dashboard/ran_dashboard.py @@ -30,6 +30,8 @@ # Import #----------------------------------------------------------- +#author Remi + #import google spreadsheet API import gspread from oauth2client.service_account import ServiceAccountCredentials @@ -110,12 +112,13 @@ class gDashboard: ###line 3 is for the column names i=3 - row =["MR","Created_at","Author","Title","Assignee", "Reviewer", "CAN START","IN PROGRESS","COMPLETED","Review Form","OK MERGE","Merge conflicts"] + row =["MR","Created_at","Author","Title","Assignee", "Reviewer", "CAN START","IN PROGRESS","COMPLETED","Review Form","OK MERGE","Merge conflicts",""] #tests for t in range(0,len(self.tests)): row.append("# PASS") row.append("# FAIL") + row.append("Last Pass") row.append("Last Fail") self.sheet.insert_row(row, index=i, value_input_option='RAW') @@ -182,7 +185,7 @@ class gDashboard: #build final row to be inserted, the first column is left empty for now, will be filled afterward with hyperlinks to gitlab MR row =["", str(date_time_obj.date()),str(self.git[x]['author']['name']), str(self.git[x]['title']),\ assignee, reviewer,\ - milestone1,milestone2,milestone3,review_form,milestone4,conflicts] + milestone1,milestone2,milestone3,review_form,milestone4,conflicts,""] #and append the test results coming from self.db mr=str(self.git[x]['iid']) for t in self.tests: @@ -205,7 +208,7 @@ class gDashboard: #insert the final row to worksheet self.sheet.insert_row(row, index=i, value_input_option='RAW') - time.sleep(20) + time.sleep(10) #add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas) @@ -223,15 +226,17 @@ class gDashboard: for t in self.tests: job=self.tests[t]['job'] if job in self.db[mr]: + if len(self.db[mr][job]['last_pass'])>0: + hyperlink= '\"'+ self.db[mr][job]['last_pass'][1] +'\"' + text= '\"'+self.db[mr][job]['last_pass'][0]+'"' + requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) if len(self.db[mr][job]['last_fail'])>0: hyperlink= '\"'+ self.db[mr][job]['last_fail'][1] +'\"' text= '\"'+self.db[mr][job]['last_fail'][0]+'"' - requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) - colIndex+=3 + requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex+1)) + colIndex+=4 #move to next test i=i+1 #increment row index for next MR - - body = {"requests": requests} self.ss.batch_update(body) @@ -292,14 +297,14 @@ class gDashboard: "startRowIndex": 1, "endRowIndex": 40, "startColumnIndex": 0, - "endColumnIndex": 26 + "endColumnIndex": 30 }, "destination": { "sheetId": destinationSheetId, "startRowIndex": 1, "endRowIndex": 40, "startColumnIndex": 0, - "endColumnIndex": 26 + "endColumnIndex": 30 }, "pasteType": "PASTE_FORMAT" } diff --git a/ci-scripts/ran_dashboard/sqlconnect.py b/ci-scripts/ran_dashboard/sqlconnect.py index 272ff4e50f..9045c25ca9 100644 --- a/ci-scripts/ran_dashboard/sqlconnect.py +++ b/ci-scripts/ran_dashboard/sqlconnect.py @@ -1,9 +1,39 @@ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 +# * +# * 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. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ +#--------------------------------------------------------------------- +# Merge Requests Dashboard for RAN on googleSheet +# +# Required Python Version +# Python 3.x +# +#--------------------------------------------------------------------- + +#author Remi + + import pymysql import sys from datetime import datetime import pickle - #This is the script/package used by the dashboard to retrieve the MR test results from the database class SQLConnect: @@ -55,6 +85,19 @@ class SQLConnect: self.data[MR][test]['last_fail'].append(build) self.data[MR][test]['last_fail'].append(link) + #get last passing build and link + sql = "select TEST,BUILD, BUILD_LINK from test_results where MR=(%s) and STATUS='PASS' order by DATE DESC;" + cur.execute(sql,MR) + response=cur.fetchall() + if len(response)!=0: + for i in range(0,len(response)): + test=response[i][0] + build=response[i][1] + link=response[i][2] + if 'last_pass' not in self.data[MR][test]: + self.data[MR][test]['last_pass']=[] + self.data[MR][test]['last_pass'].append(build) + self.data[MR][test]['last_pass'].append(link) #close database connection From 64850ccfc239bffedff0d00852c4dbb3c9fd3a36 Mon Sep 17 00:00:00 2001 From: hardy Date: Fri, 15 Oct 2021 15:17:33 +0200 Subject: [PATCH 07/12] fix empty columns count --- ci-scripts/ran_dashboard/ran_dashboard.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ci-scripts/ran_dashboard/ran_dashboard.py b/ci-scripts/ran_dashboard/ran_dashboard.py index 23860f7714..6391ae101d 100644 --- a/ci-scripts/ran_dashboard/ran_dashboard.py +++ b/ci-scripts/ran_dashboard/ran_dashboard.py @@ -200,11 +200,15 @@ class gDashboard: row.append(self.db[mr][job]['FAIL']) else: row.append('') + #leave 2 columns for last_pass and last_fail links + row.append('') row.append('') else: + #4 columns are empty row.append('') row.append('') row.append('') + row.append('') #insert the final row to worksheet self.sheet.insert_row(row, index=i, value_input_option='RAW') From 72a2fc67f3056dc5c4d375d733cefa97381690fe Mon Sep 17 00:00:00 2001 From: hardy Date: Fri, 15 Oct 2021 15:40:41 +0200 Subject: [PATCH 08/12] fix key error in data model --- ci-scripts/ran_dashboard/ran_dashboard.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ci-scripts/ran_dashboard/ran_dashboard.py b/ci-scripts/ran_dashboard/ran_dashboard.py index 6391ae101d..1be96802ac 100644 --- a/ci-scripts/ran_dashboard/ran_dashboard.py +++ b/ci-scripts/ran_dashboard/ran_dashboard.py @@ -230,11 +230,11 @@ class gDashboard: for t in self.tests: job=self.tests[t]['job'] if job in self.db[mr]: - if len(self.db[mr][job]['last_pass'])>0: + if 'last_pass' in self.db[mr][job]: hyperlink= '\"'+ self.db[mr][job]['last_pass'][1] +'\"' text= '\"'+self.db[mr][job]['last_pass'][0]+'"' requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) - if len(self.db[mr][job]['last_fail'])>0: + if 'last_fail' in self.db[mr][job]: hyperlink= '\"'+ self.db[mr][job]['last_fail'][1] +'\"' text= '\"'+self.db[mr][job]['last_fail'][0]+'"' requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex+1)) From d2dff05c8cd79f9a01b9cd122e3762ae55640816 Mon Sep 17 00:00:00 2001 From: hardy Date: Fri, 15 Oct 2021 16:03:51 +0200 Subject: [PATCH 09/12] fix column shift for the test results --- ci-scripts/ran_dashboard/ran_dashboard.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ci-scripts/ran_dashboard/ran_dashboard.py b/ci-scripts/ran_dashboard/ran_dashboard.py index 1be96802ac..36742f3672 100644 --- a/ci-scripts/ran_dashboard/ran_dashboard.py +++ b/ci-scripts/ran_dashboard/ran_dashboard.py @@ -226,7 +226,7 @@ class gDashboard: requests.append(self.addHyperlink(hyperlink, text, destinationSheetName, rowIndex, colIndex)) mr=str(self.git[x]['iid']) - colIndex=14 + colIndex=15 for t in self.tests: job=self.tests[t]['job'] if job in self.db[mr]: @@ -248,12 +248,12 @@ class gDashboard: #add MR hyperlinks in a list of requests to be sent as one update batch; this to save API calls (quotas) requests=[] rowIndex=1 - colIndex=12 + colIndex=13 for t in self.tests : hyperlink= '\"'+self.tests[t]['link']+'\"' short_name= '\"'+ t +'\"' requests.append(self.addHyperlink(hyperlink, short_name, destinationSheetName, rowIndex, colIndex)) - colIndex+=3 + colIndex+=4 body = {"requests": requests} self.ss.batch_update(body) From 707a8000dbab537b9a4e962f461688d6bd58fcd9 Mon Sep 17 00:00:00 2001 From: hardy Date: Wed, 20 Oct 2021 15:49:16 +0200 Subject: [PATCH 10/12] google sheet dashboard is deprecated, replaced by Html dashboard hosted on AWS S3 --- ci-scripts/Jenkinsfile-git-dashboard | 5 +- ci-scripts/ran_dashboard/Hdashboard.py | 401 ++++++++++++++++++ ci-scripts/ran_dashboard/mr_styles.css | 136 ++++++ ci-scripts/ran_dashboard/ran_dashboard.py | 2 +- .../ran_dashboard/ran_dashboard_cfg.yaml | 19 +- ci-scripts/ran_dashboard/readme.txt | 3 + ci-scripts/ran_dashboard/test_styles.css | 103 +++++ 7 files changed, 661 insertions(+), 8 deletions(-) create mode 100644 ci-scripts/ran_dashboard/Hdashboard.py create mode 100755 ci-scripts/ran_dashboard/mr_styles.css create mode 100644 ci-scripts/ran_dashboard/readme.txt create mode 100755 ci-scripts/ran_dashboard/test_styles.css diff --git a/ci-scripts/Jenkinsfile-git-dashboard b/ci-scripts/Jenkinsfile-git-dashboard index 8c5d773192..87e781fe8a 100644 --- a/ci-scripts/Jenkinsfile-git-dashboard +++ b/ci-scripts/Jenkinsfile-git-dashboard @@ -35,8 +35,9 @@ pipeline { steps { script { dir ("ci-scripts/ran_dashboard") { - //retrieve MR data from gitlab and export to gSheet - sh returnStdout: true, script: 'python3 ran_dashboard.py' + //retrieve MR data from gitlab / mySQL db, build HTML pages and load them to AWS S3 bucket (configured as static web page hosting) + //deprecated method : sh returnStdout: true, script: 'python3 ran_dashboard.py' + sh returnStdout: true, script: 'python3 Hdashboard.py' } } } diff --git a/ci-scripts/ran_dashboard/Hdashboard.py b/ci-scripts/ran_dashboard/Hdashboard.py new file mode 100644 index 0000000000..5e34ae50bf --- /dev/null +++ b/ci-scripts/ran_dashboard/Hdashboard.py @@ -0,0 +1,401 @@ +#/* +# * Licensed to the OpenAirInterface (OAI) Software Alliance under one or more +# * contributor license agreements. See the NOTICE file distributed with +# * this work for additional information regarding copyright ownership. +# * The OpenAirInterface Software Alliance licenses this file to You under +# * the OAI Public License, Version 1.1 (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.openairinterface.org/?page_id=698 +# * +# * 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. +# *------------------------------------------------------------------------------- +# * For more information about the OpenAirInterface (OAI) Software Alliance: +# * contact@openairinterface.org +# */ +#--------------------------------------------------------------------- +# Merge Requests Dashboard for RAN on googleSheet +# +# Required Python Version +# Python 3.x +# +#--------------------------------------------------------------------- + +#----------------------------------------------------------- +# Import +#----------------------------------------------------------- + + +#Author Remi +import boto3 +import shlex +import subprocess +import json #json structures +import datetime #now() and date formating +from datetime import datetime +import re +import gitlab +import yaml +import os +import time + + +from sqlconnect import SQLConnect + +#----------------------------------------------------------- +# Class Declaration +#----------------------------------------------------------- + +class Dashboard: + def __init__(self): + + + #init with data sources : git, yaml config file, test results databases + print("Collecting Data") + cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """ + self.git = self.__getGitData(cmd) #git data from Gitlab + self.tests = self.__loadCfg('ran_dashboard_cfg.yaml') #tests table setup from yaml + self.db = self.__loadFromDB() #test results from database + + + def __loadCfg(self,yaml_file): + with open(yaml_file,'r') as f: + tests = yaml.load(f) + return tests + + def __getGitData(self,cmd): + #cmd="""curl --silent "https://gitlab.eurecom.fr/api/v4/projects/oai%2Fopenairinterface5g/merge_requests?state=opened&per_page=100" """ + process = subprocess.Popen(shlex.split(cmd), stdout=subprocess.PIPE) + output = process.stdout.readline() + tmp=output.decode("utf-8") + d = json.loads(tmp) + return d + + def __loadFromDB(self): + mr_list=[] + for x in range(len(self.git)): + mr_list.append(str(self.git[x]['iid'])) + mydb=SQLConnect() + for MR in mr_list: + mydb.get(MR) + mydb.close_connection() + return mydb.data + + def Test_initHTML(self, date): + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('Test Dashboard\n') + self.f_html.write('\n') + self.f_html.write('
\n') + self.f_html.write('
\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('
OAI RAN TEST Status Dashboard
Update : '+date+'
\n') + self.f_html.write('
\n') + self.f_html.write('
\n') + + def Test_terminateHTML(self): + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.close() + + + def MR_initHTML(self,date): + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('MR Dashboard\n') + self.f_html.write('\n') + self.f_html.write('
\n') + self.f_html.write('
\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('
OAI RAN MR Status Dashboard
Update : '+date+'
\n') + self.f_html.write('
\n') + self.f_html.write('
\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + + def MR_terminateHTML(self): + self.f_html.write('
MRCreated_AtAuthorTitleAssigneeReviewerCAN STARTIN PROGRESSCOMPLETEDReview FormOK MergeMerge Conflicts
\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.close() + + + def MR_rowHTML(self,row): + self.f_html.write('\n') + self.f_html.write(''+row[1]+'\n') + self.f_html.write(''+row[2]+'\n') + self.f_html.write(''+row[3]+'\n') + self.f_html.write(''+row[4]+'\n') + self.f_html.write(''+row[5]+'\n') + self.f_html.write(''+row[6]+'\n') + if row[7]=='X': + self.f_html.write(''+row[7]+'\n') + else: + self.f_html.write('\n') + if row[8]=='X': + self.f_html.write(''+row[8]+'\n') + else: + self.f_html.write('\n') + if row[9]=='X': + self.f_html.write(''+row[9]+'\n') + else: + self.f_html.write('\n') + if row[10]=='X': + self.f_html.write(''+row[10]+'\n') + else: + self.f_html.write('\n') + if row[11]=='X': + self.f_html.write(''+row[11]+'\n') + else: + self.f_html.write('\n') + if row[12]=='YES': + self.f_html.write(''+row[12]+'\n') + else: + self.f_html.write('\n') + self.f_html.write('\n') + + + def Build(self, type, htmlfilename): + if type=='MR': + self.Build_MR_Table(htmlfilename) + elif type=='Tests': + self.Build_Test_Table(htmlfilename) + else : + print("Undefined Dashboard Type, options : MR or Tests") + + + def Build_Test_Table(self,htmlfilename): + print("Building Tests Dashboard...") + + self.f_html=open(htmlfilename,'w') + + ###update date/time, format dd/mm/YY H:M:S + now = datetime.now() + dt_string = now.strftime("%d/%m/%Y %H:%M") + #HTML table header + self.Test_initHTML(dt_string) + + + #1 table per MR if test results exist + for x in range(len(self.git)): + mr=str(self.git[x]['iid']) + if 'PASS' not in self.db[mr]: + self.f_html.write('

'+mr+''+' '+self.git[x]['title'] + '

\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write(' \n') + self.f_html.write(' \n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + + #parsing the tests + for t in self.tests: + + row=[] + short_name= t + hyperlink= self.tests[t]['link'] + job=self.tests[t]['job'] + + + if job in self.db[mr]: + if 'PASS' in self.db[mr][job]: + row.append(self.db[mr][job]['PASS']) + else: + row.append('') + if 'FAIL' in self.db[mr][job]: + row.append(self.db[mr][job]['FAIL']) + else: + row.append('') + #2 columns for last_pass and last_fail links + if 'last_pass' in self.db[mr][job]: + lastpasshyperlink= self.db[mr][job]['last_pass'][1] + lastpasstext= self.db[mr][job]['last_pass'][0] + else: + lastpasshyperlink='' + lastpasstext='' + + if 'last_fail' in self.db[mr][job]: + lastfailhyperlink= self.db[mr][job]['last_fail'][1] + lastfailtext= self.db[mr][job]['last_fail'][0] + else: + lastfailhyperlink='' + lastfailtext='' + + + + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + if row[0]!='': + self.f_html.write('\n') + else: + self.f_html.write('\n') + if row[1]!='': + self.f_html.write('\n') + else: + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + self.f_html.write('\n') + + self.f_html.write('
Test NameBenchTest# Pass# FailLast PassLast Fail
'+short_name+''+self.tests[t]['bench']+''+self.tests[t]['test']+''+str(row[0])+''+str(row[1])+''+lastpasstext+''+lastfailtext+'
\n') + + #terminate HTML table and close file + self.Test_terminateHTML() + + + def Build_MR_Table(self,htmlfilename): + + print("Building Merge Requests Dashboard...") + + self.f_html=open(htmlfilename,'w') + + ###update date/time, format dd/mm/YY H:M:S + now = datetime.now() + dt_string = now.strftime("%d/%m/%Y %H:%M") + + #HTML table header + self.MR_initHTML(dt_string) + + + ###MR data lines + for x in range(len(self.git)): + + + hyperlink= 'https://gitlab.eurecom.fr/oai/openairinterface5g/-/merge_requests/'+ str(self.git[x]['iid']) + text= str(self.git[x]['iid']) + + + date_time_str = self.git[x]['created_at'] + date_time_obj = datetime.strptime(date_time_str, '%Y-%m-%dT%H:%M:%S.%fZ') + + milestone1=milestone2=milestone3=milestone4="" + if self.git[x]['milestone']!=None: + if self.git[x]['milestone']['title']=="REVIEW_CAN_START": + milestone1="X" + elif self.git[x]['milestone']['title']=="REVIEW_IN_PROGRESS": + milestone2="X" + elif self.git[x]['milestone']['title']=="REVIEW_COMPLETED_AND_APPROVED": + milestone3="X" + elif self.git[x]['milestone']['title']=="OK_TO_BE_MERGED": + milestone4="X" + else: + pass + else: + pass + + #check if empty or not + if self.git[x]['assignee']!=None: + assignee = str(self.git[x]['assignee']['name']) + else: + assignee = "" + + #check if empty or not + if len(self.git[x]['reviewers'])!=0: + reviewer = str(self.git[x]['reviewers'][0]['name']) + else: + reviewer = "" + + if self.git[x]['has_conflicts']==True: + conflicts = "YES" + else: + conflicts = "" + + + #add a column flagging that the review form is present + #we use gitlab API to parse the MR notes + gl = gitlab.Gitlab.from_config('OAI') + project_id = 223 + project = gl.projects.get(project_id) + #get the opened MR in the project + mrs = project.mergerequests.list(state='opened',per_page=100) + review_form='' + for m in range (0,len(mrs)): + if mrs[m].iid==self.git[x]['iid']:#check the iid is the one we are on + mr_notes = mrs[m].notes.list(all=True) + n=0 + found=False + while found==False and n Date: Wed, 3 Nov 2021 14:44:25 +0100 Subject: [PATCH 11/12] fix tests description --- ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml b/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml index 3e341b7c58..011925491d 100644 --- a/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml +++ b/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml @@ -2,7 +2,7 @@ LTE-2x2 : #short name used in the dashboard job : 'RAN-LTE-2x2-Module-OAIEPC' #job name from Jenkins, used in the database link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-LTE-2x2-Module-OAIEPC' bench : 'Obelix-N310-OAIEPC-Quectel(nrmodule2)' - test : 'TM2, TDD, 20MHz, MCS9, 26Mb DL, 7Mb UL' + test : 'TM2, TDD, 40MHz, MCS9, 26Mb DL, 7Mb UL' NSA-B200 : job : 'RAN-NSA-B200-Module-LTEBOX' link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-B200-Module-LTEBOX' @@ -12,10 +12,10 @@ NSA-2x2 : job : 'RAN-NSA-2x2-Module-OAIEPC' link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-2x2-Module-OAIEPC' bench : 'Asterix-N310-Obelix-N310-OAIEPC-Quectel(nrmodule2)' - test : 'TM2, TDD, 20MHz, MCS9, 20Mb DL, 3Mb UL' + test : 'TM2, TDD, 40MHz, MCS9, 20Mb DL, 3Mb UL' SA-N310 : job : 'RAN-SA-Module-CN5G' link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G' bench : 'Asterix-N310-OAICN5G-Quectel(nrmodule2)' - test : 'TM2, TDD, 20MHz, 20Mb DL, 3Mb UL' + test : 'TM2, TDD, 40MHz, 20Mb DL, 3Mb UL' From b16d5a6f10ab8473fb60d9335e1b891e6b2a8d69 Mon Sep 17 00:00:00 2001 From: hardy Date: Tue, 16 Nov 2021 15:57:54 +0100 Subject: [PATCH 12/12] update test description in test dashboard --- ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml b/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml index 011925491d..d9339bc14a 100644 --- a/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml +++ b/ci-scripts/ran_dashboard/ran_dashboard_cfg.yaml @@ -7,15 +7,15 @@ NSA-B200 : job : 'RAN-NSA-B200-Module-LTEBOX' link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-B200-Module-LTEBOX' bench : 'Nepes-B200-Obelix-B200-LTEBOX-Quectel(idefix)' - test : 'TM1, 20MHz, 20Mb DL, 3Mb UL' + test : 'TM1, 20MHz, 60Mb DL, 3Mb UL' NSA-2x2 : job : 'RAN-NSA-2x2-Module-OAIEPC' link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-NSA-2x2-Module-OAIEPC' bench : 'Asterix-N310-Obelix-N310-OAIEPC-Quectel(nrmodule2)' - test : 'TM2, TDD, 40MHz, MCS9, 20Mb DL, 3Mb UL' + test : 'TM2, TDD, 40MHz, 60Mb DL, 3Mb UL' SA-N310 : job : 'RAN-SA-Module-CN5G' link : 'https://jenkins-oai.eurecom.fr/view/RAN/job/RAN-SA-Module-CN5G' bench : 'Asterix-N310-OAICN5G-Quectel(nrmodule2)' - test : 'TM2, TDD, 40MHz, 20Mb DL, 3Mb UL' + test : 'TM2, TDD, 40MHz, 60Mb DL, 3Mb UL'