diff --git a/tools/build.py b/tools/build.py index 8ece0d63cd..4f571c7905 100755 --- a/tools/build.py +++ b/tools/build.py @@ -22,6 +22,7 @@ import json import logging import os import Queue +import re import requests import shutil import signal @@ -125,6 +126,10 @@ class WorkerThread(Thread): def argParser(): parser = argparse.ArgumentParser(description='Kolla build script') + 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, @@ -197,9 +202,11 @@ class KollaWorker(object): self.config = ConfigParser.SafeConfigParser() self.config.read(os.path.join(sys.path[0], '..', 'build.ini')) self.include_header = args['include_header'] + self.regex = args['regex'] self.image_statuses_bad = {} self.image_statuses_good = {} + self.image_statuses_unproc = {} def setupWorkingDir(self): """Creates a working directory for use while building""" @@ -262,7 +269,23 @@ class KollaWorker(object): def sortImages(self): """Build images dependency tiers""" - images_to_process = list(self.images) + if self.regex: + patterns = re.compile(r'({})'.format("|".join(self.regex))) + images_to_process = list() + for image in self.images: + if re.search(patterns, image['fullname']): + images_to_process.append(image) + added = True + while added: + added = False + parents = [p['parent'] for p in images_to_process] + for image in self.images: + if (image['fullname'] in parents and + image not in images_to_process): + images_to_process.append(image) + added = True + else: + images_to_process = self.images self.tiers = list() while images_to_process: @@ -303,13 +326,18 @@ class KollaWorker(object): LOG.info("Successfully built images") LOG.info("=========================") for name in self.image_statuses_good.keys(): - LOG.info(name) + LOG.info(name) LOG.info("Images that failed to build") LOG.info("===========================") for name, status in self.image_statuses_bad.iteritems(): - LOG.error('{}\r\t\t\t Failed with status: {}'.format( - name, status)) + LOG.error('{}\r\t\t\t Failed with status: {}'.format( + name, status)) + + LOG.debug("Not processed images") + LOG.debug("=========================") + for name in self.image_statuses_unproc.keys(): + LOG.debug(name) def get_image_statuses(self): if len(self.image_statuses_bad) or len(self.image_statuses_good): @@ -317,6 +345,8 @@ class KollaWorker(object): for image in self.images: if image['status'] == "built": self.image_statuses_good[image['name']] = image['status'] + elif image['status'] == "unprocessed": + self.image_statuses_unproc[image['name']] = image['status'] else: self.image_statuses_bad[image['name']] = image['status'] return (self.image_statuses_bad, self.image_statuses_good)