Browse code

Multiversion support for dependent packages.

Added Multiversion support for dependent packages in 2.0 branch.
Aditionally, Fixed the container part of the code which was not working.

Change-Id: I771794b220588d84cfdab91fc1f0cc5e608b1bc8
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/5379
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Alexey Makhalov <amakhalov@vmware.com>
Reviewed-by: Anish Swaminathan <anishs@vmware.com>

Ankit Jain authored on 2018/07/21 00:48:50
Showing 9 changed files
... ...
@@ -14,7 +14,7 @@ from SpecData import SPECS
14 14
 class BuildContainer(PackageBuilderBase):
15 15
 
16 16
     def __init__(self, mapPackageToCycles, listAvailableCyclicPackages, listBuildOptionPackages, pkgBuildOptionFile, logName=None, logPath=None):
17
-        PackageBuilderBase.__init__(self, mapPackageToCycles, "continer")
17
+        PackageBuilderBase.__init__(self, mapPackageToCycles, "container")
18 18
         if logName is None:
19 19
             logName = "BuildContainer"
20 20
         if logPath is None:
... ...
@@ -146,10 +146,11 @@ class BuildContainer(PackageBuilderBase):
146 146
             listInstalledPackages, listInstalledRPMs = self.findInstalledPackages(containerID)
147 147
             self.logger.info(listInstalledPackages)
148 148
             listDependentPackages = self.findBuildTimeRequiredPackages(index)
149
+            listTestPackages=[]
149 150
             if constants.rpmCheck and package in constants.testForceRPMS:
150 151
                 listDependentPackages.extend(self.findBuildTimeCheckRequiredPackages(index))
151 152
                 testPackages=set(constants.listMakeCheckRPMPkgtoInstall)-set(listInstalledPackages)-set([package])
152
-                listDependentPackages.extend(testPackages)
153
+                listTestPackages = list(set(testPackages))
153 154
                 listDependentPackages=list(set(listDependentPackages))
154 155
 
155 156
             pkgUtils = PackageUtils(self.logName,self.logPath)
... ...
@@ -157,15 +158,36 @@ class BuildContainer(PackageBuilderBase):
157 157
                 self.logger.info("BuildContainer-buildPackage: Installing dependent packages..")
158 158
                 self.logger.info(listDependentPackages)
159 159
                 for pkg in listDependentPackages:
