aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin André <m.andre@redhat.com>2015-09-17 14:54:09 +0900
committerMartin André <m.andre@redhat.com>2015-09-17 17:21:31 +0900
commit7a4a9eef209dbc101184d2aeb9717a21dd6a5cb9 (patch)
tree947dcde130466550920eda283b8f9b42ac3a6384
parent3d486550fa385a072b28f8c3442d336d6b735356 (diff)
downloadkolla-7a4a9eef209dbc101184d2aeb9717a21dd6a5cb9.tar.gz
kolla-7a4a9eef209dbc101184d2aeb9717a21dd6a5cb9.zip
Implement configuration file for kolla-build
Kolla build script configuration now lives in /etc/kolla/kolla-build.conf. This allows overriding configuration options without the need to pass arguments on the command line. Command line arguments still get precedence. Closes-Bug: #1496185 Change-Id: I69482a11437087f19d7f76b379dca85b1f622268
-rw-r--r--doc/image-building.rst4
-rw-r--r--etc/kolla/kolla-build.conf43
-rwxr-xr-xkolla/cmd/build.py141
3 files changed, 128 insertions, 60 deletions
diff --git a/doc/image-building.rst b/doc/image-building.rst
index 069e15abc..51c7c2c9b 100644
--- a/doc/image-building.rst
+++ b/doc/image-building.rst
@@ -56,6 +56,10 @@ want to push images to your dockerhub, change the namespace like:
$ tools/build.py -n yourusername --push
+The build script reads its configuration from ``/etc/kolla/kolla-build.conf``
+or ``etc/kolla/kolla-build.conf``. This is where to change the default
+settings.
+
Build Openstack from Source
---------------------------
diff --git a/etc/kolla/kolla-build.conf b/etc/kolla/kolla-build.conf
new file mode 100644
index 000000000..b682b3401
--- /dev/null
+++ b/etc/kolla/kolla-build.conf
@@ -0,0 +1,43 @@
+# Configuration for kolla build script
+
+[kolla-build]
+
+# The Docker namespace name
+#namespace = kollaglue
+
+# The Docker tag
+#tag = latest
+
+# The base distro to use when building
+#base = centos
+
+# The base distro image tag
+#base_tag = latest
+
+# The method of the OpenStack install
+#type = binary
+
+# Do not use Docker cache when building
+#no_cache = False
+
+# Keep failed intermediate containers
+#keep = False
+
+# Push images after building
+#push = False
+
+# The number of threads to use while building
+# Note: setting to one will allow real time logging
+#threads = 8
+
+# The number of times to retry while building
+#retries = 3
+
+# Turn on debugging log level
+#debug = False
+
+# Path to custome file to be addded at beginning of base Dockerfile
+#include_header = /path/to/header_file
+
+# Path to custome file to be addded at end of Dockerfiles for final images
+#include_footer = /path/to/footer_file
diff --git a/kolla/cmd/build.py b/kolla/cmd/build.py
index 3f21970f6..7859d1646 100755
--- a/kolla/cmd/build.py
+++ b/kolla/cmd/build.py
@@ -49,11 +49,11 @@ class KollaDirNotFoundException(Exception):
class WorkerThread(Thread):
- def __init__(self, queue, args):
+ def __init__(self, queue, config):
self.queue = queue
- self.nocache = args['no_cache']
- self.forcerm = not args['keep']
- self.retries = args['retries']
+ self.nocache = config['no_cache']
+ self.forcerm = not config['keep']
+ self.retries = config['retries']
self.dc = docker.Client(**docker.utils.kwargs_from_env())
super(WorkerThread, self).__init__()
@@ -189,54 +189,83 @@ class WorkerThread(Thread):
LOG.info('{}:Built'.format(image['name']))
-def arg_parser():
+def find_base_dir():
+ script_path = os.path.dirname(os.path.realpath(sys.argv[0]))
+ if os.path.basename(script_path) == 'cmd':
+ return os.path.join(script_path, '..', '..')
+ if os.path.basename(script_path) == 'bin':
+ return '/usr/share/kolla'
+ if os.path.exists(os.path.join(script_path, 'tests')):
+ return script_path
+ raise KollaDirNotFoundException(
+ 'I do not know where your Kolla directory is'
+ )
+
+
+def find_config_file(filename):
+ filepath = os.path.join('/etc/kolla', filename)
+ if os.access(filepath, os.R_OK):
+ config_file = filepath
+ else:
+ config_file = os.path.join(find_base_dir(),
+ 'etc', 'kolla', filename)
+ return config_file
+
+
+def merge_args_and_config(settings_from_config_file):
parser = argparse.ArgumentParser(description='Kolla build script')
+
+ defaults = {
+ "namespace": "kollaglue",
+ "tag": "latest",
+ "base": "centos",
+ "base_tag": "latest",
+ "type": "binary",
+ "no_cache": False,
+ "keep": False,
+ "push": False,
+ "threads": 8,
+ "retries": 3
+ }
+ defaults.update(settings_from_config_file.items('kolla-build'))
+ parser.set_defaults(**defaults)
+
parser.add_argument('regex',
help=('Build only images matching '
'regex and its dependencies'),
nargs='*')
parser.add_argument('-n', '--namespace',
help='Set the Docker namespace name',
- type=str,
- default='kollaglue')
+ type=str)
parser.add_argument('--tag',
help='Set the Docker tag',
- type=str,
- default='latest')
+ type=str)
parser.add_argument('-b', '--base',
help='The base distro to use when building',
- type=str,
- default='centos')
+ type=str)
parser.add_argument('--base-tag',
help='The base distro image tag',
- type=str,
- default='latest')
+ type=str)
parser.add_argument('-t', '--type',
help='The method of the Openstack install',
- type=str,
- default='binary')
+ type=str)
parser.add_argument('--no-cache',
help='Do not use the Docker cache when building',
- action='store_true',
- default=False)
+ action='store_true')
parser.add_argument('--keep',
help='Keep failed intermediate containers',
- action='store_true',
- default=False)
+ action='store_true')
parser.add_argument('--push',
help='Push images after building',
- action='store_true',
- default=False)
+ action='store_true')
parser.add_argument('-T', '--threads',
help='The number of threads to use while building.'
' (Note: setting to one will allow real time'
' logging.)',
- type=int,
- default=8)
+ type=int)
parser.add_argument('-r', '--retries',
help='The number of times to retry while building',
- type=int,
- default=3)
+ type=int)
parser.add_argument('--template',
help='DEPRECATED: All Dockerfiles are templates',
action='store_true',
@@ -257,33 +286,21 @@ def arg_parser():
class KollaWorker(object):
- def __init__(self, args):
- def find_base_dir():
- script_path = os.path.dirname(os.path.realpath(sys.argv[0]))
- if os.path.basename(script_path) == 'cmd':
- return os.path.join(script_path, '..', '..')
- if os.path.basename(script_path) == 'bin':
- return '/usr/share/kolla'
- if os.path.exists(os.path.join(script_path, 'tests')):
- return script_path
- raise KollaDirNotFoundException(
- 'I do not know where your Kolla directory is'
- )
-
+ def __init__(self, config):
self.base_dir = os.path.abspath(find_base_dir())
LOG.debug("Kolla base directory: " + self.base_dir)
self.images_dir = os.path.join(self.base_dir, 'docker')
- self.namespace = args['namespace']
- self.base = args['base']
- self.base_tag = args['base_tag']
- self.type_ = args['type']
- self.tag = args['tag']
+ self.namespace = config['namespace']
+ self.base = config['base']
+ self.base_tag = config['base_tag']
+ self.type_ = config['type']
+ self.tag = config['tag']
self.prefix = self.base + '-' + self.type_ + '-'
- self.config = ConfigParser.SafeConfigParser()
- self.config.read(os.path.join(self.base_dir, 'build.ini'))
- self.include_header = args['include_header']
- self.include_footer = args['include_footer']
- self.regex = args['regex']
+ self.source_location = ConfigParser.SafeConfigParser()
+ self.source_location.read(os.path.join(self.base_dir, 'build.ini'))
+ self.include_header = config['include_header']
+ self.include_footer = config['include_footer']
+ self.regex = config['regex']
self.image_statuses_bad = dict()
self.image_statuses_good = dict()
@@ -435,16 +452,18 @@ class KollaWorker(object):
if self.type_ == 'source':
image['source'] = dict()
try:
- image['source']['type'] = self.config.get(image['name'],
- 'type')
- image['source']['source'] = self.config.get(image['name'],
- 'location')
+ image['source']['type'] = \
+ self.source_location.get(image['name'], 'type')
+ image['source']['source'] = \
+ self.source_location.get(image['name'], 'location')
if image['source']['type'] == 'git':
image['source']['reference'] = \
- self.config.get(image['name'], 'reference')
+ self.source_location.get(image['name'],
+ 'reference')
except ConfigParser.NoSectionError:
- LOG.debug('{}:No config found'.format(image['name']))
+ LOG.debug('{}:No source location found'.format(
+ image['name']))
pass
self.images.append(image)
@@ -500,11 +519,13 @@ def push_image(image):
def main():
- args = arg_parser()
- if args['debug']:
+ build_config = ConfigParser.SafeConfigParser()
+ build_config.read(find_config_file('kolla-build.conf'))
+ config = merge_args_and_config(build_config)
+ if config['debug']:
LOG.setLevel(logging.DEBUG)
- kolla = KollaWorker(args)
+ kolla = KollaWorker(config)
kolla.setup_working_dir()
kolla.find_dockerfiles()
kolla.create_dockerfiles()
@@ -515,15 +536,15 @@ def main():
queue = kolla.build_queue()
- for x in xrange(args['threads']):
- worker = WorkerThread(queue, args)
+ for x in xrange(config['threads']):
+ worker = WorkerThread(queue, config)
worker.setDaemon(True)
worker.start()
# block until queue is empty
queue.join()
- if args['push']:
+ if config['push']:
for image in kolla.images:
if image['status'] == "built":
push_image(image)