diff --git a/magnum/conductor/monitors.py b/magnum/conductor/monitors.py index 7cc4a92a23..f39c39b43a 100644 --- a/magnum/conductor/monitors.py +++ b/magnum/conductor/monitors.py @@ -16,23 +16,16 @@ import abc from oslo_log import log -from oslo_utils import importutils import six import magnum.conf -from magnum.objects import fields +from magnum.drivers.common.driver import Driver LOG = log.getLogger(__name__) CONF = magnum.conf.CONF -COE_CLASS_PATH = { - fields.ClusterType.SWARM: 'magnum.conductor.swarm_monitor.SwarmMonitor', - fields.ClusterType.KUBERNETES: 'magnum.conductor.k8s_monitor.K8sMonitor', - fields.ClusterType.MESOS: 'magnum.conductor.mesos_monitor.MesosMonitor' -} - @six.add_metaclass(abc.ABCMeta) class MonitorBase(object): @@ -62,10 +55,10 @@ class MonitorBase(object): def create_monitor(context, cluster): - if cluster.cluster_template.coe in COE_CLASS_PATH: - coe_cls = importutils.import_class( - COE_CLASS_PATH[cluster.cluster_template.coe]) - return coe_cls(context, cluster) + cluster_driver = Driver.get_driver_for_cluster(context, cluster) + monitor = cluster_driver.get_monitor(context, cluster) + if monitor: + return monitor LOG.debug("Cannot create monitor with cluster type '%s'", cluster.cluster_template.coe) diff --git a/magnum/drivers/common/driver.py b/magnum/drivers/common/driver.py index 2f8a04994c..a182a69fab 100644 --- a/magnum/drivers/common/driver.py +++ b/magnum/drivers/common/driver.py @@ -174,3 +174,8 @@ class Driver(object): def delete_cluster(self, context, cluster): raise NotImplementedError("Subclasses must implement " "'delete_cluster'.") + + def get_monitor(self, context, cluster): + """return the monitor with container data for this driver.""" + + return None diff --git a/magnum/conductor/k8s_monitor.py b/magnum/drivers/common/k8s_monitor.py similarity index 100% rename from magnum/conductor/k8s_monitor.py rename to magnum/drivers/common/k8s_monitor.py diff --git a/magnum/drivers/k8s_coreos_v1/driver.py b/magnum/drivers/k8s_coreos_v1/driver.py index 7e61e5cd89..52927f0fc7 100644 --- a/magnum/drivers/k8s_coreos_v1/driver.py +++ b/magnum/drivers/k8s_coreos_v1/driver.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +from magnum.drivers.common import k8s_monitor from magnum.drivers.heat import driver from magnum.drivers.k8s_coreos_v1 import template_def @@ -28,3 +29,6 @@ class Driver(driver.HeatDriver): def get_template_definition(self): return template_def.CoreOSK8sTemplateDefinition() + + def get_monitor(self, context, cluster): + return k8s_monitor.K8sMonitor(context, cluster) diff --git a/magnum/drivers/k8s_fedora_atomic_v1/driver.py b/magnum/drivers/k8s_fedora_atomic_v1/driver.py index cb8ac8fc66..29f41abef2 100644 --- a/magnum/drivers/k8s_fedora_atomic_v1/driver.py +++ b/magnum/drivers/k8s_fedora_atomic_v1/driver.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +from magnum.drivers.common import k8s_monitor from magnum.drivers.heat import driver from magnum.drivers.k8s_fedora_atomic_v1 import template_def @@ -28,3 +29,6 @@ class Driver(driver.HeatDriver): def get_template_definition(self): return template_def.AtomicK8sTemplateDefinition() + + def get_monitor(self, context, cluster): + return k8s_monitor.K8sMonitor(context, cluster) diff --git a/magnum/drivers/k8s_fedora_ironic_v1/driver.py b/magnum/drivers/k8s_fedora_ironic_v1/driver.py index 24f8789610..d698961198 100644 --- a/magnum/drivers/k8s_fedora_ironic_v1/driver.py +++ b/magnum/drivers/k8s_fedora_ironic_v1/driver.py @@ -12,6 +12,7 @@ # License for the specific language governing permissions and limitations # under the License. +from magnum.drivers.common import k8s_monitor from magnum.drivers.heat import driver from magnum.drivers.k8s_fedora_ironic_v1 import template_def @@ -28,3 +29,6 @@ class Driver(driver.HeatDriver): def get_template_definition(self): return template_def.FedoraK8sIronicTemplateDefinition() + + def get_monitor(self, context, cluster): + return k8s_monitor.K8sMonitor(context, cluster) diff --git a/magnum/drivers/mesos_ubuntu_v1/driver.py b/magnum/drivers/mesos_ubuntu_v1/driver.py index e4e4f41e4c..879aa6309c 100644 --- a/magnum/drivers/mesos_ubuntu_v1/driver.py +++ b/magnum/drivers/mesos_ubuntu_v1/driver.py @@ -13,6 +13,7 @@ # under the License. from magnum.drivers.heat import driver +from magnum.drivers.mesos_ubuntu_v1 import monitor from magnum.drivers.mesos_ubuntu_v1 import template_def @@ -28,3 +29,6 @@ class Driver(driver.HeatDriver): def get_template_definition(self): return template_def.UbuntuMesosTemplateDefinition() + + def get_monitor(self, context, cluster): + return monitor.MesosMonitor(context, cluster) diff --git a/magnum/conductor/mesos_monitor.py b/magnum/drivers/mesos_ubuntu_v1/monitor.py similarity index 100% rename from magnum/conductor/mesos_monitor.py rename to magnum/drivers/mesos_ubuntu_v1/monitor.py diff --git a/magnum/drivers/swarm_fedora_atomic_v1/driver.py b/magnum/drivers/swarm_fedora_atomic_v1/driver.py index 9aa2cb595b..29bf236bf9 100644 --- a/magnum/drivers/swarm_fedora_atomic_v1/driver.py +++ b/magnum/drivers/swarm_fedora_atomic_v1/driver.py @@ -13,6 +13,7 @@ # under the License. from magnum.drivers.heat import driver +from magnum.drivers.swarm_fedora_atomic_v1 import monitor from magnum.drivers.swarm_fedora_atomic_v1 import template_def @@ -28,3 +29,6 @@ class Driver(driver.HeatDriver): def get_template_definition(self): return template_def.AtomicSwarmTemplateDefinition() + + def get_monitor(self, context, cluster): + return monitor.SwarmMonitor(context, cluster) diff --git a/magnum/conductor/swarm_monitor.py b/magnum/drivers/swarm_fedora_atomic_v1/monitor.py similarity index 100% rename from magnum/conductor/swarm_monitor.py rename to magnum/drivers/swarm_fedora_atomic_v1/monitor.py diff --git a/magnum/tests/unit/conductor/test_monitors.py b/magnum/tests/unit/conductor/test_monitors.py index 84c31ad200..71c30b6a9e 100644 --- a/magnum/tests/unit/conductor/test_monitors.py +++ b/magnum/tests/unit/conductor/test_monitors.py @@ -16,14 +16,12 @@ import mock from oslo_serialization import jsonutils -from magnum.conductor import k8s_monitor -from magnum.conductor import mesos_monitor -from magnum.conductor import monitors -from magnum.conductor import swarm_monitor +from magnum.drivers.common import k8s_monitor +from magnum.drivers.mesos_ubuntu_v1 import monitor as mesos_monitor +from magnum.drivers.swarm_fedora_atomic_v1 import monitor as swarm_monitor from magnum import objects from magnum.tests import base from magnum.tests.unit.db import utils -from magnum.tests.unit.objects import utils as obj_utils class MonitorsTestCase(base.TestCase): @@ -50,31 +48,13 @@ class MonitorsTestCase(base.TestCase): self.k8s_monitor = k8s_monitor.K8sMonitor(self.context, self.cluster) self.mesos_monitor = mesos_monitor.MesosMonitor(self.context, self.cluster) - p = mock.patch('magnum.conductor.swarm_monitor.SwarmMonitor.' - 'metrics_spec', new_callable=mock.PropertyMock) + p = mock.patch('magnum.drivers.swarm_fedora_atomic_v1.monitor.' + 'SwarmMonitor.metrics_spec', + new_callable=mock.PropertyMock) self.mock_metrics_spec = p.start() self.mock_metrics_spec.return_value = self.test_metrics_spec self.addCleanup(p.stop) - def test_create_monitor_success(self): - self.cluster.cluster_template = obj_utils.get_test_cluster_template( - self.context, uuid=self.cluster.cluster_template_id, coe='swarm') - monitor = monitors.create_monitor(self.context, self.cluster) - self.assertIsInstance(monitor, swarm_monitor.SwarmMonitor) - - def test_create_monitor_k8s_cluster(self): - self.cluster.cluster_template = obj_utils.get_test_cluster_template( - self.context, uuid=self.cluster.cluster_template_id, - coe='kubernetes') - monitor = monitors.create_monitor(self.context, self.cluster) - self.assertIsInstance(monitor, k8s_monitor.K8sMonitor) - - def test_create_monitor_mesos_cluster(self): - self.cluster.cluster_template = obj_utils.get_test_cluster_template( - self.context, uuid=self.cluster.cluster_template_id, coe='mesos') - monitor = monitors.create_monitor(self.context, self.cluster) - self.assertIsInstance(monitor, mesos_monitor.MesosMonitor) - @mock.patch('magnum.common.docker_utils.docker_for_cluster') def test_swarm_monitor_pull_data_success(self, mock_docker_cluster): mock_docker = mock.MagicMock() @@ -176,7 +156,7 @@ class MonitorsTestCase(base.TestCase): [{'Memory': 104857600.0, 'Cpu': 0.5}]) def test_k8s_monitor_get_metric_names(self): - k8s_metric_spec = 'magnum.conductor.k8s_monitor.K8sMonitor.'\ + k8s_metric_spec = 'magnum.drivers.common.k8s_monitor.K8sMonitor.'\ 'metrics_spec' with mock.patch(k8s_metric_spec, new_callable=mock.PropertyMock) as mock_k8s_metric: @@ -185,7 +165,7 @@ class MonitorsTestCase(base.TestCase): self.assertEqual(sorted(['metric1', 'metric2']), sorted(names)) def test_k8s_monitor_get_metric_unit(self): - k8s_metric_spec = 'magnum.conductor.k8s_monitor.K8sMonitor.' \ + k8s_metric_spec = 'magnum.drivers.common.k8s_monitor.K8sMonitor.'\ 'metrics_spec' with mock.patch(k8s_metric_spec, new_callable=mock.PropertyMock) as mock_k8s_metric: @@ -293,8 +273,8 @@ class MonitorsTestCase(base.TestCase): self._test_mesos_monitor_pull_data(mock_url_get, {}, 0, 0, 0, 0) def test_mesos_monitor_get_metric_names(self): - mesos_metric_spec = 'magnum.conductor.mesos_monitor.MesosMonitor.'\ - 'metrics_spec' + mesos_metric_spec = ('magnum.drivers.mesos_ubuntu_v1.monitor.' + 'MesosMonitor.metrics_spec') with mock.patch(mesos_metric_spec, new_callable=mock.PropertyMock) as mock_mesos_metric: mock_mesos_metric.return_value = self.test_metrics_spec @@ -302,8 +282,8 @@ class MonitorsTestCase(base.TestCase): self.assertEqual(sorted(['metric1', 'metric2']), sorted(names)) def test_mesos_monitor_get_metric_unit(self): - mesos_metric_spec = 'magnum.conductor.mesos_monitor.MesosMonitor.' \ - 'metrics_spec' + mesos_metric_spec = ('magnum.drivers.mesos_ubuntu_v1.monitor.' + 'MesosMonitor.metrics_spec') with mock.patch(mesos_metric_spec, new_callable=mock.PropertyMock) as mock_mesos_metric: mock_mesos_metric.return_value = self.test_metrics_spec