def execute_base(layer_obj, prereqs): """Given an ImageLayer object, find packages installed in the layer using the default method. The prereqisites required for this to work: prereqs.shell: the shell to use prereqs.binary: the binary to look up in the command library optional prerequisites: prereqs.envs: any environment variables to set before execution 1. Use command_lib's base to look up the binary to see if there is a method to retrieve the metadata 2. If there is, invoke the scripts in a chroot environment and process the results 3. Add the results to the ImageLayer object It is assumed that the filesystem is prepped for execution by mounting the filesystem in the working directory and /proc, /sys and /dev device nodes are mounted""" # Add notices to this layer object origin_layer = 'Layer {}'.format(layer_obj.layer_index) # find the binary listing listing = command_lib.get_base_listing(prereqs.binary) if listing: # put info notice about what is going to be invoked snippet_msg = (formats.invoke_for_base + '\n' + content.print_base_invoke(prereqs.binary)) layer_obj.origins.add_notice_to_origins(origin_layer, Notice(snippet_msg, 'info')) # get list of metadata by invoking scripts in chroot logger.debug("Collecting metadata for image layer...") pkg_dict, invoke_msg, warnings = collect.collect_list_metadata( prereqs.shell, listing, layer_obj.get_layer_workdir(), prereqs.envs) # more processing for debian copyrights to get licenses if listing.get("pkg_format") == "deb": logger.debug("Processing Debian copyrights...") pkg_dict["pkg_licenses"] = com.get_deb_package_licenses( pkg_dict["copyrights"]) # add any errors and warnings to the layer's origins object if invoke_msg: logger.error( "Script invocation error. Unable to collect some metadata") layer_obj.origins.add_notice_to_origins( origin_layer, Notice(invoke_msg, 'error')) if warnings: logger.warning("Some metadata may be missing") layer_obj.origins.add_notice_to_origins( origin_layer, Notice(warnings, 'warning')) # bundle the results into Package objects bundle.fill_pkg_results(layer_obj, pkg_dict) # remove extra FileData objects from the layer com.remove_duplicate_layer_files(layer_obj) # if there is no listing add a notice else: layer_obj.origins.add_notice_to_origins( origin_layer, Notice( errors.no_listing_for_base_key.format( listing_key=prereqs.binary), 'error'))
def add_base_packages(image_layer, binary, shell): # pylint: disable=too-many-locals '''Given the image layer, the binary to invoke and shell: 1. get the listing from the base.yml 2. Invoke any commands against the base layer 3. Make a list of packages and add them to the layer''' origin_layer = 'Layer: ' + image_layer.fs_hash[:10] if image_layer.created_by: image_layer.origins.add_notice_to_origins( origin_layer, Notice( formats.layer_created_by.format( created_by=image_layer.created_by), 'info')) else: image_layer.origins.add_notice_to_origins( origin_layer, Notice(formats.no_created_by, 'warning')) origin_command_lib = formats.invoking_base_commands # find the binary listing = command_lib.get_base_listing(binary) if listing: # put info notice about what is going to be invoked snippet_msg = formats.invoke_for_base + '\n' + \ content.print_base_invoke(binary) image_layer.origins.add_notice_to_origins(origin_layer, Notice(snippet_msg, 'info')) shell, _ = command_lib.get_image_shell(listing) if not shell: shell = constants.shell # get all the packages in the base layer names, n_msg = command_lib.get_pkg_attr_list(shell, listing['names']) versions, v_msg = command_lib.get_pkg_attr_list( shell, listing['versions']) licenses, l_msg = command_lib.get_pkg_attr_list( shell, listing['licenses']) src_urls, u_msg = command_lib.get_pkg_attr_list( shell, listing['src_urls']) # add a notice to the image if something went wrong invoke_msg = n_msg + v_msg + l_msg + u_msg if invoke_msg: image_layer.origins.add_notice_to_origins( origin_layer, Notice(invoke_msg, 'error')) if names and len(names) > 1: for index, name in enumerate(names): pkg = Package(name) if len(versions) == len(names): pkg.version = versions[index] if len(licenses) == len(names): pkg.license = licenses[index] if len(src_urls) == len(names): pkg.src_url = src_urls[index] image_layer.add_package(pkg) # if there is no listing add a notice else: image_layer.origins.add_notice_to_origins( origin_command_lib, Notice(errors.no_listing_for_base_key.format(listing_key=binary), 'error'))
def add_base_packages(image_layer, binary, shell, work_dir=None, envs=None): '''Given the image layer, the binary to invoke and shell: 1. get the listing from the base.yml 2. Invoke any commands against the base layer 3. Make a list of packages and add them to the layer''' origin_layer = 'Layer {}'.format(image_layer.layer_index) if image_layer.created_by: image_layer.origins.add_notice_to_origins( origin_layer, Notice( formats.layer_created_by.format( created_by=image_layer.created_by), 'info')) else: image_layer.origins.add_notice_to_origins( origin_layer, Notice(formats.no_created_by, 'warning')) origin_command_lib = formats.invoking_base_commands # find the binary listing = command_lib.get_base_listing(binary) if listing: # put info notice about what is going to be invoked snippet_msg = (formats.invoke_for_base + '\n' + content.print_base_invoke(binary)) image_layer.origins.add_notice_to_origins(origin_layer, Notice(snippet_msg, 'info')) # get all the packages in the base layer pkg_dict, invoke_msg, warnings = collate_list_metadata( shell, listing, work_dir, envs) if listing.get("pkg_format") == "deb": pkg_dict["pkg_licenses"] = get_deb_package_licenses( pkg_dict["copyrights"]) if invoke_msg: image_layer.origins.add_notice_to_origins( origin_layer, Notice(invoke_msg, 'error')) if warnings: image_layer.origins.add_notice_to_origins( origin_command_lib, Notice(warnings, 'warning')) if 'names' in pkg_dict and len(pkg_dict['names']) > 1: pkg_list = convert_to_pkg_dicts(pkg_dict) for pkg_dict in pkg_list: pkg = Package(pkg_dict['name']) pkg.fill(pkg_dict) image_layer.add_package(pkg) remove_duplicate_layer_files(image_layer) # if there is no listing add a notice else: image_layer.origins.add_notice_to_origins( origin_command_lib, Notice(errors.no_listing_for_base_key.format(listing_key=binary), 'error'))
def add_base_packages(image_layer, binary, shell): '''Given the image layer, the binary to invoke and shell: 1. get the listing from the base.yml 2. Invoke any commands against the base layer 3. Make a list of packages and add them to the layer''' origin_layer = 'Layer: ' + image_layer.fs_hash[:10] if image_layer.created_by: image_layer.origins.add_notice_to_origins( origin_layer, Notice( formats.layer_created_by.format( created_by=image_layer.created_by), 'info')) else: image_layer.origins.add_notice_to_origins( origin_layer, Notice(formats.no_created_by, 'warning')) origin_command_lib = formats.invoking_base_commands # find the binary listing = command_lib.get_base_listing(binary) if listing: # put info notice about what is going to be invoked snippet_msg = formats.invoke_for_base + '\n' + \ content.print_base_invoke(binary) image_layer.origins.add_notice_to_origins(origin_layer, Notice(snippet_msg, 'info')) shell, _ = command_lib.get_image_shell(listing) if not shell: shell = constants.shell # get all the packages in the base layer pkg_dict, invoke_msg, warnings = collate_list_metadata(shell, listing) if invoke_msg: image_layer.origins.add_notice_to_origins( origin_layer, Notice(invoke_msg, 'error')) if warnings: image_layer.origins.add_notice_to_origins( origin_command_lib, Notice(warnings, 'warning')) if 'names' in pkg_dict and len(pkg_dict['names']) > 1: pkg_list = convert_to_pkg_dicts(pkg_dict) for pkg_dict in pkg_list: pkg = Package(pkg_dict['name']) pkg.fill(pkg_dict) image_layer.add_package(pkg) # if there is no listing add a notice else: image_layer.origins.add_notice_to_origins( origin_command_lib, Notice(errors.no_listing_for_base_key.format(listing_key=binary), 'error'))