support/package-builder/PackageUtils.py
2820c61a
 import os
0f1fdc4b
 import platform
2820c61a
 import shutil
518d6a6f
 import re
b8ab7fb4
 import random
 import string
87815216
 from CommandUtils import CommandUtils
 from Logger import Logger
 from constants import constants
 import PullSources
45c9260c
 from SpecData import SPECS
e45f5730
 from distutils.version import LooseVersion
2820c61a
 
 class PackageUtils(object):
97a9151c
 
87815216
     def __init__(self, logName=None, logPath=None):
2820c61a
         if logName is None:
f93ef2b0
             logName = "PackageUtils"
2820c61a
         if logPath is None:
             logPath = constants.logPath
87815216
         self.logName = logName
         self.logPath = logPath
26b55679
         self.logger = Logger.getLogger(logName, logPath, constants.logLevel)
87815216
         self.runInChrootCommand = ("./run-in-chroot.sh " + constants.sourcePath +
                                    " " + constants.rpmPath)
518d6a6f
         self.rpmBinary = "rpm"
         self.installRPMPackageOptions = "-Uvh"
         self.nodepsRPMPackageOptions = "--nodeps"
97a9151c
 
518d6a6f
         self.rpmbuildBinary = "rpmbuild"
45e37dfb
         self.rpmbuildBuildallOption = "-ba --clean"
518d6a6f
         self.rpmbuildNocheckOption = "--nocheck"
87815216
         self.rpmbuildCheckOption = "-bi --clean"
518d6a6f
         self.queryRpmPackageOptions = "-qa"
         self.forceRpmPackageOptions = "--force"
7418d2bf
         self.replaceRpmPackageOptions = "--replacepkgs"
87815216
         self.adjustGCCSpecScript = "adjust-gcc-specs.sh"
         self.rpmFilesToInstallInAOneShot = ""
         self.packagesToInstallInAOneShot = ""
         self.noDepsRPMFilesToInstallInAOneShot = ""
         self.noDepsPackagesToInstallInAOneShot = ""
         self.rpmFilesToReInstallInAOneShot = ""
         self.noDepsRPMFilesToReInstallInAOneShot = ""
 
4a93976f
     def installRPM(self, package,version, chrootID, noDeps=False, destLogPath=None):
97a9151c
 
4a93976f
         rpmfile = self.findRPMFileForGivenPackage(package,version)
2820c61a
         if rpmfile is None:
87815216
             self.logger.error("No rpm file found for package:" + package)
             raise Exception("Missing rpm file: " + package)
2820c61a
 
326d5ca8
         rpmDestFile = self._copyRPM(rpmfile, chrootID + constants.topDirPath + "/RPMS")
87815216
         rpmFile = rpmDestFile.replace(chrootID, "")
542dc63c
         if noDeps:
             self.noDepsRPMFilesToInstallInAOneShot += " " + rpmFile
             self.noDepsPackagesToInstallInAOneShot += " " + package
         else:
             self.rpmFilesToInstallInAOneShot += " " + rpmFile
             self.packagesToInstallInAOneShot += " " + package
97a9151c
 
87815216
     def installRPMSInAOneShot(self, chrootID, destLogPath):
         chrootCmd = self.runInChrootCommand + " " + chrootID
         rpmInstallcmd = self.rpmBinary + " " + self.installRPMPackageOptions
7f9d2e12
         cmdUtils = CommandUtils()
542dc63c
         if self.noDepsRPMFilesToInstallInAOneShot != "":
26b55679
             self.logger.debug("Installing nodeps rpms: " +
87815216
                              self.noDepsPackagesToInstallInAOneShot)
             logFile = destLogPath + "/install_rpms_nodeps.log"
             cmd = (rpmInstallcmd+" "+self.nodepsRPMPackageOptions + " " +
                    self.noDepsRPMFilesToInstallInAOneShot)
542dc63c
             returnVal = cmdUtils.runCommandInShell(cmd, logFile, chrootCmd)
             if not returnVal:
7f9d2e12
                 self.logger.debug("Command Executed:" + cmd)
542dc63c
                 self.logger.error("Unable to install rpms")
                 raise Exception("RPM installation failed")
         if self.rpmFilesToInstallInAOneShot != "":
26b55679
             self.logger.debug("Installing rpms: " + self.packagesToInstallInAOneShot)
