Browse code

MackeCheck plug-in

Change-Id: I72c06e169f9ebed59eab44d119b7bd44075c2b12
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/1343
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Divya Thaluru <dthaluru@vmware.com>

Chang authored on 2016/09/01 01:17:52
Showing 9 changed files
... ...
@@ -41,18 +41,29 @@ else
41 41
 PHOTON_PUBLISH_RPMS := publish-rpms
42 42
 endif
43 43
 
44
-ifdef PHOTON_ENABLE_RPMCHECK
45
-PHOTON_RPMCHECK_OPTION := -u
44
+# Tri state RPMCHECK:
45
+# 1) RPMCHECK is not specified:  just build
46
+# 2) RPMCHECK=enable: build and run %check section. do not stop on error. will generate report file.
47
+# 3) RPMCHECK=enable_stop_on_error: build and run %check section. stop on first error.
48
+#
49
+# We use 2 parameters:
50
+# -u: enable checking.
51
+# -q: quit on error. if -q is not specified it will keep going
52
+
53
+ifeq ($(RPMCHECK),enable)
54
+PHOTON_RPMCHECK_FLAGS := -u
55
+else ifeq ($(RPMCHECK),enable_stop_on_error)
56
+PHOTON_RPMCHECK_FLAGS := -u -q
46 57
 else
47
-PHOTON_RPMCHECK_OPTION := 
58
+PHOTON_RPMCHECK_FLAGS :=
48 59
 endif
49 60
 
50 61
 TOOLS_BIN := $(SRCROOT)/tools/bin
51 62
 CONTAIN := $(TOOLS_BIN)/contain
52 63
 
53 64
 .PHONY : all iso clean photon-build-machine photon-vagrant-build photon-vagrant-local cloud-image \
54
-check check-docker check-bison check-g++ check-gawk check-createrepo check-vagrant check-packer check-packer-ovf-plugin check-sanity \
55
-clean-install clean-chroot build-updated-packages
65
+check-tools check-docker check-bison check-g++ check-gawk check-createrepo check-vagrant check-packer check-packer-ovf-plugin check-sanity \
66
+clean-install clean-chroot build-updated-packages check
56 67
 
57 68
 THREADS?=1
58 69
 
... ...
@@ -61,7 +72,7 @@ all: iso minimal-iso docker-image ostree-host-iso live-iso cloud-image-all src-i
61 61
 micro: micro-iso
62 62
 	@:
63 63
 
64
-micro-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MICRO)
64
+micro-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES_MICRO)
65 65
 	@echo "Building Photon Micro ISO..."
66 66
 	@cd $(PHOTON_INSTALLER_DIR) && \
67 67
         $(PHOTON_INSTALLER) \
... ...
@@ -75,7 +86,7 @@ micro-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MICRO)
75 75
                 -f > \
76 76
                 $(PHOTON_LOGS_DIR)/installer.log 2>&1
77 77
 
78
-packages-micro: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists
78
+packages-micro: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists
79 79
 	@echo "Building all Micro RPMS..."
80 80
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
81 81
         $(PHOTON_PACKAGE_BUILDER) -o full \
... ...
@@ -90,13 +101,13 @@ packages-micro: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) g
90 90
                 -d $(PHOTON_DIST_TAG) \
91 91
                 -n $(PHOTON_BUILD_NUMBER) \
92 92
                 -v $(PHOTON_RELEASE_VERSION) \
93
-                $(PHOTON_RPMCHECK_OPTION) \
93
+                $(PHOTON_RPMCHECK_FLAGS) \
94 94
                 -t ${THREADS}
95 95
 
96 96
 minimal: minimal-iso
97 97
 	@:
98 98
 
99
-minimal-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL)
99
+minimal-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL)
100 100
 	@echo "Building Photon Minimal ISO..."
101 101
 	@cd $(PHOTON_INSTALLER_DIR) && \
102 102
         $(PHOTON_INSTALLER) \
... ...
@@ -110,7 +121,7 @@ minimal-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL)
110 110
                 -f > \
111 111
                 $(PHOTON_LOGS_DIR)/installer.log 2>&1
112 112
 
113
-ostree-host-iso: check $(PHOTON_STAGE) ostree-repo
113
+ostree-host-iso: check-tools $(PHOTON_STAGE) ostree-repo
114 114
 	@echo "Building Photon OSTree Host ISO..."
115 115
 	@cd $(PHOTON_INSTALLER_DIR) && \
116 116
         $(PHOTON_INSTALLER) \
... ...
@@ -124,7 +135,7 @@ ostree-host-iso: check $(PHOTON_STAGE) ostree-repo
124 124
                 -f > \
125 125
                 $(PHOTON_LOGS_DIR)/installer.log 2>&1
