Browse code

Build script: build openssl with FIPS mode on (bug 2038839)

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

xiaolin-vmware authored on 2018/01/30 08:39:57
Showing 8 changed files
... ...
@@ -11,7 +11,7 @@ import docker
11 11
 
12 12
 class PackageBuilderBase(object):
13 13
     def __init__(self, mapPackageToCycles, listAvailableCyclicPackages,
14
-                 listBuildOptionPackages, pkgBuildOptionFile, pkgBuildType):
14
+                 pkgBuildType):
15 15
         # will be initialized in buildPackageFunction()
16 16
         self.logName = None
17 17
         self.logPath = None
... ...
@@ -22,8 +22,6 @@ class PackageBuilderBase(object):
22 22
         self.listNodepsPackages = ["glibc", "gmp", "zlib", "file", "binutils", "mpfr",
23 23
                                    "mpc", "gcc", "ncurses", "util-linux", "groff", "perl",
24 24
                                    "texinfo", "rpm", "openssl", "go"]
25
-        self.listBuildOptionPackages = listBuildOptionPackages
26
-        self.pkgBuildOptionFile = pkgBuildOptionFile
27 25
         self.pkgBuildType = pkgBuildType
28 26
 
29 27
     def buildPackagePrepareFunction(self, package, outputMap, threadName):
... ...
@@ -122,13 +120,13 @@ class PackageBuilderBase(object):
122 122
                                     listInstalledPackages, listInstalledRPMs)
123 123
 
124 124
 class PackageBuilderContainer(object):
125
-    def __init__(self, mapPackageToCycles, listAvailableCyclicPackages, listBuildOptionPackages,
126
-                 pkgBuildOptionFile, pkgBuildType):
125
+    def __init__(self, mapPackageToCycles, listAvailableCyclicPackages,
126
+                 pkgBuildType):
127 127
         self.buildContainerImage = "photon_build_container:latest"
128 128
         self.dockerClient = docker.from_env(version="auto")
129 129
 
130 130
         self.base = PackageBuilderBase(mapPackageToCycles, listAvailableCyclicPackages,
131
-                                       listBuildOptionPackages, pkgBuildOptionFile, pkgBuildType)
131
+                                       pkgBuildType)
132 132
 
133 133
     def buildPackageFunction(self, package, outputMap, threadName):
134 134
         self.base.buildPackagePrepareFunction(package, outputMap, threadName)
... ...
@@ -269,8 +267,6 @@ class PackageBuilderContainer(object):
269 269
             pkgUtils.buildRPMSForGivenPackageInContainer(
270 270
                 self.base.package,
271 271
                 containerID,
272
-                self.base.listBuildOptionPackages,
273
-                self.base.pkgBuildOptionFile,
274 272
                 destLogPath)
275 273
             self.base.logger.info("BuildContainer-buildPackage: Successfully built the package: " +
276 274
                                   self.base.package)
... ...
@@ -293,10 +289,10 @@ class PackageBuilderContainer(object):
293 293
             chrUtils.destroyChroot(chrootID)
294 294
 
295 295
 class PackageBuilderChroot(object):
296
-    def __init__(self, mapPackageToCycles, listAvailableCyclicPackages, listBuildOptionPackages,
297
-                 pkgBuildOptionFile, pkgBuildType):
296
+    def __init__(self, mapPackageToCycles, listAvailableCyclicPackages,
297
+                 pkgBuildType):
298 298
         self.base = PackageBuilderBase(mapPackageToCycles, listAvailableCyclicPackages,
299
-                                       listBuildOptionPackages, pkgBuildOptionFile, pkgBuildType)
299
+                                       pkgBuildType)
300 300
 
301 301
     def buildPackageFunction(self, package, outputMap, threadName):
302 302
         self.base.buildPackagePrepareFunction(package, outputMap, threadName)
... ...
@@ -364,8 +360,6 @@ class PackageBuilderChroot(object):
364 364
 
365 365
             pkgUtils.adjustGCCSpecs(self.base.package, chrootID, self.base.logPath)