87815216
             logFile = destLogPath+"/install_rpms.log"
             cmd = rpmInstallcmd+" "+self.rpmFilesToInstallInAOneShot
542dc63c
             returnVal = cmdUtils.runCommandInShell(cmd, logFile, chrootCmd)
             if not returnVal:
7f9d2e12
                 self.logger.debug("Command Executed:" + cmd)
542dc63c
                 self.logger.error("Unable to install rpms")
                 raise Exception("RPM installation failed")
97a9151c
 
f93ef2b0
     def buildRPMSForGivenPackage(self, package, version, chrootID, destLogPath=None):
26b55679
         self.logger.info("Building package : " + package)
2820c61a
 
f93ef2b0
         listSourcesFiles = SPECS.getData().getSources(package, version)
         listPatchFiles = SPECS.getData().getPatches(package, version)
         specFile = SPECS.getData().getSpecFile(package, version)
45c9260c
         specName = SPECS.getData().getSpecName(package) + ".spec"
97a9151c
 
87815216
         chrootSourcePath = chrootID + constants.topDirPath + "/SOURCES/"
         chrootSpecPath = constants.topDirPath + "/SPECS/"
         chrootLogsFilePath = chrootID + constants.topDirPath + "/LOGS/" + package + ".log"
         chrootCmd = self.runInChrootCommand + " " + chrootID
         shutil.copyfile(specFile, chrootID + chrootSpecPath + specName)
97a9151c
 
aac331d9
         sources_urls, macros = self._getAdditionalBuildOptions(package)
         self.logger.debug("Extra macros for " + package + ": " + str(macros))
         self.logger.debug("Extra source URLs for " + package + ": " + str(sources_urls))
         constants.setExtraSourcesURLs(package, sources_urls)
 
b8ab7fb4
         # FIXME: some sources are located in SPECS/.. how to mount?
         #        if os.geteuid()==0:
f93ef2b0
         self._copySourcesTobuildroot(listSourcesFiles, package, version, chrootSourcePath)
         self._copySourcesTobuildroot(listPatchFiles, package, version, chrootSourcePath)
90d8acae
 
9b2f8b85
         #Adding rpm macros
343d89e8
         listRPMMacros = constants.userDefinedMacros
326d5ca8
         for macroName, value in listRPMMacros.items():
             macros.append(macroName + " " + value)
9b2f8b85
 
87815216
         listRPMFiles = []
         listSRPMFiles = []
3ad2cb4c
         try:
326d5ca8
             listRPMFiles, listSRPMFiles = self._buildRPM(chrootSpecPath + specName,
                                                          chrootLogsFilePath, chrootCmd,
                                                          package, macros)
26b55679
             logmsg = package + " build done - RPMs : [ "
             for f in listRPMFiles:
                 logmsg += (os.path.basename(f) + " ")
             logmsg += "]\n"
             self.logger.info(logmsg)
3ad2cb4c
         except Exception as e:
87815216
             self.logger.error("Failed while building rpm:" + package)
3ad2cb4c
             raise e
         finally:
             if destLogPath is not None:
87815216
                 if (constants.rpmCheck and
                         package in constants.testForceRPMS and
                         SPECS.getData().isCheckAvailable(package)):
                     cmd = ("sed -i '/^Executing(%check):/,/^Processing files:/{//!b};d' " +
                            chrootLogsFilePath)
                     logFile = destLogPath + "/adjustTestFile.log"
b5e09fac
                     returnVal = CommandUtils().runCommandInShell(cmd, logFile)
87815216
                     testLogFile = destLogPath + "/" + package + "-test.log"
b5e09fac
                     shutil.copyfile(chrootLogsFilePath, testLogFile)
                 else:
                     shutil.copy2(chrootLogsFilePath, destLogPath)
26b55679
         self.logger.debug("RPM build is successful")
b5e09fac
 
2820c61a
         for rpmFile in listRPMFiles:
326d5ca8
             self._copyRPM(chrootID + "/" + rpmFile, constants.rpmPath)
97a9151c
 
d2526915
         for srpmFile in listSRPMFiles:
326d5ca8
             srpmDestFile = self._copyRPM(chrootID + "/" + srpmFile, constants.sourceRpmPath)
97a9151c
 
f93ef2b0
     def findRPMFileForGivenPackage(self, package,version="*"):
2820c61a
         cmdUtils = CommandUtils()
4a93976f
         if version == "*":
