diff --git a/ci-scripts/cls_containerize.py b/ci-scripts/cls_containerize.py index 0978c0a7d3117ada5f6f9d7b3f361e4fbb47cf46..6d9b20bc68ae724a3eabef2891dbf168fb9baf06 100644 --- a/ci-scripts/cls_containerize.py +++ b/ci-scripts/cls_containerize.py @@ -68,6 +68,58 @@ def CopyLogsToExecutor(sshSession, sourcePath, log_name, scpIp, scpUser, scpPw): sshSession.command(f'rm -f {log_name}.zip','\$', 5) ZipFile(f'{log_name}.zip').extractall('.') +def AnalyzeBuildLogs(buildRoot, images, globalStatus): + collectInfo = {} + for image in images: + files = {} + file_list = [f for f in os.listdir(f'{buildRoot}/{image}') if os.path.isfile(os.path.join(f'{buildRoot}/{image}', f)) and f.endswith('.txt')] + # Analyze the "sub-logs" of every target image + for fil in file_list: + errorandwarnings = {} + warningsNo = 0 + errorsNo = 0 + with open(f'{buildRoot}/{image}/{fil}', mode='r') as inputfile: + for line in inputfile: + result = re.search(' ERROR ', str(line)) + if result is not None: + errorsNo += 1 + result = re.search(' error:', str(line)) + if result is not None: + errorsNo += 1 + result = re.search(' WARNING ', str(line)) + if result is not None: + warningsNo += 1 + result = re.search(' warning:', str(line)) + if result is not None: + warningsNo += 1 + errorandwarnings['errors'] = errorsNo + errorandwarnings['warnings'] = warningsNo + errorandwarnings['status'] = globalStatus + files[fil] = errorandwarnings + # Analyze the target image + if os.path.isfile(f'{buildRoot}/{image}.log'): + errorandwarnings = {} + committed = False + tagged = False + with open(f'{buildRoot}/{image}.log', mode='r') as inputfile: + startOfTargetImageCreation = False # check for tagged/committed only after image created + for line in inputfile: + result = re.search(f'FROM .* [aA][sS] {image}$', str(line)) + if result is not None: + startOfTargetImageCreation = True + if startOfTargetImageCreation: + lineHasTag = re.search(f'Successfully tagged {image}:', str(line)) is not None + tagged = tagged or lineHasTag + # the OpenShift Cluster builder prepends image registry URL + lineHasCommit = re.search(f'COMMIT [a-zA-Z0-9\.:/\-]*{image}', str(line)) is not None + committed = committed or lineHasCommit + errorandwarnings['errors'] = 0 if committed or tagged else 1 + errorandwarnings['warnings'] = 0 + errorandwarnings['status'] = committed or tagged + files['Target Image Creation'] = errorandwarnings + collectInfo[image] = files + return collectInfo + #----------------------------------------------------------- # Class Declaration #----------------------------------------------------------- @@ -112,7 +164,6 @@ class Containerize(): self.dockerfileprefix = '' self.host = '' self.allImagesSize = {} - self.collectInfo = {} self.deployedContainers = [] self.tsharkStarted = False @@ -364,71 +415,18 @@ class Containerize(): CopyLogsToExecutor(mySSH, lSourcePath, build_log_name, lIpAddr, lUserName, lPassWord) mySSH.close() - # Analyzing the logs - # Trying to identify the errors and warnings for each built images - imageNames1 = imageNames - base = ('ran-base','ran') - imageNames1.insert(0, base) - for image,pattern in imageNames1: - files = {} - file_list = [f for f in os.listdir('build_log_' + self.testCase_id + '/' + image) if os.path.isfile(os.path.join('build_log_' + self.testCase_id + '/' + image, f)) and f.endswith('.txt')] - for fil in file_list: - errorandwarnings = {} - warningsNo = 0 - errorsNo = 0 - with open('build_log_{}/{}/{}'.format(self.testCase_id,image,fil), mode='r') as inputfile: - for line in inputfile: - result = re.search(' ERROR ', str(line)) - if result is not None: - errorsNo += 1 - result = re.search(' error:', str(line)) - if result is not None: - errorsNo += 1 - result = re.search(' WARNING ', str(line)) - if result is not None: - warningsNo += 1 - result = re.search(' warning:', str(line)) - if result is not None: - warningsNo += 1 - errorandwarnings['errors'] = errorsNo - errorandwarnings['warnings'] = warningsNo - errorandwarnings['status'] = status - files[fil] = errorandwarnings - # Let analyze the target image creation part - if os.path.isfile('build_log_{}/{}.log'.format(self.testCase_id,image)): - errorandwarnings = {} - with open('build_log_{}/{}.log'.format(self.testCase_id,image), mode='r') as inputfile: - startOfTargetImageCreation = False - buildStatus = False - for line in inputfile: - result = re.search('FROM .* [aA][sS] ' + image + '$', str(line)) - if result is not None: - startOfTargetImageCreation = True - if startOfTargetImageCreation: - result = re.search('Successfully tagged ' + image + ':', str(line)) - if result is not None: - buildStatus = True - result = re.search('COMMIT ' + image + ':', str(line)) - if result is not None: - buildStatus = True - inputfile.close() - if buildStatus: - errorandwarnings['errors'] = 0 - else: - errorandwarnings['errors'] = 1 - errorandwarnings['warnings'] = 0 - errorandwarnings['status'] = buildStatus - files['Target Image Creation'] = errorandwarnings - self.collectInfo[image] = files + # Analyze the logs + images = ['ran-base'] + [tpl[0] for tpl in imageNames] + collectInfo = AnalyzeBuildLogs(build_log_name, images, status) if status: logging.info('\u001B[1m Building OAI Image(s) Pass\u001B[0m') HTML.CreateHtmlTestRow(self.imageKind, 'OK', CONST.ALL_PROCESSES_OK) - HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize) + HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, self.allImagesSize) else: logging.error('\u001B[1m Building OAI Images Failed\u001B[0m') HTML.CreateHtmlTestRow(self.imageKind, 'KO', CONST.ALL_PROCESSES_OK) - HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize) + HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, self.allImagesSize) HTML.CreateHtmlTabFooter(False) sys.exit(1) @@ -550,7 +548,8 @@ class Containerize(): errorandwarnings['warnings'] = 0 errorandwarnings['status'] = True files['Target Image Creation'] = errorandwarnings - self.collectInfo['proxy'] = files + collectInfo = {} + collectInfo['proxy'] = files mySSH.command('docker image inspect --format=\'Size = {{.Size}} bytes\' proxy:' + tag, '\$', 5) result = re.search('Size *= *(?P<size>[0-9\-]+) *bytes', mySSH.getBefore()) if result is not None: @@ -567,7 +566,7 @@ class Containerize(): logging.info('\u001B[1m Building L2sim Proxy Image Pass\u001B[0m') HTML.CreateHtmlTestRow('commit ' + tag, 'OK', CONST.ALL_PROCESSES_OK) - HTML.CreateHtmlNextTabHeaderTestRow(self.collectInfo, self.allImagesSize) + HTML.CreateHtmlNextTabHeaderTestRow(collectInfo, self.allImagesSize) def Copy_Image_to_Test_Server(self, HTML): imageTag = 'develop'