Merge "Merged metrics_engine package into decision_engine"
This commit is contained in:
@@ -21,7 +21,7 @@ from apscheduler.schedulers import background
|
||||
from watcher.decision_engine.audit import continuous
|
||||
from watcher.decision_engine.audit import oneshot
|
||||
from watcher.decision_engine.messaging import events
|
||||
from watcher.metrics_engine.cluster_model_collector import manager
|
||||
from watcher.decision_engine.model.collector import manager
|
||||
from watcher.objects import audit as audit_objects
|
||||
from watcher.tests.db import base
|
||||
from watcher.tests.decision_engine.strategy.strategies import \
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2016 b<>com
|
||||
#
|
||||
# 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 watcher.decision_engine.model.collector import base
|
||||
from watcher.decision_engine.model import model_root
|
||||
from watcher.tests import base as test_base
|
||||
|
||||
|
||||
class DummyClusterDataModelCollector(base.BaseClusterDataModelCollector):
|
||||
|
||||
def execute(self):
|
||||
model = model_root.ModelRoot()
|
||||
# Do something here...
|
||||
return model
|
||||
|
||||
|
||||
class TestClusterDataModelCollector(test_base.TestCase):
|
||||
|
||||
def test_is_singleton(self):
|
||||
m_config = mock.Mock()
|
||||
inst1 = DummyClusterDataModelCollector(config=m_config)
|
||||
inst2 = DummyClusterDataModelCollector(config=m_config)
|
||||
|
||||
self.assertIs(inst1, inst2)
|
||||
|
||||
def test_in_memory_model_is_copied(self):
|
||||
m_config = mock.Mock()
|
||||
collector = DummyClusterDataModelCollector(config=m_config)
|
||||
collector.synchronize()
|
||||
|
||||
self.assertIs(
|
||||
collector._cluster_data_model, collector.cluster_data_model)
|
||||
self.assertIsNot(
|
||||
collector.cluster_data_model,
|
||||
collector.get_latest_cluster_data_model())
|
||||
82
watcher/tests/decision_engine/cluster/test_nova_cdmc.py
Normal file
82
watcher/tests/decision_engine/cluster/test_nova_cdmc.py
Normal file
@@ -0,0 +1,82 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2016 b<>com
|
||||
#
|
||||
# Authors: Vincent FRANCOISE <vincent.francoise@b-com.com>
|
||||
#
|
||||
# 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 watcher.common import nova_helper
|
||||
from watcher.decision_engine.model.collector import nova
|
||||
from watcher.tests import base
|
||||
from watcher.tests import conf_fixture
|
||||
|
||||
|
||||
class TestNovaClusterDataModelCollector(base.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestNovaClusterDataModelCollector, self).setUp()
|
||||
self.useFixture(conf_fixture.ConfReloadFixture())
|
||||
|
||||
@mock.patch('keystoneclient.v3.client.Client', mock.Mock())
|
||||
@mock.patch.object(nova_helper, 'NovaHelper')
|
||||
def test_nova_cdmc_execute(self, m_nova_helper_cls):
|
||||
m_nova_helper = mock.Mock()
|
||||
m_nova_helper_cls.return_value = m_nova_helper
|
||||
fake_hypervisor = mock.Mock(
|
||||
service={'id': 123},
|
||||
hypervisor_hostname='test_hostname',
|
||||
memory_mb=333,
|
||||
free_disk_gb=222,
|
||||
local_gb=111,
|
||||
vcpus=4,
|
||||
state='TEST_STATE',
|
||||
status='TEST_STATUS',
|
||||
)
|
||||
fake_vm = mock.Mock(
|
||||
id='ef500f7e-dac8-470f-960c-169486fce71b',
|
||||
state=mock.Mock(**{'OS-EXT-STS:vm_state': 'VM_STATE'}),
|
||||
flavor={'ram': 333, 'disk': 222, 'vcpus': 4},
|
||||
)
|
||||
m_nova_helper.get_hypervisors_list.return_value = [fake_hypervisor]
|
||||
m_nova_helper.get_vms_by_hypervisor.return_value = [fake_vm]
|
||||
m_nova_helper.nova.services.find.return_value = mock.Mock(
|
||||
host='test_hostname')
|
||||
|
||||
def m_get_flavor_instance(vm, cache):
|
||||
vm.flavor = {'ram': 333, 'disk': 222, 'vcpus': 4}
|
||||
return vm
|
||||
|
||||
m_nova_helper.get_flavor_instance.side_effect = m_get_flavor_instance
|
||||
|
||||
m_config = mock.Mock()
|
||||
m_osc = mock.Mock()
|
||||
|
||||
nova_cdmc = nova.NovaClusterDataModelCollector(
|
||||
config=m_config, osc=m_osc)
|
||||
|
||||
model = nova_cdmc.execute()
|
||||
|
||||
hypervisors = model.get_all_hypervisors()
|
||||
vms = model.get_all_vms()
|
||||
|
||||
self.assertEqual(1, len(hypervisors))
|
||||
self.assertEqual(1, len(vms))
|
||||
|
||||
hypervisor = list(hypervisors.values())[0]
|
||||
vm = list(vms.values())[0]
|
||||
|
||||
self.assertEqual(hypervisor.uuid, 'test_hostname')
|
||||
self.assertEqual(vm.uuid, 'ef500f7e-dac8-470f-960c-169486fce71b')
|
||||
@@ -0,0 +1,83 @@
|
||||
# -*- encoding: utf-8 -*-
|
||||
# Copyright (c) 2015 b<>com
|
||||
#
|
||||
# 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 stevedore import driver as drivermanager
|
||||
from stevedore import extension as stevedore_extension
|
||||
|
||||
from watcher.common import clients
|
||||
from watcher.common import exception
|
||||
from watcher.decision_engine.loading import default as default_loading
|
||||
from watcher.tests import base
|
||||
from watcher.tests import conf_fixture
|
||||
from watcher.tests.decision_engine.strategy.strategies import \
|
||||
faker_cluster_state
|
||||
|
||||
|
||||
class TestClusterDataModelCollectorLoader(base.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestClusterDataModelCollectorLoader, self).setUp()
|
||||
self.useFixture(conf_fixture.ConfReloadFixture())
|
||||
self.collector_loader = (
|
||||
default_loading.ClusterDataModelCollectorLoader())
|
||||
|
||||
def test_load_collector_with_empty_model(self):
|
||||
self.assertRaises(
|
||||
exception.LoadingError, self.collector_loader.load, None)
|
||||
|
||||
def test_collector_loader(self):
|
||||
fake_driver = "fake"
|
||||
# Set up the fake Stevedore extensions
|
||||
fake_driver_call = drivermanager.DriverManager.make_test_instance(
|
||||
extension=stevedore_extension.Extension(
|
||||
name=fake_driver,
|
||||
entry_point="%s:%s" % (
|
||||
faker_cluster_state.FakerModelCollector.__module__,
|
||||
faker_cluster_state.FakerModelCollector.__name__),
|
||||
plugin=faker_cluster_state.FakerModelCollector,
|
||||
obj=None,
|
||||
),
|
||||
namespace="watcher_cluster_data_model_collectors",
|
||||
)
|
||||
|
||||
with mock.patch.object(drivermanager,
|
||||
"DriverManager") as m_driver_manager:
|
||||
m_driver_manager.return_value = fake_driver_call
|
||||
loaded_collector = self.collector_loader.load("fake")
|
||||
|
||||
self.assertIsInstance(
|
||||
loaded_collector, faker_cluster_state.FakerModelCollector)
|
||||
|
||||
|
||||
class TestLoadClusterDataModelCollectors(base.TestCase):
|
||||
|
||||
collector_loader = default_loading.ClusterDataModelCollectorLoader()
|
||||
|
||||
scenarios = [
|
||||
(collector_name,
|
||||
{"collector_name": collector_name, "collector_cls": collector_cls})
|
||||
for collector_name, collector_cls
|
||||
in collector_loader.list_available().items()]
|
||||
|
||||
def setUp(self):
|
||||
super(TestLoadClusterDataModelCollectors, self).setUp()
|
||||
self.useFixture(conf_fixture.ConfReloadFixture())
|
||||
|
||||
@mock.patch.object(clients, 'OpenStackClients', mock.Mock())
|
||||
def test_load_cluster_data_model_collectors(self):
|
||||
collector = self.collector_loader.load(self.collector_name)
|
||||
self.assertIsNotNone(collector)
|
||||
@@ -18,7 +18,7 @@ import mock
|
||||
|
||||
from watcher.decision_engine.audit import oneshot as oneshot_handler
|
||||
from watcher.decision_engine.messaging import audit_endpoint
|
||||
from watcher.metrics_engine.cluster_model_collector import manager
|
||||
from watcher.decision_engine.model.collector import manager
|
||||
from watcher.tests.db import base
|
||||
from watcher.tests.decision_engine.strategy.strategies \
|
||||
import faker_cluster_state
|
||||
|
||||
@@ -16,11 +16,11 @@
|
||||
import mock
|
||||
|
||||
from watcher.common import utils
|
||||
from watcher.decision_engine.model.collector import manager
|
||||
from watcher.decision_engine.solution import default
|
||||
from watcher.decision_engine.strategy.context import default as d_strategy_ctx
|
||||
from watcher.decision_engine.strategy.selection import default as d_selector
|
||||
from watcher.decision_engine.strategy import strategies
|
||||
from watcher.metrics_engine.cluster_model_collector import manager
|
||||
from watcher.tests.db import base
|
||||
from watcher.tests.objects import utils as obj_utils
|
||||
|
||||
|
||||
@@ -19,12 +19,12 @@
|
||||
|
||||
import mock
|
||||
|
||||
from watcher.decision_engine.model.collector import base
|
||||
from watcher.decision_engine.model import hypervisor
|
||||
from watcher.decision_engine.model import model_root as modelroot
|
||||
from watcher.decision_engine.model import resource
|
||||
from watcher.decision_engine.model import vm as modelvm
|
||||
from watcher.decision_engine.model import vm_state
|
||||
from watcher.metrics_engine.cluster_model_collector import base
|
||||
|
||||
|
||||
class FakerModelCollector(base.BaseClusterDataModelCollector):
|
||||
|
||||
@@ -18,11 +18,11 @@
|
||||
|
||||
import mock
|
||||
|
||||
from watcher.decision_engine.model.collector import base
|
||||
from watcher.decision_engine.model import hypervisor
|
||||
from watcher.decision_engine.model import model_root as modelroot
|
||||
from watcher.decision_engine.model import resource
|
||||
from watcher.decision_engine.model import vm as modelvm
|
||||
from watcher.metrics_engine.cluster_model_collector import base
|
||||
|
||||
|
||||
class FakerModelCollector(base.BaseClusterDataModelCollector):
|
||||
|
||||
@@ -21,8 +21,8 @@ from apscheduler.triggers import interval as interval_trigger
|
||||
import eventlet
|
||||
import mock
|
||||
|
||||
from watcher.decision_engine.loading import default as default_loading
|
||||
from watcher.decision_engine import scheduling
|
||||
from watcher.metrics_engine.loading import default as default_loading
|
||||
from watcher.tests import base
|
||||
from watcher.tests.decision_engine.strategy.strategies import \
|
||||
faker_cluster_state
|
||||
|
||||
Reference in New Issue
Block a user