f93ef2b0
                 version = SPECS.getData().getHighestVersion(package)
         release = SPECS.getData().getRelease(package, version)
         buildarch=SPECS.getData().getBuildArch(package, version)
87815216
         listFoundRPMFiles = sum([cmdUtils.findFile(package + "-" + version + "-" + release + "." +
f93ef2b0
                                                    buildarch+".rpm",
87815216
                                                    constants.rpmPath)], [])
42ffccb5
         if constants.inputRPMSPath is not None:
87815216
             listFoundRPMFiles = sum([cmdUtils.findFile(package + "-" + version + "-" + release +
f93ef2b0
                                                        "." + buildarch+".rpm",
                                                        constants.inputRPMSPath)],
87815216
                                     listFoundRPMFiles)
         if len(listFoundRPMFiles) == 1:
2820c61a
             return listFoundRPMFiles[0]
87815216
         if len(listFoundRPMFiles) == 0:
2820c61a
             return None
87815216
         if len(listFoundRPMFiles) > 1:
             self.logger.error("Found multiple rpm files for given package in rpm directory." +
f93ef2b0
                               "Unable to determine the rpm file for package:" + package +
                               " : " + str(listFoundRPMFiles))
518d6a6f
             raise Exception("Multiple rpm files found")
97a9151c
 
518d6a6f
     def findInstalledRPMPackages(self, chrootID):
87815216
         cmd = self.rpmBinary + " " + self.queryRpmPackageOptions
         chrootCmd = self.runInChrootCommand + " " + chrootID
         cmdUtils = CommandUtils()
         result = cmdUtils.runCommandInShell2(cmd, chrootCmd)
610ab83e
         if result is not None:
87815216
             return result.decode().split()
518d6a6f
         return result
75a2daa5
 
f93ef2b0
     def adjustGCCSpecs(self, package, version, chrootID, logPath):
         opt = " " + SPECS.getData().getSecurityHardeningOption(package, version)
87815216
         cmdUtils = CommandUtils()
         cpcmd = ("cp " + self.adjustGCCSpecScript + " " + chrootID +
                  "/tmp/" + self.adjustGCCSpecScript)
         cmd = "/tmp/" + self.adjustGCCSpecScript + opt
         logFile = logPath + "/adjustGCCSpecScript.log"
         chrootCmd = self.runInChrootCommand + " " + chrootID
8d0a7e93
         returnVal = cmdUtils.runCommandInShell(cpcmd, logFile)
         if not returnVal:
42ffccb5
             self.logger.error("Error during copying the file adjust gcc spec")
36c2f510
             raise Exception("Failed while copying adjust gcc spec file")
610ab83e
         returnVal = cmdUtils.runCommandInShell(cmd, logFile, chrootCmd)
         if returnVal:
             return
 
87815216
         self.logger.debug(cmdUtils.runCommandInShell2("ls -la " + chrootID +
                                                       "/tmp/" + self.adjustGCCSpecScript))
         self.logger.debug(cmdUtils.runCommandInShell2("lsof " + chrootID + "/tmp/" +
                                                       self.adjustGCCSpecScript))
610ab83e
         self.logger.debug(cmdUtils.runCommandInShell2("ps ax"))
 
         self.logger.error("Failed while adjusting gcc specs")
36c2f510
         raise Exception("Failed while adjusting gcc specs")
7418d2bf
 
4a93976f
     def prepRPMforInstallInContainer(self, package,version, containerID, noDeps=False, destLogPath=None):
         rpmfile = self.findRPMFileForGivenPackage(package,version)
7418d2bf
         if rpmfile is None:
             self.logger.error("No rpm file found for package: " + package)
             raise Exception("Missing rpm file")
 
326d5ca8
         rpmDestFile = self._getRPMPathInContainer(rpmfile, containerID)
7418d2bf
         if noDeps:
             self.noDepsRPMFilesToInstallInAOneShot += " " + rpmDestFile
             self.noDepsPackagesToInstallInAOneShot += " " + package
             if package in constants.listReInstallPackages:
                 self.noDepsRPMFilesToReInstallInAOneShot += " " + rpmDestFile
         else:
             self.rpmFilesToInstallInAOneShot += " " + rpmDestFile
             self.packagesToInstallInAOneShot += " " + package
             if package in constants.listReInstallPackages:
                 self.rmpFilesToReInstallInAOneShot += " " + rpmDestFile
 
     def installRPMSInAOneShotInContainer(self, containerID, destLogPath):
