Browse code

Fixed dependency order to build upgrade packages

Change-Id: Ie97dc8f557a9da5d482972fcedee0a1524ac08c3
Reviewed-on: http://photon-jenkins.eng.vmware.com/1175
Reviewed-by: suezzelur <anishs@vmware.com>
Tested-by: gerrit-photon <photon-checkins@vmware.com>

dthaluru authored on 2016/07/13 02:21:30
Showing 5 changed files
... ...
@@ -73,8 +73,24 @@ class PackageBuilder(object):
73 73
         except Exception as e:
74 74
             self.logger.error(e)
75 75
             outputMap[threadName]=False
76
-        
76
+
77
+    def checkIfPackageIsAlreadyBuilt(self, package):
78
+        basePkg=constants.specData.getSpecName(package)
79
+        listRPMPackages=constants.specData.getRPMPackages(basePkg)
80
+        packageIsAlreadyBuilt=True
81
+        pkgUtils = PackageUtils(self.logName,self.logPath)
82
+        for pkg in listRPMPackages:
83
+            if pkgUtils.findRPMFileForGivenPackage(pkg) is None:
84
+                packageIsAlreadyBuilt=False
85
+                break
86
+        return packageIsAlreadyBuilt
87
+
77 88
     def buildPackage(self,package):
89
+        #do not build if RPM is already built
90
+        if self.checkIfPackageIsAlreadyBuilt(package):
91
+            self.logger.info("Skipping building the package:"+package)
92
+            return
93
+
78 94
         #should initialize a logger based on package name
79 95
         chrUtils = ChrootUtils(self.logName,self.logPath)
80 96
         chrootName="build-"+package
... ...
@@ -65,7 +65,7 @@ class PackageManager(object):
65 65
         self.logger.info("List of Already built packages")
66 66
         self.logger.info(listAvailablePackages)
67 67
         return listAvailablePackages
68
-    
68
+
69 69
     def calculateParams(self,listPackages):
70 70
         self.listThreads.clear()
71 71
         self.mapOutputThread.clear()
... ...
@@ -75,8 +75,18 @@ class PackageManager(object):
75 75
         self.mapPackageToCycle.clear()
76 76
         self.sortedPackageList=[]
77 77
         
78
-        self.listOfPackagesAlreadyBuilt = self.readAlreadyAvailablePackages()
79
-        
78
+        listOfPackagesAlreadyBuilt = []
79
+        listOfPackagesAlreadyBuilt = self.readAlreadyAvailablePackages()
80
+        self.listOfPackagesAlreadyBuilt = listOfPackagesAlreadyBuilt[:]
81
+        for pkg in listOfPackagesAlreadyBuilt:
82
+            listDependentRpmPackages = constants.specData.getRequiresAllForPackage(pkg)
83
+            needToRebuild = False
84
+            for dependentPkg in listDependentRpmPackages:
85
+                if dependentPkg not in self.listOfPackagesAlreadyBuilt:
86
+                    needToRebuild = True
87
+            if needToRebuild:
88
+                self.listOfPackagesAlreadyBuilt.remove(pkg)
89
+ 
80 90
         listPackagesToBuild=listPackages[:]
81 91
         for pkg in listPackages:
82 92
             if pkg in self.listOfPackagesAlreadyBuilt:
... ...
@@ -6,6 +6,7 @@ from distutils.version import StrictVersion
6 6
 class SerializableSpecObject(object):
7 7
     def __init__(self):
8 8
         self.listPackages=[]
9
+        self.listRPMPackages=[]
9 10
         self.name=""
10 11
         self.version=""
11 12
         self.release=""
... ...
@@ -52,6 +53,8 @@ class SerializableSpecObjectsUtils(object):
52 52
 			break;			
53 53
             	specObj.installRequiresPackages[specPkg]=spec.getRequires(specPkg)
54 54
             	self.mapPackageToSpec[specPkg]=specName
55
+                if spec.getIsRPMPackage(specPkg):
56
+                    specObj.listRPMPackages.append(specPkg)
55 57
 	    if skipUpdating == False:
56 58
                 self.mapSerializableSpecObjects[specName]=specObj
57 59
     
... ...
@@ -105,6 +108,10 @@ class SerializableSpecObjectsUtils(object):
105 105
         specName=self.getSpecName(package)
106 106
         return self.mapSerializableSpecObjects[specName].listPackages
107 107
 
108
+    def getRPMPackages(self, package):
109
+        specName=self.getSpecName(package)
110
+        return self.mapSerializableSpecObjects[specName].listRPMPackages
111
+
108 112
     def getReleaseNum(self, releaseVal):
109 113
 	id = releaseVal.find(".")
110 114
 	if (id != -1):
... ...
@@ -19,18 +19,20 @@ class SpecParser(object):
19 19
         data=" ".join(data.split())
20 20
         pkgHeaderName=data.split(" ")
21 21
         lenpkgHeaderName = len(pkgHeaderName)
22
-        
23
-        if (lenpkgHeaderName >= 3 and pkgHeaderName[1] != "-n"):
24
-            lenpkgHeaderName = 1
25
-        if (lenpkgHeaderName == 2 or lenpkgHeaderName == 1 ) and basePkgName is None :
26
-            print "Invalid basePkgName"
27
-            return False,None
28
-        if lenpkgHeaderName == 3 :
29
-            return True,pkgHeaderName[2]
30
-        if lenpkgHeaderName == 2 :
31
-            return True,basePkgName + "-"+pkgHeaderName[1]
32
-        if lenpkgHeaderName == 1:
22
+        i=1;
23
+        pkgName = None
24
+        while i<lenpkgHeaderName:
25
+            if pkgHeaderName[i] == "-n" and i+1 < lenpkgHeaderName:
26
+                pkgName = pkgHeaderName[i+1]
27
+                break
28
+            if pkgHeaderName[i].startswith('-'):
29
+                i = i + 2
30
+            else:
31
+                pkgName = basePkgName+"-"+pkgHeaderName[i]
32
+                break
33
+        if pkgName is None:
33 34
             return True, basePkgName
35
+        return True, pkgName
34 36
     
35 37
     def parseSpecFile(self,specfile):
36 38
         self.createDefaultPackage()
... ...
@@ -58,9 +60,10 @@ class SpecParser(object):
58 58
                 else:
59 59
                     if defaultpkg.name == packageName :
60 60
                         packageName = 'default'
61
-                    if not self.packages.has_key(packageName):
62
-                        return False
63 61
                     macro,i=self.readMacroFromFile(i, lines)
62
+                    if not self.packages.has_key(packageName):
63
+                        i=i+1
64
+                        continue
64 65
                     self.packages[packageName].updatePackageMacro(macro)
65 66
             elif self.isPackageHeaders(line):
66 67
                 self.readPackageHeaders(line, self.packages[currentPkg])
... ...
@@ -63,6 +63,16 @@ class Specutils(object):
63 63
             packageNames.append(pkg.name)
64 64
         return packageNames
65 65
     
66
+    def getIsRPMPackage(self,pkgName):
67
+        defaultPkgName=self.spec.packages['default'].name
68
+        if pkgName == defaultPkgName:
69
+            pkgName = "default"
70
+        if pkgName in self.spec.packages.keys():
71
+            pkg = self.spec.packages.get(pkgName)
72
+            if pkg.filesMacro is not None:
73
+                return True
74
+        return False
75
+
66 76
     def getRPMNames(self):
67 77
         rpmNames=[]
68 78
         for key in self.spec.packages.keys():