Support to create multiple images by same ks file.
authorwanchao.xu <wanchao.xu@samsung.com>
Tue, 12 Nov 2024 07:57:43 +0000 (15:57 +0800)
committerwanchao.xu <wanchao.xu@samsung.com>
Tue, 12 Nov 2024 07:57:43 +0000 (15:57 +0800)
Change-Id: I49a6380920c988fbc3fe465115505f2b139205ee
Signed-off-by: wanchao.xu <wanchao.xu@samsung.com>
mic/rt_util.py

index f10edb518f1c27c4ff2374e34eb6fe9239211f80..734065d97d5a10ec7b20fbce52111bf15ee3ab52 100644 (file)
@@ -118,7 +118,7 @@ def run_scripts_out_bootstrap(ks, rundir, env=None):
             os.chdir(oldoutdir)
             os.unlink(path)
 
-def bootstrap_mic(argv=None):
+def bootstrap_mic(ksconf, argv=None):
     def mychroot():
         os.chroot(rootdir)
         os.chdir(cwd)
@@ -130,12 +130,28 @@ def bootstrap_mic(argv=None):
         argv[0] = '/usr/bin/mic'
 
     cachedir = configmgr.create['cachedir']
+    if not os.path.exists(cachedir):
+        os.makedirs(cachedir)
+
+    cache_changed = False
     cache_lock = open(os.path.join(cachedir, "__using.lock"), 'w')
     try:
         fcntl.flock(cache_lock, fcntl.LOCK_EX | fcntl.LOCK_NB)
     except BlockingIOError:
-        raise errors.CreatorError("Cache %s is using by other mic" % cachedir)
+        for cache_option in ('-k', '--cachedir'):
+            if cache_option in argv[1:]:
+                cache_lock.close()
+                raise errors.CreatorError("Cache %s is using by other mic" % cachedir)
+
+        cachedir = tempfile.mkdtemp(prefix="ks-", dir=os.path.dirname(cachedir))
+        configmgr.create['cachedir'] = cachedir
+        argv.append('-k')
+        argv.append(cachedir)
+        cache_changed = True
+        cache_lock = open(os.path.join(cachedir, "__using.lock"), 'w')
+        fcntl.flock(cache_lock, fcntl.LOCK_EX)
 
+    configmgr._ksconf = ksconf
     cropts = configmgr.create
     bsopts = configmgr.bootstrap
     distro = bsopts['distro_name'].lower()
@@ -201,6 +217,8 @@ def bootstrap_mic(argv=None):
         fcntl.flock(cache_lock, fcntl.LOCK_UN)
         cache_lock.close()
         bsenv.cleanup()
+        if cache_changed:
+            shutil.rmtree(cachedir, ignore_errors=True)
 
 def get_bindmounts(cropts):
     binddirs =  [
@@ -357,8 +375,7 @@ def prepare_create(args):
     ksconf = args.ksfile
 
     if creatoropts['runtime'] == 'bootstrap':
-        configmgr._ksconf = ksconf
-        bootstrap_mic()
+        bootstrap_mic(ksconf)
 
     recording_pkgs = []
     if len(creatoropts['record_pkgs']) > 0: