Move status and log related things to separate file
As part of kolla/image/ refactoring we move status enums/consts into own file. Based on patch by Konstantin Yarovoy <konstantin.yarovoy@tietoevry.com> Change-Id: I940816c7e487f6d5c7abc4446226e2992cf9e63d
This commit is contained in:
parent
8dd52300c0
commit
aee19bd1c4
@ -29,7 +29,6 @@ import threading
|
||||
import time
|
||||
|
||||
import docker
|
||||
from enum import Enum
|
||||
import git
|
||||
import jinja2
|
||||
from oslo_config import cfg
|
||||
@ -48,33 +47,15 @@ from kolla.common import config as common_config # noqa
|
||||
from kolla.common import task # noqa
|
||||
from kolla.common import utils # noqa
|
||||
from kolla.image.unbuildable import UNBUILDABLE_IMAGES # noqa
|
||||
from kolla.image.utils import LOG # noqa
|
||||
from kolla.image.utils import Status # noqa
|
||||
from kolla.image.utils import STATUS_ERRORS # noqa
|
||||
from kolla import exception # noqa
|
||||
from kolla.template import filters as jinja_filters # noqa
|
||||
from kolla.template import methods as jinja_methods # noqa
|
||||
from kolla import version # noqa
|
||||
|
||||
|
||||
class Status(Enum):
|
||||
CONNECTION_ERROR = 'connection_error'
|
||||
PUSH_ERROR = 'push_error'
|
||||
ERROR = 'error'
|
||||
PARENT_ERROR = 'parent_error'
|
||||
BUILT = 'built'
|
||||
BUILDING = 'building'
|
||||
UNMATCHED = 'unmatched'
|
||||
MATCHED = 'matched'
|
||||
UNPROCESSED = 'unprocessed'
|
||||
SKIPPED = 'skipped'
|
||||
UNBUILDABLE = 'unbuildable'
|
||||
|
||||
|
||||
# All error status constants.
|
||||
STATUS_ERRORS = (Status.CONNECTION_ERROR, Status.PUSH_ERROR,
|
||||
Status.ERROR, Status.PARENT_ERROR)
|
||||
|
||||
LOG = utils.make_a_logger()
|
||||
|
||||
|
||||
class ArchivingError(Exception):
|
||||
pass
|
||||
|
||||
|
35
kolla/image/utils.py
Normal file
35
kolla/image/utils.py
Normal file
@ -0,0 +1,35 @@
|
||||
# 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.
|
||||
|
||||
from enum import Enum
|
||||
from kolla.common import utils # noqa
|
||||
|
||||
|
||||
class Status(Enum):
|
||||
CONNECTION_ERROR = 'connection_error'
|
||||
PUSH_ERROR = 'push_error'
|
||||
ERROR = 'error'
|
||||
PARENT_ERROR = 'parent_error'
|
||||
BUILT = 'built'
|
||||
BUILDING = 'building'
|
||||
UNMATCHED = 'unmatched'
|
||||
MATCHED = 'matched'
|
||||
UNPROCESSED = 'unprocessed'
|
||||
SKIPPED = 'skipped'
|
||||
UNBUILDABLE = 'unbuildable'
|
||||
|
||||
|
||||
# All error status constants.
|
||||
STATUS_ERRORS = (Status.CONNECTION_ERROR, Status.PUSH_ERROR,
|
||||
Status.ERROR, Status.PARENT_ERROR)
|
||||
|
||||
LOG = utils.make_a_logger()
|
@ -18,33 +18,34 @@ from unittest import mock
|
||||
|
||||
from kolla.cmd import build as build_cmd
|
||||
from kolla.image import build
|
||||
from kolla.image import utils
|
||||
from kolla.tests import base
|
||||
|
||||
|
||||
FAKE_IMAGE = build.Image(
|
||||
'image-base', 'image-base:latest',
|
||||
'/fake/path', parent_name=None,
|
||||
parent=None, status=build.Status.MATCHED)
|
||||
parent=None, status=utils.Status.MATCHED)
|
||||
FAKE_IMAGE_CHILD = build.Image(
|
||||
'image-child', 'image-child:latest',
|
||||
'/fake/path2', parent_name='image-base',
|
||||
parent=FAKE_IMAGE, status=build.Status.MATCHED)
|
||||
parent=FAKE_IMAGE, status=utils.Status.MATCHED)
|
||||
FAKE_IMAGE_CHILD_UNMATCHED = build.Image(
|
||||
'image-child-unmatched', 'image-child-unmatched:latest',
|
||||
'/fake/path3', parent_name='image-base',
|
||||
parent=FAKE_IMAGE, status=build.Status.UNMATCHED)
|
||||
parent=FAKE_IMAGE, status=utils.Status.UNMATCHED)
|
||||
FAKE_IMAGE_CHILD_ERROR = build.Image(
|
||||
'image-child-error', 'image-child-error:latest',
|
||||
'/fake/path4', parent_name='image-base',
|
||||
parent=FAKE_IMAGE, status=build.Status.ERROR)
|
||||
parent=FAKE_IMAGE, status=utils.Status.ERROR)
|
||||
FAKE_IMAGE_CHILD_BUILT = build.Image(
|
||||
'image-child-built', 'image-child-built:latest',
|
||||
'/fake/path5', parent_name='image-base',
|
||||
parent=FAKE_IMAGE, status=build.Status.BUILT)
|
||||
parent=FAKE_IMAGE, status=utils.Status.BUILT)
|
||||
FAKE_IMAGE_GRANDCHILD = build.Image(
|
||||
'image-grandchild', 'image-grandchild:latest',
|
||||
'/fake/path6', parent_name='image-child',
|
||||
parent=FAKE_IMAGE_CHILD, status=build.Status.MATCHED)
|
||||
parent=FAKE_IMAGE_CHILD, status=utils.Status.MATCHED)
|
||||
|
||||
|
||||
class TasksTest(base.TestCase):
|
||||
@ -80,7 +81,7 @@ class TasksTest(base.TestCase):
|
||||
mock_client().push.assert_called_once_with(
|
||||
self.image.canonical_name, decode=True, stream=True)
|
||||
self.assertFalse(pusher.success)
|
||||
self.assertEqual(build.Status.PUSH_ERROR, self.image.status)
|
||||
self.assertEqual(utils.Status.PUSH_ERROR, self.image.status)
|
||||
|
||||
@mock.patch.dict(os.environ, clear=True)
|
||||
@mock.patch('docker.APIClient')
|
||||
@ -93,14 +94,14 @@ class TasksTest(base.TestCase):
|
||||
mock_client().push.assert_called_once_with(
|
||||
self.image.canonical_name, decode=True, stream=True)
|
||||
self.assertFalse(pusher.success)
|
||||
self.assertEqual(build.Status.PUSH_ERROR, self.image.status)
|
||||
self.assertEqual(utils.Status.PUSH_ERROR, self.image.status)
|
||||
|
||||
# Try again, this time without exception.
|
||||
pusher.reset()
|
||||
pusher.run()
|
||||
self.assertEqual(2, mock_client().push.call_count)
|
||||
self.assertTrue(pusher.success)
|
||||
self.assertEqual(build.Status.BUILT, self.image.status)
|
||||
self.assertEqual(utils.Status.BUILT, self.image.status)
|
||||
|
||||
@mock.patch.dict(os.environ, clear=True)
|
||||
@mock.patch('docker.APIClient')
|
||||
@ -114,7 +115,7 @@ class TasksTest(base.TestCase):
|
||||
mock_client().push.assert_called_once_with(
|
||||
self.image.canonical_name, decode=True, stream=True)
|
||||
self.assertFalse(pusher.success)
|
||||
self.assertEqual(build.Status.PUSH_ERROR, self.image.status)
|
||||
self.assertEqual(utils.Status.PUSH_ERROR, self.image.status)
|
||||
|
||||
@mock.patch.dict(os.environ, clear=True)
|
||||
@mock.patch('docker.APIClient')
|
||||
@ -128,7 +129,7 @@ class TasksTest(base.TestCase):
|
||||
mock_client().push.assert_called_once_with(
|
||||
self.image.canonical_name, decode=True, stream=True)
|
||||
self.assertFalse(pusher.success)
|
||||
self.assertEqual(build.Status.PUSH_ERROR, self.image.status)
|
||||
self.assertEqual(utils.Status.PUSH_ERROR, self.image.status)
|
||||
|
||||
# Try again, this time without exception.
|
||||
mock_client().push.return_value = [{'stream': 'mock push passes'}]
|
||||
@ -136,7 +137,7 @@ class TasksTest(base.TestCase):
|
||||
pusher.run()
|
||||
self.assertEqual(2, mock_client().push.call_count)
|
||||
self.assertTrue(pusher.success)
|
||||
self.assertEqual(build.Status.BUILT, self.image.status)
|
||||
self.assertEqual(utils.Status.BUILT, self.image.status)
|
||||
|
||||
@mock.patch.dict(os.environ, clear=True)
|
||||
@mock.patch('docker.APIClient')
|
||||
@ -246,7 +247,7 @@ class TasksTest(base.TestCase):
|
||||
get_result = builder.process_source(self.image, self.image.source)
|
||||
|
||||
self.assertIsNone(get_result)
|
||||
self.assertEqual(self.image.status, build.Status.ERROR)
|
||||
self.assertEqual(self.image.status, utils.Status.ERROR)
|
||||
mock_get.assert_called_once_with(self.image.source['source'],
|
||||
timeout=120)
|
||||
|
||||
@ -279,7 +280,7 @@ class TasksTest(base.TestCase):
|
||||
push_queue = mock.Mock()
|
||||
builder = build.BuildTask(self.conf, self.image, push_queue)
|
||||
get_result = builder.process_source(self.image, self.image.source)
|
||||
self.assertEqual(self.image.status, build.Status.ERROR)
|
||||
self.assertEqual(self.image.status, utils.Status.ERROR)
|
||||
self.assertFalse(builder.success)
|
||||
if source['type'] != 'local':
|
||||
self.assertIsNone(get_result)
|
||||
@ -305,7 +306,7 @@ class TasksTest(base.TestCase):
|
||||
|
||||
mock_rmtree.assert_called_with(
|
||||
"fake_image_path/fake-image1-archive-fake-reference1")
|
||||
self.assertEqual(self.image.status, build.Status.ERROR)
|
||||
self.assertEqual(self.image.status, utils.Status.ERROR)
|
||||
self.assertFalse(builder.success)
|
||||
self.assertIsNone(get_result)
|
||||
|
||||
@ -426,20 +427,20 @@ class KollaWorkerTest(base.TestCase):
|
||||
|
||||
def _get_matched_images(self, images):
|
||||
return [image for image in images
|
||||
if image.status == build.Status.MATCHED]
|
||||
if image.status == utils.Status.MATCHED]
|
||||
|
||||
def test_skip_parents(self):
|
||||
self.conf.set_override('skip_parents', True)
|
||||
kolla = build.KollaWorker(self.conf)
|
||||
kolla.images = self.images[:2]
|
||||
for i in kolla.images:
|
||||
i.status = build.Status.UNPROCESSED
|
||||
i.status = utils.Status.UNPROCESSED
|
||||
if i.parent:
|
||||
i.parent.children.append(i)
|
||||
kolla.filter_images()
|
||||
|
||||
self.assertEqual(build.Status.MATCHED, kolla.images[1].status)
|
||||
self.assertEqual(build.Status.SKIPPED, kolla.images[1].parent.status)
|
||||
self.assertEqual(utils.Status.MATCHED, kolla.images[1].status)
|
||||
self.assertEqual(utils.Status.SKIPPED, kolla.images[1].parent.status)
|
||||
|
||||
def test_skip_parents_regex(self):
|
||||
self.conf.set_override('regex', ['image-child'])
|
||||
@ -447,13 +448,13 @@ class KollaWorkerTest(base.TestCase):
|
||||
kolla = build.KollaWorker(self.conf)
|
||||
kolla.images = self.images[:2]
|
||||
for i in kolla.images:
|
||||
i.status = build.Status.UNPROCESSED
|
||||
i.status = utils.Status.UNPROCESSED
|
||||
if i.parent:
|
||||
i.parent.children.append(i)
|
||||
kolla.filter_images()
|
||||
|
||||
self.assertEqual(build.Status.MATCHED, kolla.images[1].status)
|
||||
self.assertEqual(build.Status.SKIPPED, kolla.images[1].parent.status)
|
||||
self.assertEqual(utils.Status.MATCHED, kolla.images[1].status)
|
||||
self.assertEqual(utils.Status.SKIPPED, kolla.images[1].parent.status)
|
||||
|
||||
def test_skip_parents_match_grandchildren(self):
|
||||
self.conf.set_override('skip_parents', True)
|
||||
@ -463,14 +464,14 @@ class KollaWorkerTest(base.TestCase):
|
||||
self.images[1].children.append(image_grandchild)
|
||||
kolla.images = self.images[:2] + [image_grandchild]
|
||||
for i in kolla.images:
|
||||
i.status = build.Status.UNPROCESSED
|
||||
i.status = utils.Status.UNPROCESSED
|
||||
if i.parent:
|
||||
i.parent.children.append(i)
|
||||
kolla.filter_images()
|
||||
|
||||
self.assertEqual(build.Status.MATCHED, kolla.images[2].status)
|
||||
self.assertEqual(build.Status.SKIPPED, kolla.images[2].parent.status)
|
||||
self.assertEqual(build.Status.SKIPPED, kolla.images[1].parent.status)
|
||||
self.assertEqual(utils.Status.MATCHED, kolla.images[2].status)
|
||||
self.assertEqual(utils.Status.SKIPPED, kolla.images[2].parent.status)
|
||||
self.assertEqual(utils.Status.SKIPPED, kolla.images[1].parent.status)
|
||||
|
||||
def test_skip_parents_match_grandchildren_regex(self):
|
||||
self.conf.set_override('regex', ['image-grandchild'])
|
||||
@ -481,14 +482,14 @@ class KollaWorkerTest(base.TestCase):
|
||||
self.images[1].children.append(image_grandchild)
|
||||
kolla.images = self.images[:2] + [image_grandchild]
|
||||
for i in kolla.images:
|
||||
i.status = build.Status.UNPROCESSED
|
||||
i.status = utils.Status.UNPROCESSED
|
||||
if i.parent:
|
||||
i.parent.children.append(i)
|
||||
kolla.filter_images()
|
||||
|
||||
self.assertEqual(build.Status.MATCHED, kolla.images[2].status)
|
||||
self.assertEqual(build.Status.SKIPPED, kolla.images[2].parent.status)
|
||||
self.assertEqual(build.Status.SKIPPED, kolla.images[1].parent.status)
|
||||
self.assertEqual(utils.Status.MATCHED, kolla.images[2].status)
|
||||
self.assertEqual(utils.Status.SKIPPED, kolla.images[2].parent.status)
|
||||
self.assertEqual(utils.Status.SKIPPED, kolla.images[1].parent.status)
|
||||
|
||||
@mock.patch.object(build.Image, 'in_docker_cache')
|
||||
def test_skip_existing(self, mock_in_cache):
|
||||
@ -497,11 +498,11 @@ class KollaWorkerTest(base.TestCase):
|
||||
kolla = build.KollaWorker(self.conf)
|
||||
kolla.images = self.images[:2]
|
||||
for i in kolla.images:
|
||||
i.status = build.Status.UNPROCESSED
|
||||
i.status = utils.Status.UNPROCESSED
|
||||
kolla.filter_images()
|
||||
|
||||
self.assertEqual(build.Status.SKIPPED, kolla.images[0].status)
|
||||
self.assertEqual(build.Status.MATCHED, kolla.images[1].status)
|
||||
self.assertEqual(utils.Status.SKIPPED, kolla.images[0].status)
|
||||
self.assertEqual(utils.Status.MATCHED, kolla.images[1].status)
|
||||
|
||||
def test_without_profile(self):
|
||||
kolla = build.KollaWorker(self.conf)
|
||||
@ -602,10 +603,10 @@ class KollaWorkerTest(base.TestCase):
|
||||
def test_summary(self):
|
||||
kolla = build.KollaWorker(self.conf)
|
||||
kolla.images = self.images
|
||||
kolla.image_statuses_good['good'] = build.Status.BUILT
|
||||
kolla.image_statuses_bad['bad'] = build.Status.ERROR
|
||||
kolla.image_statuses_allowed_to_fail['bad2'] = build.Status.ERROR
|
||||
kolla.image_statuses_unmatched['unmatched'] = build.Status.UNMATCHED
|
||||
kolla.image_statuses_good['good'] = utils.Status.BUILT
|
||||
kolla.image_statuses_bad['bad'] = utils.Status.ERROR
|
||||
kolla.image_statuses_allowed_to_fail['bad2'] = utils.Status.ERROR
|
||||
kolla.image_statuses_unmatched['unmatched'] = utils.Status.UNMATCHED
|
||||
results = kolla.summary()
|
||||
self.assertEqual('error', results['failed'][0]['status']) # bad
|
||||
self.assertEqual('error', results['failed'][1]['status']) # bad2
|
||||
|
Loading…
Reference in New Issue
Block a user