87815216
         rpmInstallcmd = (self.rpmBinary + " " + self.installRPMPackageOptions + " " +
                          self.forceRpmPackageOptions)
7418d2bf
 
         if self.noDepsRPMFilesToInstallInAOneShot != "":
26b55679
             self.logger.debug("PackageUtils-installRPMSInAOneShotInContainer: " +
87815216
                              "Installing nodeps rpms: " +
7418d2bf
                              self.noDepsPackagesToInstallInAOneShot)
             logFile = destLogPath + "/install_rpms_nodeps.log"
87815216
             cmd = (rpmInstallcmd + " " + self.nodepsRPMPackageOptions + " " +
                    self.noDepsRPMFilesToInstallInAOneShot)
7418d2bf
             cmd = "/bin/bash -l -c '" + cmd + "'"
87815216
             #self.logger.debug("VDBG-PU-installRPMSInAOneShotInContainer: " +
             #                  "Install nodeps cmd: " + cmd)
7418d2bf
             #TODO: Error code from exec_run
             installLog = containerID.exec_run(cmd)
             if not installLog:
                 self.logger.error("Unable to install nodeps rpms")
                 raise Exception("nodeps RPM installation failed")
87815216
             with open(logFile, 'w') as logfile:
                 logfile.write(installLog.decode())
7418d2bf
 
             if self.noDepsRPMFilesToReInstallInAOneShot != "":
87815216
                 cmd = (rpmInstallcmd + " " + self.nodepsRPMPackageOptions + " " +
                        self.forceRpmPackageOptions + " " +
                        self.noDepsRPMFilesToReInstallInAOneShot)
7418d2bf
                 cmd = "/bin/bash -l -c '" + cmd + "'"
87815216
                 #self.logger.debug("VDBG-PU-installRPMSInAOneShotInContainer: " +
                 #                  "ReInstall nodeps cmd: " + cmd)
7418d2bf
                 #TODO: Error code from exec_run
                 installLog = containerID.exec_run(cmd)
                 if not installLog:
                     self.logger.error("Unable to re-install nodeps rpms")
                     raise Exception("nodeps RPM re-installation failed")
87815216
                 with open(logFile, 'a') as logfile:
                     logfile.write(installLog.decode())
7418d2bf
 
         if self.rpmFilesToInstallInAOneShot != "":
26b55679
             self.logger.debug("PackageUtils-installRPMSInAOneShotInContainer: Installing rpms: " +
7418d2bf
                              self.packagesToInstallInAOneShot)
             logFile = destLogPath + "/install_rpms.log"
             cmd = rpmInstallcmd + " " + self.rpmFilesToInstallInAOneShot
             cmd = "/bin/bash -l -c '" + cmd + "'"
             #self.logger.debug("VDBG-PU-installRPMSInAOneShotInContainer: Install cmd: " + cmd)
             #TODO: Error code from exec_run
             installLog = containerID.exec_run(cmd)
             if not installLog:
                 self.logger.error("Unable to install rpms")
                 raise Exception("RPM installation failed")
87815216
             with open(logFile, 'w') as logfile:
                 logfile.write(installLog.decode())
7418d2bf
 
             if self.rpmFilesToReInstallInAOneShot != "":
87815216
                 cmd = (rpmInstallcmd + " " + self.forceRpmPackageOptions + " " +
                        self.rpmFilesToReInstallInAOneShot)
7418d2bf
                 cmd = "/bin/bash -l -c '" + cmd + "'"
87815216
                 #self.logger.debug("VDBG-PU-installRPMSInAOneShotInContainer: " +
                 #                  "ReInstall cmd: " + cmd)
7418d2bf
                 #TODO: Error code from exec_run
                 installLog = containerID.exec_run(cmd)
                 if not installLog:
                     self.logger.error("Unable to re-install rpms")
                     raise Exception("RPM re-installation failed")
87815216
                 with open(logFile, 'a') as logfile:
                     logfile.write(installLog.decode())
7418d2bf
 
     def findInstalledRPMPackagesInContainer(self, containerID):
         cmd = self.rpmBinary + " " + self.queryRpmPackageOptions
         cmd = "/bin/bash -l -c '" + cmd + "'"
         #TODO: Error code from exec_run
         result = containerID.exec_run(cmd)
         if result is not None:
87815216
             return result.decode().split()
7418d2bf
         return result
 
