Browse code

PackageBuilder: Version based multiversion support

Replaced index based multiversion support with
version based multiversion support.
* Removed SerializedSpecObjects class in SpecData.py
* Added logic to get the overriden package(gcc) version
in PackageBuilder.py

Change-Id: Ia5c5e8edc40010a5909a4fb37d6cdf88bcc01112
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/6222
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Alexey Makhalov <amakhalov@vmware.com>

Ankit Jain authored on 2018/11/22 13:30:15
Showing 16 changed files
... ...
@@ -108,7 +108,7 @@ find %{buildroot}%{_libdir} -name '*.la' -delete
108 108
 %changelog
109 109
 *   Tue Jan 23 2018 Xiaolin Li <xiaolinl@vmware.com> 1.2.2-2
110 110
 -   Add serf-devel to BuildRequires.
111
-*   Tue Oct 11 2017 Dheeraj Shetty <dheerajs@vmware.com> 1.2.2-1
111
+*   Tue Oct 10 2017 Dheeraj Shetty <dheerajs@vmware.com> 1.2.2-1
112 112
 -   Updated to version 1.2.2
113 113
 *   Mon Oct 02 2017 Vinay Kulkarni <kulkarniv@vmware.com> 1.2.0-7
114 114
 -   Use multiple cores to build mesos.
... ...
@@ -125,7 +125,7 @@
125 125
         "pycurl3",
126 126
         "python3-yum-metadata-parser",
127 127
         "strace",
128
-        "cracklib-python3",
128
+        "python3-cracklib",
129 129
         "haveged",
130 130
         "vim-extra",
131 131
         "postgresql",
... ...
@@ -243,16 +243,19 @@ class Installer(object):
243 243
         # prepare the RPMs list
244 244
         json_pkg_to_rpm_map = JsonWrapper(self.install_config["pkg_to_rpm_map_file"])
245 245
         pkg_to_rpm_map = json_pkg_to_rpm_map.read()
246
-
247 246
         self.rpms_tobeinstalled = []
248 247
         selected_packages = self.install_config['packages']
249 248
 
250 249
         for pkg in selected_packages: 
251
-            if pkg in pkg_to_rpm_map:
252
-                if not pkg_to_rpm_map[pkg]['rpm'] is None:
253
-                    name = pkg_to_rpm_map[pkg]['rpm']
250
+            versionindex = pkg.rfind("-")
251
+            if versionindex == -1:
252
+                raise Exception("Invalid pkg name: " + pkg)
253
+            package = pkg[:versionindex]
254
+            if package in pkg_to_rpm_map:
255
+                if pkg_to_rpm_map[package]['rpm']:
256
+                    name = pkg_to_rpm_map[package]['rpm']
254 257
                     basename = os.path.basename(name)
255
-                    self.rpms_tobeinstalled.append({'filename': basename, 'path': name, 'package' : pkg})
258
+                    self.rpms_tobeinstalled.append({'filename': basename, 'path': name, 'package' : package})
256 259
 
257 260
         # Copy the rpms
258 261
         for rpm in self.rpms_tobeinstalled:
... ...
@@ -1,4 +1,5 @@
1 1
 from Logger import Logger
2
+from collections import OrderedDict
2 3
 from constants import constants
3 4
 from sets import Set
4 5
 import copy
... ...
@@ -6,13 +7,6 @@ from SpecData import SPECS
6 6
 
7 7
 
8 8
 
9
-def removeDuplicateEntriesInList(myList):
10
-    myListCopy=[]
11
-    for p in myList:
12
-        if p not in myListCopy:
13
-            myListCopy.append(p)
14
-    return myListCopy
15
-
16 9
 class PackageBuildDataGenerator(object):
17 10
 
18 11
     cycleCount=0
... ...
@@ -32,22 +26,29 @@ class PackageBuildDataGenerator(object):
32 32
         self.__sortedPackageList=[]
33 33
         self.__sortedBuildDependencyGraph={}
34 34
 
35
+    def removeDuplicateEntries(self, myList):
36
+        myListCopy = list(OrderedDict.fromkeys(myList))
37
+        return myListCopy
38
+
35 39
     def getPackageBuildData(self,listPackages):
36
-        self.__readDependencyGraphAndCyclesForGivenPackages(listPackages)
37
-        self.__getSortedBuildOrderListForGivenPackages(listPackages)
40
+        basePackages = []
41
+        for pkg in listPackages:
42
+            basePackages.append(SPECS.getData().getBasePkg(pkg))
43
+        self.__readDependencyGraphAndCyclesForGivenPackages(basePackages)
44
+        self.__getSortedBuildOrderListForGivenPackages()
38 45
         return self.__mapCyclesToPackageList, self.__mapPackageToCycle, self.__sortedPackageList
39 46
 
40 47
     #todo
41
-    def findCompleteListOfPackagesRequiredToBuildGivenPackages(self,listPackages):
42
-        return self.__buildDependencyGraph.keys()
48
+    def findCompleteListOfPackagesRequiredToBuildGivenPackages(self):
49
+        return list(self.__buildDependencyGraph.keys())
43 50
 
44 51
     def createSortListForPkg(self,pkg):
45
-        runTimeDepPkgList=self.__runTimeDependencyGraph[pkg]
52
+        runTimeDepPkgList=list(set(self.__runTimeDependencyGraph[pkg]))
46 53
         runTimeDepPkgList.append(pkg)
47 54
         sortListForPkg=[]
48 55
 
49 56
         for p in runTimeDepPkgList:
50
-            basePkg=SPECS.getData().getSpecName(p)
57
+            basePkg=SPECS.getData().getBasePkg(p)
51 58
             for bPkg in self.__sortedBuildDependencyGraph[basePkg]:
52 59
                 if bPkg not in sortListForPkg:
53 60
                     sortListForPkg.append(bPkg)
... ...
@@ -61,21 +62,21 @@ class PackageBuildDataGenerator(object):
61 61
             circularDependentPackages.remove(pkg)
62 62
         return circularDependentPackages
63 63
 
64
-    def __getSortedBuildOrderListForGivenPackages(self,listPackages):
64
+    def __getSortedBuildOrderListForGivenPackages(self):
65 65
 
66
-        alreadyProcessedPackages=[]
67
-        sortedList=[]
68
-        completeListPackagesToBuild=self.findCompleteListOfPackagesRequiredToBuildGivenPackages(listPackages)
66
+        alreadyProcessedPackages = set()
67
+        sortedList = []
68
+        completeListPackagesToBuild = self.findCompleteListOfPackagesRequiredToBuildGivenPackages()
69 69
         packageIndexInSortedList = 0
70
-        prevSortListLen=0
70
+        prevSortListLen = 0
71 71
 
72 72
         while completeListPackagesToBuild:
73 73
 
74 74
             # find next package to process
75
-            pkg=None
76
-            index=-1
77
-            lenList=len(sortedList)
78
-            for  i in range(lenList):
75
+            pkg = None
76
+            index = -1
77
+            lenList = len(sortedList)
78
+            for i in range(lenList):
79 79
                 if sortedList[i] in alreadyProcessedPackages:
80 80
                     continue
81 81
                 pkg = sortedList[i]
... ...
@@ -87,72 +88,66 @@ class PackageBuildDataGenerator(object):
87 87
                 packageIndexInSortedList = len(sortedList)
88 88
 
89 89
             #creating sort list for package
90
-            sortListForPkg=self.createSortListForPkg(pkg)
90
+            sortListForPkg = self.createSortListForPkg(pkg)
91 91
 
92
-            #remove any cyclic packages in sortListForPkg if they already exists in sortedList
93
-            circularDependentPackages=self.getCircularDependentPackages(pkg)
92
+            #remove any cyclic packages in sortListForPkg if they already
93
+            #exists in sortedList
94
+            circularDependentPackages = self.getCircularDependentPackages(pkg)
94 95
             for p in circularDependentPackages:
95 96
                 if p in sortedList and p in sortListForPkg:
96 97
                     sortListForPkg.remove(p)
97 98
 
98 99
             # insert sort list of package in global sorted list
99
-            index=packageIndexInSortedList
100
-            subList=[]
100
+            index = packageIndexInSortedList
101
+            subList = []
101 102
             if packageIndexInSortedList > 0:
102
-                subList=sortedList[:packageIndexInSortedList]
103
+                subList = sortedList[:packageIndexInSortedList]
103 104
             for p in sortListForPkg:
104 105
                 if  p not in subList:
105 106
                     sortedList.insert(index, p)
106 107
                     index = index + 1
107 108
 
108
-            alreadyProcessedPackages.append(p)
109
+            alreadyProcessedPackages.add(p)
109 110
 
110 111
             # Remove duplicate entries in sorted list in intervals
111
-            if (len(sortedList)-prevSortListLen) > 100 :
112
-                self.logger.info("Removing duplicates in sortedList")
113
-                sortedList = removeDuplicateEntriesInList(sortedList)
112
+            if (len(sortedList) - prevSortListLen) > 100:
113
+                self.logger.debug("Removing duplicates in sortedList")
114
+                sortedList = self.removeDuplicateEntries(sortedList)
114 115
             else:
115
-                prevSortListLen=len(sortedList)
116
+                prevSortListLen = len(sortedList)
116 117
 
117
-        self.logger.info("Removing duplicates in sorted list")
118
-        sortedList = removeDuplicateEntriesInList(sortedList)
118
+        self.logger.debug("Removing duplicates in sorted list")
119
+        sortedList = self.removeDuplicateEntries(sortedList)
119 120
 
120
-        self.logger.info("Sorted list:")
121
-        self.logger.info(sortedList)
122
-        self.__sortedPackageList=sortedList
121
+        self.logger.debug("Sorted list: ")
122
+        self.logger.debug(sortedList)
123
+        self.__sortedPackageList = sortedList
123 124
 
124
-    def __constructBuildAndRunTimeDependencyGraph(self,package):
125
-        basePackage=SPECS.getData().getSpecName(package)
126
-
127
-        addBuildTimeGraph=True
128
-        addRunTimeGraph=True
129
-        if self.__buildDependencyGraph.has_key(basePackage):
125
+    def __constructBuildAndRunTimeDependencyGraph(self, basePackage):
126
+        addBuildTimeGraph = True
127
+        addRunTimeGraph = True
128
+        if basePackage in self.__buildDependencyGraph:
130 129
             addBuildTimeGraph = False
131
-        if self.__runTimeDependencyGraph.has_key(basePackage):
132
-            addRunTimeGraph=False
130
+        if basePackage in self.__runTimeDependencyGraph:
131
+            addRunTimeGraph = False
133 132
 
134
-        nextPackagesToConstructGraph=[]
133
+        nextPackagesToConstructGraph = set()
135 134
         if addBuildTimeGraph:
136
-            listDependentRpmPackages=SPECS.getData().getBuildRequiresForPackage(basePackage)
137
-            listDependentPackages=[]
138
-            for rpmPkg in listDependentRpmPackages:
139
-                basePkg=SPECS.getData().getSpecName(rpmPkg.package)
140
-                if basePkg not in listDependentPackages:
141
-                    listDependentPackages.append(basePkg)
142
-            self.__buildDependencyGraph[basePackage]=listDependentPackages
143
-            nextPackagesToConstructGraph.extend(listDependentPackages)
135
+            dependentRpmPackages = SPECS.getData().getBuildRequiresForPkg(basePackage)
136
+            dependentPackages = set()
137
+            for dependentPkg in dependentRpmPackages:
138
+                dependentPackages.add(SPECS.getData().getBasePkg(dependentPkg))
139
+            self.__buildDependencyGraph[basePackage] = dependentPackages
140
+            nextPackagesToConstructGraph.update(dependentPackages)
144 141
 
145 142
         if addRunTimeGraph:
146
-            listRpmPackages=SPECS.getData().getPackages(basePackage)
147
-            for rpmPkg in listRpmPackages:
148
-                listDependentRpmPackages=SPECS.getData().getRequiresAllForPackage(rpmPkg)
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)
155
-
143
+            dependentPackages = set()
144
+            for rpmPkg in SPECS.getData().getPackagesForPkg(basePackage):
145
+                dependentRpmPackages = SPECS.getData().getRequiresAllForPkg(rpmPkg)
146
+                self.__runTimeDependencyGraph[rpmPkg] = copy.copy(set(dependentRpmPackages))
147
+                for pkg in dependentRpmPackages:
148
+                    dependentPackages.add(SPECS.getData().getBasePkg(pkg))
149
+            nextPackagesToConstructGraph.update(dependentPackages)
156 150
         for pkg in nextPackagesToConstructGraph:
157 151
             self.__constructBuildAndRunTimeDependencyGraph(pkg)
158 152
 
... ...
@@ -172,57 +167,68 @@ class PackageBuildDataGenerator(object):
172 172
         if len(circularDependentPackages) > 0 :
173 173
             self.__findCircularDependencies(circularDependentPackages)
174 174
 
175
-    def topologicalSortPackages(self, dependencyGraph, package=None):
176
-        noDepPackages = Set()
177
-        sortedPackageList = []
178
-        dependentOfPackage = dict()
179
-
180
-        dependentPackages={}
175
+    @staticmethod
176
+    def _buildDependentPackages(dependencyGraph, package):
177
+        dependentPackages = {}
181 178
         if package is None:
182
-            dependentPackages=copy.deepcopy(dependencyGraph)
179
+            dependentPackages = copy.deepcopy(dependencyGraph)
183 180
         else:
184
-            listDepPkgs= Set()
185
-            listDepPkgs.add(package)
186
-            while listDepPkgs:
187
-                pkg = listDepPkgs.pop()
188
-                if dependentPackages.has_key(pkg):
181
+            depPkgs = set()
182
+            depPkgs.add(package)
183
+            while depPkgs:
184
+                pkg = depPkgs.pop()
185
+                if pkg in dependentPackages:
189 186
                     continue
190
-                dependentPackages[pkg]=dependencyGraph[pkg][:]
187
+                dependentPackages[pkg] = copy.copy(dependencyGraph[pkg])
191 188
                 for depPkg in dependencyGraph[pkg]:
192
-                    listDepPkgs.add(depPkg)
189
+                    depPkgs.add(depPkg)
190
+        return dependentPackages
193 191
 
194
-        #Find packages with no dependencies and generate dependentof_package edge list
192
+    @staticmethod
193
+    def _buildDependentOfPackages(dependentPackages):
194
+        dependentOfPackage = dict()
195 195
         for pkg in dependentPackages:
