From 7446c32197e01407a7df703e28efbdeda282a03d Mon Sep 17 00:00:00 2001 From: Ian Wienand Date: Wed, 20 Jul 2016 01:48:32 +0000 Subject: [PATCH] Move diskimage-image-create to an entry point It has always been a weird thing that dib is a python package, but is totally driven by the disk-image-create script. It creates this strange division that is hard to explain. This moves disk-image-create to a regular python entry-point Currently, this simply exec()s the original disk-image-create script. However, we now have a (private) interface between disk-image-create written in python and the driver shell script. Here's some things we could do, for example: * Argument parsing is generally nicer in Python, and then end result is mostly just setting environment variables to flag different things in the shell script. I could see us moving the argument-parsing into diskimage_builder.disk_image_create:main() and just setting things in os.environ before the exec()). * I7092e1845942f249175933d67ab121188f3511fd sets IMAGE_ELEMENT_YAML in disk-image-create by calling-back to element-info. We can just call element_dependencies.find_all_elements() in here an export is to os.environ before disk-image-create starts. * remove need for ramdisk-image-create symlink by just exporting IS_RAMDISK based on sys.argv[1] value * you could even unit test some of this :) Change-Id: I69ca3d26fede0506a6353c077c69f735c8d84d28 --- MANIFEST.in | 4 -- bin/diskimage_builder | 1 - diskimage_builder/disk_image_create.py | 46 +++++++++++++++++++ .../lib}/disk-image-create | 9 ++-- .../lib}/ramdisk-image-create | 0 diskimage_builder/paths.py | 12 +++-- setup.cfg | 4 +- tests/run_functests.sh | 5 +- 8 files changed, 63 insertions(+), 18 deletions(-) delete mode 120000 bin/diskimage_builder create mode 100644 diskimage_builder/disk_image_create.py rename {bin => diskimage_builder/lib}/disk-image-create (99%) rename {bin => diskimage_builder/lib}/ramdisk-image-create (100%) diff --git a/MANIFEST.in b/MANIFEST.in index 858ab9d5e..9561fb106 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,5 +1 @@ -include bin/disk-image-create -include bin/ramdisk-image-create -graft lib -graft elements include README.rst diff --git a/bin/diskimage_builder b/bin/diskimage_builder deleted file mode 120000 index ac949dc60..000000000 --- a/bin/diskimage_builder +++ /dev/null @@ -1 +0,0 @@ -../diskimage_builder \ No newline at end of file diff --git a/diskimage_builder/disk_image_create.py b/diskimage_builder/disk_image_create.py new file mode 100644 index 000000000..1727c8c43 --- /dev/null +++ b/diskimage_builder/disk_image_create.py @@ -0,0 +1,46 @@ +# Copyright 2016 Ian Wienand (iwienand@redhat.com) +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. + +# Python Logging Configuration for DIB +# Usage: +# In the main (application) file, do an +# import logging_config +# ... +# logging_config.setup() +# It is then possible to use the normal python logging interface, like +# logger = logging.getLogger(__name__) +# logger.info("Info Message") + +import os +import os.path +import sys + +import diskimage_builder.paths + + +def main(): + environ = os.environ + + # pre-seed some paths for the shell script + environ['_LIB'] = diskimage_builder.paths.get_path('lib') + + # we have to handle being called as "disk-image-create" or + # "ramdisk-image-create". ramdisk-iamge-create is just a symlink + # to disk-image-create + # XXX: we could simplify things by removing the symlink, and + # just setting IS_RAMDISK in environ here depending on sys.argv[1] + script = "%s/%s" % (diskimage_builder.paths.get_path('lib'), + os.path.basename(sys.argv[0])) + + os.execve("/bin/bash", ['bash', script] + sys.argv[1:], environ) diff --git a/bin/disk-image-create b/diskimage_builder/lib/disk-image-create similarity index 99% rename from bin/disk-image-create rename to diskimage_builder/lib/disk-image-create index 086c04242..816858b3f 100755 --- a/bin/disk-image-create +++ b/diskimage_builder/lib/disk-image-create @@ -26,13 +26,14 @@ export DIB_ENV=$(export | grep ' DIB_.*=') SCRIPTNAME=$(basename $0) -export _LIB=$(python -c ' -import diskimage_builder.paths -diskimage_builder.paths.get_path("lib")') +if [ -z "$_LIB" ]; then + echo "_LIB not set!" + exit 1 +fi _BASE_ELEMENT_DIR=$(python -c ' import diskimage_builder.paths -diskimage_builder.paths.get_path("elements")') +diskimage_builder.paths.show_path("elements")') source $_LIB/die diff --git a/bin/ramdisk-image-create b/diskimage_builder/lib/ramdisk-image-create similarity index 100% rename from bin/ramdisk-image-create rename to diskimage_builder/lib/ramdisk-image-create diff --git a/diskimage_builder/paths.py b/diskimage_builder/paths.py index 18f2028ea..857bad400 100644 --- a/diskimage_builder/paths.py +++ b/diskimage_builder/paths.py @@ -21,11 +21,15 @@ import sys def get_path(var): if var == "lib": - print(os.path.abspath( - pkg_resources.resource_filename(__name__, "lib"))) + return os.path.abspath( + pkg_resources.resource_filename(__name__, "lib")) elif var == "elements": - print(os.path.abspath( - pkg_resources.resource_filename(__name__, "elements"))) + return os.path.abspath( + pkg_resources.resource_filename(__name__, "elements")) else: print("Unknown path request!") sys.exit(1) + + +def show_path(var): + print(get_path(var)) diff --git a/setup.cfg b/setup.cfg index 2fdb2b220..4c5e9357f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -27,8 +27,6 @@ packages = # real file on install; see lp bug #1212482 scripts = bin/dib-lint - bin/disk-image-create - bin/ramdisk-image-create data_files = share/diskimage-builder/scripts = scripts/* @@ -56,3 +54,5 @@ universal = 1 console_scripts = element-info = diskimage_builder.element_dependencies:main dib-block-device = diskimage_builder.block_device:main + disk-image-create = diskimage_builder.disk_image_create:main + ramdisk-image-create = diskimage_builder.disk_image_create:main diff --git a/tests/run_functests.sh b/tests/run_functests.sh index 75093c54e..c04d551ef 100755 --- a/tests/run_functests.sh +++ b/tests/run_functests.sh @@ -4,11 +4,10 @@ set -eu set -o pipefail BASE_DIR=$(cd $(dirname "$0")/.. && pwd) -export DIB_CMD=$BASE_DIR/bin/disk-image-create +export DIB_CMD=disk-image-create export DIB_ELEMENTS=$(python -c ' import diskimage_builder.paths -diskimage_builder.paths.get_path("elements")') - +diskimage_builder.paths.show_path("elements")') # # Default skip tests