f93ef2b0
     def adjustGCCSpecsInContainer(self, package, version, containerID, logPath):
         opt = " " + SPECS.getData().getSecurityHardeningOption(package, version)
8996b6b6
         adjustCmd = "/" + self.adjustGCCSpecScript + opt
7418d2bf
         adjustCmd = "/bin/bash -l -c '" + adjustCmd + "'"
         logFile = logPath + "/adjustGCCSpecScript.log"
 
         #TODO: Error code from exec_run
         scriptLog = containerID.exec_run(adjustCmd)
         if scriptLog:
87815216
             with open(logFile, 'w') as logfile:
                 logfile.write(scriptLog.decode())
7418d2bf
             return
 
         self.logger.debug(containerID.exec_run("ls -la /tmp/" + self.adjustGCCSpecScript))
         self.logger.debug(containerID.exec_run("lsof /tmp/" + self.adjustGCCSpecScript))
         self.logger.debug(containerID.exec_run("ps ax"))
         self.logger.error("Failed while adjusting gcc specs")
         raise Exception("Failed while adjusting gcc specs")
 
f93ef2b0
     def buildRPMSForGivenPackageInContainer(self, package, version, containerID, destLogPath=None):
26b55679
         self.logger.debug("Building rpms for package " + package + " in container " +
87815216
                          containerID.short_id)
7418d2bf
 
f93ef2b0
         listSourcesFiles = SPECS.getData().getSources(package, version)
         listPatchFiles = SPECS.getData().getPatches(package, version)
         specFile = SPECS.getData().getSpecFile(package, version)
45c9260c
         specName = SPECS.getData().getSpecName(package) + ".spec"
7418d2bf
         sourcePath = constants.topDirPath + "/SOURCES/"
         specPath = constants.topDirPath + "/SPECS/"
         rpmLogFile = constants.topDirPath + "/LOGS/" + package + ".log"
         destLogFile = destLogPath + "/" + package + ".log"
         cmdUtils = CommandUtils()
 
         #TODO: mount it in, don't copy
         cpSpecCmd = "docker cp " + specFile + " " + containerID.short_id \
                         + ":" + specPath + specName
         returnVal = cmdUtils.runCommandInShell(cpSpecCmd)
         if not returnVal:
             self.logger.error("Error copying source SPEC file to container")
             raise Exception("Failed copying source SPEC to container")
 
aac331d9
         macros = []
         sources_urls, macros = self._getAdditionalBuildOptions(package)
         constants.setExtraSourcesURLs(package, sources_urls)
 
56c77555
         #FIXME: some sources are located in SPECS/.. how to mount?
         #        if os.geteuid()==0:
7418d2bf
         #TODO: mount it in, don't copy
f93ef2b0
         self._copySourcesToContainer(listSourcesFiles, package, version, containerID, sourcePath)
7418d2bf
         #TODO: mount it in, don't copy
f93ef2b0
         self._copySourcesToContainer(listPatchFiles, package, version, containerID, sourcePath)
7418d2bf
 
         # Add rpm macros
343d89e8
         listRPMMacros = constants.userDefinedMacros
326d5ca8
         for macroName, value in listRPMMacros.items():
             macros.append(macroName + " " + value)
7418d2bf
 
         # Build RPMs
87815216
         listRPMFiles = []
         listSRPMFiles = []
7418d2bf
         try:
326d5ca8
             listRPMFiles, listSRPMFiles = self._buildRPMinContainer(
87815216
                 specPath + specName,
                 rpmLogFile,
                 destLogFile,
                 containerID,
                 package,
f93ef2b0
                 version,
87815216
                 macros)
26b55679
             logmsg = "Successfully built " + package + " - RPMs : [" + "".join(os.path.basename(listRPMFiles)) + "]"
             self.logger.info(logmsg)
7418d2bf
         except Exception as e:
             self.logger.error("Failed while building rpm: " + package)
             raise e
0e4f2bff
         finally:
             if destLogPath is not None:
                 rpmLog = destLogPath + "/" + package + ".log"
87815216
                 if (constants.rpmCheck and
                         package in constants.testForceRPMS and
f93ef2b0
                         SPECS.getData().isCheckAvailable(package, version)):
87815216
                     cmd = "sed -i '/^Executing(%check):/,/^Processing files:/{//!b};d' " + rpmLog
                     logFile = destLogPath + "/adjustTestFile.log"
0e4f2bff
                     returnVal = CommandUtils().runCommandInShell(cmd, logFile)
