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
changes/57/367157/6
Ian Wienand 6 years ago
parent 97c01e48ed
commit 7446c32197
  1. 4
      MANIFEST.in
  2. 1
      bin/diskimage_builder
  3. 46
      diskimage_builder/disk_image_create.py
  4. 9
      diskimage_builder/lib/disk-image-create
  5. 0
      diskimage_builder/lib/ramdisk-image-create
  6. 12
      diskimage_builder/paths.py
  7. 4
      setup.cfg
  8. 5
      tests/run_functests.sh

@ -1,5 +1 @@
include bin/disk-image-create
include bin/ramdisk-image-create
graft lib
graft elements
include README.rst

@ -1 +0,0 @@
../diskimage_builder

@ -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)

@ -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

@ -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))

@ -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

@ -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

Loading…
Cancel
Save