126 126
 
127
-live-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL) minimal-iso
127
+live-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL) minimal-iso
128 128
 	@echo "Building Photon Minimal LIVE ISO..."
129 129
 	@cd $(PHOTON_INSTALLER_DIR) && \
130 130
         $(PHOTON_INSTALLER) \
... ...
@@ -138,7 +149,7 @@ live-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES_MINIMAL) minimal-iso
138 138
                 -f > \
139 139
                 $(PHOTON_LOGS_DIR)/installer.log 2>&1
140 140
 
141
-packages-minimal: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists
141
+packages-minimal: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) generate-dep-lists
142 142
 	@echo "Building all RPMS..."
143 143
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
144 144
         $(PHOTON_PACKAGE_BUILDER) -o full \
... ...
@@ -153,10 +164,10 @@ packages-minimal: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES)
153 153
                 -d $(PHOTON_DIST_TAG) \
154 154
                 -n $(PHOTON_BUILD_NUMBER) \
155 155
                 -v $(PHOTON_RELEASE_VERSION) \
156
-                $(PHOTON_RPMCHECK_OPTION) \
156
+                $(PHOTON_RPMCHECK_FLAGS) \
157 157
                 -t ${THREADS}
158 158
 
159
-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES) ostree-repo
159
+iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES) ostree-repo
160 160
 	@echo "Building Photon Full ISO..."
161 161
 	@cd $(PHOTON_INSTALLER_DIR) && \
162 162
         sudo $(PHOTON_INSTALLER) \
... ...
@@ -171,7 +182,7 @@ iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES) ostree-repo
171 171
                 -f > \
172 172
                 $(PHOTON_LOGS_DIR)/installer.log 2>&1
173 173
 
174
-custom-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES)
174
+custom-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES)
175 175
 	@echo "Building Photon custom ISO..."
176 176
 	@cd $(PHOTON_INSTALLER_DIR) && \
177 177
         sudo $(PHOTON_INSTALLER) \
... ...
@@ -186,7 +197,7 @@ custom-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES)
186 186
                 -f > \
187 187
                 $(PHOTON_LOGS_DIR)/installer.log 2>&1
188 188
 
189
-src-iso: check $(PHOTON_STAGE) $(PHOTON_PACKAGES)
189
+src-iso: check-tools $(PHOTON_STAGE) $(PHOTON_PACKAGES)
190 190
 	@echo "Building Photon Full Source ISO..."
191 191
 	@cd $(PHOTON_INSTALLER_DIR) && \
192 192
         sudo $(PHOTON_INSTALLER) \
... ...
@@ -215,7 +226,7 @@ who-needs:
215 215
 	@cd $(PHOTON_SPECDEPS_DIR) && \
216 216
 		$(PHOTON_SPECDEPS) -s $(PHOTON_SPECS_DIR) -i who-needs -p $(pkg) 
217 217
 
218
-packages: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
218
+packages: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
219 219
 	@echo "Building all RPMS..."
220 220
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
221 221
         $(PHOTON_PACKAGE_BUILDER) -o full \
... ...
@@ -233,10 +244,10 @@ packages: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTA
233 233
                 -v $(PHOTON_RELEASE_VERSION) \
234 234
                 -w $(PHOTON_DATA_DIR)/pkg_info.json \
235 235
                 -g $(PHOTON_DATA_DIR)/pkg_build_options.json \
236
-                $(PHOTON_RPMCHECK_OPTION) \
236
+                $(PHOTON_RPMCHECK_FLAGS) \
237 237
                 -t ${THREADS}
238 238
 
239
-updated-packages: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
239
+updated-packages: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
240 240
 	@echo "Building only updated RPMS..."
241 241
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
242 242
         $(PHOTON_PACKAGE_BUILDER) -o full \
... ...
@@ -252,10 +263,10 @@ updated-packages: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES)
252 252
                 -n $(PHOTON_BUILD_NUMBER) \
253 253
                 -v $(PHOTON_RELEASE_VERSION) \
254 254
                 -k $(PHOTON_INPUT_RPMS_DIR) \
255
-                $(PHOTON_RPMCHECK_OPTION) \
255
+                $(PHOTON_RPMCHECK_FLAGS) \
256 256
                 -t ${THREADS}
257 257
 
258
-tool-chain-stage1: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
258
+tool-chain-stage1: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
259 259
 	@echo "Building all RPMS..."
260 260
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
261 261
         $(PHOTON_PACKAGE_BUILDER) -o full \
... ...
@@ -272,10 +283,10 @@ tool-chain-stage1: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES
272 272
                 -d $(PHOTON_DIST_TAG) \
273 273
                 -n $(PHOTON_BUILD_NUMBER) \
274 274
                 -v $(PHOTON_RELEASE_VERSION) \
275
-                $(PHOTON_RPMCHECK_OPTION) \
275
+                $(PHOTON_RPMCHECK_FLAGS) \
276 276
                 -m stage1
277 277
 
278
-tool-chain-stage2: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
278
+tool-chain-stage2: check-tools $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN) generate-dep-lists
279 279
 	@echo "Building all RPMS..."
280 280
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
281 281
         $(PHOTON_PACKAGE_BUILDER) -o full \
... ...
@@ -292,7 +303,7 @@ tool-chain-stage2: check $(PHOTON_STAGE) $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES
292 292
                 -d $(PHOTON_DIST_TAG) \
293 293
                 -n $(PHOTON_BUILD_NUMBER) \
294 294
                 -v $(PHOTON_RELEASE_VERSION) \
295
-                $(PHOTON_RPMCHECK_OPTION) \
295
+                $(PHOTON_RPMCHECK_FLAGS) \
296 296
                 -m stage2
297 297
 
298 298
 
... ...
@@ -453,7 +464,7 @@ cloud-image-all: $(PHOTON_STAGE) iso
453 453
 	$(PHOTON_CLOUD_IMAGE_BUILDER) $(PHOTON_CLOUD_IMAGE_BUILDER_DIR) ova $(SRCROOT) $(PHOTON_GENERATED_DATA_DIR) $(PHOTON_STAGE)/photon-$(PHOTON_RELEASE_VERSION)-$(PHOTON_BUILD_NUMBER).iso $(ADDITIONAL_RPMS_PATH)
454 454
 
455 455
 
456
-check: check-bison check-g++ check-gawk check-createrepo check-texinfo check-sanity check-docker
456
+check-tools: check-bison check-g++ check-gawk check-createrepo check-texinfo check-sanity check-docker
457 457
 
458 458
 check-docker:
459 459
 	@command -v docker >/dev/null 2>&1 || { echo "Package docker not installed. Aborting." >&2; exit 1; }
... ...
@@ -491,7 +502,32 @@ endif
491 491
 check-packer-ovf-plugin:
492 492
 	@[[ -e ~/.packer.d/plugins/packer-post-processor-vagrant-vmware-ovf ]] || { echo "Packer OVF post processor not installed. Aborting" >&2; exit 1; }
493 493
 
494
-%: check $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN)
494
+check: packages
495
+    ifeq ($(RPMCHECK),enable_stop_on_error)
496
+	    $(eval rpmcheck_stop_on_error = -q)
497
+    endif
498
+	@echo "Testing all RPMS ..."
499
+	@cd $(PHOTON_PKG_BUILDER_DIR) && \
500
+        $(PHOTON_PACKAGE_BUILDER) -o full \
501
+                -s $(PHOTON_SPECS_DIR) \
502
+                -r $(PHOTON_RPMS_DIR) \
503
+                -a $(PHOTON_SRPMS_DIR) \
504
+                -x $(PHOTON_SRCS_DIR) \
505
+                -b $(PHOTON_CHROOT_PATH) \
506
+                -l $(PHOTON_LOGS_DIR) \
507
+                -p $(PHOTON_PUBLISH_RPMS_DIR) \
508
+                -j $(PHOTON_GENERATED_DATA_DIR)/$(FULL_PACKAGE_LIST_FILE) \
509
+                -c $(PHOTON_BINTRAY_CONFIG) \
510
+                -d $(PHOTON_DIST_TAG) \
511
+                -n $(PHOTON_BUILD_NUMBER) \
512
+                -v $(PHOTON_RELEASE_VERSION) \
513
+                -w $(PHOTON_DATA_DIR)/pkg_info.json \
514
+                -g $(PHOTON_DATA_DIR)/pkg_build_options.json \
515
+                -u \
516
+                $(rpmcheck_stop_on_error) \
517
+                -t ${THREADS}
518
+
519
+%: check-tools $(PHOTON_PUBLISH_RPMS) $(PHOTON_SOURCES) $(CONTAIN)
495 520
 	$(eval PKG_NAME = $@)
496 521
 	@echo "Building package $(PKG_NAME) ..."
497 522
 	@cd $(PHOTON_PKG_BUILDER_DIR) && \
... ...
@@ -507,7 +543,7 @@ check-packer-ovf-plugin:
507 507
                               -n $(PHOTON_BUILD_NUMBER) \
508 508
                               -v $(PHOTON_RELEASE_VERSION) \
509 509
                               -g $(PHOTON_DATA_DIR)/pkg_build_options.json \
