summaryrefslogtreecommitdiffstats
path: root/src/virtBootstrap/sources.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/virtBootstrap/sources.py')
-rw-r--r--src/virtBootstrap/sources.py52
1 files changed, 33 insertions, 19 deletions
diff --git a/src/virtBootstrap/sources.py b/src/virtBootstrap/sources.py
index b503846..04266e4 100644
--- a/src/virtBootstrap/sources.py
+++ b/src/virtBootstrap/sources.py
@@ -122,28 +122,31 @@ def format_number(number):
return(fmt % (number or 0, symbols[depth]))
-def log_layer_extract(layer, current, total):
+def log_layer_extract(layer, current, total, progress):
"""
Create log message on layer extract.
"""
sum_type, sum_value, layer_file, layer_size = layer
- logger.info("Extracting layer (%s/%s) with size: %s",
- current, total, format_number(layer_size))
+ progress("Extracting layer (%s/%s) with size: %s"
+ % (current, total, format_number(layer_size)), logger=logger)
logger.debug('Untar layer: (%s:%s) %s', sum_type, sum_value, layer_file)
-def untar_layers(layers_list, dest_dir):
+def untar_layers(layers_list, dest_dir, progress):
"""
Untar each of layers from container image.
"""
nlayers = len(layers_list)
for index, layer in enumerate(layers_list):
- log_layer_extract(layer, index + 1, nlayers)
+ log_layer_extract(layer, index + 1, nlayers, progress)
layer_file = layer[2]
# Extract layer tarball into destination directory
safe_untar(layer_file, dest_dir)
+ # Update progress value
+ progress(value=(float(index + 1) / nlayers * 50) + 50)
+
def get_mime_type(path):
"""
@@ -203,7 +206,7 @@ def create_qcow2(tar_file, layer_file, backing_file=None, size=DEF_QCOW2_SIZE):
execute(tar_in_cmd)
-def extract_layers_in_qcow2(layers_list, dest_dir):
+def extract_layers_in_qcow2(layers_list, dest_dir, progress):
"""
Extract docker layers in qcow2 images with backing chains.
"""
@@ -211,7 +214,7 @@ def extract_layers_in_qcow2(layers_list, dest_dir):
nlayers = len(layers_list)
for index, layer in enumerate(layers_list):
- log_layer_extract(layer, index + 1, nlayers)
+ log_layer_extract(layer, index + 1, nlayers, progress)
tar_file = layer[2]
# Name format for the qcow2 image
@@ -221,6 +224,9 @@ def extract_layers_in_qcow2(layers_list, dest_dir):
# Keep the file path for the next layer
qcow2_backing_file = qcow2_layer_file
+ # Update progress value
+ progress(value=(float(index + 1) / nlayers * 50) + 50)
+
def get_image_dir(no_cache=False):
"""
@@ -258,6 +264,7 @@ class FileSource(object):
def __init__(self, **kwargs):
self.path = kwargs['uri'].path
self.output_format = kwargs['fmt']
+ self.progress = kwargs['progress'].update_progress
def unpack(self, dest):
"""
@@ -270,7 +277,8 @@ class FileSource(object):
raise Exception('Invalid file source "%s"' % self.path)
if self.output_format == 'dir':
- logger.info("Extracting files into destination directory")
+ self.progress("Extracting files into destination directory",
+ value=0, logger=logger)
safe_untar(self.path, dest)
elif self.output_format == 'qcow2':
@@ -279,12 +287,14 @@ class FileSource(object):
qcow2_file = os.path.realpath('{}/{}.qcow2'.format(dest,
file_name))
- logger.info("Extracting files into qcow2 image")
+ self.progress("Extracting files into qcow2 image", value=0,
+ logger=logger)
create_qcow2(self.path, qcow2_file)
else:
raise Exception("Unknown format:" + self.output_format)
- logger.info("Extraction completed successfully!")
+ self.progress("Extraction completed successfully!", value=100,
+ logger=logger)
logger.info("Files are stored in: " + dest)
@@ -304,6 +314,7 @@ class DockerSource(object):
@param fmt: Format used to store image [dir, qcow2]
@param insecure: Do not require HTTPS and certificate verification
@param no_cache: Whether to store downloaded images or not
+ @param progress: Instance of the progress module
"""
self.username = kwargs['username']
@@ -311,6 +322,7 @@ class DockerSource(object):
self.output_format = kwargs['fmt']
self.insecure = kwargs['not_secure']
self.no_cache = kwargs['no_cache']
+ self.progress = kwargs['progress'].update_progress
registry = kwargs['uri'].netloc
image = kwargs['uri'].path
@@ -352,7 +364,7 @@ class DockerSource(object):
self.password = getpass.getpass()
skopeo_copy.append('--src-creds={}:{}'.format(self.username,
self.password))
- logger.info("Downloading container image")
+ self.progress("Downloading container image", value=0, logger=logger)
# Run "skopeo copy" command
execute(skopeo_copy)
# Remove the manifest file as it is not needed
@@ -363,6 +375,7 @@ class DockerSource(object):
Check if layers of container image exist in image_dir
and have valid hash sum.
"""
+ self.progress("Checking cached layers", value=0, logger=logger)
for sum_type, sum_expected, path, _ignore in self.layers:
logger.debug("Checking layer: %s", path)
if not (os.path.exists(path)
@@ -375,9 +388,7 @@ class DockerSource(object):
Retrieve layers of container image.
"""
# Check if layers have been downloaded
- if self.validate_image_layers():
- logger.info("Using cached image layers")
- else:
+ if not self.validate_image_layers():
self.download_image()
def unpack(self, dest):
@@ -394,11 +405,13 @@ class DockerSource(object):
# Unpack to destination directory
if self.output_format == 'dir':
- logger.info("Extracting container layers")
- untar_layers(self.layers, dest)
+ self.progress("Extracting container layers", value=50,
+ logger=logger)
+ untar_layers(self.layers, dest, self.progress)
elif self.output_format == 'qcow2':
- logger.info("Extracting container layers into qcow2 images")
- extract_layers_in_qcow2(self.layers, dest)
+ self.progress("Extracting container layers into qcow2 images",
+ value=50, logger=logger)
+ extract_layers_in_qcow2(self.layers, dest, self.progress)
else:
raise Exception("Unknown format:" + self.output_format)
@@ -406,7 +419,8 @@ class DockerSource(object):
raise
else:
- logger.info("Download and extract completed!")
+ self.progress("Download and extract completed!", value=100,
+ logger=logger)
logger.info("Files are stored in: " + dest)
finally: