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