196
-            if len(dependentPackages[pkg]) == 0:
197
-                noDepPackages.add(pkg)
198
-            else:
196
+            if dependentPackages[pkg]:
199 197
                 for depPkg in dependentPackages[pkg]:
200
-                    if not dependentOfPackage.has_key(depPkg):
201
-                        dependentOfPackage[depPkg]=[pkg]
198
+                    if depPkg not in dependentOfPackage:
199
+                        dependentOfPackage[depPkg] = {pkg}
202 200
                     else:
203
-                        if pkg not in dependentOfPackage[depPkg]:
204
-                            dependentOfPackage[depPkg].append(pkg)
201
+                        dependentOfPackage[depPkg].add(pkg)
202
+        return dependentOfPackage
203
+
204
+    @staticmethod
205
+    def topologicalSortPackages(dependencyGraph, package=None):
206
+        sortedPackageList = []
207
+        noDepPackages = set()
208
+        dependentPackages = PackageBuildDataGenerator._buildDependentPackages(
209
+            dependencyGraph, package)
210
+        dependentOfPackage = PackageBuildDataGenerator._buildDependentOfPackages(
211
+            dependentPackages)
212
+
213
+        #Find packages with no dependencies and generate dependentof_package edge list
214
+        for pkg in dependentPackages:
215
+            if not dependentPackages[pkg]:
216
+                noDepPackages.add(pkg)
205 217
 
206 218
         while noDepPackages:
207 219
             pkg = noDepPackages.pop()
208 220
             sortedPackageList.append(pkg)
209
-            if dependentOfPackage.get(pkg) is not None:
210
-                for childPkg in list(dependentOfPackage.get(pkg)):
211
-                    dependentOfPackage.get(pkg).remove(childPkg)
221
+            if pkg in dependentOfPackage:
222
+                for childPkg in list(dependentOfPackage[pkg]):
223
+                    dependentOfPackage[pkg].remove(childPkg)
212 224
                     dependentPackages[childPkg].remove(pkg)
213
-                    if len(dependentPackages[childPkg])==0:
225
+                    if not dependentPackages[childPkg]:
214 226
                         noDepPackages.add(childPkg)
215 227
 
216 228
         # creating circular dependency graph for given dependency graph
217
-        circularDependencyGraph={}
218
-        listCircularPkg = dependentPackages.keys()
219
-        for pkg in listCircularPkg:
220
-            if len(dependentPackages[pkg]) != 0:
221
-                circularDependencyGraph[pkg]=dependentPackages[pkg]
222
-
223
-        #return (non-circular dependent package in sorted order and circular dependent package list in a dependencyGraph)
224
-        return sortedPackageList,circularDependencyGraph
229
+        circularDependencyGraph = {}
230
+        for pkg in dependentPackages.keys():
231
+            if dependentPackages[pkg]:
232
+                circularDependencyGraph[pkg] = dependentPackages[pkg]
225 233
 
234
+        #return (non-circular dependent package in sorted order and circular dependent
235
+        #package list in a dependencyGraph)
236
+        return sortedPackageList, circularDependencyGraph
226 237
 
227 238
     def __constructDependencyMap(self,cyclicDependencyGraph):
228 239
         self.logger.info("Constructing dependency map from circular dependency graph.....")
... ...
@@ -286,7 +292,3 @@ class PackageBuildDataGenerator(object):
286 286
         else:
287 287
             self.logger.info("No circular dependencies found.")
288 288
 
289
-
290
-
291
-
292
-
... ...
@@ -7,6 +7,7 @@ import os.path
7 7
 from constants import constants
8 8
 import shutil
9 9
 from SpecData import SPECS
10
+from StringUtils import StringUtils
10 11
 
11 12
 class PackageBuilderBase(object):
12 13
     def __init__(self, mapPackageToCycles, pkgBuildType):
... ...
@@ -15,52 +16,45 @@ class PackageBuilderBase(object):
15 15
         self.logPath = None
16 16
         self.logger = None
17 17
         self.package = None
18
+        self.version = None
18 19
         self.mapPackageToCycles = mapPackageToCycles
19 20
         self.listNodepsPackages = ["glibc", "gmp", "zlib", "file", "binutils", "mpfr",
20 21
                                    "mpc", "gcc", "ncurses", "util-linux", "groff", "perl",
21 22
                                    "texinfo", "rpm", "openssl", "go"]
22 23
         self.pkgBuildType = pkgBuildType
23 24
 
24
-    def findPackageNameFromRPMFile(self,rpmfile):
25
-        rpmfile=os.path.basename(rpmfile)
26
-        releaseindex=rpmfile.rfind("-")
25
+    def _findPackageNameAndVersionFromRPMFile(self, rpmfile):
26
+        rpmfile = os.path.basename(rpmfile)
27
+        releaseindex = rpmfile.rfind("-")
27 28
         if releaseindex == -1:
28
-            self.logger.error("Invalid rpm file:"+rpmfile)
29
+            self.logger.error("Invalid rpm file:" + rpmfile)
29 30
             return None
30
-        versionindex=rpmfile[0:releaseindex].rfind("-")
31
-        if versionindex == -1:
32
-            self.logger.error("Invalid rpm file:"+rpmfile)
33
-            return None
34
-        packageName=rpmfile[0:versionindex]
35
-        return packageName
31
+        pkg = rpmfile[0:releaseindex]
32
+        return pkg
36 33
 
37
-    def checkIfPackageIsAlreadyBuilt(self, index=0):
38
-        basePkg=SPECS.getData().getSpecName(self.package)
39
-        listRPMPackages=SPECS.getData().getRPMPackages(basePkg, index)
34
+    def checkIfPackageIsAlreadyBuilt(self, package, version):
35
+        basePkg=SPECS.getData().getSpecName(package)
36
+        listRPMPackages=SPECS.getData().getRPMPackages(basePkg, version)
40 37
         packageIsAlreadyBuilt=True
41 38
         pkgUtils = PackageUtils(self.logName,self.logPath)
42 39
         for pkg in listRPMPackages:
43
-            if pkgUtils.findRPMFileForGivenPackage(pkg, "*", index) is None:
40
+            if pkgUtils.findRPMFileForGivenPackage(pkg, version) is None:
44 41
                 packageIsAlreadyBuilt=False
45 42
                 break
46 43
         return packageIsAlreadyBuilt
47 44
 
48
-    def findRunTimeRequiredRPMPackages(self,rpmPackage):
49
-        listRequiredPackages=SPECS.getData().getRequiresForPackage(rpmPackage)
45
+    def findRunTimeRequiredRPMPackages(self,rpmPackage, version):
46
+        listRequiredPackages=SPECS.getData().getRequiresForPackage(rpmPackage, version)
50 47
         return listRequiredPackages
51 48
 
52
-    def findBuildTimeRequiredPackages(self, index):
53
-        listRequiredPackages=SPECS.getData().getBuildRequiresForPackage(self.package, index)
49
+    def findBuildTimeRequiredPackages(self):
50
+        listRequiredPackages=SPECS.getData().getBuildRequiresForPackage(self.package, self.version)
54 51
         return listRequiredPackages
55 52
 
56
-    def findBuildTimeCheckRequiredPackages(self, index):
57
-        listRequiredPackages=SPECS.getData().getCheckBuildRequiresForPackage(self.package, index)
53
+    def findBuildTimeCheckRequiredPackages(self):
54
+        listRequiredPackages=SPECS.getData().getCheckBuildRequiresForPackage(self.package, self.version)
58 55
         return listRequiredPackages
59 56
 
60
-    @staticmethod
61
-    def getNumOfVersions(package):
62
-        return SPECS.getData().getNumberOfVersions(package)
63
-
64 57
 class PackageBuilder(PackageBuilderBase):
65 58
 
66 59
     def __init__(self,mapPackageToCycles,listAvailableCyclicPackages,listBuildOptionPackages,pkgBuildOptionFile):
... ...
@@ -71,9 +65,9 @@ class PackageBuilder(PackageBuilderBase):
71 71
         self.listBuildOptionPackages=listBuildOptionPackages
72 72
         self.pkgBuildOptionFile=pkgBuildOptionFile
73 73
 
74
-    def prepareBuildRoot(self,index):
74
+    def prepareBuildRoot(self):
75 75
         chrootID=None
76
-        chrootName="build-"+self.package
76
+        chrootName="build-"+self.package + "-" + self.version
77 77
         try:
78 78
             chrUtils = ChrootUtils(self.logName,self.logPath)
79 79
             returnVal,chrootID = chrUtils.createChroot(chrootName)
... ...
@@ -81,7 +75,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,index)
84
+            tUtils.installToolChainRPMS(chrootID, self.package,self.version, self.listBuildOptionPackages, self.pkgBuildOptionFile, self.logPath)
85 85
         except Exception as e:
86 86
             if chrootID is not None:
87 87
                 self.logger.debug("Deleting chroot: " + chrootID)
... ...
@@ -89,58 +83,57 @@ class PackageBuilder(PackageBuilderBase):
89 89
             raise e
90 90
         return chrootID
91 91
 
92
-    def findInstalledPackages(self,chrootID):
93
-        pkgUtils = PackageUtils(self.logName,self.logPath)
94
-        listInstalledRPMs=pkgUtils.findInstalledRPMPackages(chrootID)
95
-        listInstalledPackages=[]
92
+    def findInstalledPackages(self, instanceID):
93
+        pkgUtils = PackageUtils(self.logName, self.logPath)
94
+        if self.pkgBuildType == "chroot":
95
+            listInstalledRPMs = pkgUtils.findInstalledRPMPackages(instanceID)
96
+        listInstalledPackages = []
96 97
         for installedRPM in listInstalledRPMs:
97
-            packageName=self.findPackageNameFromRPMFile(installedRPM)
98
-            if packageName is not None:
99
-                listInstalledPackages.append(packageName)
100
-        return listInstalledPackages
98
+            pkg = self._findPackageNameAndVersionFromRPMFile(installedRPM)
99
+            if pkg is not None:
100
+                listInstalledPackages.append(pkg)
101
+        return listInstalledPackages, listInstalledRPMs
101 102
 
102 103
     def buildPackageThreadAPI(self,package,outputMap, threadName,):
103
-        self.package=package
104
-        self.logName="build-"+package
105
-        self.logPath=constants.logPath+"/build-"+package
106
-        if not os.path.isdir(self.logPath):
107
-            cmdUtils = CommandUtils()
108
-            cmdUtils.runCommandInShell("mkdir -p "+self.logPath)
109
-        self.logger=Logger.getLogger(self.logName,self.logPath)
110
-        versions = self.getNumOfVersions(package)
111
-        if(versions < 1):
112
-            raise Exception("No package exists")
113
-        for version in range(0, versions):
114
-            try:
115
-                self.buildPackage(version)
116
-                outputMap[threadName]=True
117
-            except Exception as e:
118
-                # TODO: self.logger might be None
119
-                self.logger.exception(e)
120
-                outputMap[threadName]=False
121
-                raise e
122
-
123
-    def buildPackage(self, index):
104
+        packageName, packageVersion = StringUtils.splitPackageNameAndVersion(package)
124 105
         #do not build if RPM is already built
125 106
         #test only if the package is in the testForceRPMS with rpmCheck
126 107
         #build only if the package is not in the testForceRPMS with rpmCheck
127
-        if self.checkIfPackageIsAlreadyBuilt(index):
108
+        if self.checkIfPackageIsAlreadyBuilt(packageName, packageVersion):
128 109
             if not constants.rpmCheck:
129
-                self.logger.info("Skipping building the package:"+self.package)
110
+                outputMap[threadName]=True
130 111
                 return
131
-            elif constants.rpmCheck and self.package not in constants.testForceRPMS:
132
-                self.logger.info("Skipping testing the package:"+self.package)
112
+            elif constants.rpmCheck and packageName not in constants.testForceRPMS:
113
+                outputMap[threadName]=True
133 114
                 return
134 115
 
116
+        self.package=packageName
117
+        self.version=packageVersion
118
+        self.logName="build-"+package
119
+        self.logPath=constants.logPath+"/build-"+package
120
+        if not os.path.isdir(self.logPath):
121
+            cmdUtils = CommandUtils()
122
+            cmdUtils.runCommandInShell("mkdir -p "+self.logPath)
123
+        self.logger=Logger.getLogger(self.logName,self.logPath)
124
+        try:
125
+            self.buildPackage()
126
+            outputMap[threadName]=True
127
+        except Exception as e:
128
+            # TODO: self.logger might be None
129
+            self.logger.exception(e)
130
+            outputMap[threadName]=False
131
+            raise e
132
+
133
+    def buildPackage(self):
135 134
         chrUtils = ChrootUtils(self.logName,self.logPath)
136 135
         chrootID=None
137 136
         try:
138
-            chrootID = self.prepareBuildRoot(index)
139
-            listInstalledPackages=self.findInstalledPackages(chrootID)
140
-            listDependentPackages=self.findBuildTimeRequiredPackages(index)
137
+            chrootID = self.prepareBuildRoot()
138
+            listInstalledPackages, listInstalledRPMs=self.findInstalledPackages(chrootID)
139
+            listDependentPackages=self.findBuildTimeRequiredPackages()
141 140
             listTestPackages=[]
142 141
             if constants.rpmCheck and self.package in constants.testForceRPMS:
143
-                listDependentPackages.extend(self.findBuildTimeCheckRequiredPackages(index))
142
+                listDependentPackages.extend(self.findBuildTimeCheckRequiredPackages())
144 143
                 testPackages=set(constants.listMakeCheckRPMPkgtoInstall)-set(listInstalledPackages)-set([self.package])
145 144
                 listTestPackages = list(set(testPackages))
146 145
                 listDependentPackages=list(set(listDependentPackages))
... ...
@@ -148,23 +141,23 @@ class PackageBuilder(PackageBuilderBase):
148 148
             if len(listDependentPackages) != 0:
149 149
                 self.logger.info("Installing the build time dependent packages......")
150 150
                 for pkg in listDependentPackages:
151
-                    properVersion=pkgUtils.getProperVersion(pkg.package,pkg)
152
-                    self.installPackage(pkgUtils,pkg.package,properVersion,chrootID,self.logPath,listInstalledPackages)
151
+                    packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
152
+                    self.installPackage(pkgUtils,packageName,packageVersion,chrootID,self.logPath,listInstalledPackages,listInstalledRPMs)
153 153
                 for pkg in listTestPackages:
154 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)
155
+                    packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
156
+                    for depPkg in listDependentPackages:
157
+                        depPackageName, depPackageVersion = StringUtils.splitPackageNameAndVersion(depPkg)
158
+                        if depPackageName == packageName:
159 159
                                 flag = True
160 160
                                 break;
161 161
                     if flag == False:
162
-                        self.installPackage(pkgUtils,pkg,"*",chrootID,self.logPath,listInstalledPackages)
162
+                        self.installPackage(pkgUtils,packageName,packageVersion,chrootID,self.logPath,listInstalledPackages,listInstalledRPMs)
163 163
                 pkgUtils.installRPMSInAOneShot(chrootID,self.logPath)
164 164
                 self.logger.info("Finished installing the build time dependent packages......")
165 165
 
166
-            pkgUtils.adjustGCCSpecs(self.package, chrootID, self.logPath, index)
167
-            pkgUtils.buildRPMSForGivenPackage(self.package,chrootID,self.listBuildOptionPackages,self.pkgBuildOptionFile,self.logPath, index)
166
+            pkgUtils.adjustGCCSpecs(self.package, chrootID, self.logPath, self.version)
167
+            pkgUtils.buildRPMSForGivenPackage(self.package,self.version,chrootID,self.listBuildOptionPackages,self.pkgBuildOptionFile,self.logPath)
168 168
             self.logger.info("Successfully built the package:"+self.package)
169 169
         except Exception as e:
170 170
             self.logger.error("Failed while building package:" + self.package)
... ...
@@ -176,12 +169,28 @@ class PackageBuilder(PackageBuilderBase):
176 176
         if chrootID is not None:
177 177
             chrUtils.destroyChroot(chrootID)
178 178
 
179
-    def installPackage(self,pkgUtils,package,packageVersion,chrootID,destLogPath,listInstalledPackages):
180
-        if package in listInstalledPackages:
179
+    def installPackage(self,pkgUtils,package,packageVersion,chrootID,destLogPath,listInstalledPackages,listInstalledRPMs):
180
+        rpmfile = pkgUtils.findRPMFileForGivenPackage(package,packageVersion);
181
+        if rpmfile is None:
182
+            self.logger.error("No rpm file found for package: " + package + "-" + packageVersion)
183
+            raise Exception("Missing rpm file")
184
+        specificRPM = os.path.basename(rpmfile.replace(".rpm", ""))
185
+        pkg = package+"-"+packageVersion
186
+        if pkg in listInstalledPackages:
181 187
             return
188
+        # For linux packages, install the gcc dependencies from publish rpms
189
+        if self.package in self.listBuildOptionPackages:
190
+            if SPECS.getData().getSpecName(package) == "gcc":
191
+                tUtils=ToolChainUtils(self.logName,self.logPath)
192
+                overridenPkgVer = tUtils.getOverridenPackageVersion(self.package, package, self.listBuildOptionPackages, self.pkgBuildOptionFile)
193
+                overridenPkg = package+"-"+overridenPkgVer
194
+                if overridenPkg in listInstalledPackages:
195
+                    return
196
+
182 197
         # mark it as installed -  to avoid cyclic recursion
183
-        listInstalledPackages.append(package)
184
-        self.installDependentRunTimePackages(pkgUtils,package,chrootID,destLogPath,listInstalledPackages)
198
+        listInstalledPackages.append(pkg)
199
+        listInstalledRPMs.append(specificRPM)
200
+        self.installDependentRunTimePackages(pkgUtils,package,packageVersion, chrootID,destLogPath,listInstalledPackages,listInstalledRPMs)
185 201
         noDeps=False
186 202
         if self.mapPackageToCycles.has_key(package):
187 203
             noDeps = True
... ...
@@ -192,14 +201,17 @@ class PackageBuilder(PackageBuilderBase):
192 192
 
193 193
         pkgUtils.installRPM(package,packageVersion,chrootID,noDeps,destLogPath)
194 194
 
195
-    def installDependentRunTimePackages(self,pkgUtils,package,chrootID,destLogPath,listInstalledPackages):
196
-        listRunTimeDependentPackages=self.findRunTimeRequiredRPMPackages(package)
195
+    def installDependentRunTimePackages(self,pkgUtils,package,packageVersion,chrootID,destLogPath,listInstalledPackages,listInstalledRPMs):
196
+        listRunTimeDependentPackages=self.findRunTimeRequiredRPMPackages(package,packageVersion)
197 197
         if len(listRunTimeDependentPackages) != 0:
198 198
             for pkg in listRunTimeDependentPackages:
199
-                if self.mapPackageToCycles.has_key(pkg) and pkg not in self.listAvailableCyclicPackages:
199
+                if self.mapPackageToCycles.has_key(pkg):
200 200
                     continue
201
-                if pkg in listInstalledPackages:
201
+                packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
202
+                latestPkgRPM = os.path.basename(
203
+                    pkgUtils.findRPMFileForGivenPackage(packageName, packageVersion)).replace(".rpm", "")
204
+                if pkg in listInstalledPackages and latestPkgRPM in listInstalledRPMs:
202 205
                     continue
203
-                self.installPackage(pkgUtils,pkg,"*",chrootID,destLogPath,listInstalledPackages)
206
+                self.installPackage(pkgUtils,packageName,packageVersion,chrootID,destLogPath,listInstalledPackages,listInstalledRPMs)
204 207
 
205 208
 
... ...
@@ -24,29 +24,31 @@ class PackageInfo(object):
24 24
         listRPMFiles = []
25 25
         cmdUtils = CommandUtils()
26 26
         for package in listPackages:
27
-            release = SPECS.getData().getRelease(package)
28
-            version = SPECS.getData().getVersion(package)
29
-            listRPMPackages = SPECS.getData().getRPMPackages(package)
30
-            srpmFileName = package+"-"+version+"-"+release+".src.rpm"
31
-            srpmFiles = cmdUtils.findFile(srpmFileName, constants.sourceRpmPath)
32
-            srpmFile = None
33
-            if len(srpmFiles) == 1:
34
-                srpmFile = srpmFiles[0]
35
-            debugrpmFileName = package+"-debuginfo-"+version+"-"+release+"*"
36
-            debugrpmFiles = cmdUtils.findFile(debugrpmFileName, constants.rpmPath)
37
-            debugrpmFile = None
38
-            if len(debugrpmFiles) == 1:
39
-                debugrpmFile = debugrpmFiles[0]
40
-            pkgUtils = PackageUtils(self.logName,self.logPath)
41
-            for rpmPkg in listRPMPackages:
42
-                rpmFile = pkgUtils.findRPMFileForGivenPackage(rpmPkg)
43
-                if rpmFile is not None:
44
-                    listRPMFiles.append(rpmFile)
45
-                    listPkgAttributes = {"sourcerpm":srpmFile, "rpm":rpmFile, "debugrpm":debugrpmFile}
46
-                    self.pkgList[rpmPkg] = listPkgAttributes
47
-                    self.logger.debug("Added "+rpmPkg +" rpm package to the list")
48
-                else:
49
-                    self.logger.error("Missing rpm file for package:"+rpmPkg)
27
+            for version in SPECS.getData().getVersions(package):
28
+                release = SPECS.getData().getRelease(package, version)
29
+                if release is None:
30
+                        release = "*"
31
+                listRPMPackages = SPECS.getData().getRPMPackages(package, version)
32
+                srpmFileName = package+"-"+version+"-"+release+".src.rpm"
33
+                srpmFiles = cmdUtils.findFile(srpmFileName, constants.sourceRpmPath)
34
+                srpmFile = None
35
+                if len(srpmFiles) == 1:
36
+                        srpmFile = srpmFiles[0]
37
+                debugrpmFileName = package+"-debuginfo-"+version+"-"+release+"*"
38
+                debugrpmFiles = cmdUtils.findFile(debugrpmFileName, constants.rpmPath)
39
+                debugrpmFile = None
40
+                if len(debugrpmFiles) == 1:
41
+                        debugrpmFile = debugrpmFiles[0]
42
+                pkgUtils = PackageUtils(self.logName,self.logPath)
43
+                for rpmPkg in listRPMPackages:
44
+                        rpmFile = pkgUtils.findRPMFileForGivenPackage(rpmPkg)
45
+                        if rpmFile is not None:
46
+                                listRPMFiles.append(rpmFile)
47
+                                listPkgAttributes = {"sourcerpm":srpmFile, "rpm":rpmFile, "debugrpm":debugrpmFile}
48
+                                self.pkgList[rpmPkg] = listPkgAttributes
49
+                                self.logger.debug("Added "+rpmPkg +" rpm package to the list")
50
+                        else:
51
+                                self.logger.error("Missing rpm file for package:"+rpmPkg)
50 52
 
51 53
     def writePkgListToFile(self, fileName):
52 54
          self.logger.info("Writing package list to the json file")
... ...
@@ -11,6 +11,7 @@ from ToolChainUtils import ToolChainUtils
11 11
 from Scheduler import Scheduler
12 12
 from ThreadPool import ThreadPool
13 13
 from SpecData import SPECS
14
+from StringUtils import StringUtils
14 15
 
15 16
 class PackageManager(object):
16 17
 
... ...
@@ -46,43 +47,21 @@ class PackageManager(object):
46 46
         return True
47 47
 
48 48
     def readAlreadyAvailablePackages(self):
49
-        listAvailablePackages=[]
50
-        listFoundRPMPackages=[]
51
-        listRPMFiles=[]
52
-        listDirectorys=[]
53
-        listDirectorys.append(constants.rpmPath)
54
-        if constants.inputRPMSPath is not None:
55
-            listDirectorys.append(constants.inputRPMSPath)
49
+        listAvailablePackages = set()
50
+        pkgUtils = PackageUtils(self.logName, self.logPath)
51
+        listPackages = SPECS.getData().getListPackages()
52
+        for package in listPackages:
53
+            for version in SPECS.getData().getVersions(package):
54
+                # Mark package available only if all subpackages are available
55
+                packageIsAlreadyBuilt=True
56
+                listRPMPackages = SPECS.getData().getRPMPackages(package, version)
57
+                for rpmPkg in listRPMPackages:
58
+                    if pkgUtils.findRPMFileForGivenPackage(rpmPkg, version) is None:
59
+                        packageIsAlreadyBuilt=False
60
+                        break;
61
+                if packageIsAlreadyBuilt:
62
+                    listAvailablePackages.add(package+"-"+version)
56 63
 
57
-        while len(listDirectorys) > 0:
58
-            dirPath=listDirectorys.pop()
59
-            for dirEntry in os.listdir(dirPath):
60
-                dirEntryPath = os.path.join(dirPath, dirEntry)
61
-                if os.path.isfile(dirEntryPath) and dirEntryPath.endswith(".rpm"):
62
-                    listRPMFiles.append(dirEntryPath)
63
-                elif os.path.isdir(dirEntryPath):
64
-                    listDirectorys.append(dirEntryPath)
65
-        pkgUtils = PackageUtils(self.logName,self.logPath)
66
-        for rpmfile in listRPMFiles:
67
-            package,version,release = pkgUtils.findPackageInfoFromRPMFile(rpmfile)
68
-            if SPECS.getData().isRPMPackage(package):
69
-                specVersion=SPECS.getData().getVersion(package)
70
-                specRelease=SPECS.getData().getRelease(package)
71
-                if version == specVersion and release == specRelease:
72
-                    listFoundRPMPackages.append(package)
73
-        #Mark package available only if all sub packages are available
74
-        for package in listFoundRPMPackages:
75
-            basePkg = SPECS.getData().getSpecName(package)
76
-            if basePkg in listAvailablePackages:
77
-                continue;
78
-            listRPMPackages = SPECS.getData().getRPMPackages(basePkg)
79
-            packageIsAlreadyBuilt = True
80
-            for rpmpkg in listRPMPackages:
81
-                if rpmpkg not in listFoundRPMPackages:
82
-                    packageIsAlreadyBuilt = False
83
-            if packageIsAlreadyBuilt:
84
-                listAvailablePackages.append(package)
85
-        self.logger.info("List of Already built packages")
86 64
         self.logger.info(listAvailablePackages)
87 65
         return listAvailablePackages
88 66
 
... ...
@@ -96,7 +75,7 @@ class PackageManager(object):
96 96
         self.sortedPackageList=[]
97 97
 
98 98
         listOfPackagesAlreadyBuilt = []
99
-        listOfPackagesAlreadyBuilt = self.readAlreadyAvailablePackages()
99
+        listOfPackagesAlreadyBuilt = list(self.readAlreadyAvailablePackages())
100 100
         self.listOfPackagesAlreadyBuilt = listOfPackagesAlreadyBuilt[:]
101 101
 
102 102
         updateBuiltRPMSList = False
... ...
@@ -104,10 +83,11 @@ class PackageManager(object):
104 104
             updateBuiltRPMSList = True
105 105
             listOfPackagesAlreadyBuilt = self.listOfPackagesAlreadyBuilt[:]
106 106
             for pkg in listOfPackagesAlreadyBuilt:
107
-                listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(pkg)
107
+                packageName, packageVersion = StringUtils.splitPackageNameAndVersion(pkg)
108
+                listDependentRpmPackages = SPECS.getData().getRequiresAllForPackage(packageName, packageVersion)
108 109
                 needToRebuild = False
109 110
                 for dependentPkg in listDependentRpmPackages:
110
-                    if dependentPkg.package not in self.listOfPackagesAlreadyBuilt:
111
+                    if dependentPkg not in self.listOfPackagesAlreadyBuilt:
111 112
                         needToRebuild = True
112 113
                         updateBuiltRPMSList = False
113 114
                 if needToRebuild:
... ...
@@ -117,7 +97,6 @@ class PackageManager(object):
117 117
         for pkg in listPackages:
118 118
             if pkg in self.listOfPackagesAlreadyBuilt and not constants.rpmCheck:
119 119
                 listPackagesToBuild.remove(pkg)
120
-
121 120
         if not self.readPackageBuildData(listPackagesToBuild):
122 121
             return False
123 122
         return True
... ...
@@ -181,11 +160,20 @@ class PackageManager(object):
181 181
         Scheduler.stopScheduling=False
182 182
 
183 183
     def buildGivenPackages (self, listPackages, buildThreads):
184
+        # Extend listPackages from ["name1", "name2",..] to ["name1-vers1", "name2-vers2",..]
185
+        listPackageNamesAndVersions=[]
186
+        for pkg in listPackages:
187
+            for version in SPECS.getData().getVersions(pkg):
188
+                listPackageNamesAndVersions.append(pkg+"-"+version)
184 189
         if constants.rpmCheck:
185 190
             alreadyBuiltRPMS=self.readAlreadyAvailablePackages()
186
-            listPackages=list(set(listPackages)|(set(constants.listMakeCheckRPMPkgtoInstall)-set(alreadyBuiltRPMS)))
191
+            listMakeCheckPackages=set()
192
+            for pkg in listPackages:
193
+                version = SPECS.getData().getHighestVersion(pkg)
194
+                listMakeCheckPackages.add(pkg+"-"+version)
195
+            listPackageNamesAndVersions = (list(set(listPackageNamesAndVersions)|(listMakeCheckPackages-alreadyBuiltRPMS)))
187 196
 
188
-        returnVal=self.calculateParams(listPackages)
197
+        returnVal=self.calculateParams(listPackageNamesAndVersions)
189 198
         if not returnVal:
190 199
             self.logger.error("Unable to set paramaters. Terminating the package manager.")
191 200
             raise Exception("Unable to set paramaters")
... ...
@@ -16,7 +16,7 @@ class PackageUtils(object):
16 16
 
17 17
     def __init__(self,logName=None,logPath=None):
18 18
         if logName is None:
19
-            self.logName = "PackageUtils"
19
+            logName = "PackageUtils"
20 20
         if logPath is None:
21 21
             logPath = constants.logPath
22 22
         self.logName=logName
... ...
@@ -52,26 +52,6 @@ class PackageUtils(object):
52 52
             arch="noarch"
53 53
         return arch
54 54
 
55
-    def getProperVersion(self,package,parseSpecObj):
56
-        listOfVersionObjs=SPECS.getData().getSpecObj(package)
57
-        for num in listOfVersionObjs:
58
-                if parseSpecObj.compare == 'gte':
59
-                        if LooseVersion(num.version) >= LooseVersion(parseSpecObj.version):
60
-                                return num.version
61
-                elif parseSpecObj.compare == 'lte':
62
-                        if LooseVersion(num.version) <= LooseVersion(parseSpecObj.version):
63
-                                return num.version
64
-                elif parseSpecObj.compare == 'eq':
65
-                        if LooseVersion(num.version) == LooseVersion(parseSpecObj.version):
66
-                                return num.version
67
-                elif parseSpecObj.compare == 'lt':
68
-                        if LooseVersion(num.version) < LooseVersion(parseSpecObj.version):
69
-                                return num.version
70
-                elif parseSpecObj.compare == 'gt':
71
-                        if LooseVersion(num.version) > LooseVersion(parseSpecObj.version):
72
-                                return num.version
73
-        return "*"
74
-
75 55
     def getRPMDestDir(self,rpmName,rpmDir):
76 56
         arch = self.getRPMArch(rpmName)
77 57
         rpmDestDir=rpmDir+"/"+arch
... ...
@@ -129,10 +109,10 @@ class PackageUtils(object):
129 129
                 self.logger.error("Unable to install rpms")
130 130
                 raise Exception("RPM installation failed")
131 131
 
132
-    def verifyShaAndGetSourcePath(self, source, package, index=0):
132
+    def verifyShaAndGetSourcePath(self, source, package, version):
133 133
         cmdUtils = CommandUtils()
134 134
         # Fetch/verify sources if sha1 not None.
135
-        sha1 = SPECS.getData().getSHA1(package, source, index)
135
+        sha1 = SPECS.getData().getSHA1(package, source, version)
136 136
         if sha1 is not None:
137 137
             PullSources.get(package, source, sha1, constants.sourcePath, constants.pullsourcesConfig, self.logger)
138 138
 
... ...
@@ -160,9 +140,9 @@ class PackageUtils(object):
160 160
             listSourceFiles,
161 161
             package,
162 162
             destDir,
163
-            index=0):
163
+            version):
164 164
         for source in listSourceFiles:
165
-            sourcePath = self.verifyShaAndGetSourcePath(source, package, index)
165
+            sourcePath = self.verifyShaAndGetSourcePath(source, package, version)
166 166
             self.logger.info("Copying... Source path :" + source + " Source filename: " + sourcePath[0])
167 167
             shutil.copy2(sourcePath[0], destDir)
168 168
 
... ...
@@ -198,16 +178,16 @@ class PackageUtils(object):
198 198
     def buildRPMSForGivenPackage(
199 199
             self,
200 200
             package,
201
+            version,
201 202
             chrootID,
202 203
             listBuildOptionPackages,
203 204
             pkgBuildOptionFile,
204
-            destLogPath=None,
205
-            index=0):
205
+            destLogPath=None):
206 206
         self.logger.info("Building rpm's for package:"+package)
207 207
 
208
-        listSourcesFiles = SPECS.getData().getSources(package, index)
209
-        listPatchFiles =  SPECS.getData().getPatches(package, index)
210
-        specFile = SPECS.getData().getSpecFile(package, index)
208
+        listSourcesFiles = SPECS.getData().getSources(package, version)
209
+        listPatchFiles =  SPECS.getData().getPatches(package, version)
210
+        specFile = SPECS.getData().getSpecFile(package, version)
211 211
         specName = SPECS.getData().getSpecName(package) + ".spec"
212 212
         chrootSourcePath=chrootID+constants.topDirPath+"/SOURCES/"
213 213
         chrootSpecPath=constants.topDirPath+"/SPECS/"
... ...
@@ -217,8 +197,8 @@ class PackageUtils(object):
217 217
 
218 218
 # FIXME: some sources are located in SPECS/.. how to mount?
219 219
 #        if os.geteuid()==0:
220
-        self.copySourcesTobuildroot(listSourcesFiles,package,chrootSourcePath, index)
221
-        self.copySourcesTobuildroot(listPatchFiles,package,chrootSourcePath, index)
220
+        self.copySourcesTobuildroot(listSourcesFiles,package,chrootSourcePath, version)
221
+        self.copySourcesTobuildroot(listPatchFiles,package,chrootSourcePath, version)
222 222
 
223 223
         macros = []
224 224
         if package in listBuildOptionPackages:
... ...
@@ -311,13 +291,13 @@ class PackageUtils(object):
311 311
                     listSRPMFiles.append(listcontents[1])
312 312
         return listRPMFiles,listSRPMFiles
313 313
 
314
-    def findRPMFileForGivenPackage(self, package, version = "*", index=0):
314
+    def findRPMFileForGivenPackage(self, package, version = "*"):
315 315
         cmdUtils = CommandUtils()
316 316
 
317 317
         # If no version is specified, use the latest from the source
318 318
         # code.
319 319
         if version == "*":
320
-            version = SPECS.getData().getVersion(package,index)
320
+            version = SPECS.getData().getHighestVersion(package)
321 321
         release = SPECS.getData().getRelease(package,version)
322 322
         # pkg_build_options does not specify the release and there is no spec for that
323 323
         if not release:
... ...
@@ -374,8 +354,8 @@ class PackageUtils(object):
374 374
             return result.split()
375 375
         return result
376 376
 
377
-    def adjustGCCSpecs(self, package, chrootID, logPath, index=0):
378
-        opt = " " + SPECS.getData().getSecurityHardeningOption(package, index)
377
+    def adjustGCCSpecs(self, package, chrootID, logPath, version):
378
+        opt = " " + SPECS.getData().getSecurityHardeningOption(package, version)
379 379
         cmdUtils=CommandUtils()
380 380
         cpcmd="cp "+ self.adjustGCCSpecScript+" "+chrootID+"/tmp/"+self.adjustGCCSpecScript
381 381
         cmd = "/tmp/"+self.adjustGCCSpecScript+opt
... ...
@@ -396,10 +376,10 @@ class PackageUtils(object):
396 396
         self.logger.error("Failed while adjusting gcc specs")
397 397
         raise Exception("Failed while adjusting gcc specs")
398 398
 
399
-    def copySourcesToContainer(self, listSourceFiles, package, containerID, destDir, index=0):
399
+    def copySourcesToContainer(self, listSourceFiles, package, containerID, destDir, version):
400 400
         cmdUtils = CommandUtils()
401 401
         for source in listSourceFiles:
402
-            sourcePath = self.verifyShaAndGetSourcePath(source, package, index)
402
+            sourcePath = self.verifyShaAndGetSourcePath(source, package, version)
403 403
             self.logger.info("Copying source file: " + sourcePath[0])
404 404
             copyCmd = "docker cp " + sourcePath[0] + " " + containerID.short_id + ":" + destDir
405 405
             cmdUtils.runCommandInShell(copyCmd)
... ...
@@ -529,8 +509,8 @@ class PackageUtils(object):
529 529
             return result.split()
530 530
         return result
531 531
 
532
-    def adjustGCCSpecsInContainer(self, package, containerID, logPath, index):
533
-        opt = " " + SPECS.getData().getSecurityHardeningOption(package, index)
532
+    def adjustGCCSpecsInContainer(self, package, containerID, logPath, version):
533
+        opt = " " + SPECS.getData().getSecurityHardeningOption(package, version)
534 534
         adjustCmd = "/" + self.adjustGCCSpecScript + opt
535 535
         adjustCmd = "/bin/bash -l -c '" + adjustCmd + "'"
536 536
         logFile = logPath + "/adjustGCCSpecScript.log"
... ...
@@ -552,16 +532,16 @@ class PackageUtils(object):
552 552
     def buildRPMSForGivenPackageInContainer(
553 553
             self,
554 554
             package,
555
+            version,
555 556
             containerID,
556 557
             listBuildOptionPackages,
557 558
             pkgBuildOptionFile,
558
-            destLogPath=None,
559
-            index=0):
559
+            destLogPath=None):
560 560
         self.logger.info("Building rpm's for package " + package + " in container " + containerID.short_id)
561 561
 
562
-        listSourcesFiles = SPECS.getData().getSources(package, index)
563
-        listPatchFiles = SPECS.getData().getPatches(package, index)
564
-        specFile = SPECS.getData().getSpecFile(package, index)
562
+        listSourcesFiles = SPECS.getData().getSources(package, version)
563
+        listPatchFiles = SPECS.getData().getPatches(package, version)
564
+        specFile = SPECS.getData().getSpecFile(package, version)
565 565
         specName = SPECS.getData().getSpecName(package) + ".spec"
566 566
         sourcePath = constants.topDirPath + "/SOURCES/"
567 567
         specPath = constants.topDirPath + "/SPECS/"
... ...
@@ -581,9 +561,9 @@ class PackageUtils(object):
581 581
 #        if os.geteuid()==0:
582 582
         #TODO: mount it in, don't copy
583 583
         macros = []
584
-        self.copySourcesToContainer(listSourcesFiles, package, containerID, sourcePath, index)
584
+        self.copySourcesToContainer(listSourcesFiles, package, containerID, sourcePath, version)
585 585
         #TODO: mount it in, don't copy
586
-        self.copySourcesToContainer(listPatchFiles, package, containerID, sourcePath, index)
586
+        self.copySourcesToContainer(listPatchFiles, package, containerID, sourcePath, version)
587 587
         if package in listBuildOptionPackages:
588 588
             listAdditionalFiles, macros = self.getAdditionalBuildFiles(package, pkgBuildOptionFile)
589 589
             self.copyAdditionalBuildFilesToContainer(listAdditionalFiles, containerID)
... ...
@@ -35,11 +35,11 @@ class Scheduler(object):
35 35
     @staticmethod
36 36
     def getBuildRequiredPackages(package):
37 37
         listRequiredRPMPackages = []
38
-        listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package))
38
+        listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPkg(package))
39 39
         listRequiredPackages = []
40 40
 
41 41
         for pkg in listRequiredRPMPackages:
42
-            basePkg = SPECS.getData().getSpecName(pkg.package)
42
+            basePkg = SPECS.getData().getBasePkg(pkg)
43 43
             if basePkg not in listRequiredPackages:
44 44
                 listRequiredPackages.append(basePkg)
45 45
 
... ...
@@ -148,12 +148,12 @@ class Scheduler(object):
148 148
     @staticmethod
149 149
     def getRequiredPackages(package):
150 150
         listRequiredRPMPackages=[]
151
-        listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPackage(package))
152
-        listRequiredRPMPackages.extend(SPECS.getData().getRequiresAllForPackage(package))
151
+        listRequiredRPMPackages.extend(SPECS.getData().getBuildRequiresForPkg(package))
152
+        listRequiredRPMPackages.extend(SPECS.getData().getRequiresAllForPkg(package))
153 153
         listRequiredPackages=[]
154 154
 
155 155
         for pkg in listRequiredRPMPackages:
156
-            basePkg=SPECS.getData().getSpecName(pkg.package)
156
+            basePkg=SPECS.getData().getBasePkg(pkg)
157 157
             if basePkg not in listRequiredPackages:
158 158
                 listRequiredPackages.append(basePkg)
159 159
         return listRequiredPackages
... ...
@@ -7,6 +7,8 @@ import Queue
7 7
 import json
8 8
 import operator
9 9
 from constants import constants
10
+from distutils.version import LooseVersion
11
+from StringUtils import StringUtils
10 12
 
11 13
 class SpecObject(object):
12 14
     def __init__(self):
... ...
@@ -81,23 +83,111 @@ class SpecObjectsUtils(object):
81 81
             elif os.path.isdir(dirEntryPath):
82 82
                 self.getListSpecFiles(listSpecFiles,dirEntryPath)
83 83
 
84
-    def getBuildRequiresForPackage(self, package, index=0):
85
-        specName=self.getSpecName(package)
86
-        return self.mapSpecObjects[specName][index].buildRequirePackages
87
-
88
-    def getRequiresAllForPackage(self, package, index=0):
89
-        specName=self.getSpecName(package)
90
-        return self.mapSpecObjects[specName][index].installRequiresAllPackages
91
-
92
-    def getRequiresForPackage(self, package, index=0):
93
-        specName=self.getSpecName(package)
94
-        if self.mapSpecObjects[specName][index].installRequiresPackages.has_key(package):
95
-            return self.mapSpecObjects[specName][index].installRequiresPackages[package]
96
-        return None
97
-
98
-    def getCheckBuildRequiresForPackage(self, package, index=0):
99
-        specName=self.getSpecName(package)
100
-        return self.mapSpecObjects[specName][index].checkBuildRequirePackages
84
+    def _getProperVersion(self,depPkg):
85
+        if (depPkg.compare == ""):
86
+            return self.getHighestVersion(depPkg.package)
87
+        specObjs=self.getSpecObj(depPkg.package)
88
+        try:
89
+            for obj in specObjs:
90
+                verrel=obj.version+"-"+obj.release
91
+                if depPkg.compare == "gte":
92
+                    if LooseVersion(verrel) >= LooseVersion(depPkg.version):
93
+                        return obj.version
94
+                    if LooseVersion(obj.version) >= LooseVersion(depPkg.version):
95
+                        return obj.version
96
+                elif depPkg.compare == "lte":
97
+                    if LooseVersion(verrel) <= LooseVersion(depPkg.version):
98
+                        return obj.version
99
+                    if LooseVersion(obj.version) <= LooseVersion(depPkg.version):
100
+                        return obj.version
101
+                elif depPkg.compare == "eq":
102
+                    if LooseVersion(verrel) == LooseVersion(depPkg.version):
103
+                        return obj.version
104
+                    if LooseVersion(obj.version) == LooseVersion(depPkg.version):
105
+                        return obj.version
106
+                elif depPkg.compare == "lt":
107
+                    if LooseVersion(verrel) < LooseVersion(depPkg.version):
108
+                        return obj.version
109
+                    if LooseVersion(obj.version) < LooseVersion(depPkg.version):
110
+                        return obj.version
111
+                elif depPkg.compare == "gt":
112
+                    if LooseVersion(verrel) > LooseVersion(depPkg.version):
113
+                        return obj.version
114
+                    if LooseVersion(obj.version) > LooseVersion(depPkg.version):
115
+                        return obj.version
116
+        except Exception as e:
117
+            self.logger.error("Exception happened while searching for: " + depPkg.package + depPkg.compare + depPkg.version)
118
+            raise e
119
+
120
+        # To ignore Epoch, consider the highest version of the package
121
+        if "epoch" in depPkg.version:
122
+            return self.getHighestVersion(depPkg.package)
123
+        # about to throw exception
124
+        availableVersions=""
125
+        for obj in specObjs:
126
+            availableVersions+=" "+obj.name+"-"+obj.version+"-"+obj.release
127
+        raise Exception("Can not find package: " + depPkg.package + depPkg.compare + depPkg.version + " available specs:"+availableVersions)
128
+
129
+    def _getSpecObjField(self, package, version, field):
130
+        specName = self.getSpecName(package)
131
+        for specObj in self.mapSpecObjects[specName]:
132
+            if specObj.version == version:
133
+                return field(specObj)
134
+        self.logger.error("Could not able to find " + package +
135
+                          "-" + version + " package from specs")
136
+        raise Exception("Invalid package: " + package + "-" + version)
137
+
138
+    def getBuildRequiresForPackage(self, package, version):
139
+        buildRequiresList=[]
140
+        buildRequiresPackages = self._getSpecObjField(package, version, field=lambda x : x.buildRequirePackages)
141
+        for pkg in buildRequiresPackages:
142
+            properVersion = self._getProperVersion(pkg)
143
+            buildRequiresList.append(pkg.package+"-"+properVersion)
144
+        return buildRequiresList
145
+
146
+    def getBuildRequiresForPkg(self, pkg):
147
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
148
+        return self.getBuildRequiresForPackage(package, version)
149
+
150
+    # Returns list of [ "pkg1-vers1", "pkg2-vers2",.. ]
151
+    def getRequiresAllForPackage(self, package, version):
152
+        requiresList=[]
153
+        requiresPackages = self._getSpecObjField(package, version, field=lambda x : x.installRequiresAllPackages)
154
+        for pkg in requiresPackages:
155
+            properVersion = self._getProperVersion(pkg)
156
+            requiresList.append(pkg.package+"-"+properVersion)
157
+        return requiresList
158
+
159
+    def getRequiresAllForPkg(self, pkg):
160
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
161
+        return self.getRequiresAllForPackage(package, version)
162
+
163
+    def getRequiresForPackage(self, package, version):
164
+        requiresList=[]
165
+        specName = self.getSpecName(package)
166
+        for specObj in self.mapSpecObjects[specName]:
167
+            if specObj.version == version:
168
+                if package in specObj.installRequiresPackages:
169
+                    requiresPackages = specObj.installRequiresPackages[package]
170
+                    for pkg in requiresPackages:
171
+                        properVersion = self._getProperVersion(pkg)
172
+                        requiresList.append(pkg.package+"-"+properVersion)
173
+                return requiresList
174
+        self.logger.error("Could not able to find " + package +
175
+                          "-" + version + " package from specs")
176
+        raise Exception("Invalid package: " + package + "-" + version)
177
+
178
+    def getRequiresForPkg(self, pkg):
179
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
180
+        return self.getRequiresForPackage(package, version)
181
+
182
+    def getCheckBuildRequiresForPackage(self, package, version):
183
+        checkBuildRequiresList=[]
184
+        checkBuildRequiresPackages = self._getSpecObjField(package, version, field=lambda x : x.checkBuildRequirePackages)
185
+        for pkg in checkBuildRequiresPackages:
186
+            properVersion = self._getProperVersion(pkg)
187
+            checkBuildRequiresList.append(pkg.package+"-"+properVersion)
188
+        return checkBuildRequiresList
101 189
 
102 190
     def getRelease(self, package, version=None):
103 191
         specName=self.getSpecName(package)
... ...
@@ -108,33 +198,41 @@ class SpecObjectsUtils(object):
108 108
                 return p.release
109 109
         return None
110 110
 
111
-    def getVersion(self, package, index=0):
112
-        specName=self.getSpecName(package)
113
-        return self.mapSpecObjects[specName][index].version
111
+    def getHighestVersion(self, package):
112
+        specName = self.getSpecName(package)
113
+        return self.mapSpecObjects[specName][0].version
114 114
 
115
-    def getSpecFile(self, package, index=0):
116
-        specName=self.getSpecName(package)
117
-        return self.mapSpecObjects[specName][index].specFile
115
+    def getVersions(self, package):
116
+        versions=[]
117
+        specName = self.getSpecName(package)
118
+        for specObj in self.mapSpecObjects[specName]:
119
+            versions.append(specObj.version)
120
+        return versions
118 121
 
119
-    def getPatches(self, package, index=0):
120
-        specName=self.getSpecName(package)
121
-        return self.mapSpecObjects[specName][index].listPatches
122
+    def getSpecFile(self, package, version):
123
+        return self._getSpecObjField(package, version, field=lambda x : x.specFile)
122 124
 
123
-    def getSources(self, package, index=0):
124
-        specName=self.getSpecName(package)
125
-        return self.mapSpecObjects[specName][index].listSources
125
+    def getPatches(self, package, version):
126
+        return self._getSpecObjField(package, version, field=lambda x : x.listPatches)
126 127
 
127
-    def getSHA1(self, package, source, index=0):
128
-        specName=self.getSpecName(package)
129
-        return self.mapSpecObjects[specName][index].checksums.get(source)
128
+    def getSources(self, package, version):
129
+        return self._getSpecObjField(package, version, field=lambda x : x.listSources)
130 130
 
131
-    def getPackages(self, package, index=0):
132
-        specName=self.getSpecName(package)
133
-        return self.mapSpecObjects[specName][index].listPackages
131
+    def getSHA1(self, package, source, version):
132
+        return self._getSpecObjField(package, version, field=lambda x : x.checksums.get(source))
133
+    # returns list of package names (no versions)
134
+    def getPackages(self, package, version):
135
+        return self._getSpecObjField(package, version, field=lambda x : x.listPackages)
134 136
 
135
-    def getRPMPackages(self, package, index=0):
136
-        specName=self.getSpecName(package)
137
-        return self.mapSpecObjects[specName][index].listRPMPackages
137
+    def getPackagesForPkg(self, pkg):
138
+        pkgs=[]
139
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
140
+        for p in self.getPackages(package, version):
141
+            pkgs.append(p+"-"+version)
142
+        return pkgs
143
+
144
+    def getRPMPackages(self, package, version):
145
+        return self._getSpecObjField(package, version, field=lambda x : x.listRPMPackages)
138 146
 
139 147
     @staticmethod
140 148
     def compareVersions(p):
... ...
@@ -148,35 +246,30 @@ class SpecObjectsUtils(object):
148 148
         self.logger.error("Could not able to find "+package+" package from specs")
149 149
         raise Exception("Invalid package:"+package)
150 150
 
151
-    def isRPMPackage(self,package, index=0):
151
+    def isRPMPackage(self,package):
152 152
         if package in self.mapPackageToSpec:
153 153
             specName=self.mapPackageToSpec[package]
154 154
             if specName in self.mapSpecObjects:
155 155
                 return True
156 156
         return False
157 157
 
158
-    def getSecurityHardeningOption(self, package, index=0):
159
-        specName=self.getSpecName(package)
160
-        return self.mapSpecObjects[specName][index].securityHardening
158
+    def getSecurityHardeningOption(self, package, version):
159
+        return self._getSpecObjField(package, version, field=lambda x : x.securityHardening)
161 160
 
162
-    def isCheckAvailable(self, package, index=0):
163
-        specName=self.getSpecName(package)
164
-        return self.mapSpecObjects[specName][index].isCheckAvailable
161
+    def isCheckAvailable(self, package, version):
162
+        return self._getSpecObjField(package, version, field=lambda x : x.isCheckAvailable)
165 163
 
166 164
     def getListPackages(self):
167 165
         return self.mapSpecObjects.keys()
168 166
 
169
-    def getURL(self, package, index=0):
170
-        specName=self.getSpecName(package)
171
-        return self.mapSpecObjects[specName][index].url
167
+    def getURL(self, package, version):
168
+        return self._getSpecObjField(package, version, field=lambda x : x.url)
172 169
 
173
-    def getSourceURL(self, package, index=0):
174
-        specName=self.getSpecName(package)
175
-        return self.mapSpecObjects[specName][index].sourceurl
170
+    def getSourceURL(self, package, version):
171
+        return self._getSpecObjField(package, version, field=lambda x : x.sourceurl)
176 172
 
177
-    def getLicense(self, package, index=0):
178
-        specName=self.getSpecName(package)
179
-        return self.mapSpecObjects[specName][index].license
173
+    def getLicense(self, package, version):
174
+        return self._getSpecObjField(package, version, field=lambda x : x.license)
180 175
 
181 176
     def getNumberOfVersions(self, package):
182 177
         specName=self.getSpecName(package)
... ...
@@ -194,6 +287,11 @@ class SpecObjectsUtils(object):
194 194
         listPkgName=list(set(listPkgName))
195 195
         return listPkgName
196 196
 
197
+    # Converts "glibc-devel-2.28" into "glibc-2.28"
198
+    def getBasePkg(self, pkg):
199
+        package, version = StringUtils.splitPackageNameAndVersion(pkg)
200
+        return self.getSpecName(package)+"-"+version
201
+
197 202
     def printAllObjects(self):
198 203
         listSpecs=self.mapSpecObjects.keys()
199 204
         for spec in listSpecs:
... ...
@@ -252,7 +350,7 @@ class SPECS(object):
252 252
             java8version = spec.getVersion()
253 253
             constants.addMacro("JAVA8_VERSION",java8version)
254 254
 
255
-        
255
+
256 256
         #adding openjre9 version rpm macro
257 257
         if (platform.machine() == "x86_64"):
258 258
             spec = Specutils(constants.specPath + "/openjdk9/openjdk9.spec")
... ...
@@ -285,267 +383,3 @@ class SPECS(object):
285 285
         # Full parsing
286 286
         self.specData = SpecObjectsUtils(constants.logPath)
287 287
         self.specData.readSpecsAndConvertToSerializableObjects(constants.specPath)
