From 378e571dd4665176cd5cba8f8509434068f64082 Mon Sep 17 00:00:00 2001 From: Ilya Chukhnakov Date: Mon, 26 Sep 2016 01:05:22 +0300 Subject: [PATCH] Controller service base This patch introduces an eventlet-based Kuryr-Kubernetes controller service base (based on oslo.service) and command-line launcher. Change-Id: Idfd5efd71d9dd7cb184905dd487eea4ba33b029e Partially-Implements: blueprint kuryr-k8s-integration --- kuryr_kubernetes/cmd/__init__.py | 0 kuryr_kubernetes/cmd/eventlet/__init__.py | 18 +++++++ kuryr_kubernetes/cmd/eventlet/controller.py | 22 ++++++++ kuryr_kubernetes/controller/__init__.py | 0 kuryr_kubernetes/controller/service.py | 53 +++++++++++++++++++ kuryr_kubernetes/tests/unit/cmd/__init__.py | 0 .../tests/unit/cmd/eventlet/__init__.py | 0 .../unit/cmd/eventlet/test_controller.py | 34 ++++++++++++ .../tests/unit/controller/__init__.py | 0 .../tests/unit/controller/test_service.py | 41 ++++++++++++++ requirements.txt | 2 + scripts/run_server.py | 4 +- setup.cfg | 2 +- 13 files changed, 173 insertions(+), 3 deletions(-) create mode 100644 kuryr_kubernetes/cmd/__init__.py create mode 100644 kuryr_kubernetes/cmd/eventlet/__init__.py create mode 100644 kuryr_kubernetes/cmd/eventlet/controller.py create mode 100644 kuryr_kubernetes/controller/__init__.py create mode 100644 kuryr_kubernetes/controller/service.py create mode 100644 kuryr_kubernetes/tests/unit/cmd/__init__.py create mode 100644 kuryr_kubernetes/tests/unit/cmd/eventlet/__init__.py create mode 100644 kuryr_kubernetes/tests/unit/cmd/eventlet/test_controller.py create mode 100644 kuryr_kubernetes/tests/unit/controller/__init__.py create mode 100644 kuryr_kubernetes/tests/unit/controller/test_service.py diff --git a/kuryr_kubernetes/cmd/__init__.py b/kuryr_kubernetes/cmd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/kuryr_kubernetes/cmd/eventlet/__init__.py b/kuryr_kubernetes/cmd/eventlet/__init__.py new file mode 100644 index 000000000..db423fc99 --- /dev/null +++ b/kuryr_kubernetes/cmd/eventlet/__init__.py @@ -0,0 +1,18 @@ +# Copyright (c) 2016 Mirantis, Inc. +# All Rights Reserved. +# +# 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. + +import eventlet + +eventlet.monkey_patch() diff --git a/kuryr_kubernetes/cmd/eventlet/controller.py b/kuryr_kubernetes/cmd/eventlet/controller.py new file mode 100644 index 000000000..ef560d4ea --- /dev/null +++ b/kuryr_kubernetes/cmd/eventlet/controller.py @@ -0,0 +1,22 @@ +# Copyright (c) 2016 Mirantis, Inc. +# All Rights Reserved. +# +# 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 kuryr_kubernetes.controller import service + + +start = service.start + +if __name__ == '__main__': + start() diff --git a/kuryr_kubernetes/controller/__init__.py b/kuryr_kubernetes/controller/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/kuryr_kubernetes/controller/service.py b/kuryr_kubernetes/controller/service.py new file mode 100644 index 000000000..2089a6ce2 --- /dev/null +++ b/kuryr_kubernetes/controller/service.py @@ -0,0 +1,53 @@ +# Copyright (c) 2016 Mirantis, Inc. +# All Rights Reserved. +# +# 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. + +import sys + +from kuryr.lib._i18n import _LI +from oslo_log import log as logging +from oslo_service import service + +from kuryr_kubernetes import clients +from kuryr_kubernetes import config + +LOG = logging.getLogger(__name__) + + +class KuryrK8sService(service.Service): + """Kuryr-Kubernetes controller Service.""" + + def __init__(self): + super(KuryrK8sService, self).__init__() + + def start(self): + LOG.info(_LI("Service '%s' starting"), self.__class__.__name__) + super(KuryrK8sService, self).start() + LOG.info(_LI("Service '%s' started"), self.__class__.__name__) + + def wait(self): + super(KuryrK8sService, self).wait() + LOG.info(_LI("Service '%s' stopped"), self.__class__.__name__) + + def stop(self, graceful=False): + LOG.info(_LI("Service '%s' stopping"), self.__class__.__name__) + super(KuryrK8sService, self).stop(graceful) + + +def start(): + config.init(sys.argv[1:]) + config.setup_logging() + clients.setup_clients() + kuryrk8s_launcher = service.launch(config.CONF, KuryrK8sService()) + kuryrk8s_launcher.wait() diff --git a/kuryr_kubernetes/tests/unit/cmd/__init__.py b/kuryr_kubernetes/tests/unit/cmd/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/kuryr_kubernetes/tests/unit/cmd/eventlet/__init__.py b/kuryr_kubernetes/tests/unit/cmd/eventlet/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/kuryr_kubernetes/tests/unit/cmd/eventlet/test_controller.py b/kuryr_kubernetes/tests/unit/cmd/eventlet/test_controller.py new file mode 100644 index 000000000..79bd1b761 --- /dev/null +++ b/kuryr_kubernetes/tests/unit/cmd/eventlet/test_controller.py @@ -0,0 +1,34 @@ +# Copyright (c) 2016 Mirantis, Inc. +# All Rights Reserved. +# +# 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. + +import mock + +from kuryr_kubernetes.tests import base as test_base + + +class TestControllerCmd(test_base.TestCase): + + @mock.patch('kuryr_kubernetes.controller.service.start') + @mock.patch('eventlet.monkey_patch') + def test_start(self, m_evmp, m_start): + # NOTE(ivc): eventlet.monkey_patch is invoked during the module + # import, so the controller cmd has to be imported locally to verify + # that monkey_patch is called + from kuryr_kubernetes.cmd.eventlet import controller + + controller.start() + + m_evmp.assert_called() + m_start.assert_called() diff --git a/kuryr_kubernetes/tests/unit/controller/__init__.py b/kuryr_kubernetes/tests/unit/controller/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/kuryr_kubernetes/tests/unit/controller/test_service.py b/kuryr_kubernetes/tests/unit/controller/test_service.py new file mode 100644 index 000000000..8ea63d79b --- /dev/null +++ b/kuryr_kubernetes/tests/unit/controller/test_service.py @@ -0,0 +1,41 @@ +# Copyright (c) 2016 Mirantis, Inc. +# All Rights Reserved. +# +# 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. + +import mock + +from kuryr_kubernetes.controller import service +from kuryr_kubernetes.tests import base as test_base + + +class TestControllerService(test_base.TestCase): + + @mock.patch('oslo_service.service.launch') + @mock.patch('kuryr_kubernetes.config.init') + @mock.patch('kuryr_kubernetes.config.setup_logging') + @mock.patch('kuryr_kubernetes.clients.setup_clients') + @mock.patch('kuryr_kubernetes.controller.service.KuryrK8sService') + def test_start(self, m_svc, m_setup_clients, m_setup_logging, + m_config_init, m_oslo_launch): + m_launcher = mock.Mock() + m_oslo_launch.return_value = m_launcher + + service.start() + + m_config_init.assert_called() + m_setup_logging.assert_called() + m_setup_clients.assert_called() + m_svc.assert_called() + m_oslo_launch.assert_called() + m_launcher.wait.assert_called() diff --git a/requirements.txt b/requirements.txt index 575889ec8..01a0a93cd 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,9 +5,11 @@ -e git://github.com/openstack/kuryr.git@master#egg=kuryr_lib pbr>=1.6 # Apache-2.0 requests>=2.10.0 # Apache-2.0 +eventlet!=0.18.3,>=0.18.2 # MIT oslo.config>=3.14.0 # Apache-2.0 oslo.i18n>=2.1.0 # Apache-2.0 oslo.log>=3.11.0 # Apache-2.0 oslo.serialization>=1.10.0 # Apache-2.0 +oslo.service>=1.10.0 # Apache-2.0 oslo.utils>=3.16.0 # Apache-2.0 six>=1.9.0 # MIT diff --git a/scripts/run_server.py b/scripts/run_server.py index ccf40c1f0..88388d531 100644 --- a/scripts/run_server.py +++ b/scripts/run_server.py @@ -12,6 +12,6 @@ # License for the specific language governing permissions and limitations # under the License. -from kuryr_kubernetes import server +from kuryr_kubernetes.cmd.eventlet import controller -server.start() +controller.start() diff --git a/setup.cfg b/setup.cfg index 5decb4a14..476e3c832 100644 --- a/setup.cfg +++ b/setup.cfg @@ -22,7 +22,7 @@ oslo.config.opts = kuryr_lib = kuryr.lib.opts:list_kuryr_opts console_scripts = - kuryr-k8s = kuryr_kubernetes.server:start + kuryr-k8s-controller = kuryr_kubernetes.cmd.eventlet.controller:start [files] packages =