Browse code

Package builder: fix regressions

1. Support inputRPMS in sandbox - to be able to build updated rpms
2. Fix race conditions when sandbox consuming rpm file from stage
while it is being written by other sandbox. It is the issus only
during the stage 2.

Change-Id: Idc6c91278384a60ec475ce8ae7cced2b895bb967
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/6136
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Anish Swaminathan <anishs@vmware.com>

Alexey Makhalov authored on 2018/11/09 06:34:46
Showing 8 changed files
... ...
@@ -17,24 +17,24 @@ class PackageBuilderBase(object):
17 17
         self.logger = None
18 18
         self.package = None
19 19
         self.version = None
20
+        self.doneList = None
20 21
         self.mapPackageToCycles = mapPackageToCycles
21 22
         self.listNodepsPackages = ["glibc", "gmp", "zlib", "file", "binutils", "mpfr",
22 23
                                    "mpc", "gcc", "ncurses", "util-linux", "groff", "perl",
23 24
                                    "texinfo", "rpm", "openssl", "go"]
24 25
         self.pkgBuildType = pkgBuildType
25 26
 
26
-    def buildPackageFunction(self, pkg):
27
+    def buildPackageFunction(self, pkg, doneList):
27 28
         packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
28 29
         #do not build if RPM is already built
29 30
         #test only if the package is in the testForceRPMS with rpmCheck
30 31
         #build only if the package is not in the testForceRPMS with rpmCheck
31
-        if self._checkIfPackageIsAlreadyBuilt(packageName, packageVersion):
32
-            if not constants.rpmCheck:
33
-                return
34
-            elif constants.rpmCheck and self.package not in constants.testForceRPMS:
32
+
33
+        if not constants.rpmCheck or packageName in constants.testForceRPMS:
34
+            if self._checkIfPackageIsAlreadyBuilt(packageName, packageVersion, doneList):
35 35
                 return
36 36
 
37
-        self._buildPackagePrepareFunction(packageName, packageVersion)
37
+        self._buildPackagePrepareFunction(packageName, packageVersion, doneList)
38 38
         try:
39 39
             self._buildPackage()
40 40
         except Exception as e:
... ...
@@ -42,7 +42,7 @@ class PackageBuilderBase(object):
42 42
             self.logger.exception(e)
43 43
             raise e
44 44
 
45
-    def _buildPackagePrepareFunction(self, package, version):
45
+    def _buildPackagePrepareFunction(self, package, version, doneList):
46 46
         self.package = package
47 47
         self.version = version
48 48
         self.logName = "build-" + package + "-" + version
... ...
@@ -51,6 +51,7 @@ class PackageBuilderBase(object):
51 51
             cmdUtils = CommandUtils()
52 52
             cmdUtils.runCommandInShell("mkdir -p " + self.logPath)
53 53
         self.logger = Logger.getLogger(self.logName, self.logPath, constants.logLevel)
54
+        self.doneList = doneList
54 55
 
55 56
     def _findPackageNameAndVersionFromRPMFile(self, rpmfile):
56 57
         rpmfile = os.path.basename(rpmfile)
... ...
@@ -71,16 +72,10 @@ class PackageBuilderBase(object):
71 71
                 listInstalledPackages.append(pkg)
72 72
         return listInstalledPackages, listInstalledRPMs
73 73
 
74
-    def _checkIfPackageIsAlreadyBuilt(self, package, version):
75
-        basePkg = SPECS.getData().getSpecName(package)
76
-        listRPMPackages = SPECS.getData().getRPMPackages(basePkg, version)
77
-        packageIsAlreadyBuilt = True
78
-        pkgUtils = PackageUtils()
79
-        for pkg in listRPMPackages:
80
-            if pkgUtils.findRPMFileForGivenPackage(pkg, version) is None:
81
-                packageIsAlreadyBuilt = False
82
-                break
83
-        return packageIsAlreadyBuilt
74
+    def _checkIfPackageIsAlreadyBuilt(self, package, version, doneList):
75
+        basePkg = SPECS.getData().getSpecName(package) + "-" + version
76
+        return basePkg in doneList
77
+
84 78
 
