From 85112a457adac3f53ef9cce92f95eb2c938918f1 Mon Sep 17 00:00:00 2001 From: John Garbutt Date: Tue, 12 Sep 2023 18:16:32 +0100 Subject: [PATCH] Add a stub cluster_api driver (#1) The plan is to slowly build up the ability to create K8s CRDs instead of heat templates in a separate driver. The starting point is adding the new experimental driver. Extracted from: https://review.opendev.org/c/openstack/magnum/+/815521 Change-Id: I32b7a91640f4f65b9662de080682761a2c182055 --- magnum_capi_helm/driver.py | 85 +++++++++++ magnum_capi_helm/tests/test_driver.py | 141 ++++++++++++++++++ .../tests/test_magnum_capi_helm.py | 17 +-- setup.cfg | 4 + tox.ini | 6 +- 5 files changed, 238 insertions(+), 15 deletions(-) create mode 100644 magnum_capi_helm/driver.py create mode 100644 magnum_capi_helm/tests/test_driver.py diff --git a/magnum_capi_helm/driver.py b/magnum_capi_helm/driver.py new file mode 100644 index 0000000..a05baaf --- /dev/null +++ b/magnum_capi_helm/driver.py @@ -0,0 +1,85 @@ +# 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 oslo_log import log as logging + +from magnum.drivers.common import driver + +LOG = logging.getLogger(__name__) + + +class Driver(driver.Driver): + @property + def provides(self): + return [ + { + "server_type": "vm", + # TODO(johngarbutt) OS list should probably come from config? + "os": "ubuntu", + "coe": "kubernetes", + }, + ] + + def update_cluster_status(self, context, cluster): + raise NotImplementedError("don't support update_cluster_status yet") + + def create_cluster(self, context, cluster, cluster_create_timeout): + raise NotImplementedError("don't support create yet") + + def update_cluster( + self, context, cluster, scale_manager=None, rollback=False + ): + raise NotImplementedError("don't support update yet") + + def delete_cluster(self, context, cluster): + raise NotImplementedError("don't support delete yet") + + def resize_cluster( + self, + context, + cluster, + resize_manager, + node_count, + nodes_to_remove, + nodegroup=None, + ): + raise NotImplementedError("don't support removing nodes this way yet") + + def upgrade_cluster( + self, + context, + cluster, + cluster_template, + max_batch_size, + nodegroup, + scale_manager=None, + rollback=False, + ): + raise NotImplementedError("don't support upgrade yet") + + def create_nodegroup(self, context, cluster, nodegroup): + raise NotImplementedError("we don't support node groups yet") + + def update_nodegroup(self, context, cluster, nodegroup): + raise NotImplementedError("we don't support node groups yet") + + def delete_nodegroup(self, context, cluster, nodegroup): + raise NotImplementedError("we don't support node groups yet") + + def create_federation(self, context, federation): + raise NotImplementedError("Will not implement 'create_federation'") + + def update_federation(self, context, federation): + raise NotImplementedError("Will not implement 'update_federation'") + + def delete_federation(self, context, federation): + raise NotImplementedError("Will not implement 'delete_federation'") diff --git a/magnum_capi_helm/tests/test_driver.py b/magnum_capi_helm/tests/test_driver.py new file mode 100644 index 0000000..433538a --- /dev/null +++ b/magnum_capi_helm/tests/test_driver.py @@ -0,0 +1,141 @@ +# 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 magnum import objects +from magnum.tests.unit.db import base +from magnum.tests.unit.objects import utils as obj_utils + +from magnum_capi_helm import driver + + +class ClusterAPIDriverTest(base.DbTestCase): + def setUp(self): + super(ClusterAPIDriverTest, self).setUp() + self.driver = driver.Driver() + self.cluster_obj = obj_utils.create_test_cluster( + self.context, + name="cluster_example_$A", + master_flavor_id="flavor_small", + flavor_id="flavor_medium", + ) + + def test_provides(self): + self.assertEqual( + [{"server_type": "vm", "os": "ubuntu", "coe": "kubernetes"}], + self.driver.provides, + ) + + def test_update_cluster_status(self): + self.assertRaises( + NotImplementedError, + self.driver.update_cluster_status, + self.context, + self.cluster_obj, + ) + + def test_create_cluster(self): + self.assertRaises( + NotImplementedError, + self.driver.create_cluster, + self.context, + self.cluster_obj, + cluster_create_timeout=10, + ) + + def test_delete_cluster(self): + self.assertRaises( + NotImplementedError, + self.driver.delete_cluster, + self.context, + self.cluster_obj, + ) + + def test_update_cluster(self): + self.assertRaises( + NotImplementedError, + self.driver.update_cluster, + self.context, + self.cluster_obj, + ) + + def test_resize_cluster(self): + self.assertRaises( + NotImplementedError, + self.driver.resize_cluster, + self.context, + self.cluster_obj, + None, + 4, + None, + ) + + def test_upgrade_cluster(self): + self.assertRaises( + NotImplementedError, + self.driver.upgrade_cluster, + self.context, + self.cluster_obj, + self.cluster_obj.cluster_template, + 1, + None, + ) + + def test_create_nodegroup(self): + self.assertRaises( + NotImplementedError, + self.driver.create_nodegroup, + self.context, + self.cluster_obj, + objects.NodeGroup(), + ) + + def test_update_nodegroup(self): + self.assertRaises( + NotImplementedError, + self.driver.update_nodegroup, + self.context, + self.cluster_obj, + objects.NodeGroup(), + ) + + def test_delete_nodegroup(self): + self.assertRaises( + NotImplementedError, + self.driver.delete_nodegroup, + self.context, + self.cluster_obj, + objects.NodeGroup(), + ) + + def test_create_federation(self): + self.assertRaises( + NotImplementedError, + self.driver.create_federation, + self.context, + None, + ) + + def test_update_federation(self): + self.assertRaises( + NotImplementedError, + self.driver.update_federation, + self.context, + None, + ) + + def test_delete_federation(self): + self.assertRaises( + NotImplementedError, + self.driver.delete_federation, + self.context, + None, + ) diff --git a/magnum_capi_helm/tests/test_magnum_capi_helm.py b/magnum_capi_helm/tests/test_magnum_capi_helm.py index 3dc443d..7e2db9c 100644 --- a/magnum_capi_helm/tests/test_magnum_capi_helm.py +++ b/magnum_capi_helm/tests/test_magnum_capi_helm.py @@ -1,5 +1,3 @@ -# -*- coding: utf-8 -*- - # 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 @@ -12,16 +10,13 @@ # License for the specific language governing permissions and limitations # under the License. -""" -test_magnum_capi_helm ----------------------------------- - -Tests for `magnum_capi_helm` module. -""" +from magnum.drivers.common import driver as common +from magnum_capi_helm import driver from magnum_capi_helm.tests import base -class TestMagnum_capi_helm(base.TestCase): - def test_something(self): - pass +class TestMagnumDriverLoads(base.TestCase): + def test_get_driver(self): + cluster_driver = common.Driver.get_driver("vm", "ubuntu", "kubernetes") + self.assertIsInstance(cluster_driver, driver.Driver) diff --git a/setup.cfg b/setup.cfg index abeba35..17c5fc8 100644 --- a/setup.cfg +++ b/setup.cfg @@ -24,3 +24,7 @@ classifier = [files] packages = magnum_capi_helm + +[entry_points] +magnum.drivers = + k8s_capi_helm_v1 = magnum_capi_helm.driver:Driver diff --git a/tox.ini b/tox.ini index 190cc2d..b726bf1 100644 --- a/tox.ini +++ b/tox.ini @@ -1,9 +1,6 @@ [tox] -minversion = 3.2.0 +minversion = 3.18.0 envlist = py3,black,pep8 -skipsdist = True -ignore_basepython_conflict = true - [testenv] basepython = python3 @@ -14,6 +11,7 @@ setenv = OS_STDERR_CAPTURE=1 OS_TEST_TIMEOUT=60 deps = -c{env:UPPER_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt commands = stestr run {posargs}