87815216
                     testLogFile = destLogPath + "/" + package + "-test.log"
0e4f2bff
                     shutil.copyfile(rpmLog, testLogFile)
26b55679
         self.logger.debug("RPM build is successful")
7418d2bf
 
         # Verify RPM and SRPM files exist as success criteria
         for rpmFile in listRPMFiles:
             rpmName = os.path.basename(rpmFile)
326d5ca8
             rpmDestDir = self._getRPMDestDir(rpmName, constants.rpmPath)
7418d2bf
             rpmDestFile = rpmDestDir + "/" + rpmName
             if not os.path.isfile(rpmDestFile):
                 self.logger.error("Could not find RPM file: " + rpmDestFile)
                 raise Exception("Built RPM file not found.")
 
         for srpmFile in listSRPMFiles:
             srpmName = os.path.basename(srpmFile)
326d5ca8
             srpmDestDir = self._getRPMDestDir(os.path.basename(srpmFile), constants.sourceRpmPath)
7418d2bf
             srpmDestFile = srpmDestDir + "/" + srpmName
             if not os.path.isfile(srpmDestFile):
                 self.logger.error("Could not find RPM file: " + srpmDestFile)
                 raise Exception("Built SRPM file not found.")
 
326d5ca8
     def _getRPMArch(self, rpmName):
         arch = ""
         if "x86_64" in rpmName:
             arch = "x86_64"
         elif "aarch64" in rpmName:
             arch = "aarch64"
         elif "noarch" in rpmName:
             arch = "noarch"
         return arch
 
     def _getRPMDestDir(self, rpmName, rpmDir):
         arch = self._getRPMArch(rpmName)
         rpmDestDir = rpmDir + "/" + arch
         return rpmDestDir
 
     def _copyRPM(self, rpmFile, destDir):
         cmdUtils = CommandUtils()
         rpmName = os.path.basename(rpmFile)
         rpmDestDir = self._getRPMDestDir(rpmName, destDir)
         # shutil is not atomic. copy & move to ensure atomicity.
         rpmDestPath = rpmDestDir + "/" + rpmName
         rpmDestPathTemp = (rpmDestDir + "/." +
                            ''.join([random.choice(string.ascii_letters +
                                                   string.digits) for n in range(10)]))
         if os.geteuid() == 0:
             if not os.path.isdir(rpmDestDir):
                 cmdUtils.runCommandInShell("mkdir -p " + rpmDestDir)
             shutil.copyfile(rpmFile, rpmDestPathTemp)
             shutil.move(rpmDestPathTemp, rpmDestPath)
         return rpmDestPath
 
f93ef2b0
     def _verifyShaAndGetSourcePath(self, source, package, version):
326d5ca8
         cmdUtils = CommandUtils()
         # Fetch/verify sources if sha1 not None.
f93ef2b0
         sha1 = SPECS.getData().getSHA1(package, version, source)
326d5ca8
         if sha1 is not None:
a00911af
             PullSources.get(package, source, sha1, constants.sourcePath,
aac331d9
                             constants.getPullSourcesURLs(package), self.logger)
326d5ca8
 
         sourcePath = cmdUtils.findFile(source, constants.sourcePath)
         if not sourcePath:
             sourcePath = cmdUtils.findFile(source, constants.specPath)
             if not sourcePath:
                 if sha1 is None:
                     self.logger.error("No sha1 found or missing source for " + source)
                     raise Exception("No sha1 found or missing source for " + source)
                 else:
                     self.logger.error("Missing source: " + source +
                                       ". Cannot find sources for package: " + package)
                     raise Exception("Missing source")
         else:
             if sha1 is None:
                 self.logger.error("No sha1 found for "+source)
                 raise Exception("No sha1 found")
         if len(sourcePath) > 1:
             self.logger.error("Multiple sources found for source:" + source + "\n" +
                               ",".join(sourcePath) +"\nUnable to determine one.")
             raise Exception("Multiple sources found")
         return sourcePath
 
f93ef2b0
     def _copySourcesTobuildroot(self, listSourceFiles, package, version, destDir):
326d5ca8
         for source in listSourceFiles:
f93ef2b0
             sourcePath = self._verifyShaAndGetSourcePath(source, package, version)
26b55679
             self.logger.debug("Copying... Source path :" + source +
326d5ca8
                              " Source filename: " + sourcePath[0])
             shutil.copy2(sourcePath[0], destDir)
 