85 79
     def _findRunTimeRequiredRPMPackages(self, rpmPackage, version):
86 80
         return SPECS.getData().getRequiresForPackage(rpmPackage, version)
... ...
@@ -93,7 +88,7 @@ class PackageBuilderBase(object):
93 93
 
94 94
     def _installPackage(self, pkgUtils, package, packageVersion, sandbox, destLogPath,
95 95
                         listInstalledPackages, listInstalledRPMs):
96
-        rpmfile = pkgUtils.findRPMFileForGivenPackage(package,packageVersion);
96
+        rpmfile = pkgUtils.findRPMFile(package,packageVersion);
97 97
         if rpmfile is None:
98 98
             self.logger.error("No rpm file found for package: " + package + "-" + packageVersion)
99 99
             raise Exception("Missing rpm file")
... ...
@@ -122,7 +117,7 @@ class PackageBuilderBase(object):
122 122
                     continue
123 123
                 packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
124 124
                 latestPkgRPM = os.path.basename(
125
-                    pkgUtils.findRPMFileForGivenPackage(packageName, packageVersion)).replace(".rpm", "")
125
+                    pkgUtils.findRPMFile(packageName, packageVersion)).replace(".rpm", "")
126 126
                 if pkg in listInstalledPackages and latestPkgRPM in listInstalledRPMs:
127 127
                     continue
128 128
                 self._installPackage(pkgUtils, packageName,packageVersion, sandbox, destLogPath,listInstalledPackages, listInstalledRPMs)
... ...
@@ -217,7 +212,10 @@ class PackageBuilderChroot(PackageBuilderBase):
217 217
             chroot.create(self.package + "-" + self.version)
218 218
 
219 219
             tUtils = ToolChainUtils(self.logName, self.logPath)
220
-            tUtils.installToolChainRPMS(chroot, self.package, self.version, self.logPath)
220
+            tUtils.installToolChainRPMS(chroot, self.package,
221
+                                        self.version, self.logPath,
222
+                                        usePublishedRPMS=True,
223
+                                        availablePackages=self.doneList)
221 224
 
222 225
             listDependentPackages, listTestPackages, listInstalledPackages, listInstalledRPMs = (
223 226
                 self._findDependentPackagesAndInstalledRPM(chroot))
... ...
@@ -38,7 +38,7 @@ class PackageInfo(object):
38 38
                     debugrpmFile = debugrpmFiles[0]
39 39
                 pkgUtils = PackageUtils(self.logName, self.logPath)
40 40
                 for rpmPkg in listRPMPackages:
41
-                    rpmFile = pkgUtils.findRPMFileForGivenPackage(rpmPkg, version)
41
+                    rpmFile = pkgUtils.findRPMFile(rpmPkg, version)
42 42
                     if rpmFile is not None:
43 43
                         listPkgAttributes = {"sourcerpm":srpmFile, "rpm":rpmFile,
44 44
                                              "debugrpm":debugrpmFile}
... ...
@@ -50,7 +50,7 @@ class PackageManager(object):
50 50
             # Stage 1 build container
51 51
             #TODO image name constants.buildContainerImageName
52 52
             if pkgCount > 0 or not self.dockerClient.images.list(constants.buildContainerImage):
53
-                self._createBuildContainer()
53
+                self._createBuildContainer(True)
54 54
         self.logger.info("Step 2 : Building stage 2 of the toolchain...")
55 55
         self.logger.info(constants.listToolChainPackages)
56 56
         self.logger.info("")
... ...
@@ -61,7 +61,7 @@ class PackageManager(object):
61 61
         if self.pkgBuildType == "container":
62 62
             # Stage 2 build container
63 63
             #TODO: rebuild container only if anything in listToolChainPackages was built
64
-            self._createBuildContainer()
64
+            self._createBuildContainer(False)
65 65
 
66 66
     def buildPackages(self, listPackages, buildThreads):
67 67
         if constants.rpmCheck:
... ...
@@ -91,7 +91,7 @@ class PackageManager(object):
91 91
             return False
92 92
         return True
93 93
 
94
-    # Returns list of package names which spec file has all subpackages built
94
+    # Returns list of base package names which spec file has all subpackages built
95 95
     # Returns set of package name and version like
96 96
     # ["name1-vers1", "name2-vers2",..]
97 97
     def _readAlreadyAvailablePackages(self):
... ...
@@ -104,14 +104,12 @@ class PackageManager(object):
104 104
                 packageIsAlreadyBuilt=True
105 105
                 listRPMPackages = SPECS.getData().getRPMPackages(package, version)
106 106
                 for rpmPkg in listRPMPackages:
107
-                    if pkgUtils.findRPMFileForGivenPackage(rpmPkg, version) is None:
107
+                    if pkgUtils.findRPMFile(rpmPkg, version) is None:
108 108
                         packageIsAlreadyBuilt=False
109 109
                         break;
110 110
                 if packageIsAlreadyBuilt:
111 111
                     listAvailablePackages.add(package+"-"+version)
112 112
 
113
-        self.logger.debug("List of Already built packages")
114
-        self.logger.debug(listAvailablePackages)
115 113
         return listAvailablePackages
116 114
 
117 115
     def _calculateParams(self, listPackages):
... ...
@@ -119,28 +117,21 @@ class PackageManager(object):
119 119
         self.mapPackageToCycle.clear()
120 120
         self.sortedPackageList = []
121 121
 
122
-        self.listOfPackagesAlreadyBuilt = list(self._readAlreadyAvailablePackages())
123
-
124
-        updateBuiltRPMSList = False
125
-        while not updateBuiltRPMSList:
126
-            updateBuiltRPMSList = True
127
-            listOfPackagesAlreadyBuilt = self.listOfPackagesAlreadyBuilt
128
-            for pkg in listOfPackagesAlreadyBuilt:
129
-                packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
130
-                listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(packageName, packageVersion)
131
-                needToRebuild = False
132
-                for dependentPkg in listDependentRpmPackages:
133
-                    if dependentPkg not in self.listOfPackagesAlreadyBuilt:
134
-                        needToRebuild = True
135
-                        updateBuiltRPMSList = False
136
-                if needToRebuild:
137
-                    self.listOfPackagesAlreadyBuilt.remove(pkg)
122
+        self.listOfPackagesAlreadyBuilt = self._readAlreadyAvailablePackages()
123
+        if self.listOfPackagesAlreadyBuilt:
124
+            self.logger.debug("List of already available packages:")
125
+            self.logger.debug(self.listOfPackagesAlreadyBuilt)
138 126
 
139 127
         listPackagesToBuild = copy.copy(listPackages)
140 128
         for pkg in listPackages:
141 129
             if (pkg in self.listOfPackagesAlreadyBuilt and
142 130
                     not constants.rpmCheck):
143 131
                 listPackagesToBuild.remove(pkg)
132
+
133
+        if listPackagesToBuild:
134
+            self.logger.info("List of packages yet to be built...")
135
+            self.logger.info(listPackagesToBuild)
136
+            self.logger.info("")
144 137
         if not self._readPackageBuildData(listPackagesToBuild):
145 138
             return False
146 139
         return True
... ...
@@ -158,39 +149,23 @@ class PackageManager(object):
158 158
 
159 159
     def _initializeScheduler(self, statusEvent):
160 160
         Scheduler.setLog(self.logName, self.logPath, self.logLevel)
161
-        Scheduler.setParams(self.sortedPackageList, set(self.listOfPackagesAlreadyBuilt))
161
+        Scheduler.setParams(self.sortedPackageList, self.listOfPackagesAlreadyBuilt)
162 162
         Scheduler.setEvent(statusEvent)