510
-                              $(PHOTON_RPMCHECK_OPTION) \
510
+                              $(PHOTON_RPMCHECK_FLAGS) \
511 511
                               -l $(PHOTON_LOGS_DIR)
512 512
 
513 513
 $(TOOLS_BIN):
... ...
@@ -32,9 +32,6 @@ class PackageBuilder(object):
32 32
             if not returnVal:
33 33
                 raise Exception("Unable to prepare build root")
34 34
             tUtils=ToolChainUtils(self.logName,self.logPath)
35
-#            if isToolChainPackage:
36
-#                tUtils.installCoreToolChainPackages(chrootID)
37
-#            else:
38 35
             tUtils.installToolChain(chrootID)
39 36
         except Exception as e:
40 37
             if chrootID is not None:
... ...
@@ -87,9 +84,15 @@ class PackageBuilder(object):
87 87
 
88 88
     def buildPackage(self,package):
89 89
         #do not build if RPM is already built
90
+        #test only if the package is in the testForceRPMS with rpmCheck
91
+        #build only if the package is not in the testForceRPMS with rpmCheck
90 92
         if self.checkIfPackageIsAlreadyBuilt(package):
91
-            self.logger.info("Skipping building the package:"+package)
92
-            return
93
+            if not constants.rpmCheck:
94
+                self.logger.info("Skipping building the package:"+package)
95
+                return
96
+            elif constants.rpmCheck and package not in constants.testForceRPMS:
97
+                self.logger.info("Skipping testing the package:"+package)
98
+                return
93 99
 
94 100
         #should initialize a logger based on package name
95 101
         chrUtils = ChrootUtils(self.logName,self.logPath)
... ...
@@ -104,12 +107,13 @@ class PackageBuilder(object):
104 104
             if not os.path.isdir(destLogPath):
105 105
                 cmdUtils = CommandUtils()
106 106
                 cmdUtils.runCommandInShell("mkdir -p "+destLogPath)
107
-            
107
+
108 108
             listInstalledPackages=self.findInstalledPackages(chrootID)
109
-            self.logger.info("List of installed packages")
110
-            self.logger.info(listInstalledPackages)
111 109
             listDependentPackages=self.findBuildTimeRequiredPackages(package)
112
-            
110
+            if constants.rpmCheck and package in constants.testForceRPMS:
111
+                testPackages=set(constants.listMakeCheckRPMPkgtoInstall)-set(listInstalledPackages)-set([package])
112
+                listDependentPackages.extend(testPackages)
113
+
113 114
             pkgUtils = PackageUtils(self.logName,self.logPath)
114 115
             if len(listDependentPackages) != 0:
115 116
                 self.logger.info("Installing the build time dependent packages......")
... ...
@@ -117,6 +121,7 @@ class PackageBuilder(object):
117 117
                     self.installPackage(pkgUtils, pkg,chrootID,destLogPath,listInstalledPackages)
118 118
                 pkgUtils.installRPMSInAOneShot(chrootID,destLogPath)
119 119
                 self.logger.info("Finished installing the build time dependent packages......")
120
+
120 121
             pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath)
121 122
             pkgUtils.buildRPMSForGivenPackage(package,chrootID,self.listBuildOptionPackages,self.pkgBuildOptionFile,destLogPath)
122 123
             self.logger.info("Successfully built the package:"+package)
... ...
@@ -162,3 +167,4 @@ class PackageBuilder(object):
162 162
                 if pkg in listInstalledPackages:
163 163
                     continue
164 164
                 self.installPackage(pkgUtils,pkg,chrootID,destLogPath,listInstalledPackages)
165
+
... ...
@@ -86,16 +86,16 @@ class PackageManager(object):
86 86
                     needToRebuild = True
87 87
             if needToRebuild:
88 88
                 self.listOfPackagesAlreadyBuilt.remove(pkg)
89
- 
89
+
90 90
         listPackagesToBuild=listPackages[:]
91 91
         for pkg in listPackages:
92
-            if pkg in self.listOfPackagesAlreadyBuilt:
92
+            if pkg in self.listOfPackagesAlreadyBuilt and not constants.rpmCheck:
93 93
                 listPackagesToBuild.remove(pkg)
94
-        
94
+
95 95
         if not self.readPackageBuildData(listPackagesToBuild):
96 96
             return False
97 97
         return True
98
-    
98
+
99 99
     def buildToolChain(self):
100 100
         try:
101 101
             tUtils=ToolChainUtils()
... ...
@@ -104,17 +104,28 @@ class PackageManager(object):
104 104
             self.logger.error("Unable to build tool chain")
105 105
             self.logger.error(e)
106 106
             raise e
107
-    
107
+
108 108
     def buildToolChainPackages(self, listBuildOptionPackages, pkgBuildOptionFile, buildThreads):
