From 9f7922a7ca2eb3e9ee1c15fcb78fc2706fffb280 Mon Sep 17 00:00:00 2001 From: Hongbin Lu Date: Sat, 18 Jan 2020 22:16:59 +0000 Subject: [PATCH] Load container driver from entry point Change-Id: I66fed92c4f67b4552aca3bd8d81b6dda32d70442 --- devstack/lib/zun | 2 +- .../container_driver-e82fe9c64c9b994b.yaml | 11 +++++++++++ setup.cfg | 4 ++++ zun/conf/container_driver.py | 4 ++-- zun/container/driver.py | 19 +++++++++++++++++-- .../unit/compute/test_compute_manager.py | 4 +--- 6 files changed, 36 insertions(+), 8 deletions(-) create mode 100644 releasenotes/notes/container_driver-e82fe9c64c9b994b.yaml diff --git a/devstack/lib/zun b/devstack/lib/zun index b5cd46bad..d014b9eb7 100644 --- a/devstack/lib/zun +++ b/devstack/lib/zun @@ -174,7 +174,7 @@ function create_zun_conf { # (Re)create ``zun.conf`` rm -f $ZUN_CONF if [[ ${ZUN_DRIVER} == "docker" ]]; then - iniset $ZUN_CONF DEFAULT container_driver docker.driver.DockerDriver + iniset $ZUN_CONF DEFAULT container_driver docker fi iniset $ZUN_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL" if [[ $SERVICE_IP_VERSION == 6 ]]; then diff --git a/releasenotes/notes/container_driver-e82fe9c64c9b994b.yaml b/releasenotes/notes/container_driver-e82fe9c64c9b994b.yaml new file mode 100644 index 000000000..bd5dbf3a3 --- /dev/null +++ b/releasenotes/notes/container_driver-e82fe9c64c9b994b.yaml @@ -0,0 +1,11 @@ +--- +upgrade: + - | + Starting from this release, container driver is loaded from entry point. + Deployers should specify the entry point (i.e. ``docker``) in config option + ``container_driver`` under ``[DEFAULT]`` session. +deprecations: + - | + Specifying container driver class via config option ``container_driver`` + is deprecated. Use driver name in entry point ``zun.container.driver`` + instead. diff --git a/setup.cfg b/setup.cfg index 60d0a5880..0141229ec 100644 --- a/setup.cfg +++ b/setup.cfg @@ -68,6 +68,10 @@ zun.scheduler.driver = fake_scheduler = zun.tests.unit.scheduler.fakes:FakeScheduler filter_scheduler = zun.scheduler.filter_scheduler:FilterScheduler +zun.container.driver = + docker = zun.container.docker.driver:DockerDriver + fake = zun.tests.unit.container.fake_driver:FakeDriver + zun.image.driver = glance = zun.image.glance.driver:GlanceDriver docker = zun.image.docker.driver:DockerDriver diff --git a/zun/conf/container_driver.py b/zun/conf/container_driver.py index 92813f19d..fa27d75f9 100644 --- a/zun/conf/container_driver.py +++ b/zun/conf/container_driver.py @@ -15,11 +15,11 @@ from oslo_config import cfg driver_opts = [ cfg.StrOpt('container_driver', - default='docker.driver.DockerDriver', + default='docker', help="""Defines which driver to use for controlling container. Possible values: -* ``docker.driver.DockerDriver`` +* ``docker`` Services which consume this: diff --git a/zun/container/driver.py b/zun/container/driver.py index e309d75db..0fad80a66 100644 --- a/zun/container/driver.py +++ b/zun/container/driver.py @@ -18,6 +18,7 @@ import os_resource_classes as orc from oslo_log import log as logging from oslo_utils import importutils from oslo_utils import units +from stevedore import driver as stevedore_driver from zun.common.i18n import _ from zun.common import utils @@ -51,9 +52,23 @@ def load_container_driver(container_driver=None): LOG.info("Loading container driver '%s'", container_driver) try: - if not container_driver.startswith('zun.'): + if container_driver.startswith('docker.driver.'): + # case 1: (deprecated) CONF.container_driver is + # 'docker.driver.DockerDriver' container_driver = 'zun.container.%s' % container_driver - driver = importutils.import_object(container_driver) + driver = importutils.import_object(container_driver) + elif container_driver.startswith('zun.'): + # case 2: (deprecated) CONF.container_driver is + # 'zun.container.docker.driver.DockerDriver' + driver = importutils.import_object(container_driver) + else: + # case 3: CONF.container_driver is (for example) 'docker' + # load from entry point in this case. + driver = stevedore_driver.DriverManager( + "zun.container.driver", + container_driver, + invoke_on_load=True).driver + if not isinstance(driver, ContainerDriver): raise Exception(_('Expected driver of type: %s') % str(ContainerDriver)) diff --git a/zun/tests/unit/compute/test_compute_manager.py b/zun/tests/unit/compute/test_compute_manager.py index 3cae80df9..a20b4fbfe 100644 --- a/zun/tests/unit/compute/test_compute_manager.py +++ b/zun/tests/unit/compute/test_compute_manager.py @@ -99,9 +99,7 @@ class TestManager(base.TestCase): p.start() self.addCleanup(p.stop) - zun.conf.CONF.set_override( - 'container_driver', - 'zun.tests.unit.container.fake_driver.FakeDriver') + zun.conf.CONF.set_override('container_driver', 'fake') self.compute_manager = manager.Manager() self.compute_manager._resource_tracker = FakeResourceTracker()