163 163
         Scheduler.stopScheduling = False
164 164
 
165 165
     def _buildGivenPackages(self, listPackages, buildThreads):
166 166
         # Extend listPackages from ["name1", "name2",..] to ["name1-vers1", "name2-vers2",..]
167
-        listPackageNamesAndVersions=[]
167
+        listPackageNamesAndVersions=set()
168 168
         for pkg in listPackages:
169
-            for version in SPECS.getData().getVersions(pkg):
170
-                listPackageNamesAndVersions.append(pkg+"-"+version)
171
-        alreadyBuiltRPMS = self._readAlreadyAvailablePackages()
172
-        if alreadyBuiltRPMS:
173
-            self.logger.debug("List of already available packages:")
174
-            self.logger.debug(alreadyBuiltRPMS)
175
-
176
-        if constants.rpmCheck:
177
-            listMakeCheckPackages=set()
178
-            for pkg in listPackages:
179
-                version = SPECS.getData().getHighestVersion(pkg)
180
-                listMakeCheckPackages.add(pkg+"-"+version)
181
-            listPackageNamesAndVersions = (list(set(listPackageNamesAndVersions)|(listMakeCheckPackages-alreadyBuiltRPMS)))
169
+            base = SPECS.getData().getSpecName(pkg)
170
+            for version in SPECS.getData().getVersions(base):
171
+                listPackageNamesAndVersions.add(base+"-"+version)
182 172
 
183 173
         returnVal = self._calculateParams(listPackageNamesAndVersions)
184 174
         if not returnVal:
185 175
             self.logger.error("Unable to set paramaters. Terminating the package manager.")
186 176
             raise Exception("Unable to set paramaters")
187 177
 
188
-        listBasePackageNamesAndVersions = list(map(lambda x:SPECS.getData().getBasePkg(x), listPackageNamesAndVersions))
189
-        listPackagesToBuild = list((set(listBasePackageNamesAndVersions) - set(alreadyBuiltRPMS)))
190
-        if listPackagesToBuild:
191
-            self.logger.info("List of packages yet to be built...")
192
-            self.logger.info(listPackagesToBuild)
193
-            self.logger.info("")
194 178
         statusEvent = threading.Event()
195 179
         self._initializeScheduler(statusEvent)
196 180
         self._initializeThreadPool(statusEvent)
... ...
@@ -225,7 +200,7 @@ class PackageManager(object):
225 225
                 self.logger.error("Build stopped unexpectedly.Unknown error.")
226 226
                 raise Exception("Unknown error")
227 227
 
228
-    def _createBuildContainer(self):
228
+    def _createBuildContainer(self, usePublishedRPMs):
229 229
         self.logger.debug("Generating photon build container..")
230 230
         try:
231 231
             #TODO image name constants.buildContainerImageName
... ...
@@ -241,7 +216,7 @@ class PackageManager(object):
241 241
             chroot = Chroot(self.logger)
242 242
             chroot.create("toolchain-chroot")
243 243
             tcUtils = ToolChainUtils("toolchain-chroot", self.logPath)
244
-            tcUtils.installToolChainRPMS(chroot)
244
+            tcUtils.installToolChainRPMS(chroot, usePublishedRPMS=usePublishedRPMs)
245 245
         except Exception as e:
246 246
             if chroot:
247 247
                 chroot.destroy()
... ...
@@ -40,7 +40,7 @@ class PackageUtils(object):
40 40
         self.logfnvalue = None
41 41
 
42 42
     def prepRPMforInstall(self, package, version, noDeps=False, destLogPath=None):
43
-        rpmfile = self.findRPMFileForGivenPackage(package, version)
43
+        rpmfile = self.findRPMFile(package, version)
44 44
         if rpmfile is None:
45 45
             self.logger.error("No rpm file found for package: " + package)
46 46
             raise Exception("Missing rpm file")