109 109
         self.buildToolChain()
110 110
         self.buildGivenPackages(constants.listToolChainPackages, buildThreads)
111
-        
111
+
112
+    def buildTestPackages(self, listBuildOptionPackages, pkgBuildOptionFile, buildThreads):
113
+        self.buildToolChain()
114
+        self.buildGivenPackages(constants.listMakeCheckRPMPkgtoInstall, buildThreads)
115
+
112 116
     def buildPackages(self,listPackages, listBuildOptionPackages, pkgBuildOptionFile, buildThreads):
113 117
         self.listBuildOptionPackages = listBuildOptionPackages
114 118
         self.pkgBuildOptionFile = pkgBuildOptionFile
115
-        self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
116
-        self.buildGivenPackages(listPackages, buildThreads)
117
-    
119
+        if constants.rpmCheck:
120
+            constants.rpmCheck=False
121
+            self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
122
+            self.buildTestPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
123
+            constants.rpmCheck=True
124
+            self.buildGivenPackages(listPackages, buildThreads)
125
+        else:
126
+            self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
127
+            self.buildGivenPackages(listPackages, buildThreads)
128
+
118 129
     def initializeThreadPool(self,statusEvent):
119 130
         ThreadPool.clear()
120 131
         ThreadPool.mapPackageToCycle=self.mapPackageToCycle
... ...
@@ -123,46 +134,49 @@ class PackageManager(object):
123 123
         ThreadPool.pkgBuildOptionFile=self.pkgBuildOptionFile
124 124
         ThreadPool.logger=self.logger
125 125
         ThreadPool.statusEvent=statusEvent
126
-        
126
+
127 127
     def initializeScheduler(self,statusEvent):
128 128
         Scheduler.setLog(self.logName, self.logPath)
129 129
         Scheduler.setParams(self.sortedPackageList, self.listOfPackagesAlreadyBuilt)
130 130
         Scheduler.setEvent(statusEvent)
131 131
         Scheduler.stopScheduling=False
132
-    
132
+
133 133
     def buildGivenPackages (self, listPackages, buildThreads):
134
+        if constants.rpmCheck:
135
+            alreadyBuiltRPMS=self.readAlreadyAvailablePackages()
136
+            listPackages=list(set(listPackages)|(set(constants.listMakeCheckRPMPkgtoInstall)-set(alreadyBuiltRPMS)))
137
+
134 138
         returnVal=self.calculateParams(listPackages)
135 139
         if not returnVal:
136 140
             self.logger.error("Unable to set paramaters. Terminating the package manager.")
137 141
             raise Exception("Unable to set paramaters")
138
-        
142
+
139 143
         statusEvent=threading.Event()
140 144
         self.initializeScheduler(statusEvent)
141 145
         self.initializeThreadPool(statusEvent)
142
-        
146
+
143 147
         i=0
144 148
         while i < buildThreads:
145 149
             workerName="WorkerThread"+str(i)
146 150
             ThreadPool.addWorkerThread(workerName)
147 151
             ThreadPool.startWorkerThread(workerName)
148 152
             i = i + 1
149
-        
153
+
150 154
         statusEvent.wait()
151 155
         Scheduler.stopScheduling=True
152 156
         self.logger.info("Waiting for all remaining worker threads")
153 157
         listWorkerObjs=ThreadPool.getAllWorkerObjects()
154 158
         for w in listWorkerObjs:
155 159
             w.join()
156
-            
160
+
157 161
         setFailFlag=False
158 162
         allPackagesBuilt=False
159
-        
160 163
         if Scheduler.isAnyPackagesFailedToBuild():
161 164
             setFailFlag=True
162
-        
165
+
163 166
         if Scheduler.isAllPackagesBuilt():
164 167
             allPackagesBuilt=True
165
-        
168
+
166 169
         if setFailFlag:
167 170
             self.logger.error("Some of the packages failed:")
168 171
             self.logger.error(Scheduler.listOfFailedPackages)
... ...
@@ -174,6 +188,6 @@ class PackageManager(object):
174 174
             else:
175 175
                 self.logger.error("Build stopped unexpectedly.Unknown error.")
176 176
                 raise Exception("Unknown error")
177
-        
177
+
178 178
         self.logger.info("Terminated")
179 179
 
... ...
@@ -28,6 +28,7 @@ class PackageUtils(object):
28 28
         self.rpmbuildBinary = "rpmbuild"
29 29
         self.rpmbuildBuildallOption = "-ba --clean"
30 30
         self.rpmbuildNocheckOption = "--nocheck"
31
+        self.rpmbuildCheckOption ="-bi --clean"
31 32
         self.rpmbuildDistOption = '--define \\\"dist %s\\\"' % constants.dist