aac331d9
     def _getAdditionalBuildOptions(self, package):
         pullsources_urls = []
326d5ca8
         macros = []
         if package in constants.buildOptions.keys():
             pkg = constants.buildOptions[package]
aac331d9
             pullsources_urls.extend(pkg["pullsources"])
             macros.extend(pkg["macros"])
         return pullsources_urls, macros
326d5ca8
 
 
     def _buildRPM(self, specFile, logFile, chrootCmd, package, macros):
 
         rpmBuildcmd = self.rpmbuildBinary + " " + self.rpmbuildBuildallOption
 
         if constants.rpmCheck and package in constants.testForceRPMS:
26b55679
             self.logger.debug("#" * (68 + 2 * len(package)))
326d5ca8
             if not SPECS.getData().isCheckAvailable(package):
26b55679
                 self.logger.debug("####### " + package +
326d5ca8
                                  " MakeCheck is not available. Skipping MakeCheck TEST for " +
                                  package + " #######")
                 rpmBuildcmd = self.rpmbuildBinary + " --clean"
             else:
26b55679
                 self.logger.debug("####### " + package +
326d5ca8
                                  " MakeCheck is available. Running MakeCheck TEST for " +
                                  package + " #######")
                 rpmBuildcmd = self.rpmbuildBinary + " " + self.rpmbuildCheckOption
26b55679
             self.logger.debug("#" * (68 + 2 * len(package)))
326d5ca8
         else:
             rpmBuildcmd += " " + self.rpmbuildNocheckOption
 
         for macro in macros:
             rpmBuildcmd += ' --define \\\"%s\\\"' % macro
         rpmBuildcmd += " " + specFile
 
         cmdUtils = CommandUtils()
26b55679
         self.logger.debug("Building rpm....")
         self.logger.debug(rpmBuildcmd)
326d5ca8
         returnVal = cmdUtils.runCommandInShell(rpmBuildcmd, logFile, chrootCmd)
         if constants.rpmCheck and package in constants.testForceRPMS:
             if not SPECS.getData().isCheckAvailable(package):
26b55679
                 constants.testLogger.debug(package + " : N/A")
326d5ca8
             elif returnVal:
26b55679
                 constants.testLogger.debug(package + " : PASS")
326d5ca8
             else:
26b55679
                 constants.testLogger.debug(package + " : FAIL")
326d5ca8
 
         if constants.rpmCheck:
             if not returnVal and constants.rpmCheckStopOnError:
                 self.logger.error("Checking rpm is failed " + specFile)
                 raise Exception("RPM check failed")
         else:
             if not returnVal:
                 self.logger.error("Building rpm is failed " + specFile)
                 raise Exception("RPM build failed")
 
         #Extracting rpms created from log file
         listRPMFiles = []
         listSRPMFiles = []
         with open(logFile, 'r') as logfile:
             fileContents = logfile.readlines()
             for i in range(0, len(fileContents)):
                 if re.search("^Wrote:", fileContents[i]):
                     listcontents = fileContents[i].split()
                     if ((len(listcontents) == 2) and
                             listcontents[1].strip().endswith(".rpm") and
                             "/RPMS/" in listcontents[1]):
                         listRPMFiles.append(listcontents[1])
                     if ((len(listcontents) == 2) and
                             listcontents[1].strip().endswith(".src.rpm") and
                             "/SRPMS/" in listcontents[1]):
                         listSRPMFiles.append(listcontents[1])
         return listRPMFiles, listSRPMFiles
 
 
f93ef2b0
     def _copySourcesToContainer(self, listSourceFiles, package, version, containerID, destDir):
326d5ca8
         cmdUtils = CommandUtils()
         for source in listSourceFiles:
f93ef2b0
             sourcePath = self._verifyShaAndGetSourcePath(source, package, version)
26b55679
             self.logger.debug("Copying source file: " + sourcePath[0])
326d5ca8
             copyCmd = "docker cp " + sourcePath[0] + " " + containerID.short_id + ":" + destDir
             cmdUtils.runCommandInShell(copyCmd)
 
     def _getRPMPathInContainer(self, rpmFile, containerID):
         rpmName = os.path.basename(rpmFile)
         #TODO: Container path from constants
         if "PUBLISHRPMS" in rpmFile:
             rpmPath = "/publishrpms/"
         elif "PUBLISHXRPMS" in rpmFile:
             rpmPath = "/publishxrpms/"
         else:
             rpmPath = constants.topDirPath + "/RPMS/"
         if "noarch" in rpmFile:
             rpmPath += "noarch/"
         else:
             rpmPath += platform.machine()+"/"
         rpmPath += rpmName
         return rpmPath
 
 