... ...
@@ -51,8 +51,11 @@ class PackageUtils(object):
51 51
             rpmDestFile = "/publishrpms/"
52 52
         elif "PUBLISHXRPMS" in rpmfile:
53 53
             rpmDestFile = "/publishxrpms/"
54
+        elif constants.inputRPMSPath and constants.inputRPMSPath in rpmfile:
55
+            rpmDestFile = "/inputrpms/"
54 56
         else:
55 57
             rpmDestFile = constants.topDirPath + "/RPMS/"
58
+
56 59
         if "noarch" in rpmfile:
57 60
             rpmDestFile += "noarch/"
58 61
         else:
... ...
@@ -139,29 +142,24 @@ class PackageUtils(object):
139 139
                 CommandUtils().runCommandInShell(cmd, logfn=self.logger.debug)
140 140
         self.logger.debug("RPM build is successful")
141 141
 
142
-    def findRPMFileForGivenPackage(self, package,version="*"):
142
+    def findRPMFile(self, package,version="*"):
143 143
         cmdUtils = CommandUtils()
144 144
         if version == "*":
145 145
                 version = SPECS.getData().getHighestVersion(package)
146 146
         release = SPECS.getData().getRelease(package, version)
147 147
         buildarch=SPECS.getData().getBuildArch(package, version)
148
-        listFoundRPMFiles = sum([cmdUtils.findFile(package + "-" + version + "-" + release + "." +
149
-                                                   buildarch+".rpm",
150
-                                                   constants.rpmPath)], [])
148
+        filename= package + "-" + version + "-" + release + "." + buildarch+".rpm"
149
+
150
+        fullpath = constants.rpmPath + "/" + buildarch + "/" + filename
151
+        if os.path.isfile(fullpath):
152
+            return fullpath
153
+
151 154
         if constants.inputRPMSPath is not None:
152
-            listFoundRPMFiles = sum([cmdUtils.findFile(package + "-" + version + "-" + release +
153
-                                                       "." + buildarch+".rpm",
154
-                                                       constants.inputRPMSPath)],
155
-                                    listFoundRPMFiles)
156
-        if len(listFoundRPMFiles) == 1:
157
-            return listFoundRPMFiles[0]
158
-        if len(listFoundRPMFiles) == 0:
159
-            return None
160
-        if len(listFoundRPMFiles) > 1:
161
-            self.logger.error("Found multiple rpm files for given package in rpm directory." +
162
-                              "Unable to determine the rpm file for package:" + package +
163
-                              " : " + str(listFoundRPMFiles))
164
-            raise Exception("Multiple rpm files found")
155
+            fullpath = constants.inputRPMSPath + "/" + buildarch + "/" + filename
156
+        if os.path.isfile(fullpath):
157
+            return fullpath
158
+
159
+        return None
165 160
 
166 161
     def findInstalledRPMPackages(self, sandbox):
167 162
         rpms = None
... ...
@@ -59,6 +59,7 @@ class Chroot(Sandbox):
59 59
         cmdUtils.runCommandInShell("mkdir -p " + chrootID + "/tmp")
60 60
         cmdUtils.runCommandInShell("mkdir -p " + chrootID + "/publishrpms")
61 61
         cmdUtils.runCommandInShell("mkdir -p " + chrootID + "/publishxrpms")
62
+        cmdUtils.runCommandInShell("mkdir -p " + chrootID + "/inputrpms")
62 63
         cmdUtils.runCommandInShell("mkdir -p " + chrootID + constants.topDirPath)
63 64
         cmdUtils.runCommandInShell("mkdir -p " + chrootID + constants.topDirPath + "/RPMS")
64 65
         cmdUtils.runCommandInShell("mkdir -p " + chrootID + constants.topDirPath + "/SRPMS")
... ...
@@ -83,6 +84,9 @@ class Chroot(Sandbox):
83 83
                                         chrootID + "/publishrpms")