160
-                    self.installPackage(pkgUtils, pkg, containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
160
+                    properVersion=pkgUtils.getProperVersion(pkg.package,pkg)
161
+                    self.installPackage(pkgUtils, pkg.package, properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
162
+                for pkg in listTestPackages:
163
+                    flag = False
164
+                    for lineContent in listDependentPackages:
165
+                        if lineContent.package == pkg:
166
+                                properVersion=pkgUtils.getProperVersion(pkg,lineContent)
167
+                                self.installPackage(pkgUtils, pkg, properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
168
+                                flag = True
169
+                                break;
170
+                    if flag == False:
171
+                        self.installPackage(pkgUtils, pkg,"*", containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
161 172
                 # Special case sqlite due to package renamed from sqlite-autoconf to sqlite
162 173
                 if "sqlite" in listInstalledPackages or "sqlite-devel" in listInstalledPackages or "sqlite-libs" in listInstalledPackages:
174
+                    properVersion = "*"
163 175
                     if "sqlite" not in listInstalledPackages:
164
-                        self.installPackage(pkgUtils, "sqlite", containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
176
+                        for lineContent in listDependentPackages:
177
+                                if lineContent.package == "sqlite":
178
+                                        properVersion=pkgUtils.getProperVersion(lineContent.package,lineContent)
179
+                        self.installPackage(pkgUtils, "sqlite",properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
165 180
                     if "sqlite-devel" not in listInstalledPackages:
166
-                        self.installPackage(pkgUtils, "sqlite-devel", containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
181
+                        for lineContent in listDependentPackages:
182
+                                if lineContent.package == "sqlite":
183
+                                        properVersion=pkgUtils.getProperVersion(lineContent.package,lineContent)
184
+                        self.installPackage(pkgUtils, "sqlite-devel",properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
167 185
                     if "sqlite-libs" not in listInstalledPackages:
168
-                        self.installPackage(pkgUtils, "sqlite-libs", containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
186
+                        for lineContent in listDependentPackages:
187
+                                if lineContent.package == "sqlite":
188
+                                        properVersion=pkgUtils.getProperVersion(lineContent.package,lineContent)
189
+                        self.installPackage(pkgUtils, "sqlite-libs", properVersion,containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
169 190
                 pkgUtils.installRPMSInAOneShotInContainer(containerID, destLogPath)
170 191
 
171 192
             pkgUtils.adjustGCCSpecsInContainer(package, containerID, destLogPath, index)
... ...
@@ -195,9 +217,8 @@ class BuildContainer(PackageBuilderBase):
195 195
             chrUtils = ChrootUtils(self.logName,self.logPath)
196 196
             chrUtils.destroyChroot(chrootID)
197 197
 
198
-    def installPackage(self, pkgUtils, package, containerID, destLogPath, listInstalledPackages, listInstalledRPMs):
199
-        latestRPM = os.path.basename(pkgUtils.findRPMFileForGivenPackage(package)).replace(".rpm", "")
200
-        if package in listInstalledPackages and latestRPM in listInstalledRPMs:
198
+    def installPackage(self, pkgUtils, package,packageVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs):
199
+        if package in listInstalledPackages:
201 200
             return
202 201
         self.installDependentRunTimePackages(pkgUtils, package, containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
203 202
         noDeps = False
... ...
@@ -207,12 +228,14 @@ class BuildContainer(PackageBuilderBase):
207 207
             noDeps = True
208 208
         if package in constants.noDepsPackageList:
209 209
             noDeps = True
210
-        pkgUtils.prepRPMforInstallInContainer(package, containerID, noDeps, destLogPath)
210
+        pkgUtils.prepRPMforInstallInContainer(package,packageVersion, containerID, noDeps, destLogPath)
211 211
         listInstalledPackages.append(package)
212
-        listInstalledRPMs.append(latestRPM)
212
+        specificRPM = os.path.basename(pkgUtils.findRPMFileForGivenPackage(package,packageVersion)).replace(".rpm", "")
213
+        listInstalledRPMs.append(specificRPM)
213 214
 
214 215
     def installDependentRunTimePackages(self, pkgUtils, package, containerID, destLogPath, listInstalledPackages, listInstalledRPMs):
215 216
         listRunTimeDependentPackages = self.findRunTimeRequiredRPMPackages(package)
217
+        listRunTimeDependentPackagesLineContent=self.findRunTimeRequiredRPMPackagesLineContent(package)
216 218
         if len(listRunTimeDependentPackages) != 0:
217 219
             for pkg in listRunTimeDependentPackages:
218 220
                 if self.mapPackageToCycles.has_key(pkg) and pkg not in self.listAvailableCyclicPackages:
... ...
@@ -220,4 +243,12 @@ class BuildContainer(PackageBuilderBase):
220 220
                 latestPkgRPM = os.path.basename(pkgUtils.findRPMFileForGivenPackage(pkg)).replace(".rpm", "")
221 221
                 if pkg in listInstalledPackages and latestPkgRPM in listInstalledRPMs:
222 222
                     continue
223
-                self.installPackage(pkgUtils, pkg, containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
223
+                flag = False
224
+                for lineContent in listRunTimeDependentPackagesLineContent:
225
+                    if lineContent.package == pkg:
226
+                        properVersion=pkgUtils.getProperVersion(pkg,lineContent)
227
+                        self.installPackage(pkgUtils, pkg,properVersion, containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
228
+                        flag = True
229
+                        break;
230
+                if flag == False:
231
+                    self.installPackage(pkgUtils, pkg, "*",containerID, destLogPath, listInstalledPackages, listInstalledRPMs)
... ...
@@ -12,11 +12,11 @@ def removeDuplicateEntriesInList(myList):
12 12
         if p not in myListCopy:
13 13
             myListCopy.append(p)
14 14
     return myListCopy
15
-      
15
+
16 16
 class PackageBuildDataGenerator(object):
17
-    
17
+
18 18
     cycleCount=0
19
-    
19
+
20 20
     def __init__(self,logName=None,logPath=None):
21 21
         if logName is None:
22 22
             logName = "PackageBuildDataGenerator"
... ...
@@ -31,46 +31,46 @@ class PackageBuildDataGenerator(object):
31 31
         self.__runTimeDependencyGraph={}
32 32
         self.__sortedPackageList=[]
33 33
         self.__sortedBuildDependencyGraph={}
34
-    
34
+
35 35
     def getPackageBuildData(self,listPackages):
36 36
         self.__readDependencyGraphAndCyclesForGivenPackages(listPackages)
37 37
         self.__getSortedBuildOrderListForGivenPackages(listPackages)
38 38
         return self.__mapCyclesToPackageList, self.__mapPackageToCycle, self.__sortedPackageList
39 39
 
40
-    #todo    
40
+    #todo
41 41
     def findCompleteListOfPackagesRequiredToBuildGivenPackages(self,listPackages):
42
-        return self.__buildDependencyGraph.keys()    
43
- 
42
+        return self.__buildDependencyGraph.keys()
43
+
44 44
     def createSortListForPkg(self,pkg):
45 45
         runTimeDepPkgList=self.__runTimeDependencyGraph[pkg]
46 46
         runTimeDepPkgList.append(pkg)
47 47
         sortListForPkg=[]
48
-        
48
+
49 49
         for p in runTimeDepPkgList:
50 50
             basePkg=SPECS.getData().getSpecName(p)
51 51
             for bPkg in self.__sortedBuildDependencyGraph[basePkg]:
52 52
                 if bPkg not in sortListForPkg:
53 53
                     sortListForPkg.append(bPkg)
54
-        
54
+
55 55
         return sortListForPkg
56
-    
56
+
57 57
     def getCircularDependentPackages(self,pkg):
58 58
         circularDependentPackages=[]
59 59
         if self.__mapPackageToCycle.has_key(pkg):
60 60
             circularDependentPackages.extend(self.__mapCyclesToPackageList[self.__mapPackageToCycle[pkg]])
61 61
             circularDependentPackages.remove(pkg)
62 62
         return circularDependentPackages
63
-    
63
+
64 64
     def __getSortedBuildOrderListForGivenPackages(self,listPackages):
65
-        
65
+
66 66
         alreadyProcessedPackages=[]
67 67
         sortedList=[]
68 68
         completeListPackagesToBuild=self.findCompleteListOfPackagesRequiredToBuildGivenPackages(listPackages)
69 69
         packageIndexInSortedList = 0
70 70
         prevSortListLen=0
71
-        
71
+
72 72
         while completeListPackagesToBuild:
73
-            
73
+
74 74
             # find next package to process
75 75
             pkg=None
76 76
             index=-1
... ...
@@ -81,20 +81,20 @@ class PackageBuildDataGenerator(object):
81 81
                 pkg = sortedList[i]
82 82
                 packageIndexInSortedList = i
83 83
                 break
84
-                
84
+
85 85
             if pkg is None:
86 86
                 pkg = completeListPackagesToBuild.pop()
87 87
                 packageIndexInSortedList = len(sortedList)
88 88
 
89 89
             #creating sort list for package
90 90
             sortListForPkg=self.createSortListForPkg(pkg)
91
-            
91
+
92 92
             #remove any cyclic packages in sortListForPkg if they already exists in sortedList
93 93
             circularDependentPackages=self.getCircularDependentPackages(pkg)
94 94
             for p in circularDependentPackages:
95 95
                 if p in sortedList and p in sortListForPkg:
96 96
                     sortListForPkg.remove(p)
97
-            
97
+
98 98
             # insert sort list of package in global sorted list
99 99
             index=packageIndexInSortedList
100 100
             subList=[]
... ...
@@ -104,23 +104,23 @@ class PackageBuildDataGenerator(object):
104 104
                 if  p not in subList:
105 105
                     sortedList.insert(index, p)
106 106
                     index = index + 1
107
-            
107
+
108 108
             alreadyProcessedPackages.append(p)
109
-        
109
+
110 110
             # Remove duplicate entries in sorted list in intervals
111 111
             if (len(sortedList)-prevSortListLen) > 100 :
112 112
                 self.logger.info("Removing duplicates in sortedList")
113 113
                 sortedList = removeDuplicateEntriesInList(sortedList)
114 114
             else:
115 115
                 prevSortListLen=len(sortedList)
116
-                
116
+
117 117
         self.logger.info("Removing duplicates in sorted list")
118 118
         sortedList = removeDuplicateEntriesInList(sortedList)
119
-        
119
+
120 120
         self.logger.info("Sorted list:")
121 121
         self.logger.info(sortedList)
122 122
         self.__sortedPackageList=sortedList
123
-    
123
+
124 124
     def __constructBuildAndRunTimeDependencyGraph(self,package):
125 125
         basePackage=SPECS.getData().getSpecName(package)
126 126
 
... ...
@@ -130,28 +130,32 @@ class PackageBuildDataGenerator(object):
130 130
             addBuildTimeGraph = False
131 131
         if self.__runTimeDependencyGraph.has_key(basePackage):
132 132
             addRunTimeGraph=False
133
-        
133
+
134 134
         nextPackagesToConstructGraph=[]
135 135
         if addBuildTimeGraph:
136 136
             listDependentRpmPackages=SPECS.getData().getBuildRequiresForPackage(basePackage)
137 137
             listDependentPackages=[]
138 138
             for rpmPkg in listDependentRpmPackages:
139
-                basePkg=SPECS.getData().getSpecName(rpmPkg)
139
+                basePkg=SPECS.getData().getSpecName(rpmPkg.package)
140 140
                 if basePkg not in listDependentPackages:
141 141
                     listDependentPackages.append(basePkg)
142 142
             self.__buildDependencyGraph[basePackage]=listDependentPackages
143 143
             nextPackagesToConstructGraph.extend(listDependentPackages)
144
-        
144
+
145 145
         if addRunTimeGraph:
146 146
             listRpmPackages=SPECS.getData().getPackages(basePackage)
147 147
             for rpmPkg in listRpmPackages:
148 148
                 listDependentRpmPackages=SPECS.getData().getRequiresAllForPackage(rpmPkg)
149
-                self.__runTimeDependencyGraph[rpmPkg]=listDependentRpmPackages[:]
150
-                nextPackagesToConstructGraph.extend(listDependentRpmPackages)
149
+                listDependentPackages=[]
150
+                for rpmPkgs in listDependentRpmPackages:
151
+                        listDependentPackages.append(rpmPkgs.package)
152
+                listDependentPackages = list(set(listDependentPackages))
153
+                self.__runTimeDependencyGraph[rpmPkg]=listDependentPackages[:]
154
+                nextPackagesToConstructGraph.extend(listDependentPackages)
151 155
 
152 156
         for pkg in nextPackagesToConstructGraph:
153 157
             self.__constructBuildAndRunTimeDependencyGraph(pkg)
154
-    
158
+
155 159
     def __readDependencyGraphAndCyclesForGivenPackages(self,listPackages):
156 160
         self.logger.info("Reading dependency graph to check for cycles")
157 161
         for pkg in listPackages:
... ...
@@ -167,12 +171,12 @@ class PackageBuildDataGenerator(object):
167 167
         sortedPackageList,circularDependentPackages = self.topologicalSortPackages(self.__runTimeDependencyGraph)
168 168
         if len(circularDependentPackages) > 0 :
169 169
             self.__findCircularDependencies(circularDependentPackages)
170
-    
170
+
171 171
     def topologicalSortPackages(self, dependencyGraph, package=None):
172 172
         noDepPackages = Set()
173 173
         sortedPackageList = []
174 174
         dependentOfPackage = dict()
175
-        
175
+
176 176
         dependentPackages={}
177 177
         if package is None:
178 178
             dependentPackages=copy.deepcopy(dependencyGraph)
... ...
@@ -186,7 +190,7 @@ class PackageBuildDataGenerator(object):
186 186
                 dependentPackages[pkg]=dependencyGraph[pkg][:]
187 187
                 for depPkg in dependencyGraph[pkg]:
188 188
                     listDepPkgs.add(depPkg)
189
-                    
189
+
190 190
         #Find packages with no dependencies and generate dependentof_package edge list
191 191
         for pkg in dependentPackages:
192 192
             if len(dependentPackages[pkg]) == 0:
... ...
@@ -198,7 +202,7 @@ class PackageBuildDataGenerator(object):
198 198
                     else:
199 199
                         if pkg not in dependentOfPackage[depPkg]:
200 200
                             dependentOfPackage[depPkg].append(pkg)
201
-        
201
+
202 202
         while noDepPackages:
203 203
             pkg = noDepPackages.pop()
204 204
             sortedPackageList.append(pkg)
... ...
@@ -208,18 +212,18 @@ class PackageBuildDataGenerator(object):
208 208
                     dependentPackages[childPkg].remove(pkg)
209 209
                     if len(dependentPackages[childPkg])==0:
210 210
                         noDepPackages.add(childPkg)
211
-        
211
+
212 212
         # creating circular dependency graph for given dependency graph
213 213
         circularDependencyGraph={}
214 214
         listCircularPkg = dependentPackages.keys()
215 215
         for pkg in listCircularPkg:
216 216
             if len(dependentPackages[pkg]) != 0:
217 217
                 circularDependencyGraph[pkg]=dependentPackages[pkg]
218
-            
218
+
219 219
         #return (non-circular dependent package in sorted order and circular dependent package list in a dependencyGraph)
220 220
         return sortedPackageList,circularDependencyGraph
221
-    
222
-    
221
+
222
+
223 223
     def __constructDependencyMap(self,cyclicDependencyGraph):
224 224
         self.logger.info("Constructing dependency map from circular dependency graph.....")
225 225
         constructDependencyMap={}
... ...
@@ -243,15 +247,15 @@ class PackageBuildDataGenerator(object):
243 243
         self.logger.info("Dependency Map:")
244 244
         self.logger.info(constructDependencyMap)
245 245
         return constructDependencyMap
246
-        
247
-        
246
+
247
+
248 248
     def __findCircularDependencies(self,cyclicDependencyGraph):
249 249
         self.logger.info("Looking for circular dependencies")
250 250
         if len(cyclicDependencyGraph) == 0:
251 251
             return
252 252
         #step1: construct dependency map from dependency graph
253 253
         constructDependencyMap=self.__constructDependencyMap(cyclicDependencyGraph)
254
-        
254
+
255 255
         #step2: find cycles in dependency map
256 256
         self.logger.info("Finding and adding cycles using constructed dependency map......")
257 257
         cycleCount=0
... ...
@@ -264,7 +268,7 @@ class PackageBuildDataGenerator(object):
264 264
                     x = constructDependencyMap[depPkg]
265 265
                     if node in x:
266 266
                         cycPkgs.append(depPkg)
267
-                
267
+
268 268
                 if len(cycPkgs) != 0:
269 269
                     cycPkgs.append(node)
270 270
                     cycleName="cycle"+str(PackageBuildDataGenerator.cycleCount)
... ...
@@ -275,14 +279,14 @@ class PackageBuildDataGenerator(object):
275 275
                     self.logger.info("New circular dependency found:")
276 276
                     self.logger.info(cycleName+" "+ ",".join(cycPkgs))
277 277
                     cycleCount = cycleCount + 1
278
-        
278
+
279 279
         if cycleCount > 0 :
280 280
             self.logger.info("Found "+str(cycleCount) + " cycles.")
281 281
             self.logger.info("Successfully added all detected circular dependencies to list.")
282 282
         else:
283 283
             self.logger.info("No circular dependencies found.")
284
-        
285
-    
286 284
 
287
-    
288
-    
285
+
286
+
287
+
288
+
... ...
@@ -71,7 +71,7 @@ class PackageBuilder(PackageBuilderBase):
71 71
         self.listBuildOptionPackages=listBuildOptionPackages
72 72
         self.pkgBuildOptionFile=pkgBuildOptionFile
73 73
 
74
-    def prepareBuildRoot(self):
74
+    def prepareBuildRoot(self,index):
75 75
         chrootID=None
76 76
         chrootName="build-"+self.package
77 77
         try:
... ...
@@ -81,7 +81,7 @@ class PackageBuilder(PackageBuilderBase):
81 81
             if not returnVal:
82 82
                 raise Exception("Unable to prepare build root")
83 83
             tUtils=ToolChainUtils(self.logName,self.logPath)
84
-            tUtils.installToolChainRPMS(chrootID, self.package, self.listBuildOptionPackages, self.pkgBuildOptionFile, self.logPath)
84
+            tUtils.installToolChainRPMS(chrootID, self.package, self.listBuildOptionPackages, self.pkgBuildOptionFile, self.logPath,index)
85 85
         except Exception as e:
86 86
             if chrootID is not None:
87 87
                 self.logger.debug("Deleting chroot: " + chrootID)
... ...
@@ -135,20 +135,31 @@ class PackageBuilder(PackageBuilderBase):
135 135
         chrUtils = ChrootUtils(self.logName,self.logPath)
136 136
         chrootID=None
137 137
         try:
138
-            chrootID = self.prepareBuildRoot()
138
+            chrootID = self.prepareBuildRoot(index)
139 139
             listInstalledPackages=self.findInstalledPackages(chrootID)
140 140
             listDependentPackages=self.findBuildTimeRequiredPackages(index)
141
+            listTestPackages=[]
141 142
             if constants.rpmCheck and self.package in constants.testForceRPMS:
142 143
                 listDependentPackages.extend(self.findBuildTimeCheckRequiredPackages(index))
143 144
                 testPackages=set(constants.listMakeCheckRPMPkgtoInstall)-set(listInstalledPackages)-set([self.package])
144
-                listDependentPackages.extend(testPackages)
145
+                listTestPackages = list(set(testPackages))
145 146
                 listDependentPackages=list(set(listDependentPackages))
146
-
147 147
             pkgUtils = PackageUtils(self.logName,self.logPath)
148 148
             if len(listDependentPackages) != 0:
149 149
                 self.logger.info("Installing the build time dependent packages......")
150 150
                 for pkg in listDependentPackages:
151
-                    self.installPackage(pkgUtils, pkg,chrootID,self.logPath,listInstalledPackages)
151
+                    properVersion=pkgUtils.getProperVersion(pkg.package,pkg)
152
+                    self.installPackage(pkgUtils,pkg.package,properVersion,chrootID,self.logPath,listInstalledPackages)
153
+                for pkg in listTestPackages:
154
+                    flag=False
155
+                    for lineContent in listDependentPackages:
156
+                        if lineContent.package == pkg:
157
+                                properVersion=pkgUtils.getProperVersion(pkg,lineContent)
158
+                                self.installPackage(pkgUtils,pkg,properVersion,chrootID,self.logPath,listInstalledPackages)
159
+                                flag = True
160
+                                break;
161
+                    if flag == False:
162
+                        self.installPackage(pkgUtils,pkg,"*",chrootID,self.logPath,listInstalledPackages)
152 163
                 pkgUtils.installRPMSInAOneShot(chrootID,self.logPath)
153 164
                 self.logger.info("Finished installing the build time dependent packages......")
154 165
 
... ...
@@ -165,7 +176,7 @@ class PackageBuilder(PackageBuilderBase):
165 165
         if chrootID is not None:
166 166
             chrUtils.destroyChroot(chrootID)
167 167
 
168
-    def installPackage(self,pkgUtils,package,chrootID,destLogPath,listInstalledPackages):
168
+    def installPackage(self,pkgUtils,package,packageVersion,chrootID,destLogPath,listInstalledPackages):
169 169
         if package in listInstalledPackages:
170 170
             return
171 171
         # mark it as installed -  to avoid cyclic recursion
... ...
@@ -178,7 +189,8 @@ class PackageBuilder(PackageBuilderBase):
178 178
             noDeps=True
179 179
         if package in constants.noDepsPackageList:
180 180
             noDeps=True
181
-        pkgUtils.installRPM(package,chrootID,noDeps,destLogPath)
181
+
182
+        pkgUtils.installRPM(package,packageVersion,chrootID,noDeps,destLogPath)
182 183
 
183 184
     def installDependentRunTimePackages(self,pkgUtils,package,chrootID,destLogPath,listInstalledPackages):
184 185
         listRunTimeDependentPackages=self.findRunTimeRequiredRPMPackages(package)
... ...
@@ -188,6 +200,6 @@ class PackageBuilder(PackageBuilderBase):
188 188
                     continue
189 189
                 if pkg in listInstalledPackages:
190 190
                     continue
191
-                self.installPackage(pkgUtils,pkg,chrootID,destLogPath,listInstalledPackages)
191
+                self.installPackage(pkgUtils,pkg,"*",chrootID,destLogPath,listInstalledPackages)
192 192
 
193 193
 
... ...
@@ -107,7 +107,7 @@ class PackageManager(object):
107 107
                 listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(pkg)
108 108
                 needToRebuild = False
109 109
                 for dependentPkg in listDependentRpmPackages:
110
-                    if dependentPkg not in self.listOfPackagesAlreadyBuilt:
110
+                    if dependentPkg.package not in self.listOfPackagesAlreadyBuilt:
111 111
                         needToRebuild = True
112 112
                         updateBuiltRPMSList = False
113 113
                 if needToRebuild:
... ...
@@ -249,7 +249,7 @@ class PackageManager(object):
249 249
             if not returnVal:
250 250
                 raise Exception("Unable to prepare tool-chain chroot")
251 251
             tcUtils = ToolChainUtils("toolchain-chroot", self.logPath)
252
-            tcUtils.installToolChainRPMS(chrootID, "dummy")
252
+            tcUtils.installToolChainRPMS(chrootID, "dummy",self.listBuildOptionPackages,self.pkgBuildOptionFile)
253 253
         except Exception as e:
254 254
             if chrootID is not None:
255 255
                 self.logger.debug("Deleting chroot: " + chrootID)
... ...
@@ -10,6 +10,7 @@ import PullSources
10 10
 import json
11 11
 import collections
12 12
 from SpecData import SPECS
13
+from distutils.version import LooseVersion
13 14
 
14 15
 class PackageUtils(object):
15 16
 
... ...
@@ -51,6 +52,26 @@ class PackageUtils(object):
51 51
             arch="noarch"
52 52
         return arch
53 53
 
54
+    def getProperVersion(self,package,parseSpecObj):
55
+        listOfVersionObjs=SPECS.getData().getSpecObj(package)
56
+        for num in listOfVersionObjs:
57
+                if parseSpecObj.compare == 'gte':
58
+                        if LooseVersion(num.version) >= LooseVersion(parseSpecObj.version):
59
+                                return num.version
60
+                elif parseSpecObj.compare == 'lte':
61
+                        if LooseVersion(num.version) <= LooseVersion(parseSpecObj.version):
62
+                                return num.version
63
+                elif parseSpecObj.compare == 'eq':
64
+                        if LooseVersion(num.version) == LooseVersion(parseSpecObj.version):
65
+                                return num.version
66
+                elif parseSpecObj.compare == 'lt':
67
+                        if LooseVersion(num.version) < LooseVersion(parseSpecObj.version):
68
+                                return num.version
69
+                elif parseSpecObj.compare == 'gt':
70
+                        if LooseVersion(num.version) > LooseVersion(parseSpecObj.version):
71
+                                return num.version
72
+        return "*"
73
+
54 74
     def getRPMDestDir(self,rpmName,rpmDir):
55 75
         arch = self.getRPMArch(rpmName)
56 76
         rpmDestDir=rpmDir+"/"+arch
... ...
@@ -67,11 +88,11 @@ class PackageUtils(object):
67 67
             shutil.copyfile(rpmFile,  rpmDestPath)
68 68
         return rpmDestPath
69 69
 
70
-    def installRPM(self,package,chrootID,noDeps=False,destLogPath=None):
70
+    def installRPM(self,package,version,chrootID,noDeps=False,destLogPath=None):
71 71
 #        self.logger.info("Installing rpm for package:"+package)
72 72
 #        self.logger.debug("No deps:"+str(noDeps))
73 73
 
74
-        rpmfile=self.findRPMFileForGivenPackage(package)
74
+        rpmfile=self.findRPMFileForGivenPackage(package,version)
75 75
         if rpmfile is None:
76 76
             self.logger.error("No rpm file found for package:"+package)
77 77
             raise Exception("Missing rpm file: "+package)
... ...
@@ -309,7 +330,7 @@ class PackageUtils(object):
309 309
         if len(listFoundRPMFiles) == 0 :
310 310
             return None
311 311
         if len(listFoundRPMFiles) > 1 :
312
-            self.logger.error("Found multiple rpm files for given package in rpm directory.Unable to determine the rpm file for package:"+package)
312
+            self.logger.error("Found multiple rpm files for given package in rpm directory.Unable to determine the rpm file for package:"+package+ " list:"+str(listFoundRPMFiles))
313 313
             raise Exception("Multiple rpm files found")
314 314
 
315 315
     def findPackageNameFromRPMFile(self,rpmfile):
... ...
@@ -418,8 +439,8 @@ class PackageUtils(object):
418 418
         rpmPath += rpmName
419 419
         return rpmPath
420 420
 
421
-    def prepRPMforInstallInContainer(self, package, containerID, noDeps=False, destLogPath=None):
422
-        rpmfile = self.findRPMFileForGivenPackage(package)
421
+    def prepRPMforInstallInContainer(self, package, version, containerID, noDeps=False, destLogPath=None):
422
+        rpmfile = self.findRPMFileForGivenPackage(package, version)
423 423
         if rpmfile is None:
424 424
             self.logger.error("No rpm file found for package: " + package)
425 425
             raise Exception("Missing rpm file")
... ...
@@ -7,7 +7,7 @@ from Queue import PriorityQueue
7 7
 from SpecData import SPECS
8 8
 
9 9
 class Scheduler(object):
10
-    
10
+
11 11
     lock=threading.Lock()
12 12
     listOfAlreadyBuiltPackages=[]
13 13
     listOfPackagesToBuild=[]
... ...
@@ -23,24 +23,23 @@ class Scheduler(object):
23 23
     logger=None
24 24
     event=None
25 25
     stopScheduling=False
26
-    
26
+
27 27
     @staticmethod
28 28
     def setEvent(event):
29 29
         Scheduler.event=event
30
-    
30
+
31 31
     @staticmethod
32 32
     def setLog(logName,logPath):
33
-        Scheduler.logger = Logger.getLogger(logName, logPath)    
33
+        Scheduler.logger = Logger.getLogger(logName, logPath)
34 34
 
35 35
     @staticmethod
36 36
     def getBuildRequiredPackages(package):
37 37
         listRequiredRPMPackages = []
38 38
         listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package))
39
-
40 39
         listRequiredPackages = []
41 40
 
42 41
         for pkg in listRequiredRPMPackages:
43
-            basePkg = SPECS.getData().getSpecName(pkg)
42
+            basePkg = SPECS.getData().getSpecName(pkg.package)
44 43
             if basePkg not in listRequiredPackages:
45 44
                 listRequiredPackages.append(basePkg)
46 45
 
... ...
@@ -145,22 +144,20 @@ class Scheduler(object):
145 145
         Scheduler.listOfPackagesNextToBuild=[]
146 146
         Scheduler.listOfFailedPackages=[]
147 147
         Scheduler.setPriorities()
148
-        
148
+
149 149
     @staticmethod
150 150
     def getRequiredPackages(package):
151 151
         listRequiredRPMPackages=[]
152 152
         listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package))
153 153
         listRequiredRPMPackages.extend(SPECS.getData().getRequiresAllForPackage(package))
154
-        
155 154
         listRequiredPackages=[]
156 155
 
157 156
         for pkg in listRequiredRPMPackages:
158
-            basePkg=SPECS.getData().getSpecName(pkg)
157
+            basePkg=SPECS.getData().getSpecName(pkg.package)
159 158
             if basePkg not in listRequiredPackages:
160 159
                 listRequiredPackages.append(basePkg)
161
-        
162 160
         return listRequiredPackages
163
-    
161
+
164 162
     @staticmethod
165 163
     def __getListNextPackagesReadyToBuild():
166 164
         listOfPackagesNextToBuild=PriorityQueue()
... ...
@@ -230,28 +227,28 @@ class Scheduler(object):
230 230
         Scheduler.listOfPackagesCurrentlyBuilding.append(package)
231 231
         Scheduler.listOfPackagesToBuild.remove(package)
232 232
         return package
233
-    
233
+
234 234
     #can be synchronized TODO
235 235
     @staticmethod
236 236
     def notifyPackageBuildCompleted(package):
237 237
         if package in Scheduler.listOfPackagesCurrentlyBuilding:
238 238
             Scheduler.listOfPackagesCurrentlyBuilding.remove(package)
239 239
             Scheduler.listOfAlreadyBuiltPackages.append(package)
240
-    
241
-        
240
+
241
+
242 242
     #can be synchronized TODO
243 243
     @staticmethod
244 244
     def notifyPackageBuildFailed(package):
245 245
         if package in Scheduler.listOfPackagesCurrentlyBuilding:
246 246
             Scheduler.listOfPackagesCurrentlyBuilding.remove(package)
247 247
             Scheduler.listOfFailedPackages.append(package)
248
-                
248
+
249 249
     @staticmethod
250 250
     def isAllPackagesBuilt():
251 251
         if len(Scheduler.listOfPackagesToBuild) == 0 :
252 252
             return True
253 253
         return False
254
-    
254
+
255 255
     @staticmethod
256 256
     def isAnyPackagesFailedToBuild():
257 257
         if len(Scheduler.listOfFailedPackages) != 0:
... ...
@@ -177,6 +177,18 @@ class SpecObjectsUtils(object):
177 177
         specName=self.getSpecName(package)
178 178
         return len(self.mapSpecObjects[specName])
179 179
 
180
+    def getSpecObj(self, package):
181
+        specName=self.getSpecName(package)
182
+        return self.mapSpecObjects[specName]
183
+
184
+    def getPkgNamesFromObj(self, objlist):
185
+        listPkgName=[]
186
+        listPkgNames=list(set(objlist))
187
+        for name in listPkgNames:
188
+                listPkgName.append(name.package)
189
+        listPkgName=list(set(listPkgName))
190
+        return listPkgName
191
+
180 192
     def printAllObjects(self):
181 193
         listSpecs=self.mapSpecObjects.keys()
182 194
         for spec in listSpecs:
... ...
@@ -198,11 +210,11 @@ class SpecObjectsUtils(object):
198 198
             self.logger.info(" ")
199 199
             self.logger.info(" ")
200 200
             self.logger.info("Build require packages")
201
-            self.logger.info(specObj.buildRequirePackages)
201
+            self.logger.info(self.getPkgNamesFromObj(specObj.buildRequirePackages))
202 202
             self.logger.info(" ")
203 203
             self.logger.info(" ")
204 204
             self.logger.info("install require packages")
205
-            self.logger.info(specObj.installRequiresAllPackages)
205
+            self.logger.info(self.getPkgNamesFromObj(specObj.installRequiresAllPackages))
206 206
             self.logger.info(" ")
207 207
             self.logger.info(specObj.installRequiresPackages)
208 208
             self.logger.info("security_hardening: " + specObj.securityHardening)
... ...
@@ -364,11 +376,11 @@ class SerializedSpecObjects(object):
364 364
                     whoNeedsList.append(specPkg)
365 365
                 elif (inputType == "who-needs-build"):
366 366
                     for bdrq in specObj.buildRequirePackages:
367
-                        if (whoBuildDeps.has_key(bdrq)):
368
-                            whoBuildDeps[bdrq].add(specPkg)
367
+                        if (whoBuildDeps.has_key(bdrq.package)):
368
+                            whoBuildDeps[bdrq.package].add(specPkg)
369 369
                         else:
370
-                            whoBuildDeps[bdrq] = set()
371
-                            whoBuildDeps[bdrq].add(specPkg)
370
+                            whoBuildDeps[bdrq.package] = set()
371
+                            whoBuildDeps[bdrq.package].add(specPkg)
372 372
                     if(inputValue == specPkg):
373 373
                         packageFound = True
374 374
                         for depPkg in specObj.listPackages:
... ...
@@ -516,5 +528,5 @@ class SerializedSpecObjects(object):
516 516
         return self.mapSpecObjects[specName].securityHardening
517 517
 
518 518
     def getSpecDetails(self, name):
519
-        print self.mapSpecObjects[name].installRequiresAllPackages
519
+        print self.getPkgNamesFromObj(self.mapSpecObjects[name].installRequiresAllPackages)
520 520
 
... ...
@@ -147,12 +147,14 @@ class Specutils(object):
147 147
         for key in self.spec.packages.keys():
148 148
             pkg = self.spec.packages.get(key)
149 149
             for dpkg in pkg.requires:
150
-                dependentPackages.append(dpkg.package)
151
-        dependentPackages=list(set(dependentPackages))
150
+                dependentPackages.append(dpkg)
151
+        listDependentPackages = list(set(dependentPackages))
152 152
         packageNames=self.getPackageNames()
153 153
         for pkgName in packageNames:
154
-            if pkgName in dependentPackages:
155
-                dependentPackages.remove(pkgName)
154
+            for objName in listDependentPackages:
155
+                if objName.package == pkgName:
156
+                        dependentPackages.remove(objName)
157
+        dependentPackages = list(set(dependentPackages))
156 158
         return dependentPackages
157 159
 
158 160
     def getBuildRequiresAllPackages(self):
... ...
@@ -160,12 +162,14 @@ class Specutils(object):
160 160
         for key in self.spec.packages.keys():
161 161
             pkg = self.spec.packages.get(key)
162 162
             for dpkg in pkg.buildrequires:
163
-                dependentPackages.append(dpkg.package)
164
-        dependentPackages=list(set(dependentPackages))
163
+                dependentPackages.append(dpkg)
164
+        listDependentPackages = list(set(dependentPackages))
165 165
         packageNames=self.getPackageNames()
166 166
         for pkgName in packageNames:
167
-            if pkgName in dependentPackages:
168
-                dependentPackages.remove(pkgName)
167
+            for objName in listDependentPackages:
168
+                if objName.package == pkgName:
169
+                        dependentPackages.remove(objName)
170
+        dependentPackages = list(set(dependentPackages))
169 171
         return dependentPackages
170 172
 
171 173
     def getCheckBuildRequiresAllPackages(self):
... ...
@@ -173,8 +177,8 @@ class Specutils(object):
173 173
         for key in self.spec.packages.keys():
174 174
             pkg = self.spec.packages.get(key)
175 175
             for dpkg in pkg.checkbuildrequires:
176
-                dependentPackages.append(dpkg.package)
177
-        dependentPackages=list(set(dependentPackages))
176
+                dependentPackages.append(dpkg)
177
+        dependentPackages = list(set(dependentPackages))
178 178
         return dependentPackages
179 179
 
180 180
     def getRequires(self,pkgName):
... ...
@@ -10,6 +10,7 @@ import traceback
10 10
 import shutil
11 11
 import json
12 12
 import collections
13
+from SpecData import SPECS
13 14
 
14 15
 class ToolChainUtils(object):
15 16
 
... ...
@@ -117,8 +118,14 @@ class ToolChainUtils(object):
117 117
             traceback.print_exc()
118 118
             raise e
119 119
         return pkgCount
120
-                
121
-    def installToolChainRPMS(self,chrootID, packageName, listBuildOptionPackages, pkgBuildOptionFile, logPath=None):
120
+
121
+    def getListDependentPackageLineContent(self, index):
122
+        listBuildRequiresPkgLineContent=SPECS.getData().getBuildRequiresForPackage(self.package, index)
123
+        listBuildRequiresPkgLineContent.extend(SPECS.getData().getCheckBuildRequiresForPackage(self.package, index))
124
+        listBuildRequiresPkgLineContent=list(set(listBuildRequiresPkgLineContent))
125
+        return listBuildRequiresPkgLineContent
126
+
127
+    def installToolChainRPMS(self,chrootID, packageName, listBuildOptionPackages, pkgBuildOptionFile, logPath=None, index=0):
122 128
         if logPath is None:
123 129
             logPath=self.logPath
124 130
         cmdUtils = CommandUtils()
... ...
@@ -126,6 +133,9 @@ class ToolChainUtils(object):
126 126
         self.logger.info("Installing Tool Chain RPMS.......")
127 127
         rpmFiles = ""
128 128
         packages = ""
129
+        self.package=packageName
130
+        listBuildRequiresPackageLineContent = self.getListDependentPackageLineContent(index)
131
+
129 132
         for package in constants.listToolChainRPMsToInstall:
130 133
             pkgUtils=PackageUtils(self.logName,self.logPath)
131 134
             rpmFile = None
... ...
@@ -144,7 +154,10 @@ class ToolChainUtils(object):
144 144
                         for override in overridelist:
145 145
                             if package == str(override["package"].encode('utf-8')):
146 146
                                 version = str(override["version"].encode('utf-8'))
147
-
147
+            if version == "*":
148
+                for depPkg in listBuildRequiresPackageLineContent:
149
+                        if depPkg.package == package:
150
+                                version=pkgUtils.getProperVersion(package,depPkg)
148 151
             if constants.rpmCheck:
149 152
                 rpmFile=pkgUtils.findRPMFileForGivenPackage(package, version)
150 153
             else:
... ...
@@ -178,7 +191,7 @@ class ToolChainUtils(object):
178 178
         if packageName in constants.perPackageToolChain:
179 179
             print constants.perPackageToolChain[packageName]
180 180
             self.installCustomToolChainRPMS(chrootID, constants.perPackageToolChain[packageName], packageName);
181
-   
181
+
182 182
     def installCustomToolChainRPMS(self, chrootID, listOfToolChainPkgs, packageName):
183 183
         self.logger.info("Installing package specific tool chain RPMs for " + packageName + ".......")
184 184
         rpmFiles = ""