--- virtManager/create.py | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/virtManager/create.py b/virtManager/create.py index 658135c..4bedcfe 100644 --- a/virtManager/create.py +++ b/virtManager/create.py @@ -22,6 +22,7 @@ import logging import threading import time import subprocess +from os.path import exists, isdir try: import commands # Python2 only except Exception: @@ -1963,6 +1964,26 @@ class vmmCreate(vmmGObjectUI): if not fs: return self.err.val_err(_("An OS directory path is required.")) + if self.widget("install-oscontainer-bootstrap").get_active(): + + src_url = self.widget("install-oscontainer-source-url-entry" + ).get_text().strip() + user = self.widget("install-oscontainer-source-user" + ).get_text().strip() + passwd = self.widget("install-oscontainer-source-passwd" + ).get_text() + + # Check if the source path was provided + if not src_url: + return self.err.val_err(_("Source URL is required")) + + # Show error if destination path exist and is not folder + if exists(fs) and not isdir(fs): + return self.err.val_err(_("Path already exist and" + " it is not directory: " + fs)) + # Start container bootstrap + self._container_image_bootstrap(src_url, fs, user, passwd) + elif instmethod == INSTALL_PAGE_VZ_TEMPLATE: instclass = virtinst.ContainerInstaller template = self.widget("install-container-template").get_text() @@ -2517,3 +2538,56 @@ class vmmCreate(vmmGObjectUI): self.err.show_err(_("Error continue install: %s") % str(e)) return True + + def _create_directory_tree(self, asyncjob, src, dest, user, passwd): + """ + Call virt-bootstrap and wait until exitCode is returned + """ + + cmd = ["virt-bootstrap", src, dest] + if user: + cmd += ["--username", user] + if passwd: + cmd += ["--password", passwd] + + logging.debug("Start asyncjob job: %s", " ".join(cmd)) + + bootstrap_proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + + stdout, stderr = bootstrap_proc.communicate() + + if bootstrap_proc.returncode != 0: + asyncjob.set_error("virt-bootstrap did not complete successfully", + "{}\n{}".format(stdout, stderr)) + + def _container_image_bootstrap(self, src, dest, + src_auth_user=None, + src_auth_passwd=None): + """ + Launch virt-bootstrap as async job + """ + + params = [src, dest, src_auth_user, src_auth_passwd] + + logging.debug("Start asynchronous job to bootstrap container.") + + parentobj = self._customize_window or self + progWin = vmmAsyncJob(self._create_directory_tree, params, + self._container_bootstrap_finished_cb, + [parentobj], + _("Bootstrap Container"), + _("The process of download and untar the " + "container image may take a few minutes " + "to complete."), + parentobj.topwin) + progWin.run() + + def _container_bootstrap_finished_cb(self, error, details, parentobj): + """ + Thread callback - See self._container_image_bootstrap() + """ + if error: + parentobj.err.show_err(_("The container bootstrap did not finish " + "successfully."), details=error + details) -- 2.9.4 _______________________________________________ virt-tools-list mailing list virt-tools-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/virt-tools-list