84 84
             cmdUtils.runCommandInShell("mount -o ro --bind " + constants.prevPublishXRPMRepo + " " +
85 85
                                         chrootID + "/publishxrpms")
86
+            if constants.inputRPMSPath:
87
+                cmdUtils.runCommandInShell("mount -o ro --bind " + constants.inputRPMSPath + " " +
88
+                                            chrootID + "/inputrpms")
86 89
 
87 90
         self.logger.debug("Successfully created chroot:" + chrootID)
88 91
 
... ...
@@ -180,6 +184,9 @@ class Container(Sandbox):
180 180
             constants.dockerUnixSocket: {'bind': constants.dockerUnixSocket, 'mode': 'rw'}
181 181
             }
182 182
 
183
+        if constants.inputRPMSPath:
184
+            mountVols[constants.inputRPMSPath] = {'bind': '/inputrpms', 'mode': 'ro'}
185
+
183 186
         containerName = containerName.replace("+", "p")
184 187
         try:
185 188
             oldContainerID = self.dockerClient.containers.get(containerName)
... ...
@@ -96,6 +96,10 @@ class Scheduler(object):
96 96
             return package
97 97
 
98 98
     @staticmethod
99
+    def getDoneList():
100
+        return list(Scheduler.listOfAlreadyBuiltPackages)
101
+
102
+    @staticmethod
99 103
     def _getBuildRequiredPackages(pkg):
100 104
         listRequiredRPMPackages = []
101 105
         listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPkg(pkg))
... ...
@@ -26,7 +26,7 @@ class ToolChainUtils(object):
26 26
         else:
27 27
             self.rpmCommand = "fakeroot-ng rpm"
28 28
 
29
-    def findRPMFileInGivenLocation(self, package, rpmdirPath):
29
+    def _findPublishedRPM(self, package, rpmdirPath):
30 30
         listFoundRPMFiles = CommandUtils.findFile(package + "-*.rpm", rpmdirPath)
31 31
         listFilterRPMFiles = []
32 32
         for f in listFoundRPMFiles:
... ...
@@ -55,7 +55,7 @@ class ToolChainUtils(object):
55 55
             coreToolChainYetToBuild = []
56 56
             for package in constants.listCoreToolChainPackages:
57 57
                 version = SPECS.getData().getHighestVersion(package)
58
-                rpmPkg = pkgUtils.findRPMFileForGivenPackage(package, version)
58
+                rpmPkg = pkgUtils.findRPMFile(package, version)
59 59
                 if rpmPkg is not None:
60 60
                     continue
61 61
                 else:
... ...
@@ -93,7 +93,7 @@ class ToolChainUtils(object):
93 93
         listBuildRequiresPkg.extend(SPECS.getData().getCheckBuildRequiresForPackage(package, version))
94 94
         return listBuildRequiresPkg
95 95
 
96
-    def installToolChainRPMS(self, chroot, packageName=None, packageVersion=None, logPath=None):
96
+    def installToolChainRPMS(self, chroot, packageName=None, packageVersion=None, logPath=None, usePublishedRPMS=True, availablePackages=None):
97 97
         if logPath is None:
98 98
             logPath = self.logPath
99 99
         self.logger.debug("Installing Tool Chain RPMS.......")
... ...
@@ -105,30 +105,51 @@ class ToolChainUtils(object):
105 105
         for package in constants.listToolChainRPMsToInstall:
106 106
             pkgUtils = PackageUtils(self.logName, self.logPath)
107 107
             rpmFile = None
108
-            version = "*"
108
+            version = None
109
+
110
+            # Get proper package version
109 111
             for depPkg in listBuildRequiresPackages:
110 112
                 depPkgName, depPkgVersion = StringUtils.splitPackageNameAndVersion(depPkg)
111 113
                 if depPkgName == package:
112 114
                         version=depPkgVersion