f93ef2b0
     def _buildRPMinContainer(self, specFile, rpmLogFile, destLogFile, containerID, package, version, macros):
7418d2bf
 
7f9d2e12
         rpmBuildCmd = self.rpmbuildBinary + " " + self.rpmbuildBuildallOption
7418d2bf
 
         if constants.rpmCheck and package in constants.testForceRPMS:
26b55679
             self.logger.debug("#" * (68 + 2 * len(package)))
f93ef2b0
             if not SPECS.getData().isCheckAvailable(package, version):
26b55679
                 self.logger.debug("####### " + package +
87815216
                                  " MakeCheck is not available. Skipping MakeCheck TEST for " +
                                  package + " #######")
                 rpmBuildCmd = self.rpmbuildBinary + " --clean"
7418d2bf
             else:
26b55679
                 self.logger.debug("####### " + package +
87815216
                                  " MakeCheck is available. Running MakeCheck TEST for " +
                                  package + " #######")
                 rpmBuildCmd = self.rpmbuildBinary + " " + self.rpmbuildCheckOption
26b55679
             self.logger.debug("#" * (68 + 2 * len(package)))
7418d2bf
         else:
87815216
             rpmBuildCmd += " "+self.rpmbuildNocheckOption
7418d2bf
 
         for macro in macros:
             rpmBuildCmd += ' --define \"%s\"' % macro
         rpmBuildCmd += " " + specFile
         rpmBuildCmd = "/bin/bash -l -c '" + rpmBuildCmd + " > " + rpmLogFile + " 2>&1'"
f3936267
         rpmBuildCmd = "docker exec -t " + str(containerID.short_id) + " " + rpmBuildCmd
7418d2bf
 
         cmdUtils = CommandUtils()
26b55679
         self.logger.debug("Building rpm for package: " + package)
7418d2bf
         #TODO: Show running log of rpmbuildcmd
         #TODO: Get exit status of rpmBuildCmd
         #containerID.exec_run(rpmBuildCmd)
         returnVal = cmdUtils.runCommandInShell(rpmBuildCmd)
 
         if not os.path.isfile(destLogFile):
             self.logger.error("RPM build not file not found. Building rpm failed for: " + specFile)
             raise Exception("RPM Build failed")
 
         if constants.rpmCheck and package in constants.testForceRPMS:
f93ef2b0
             if not SPECS.getData().isCheckAvailable(package, version):
87815216
                 constants.testLogger.info(package + " : N/A")
7418d2bf
             elif returnVal:
87815216
                 constants.testLogger.info(package + " : PASS")
7418d2bf
             else:
87815216
                 constants.testLogger.error(package + " : FAIL")
7418d2bf
 
         if constants.rpmCheck:
             if not returnVal and constants.rpmCheckStopOnError:
87815216
                 self.logger.error("Checking rpm is failed " + specFile)
7418d2bf
                 raise Exception("RPM check failed")
         else:
             if not returnVal:
87815216
                 self.logger.error("Building rpm is failed " + specFile)
7418d2bf
                 raise Exception("RPM build failed")
 
         #Extracting rpms created from log file
87815216
         listRPMFiles = []
         listSRPMFiles = []
326d5ca8
         with open(destLogFile, 'r') as logfile:
             rpmBuildLogLines = logfile.readlines()
             for i in range(0, len(rpmBuildLogLines)):
                 if re.search("^Wrote:", rpmBuildLogLines[i]):
                     listcontents = rpmBuildLogLines[i].split()
                     if ((len(listcontents) == 2) and
                             listcontents[1].strip().endswith(".rpm") and
                             "/RPMS/" in listcontents[1]):
                         listRPMFiles.append(listcontents[1])
                     if ((len(listcontents) == 2) and
                             listcontents[1].strip().endswith(".src.rpm") and
                             "/SRPMS/" in listcontents[1]):
                         listSRPMFiles.append(listcontents[1])
7418d2bf
         #if not listRPMFiles:
         #    self.logger.error("Building rpm failed for " + specFile)
         #    raise Exception("RPM Build failed")
         return listRPMFiles, listSRPMFiles