32 33
         self.queryRpmPackageOptions = "-qa"
33 34
         self.forceRpmPackageOptions = "--force"
... ...
@@ -68,7 +69,7 @@ class PackageUtils(object):
68 68
         rpmfile=self.findRPMFileForGivenPackage(package)
69 69
         if rpmfile is None:
70 70
             self.logger.error("No rpm file found for package:"+package)
71
-            raise Exception("Missing rpm file")
71
+            raise Exception("Missing rpm file: "+package)
72 72
 
73 73
         rpmDestFile = self.copyRPM(rpmfile, chrootID+constants.topDirPath+"/RPMS")
74 74
         rpmFile=rpmDestFile.replace(chrootID,"")
... ...
@@ -197,10 +198,16 @@ class PackageUtils(object):
197 197
             raise e
198 198
         finally:
199 199
             if destLogPath is not None:
200
-                shutil.copy2(chrootLogsFilePath, destLogPath)
200
+                if constants.rpmCheck and package in constants.testForceRPMS and constants.specData.isCheckAvailable(package):
201
+                    cmd="sed -i '/^Executing(%check):/,/^Processing files:/{//!b};d' "+ chrootLogsFilePath
202
+                    logFile = destLogPath+"/adjustTestFile.log"
203
+                    returnVal = CommandUtils().runCommandInShell(cmd, logFile)
204
+                    testLogFile = destLogPath+"/"+package+"-test.log"
205
+                    shutil.copyfile(chrootLogsFilePath, testLogFile)
206
+                else:
207
+                    shutil.copy2(chrootLogsFilePath, destLogPath)
201 208
         self.logger.info("RPM build is successful")
202
-        arch = self.getRPMArch(listRPMFiles[0])
203
-       
209
+
204 210
         for rpmFile in listRPMFiles:
205 211
             self.copyRPM(chrootID+"/"+rpmFile, constants.rpmPath)
206 212
         
... ...
@@ -208,14 +215,26 @@ class PackageUtils(object):
208 208
             self.copyRPM(chrootID+"/"+srpmFile, constants.sourceRpmPath)
209 209
             srpmName = os.path.basename(srpmFile)
210 210
             package,version,release = self.findPackageInfoFromSourceRPMFile(srpmFile)
211
+            arch = self.getRPMArch(listRPMFiles[0])
211 212
             SourcePackageInfo.addSRPMData(package,version,release,arch,srpmName)
212 213
 
213 214
     
214 215
     def buildRPM(self,specFile,logFile,chrootCmd,package,macros):
215 216
         
216
-        rpmBuildcmd= self.rpmbuildBinary+" "+self.rpmbuildBuildallOption+" "+self.rpmbuildDistOption
217
-        if not constants.rpmCheck:
218
-            rpmBuildcmd+=" "+self.rpmbuildNocheckOption
217
+        rpmBuildcmd=self.rpmbuildBinary+" "+self.rpmbuildBuildallOption+" "+self.rpmbuildDistOption
218
+
219
+        if constants.rpmCheck and package in constants.testForceRPMS:
220
+            self.logger.info("#"*(68+2*len(package)))
221
+            if not constants.specData.isCheckAvailable(package):
222
+                self.logger.info("####### "+package+" MakeCheck is not available. Skipping MakeCheck TEST for "+package+ " #######")
223
+                rpmBuildcmd=self.rpmbuildBinary+" --clean"
224
+            else:
225
+                self.logger.info("####### "+package+" MakeCheck is available. Running MakeCheck TEST for "+package+ " #######")
226
+                rpmBuildcmd=self.rpmbuildBinary+" "+self.rpmbuildCheckOption
227
+            self.logger.info("#"*(68+2*len(package)))
228
+        else:
229
+           rpmBuildcmd+=" "+self.rpmbuildNocheckOption
230
+
219 231
         for macro in macros:
220 232
             rpmBuildcmd+=' --define \\\"%s\\\"' % macro
221 233
         rpmBuildcmd+=" "+specFile
... ...
@@ -224,10 +243,23 @@ class PackageUtils(object):
224 224
         self.logger.info("Building rpm....")
225 225
         self.logger.info(rpmBuildcmd)
226 226
         returnVal = cmdUtils.runCommandInShell(rpmBuildcmd, logFile, chrootCmd)
