Gentoo Archives: gentoo-catalyst

From: Brian Dolbec <dolsen@g.o>
To: gentoo-catalyst@l.g.o
Subject: [gentoo-catalyst] [PATCH 2/3] [2 of 3] Update module loading for the new python structure
Date: Thu, 11 Sep 2014 03:50:59
Message-Id: 1410407450-2888-3-git-send-email-dolsen@gentoo.org
In Reply to: [gentoo-catalyst] [PATCH 0/3] Code breakup & restructuring by Brian Dolbec
1 Rename snapshot_target to snapshot
2 ---
3 catalyst/main.py | 75 +++++++++---------------
4 catalyst/targets/embedded_target.py | 4 --
5 catalyst/targets/grp_target.py | 4 --
6 catalyst/targets/livecd_stage1_target.py | 4 --
7 catalyst/targets/livecd_stage2_target.py | 4 --
8 catalyst/targets/netboot2_target.py | 4 --
9 catalyst/targets/netboot_target.py | 4 --
10 catalyst/targets/snapshot.py | 93 ++++++++++++++++++++++++++++++
11 catalyst/targets/snapshot_target.py | 97 --------------------------------
12 catalyst/targets/stage1_target.py | 4 --
13 catalyst/targets/stage2_target.py | 4 --
14 catalyst/targets/stage3_target.py | 4 --
15 catalyst/targets/stage4_target.py | 5 --
16 catalyst/targets/tinderbox_target.py | 4 --
17 14 files changed, 119 insertions(+), 191 deletions(-)
18 create mode 100644 catalyst/targets/snapshot.py
19 delete mode 100644 catalyst/targets/snapshot_target.py
20
21 diff --git a/catalyst/main.py b/catalyst/main.py
22 index 15664de..1446cf9 100644
23 --- a/catalyst/main.py
24 +++ b/catalyst/main.py
25 @@ -16,21 +16,20 @@ import os.path
26
27 __selfpath__ = os.path.abspath(os.path.dirname(__file__))
28
29 -sys.path.append(__selfpath__ + "/modules")
30
31 from . import __version__
32 import catalyst.config
33 import catalyst.util
34 +from catalyst.contents import ContentsMap, CONTENTS_DEFINITIONS
35 +from catalyst.defaults import confdefaults, option_messages
36 +from catalyst.hash_utils import HashMap, HASH_DEFINITIONS
37 from catalyst.lock import LockInUse
38 from catalyst.support import CatalystError, find_binary
39 -from catalyst.defaults import (confdefaults, option_messages,
40 - required_build_targets, valid_build_targets)
41 -from hash_utils import HashMap, HASH_DEFINITIONS
42 -from contents import ContentsMap, CONTENTS_DEFINITIONS
43
44
45 conf_values={}
46
47 +
48 def usage():
49 print """Usage catalyst [options] [-C variable=value...] [ -s identifier]
50 -a --clear-autoresume clear autoresume flags
51 @@ -135,59 +134,40 @@ def parse_config(myconfig):
52 print "Envscript support enabled."
53
54
55 -def import_modules():
56 - # import catalyst's own modules
57 - # (i.e. stage and the arch modules)
58 - targetmap={}
59 -
60 +def import_module(target):
61 + """
62 + import catalyst's own modules
63 + (i.e. targets and the arch modules)
64 + """
65 try:
66 - module_dir = __selfpath__ + "/targets/"
67 - for x in required_build_targets:
68 - try:
69 - fh=open(module_dir + x + ".py")
70 - module=imp.load_module(x, fh,"targets/" + x + ".py",
71 - (".py", "r", imp.PY_SOURCE))
72 - fh.close()
73 -
74 - except IOError:
75 - raise CatalystError, "Can't find " + x + ".py plugin in " + \
76 - module_dir
77 - for x in valid_build_targets:
78 - try:
79 - fh=open(module_dir + x + ".py")
80 - module=imp.load_module(x, fh, "targets/" + x + ".py",
81 - (".py", "r", imp.PY_SOURCE))
82 - module.register(targetmap)
83 - fh.close()
84 -
85 - except IOError:
86 - raise CatalystError,"Can't find " + x + ".py plugin in " + \
87 - module_dir
88 -
89 + mod_name = "catalyst.targets." + target
90 + module = __import__(mod_name, [],[], ["not empty"])
91 except ImportError as e:
92 - print "!!! catalyst: Python modules not found in "+\
93 - module_dir + "; exiting."
94 - print e
95 + print "!!! catalyst: Python module import error: %s " % target + \
96 + "in catalyst/targets/ ... exiting."
97 + print "ERROR was: ", e
98 sys.exit(1)
99 + return module
100
101 - return targetmap
102
103 -def build_target(addlargs, targetmap):
104 +def build_target(addlargs):
105 try:
106 - if addlargs["target"] not in targetmap:
107 - raise CatalystError,"Target \""+addlargs["target"]+"\" not available."
108 -
109 - mytarget=targetmap[addlargs["target"]](conf_values, addlargs)
110 -
111 - mytarget.run()
112 + module = import_module(addlargs["target"])
113 + target = getattr(module, addlargs["target"])(conf_values, addlargs)
114 + except AttributeError:
115 + raise CatalystError(
116 + "Target \"%s\" not available." % addlargs["target"],
117 + print_traceback=True)
118
119 + try:
120 + target.run()
121 except:
122 + print "Target run() exception: Python traceback output follows:"
123 catalyst.util.print_traceback()
124 print "!!! catalyst: Error encountered during run of target " + addlargs["target"]
125 sys.exit(1)
126
127 def main():
128 - targetmap={}
129
130 version()
131 if os.getuid() != 0:
132 @@ -341,9 +321,6 @@ def main():
133 print "Catalyst aborting...."
134 sys.exit(2)
135
136 - # import the rest of the catalyst modules
137 - targetmap=import_modules()
138 -
139 addlargs={}
140
141 if myspecfile:
142 @@ -364,7 +341,7 @@ def main():
143
144 # everything is setup, so the build is a go
145 try:
146 - build_target(addlargs, targetmap)
147 + build_target(addlargs)
148
149 except CatalystError:
150 print
151 diff --git a/catalyst/targets/embedded_target.py b/catalyst/targets/embedded_target.py
152 index 528d545..aee0f00 100644
153 --- a/catalyst/targets/embedded_target.py
154 +++ b/catalyst/targets/embedded_target.py
155 @@ -45,7 +45,3 @@ class embedded_target(StageBase):
156 def set_root_path(self):
157 self.settings["root_path"]=normpath("/tmp/mergeroot")
158 print "embedded root path is "+self.settings["root_path"]
159 -
160 -def register(foo):
161 - foo.update({"embedded":embedded_target})
162 - return foo
163 diff --git a/catalyst/targets/grp_target.py b/catalyst/targets/grp_target.py
164 index deba80a..e3f08a2 100644
165 --- a/catalyst/targets/grp_target.py
166 +++ b/catalyst/targets/grp_target.py
167 @@ -118,7 +118,3 @@ class grp_target(StageBase):
168 "config_profile_link","setup_confdir","portage_overlay","bind","chroot_setup",\
169 "setup_environment","run_local","unbind",\
170 "generate_digests","clear_autoresume"]
171 -
172 -def register(foo):
173 - foo.update({"grp":grp_target})
174 - return foo
175 diff --git a/catalyst/targets/livecd_stage1_target.py b/catalyst/targets/livecd_stage1_target.py
176 index a19f4ac..9c74253 100644
177 --- a/catalyst/targets/livecd_stage1_target.py
178 +++ b/catalyst/targets/livecd_stage1_target.py
179 @@ -76,7 +76,3 @@ class livecd_stage1_target(StageBase):
180 self.settings["pkgcache_path"]=normpath(string.join(self.settings["pkgcache_path"]))
181 else:
182 StageBase.set_pkgcache_path(self)
183 -
184 -def register(foo):
185 - foo.update({"livecd-stage1":livecd_stage1_target})
186 - return foo
187 diff --git a/catalyst/targets/livecd_stage2_target.py b/catalyst/targets/livecd_stage2_target.py
188 index e7ae212..a4630e6 100644
189 --- a/catalyst/targets/livecd_stage2_target.py
190 +++ b/catalyst/targets/livecd_stage2_target.py
191 @@ -145,7 +145,3 @@ class livecd_stage2_target(StageBase):
192 "unbind","remove","empty","target_setup",\
193 "setup_overlay","create_iso"]
194 self.settings["action_sequence"].append("clear_autoresume")
195 -
196 -def register(foo):
197 - foo.update({"livecd-stage2":livecd_stage2_target})
198 - return foo
199 diff --git a/catalyst/targets/netboot2_target.py b/catalyst/targets/netboot2_target.py
200 index 987afd8..130e2b6 100644
201 --- a/catalyst/targets/netboot2_target.py
202 +++ b/catalyst/targets/netboot2_target.py
203 @@ -167,7 +167,3 @@ class netboot2_target(StageBase):
204 "setup_environment","build_packages","root_overlay",\
205 "copy_files_to_image","setup_overlay","build_kernel","move_kernels",\
206 "remove","empty","unbind","clean","clear_autoresume"]
207 -
208 -def register(foo):
209 - foo.update({"netboot2":netboot2_target})
210 - return foo
211 diff --git a/catalyst/targets/netboot_target.py b/catalyst/targets/netboot_target.py
212 index c880289..9d92ef2 100644
213 --- a/catalyst/targets/netboot_target.py
214 +++ b/catalyst/targets/netboot_target.py
215 @@ -127,7 +127,3 @@ class netboot_target(StageBase):
216 "setup_environment","build_packages","build_busybox",\
217 "build_kernel","copy_files_to_image",\
218 "clean","create_netboot_files","unbind","clear_autoresume"]
219 -
220 -def register(foo):
221 - foo.update({"netboot":netboot_target})
222 - return foo
223 diff --git a/catalyst/targets/snapshot.py b/catalyst/targets/snapshot.py
224 new file mode 100644
225 index 0000000..6c2396e
226 --- /dev/null
227 +++ b/catalyst/targets/snapshot.py
228 @@ -0,0 +1,93 @@
229 +"""
230 +Snapshot target
231 +"""
232 +
233 +import os
234 +import shutil
235 +from stat import ST_UID, ST_GID, ST_MODE
236 +
237 +
238 +from catalyst.support import normpath, cmd
239 +from catalyst.base.targetbase import TargetBase
240 +from catalyst.base.genbase import GenBase
241 +
242 +class snapshot(TargetBase, GenBase):
243 + """
244 + Builder class for snapshots.
245 + """
246 + def __init__(self,myspec,addlargs):
247 + self.required_values=["version_stamp","target"]
248 + self.valid_values=["version_stamp","target"]
249 +
250 + TargetBase.__init__(self, myspec, addlargs)
251 + GenBase.__init__(self,myspec)
252 + #self.settings=myspec
253 + self.settings["target_subpath"]="portage"
254 + st=self.settings["storedir"]
255 + self.settings["snapshot_path"] = normpath(st + "/snapshots/"
256 + + self.settings["snapshot_name"]
257 + + self.settings["version_stamp"] + ".tar.bz2")
258 + self.settings["tmp_path"]=normpath(st+"/tmp/"+self.settings["target_subpath"])
259 +
260 + def setup(self):
261 + x=normpath(self.settings["storedir"]+"/snapshots")
262 + if not os.path.exists(x):
263 + os.makedirs(x)
264 +
265 + def mount_safety_check(self):
266 + pass
267 +
268 + def run(self):
269 + if "purgeonly" in self.settings["options"]:
270 + self.purge()
271 + return
272 +
273 + if "purge" in self.settings["options"]:
274 + self.purge()
275 +
276 + self.setup()
277 + print "Creating Portage tree snapshot "+self.settings["version_stamp"]+\
278 + " from "+self.settings["portdir"]+"..."
279 +
280 + mytmp=self.settings["tmp_path"]
281 + if not os.path.exists(mytmp):
282 + os.makedirs(mytmp)
283 +
284 + cmd("rsync -a --delete --exclude /packages/ --exclude /distfiles/ " +
285 + "--exclude /local/ --exclude CVS/ --exclude .svn --filter=H_**/files/digest-* " +
286 + self.settings["portdir"] + "/ " + mytmp + "/%s/" % self.settings["repo_name"],
287 + "Snapshot failure", env=self.env)
288 +
289 + print "Compressing Portage snapshot tarball..."
290 + cmd("tar -I lbzip2 -cf " + self.settings["snapshot_path"] + " -C " +
291 + mytmp + " " + self.settings["repo_name"],
292 + "Snapshot creation failure",env=self.env)
293 +
294 + self.gen_contents_file(self.settings["snapshot_path"])
295 + self.gen_digest_file(self.settings["snapshot_path"])
296 +
297 + self.cleanup()
298 + print "snapshot: complete!"
299 +
300 + def kill_chroot_pids(self):
301 + pass
302 +
303 + def cleanup(self):
304 + print "Cleaning up..."
305 +
306 + def purge(self):
307 + myemp=self.settings["tmp_path"]
308 + if os.path.isdir(myemp):
309 + print "Emptying directory",myemp
310 + """
311 + stat the dir, delete the dir, recreate the dir and set
312 + the proper perms and ownership
313 + """
314 + mystat=os.stat(myemp)
315 + """ There's no easy way to change flags recursively in python """
316 + if os.uname()[0] == "FreeBSD":
317 + os.system("chflags -R noschg "+myemp)
318 + shutil.rmtree(myemp)
319 + os.makedirs(myemp,0755)
320 + os.chown(myemp,mystat[ST_UID],mystat[ST_GID])
321 + os.chmod(myemp,mystat[ST_MODE])
322 diff --git a/catalyst/targets/snapshot_target.py b/catalyst/targets/snapshot_target.py
323 deleted file mode 100644
324 index 337ff1d..0000000
325 --- a/catalyst/targets/snapshot_target.py
326 +++ /dev/null
327 @@ -1,97 +0,0 @@
328 -"""
329 -Snapshot target
330 -"""
331 -
332 -import os
333 -import shutil
334 -from stat import ST_UID, ST_GID, ST_MODE
335 -
336 -
337 -from catalyst.support import normpath, cmd
338 -from catalyst.base.targetbase import TargetBase
339 -from catalyst.base.genbase import GenBase
340 -
341 -class snapshot_target(TargetBase, GenBase):
342 - """
343 - Builder class for snapshots.
344 - """
345 - def __init__(self,myspec,addlargs):
346 - self.required_values=["version_stamp","target"]
347 - self.valid_values=["version_stamp","target"]
348 -
349 - TargetBase.__init__(self, myspec, addlargs)
350 - GenBase.__init__(self,myspec)
351 - #self.settings=myspec
352 - self.settings["target_subpath"]="portage"
353 - st=self.settings["storedir"]
354 - self.settings["snapshot_path"] = normpath(st + "/snapshots/"
355 - + self.settings["snapshot_name"]
356 - + self.settings["version_stamp"] + ".tar.bz2")
357 - self.settings["tmp_path"]=normpath(st+"/tmp/"+self.settings["target_subpath"])
358 -
359 - def setup(self):
360 - x=normpath(self.settings["storedir"]+"/snapshots")
361 - if not os.path.exists(x):
362 - os.makedirs(x)
363 -
364 - def mount_safety_check(self):
365 - pass
366 -
367 - def run(self):
368 - if "purgeonly" in self.settings["options"]:
369 - self.purge()
370 - return
371 -
372 - if "purge" in self.settings["options"]:
373 - self.purge()
374 -
375 - self.setup()
376 - print "Creating Portage tree snapshot "+self.settings["version_stamp"]+\
377 - " from "+self.settings["portdir"]+"..."
378 -
379 - mytmp=self.settings["tmp_path"]
380 - if not os.path.exists(mytmp):
381 - os.makedirs(mytmp)
382 -
383 - cmd("rsync -a --delete --exclude /packages/ --exclude /distfiles/ " +
384 - "--exclude /local/ --exclude CVS/ --exclude .svn --filter=H_**/files/digest-* " +
385 - self.settings["portdir"] + "/ " + mytmp + "/%s/" % self.settings["repo_name"],
386 - "Snapshot failure", env=self.env)
387 -
388 - print "Compressing Portage snapshot tarball..."
389 - cmd("tar -I lbzip2 -cf " + self.settings["snapshot_path"] + " -C " +
390 - mytmp + " " + self.settings["repo_name"],
391 - "Snapshot creation failure",env=self.env)
392 -
393 - self.gen_contents_file(self.settings["snapshot_path"])
394 - self.gen_digest_file(self.settings["snapshot_path"])
395 -
396 - self.cleanup()
397 - print "snapshot: complete!"
398 -
399 - def kill_chroot_pids(self):
400 - pass
401 -
402 - def cleanup(self):
403 - print "Cleaning up..."
404 -
405 - def purge(self):
406 - myemp=self.settings["tmp_path"]
407 - if os.path.isdir(myemp):
408 - print "Emptying directory",myemp
409 - """
410 - stat the dir, delete the dir, recreate the dir and set
411 - the proper perms and ownership
412 - """
413 - mystat=os.stat(myemp)
414 - """ There's no easy way to change flags recursively in python """
415 - if os.uname()[0] == "FreeBSD":
416 - os.system("chflags -R noschg "+myemp)
417 - shutil.rmtree(myemp)
418 - os.makedirs(myemp,0755)
419 - os.chown(myemp,mystat[ST_UID],mystat[ST_GID])
420 - os.chmod(myemp,mystat[ST_MODE])
421 -
422 -def register(foo):
423 - foo.update({"snapshot":snapshot_target})
424 - return foo
425 diff --git a/catalyst/targets/stage1_target.py b/catalyst/targets/stage1_target.py
426 index 0a36432..2329b58 100644
427 --- a/catalyst/targets/stage1_target.py
428 +++ b/catalyst/targets/stage1_target.py
429 @@ -94,7 +94,3 @@ class stage1_target(StageBase):
430 self.mounts.append("stage1root/proc")
431 self.target_mounts["stage1root/proc"] = "/tmp/stage1root/proc"
432 self.mountmap["stage1root/proc"] = "/proc"
433 -
434 -def register(foo):
435 - foo.update({"stage1":stage1_target})
436 - return foo
437 diff --git a/catalyst/targets/stage2_target.py b/catalyst/targets/stage2_target.py
438 index 783d42e..ec6d78d 100644
439 --- a/catalyst/targets/stage2_target.py
440 +++ b/catalyst/targets/stage2_target.py
441 @@ -62,7 +62,3 @@ class stage2_target(StageBase):
442 print "\tUsing an portage overlay for earlier stages could cause build issues."
443 print "\tIf you break it, you buy it. Don't complain to us about it."
444 print "\tDont say we did not warn you\n"
445 -
446 -def register(foo):
447 - foo.update({"stage2":stage2_target})
448 - return foo
449 diff --git a/catalyst/targets/stage3_target.py b/catalyst/targets/stage3_target.py
450 index 28021b1..103242d 100644
451 --- a/catalyst/targets/stage3_target.py
452 +++ b/catalyst/targets/stage3_target.py
453 @@ -25,7 +25,3 @@ class stage3_target(StageBase):
454
455 def set_cleanables(self):
456 StageBase.set_cleanables(self)
457 -
458 -def register(foo):
459 - foo.update({"stage3":stage3_target})
460 - return foo
461 diff --git a/catalyst/targets/stage4_target.py b/catalyst/targets/stage4_target.py
462 index 0d725c7..4dbdb45 100644
463 --- a/catalyst/targets/stage4_target.py
464 +++ b/catalyst/targets/stage4_target.py
465 @@ -36,8 +36,3 @@ class stage4_target(StageBase):
466 if "fetch" not in self.settings['options']:
467 self.settings["action_sequence"].append("capture")
468 self.settings["action_sequence"].append("clear_autoresume")
469 -
470 -def register(foo):
471 - foo.update({"stage4":stage4_target})
472 - return foo
473 -
474 diff --git a/catalyst/targets/tinderbox_target.py b/catalyst/targets/tinderbox_target.py
475 index 1e245f2..0c389e6 100644
476 --- a/catalyst/targets/tinderbox_target.py
477 +++ b/catalyst/targets/tinderbox_target.py
478 @@ -45,7 +45,3 @@ class tinderbox_target(StageBase):
479 "config_profile_link","setup_confdir","bind","chroot_setup",\
480 "setup_environment","run_local","preclean","unbind","clean",\
481 "clear_autoresume"]
482 -
483 -def register(foo):
484 - foo.update({"tinderbox":tinderbox_target})
485 - return foo
486 --
487 2.1.0