366 366
             pkgUtils.buildRPMSForGivenPackage(self.base.package, chrootID,
367
-                                              self.base.listBuildOptionPackages,
368
-                                              self.base.pkgBuildOptionFile,
369 367
                                               self.base.logPath)
370 368
             self.base.logger.info("Successfully built the package:" + self.base.package)
371 369
         except Exception as e:
... ...
@@ -30,8 +30,6 @@ class PackageManager(object):
30 30
         self.mapOutputThread = {}
31 31
         self.mapThreadsLaunchTime = {}
32 32
         self.listAvailableCyclicPackages = []
33
-        self.listBuildOptionPackages = []
34
-        self.pkgBuildOptionFile = ""
35 33
         self.pkgBuildType = pkgBuildType
36 34
         if self.pkgBuildType == "container":
37 35
             self.dockerClient = docker.from_env(version="auto")
... ...
@@ -130,15 +128,14 @@ class PackageManager(object):
130 130
         pkgCount = 0
131 131
         try:
132 132
             tUtils = ToolChainUtils()
133
-            pkgCount = tUtils.buildCoreToolChainPackages(self.listBuildOptionPackages,
134
-                                                         self.pkgBuildOptionFile)
133
+            pkgCount = tUtils.buildCoreToolChainPackages()
135 134
         except Exception as e:
136 135
             self.logger.error("Unable to build tool chain")
137 136
             self.logger.error(e)
138 137
             raise e
139 138
         return pkgCount
140 139
 
141
-    def buildToolChainPackages(self, listBuildOptionPackages, pkgBuildOptionFile, buildThreads):
140
+    def buildToolChainPackages(self, buildThreads):
142 141
         pkgCount = self.buildToolChain()
143 142
         if self.pkgBuildType == "container":
144 143
             # Stage 1 build container
... ...
@@ -151,31 +148,26 @@ class PackageManager(object):
151 151
             #TODO: rebuild container only if anything in listToolChainPackages was built
152 152
             self.createBuildContainer()
153 153
 
154
-    def buildTestPackages(self, listBuildOptionPackages, pkgBuildOptionFile, buildThreads):
154
+    def buildTestPackages(self, buildThreads):
155 155
         self.buildToolChain()
156 156
         self.buildGivenPackages(constants.listMakeCheckRPMPkgtoInstall, buildThreads)
157 157
 
158
-    def buildPackages(self, listPackages, listBuildOptionPackages, pkgBuildOptionFile,
159
-                      buildThreads, pkgBuildType):
160
-        self.listBuildOptionPackages = listBuildOptionPackages
161
-        self.pkgBuildOptionFile = pkgBuildOptionFile
158
+    def buildPackages(self, listPackages, buildThreads, pkgBuildType):
162 159
         self.pkgBuildType = pkgBuildType
163 160
         if constants.rpmCheck:
164 161
             constants.rpmCheck = False
165
-            self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
166
-            self.buildTestPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
162
+            self.buildToolChainPackages(buildThreads)
163
+            self.buildTestPackages(buildThreads)
167 164
             constants.rpmCheck = True
168 165
             self.buildGivenPackages(listPackages, buildThreads)
169 166
         else:
170
-            self.buildToolChainPackages(listBuildOptionPackages, pkgBuildOptionFile, buildThreads)
167
+            self.buildToolChainPackages(buildThreads)
171 168
             self.buildGivenPackages(listPackages, buildThreads)
172 169
 
173 170
     def initializeThreadPool(self, statusEvent):
174 171
         ThreadPool.clear()
175 172
         ThreadPool.mapPackageToCycle = self.mapPackageToCycle
176 173
         ThreadPool.listAvailableCyclicPackages = self.listAvailableCyclicPackages
177
-        ThreadPool.listBuildOptionPackages = self.listBuildOptionPackages
178
-        ThreadPool.pkgBuildOptionFile = self.pkgBuildOptionFile
179 174
         ThreadPool.logger = self.logger
180 175
         ThreadPool.statusEvent = statusEvent
181 176
         ThreadPool.pkgBuildType = self.pkgBuildType
... ...
@@ -156,34 +156,29 @@ class PackageUtils(object):
156 156
     def copyAdditionalBuildFiles(self, listAdditionalFiles, chrootID):
157 157
         cmdUtils = CommandUtils()
158 158
         for additionalFile in listAdditionalFiles:
159
-            source = additionalFile["src"].encode('utf-8')
160
-            destDir = chrootID + additionalFile["dst"].encode('utf-8')
159
+            source = additionalFile["src"]
160
+            destDir = chrootID + additionalFile["dst"]
161
+            self.logger.info("Copying additional Source build files :" + source)
161 162
             if os.path.exists(source):
162 163
                 if os.path.isfile(source):
163 164
                     shutil.copy(source, destDir)
164 165
                 else:
165 166
                     shutil.copytree(source, destDir)
166 167
 
167
-    def getAdditionalBuildFiles(self, package, pkgBuildOptionFile):
168
+    def getAdditionalBuildFiles(self, package):
168 169
         listAdditionalFiles = []
169 170
         macros = []
170
-        jsonData = open(pkgBuildOptionFile)
171
-        pkg_build_option_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
172
-        jsonData.close()
173
-        pkgs_sorted = pkg_build_option_json.items()
174
-        for pkg in pkgs_sorted:
175
-            p = str(pkg[0].encode('utf-8'))
176
-            if p == package:
177
-                filelist = pkg[1]["files"]
178
-                for f in filelist:
179
-                    listAdditionalFiles.append(f)
180
-                macrolist = pkg[1]["macros"]
181
-                for macro in macrolist:
182
-                    macros.append(str(macro.encode('utf-8')))
171
+        if package in constants.buildOptions.keys():
172
+            pkg = constants.buildOptions[package]
173
+            filelist = pkg["files"]
174
+            for f in filelist:
175
+                listAdditionalFiles.append(f)
176
+            macrolist = pkg["macros"]
177
+            for macro in macrolist:
178
+                macros.append(macro)
183 179
         return listAdditionalFiles, macros
184 180
 
185
-    def buildRPMSForGivenPackage(self, package, chrootID, listBuildOptionPackages,
186
-                                 pkgBuildOptionFile, destLogPath=None):
181
+    def buildRPMSForGivenPackage(self, package, chrootID, destLogPath=None):
187 182
         self.logger.info("Building rpm's for package:" + package)
188 183
 
189 184
         listSourcesFiles = SPECS.getData().getSources(package)
... ...
@@ -201,11 +196,10 @@ class PackageUtils(object):
201 201
         #        if os.geteuid()==0:
202 202
         self.copySourcesTobuildroot(listSourcesFiles, package, chrootSourcePath)
203 203
         self.copySourcesTobuildroot(listPatchFiles, package, chrootSourcePath)
204
-
205 204
         macros = []
206
-        if package in listBuildOptionPackages:
207
-            listAdditionalFiles, macros = self.getAdditionalBuildFiles(package, pkgBuildOptionFile)
208
-            self.copyAdditionalBuildFiles(listAdditionalFiles, chrootID)
205
+
206
+        listAdditionalFiles, macros = self.getAdditionalBuildFiles(package)
207
+        self.copyAdditionalBuildFiles(listAdditionalFiles, chrootID)
209 208
 
210 209
         #Adding rpm macros
211 210
         listRPMMacros = constants.userDefinedMacros
... ...
@@ -411,18 +405,18 @@ class PackageUtils(object):
411 411
         #                  containerID.short_id)
412 412
         #self.logger.debug(listAdditionalFiles)
413 413
         for additionalFile in listAdditionalFiles:
414
-            source = additionalFile["src"].encode('utf-8')
415
-            destDir = additionalFile["dst"].encode('utf-8')
414
+            source = additionalFile["src"]
415
+            destDir = additionalFile["dst"]
416 416
             destPath = containerID.short_id + ":" + destDir
417 417
             #TODO: exit status of exec_run
418 418
             containerID.exec_run("mkdir -p " + destDir)
