From b3e8ac8371a497aed6270358062cdfe4952a37ae Mon Sep 17 00:00:00 2001
From: Mark Goddard <mgoddard@cray.com>
Date: Tue, 31 May 2016 12:01:06 -0500
Subject: [PATCH] Don't always unpack image build results tuple, as it may be
 None

Change-Id: I21b1327da1de1bd3cc3018ba37715b0a19c1dbef
Closes-Bug: #1587501
---
 kolla/cmd/build.py        | 16 +++++++++++-----
 kolla/tests/test_build.py | 27 +++++++++++++++++++++++++++
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/kolla/cmd/build.py b/kolla/cmd/build.py
index 18ff68503d..779ac76978 100755
--- a/kolla/cmd/build.py
+++ b/kolla/cmd/build.py
@@ -738,6 +738,11 @@ class KollaWorker(object):
 
 
 def run_build():
+    """Build container images.
+
+    :return: A 3-tuple containing bad, good, and unmatched container image
+    status dicts, or None if no images were built.
+    """
     conf = cfg.ConfigOpts()
     common_config.parse(conf, sys.argv[1:], prog='kolla-build')
 
@@ -792,11 +797,12 @@ def run_build():
 
 
 def main():
-    bad_results, good_results, unmatched_results = run_build()
-    if len(bad_results):
-        return 1
-    else:
-        return 0
+    statuses = run_build()
+    if statuses:
+        bad_results, good_results, unmatched_results = statuses
+        if bad_results:
+            return 1
+    return 0
 
 
 if __name__ == '__main__':
diff --git a/kolla/tests/test_build.py b/kolla/tests/test_build.py
index b6eeffa7d0..cc55bd48aa 100644
--- a/kolla/tests/test_build.py
+++ b/kolla/tests/test_build.py
@@ -218,3 +218,30 @@ class KollaWorkerTest(base.TestCase):
         kolla.images = self.images
         self.assertRaises(ValueError,
                           kolla.filter_images)
+
+
+@mock.patch.object(build, 'run_build')
+class MainTest(base.TestCase):
+
+    def test_images_built(self, mock_run_build):
+        image_statuses = ({}, {'img': 'built'}, {})
+        mock_run_build.return_value = image_statuses
+        result = build.main()
+        self.assertEqual(0, result)
+
+    def test_images_unmatched(self, mock_run_build):
+        image_statuses = ({}, {}, {'img': 'unmatched'})
+        mock_run_build.return_value = image_statuses
+        result = build.main()
+        self.assertEqual(0, result)
+
+    def test_no_images_built(self, mock_run_build):
+        mock_run_build.return_value = None
+        result = build.main()
+        self.assertEqual(0, result)
+
+    def test_bad_images(self, mock_run_build):
+        image_statuses = ({'img': 'error'}, {}, {})
+        mock_run_build.return_value = image_statuses
+        result = build.main()
+        self.assertEqual(1, result)