[Core] Allow adding services in config

Change-Id: Ie6c8144a4d03ec04af2db05ddf9affb5e89b0ec6
This commit is contained in:
Anton Studenov 2017-04-10 12:40:33 +03:00
parent a5945210c6
commit 2d72d2b9d6
6 changed files with 56 additions and 1 deletions

View File

@ -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)

View File

@ -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:

View File

@ -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):

View File

@ -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()

View File

@ -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

View File

@ -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)