diff --git a/os_faults/__init__.py b/os_faults/__init__.py index 58b8836..a645dee 100644 --- a/os_faults/__init__.py +++ b/os_faults/__init__.py @@ -63,6 +63,21 @@ CONFIG_SCHEMA = { 'required': ['driver', 'args'], 'additionalProperties': False, }, + 'services': { + 'type': 'object', + 'patternProperties': { + '.*': { + 'type': 'object', + 'properties': { + 'driver': {'type': 'string'}, + 'args': {'type': 'object'}, + }, + 'required': ['driver', 'args'], + 'additionalProperties': False, + } + }, + 'additionalProperties': False, + }, 'cloud_management': { 'type': 'object', 'properties': { @@ -134,6 +149,11 @@ def connect(cloud_config=None, config_filename=None): cloud_management_conf = cloud_config['cloud_management'] cloud_management = _init_driver(cloud_management_conf) + services = cloud_config.get('services') + if services: + cloud_management.update_services(services) + cloud_management.validate_services() + node_discover_conf = cloud_config.get('node_discover') if node_discover_conf: node_discover = _init_driver(node_discover_conf) diff --git a/os_faults/api/cloud_management.py b/os_faults/api/cloud_management.py index a261184..743a5e4 100644 --- a/os_faults/api/cloud_management.py +++ b/os_faults/api/cloud_management.py @@ -15,6 +15,7 @@ import abc import copy import logging +import jsonschema import six from os_faults.api import base_driver @@ -43,6 +44,14 @@ class CloudManagement(base_driver.BaseDriver): def set_node_discover(self, node_discover): self.node_discover = node_discover + def update_services(self, services): + self.services.update(services) + + def validate_services(self): + for service_name, serive_conf in self.services.items(): + serive_cls = registry.get_driver(serive_conf["driver"]) + jsonschema.validate(serive_conf['args'], serive_cls.CONFIG_SCHEMA) + @abc.abstractmethod def verify(self): """Verify connection to the cloud. @@ -74,7 +83,7 @@ class CloudManagement(base_driver.BaseDriver): def get_service(self, name): """Get service with specified name - :param name: name of the serives + :param name: name of the service :return: Service """ if name not in self.services: diff --git a/os_faults/tests/unit/drivers/test_devstack.py b/os_faults/tests/unit/drivers/test_devstack.py index faa0024..b5c355a 100644 --- a/os_faults/tests/unit/drivers/test_devstack.py +++ b/os_faults/tests/unit/drivers/test_devstack.py @@ -189,6 +189,10 @@ class DevStackManagementTestCase(test.TestCase): fqdn='')], nodes.hosts) + def test_validate_services(self): + devstack_management = devstack.DevStackManagement(self.conf) + devstack_management.validate_services() + @ddt.ddt class DevStackServiceTestCase(test.TestCase): diff --git a/os_faults/tests/unit/drivers/test_fuel_management.py b/os_faults/tests/unit/drivers/test_fuel_management.py index 10c1c54..9730407 100644 --- a/os_faults/tests/unit/drivers/test_fuel_management.py +++ b/os_faults/tests/unit/drivers/test_fuel_management.py @@ -197,3 +197,10 @@ class FuelManagementTestCase(test.TestCase): }) self.assertRaises(error.ServiceError, fuel_managment.get_service, 'unknown') + + def test_validate_services(self): + fuel_managment = fuel.FuelManagement({ + 'address': 'fuel.local', + 'username': 'root', + }) + fuel_managment.validate_services() diff --git a/os_faults/tests/unit/drivers/test_tcpcloud.py b/os_faults/tests/unit/drivers/test_tcpcloud.py index bdde6e8..636cb7b 100644 --- a/os_faults/tests/unit/drivers/test_tcpcloud.py +++ b/os_faults/tests/unit/drivers/test_tcpcloud.py @@ -148,6 +148,10 @@ class TCPCloudManagementTestCase(test.TestCase): mock.call(['10.0.0.2', '10.0.0.3'], {'command': 'hostname'}), ]) + def test_validate_services(self): + tcp_managment = tcpcloud.TCPCloudManagement(self.tcp_conf) + tcp_managment.validate_services() + @mock.patch('os_faults.ansible.executor.AnsibleRunner', autospec=True) def test_get_nodes(self, mock_ansible_runner): ansible_runner_inst = mock_ansible_runner.return_value diff --git a/os_faults/tests/unit/test_os_faults.py b/os_faults/tests/unit/test_os_faults.py index a017cb2..b11dce7 100644 --- a/os_faults/tests/unit/test_os_faults.py +++ b/os_faults/tests/unit/test_os_faults.py @@ -62,6 +62,17 @@ class OSFaultsTestCase(test.TestCase): destructor = os_faults.connect(cloud_config) self.assertIsInstance(destructor, devstack.DevStackManagement) + def test_config_with_services(self): + self.cloud_config['services'] = { + 'app': { + 'driver': 'process', + 'args': {'grep': 'myapp'} + } + } + destructor = os_faults.connect(self.cloud_config) + app = destructor.get_service('app') + self.assertIsNotNone(app) + def test_connect_fuel_with_libvirt(self): destructor = os_faults.connect(self.cloud_config) self.assertIsInstance(destructor, fuel.FuelManagement)