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>
... | ... |
@@ -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 |