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:
Marcin Juszkiewicz 2022-10-05 17:18:21 +02:00
parent 8dd52300c0
commit aee19bd1c4
3 changed files with 76 additions and 59 deletions

View File

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

View File

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