419 419
             if os.path.exists(source):
420 420
                 copyCmd = "docker cp " + source
421 421
                 if os.path.isfile(source):
422
-                    self.logger.info("Copying addl source file: " + source)
422
+                    self.logger.info("Copying additional source file: " + source)
423 423
                     copyCmd += " " + destPath
424 424
                 else:
425
-                    self.logger.info("Copying addl source file tree: " + source)
425
+                    self.logger.info("Copying additional source file tree: " + source)
426 426
                     copyCmd += "/. " + destPath
427 427
                 #TODO: cmd error code
428 428
                 cmdUtils.runCommandInShell(copyCmd)
... ...
@@ -555,8 +549,7 @@ class PackageUtils(object):
555 555
         self.logger.error("Failed while adjusting gcc specs")
556 556
         raise Exception("Failed while adjusting gcc specs")
557 557
 
558
-    def buildRPMSForGivenPackageInContainer(self, package, containerID, listBuildOptionPackages,
559
-                                            pkgBuildOptionFile, destLogPath=None):
558
+    def buildRPMSForGivenPackageInContainer(self, package, containerID, destLogPath=None):
560 559
         self.logger.info("Building rpm's for package " + package + " in container " +
561 560
                          containerID.short_id)
562 561
 
... ...
@@ -585,9 +578,8 @@ class PackageUtils(object):
585 585
         self.copySourcesToContainer(listSourcesFiles, package, containerID, sourcePath)
586 586
         #TODO: mount it in, don't copy
587 587
         self.copySourcesToContainer(listPatchFiles, package, containerID, sourcePath)
588
-        if package in listBuildOptionPackages:
589
-            listAdditionalFiles, macros = self.getAdditionalBuildFiles(package, pkgBuildOptionFile)
590
-            self.copyAdditionalBuildFilesToContainer(listAdditionalFiles, containerID)
588
+        listAdditionalFiles, macros = self.getAdditionalBuildFiles(package)
589
+        self.copyAdditionalBuildFilesToContainer(listAdditionalFiles, containerID)
591 590
 
592 591
         # Add rpm macros
593 592
         listRPMMacros = constants.userDefinedMacros
... ...
@@ -7,8 +7,6 @@ class ThreadPool(object):
7 7
     inactiveWorkerThreads = []
8 8
     mapPackageToCycle = {}
9 9
     listAvailableCyclicPackages = []
10
-    listBuildOptionPackages = []
11
-    pkgBuildOptionFile = ""
12 10
     pkgBuildType = "chroot"
13 11
     logger = None
14 12
     statusEvent = None
... ...
@@ -36,8 +34,6 @@ class ThreadPool(object):
36 36
             ThreadPool.mapPackageToCycle,
37 37
             ThreadPool.listAvailableCyclicPackages,
38 38
             ThreadPool.logger,
39
-            ThreadPool.listBuildOptionPackages,
40
-            ThreadPool.pkgBuildOptionFile,
41 39
             ThreadPool.pkgBuildType)
42 40
         ThreadPool.mapWorkerThreads[workerThreadName] = workerThread
43 41
 
... ...
@@ -74,7 +74,7 @@ class ToolChainUtils(object):
74 74
                               "Unable to determine the rpm file for package:" + package)
75 75
             return None
76 76
 
77
-    def buildCoreToolChainPackages(self, listBuildOptionPackages, pkgBuildOptionFile):
77
+    def buildCoreToolChainPackages(self):
78 78
         self.logger.info("Building core toolchain packages.....")
79 79
         chrootID = None
80 80
         pkgCount = 0
... ...
@@ -97,8 +97,7 @@ class ToolChainUtils(object):
97 97
                     raise Exception("creating chroot failed")
98 98
                 self.installToolChainRPMS(chrootID, package, destLogPath)
99 99
                 pkgUtils.adjustGCCSpecs(package, chrootID, destLogPath)