288
-
289
-# Little bit of duplication
290
-# Used by SpecVerify and SpecDeps only
291
-class SerializedSpecObjects(object):
292
-
293
-    def __init__(self, inputDataDir, stageDir):
294
-        self.mapSpecObjects={}
295
-        self.mapPackageToSpec={}
296
-        self.jsonFilesOutPath = stageDir + "/common/data/"
297
-        self.inputDataDir = inputDataDir
298
-
299
-    def findTotalRequires(self, allDeps, depQue, parent, displayOption):
300
-        while not depQue.empty():
301
-            specPkg = depQue.get()
302
-            specName = self.getSpecName(specPkg)
303
-            if specName is None:
304
-                print specPkg + " is missing"
305
-            specObj = self.mapSpecObjects[specName]
306
-            for depPkg in specObj.installRequiresPackages[specPkg]:
307
-                if True == allDeps.has_key(depPkg):
308
-                    if(allDeps[depPkg] < allDeps[specPkg] + 1):
309
-                        allDeps[depPkg] = allDeps[specPkg] + 1
310
-                        parent[depPkg] = specPkg
311
-                        self.updateLevels(allDeps, depPkg, parent, allDeps[depPkg])
312
-                else:
313
-                    allDeps[depPkg] = allDeps[specPkg] + 1
314
-                    parent[depPkg] = specPkg
315
-                    depQue.put(depPkg)
316
-
317
-    def findTotalWhoNeedsToBuild(self, depQue, whoBuildDeps, whoBuildDepSet, displayOption):
318
-        while not depQue.empty():
319
-            specPkg = depQue.get()
320
-            specName = self.getSpecName(specPkg)
321
-            spec=Specutils(self.getSpecFile(specPkg))
322
-            RPMName=spec.getRPMName(specPkg)
323
-            debuginfoRPMName=spec.getDebuginfoRPMName(specPkg)
324
-            whoBuildDepSet.add(RPMName)
325
-            whoBuildDepSet.add(debuginfoRPMName)
326
-            if specName is None:
327
-                print specPkg + " is missing"
328
-            if not whoBuildDeps.has_key(specPkg):
329
-                continue
330
-            for depPkg in whoBuildDeps[specPkg]:
331
-                depQue.put(depPkg)
332
-
333
-    def printTree(self, allDeps, children, curParent , depth):
334
-        if (children.has_key(curParent)):
335
-            for child in children[curParent]:
336
-                print "\t" * depth, child
337
-                self.printTree(allDeps, children, child, depth+1)
338
-
339
-    def get_all_package_names(self, jsonFilePath):
340
-        base_path = os.path.dirname(jsonFilePath)
341
-        jsonData = open(jsonFilePath)
342
-        option_list_json = json.load(jsonData)
343
-        jsonData.close()
344
-        packages = option_list_json["packages"]
345
-        return packages
346
-
347
-    def updateLevels(self, allDeps, inPkg, parent, level):
348
-        specName = self.getSpecName(inPkg)
349
-        specObj = self.mapSpecObjects[specName]
350
-        for depPkg in specObj.installRequiresPackages[inPkg]:
351
-            # ignore circular deps within single spec file
352
-            if (specObj.installRequiresPackages.has_key(depPkg) and inPkg in specObj.installRequiresPackages[depPkg] and self.getSpecName(depPkg) == specName):
353
-                continue
354
-            if (allDeps.has_key(depPkg) and allDeps[depPkg] < level + 1):
355
-                allDeps[depPkg] = level + 1
356
-                parent[depPkg] = inPkg
357
-                self.updateLevels(allDeps, depPkg, parent, allDeps[depPkg])
358
-
359
-    def readSpecsAndConvertToSerializableObjects(self, specFilesPath, inputType, inputValue, displayOption):
360
-        children = {}
361
-        listSpecFiles=[]
362
-        whoNeedsList=[]
363
-        whoBuildDepSet= set()
364
-        independentRPMS=[] # list of all RPMS not built from photon and that must be blindly copied.
365
-        whoBuildDeps = {}
366
-        allDeps={}
367
-        parent={}
368
-        depQue = Queue.Queue()
369
-        packageFound = False
370
-        self.getListSpecFiles(listSpecFiles,specFilesPath)
371
-        for specFile in listSpecFiles:
372
-            spec=Specutils(specFile)
373
-            specName=spec.getBasePackageName()
374
-            specObj=SpecObject()
375
-            specObj.name=specName
376
-            specObj.buildRequirePackages=spec.getBuildRequiresAllPackages()
377
-            specObj.installRequiresAllPackages=spec.getRequiresAllPackages()
378
-            specObj.listPackages=spec.getPackageNames()
379
-            specObj.specFile=specFile
380
-            specObj.version=spec.getVersion()
381
-            specObj.release=spec.getRelease()
382
-            specObj.listSources=spec.getSourceNames()
383
-            specObj.listPatches=spec.getPatchNames()
384
-            specObj.securityHardening=spec.getSecurityHardeningOption()
385
-            for specPkg in specObj.listPackages:
386
-                specObj.installRequiresPackages[specPkg]=spec.getRequires(specPkg)
387
-                if (inputType == "pkg" and inputValue == specPkg): # all the first level dependencies to a dictionary and queue
388
-                    packageFound = True
389
-                    for depPkg in specObj.installRequiresPackages[specPkg]:
390
-                        if False == allDeps.has_key(depPkg):
391
-                            allDeps[depPkg] = 0
392
-                            parent[depPkg] = ""
393
-                            depQue.put(depPkg)
394
-                elif (inputType == "who-needs" and (inputValue in specObj.installRequiresPackages[specPkg])):
395
-                    whoNeedsList.append(specPkg)
396
-                elif (inputType == "who-needs-build"):
397
-                    for bdrq in specObj.buildRequirePackages:
398
-                        if (whoBuildDeps.has_key(bdrq.package)):
399
-                            whoBuildDeps[bdrq.package].add(specPkg)
400
-                        else:
401
-                            whoBuildDeps[bdrq.package] = set()
402
-                            whoBuildDeps[bdrq.package].add(specPkg)
403
-                    if(inputValue == specPkg):
404
-                        packageFound = True
405
-                        for depPkg in specObj.listPackages:
406
-                            depQue.put(depPkg)
407
-
408
-                self.mapPackageToSpec[specPkg]=specName
409
-            self.mapSpecObjects[specName]=specObj
410
-
411
-        # Generate dependencies for individual packages
412
-        if (inputType == "pkg"):
413
-            if (packageFound == True):
414
-                self.findTotalRequires(allDeps, depQue, parent, displayOption)
415
-            else:
416
-                print "No spec file builds a package named",inputValue
417
-                return
418
-
419
-        # Generate dependencies for all packages in the given JSON input file
420
-        elif (inputType == "json"):
421
-            filePath = self.inputDataDir +"/"+ inputValue
422
-            data = self.get_all_package_names(filePath)
423
-            for pkg in data:
424
-                if False == allDeps.has_key(pkg):
425
-                    spName = self.getSpecName(pkg)
426
-                    if(spName != None):
427
-                        allDeps[pkg] = 0
428
-                        parent[pkg] = ""
429
-                        depQue.put(pkg)
430
-                        self.findTotalRequires(allDeps, depQue, parent, displayOption)
431
-                    else:
432
-                        independentRPMS.append(pkg);
433
-
434
-        #Generating the list of packages that requires the given input package at install time
435
-        elif (inputType == "who-needs"):
436
-            print whoNeedsList
437
-            return
438
-
439
-        #Generating the list of packages that the modified package will affect at build time
440
-        elif (inputType == "who-needs-build"):
441
-            if (packageFound == True):
442
-                self.findTotalWhoNeedsToBuild(depQue, whoBuildDeps, whoBuildDepSet, displayOption)
443
-                print whoBuildDepSet
444
-            else:
445
-                print "No spec file builds a package named", inputValue
446
-            return
447
-
448
-        # construct the sorted list of all packages (sorted by dependency)
449
-        sortedList = []
450
-        for elem in sorted(allDeps.items(), key=operator.itemgetter(1), reverse=True):
451
-            sortedList.append(elem[0])
452
-        sortedList.extend(independentRPMS)
453
-
454
-        # construct all children nodes
455
-        if (displayOption == "tree"):
456
-            for k, v in parent.iteritems():
457
-                children.setdefault(v, []).append(k)
458
-            if(inputType == "json"):
459
-                print "Dependency Mappings for", inputValue, ":", "\n----------------------------------------------------",children
460
-                print "----------------------------------------------------"
461
-            if (children.has_key("")):
462
-                for child in children[""]:
463
-                    print child
464
-                    self.printTree(allDeps, children, child, 1)
465
-                for pkg in independentRPMS:
466
-                    print pkg
467
-                print "******************",len(sortedList), "packages in total ******************"
468
-            else:
469
-                if (inputType == "pkg" and len(children) > 0):
470
-                    print "cyclic dependency detected, mappings: \n",children
471
-
472
-        # To display a flat list of all packages
473
-        elif(displayOption == "list"):
474
-            print sortedList
475
-
476
-        # To generate a new JSON file based on given input json file
477
-        elif(displayOption == "json" and inputType == "json"):
478
-            d = {}
479
-            d['packages'] = sortedList
480
-            outFilePath = self.jsonFilesOutPath + inputValue
481
-            with open(outFilePath, 'wb') as outfile:
482
-                json.dump(d, outfile)
483
-        return sortedList
484
-
485
-    def getListSpecFiles(self,listSpecFiles,path):
486
-        for dirEntry in os.listdir(path):
487
-            dirEntryPath = os.path.join(path, dirEntry)
488
-            if os.path.isfile(dirEntryPath) and dirEntryPath.endswith(".spec") and os.path.basename(dirEntryPath) not in constants.skipSpecsForArch.get(platform.machine(),[]):
489
-                listSpecFiles.append(dirEntryPath)
490
-            elif os.path.isdir(dirEntryPath):
491
-                self.getListSpecFiles(listSpecFiles,dirEntryPath)
492
-
493
-    def getBuildRequiresForPackage(self, package):
494
-        specName=self.getSpecName(package)
495
-        return self.mapSpecObjects[specName].buildRequirePackages
496
-
497
-    def getRequiresForPackage(self, package):
498
-        specName=self.getSpecName(package)
499
-        if self.mapSpecObjects[specName].installRequiresPackages.has_key(package):
500
-            return self.mapSpecObjects[specName].installRequiresPackages[package]
501
-        return None
502
-
503
-    def getRelease(self, package):
504
-        specName=self.getSpecName(package)
505
-        return self.mapSpecObjects[specName].release
506
-
507
-    def getVersion(self, package):
508
-        specName=self.getSpecName(package)
509
-        return self.mapSpecObjects[specName].version
510
-
511
-    def getSpecFile(self, package):
512
-        specName=self.getSpecName(package)
513
-        return self.mapSpecObjects[specName].specFile
514
-
515
-    def getPatches(self, package):
516
-        specName=self.getSpecName(package)
517
-        return self.mapSpecObjects[specName].listPatches
518
-
519
-    def getSources(self, package):
520
-        specName=self.getSpecName(package)
521
-        return self.mapSpecObjects[specName].listSources
522
-
523
-    def getPackages(self, package):
524
-        specName=self.getSpecName(package)
525
-        return self.mapSpecObjects[specName].listPackages
526
-
527
-    def getSpecName(self,package):
528
-        if self.mapPackageToSpec.has_key(package):
529
-            specName=self.mapPackageToSpec[package]
530
-            if self.mapSpecObjects.has_key(specName):
531
-                return specName
532
-            else:
533
-                print "SpecDeps: Could not able to find " + package + " package from specs"
534
-                raise Exception("Invalid package:" + package)
535
-        else:
536
-            return None
537
-
538
-    def isRPMPackage(self,package):
539
-        if self.mapPackageToSpec.has_key(package):
540
-            specName=self.mapPackageToSpec[package]
541
-        if self.mapSpecObjects.has_key(specName):
542
-            return True
543
-        return False
544
-
545
-    def getSecurityHardeningOption(self, package):
546
-        specName=self.getSpecName(package)
547
-        return self.mapSpecObjects[specName].securityHardening
548
-
549
-    def getSpecDetails(self, name):
550
-        print self.getPkgNamesFromObj(self.mapSpecObjects[name].installRequiresAllPackages)
551
-
... ...
@@ -3,54 +3,242 @@
3 3
 #    Copyright (C) 2015 vmware inc.
4 4
 #
5 5
 #    Author: Harish Udaiya Kumar <hudaiyakumar@vmware.com>
6
-from SpecUtils import Specutils
7
-from SpecData import SerializedSpecObjects
8 6
 import sys
9 7
 import os
10
-from optparse import OptionParser
8
+import json
9
+import Queue
10
+import operator
11
+from argparse import ArgumentParser
12
+import shutil
13
+import traceback
14
+from SpecData import SPECS
11 15
 from jsonwrapper import JsonWrapper
16
+from constants import constants
17
+from CommandUtils import CommandUtils
18
+from StringUtils import StringUtils
19
+from Logger import Logger
20
+from optparse import OptionParser
21
+
12 22
 
13 23
 DEFAULT_INPUT_TYPE = "pkg"
14 24
 DEFAULT_DISPLAY_OPTION = "tree"
15 25
 SPEC_FILE_DIR = "../../SPECS"
16 26
 LOG_FILE_DIR = "../../stage/LOGS"
17 27
 