227
-        if not returnVal:
228
-            self.logger.error("Building rpm is failed "+specFile)
229
-            raise Exception("RPM Build failed")
230
-        
227
+        if constants.rpmCheck and package in constants.testForceRPMS:
228
+            if not constants.specData.isCheckAvailable(package):
229
+                constants.testLogger.info(package+" : N/A")
230
+            elif returnVal:
231
+                constants.testLogger.info(package+" : PASS")
232
+            else:
233
+                constants.testLogger.error(package+" : FAIL" )
234
+
235
+        if constants.rpmCheck:
236
+            if not returnVal and constants.rpmCheckStopOnError:
237
+                self.logger.error("Checking rpm is failed "+specFile)
238
+                raise Exception("RPM check failed")
239
+        else:
240
+            if not returnVal:
241
+                self.logger.error("Building rpm is failed "+specFile)
242
+                raise Exception("RPM build failed")
243
+
231 244
         #Extracting rpms created from log file
232 245
         logfile=open(logFile,'r')
233 246
         fileContents=logfile.readlines()
... ...
@@ -29,7 +29,7 @@ class Scheduler(object):
29 29
         Scheduler.sortedList=sortedList
30 30
         Scheduler.listOfAlreadyBuiltPackages=listOfAlreadyBuiltPackages
31 31
         for x in Scheduler.sortedList:
32
-            if x not in Scheduler.listOfAlreadyBuiltPackages:
32
+            if x not in Scheduler.listOfAlreadyBuiltPackages or x in constants.testForceRPMS:
33 33
                 Scheduler.listOfPackagesToBuild.append(x)
34 34
         Scheduler.listOfPackagesCurrentlyBuilding=[]
35 35
         Scheduler.listOfPackagesNextToBuild=[]
... ...
@@ -42,6 +42,7 @@ class Scheduler(object):
42 42
         listRequiredRPMPackages.extend(constants.specData.getRequiresAllForPackage(package))
43 43
         
44 44
         listRequiredPackages=[]
45
+
45 46
         for pkg in listRequiredRPMPackages:
46 47
             basePkg=constants.specData.getSpecName(pkg)
47 48
             if basePkg not in listRequiredPackages:
... ...
@@ -46,6 +46,7 @@ class SerializableSpecObjectsUtils(object):
46 46
             specObj.checksums=spec.getChecksums()
47 47
             specObj.listPatches=spec.getPatchNames()
48 48
             specObj.securityHardening=spec.getSecurityHardeningOption()
49
+            specObj.isCheckAvailable=spec.isCheckAvailable()
49 50
             for specPkg in specObj.listPackages:
50 51
 	    	if specPkg in self.mapPackageToSpec:
51 52
 		    existingObj = self.mapSerializableSpecObjects[self.mapPackageToSpec[specPkg]]
... ...
@@ -163,18 +164,22 @@ class SerializableSpecObjectsUtils(object):
163 163
                 return specName
164 164
         self.logger.error("Could not able to find "+package+" package from specs")
165 165
         raise Exception("Invalid package:"+package)
166
-    
166
+
167 167
     def isRPMPackage(self,package):
168 168
         if self.mapPackageToSpec.has_key(package):
169 169
             specName=self.mapPackageToSpec[package]
170 170
             if self.mapSerializableSpecObjects.has_key(specName):
171 171
                 return True
172 172
         return False
173
-    
173
+
174 174
     def getSecurityHardeningOption(self, package):
175 175
         specName=self.getSpecName(package)
176 176
         return self.mapSerializableSpecObjects[specName].securityHardening
177 177
 
178
+    def isCheckAvailable(self, package):
179
+        specName=self.getSpecName(package)
180
+        return self.mapSerializableSpecObjects[specName].isCheckAvailable
181
+
178 182
     def printAllObjects(self):
179 183
         listSpecs=self.mapSerializableSpecObjects.keys()
180 184
         for spec in listSpecs:
... ...
@@ -210,6 +210,12 @@ class Specutils(object):
210 210
     def getSecurityHardeningOption(self):
211 211
         return self.spec.globalSecurityHardening
212 212
 
213
+    def isCheckAvailable(self):
214
+        check=False
215
+        if self.spec.checkMacro is not None:
216
+            check=True
217
+        return check
218
+
213 219
 def main():
214 220
     spec = Specutils("/workspace1/myrepos/photon/SPECS/docker/docker.spec")
215 221
     print "packages",spec.getPackageNames()
... ...
@@ -38,6 +38,7 @@ def main():
38 38
     parser.add_option("-a",  "--source-rpm-path",  dest="sourceRpmPath",  default="../../stage/SRPMS")
39 39
     parser.add_option("-w",  "--pkginfo-file",  dest="pkgInfoFile",  default="../../common/data/pkg_info.json")
40 40
     parser.add_option("-g",  "--pkg-build-option-file",  dest="pkgBuildOptionFile",  default="../../common/data/pkg_build_options.json")
41
+    parser.add_option("-q",  "--rpmcheck-stop-on-error", dest="rpmCheckStopOnError",  default=False, action ="store_true")
41 42
 
42 43
     (options,  args) = parser.parse_args()
43 44
     cmdUtils=CommandUtils()
... ...
@@ -103,6 +104,7 @@ def main():
103 103
     logger.info("Log Path :" + options.logPath)
104 104
     logger.info("Top Dir Path :" + options.topDirPath)
105 105
     logger.info("Publish RPMS Path :" + options.publishRPMSPath)
106
+
106 107
     if not options.installPackage:
107 108
         logger.info("JSON File :" + options.inputJSONFile)
108 109
     else:
... ...
@@ -281,6 +283,8 @@ def buildAPackage(package, listBuildOptionPackages, pkgBuildOptionFile, buildThr
281 281
     listPackages=[]
282 282
     listPackages.append(package)
283 283
     pkgManager = PackageManager()
284
+    if constants.rpmCheck:
285
+        constants.setTestForceRPMS(listPackages[:])
284 286
     pkgManager.buildPackages(listPackages, listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
285 287
 
286 288
 def buildPackagesFromGivenJSONFile(inputJSONFile, buildOption, listBuildOptionPackages, pkgBuildOptionFile, logger, buildThreads):
... ...
@@ -292,6 +296,8 @@ def buildPackagesFromGivenJSONFile(inputJSONFile, buildOption, listBuildOptionPa
292 292
         listPackagesToBuild.append(str(p))
293 293
     logger.info("List of packages to build:")
294 294
     logger.info(listPackagesToBuild)
295
+    if constants.rpmCheck:
296
+        constants.setTestForceRPMS(listPackagesToBuild[:])
295 297
     pkgManager = PackageManager()
296 298
     pkgManager.buildPackages(listPackagesToBuild, listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
297 299
 
... ...
@@ -1,4 +1,5 @@
1 1
 from SpecData import SerializableSpecObjectsUtils
2
+from Logger import Logger
2 3
 
3 4
 class constants(object):
4 5
     specPath=""
... ...
@@ -251,6 +252,44 @@ class constants(object):
251 251
         "man-pages",
252 252
         "cpio"]
253 253
 
254
+    listMakeCheckRPMPkgtoInstall=[
255
+        "python2",
256
+        "python2-devel",
257
+        "python2-libs",
258
+        "python2-tools",
259
+        "libffi",
260
+        "python-setuptools",
261
+        "ca-certificates",
262
+        "linux",
263
+        "createrepo",
264
+        "sudo",
265
+        "ruby",
266
+        "curl",
267
+        "pcre-devel",
268
+        "boost-devel",
269
+        "which",
270
+        "go",
271
+        "e2fsprogs-devel",
272
+        "shadow",
273
+        "check",
274
+        "libacl-devel",
275
+        "device-mapper",
276
+        "wget",
277
+        "tar",
278
+        "pkg-config",
279
+        "git",
280
+        "openssl",
281
+        "net-tools",
282
+        "less",
283
+        "yum-metadata-parser",
284
+        "yum",
285
+        "rpm-devel",
286
+        "rpm",
287
+        "libxml2",
288
+        "python-xml",
289
+        "libacl",
290
+        "tzdata",
291
+        "Linux-PAM"]
254 292
 
255 293
     @staticmethod
256 294
     def initialize(options):
... ...
@@ -269,9 +308,13 @@ class constants(object):
269 269
         constants.specData.readSpecsAndConvertToSerializableObjects(constants.specPath)
270 270
         constants.pullsourcesConfig = options.pullsourcesConfig
271 271
         constants.inputRPMSPath=options.inputRPMSPath
272
-        constants.rpmCheck = options.rpmCheck
273 272
         constants.updateRPMMacros()
274
-        
273
+        constants.testForceRPMS=[]
274
+        constants.rpmCheck = options.rpmCheck
275
+        constants.rpmCheckStopOnError = options.rpmCheckStopOnError
276
+        if constants.rpmCheck:
277
+            constants.testLogger=Logger.getLogger("MakeCheckTest",constants.logPath)
278
+
275 279
     @staticmethod
276 280
     def updateRPMMacros():
277 281
         #adding distribution rpm macro
... ...
@@ -299,4 +342,8 @@ class constants(object):
299 299
         kernelsubrelease = kernelsubrelease.replace(constants.dist,"")
300 300
         if kernelsubrelease:
301 301
             kernelsubrelease = "."+kernelsubrelease
302
-            constants.specData.addMacro("kernelsubrelease",kernelsubrelease) 
302
+            constants.specData.addMacro("kernelsubrelease",kernelsubrelease)
303
+
304
+    @staticmethod
305
+    def setTestForceRPMS(listsPackages):
306
+         constants.testForceRPMS=listsPackages