Change-Id: I5378e67c650d5fb5bd5d61f3806ed3206501c9a6
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/1840
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Divya Thaluru <dthaluru@vmware.com>
| ... | ... |
@@ -9,7 +9,7 @@ from Scheduler import Scheduler |
| 9 | 9 |
from ThreadPool import ThreadPool |
| 10 | 10 |
|
| 11 | 11 |
class PackageManager(object): |
| 12 |
- |
|
| 12 |
+ |
|
| 13 | 13 |
def __init__(self,logName=None,logPath=None): |
| 14 | 14 |
if logName is None: |
| 15 | 15 |
logName = "PackageManager" |
| ... | ... |
@@ -27,8 +27,8 @@ class PackageManager(object): |
| 27 | 27 |
self.mapThreadsLaunchTime={}
|
| 28 | 28 |
self.listAvailableCyclicPackages=[] |
| 29 | 29 |
self.listBuildOptionPackages=[] |
| 30 |
- self.pkgBuildOptionFile="" |
|
| 31 |
- |
|
| 30 |
+ self.pkgBuildOptionFile="" |
|
| 31 |
+ |
|
| 32 | 32 |
def readPackageBuildData(self, listPackages): |
| 33 | 33 |
try: |
| 34 | 34 |
pkgBuildDataGen = PackageBuildDataGenerator(self.logName,self.logPath) |
| ... | ... |
@@ -37,15 +37,16 @@ class PackageManager(object): |
| 37 | 37 |
self.logger.error("unable to get sorted list")
|
| 38 | 38 |
return False |
| 39 | 39 |
return True |
| 40 |
- |
|
| 40 |
+ |
|
| 41 | 41 |
def readAlreadyAvailablePackages(self): |
| 42 | 42 |
listAvailablePackages=[] |
| 43 |
+ listFoundRPMPackages=[] |
|
| 43 | 44 |
listRPMFiles=[] |
| 44 | 45 |
listDirectorys=[] |
| 45 | 46 |
listDirectorys.append(constants.rpmPath) |
| 46 | 47 |
if constants.inputRPMSPath is not None: |
| 47 | 48 |
listDirectorys.append(constants.inputRPMSPath) |
| 48 |
- |
|
| 49 |
+ |
|
| 49 | 50 |
while len(listDirectorys) > 0: |
| 50 | 51 |
dirPath=listDirectorys.pop() |
| 51 | 52 |
for dirEntry in os.listdir(dirPath): |
| ... | ... |
@@ -61,7 +62,19 @@ class PackageManager(object): |
| 61 | 61 |
specVersion=constants.specData.getVersion(package) |
| 62 | 62 |
specRelease=constants.specData.getRelease(package) |
| 63 | 63 |
if version == specVersion and release == specRelease: |
| 64 |
- listAvailablePackages.append(package) |
|
| 64 |
+ listFoundRPMPackages.append(package) |
|
| 65 |
+ #Mark package available only if all sub packages are available |
|
| 66 |
+ for package in listFoundRPMPackages: |
|
| 67 |
+ basePkg = constants.specData.getSpecName(package) |
|
| 68 |
+ if basePkg in listAvailablePackages: |
|
| 69 |
+ continue; |
|
| 70 |
+ listRPMPackages = constants.specData.getRPMPackages(basePkg) |
|
| 71 |
+ packageIsAlreadyBuilt = True |
|
| 72 |
+ for rpmpkg in listRPMPackages: |
|
| 73 |
+ if rpmpkg not in listFoundRPMPackages: |
|
| 74 |
+ packageIsAlreadyBuilt = False |
|
| 75 |
+ if packageIsAlreadyBuilt: |
|
| 76 |
+ listAvailablePackages.append(package) |
|
| 65 | 77 |
self.logger.info("List of Already built packages")
|
| 66 | 78 |
self.logger.info(listAvailablePackages) |
| 67 | 79 |
return listAvailablePackages |
| ... | ... |
@@ -96,11 +109,11 @@ class PackageManager(object): |
| 96 | 96 |
for pkg in listPackages: |
| 97 | 97 |
if pkg in self.listOfPackagesAlreadyBuilt: |
| 98 | 98 |
listPackagesToBuild.remove(pkg) |
| 99 |
- |
|
| 99 |
+ |
|
| 100 | 100 |
if not self.readPackageBuildData(listPackagesToBuild): |
| 101 | 101 |
return False |
| 102 | 102 |
return True |
| 103 |
- |
|
| 103 |
+ |
|
| 104 | 104 |
def buildToolChain(self): |
| 105 | 105 |
try: |
| 106 | 106 |
tUtils=ToolChainUtils() |
| ... | ... |
@@ -109,17 +122,17 @@ class PackageManager(object): |
| 109 | 109 |
self.logger.error("Unable to build tool chain")
|
| 110 | 110 |
self.logger.error(e) |
| 111 | 111 |
raise e |
| 112 |
- |
|
| 112 |
+ |
|
| 113 | 113 |
def buildToolChainPackages(self, listBuildOptionPackages, pkgBuildOptionFile, buildThreads): |
| 114 | 114 |
self.buildToolChain() |
| 115 | 115 |
self.buildGivenPackages(constants.listToolChainPackages, buildThreads) |
| 116 |
- |
|
| 116 |
+ |
|
| 117 | 117 |
def buildPackages(self,listPackages, listBuildOptionPackages, pkgBuildOptionFile, buildThreads): |
| 118 | 118 |
self.listBuildOptionPackages = listBuildOptionPackages |
| 119 | 119 |
self.pkgBuildOptionFile = pkgBuildOptionFile |
| 120 | 120 |
self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads) |
| 121 | 121 |
self.buildGivenPackages(listPackages, buildThreads) |
| 122 |
- |
|
| 122 |
+ |
|
| 123 | 123 |
def initializeThreadPool(self,statusEvent): |
| 124 | 124 |
ThreadPool.clear() |
| 125 | 125 |
ThreadPool.mapPackageToCycle=self.mapPackageToCycle |
| ... | ... |
@@ -128,57 +141,57 @@ class PackageManager(object): |
| 128 | 128 |
ThreadPool.pkgBuildOptionFile=self.pkgBuildOptionFile |
| 129 | 129 |
ThreadPool.logger=self.logger |
| 130 | 130 |
ThreadPool.statusEvent=statusEvent |
| 131 |
- |
|
| 131 |
+ |
|
| 132 | 132 |
def initializeScheduler(self,statusEvent): |
| 133 | 133 |
Scheduler.setLog(self.logName, self.logPath) |
| 134 | 134 |
Scheduler.setParams(self.sortedPackageList, self.listOfPackagesAlreadyBuilt) |
| 135 | 135 |
Scheduler.setEvent(statusEvent) |
| 136 | 136 |
Scheduler.stopScheduling=False |
| 137 |
- |
|
| 137 |
+ |
|
| 138 | 138 |
def buildGivenPackages (self, listPackages, buildThreads): |
| 139 | 139 |
returnVal=self.calculateParams(listPackages) |
| 140 | 140 |
if not returnVal: |
| 141 | 141 |
self.logger.error("Unable to set paramaters. Terminating the package manager.")
|
| 142 | 142 |
raise Exception("Unable to set paramaters")
|
| 143 |
- |
|
| 143 |
+ |
|
| 144 | 144 |
statusEvent=threading.Event() |
| 145 | 145 |
self.initializeScheduler(statusEvent) |
| 146 | 146 |
self.initializeThreadPool(statusEvent) |
| 147 |
- |
|
| 147 |
+ |
|
| 148 | 148 |
i=0 |
| 149 | 149 |
while i < buildThreads: |
| 150 | 150 |
workerName="WorkerThread"+str(i) |
| 151 | 151 |
ThreadPool.addWorkerThread(workerName) |
| 152 | 152 |
ThreadPool.startWorkerThread(workerName) |
| 153 | 153 |
i = i + 1 |
| 154 |
- |
|
| 154 |
+ |
|
| 155 | 155 |
statusEvent.wait() |
| 156 | 156 |
Scheduler.stopScheduling=True |
| 157 | 157 |
self.logger.info("Waiting for all remaining worker threads")
|
| 158 | 158 |
listWorkerObjs=ThreadPool.getAllWorkerObjects() |
| 159 | 159 |
for w in listWorkerObjs: |
| 160 | 160 |
w.join() |
| 161 |
- |
|
| 161 |
+ |
|
| 162 | 162 |
setFailFlag=False |
| 163 | 163 |
allPackagesBuilt=False |
| 164 |
- |
|
| 164 |
+ |
|
| 165 | 165 |
if Scheduler.isAnyPackagesFailedToBuild(): |
| 166 | 166 |
setFailFlag=True |
| 167 |
- |
|
| 167 |
+ |
|
| 168 | 168 |
if Scheduler.isAllPackagesBuilt(): |
| 169 | 169 |
allPackagesBuilt=True |
| 170 |
- |
|
| 170 |
+ |
|
| 171 | 171 |
if setFailFlag: |
| 172 | 172 |
self.logger.error("Some of the packages failed:")
|
| 173 | 173 |
self.logger.error(Scheduler.listOfFailedPackages) |
| 174 | 174 |
raise Exception("Failed during building package")
|
| 175 |
- |
|
| 175 |
+ |
|
| 176 | 176 |
if not setFailFlag: |
| 177 | 177 |
if allPackagesBuilt: |
| 178 | 178 |
self.logger.info("All packages built successfully")
|
| 179 | 179 |
else: |
| 180 | 180 |
self.logger.error("Build stopped unexpectedly.Unknown error.")
|
| 181 | 181 |
raise Exception("Unknown error")
|
| 182 |
- |
|
| 182 |
+ |
|
| 183 | 183 |
self.logger.info("Terminated")
|
| 184 | 184 |
|