28
+class SpecDependencyGenerator(object):
29
+
30
+    def __init__(self, logPath, logLevel):
31
+        self.logger = Logger.getLogger("Serializable Spec objects", logPath, logLevel)
32
+    def findTotalRequires(self, mapDependencies, depQue, parent):
33
+        while not depQue.empty():
34
+            specPkg = depQue.get()
35
+            try:
36
+                listRequiredPackages = SPECS.getData().getRequiresForPkg(specPkg)
37
+            except Exception as e:
38
+                self.logger.info("Caught Exception:"+str(e))
39
+                self.logger.info(specPkg + " is missing")
40
+                raise e
41
+
42
+            for depPkg in listRequiredPackages:
43
+                if depPkg in mapDependencies:
44
+                    if mapDependencies[depPkg] < mapDependencies[specPkg] + 1:
45
+                        mapDependencies[depPkg] = mapDependencies[specPkg] + 1
46
+                        parent[depPkg] = specPkg
47
+                        self.updateLevels(mapDependencies, depPkg, parent, mapDependencies[depPkg])
48
+                else:
49
+                    mapDependencies[depPkg] = mapDependencies[specPkg] + 1
50
+                    parent[depPkg] = specPkg
51
+                    depQue.put(depPkg)
52
+
53
+    def getBasePackagesRequired(self, pkg):
54
+        listBasePackagesRequired=[]
55
+        listPackagesRequired = SPECS.getData().getBuildRequiresForPkg(pkg)
56
+        listPackagesRequired.extend(SPECS.getData().getRequiresAllForPkg(pkg))
57
+        for p in listPackagesRequired:
58
+            basePkg = SPECS.getData().getBasePkg(p)
59
+            if basePkg not in listBasePackagesRequired:
60
+                listBasePackagesRequired.append(basePkg)
61
+        return listBasePackagesRequired
62
+
63
+    def findTotalWhoNeeds(self, depList, whoNeeds):
64
+        while depList:
65
+            pkg = depList.pop(0)
66
+            for depPackage in SPECS.getData().getListPackages():
67
+                for version in SPECS.getData().getVersions(depPackage):
68
+                    depBasePkg = depPackage+"-"+version
69
+                    if depBasePkg in whoNeeds:
70
+                        continue
71
+                    if pkg in self.getBasePackagesRequired(depBasePkg):
72
+                        whoNeeds.append(depBasePkg)
73
+                        if depBasePkg not in depList:
74
+                            depList.append(depBasePkg)
75
+
76
+    def printTree(self, children, curParent, depth):
77
+        if curParent in children:
78
+            for child in children[curParent]:
79
+                self.logger.info("\t" * depth + child)
80
+                self.printTree(children, child, depth + 1)
81
+
82
+    def getAllPackageNames(self, jsonFilePath):
83
+        with open(jsonFilePath) as jsonData:
84
+            option_list_json = json.load(jsonData)
85
+            packages = option_list_json["packages"]
86
+            return packages
87
+
88
+    def updateLevels(self, mapDependencies, inPkg, parent, level):
89
+        listPackages = SPECS.getData().getPackagesForPkg(inPkg)
90
+        for depPkg in SPECS.getData().getRequiresForPkg(inPkg):
91
+            if depPkg in listPackages:
92
+                continue
93
+            if depPkg in mapDependencies and mapDependencies[depPkg] < level + 1:
94
+                mapDependencies[depPkg] = level + 1
95
+                parent[depPkg] = inPkg
96
+                self.updateLevels(mapDependencies, depPkg, parent, mapDependencies[depPkg])
97
+
98
+    def calculateSpecDependency(self, inputPackages, mapDependencies, parent):
99
+        depQue = Queue.Queue()
100
+        for package in inputPackages:
101
+            if SPECS.getData().isRPMPackage(package):
102
+                version = SPECS.getData().getHighestVersion(package)
103
+                pkg = package+"-"+version
104
+                if pkg not in mapDependencies:
105
+                    mapDependencies[pkg] = 0
106
+                    parent[pkg] = ""
107
+                    depQue.put(pkg)
108
+                    self.findTotalRequires(mapDependencies, depQue, parent)
109
+            else:
110
+                self.logger.info("Could not find spec for " + package)
111
+
112
+    def displayDependencies(self, displayOption, inputType, inputValue, allDeps, parent):
113
+        children = {}
114
+        sortedList = []
115
+        for elem in sorted(allDeps.items(), key=operator.itemgetter(1), reverse=True):
116
+            sortedList.append(elem[0])
117
+        # construct all children nodes
118
+        if displayOption == "tree":
119
+            for k, v in parent.iteritems():
120
+                children.setdefault(v, []).append(k)
121
+            if inputType == "json":
122
+                self.logger.info("Dependency Mappings for {}".format(inputValue) + " :")
123
+                self.logger.info("-" * 52 + " {}".format(children))
124
+                self.logger.info("-" * 52)
125
+            if "" in children:
126
+                for child in children[""]:
127
+                    self.logger.info(child)
128
+                    self.printTree(children, child, 1)
129
+                self.logger.info("*" * 18 + " {} ".format(len(sortedList)) +
130
+                      "packages in total " + "*" * 18)
131
+            else:
132
+                if inputType == "pkg" and len(children) > 0:
133
+                    self.logger.info("cyclic dependency detected, mappings: \n", children)
134
+
135
+        # To display a flat list of all packages
136
+        elif displayOption == "list":
137
+            self.logger.info(sortedList)
138
+
139
+        # To generate a new JSON file based on given input json file
140
+        elif displayOption == "json" and inputType == "json":
141
+            d = {'packages': sortedList}
142
+            with open(inputValue, 'w') as outfile:
143
+                json.dump(d, outfile)
144
+
145
+        return sortedList
146
+
147
+    def process(self, inputType, inputValue, displayOption, outputFile=None):
148
+        whoNeedsList = []
149
+        inputPackages = []
150
+        whatNeedsBuild = []
151
+        mapDependencies = {}
152
+        parent = {}
153
+        if inputType == "pkg" or inputType == "json":
154
+            if inputType == "pkg":
155
+                inputPackages.append(inputValue)
156
+            else:
157
+                inputPackages = self.getAllPackageNames(inputValue)
158
+            self.calculateSpecDependency(inputPackages, mapDependencies, parent)
159
+            if outputFile is not None:
160
+                return self.displayDependencies(displayOption, inputType, outputFile, mapDependencies, parent)
161
+            else:
162
+                return self.displayDependencies(displayOption, inputType, inputValue, mapDependencies, parent)
163
+        elif inputType == "who-needs-build":
164
+            depList = []
165
+            for specFile in inputValue.split(":"):
166
+                if specFile in SPECS.getData().mapSpecFileNameToSpecObj:
167
+                    specObj = SPECS.getData().mapSpecFileNameToSpecObj[specFile]
168
+                    whoNeedsList.append(specObj.name+"-"+specObj.version)
169
+                    depList.append(specObj.name+"-"+specObj.version)
170
+            self.findTotalWhoNeeds(depList, whoNeedsList)
171
+            return whoNeedsList
172
+
173
+        elif inputType == "who-needs":
174
+            for depPackage in SPECS.getData().mapPackageToSpec:
175
+                pkg=inputValue+"-"+SPECS.getData().getHighestVersion(inputValue)
176
+                for version in SPECS.getData().getVersions(depPackage):
177
+                    depPkg = depPackage+"-"+version
178
+                    self.logger.info(depPkg)
179
+                    if pkg in SPECS.getData().getRequiresForPkg(depPkg):
180
+                        whoNeedsList.append(depPkg)
181
+            self.logger.info(whoNeedsList)
182
+            return whoNeedsList
183
+
18 184
 
19 185
 def main():
20
-    usage = os.path.basename(__file__) + "--input-type=[json/pkg/who-needs/who-needs-build] --pkg=[pkg_name] --file=<JSON_FILE_NAME> --disp=[tree/list/json]"
21
-    parser = OptionParser(usage)
22
-    parser.add_option("-i", "--input-type", dest="input_type", default=DEFAULT_INPUT_TYPE)
23
-    parser.add_option("-p", "--pkg", dest="pkg")
24
-    parser.add_option("-f", "--file", dest="json_file", default="packages_minimal.json")
25
-    parser.add_option("-d", "--disp", dest="display_option", default=DEFAULT_DISPLAY_OPTION) 
26
-    parser.add_option("-s", "--spec-dir", dest="spec_dir", default=SPEC_FILE_DIR)
27
-    parser.add_option("-t", "--stage-dir", dest="stage_dir", default="../../stage")
28
-    parser.add_option("-a", "--input-data-dir", dest="input_data_dir", default="../../common/data/")
29
-    (options,  args) = parser.parse_args() 
30
-
31
-    if(False == options.input_data_dir.endswith('/')):
186
+    usage = "Usage: %prog [options]"
187
+    parser = ArgumentParser(usage)
188
+    parser.add_argument("-i", "--input-type", dest="input_type", default=DEFAULT_INPUT_TYPE)
189
+    parser.add_argument("-p", "--pkg", dest="pkg")
190
+    parser.add_argument("-f", "--file", dest="json_file", default="packages_minimal.json")
191
+    parser.add_argument("-d", "--display-option", dest="display_option", default=DEFAULT_DISPLAY_OPTION)
192
+    parser.add_argument("-s", "--spec-path", dest="spec_path", default=SPEC_FILE_DIR)
193
+    parser.add_argument("-l", "--log-path", dest="log_path", default=LOG_FILE_DIR)
194
+    parser.add_argument("-y", "--log-level", dest="log_level", default="info")
195
+    parser.add_argument("-t", "--stage-dir", dest="stage_dir", default="../../stage")
196
+    parser.add_argument("-a", "--input-data-dir", dest="input_data_dir", default="../../common/data/")
197
+    parser.add_argument("-o", "--output-dir", dest="output_dir", default="../../stage/common/data")
198
+    options = parser.parse_args()
199
+
200
+    constants.setSpecPath(options.spec_path)
201
+    constants.setLogPath(options.log_path)
202
+    constants.setLogLevel(options.log_level)
203
+
204
+    cmdUtils = CommandUtils()
205
+    logger = Logger.getLogger("SpecDeps", options.log_path, options.log_level)
206
+
207
+    if not os.path.isdir(options.output_dir):
208
+        cmdUtils.runCommandInShell("mkdir -p "+options.output_dir)
209
+
210
+    if not options.input_data_dir.endswith('/'):
32 211
         options.input_data_dir += '/'
33 212
 
34
-    specDeps = SerializedSpecObjects(options.input_data_dir, options.stage_dir)
35
-    displayOption = options.display_option
36
-    abs_path = os.path.abspath(__file__)
37
-    dir_name = os.path.dirname(abs_path)
38
-    os.chdir(dir_name)
39
-
40
-    # To display/print package dependencies on console
41
-    if(options.input_type == "pkg" or options.input_type == "who-needs" or options.input_type == "who-needs-build"):
42
-        targetName = options.pkg
43
-        specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, targetName, displayOption)
44
-    elif(options.input_type == "json"):# Generate the expanded package dependencies json file based on package_list_file 
45
-        json_wrapper_option_list = JsonWrapper(options.json_file)
46
-        option_list_json = json_wrapper_option_list.read()
47
-        options_sorted = option_list_json.items()
48
-        for install_option in options_sorted:
49
-            if displayOption == "tree" and install_option[1]["title"] == "ISO Packages":
50
-                continue
51
-            specDeps.readSpecsAndConvertToSerializableObjects(options.spec_dir, options.input_type, install_option[1]["file"], displayOption)
213
+
214
+    try:
215
+        specDeps = SpecDependencyGenerator(options.log_path, options.log_level)
216
+
217
+        if (options.input_type == "pkg" or options.input_type == "who-needs" or options.input_type == "who-needs-build"):
218
+            specDeps.process(options.input_type, options.pkg, options.display_option)
219
+
220
+        elif options.input_type == "json":
221
+            list_json_files = options.json_file.split("\n")
222
+            # Generate the expanded package dependencies json file based on package_list_file
223
+            logger.info("Generating the install time dependency list for all json files")
224
+            for build_json_file in list_json_files:
225
+                output_file = None
226
+                if options.display_option == "json":
227
+                    json_wrapper_option_list = JsonWrapper(build_json_file)
228
+                    option_list_json = json_wrapper_option_list.read()
229
+                    options_sorted = option_list_json.items()
230
+                    for install_option in options_sorted:
231
+                        json_file = install_option[1]["file"]
232
+                        output_file = os.path.join(options.output_dir, os.path.basename(json_file))
233
+                        specDeps.process(options.input_type, options.input_data_dir+json_file, options.display_option, output_file)
234
+    except Exception as e:
235
+        traceback.print_exc()
236
+        sys.stderr.write(str(e))
237
+        sys.stderr.write("Failed to generate dependency lists from spec files\n")
238
+        sys.exit(1)
52 239
 
53 240
     sys.exit(0)
54 241
 
242
+
55 243
 if __name__=="__main__":
56 244
     main()
... ...
@@ -144,8 +144,7 @@ class Specutils(object):
144 144
 
145 145
     def getRequiresAllPackages(self):
146 146
         dependentPackages=[]
147
-        for key in self.spec.packages.keys():
148
-            pkg = self.spec.packages.get(key)
147
+        for pkg in self.spec.packages.values():
149 148
             for dpkg in pkg.requires:
150 149
                 dependentPackages.append(dpkg)
151 150
         listDependentPackages = list(set(dependentPackages))
... ...
@@ -159,8 +158,7 @@ class Specutils(object):
159 159
 
160 160
     def getBuildRequiresAllPackages(self):
161 161
         dependentPackages=[]
162
-        for key in self.spec.packages.keys():
163
-            pkg = self.spec.packages.get(key)
162
+        for pkg in self.spec.packages.values():
164 163
             for dpkg in pkg.buildrequires:
165 164
                 dependentPackages.append(dpkg)
166 165
         listDependentPackages = list(set(dependentPackages))
... ...
@@ -174,8 +172,7 @@ class Specutils(object):
174 174
 
175 175
     def getCheckBuildRequiresAllPackages(self):
176 176
         dependentPackages=[]
177
-        for key in self.spec.packages.keys():
178
-            pkg = self.spec.packages.get(key)
177
+        for pkg in self.spec.packages.values():
179 178
             for dpkg in pkg.checkbuildrequires:
180 179
                 dependentPackages.append(dpkg)
181 180
         dependentPackages = list(set(dependentPackages))
... ...
@@ -183,20 +180,18 @@ class Specutils(object):
183 183
 
184 184
     def getRequires(self,pkgName):
185 185
         dependentPackages=[]
186
-        for key in self.spec.packages.keys():
187
-            pkg = self.spec.packages.get(key)
186
+        for pkg in self.spec.packages.values():
188 187
             if pkg.name == pkgName:
189 188
                 for dpkg in pkg.requires:
190
-                    dependentPackages.append(dpkg.package)
189
+                    dependentPackages.append(dpkg)
191 190
         return dependentPackages
192 191
 
193 192
     def getBuildRequires(self,pkgName):
194 193
         dependentPackages=[]
195
-        for key in self.spec.packages.keys():
196
-            pkg = self.spec.packages.get(key)
194
+        for pkg in self.spec.packages.values():
197 195
             if pkg.name == pkgName:
198 196
                 for dpkg in pkg.buildrequires:
199
-                    dependentPackages.append(dpkg.package)
197
+                    dependentPackages.append(dpkg)
200 198
         return dependentPackages
201 199
 
202 200
     def getProvides(self,packageName):
... ...
@@ -37,3 +37,12 @@ class StringUtils(object):
37 37
             return inputstring
38 38
         name = m.group(2)
39 39
         return name.replace("_", ".")
40
+
41
+    @staticmethod
42
+    def splitPackageNameAndVersion(pkg):
43
+        versionindex = pkg.rfind("-")
44
+        if versionindex == -1:
45
+            raise Exception("Invalid argument")
46
+        packageName = pkg[:versionindex]
47
+        packageVersion = pkg[versionindex+1:]
48
+        return packageName, packageVersion
... ...
@@ -12,6 +12,7 @@ import json
12 12
 import collections
13 13
 from SpecData import SPECS
14 14
 import re
15
+from StringUtils import StringUtils
15 16
 
16 17
 class ToolChainUtils(object):
17 18
 
... ...
@@ -90,7 +91,8 @@ class ToolChainUtils(object):
90 90
         try:
91 91
             pkgUtils=PackageUtils(self.logName,self.logPath)
92 92
             for package in constants.listCoreToolChainPackages:
93
-                rpmPkg=pkgUtils.findRPMFileForGivenPackage(package)
93
+                version = SPECS.getData().getHighestVersion(package)
94
+                rpmPkg=pkgUtils.findRPMFileForGivenPackage(package, version)
94 95
                 if rpmPkg is not None:
95 96
                     continue
96 97
                 self.logger.info("Building core toolchain package: " + package)
... ...
@@ -104,9 +106,9 @@ class ToolChainUtils(object):
104 104
                 if not returnVal:
105 105
                     self.logger.error("Creating chroot failed")
106 106
                     raise Exception("creating chroot failed")
107
-                self.installToolChainRPMS(chrootID, package, listBuildOptionPackages, pkgBuildOptionFile, destLogPath)
108
-                pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath)
109
-                pkgUtils.buildRPMSForGivenPackage(package, chrootID, listBuildOptionPackages, pkgBuildOptionFile, destLogPath)
107
+                self.installToolChainRPMS(chrootID, package, version, listBuildOptionPackages, pkgBuildOptionFile, destLogPath)
108
+                pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath, version)
109
+                pkgUtils.buildRPMSForGivenPackage(package,version, chrootID, listBuildOptionPackages, pkgBuildOptionFile, destLogPath)
110 110
                 pkgCount += 1
