import argparse import os import re import subprocess parser = argparse.ArgumentParser() parser.add_argument('-d', action='store', dest='directory', help='Directory location to store ONAP docker images') parser.add_argument('-l', action='store', dest='docker_images_list', help='List of ONAP docker images') args = parser.parse_args() def get_image_tokens(image_list): tokens = [] with open(image_list) as f: for line in f.readlines(): pattern = re.compile("^(.*):([0-9.]*)\\s#(.*)$") matches = re.match(pattern, line) tokens.append(matches.groups()) return tokens def docker_save_images(tokens, directory): if not os.path.exists(directory): os.makedirs(directory) for token in tokens: docker_pull(token) docker_tag(token) docker_save(token, directory) docker_remove_image(token) def docker_save(token, directory): image, version, sha = token print("Saving docker image: {image} (Version: {version})".format(image=image, version=version)) src_str = os.path.join("registry.nordix.org", "onap", "online-install") repl_str = "nexus.onap.org:10001" image_target = "{dir}{sep}{image}_{tag}.tar".format(dir=directory, sep=os.path.sep, image=image.replace( src_str, repl_str).replace(os.path.sep, "_").replace(":", "_"), tag=version) if not os.path.exists(image_target): try: subprocess.check_output(['docker', 'save', '{image}:{tag}'.format(image=image, tag=version), '-o', image_target]) except subprocess.CalledProcessError as e: print("Error saving docker file ({file}): {error}".format(file=image_target, error=e.message)) def docker_tag(token): image, version, sha = token target_image = image.replace("registry.nordix.org/onap/online-install", "nexus.onap.org:10001") print("Tagging docker image...\n\t/Source: {image} (SHA: {sha}, Version: {version}\n\tTarget: {target})".format( image=image, sha=sha, version=version, target=target_image)) try: subprocess.check_output(['docker', 'tag', '{image}@{tag}'.format(image=image, tag=sha), '{image}:{tag}'.format(image=target_image, tag=version)]) except subprocess.CalledProcessError as e: print("Error tagging docker image ({image}): {error}".format(image=image, error=e.message)) def docker_remove_image(token): image, version, sha = token print("Removing docker image: {image}:{version})".format(image=image, version=version)) try: subprocess.check_output(['docker', 'rmi', '{image}:{tag}'.format(image=image, tag=version)]) except subprocess.CalledProcessError as e: print("Error tagging docker image ({image}): {error}".format(image=image, error=e.message)) def docker_pull(token): image, version, sha = token print("Pulling docker image: {image} (Version: {version})".format(image=image, version=version)) try: subprocess.check_output(['docker', 'pull', '{image}:{tag}'.format(image=image, tag=version)]) except subprocess.CalledProcessError as e: print("Error pulling docker image ({image}): {error}".format(image=image, error=e.message)) image_tokens = get_image_tokens(args.docker_images_list) docker_save_images(image_tokens, args.directory)