100
-                pkgUtils.buildRPMSForGivenPackage(package, chrootID, listBuildOptionPackages,
101
-                                                  pkgBuildOptionFile, destLogPath)
100
+                pkgUtils.buildRPMSForGivenPackage(package, chrootID, destLogPath)
102 101
                 pkgCount += 1
103 102
                 chrUtils.destroyChroot(chrootID)
104 103
                 chrootID = None
... ...
@@ -7,15 +7,13 @@ import ThreadPool
7 7
 class WorkerThread(threading.Thread):
8 8
 
9 9
     def __init__(self, event, name, mapPackageToCycle, listAvailableCyclicPackages, logger,
10
-                 listBuildOptionPackages, pkgBuildOptionFile, pkgBuildType):
10
+                 pkgBuildType):
11 11
         threading.Thread.__init__(self)
12 12
         self.statusEvent = event
13 13
         self.name = name
14 14
         self.mapPackageToCycle = mapPackageToCycle
15 15
         self.listAvailableCyclicPackages = listAvailableCyclicPackages
16 16
         self.logger = logger
17
-        self.listBuildOptionPackages = listBuildOptionPackages
18
-        self.pkgBuildOptionFile = pkgBuildOptionFile
19 17
         self.pkgBuildType = pkgBuildType
20 18
 
21 19
     def run(self):
... ...
@@ -31,14 +29,10 @@ class WorkerThread(threading.Thread):
31 31
             if self.pkgBuildType == "chroot":
32 32
                 pkgBuilder = PackageBuilderChroot(self.mapPackageToCycle,
33 33
                                                   self.listAvailableCyclicPackages,
34
-                                                  self.listBuildOptionPackages,
35
-                                                  self.pkgBuildOptionFile,
36 34
                                                   self.pkgBuildType)
37 35
             elif self.pkgBuildType == "container":
38 36
                 pkgBuilder = PackageBuilderContainer(self.mapPackageToCycle,
39 37
                                                      self.listAvailableCyclicPackages,
40
-                                                     self.listBuildOptionPackages,
41
-                                                     self.pkgBuildOptionFile,
42 38
                                                      self.pkgBuildType)
43 39
             pkgBuilder.buildPackageFunction(pkg, outputMap, pkg)
44 40
             if pkg not in outputMap or outputMap[pkg] == False:
... ...
@@ -123,7 +123,7 @@ def main():
123 123
         cmdUtils.runCommandInShell("mkdir -p "+options.sourceRpmPath)
124 124
 
125 125
     if not os.path.isdir(options.buildRootPath):
126
-        cmdUtils.runCommandInShell("mkdir -p "+options.buildRootPath)
126
+        cmdUtils.runCommandInShell("mkdir -p " + options.buildRootPath)
127 127
 
128 128
     logger.info("Source Path :"+options.sourcePath)
129 129
     logger.info("Spec Path :" + options.specPath)
... ...
@@ -134,9 +134,9 @@ def main():
134 134
     logger.info("Publish X RPMS Path :" + options.publishXRPMSPath)
135 135
 
136 136
     if options.installPackage:
137
-        logger.info("Package to build:"+package)
137
+        logger.info("Package to build:" + package)
138 138
 
139
-    listBuildOptionPackages = get_packages_with_build_options(options.pkgBuildOptionFile)
139
+    get_packages_with_build_options(options.pkgBuildOptionFile)
140 140
 
141 141
     try:
142 142
 
... ...
@@ -170,11 +170,9 @@ def main():
170 170
             pkgManager = PackageManager()
171 171
             pkgManager.buildToolChainPackages(options.buildThreads)
172 172
         elif options.installPackage:
173
-            buildAPackage(package, listBuildOptionPackages, options.pkgBuildOptionFile,
174
-                          options.buildThreads, options.pkgBuildType)
173
+            buildAPackage(package, options.buildThreads, options.pkgBuildType)
175 174
         else:
176
-            buildPackagesForAllSpecs(listBuildOptionPackages, options.pkgBuildOptionFile,
177
-                                     logger, options.buildThreads, pkgInfoJsonFile,
175
+            buildPackagesForAllSpecs(logger, options.buildThreads, pkgInfoJsonFile,
178 176
                                      options.pkgBuildType)
179 177
     except Exception as e:
180 178
         logger.error("Caught an exception")
... ...
@@ -185,18 +183,15 @@ def main():
185 185
     sys.exit(0)
186 186
 
187 187
 
188
-def buildAPackage(package, listBuildOptionPackages, pkgBuildOptionFile,
189
-                  buildThreads, pkgBuildType):
188
+def buildAPackage(package, buildThreads, pkgBuildType):
190 189
     listPackages = [package]
191 190
     pkgManager = PackageManager(pkgBuildType=pkgBuildType)
192 191
     if constants.rpmCheck:
193 192
         constants.setTestForceRPMS(listPackages[:])
194
-    pkgManager.buildPackages(listPackages, listBuildOptionPackages, pkgBuildOptionFile,
195
-                             buildThreads, pkgBuildType)
193
+    pkgManager.buildPackages(listPackages, buildThreads, pkgBuildType)
196 194
 
197 195
 
198
-def buildPackagesForAllSpecs(listBuildOptionPackages, pkgBuildOptionFile, logger,
199
-                             buildThreads, pkgInfoJsonFile, pkgBuildType):
196
+def buildPackagesForAllSpecs(logger, buildThreads, pkgInfoJsonFile, pkgBuildType):
200 197
     listPackages = SPECS.getData().getListPackages()
201 198
 
202 199
     logger.info("List of packages to build:")
... ...
@@ -204,29 +199,20 @@ def buildPackagesForAllSpecs(listBuildOptionPackages, pkgBuildOptionFile, logger
204 204
     if constants.rpmCheck:
205 205
         constants.setTestForceRPMS(listPackages[:])
206 206
     pkgManager = PackageManager(pkgBuildType=pkgBuildType)
207
-    pkgManager.buildPackages(listPackages, listBuildOptionPackages, pkgBuildOptionFile,
208
-                             buildThreads, pkgBuildType)
207
+    pkgManager.buildPackages(listPackages, buildThreads, pkgBuildType)
209 208
 
210 209
     # Generating package info file which is required by installer
211
-    logger.info("Writing Package info to the file:"+pkgInfoJsonFile)
210
+    logger.info("Writing Package info to the file:" + pkgInfoJsonFile)
212 211
     pkgInfo = PackageInfo()
213 212
     pkgInfo.loadPackagesData()
214 213
     pkgInfo.writePkgListToFile(pkgInfoJsonFile)
215 214
 
216 215
 
217 216
 def get_packages_with_build_options(pkg_build_options_file):
218
-    packages = []
219 217
     if os.path.exists(pkg_build_options_file):
220
-        jsonData = open(pkg_build_options_file)
221
-        pkg_build_option_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
222
-        jsonData.close()
223
-        pkgs_sorted = pkg_build_option_json.items()
224
-        for pkg in pkgs_sorted:
225
-            p = pkg[0].encode('utf-8')
226
-            packages.append(str(p))
227
-
228
-    return packages
229
-
218
+        with open(pkg_build_options_file) as jsonData:
219
+            pkg_build_option_json = json.load(jsonData, object_pairs_hook=collections.OrderedDict)
220
+            constants.setBuidOptions(pkg_build_option_json)
230 221
 
231 222
 def get_all_package_names(build_install_option):
232 223
     base_path = os.path.dirname(build_install_option)
... ...
@@ -24,6 +24,7 @@ class constants(object):
24 24
     katBuild = None
25 25
     testForceRPMS = []
26 26
     tmpDirPath = "/dev/shm"
27
+    buildOptions = {}
27 28
 
28 29
     noDepsPackageList = [
29 30
         "texinfo",
... ...
@@ -532,3 +533,7 @@ class constants(object):
532 532
     @staticmethod
533 533
     def addMacro(macroName, macroValue):
534 534
         constants.userDefinedMacros[macroName] = macroValue
535
+
536
+    @staticmethod
537
+    def setBuidOptions(options):
538
+        constants.buildOptions = options