111 111
                 chrUtils.destroyChroot(chrootID)
112 112
                 chrootID=None
... ...
@@ -120,13 +122,28 @@ class ToolChainUtils(object):
120 120
             raise e
121 121
         return pkgCount
122 122
 
123
-    def getListDependentPackageLineContent(self, index):
124
-        listBuildRequiresPkgLineContent=SPECS.getData().getBuildRequiresForPackage(self.package, index)
125
-        listBuildRequiresPkgLineContent.extend(SPECS.getData().getCheckBuildRequiresForPackage(self.package, index))
126
-        listBuildRequiresPkgLineContent=list(set(listBuildRequiresPkgLineContent))
127
-        return listBuildRequiresPkgLineContent
123
+    def getOverridenPackageVersion(self, packageName, package, listBuildOptionPackages, pkgBuildOptionFile):
124
+        version = "*"
125
+        if packageName in listBuildOptionPackages:
126
+            jsonData = open(pkgBuildOptionFile)
127
+            pkg_build_option_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
128
+            jsonData.close()
129
+            pkgs_sorted = pkg_build_option_json.items()
130
+            for pkg in pkgs_sorted:
131
+                p = str(pkg[0].encode('utf-8'))
132
+                if p == packageName:
133
+                    overridelist = pkg[1]["override_toolchain"]
134
+                    for override in overridelist:
135
+                        if package == str(override["package"].encode('utf-8')):
136
+                            version = str(override["version"].encode('utf-8'))
137
+        return version
128 138
 
129
-    def installToolChainRPMS(self,chrootID, packageName, listBuildOptionPackages, pkgBuildOptionFile, logPath=None, index=0):
139
+    def getListDependentPackage(self, package, version):
140
+        listBuildRequiresPkg=SPECS.getData().getBuildRequiresForPackage(package, version)
141
+        listBuildRequiresPkg.extend(SPECS.getData().getCheckBuildRequiresForPackage(package, version))
142
+        return listBuildRequiresPkg
143
+
144
+    def installToolChainRPMS(self,chrootID, packageName,packageVersion, listBuildOptionPackages, pkgBuildOptionFile, logPath=None):
130 145
         if logPath is None:
131 146
             logPath=self.logPath
132 147
         cmdUtils = CommandUtils()
... ...
@@ -135,7 +152,7 @@ class ToolChainUtils(object):
135 135
         rpmFiles = ""
136 136
         packages = ""
137 137
         self.package=packageName
138
-        listBuildRequiresPackageLineContent = self.getListDependentPackageLineContent(index)
138
+        listBuildRequiresPackage = self.getListDependentPackage(packageName,packageVersion)
139 139
 
140 140
         for package in constants.listToolChainRPMsToInstall:
141 141
             pkgUtils=PackageUtils(self.logName,self.logPath)
... ...
@@ -156,9 +173,10 @@ class ToolChainUtils(object):
156 156
                             if package == str(override["package"].encode('utf-8')):
157 157
                                 version = str(override["version"].encode('utf-8'))
158 158
             if version == "*":
159
-                for depPkg in listBuildRequiresPackageLineContent:
160
-                        if depPkg.package == package:
161
-                                version=pkgUtils.getProperVersion(package,depPkg)
159
+                for depPkg in listBuildRequiresPackage:
160
+                        depPkgName, depPkgVersion = StringUtils.splitPackageNameAndVersion(depPkg)
161
+                        if depPkgName == package:
162
+                                version=depPkgVersion
162 163
             if constants.rpmCheck:
163 164
                 rpmFile=pkgUtils.findRPMFileForGivenPackage(package, version)
164 165
             else:
... ...
@@ -156,6 +156,7 @@ def main():
156 156
             buildAPackage(package, listBuildOptionPackages, options.pkgBuildOptionFile, options.buildThreads, options.pkgBuildType)
157 157
         else:
158 158
             buildPackagesForAllSpecs(listBuildOptionPackages, options.pkgBuildOptionFile, logger, options.buildThreads, pkgInfoJsonFile, options.pkgBuildType)
159
+
159 160
     except Exception as e:
160 161
         logger.error("Caught an exception")
161 162
         logger.error(str(e))
... ...
@@ -171,19 +172,19 @@ def buildPackagesList(csvFilename):
171 171
     listPackages.sort()
172 172
     for package in listPackages:
173 173
         name = package
174
-        version = SPECS.getData().getVersion(package)
175
-        license = SPECS.getData().getLicense(package)
176
-        listPatches = SPECS.getData().getPatches(package)
177
-        url = SPECS.getData().getURL(package)
178
-        listSourceNames = SPECS.getData().getSources(package)
179
-        sources = ""
180
-        patches = ""
181
-        if listPatches is not None:
182
-            patches = " ".join(listPatches)
183
-        if listSourceNames is not None:
184
-            sources = " ".join(listSourceNames)
185
-        csvFile.write(name+","+version+","+license+","+url+","+sources+","+patches+"\n")
186
-    csvFile.close()
174
+        for version in SPECS.getData().getVersions(package):
175
+                license = SPECS.getData().getLicense(package, version)
176
+                listPatches = SPECS.getData().getPatches(package, version)
177
+                url = SPECS.getData().getURL(package, version)
178
+                listSourceNames = SPECS.getData().getSources(package,version)
179
+                sources = ""
180
+                patches = ""
181
+                if listPatches is not None:
182
+                        patches = " ".join(listPatches)
183
+                if listSourceNames is not None:
184
+                        sources = " ".join(listSourceNames)
185
+                csvFile.write(name+","+version+","+license+","+url+","+sources+","+patches+"\n")
186
+                csvFile.close()
187 187
 
188 188
 def readBlackListPackages(pkgBlackListFile):
189 189
     blackListPkgs = []
... ...
@@ -208,38 +209,38 @@ def buildSourcesList(yamlDir, blackListPkgs, logger, singleFile=True):
208 208
         if package in blackListPkgs:
209 209
             continue
210 210
         ossname = package
211
-        ossversion = SPECS.getData().getVersion(package)
212
-        modified = False
213
-        listPatches = SPECS.getData().getPatches(package)
214
-        if listPatches is not None and len(listPatches) > 0 :
215
-            modified = True
216
-        url = SPECS.getData().getSourceURL(package)
217
-        if url is None:
218
-            url = SPECS.getData().getURL(package)
219
-
220
-        sourceName = None
221
-        listSourceNames = SPECS.getData().getSources(package)
222
-        if len(listSourceNames) >0:
223
-            sourceName=listSourceNames[0]
224
-            sha1 = SPECS.getData().getSHA1(package, sourceName)
225
-            if sha1 is not None:
226
-                PullSources.get(package, sourceName, sha1, yamlSourceDir, constants.pullsourcesConfig, logger)
227
-
228
-        if not singleFile:
229
-            yamlFile = open(yamlSourceDir+"/"+ossname+"-"+ossversion+".yaml", "w")
230
-        yamlFile.write("vmwsource:"+ossname+":"+ossversion+":\n")
231
-        yamlFile.write("  repository: VMWsource\n")
232
-        yamlFile.write("  name: '"+ossname+"'\n")
233
-        yamlFile.write("  version: '"+ossversion+"'\n")
234
-        yamlFile.write("  url: "+str(url)+"\n")
235
-        yamlFile.write("  license: UNKNOWN\n")
236
-        if sourceName is not None:
237
-            yamlFile.write("  vmwsource-distribution: "+str(sourceName)+"\n")
238
-        if modified:
239
-            yamlFile.write("  modified: true\n")
240
-        yamlFile.write("\n")
241
-        if not singleFile:
242
-            yamlFile.close()
211
+        for version in SPECS.getData().getVersions(package):
212
+                modified = False
213
+                listPatches = SPECS.getData().getPatches(package, version)
214
+                if listPatches is not None and len(listPatches) > 0 :
215
+                        modified = True
216
+                url = SPECS.getData().getSourceURL(package, version)
217
+                if url is None:
218
+                        url = SPECS.getData().getURL(package, version)
219
+
220
+                sourceName = None
221
+                listSourceNames = SPECS.getData().getSources(package, version)
222
+                if len(listSourceNames) >0:
223
+                        sourceName=listSourceNames[0]
224
+                        sha1 = SPECS.getData().getSHA1(package, sourceName, version)
225
+                        if sha1 is not None:
226
+                                PullSources.get(package, sourceName, sha1, yamlSourceDir, constants.pullsourcesConfig, logger)
227
+
228
+                if not singleFile:
229
+                        yamlFile = open(yamlSourceDir+"/"+ossname+"-"+version+".yaml", "w")
230
+                yamlFile.write("vmwsource:"+ossname+":"+version+":\n")
231
+                yamlFile.write("  repository: VMWsource\n")
232
+                yamlFile.write("  name: '"+ossname+"'\n")
233
+                yamlFile.write("  version: '"+version+"'\n")
234
+                yamlFile.write("  url: "+str(url)+"\n")
235
+                yamlFile.write("  license: UNKNOWN\n")
236
+                if sourceName is not None:
237
+                        yamlFile.write("  vmwsource-distribution: "+str(sourceName)+"\n")
238
+                if modified:
239
+                        yamlFile.write("  modified: true\n")
240
+                yamlFile.write("\n")
241
+                if not singleFile:
242
+                        yamlFile.close()
243 243
 
244 244
     if singleFile:
245 245
         yamlFile.close()
... ...
@@ -258,39 +259,39 @@ def buildSRPMList(srpmPath, yamlDir, blackListPkgs, logger, singleFile=True):
258 258
         if package in blackListPkgs:
259 259
             continue
260 260
         ossname = package
261
-        ossversion = SPECS.getData().getVersion(package)
262
-        ossrelease = SPECS.getData().getRelease(package)
263
-
264
-        listFoundSRPMFiles = cmdUtils.findFile(ossname+"-"+ossversion+"-"+ossrelease+".src.rpm",srpmPath)
265
-        srpmName = None
266
-        if len(listFoundSRPMFiles) == 1:
267
-            srpmFullPath = listFoundSRPMFiles[0];
268
-            srpmName = os.path.basename(srpmFullPath)
269
-            cpcmd = "cp "+ srpmFullPath +" "+yamlSrpmDir+"/"
270
-            returnVal = cmdUtils.runCommandInShell(cpcmd)
271
-            if not returnVal:
272
-                logger.error("Copy SRPM File is failed for package:"+ossname)
273
-        else:
274
-             logger.error("SRPM file is not found:" +ossname)
275
-
276
-        if not singleFile:
277
-            yamlFile = open(yamlSrpmDir+"/"+ossname+"-"+ossversion+"-"+ossrelease+".yaml", "w")
278
-
279
-        yamlFile.write("baseos:"+ossname+":"+ossversion+"-"+ossrelease+":\n")
280
-        yamlFile.write("  repository: BaseOS\n")
281
-        yamlFile.write("  name: '"+ossname+"'\n")
282
-        yamlFile.write("  version: '"+ossversion+"-"+ossrelease+"'\n")
283
-        yamlFile.write("  url: 'http://www.vmware.com'\n")        
284
-        yamlFile.write("  baseos-style: rpm\n")
285
-        yamlFile.write("  baseos-source: '"+str(srpmName)+"'\n")
286
-        yamlFile.write("  baseos-osname: 'photon'\n")
287
-        yamlFile.write("\n")
288
-        if not singleFile:
289
-            yamlFile.close()
290
-
291
-    if singleFile:
292
-        yamlFile.close()
293
-    logger.info("Generated srpm yaml files for all packages")
261
+        for ossversion in SPECS.getData().getVersions(package):
262
+                ossrelease = SPECS.getData().getRelease(package, ossversion)
263
+
264
+                listFoundSRPMFiles = cmdUtils.findFile(ossname+"-"+ossversion+"-"+ossrelease+".src.rpm",srpmPath)
265
+                srpmName = None
266
+                if len(listFoundSRPMFiles) == 1:
267
+                        srpmFullPath = listFoundSRPMFiles[0];
268
+                        srpmName = os.path.basename(srpmFullPath)
269
+                        cpcmd = "cp "+ srpmFullPath +" "+yamlSrpmDir+"/"
270
+                        returnVal = cmdUtils.runCommandInShell(cpcmd)
271
+                        if not returnVal:
272
+                                logger.error("Copy SRPM File is failed for package:"+ossname)
273
+                else:
274
+                        logger.error("SRPM file is not found:" +ossname)
275
+
276
+                if not singleFile:
277
+                        yamlFile = open(yamlSrpmDir+"/"+ossname+"-"+ossversion+"-"+ossrelease+".yaml", "w")
278
+
279
+                yamlFile.write("baseos:"+ossname+":"+ossversion+"-"+ossrelease+":\n")
280
+                yamlFile.write("  repository: BaseOS\n")
281
+                yamlFile.write("  name: '"+ossname+"'\n")
282
+                yamlFile.write("  version: '"+ossversion+"-"+ossrelease+"'\n")
283
+                yamlFile.write("  url: 'http://www.vmware.com'\n")
284
+                yamlFile.write("  baseos-style: rpm\n")
285
+                yamlFile.write("  baseos-source: '"+str(srpmName)+"'\n")
286
+                yamlFile.write("  baseos-osname: 'photon'\n")
287
+                yamlFile.write("\n")
288
+                if not singleFile:
289
+                        yamlFile.close()
290
+
291
+        if singleFile:
292
+                yamlFile.close()
293
+        logger.info("Generated srpm yaml files for all packages")
294 294
 
295 295
 def buildAPackage(package, listBuildOptionPackages, pkgBuildOptionFile, buildThreads, pkgBuildType):
296 296
     listPackages=[]
... ...
@@ -467,3 +467,15 @@ class constants(object):
467 467
     @staticmethod
468 468
     def addMacro(macroName, macroValue):
469 469
         constants.userDefinedMacros[macroName]=macroValue
470
+
471
+    @staticmethod
472
+    def setLogLevel(logLevel):
473
+        constants.logLevel = logLevel
474
+
475
+    @staticmethod
476
+    def setLogPath(logPath):
477
+        constants.logPath = logPath
478
+
479
+    @staticmethod
480
+    def setSpecPath(specPath):
481
+        constants.specPath = specPath