115
+                        break
116
+            if not version:
117
+                version = SPECS.getData().getHighestVersion(package)
118
+
119
+            basePkg = SPECS.getData().getSpecName(package)+"-"+version
120
+            isAvailable = (availablePackages and basePkg in availablePackages)
121
+
113 122
             if constants.rpmCheck:
114
-                rpmFile = pkgUtils.findRPMFileForGivenPackage(package, version)
115
-            elif (packageName is None or 
116
-                    packageName not in constants.listToolChainRPMsToInstall or
117
-                    constants.listToolChainRPMsToInstall.index(packageName) >
123
+                rpmFile = pkgUtils.findRPMFile(package, version)
124
+
125
+            if rpmFile is None:
126
+                # Honor the toolchain list order.
127
+                # if index of depended package ('package') is more
128
+                # then index of the current package that we are
129
+                # building ('packageName'), then we _must_ use published
130
+                # `package` rpm.
131
+                if (packageName and
132
+                    packageName in constants.listToolChainRPMsToInstall and
133
+                    constants.listToolChainRPMsToInstall.index(packageName) <
118 134
                         constants.listToolChainRPMsToInstall.index(package)):
119
-                rpmFile = pkgUtils.findRPMFileForGivenPackage(package, version)
135
+                    isAvailable = False
136
+                else:
137
+                    rpmFile = pkgUtils.findRPMFile(package, version)
138
+
120 139
             if rpmFile is None:
140
+                if not usePublishedRPMS or isAvailable:
141
+                    raise Exception("%s-%s not found in available packages" % (package, version))
142
+
121 143
                 # sqlite-autoconf package was renamed, but it still published as sqlite-autoconf
122 144
                 if (package == "sqlite") and (platform.machine() == "x86_64"):
123 145
                     package = "sqlite-autoconf"
124
-                rpmFile = self.findRPMFileInGivenLocation(package, constants.prevPublishRPMRepo)
146
+                rpmFile = self._findPublishedRPM(package, constants.prevPublishRPMRepo)
125 147
                 if rpmFile is None:
126 148
                     if package in constants.listOfRPMsProvidedAfterBuild:
127 149
                         self.logger.debug("No old version of " + package +
128 150
                                          " exists, skip until the new version is built")
129 151
                         continue
130
-                    self.logger.error("Unable to find rpm " + package +
131
-                                      " in current and previous versions")
152
+                    self.logger.error("Unable to find published rpm " + package)
132 153
                     raise Exception("Input Error")
133 154
             rpmFiles += " " + rpmFile
134 155
             packages += " " + package+"-"+version
... ...
@@ -161,7 +182,7 @@ class ToolChainUtils(object):
161 161
             else:
162 162
                 path = constants.prevPublishRPMRepo
163 163
                 sandboxPath = "/publishrpms"
164
-            rpmFile = self.findRPMFileInGivenLocation(package, path)
164
+            rpmFile = self._findPublishedRPM(package, path)
165 165
             if rpmFile is None:
166 166
                 self.logger.error("Unable to find rpm "+ package +
167 167
                                   " in current and previous versions")
... ...
@@ -21,6 +21,7 @@ class WorkerThread(threading.Thread):
21 21
         self.logger.debug("Thread " + self.name + " is starting now")
22 22
         while True:
23 23
             pkg = Scheduler.Scheduler.getNextPackageToBuild()
24
+            doneList = Scheduler.Scheduler.getDoneList()
24 25
             if pkg is None:
25 26
                 break
26 27
             if self.pkgBuildType == "chroot":
... ...
@@ -30,7 +31,7 @@ class WorkerThread(threading.Thread):
30 30
                 pkgBuilder = PackageBuilderContainer(self.mapPackageToCycle,
31 31
                                                      self.pkgBuildType)
32 32
             try:
33
-                pkgBuilder.buildPackageFunction(pkg)
33
+                pkgBuilder.buildPackageFunction(pkg, doneList)
34 34
             except Exception as e:
35 35
                 self.logger.exception(e)
36 36
                 buildThreadFailed = True