[Core] Predefined ips for services in config

This patch adds ability to specify ips for services.
That allows disabling of discovering of services at runtime.

Change-Id: I6ce3a2c251b9e29fa9ba51287c9a7469aeffe7a4
This commit is contained in:
Anton Studenov 2017-04-21 13:44:45 +03:00
parent 2d72d2b9d6
commit 70ab8aa8be
5 changed files with 55 additions and 4 deletions

View File

@ -71,6 +71,11 @@ CONFIG_SCHEMA = {
'properties': {
'driver': {'type': 'string'},
'args': {'type': 'object'},
'hosts': {
'type': 'array',
'minItems': 1,
'items': {'type': 'string'},
},
},
'required': ['driver', 'args'],
'additionalProperties': False,

View File

@ -94,7 +94,8 @@ class CloudManagement(base_driver.BaseDriver):
config = self.services[name]
klazz = registry.get_driver(config["driver"])
return klazz(node_cls=self.NODE_CLS, cloud_management=self,
service_name=name, config=config["args"])
service_name=name, config=config["args"],
hosts=config.get('hosts'))
@abc.abstractmethod
def execute_on_cloud(self, hosts, task, raise_on_error=True):

View File

@ -22,18 +22,32 @@ from os_faults.api.util import public
@six.add_metaclass(abc.ABCMeta)
class Service(base_driver.BaseDriver):
def __init__(self, service_name, config, node_cls, cloud_management):
def __init__(self, service_name, config, node_cls, cloud_management,
hosts=None):
self.service_name = service_name
self.config = config
self.node_cls = node_cls
self.cloud_management = cloud_management
self.hosts = hosts
@abc.abstractmethod
def discover_nodes(self):
"""Discover nodes where this Service is running
:returns: NodesCollection
"""
def get_nodes(self):
"""Get nodes where this Service is running
:return: NodesCollection
:returns: NodesCollection
"""
if self.hosts is not None:
nodes = self.cloud_management.get_nodes()
hosts = [h for h in nodes.hosts if h.ip in self.hosts]
return self.node_cls(cloud_management=self.cloud_management,
hosts=hosts)
return self.discover_nodes()
@public
def restart(self, nodes=None):

View File

@ -103,7 +103,7 @@ class ServiceAsProcess(service.Service):
raise error.ServiceError('Task failed on some nodes')
return results
def get_nodes(self):
def discover_nodes(self):
nodes = self.cloud_management.get_nodes()
ips = nodes.get_ips()
cmd = 'bash -c "ps ax | grep -v grep | grep \'{}\'"'.format(self.grep)

View File

@ -73,6 +73,37 @@ class OSFaultsTestCase(test.TestCase):
app = destructor.get_service('app')
self.assertIsNotNone(app)
def test_config_with_services_and_hosts(self):
self.cloud_config['node_discover'] = {
'driver': 'node_list',
'args': [
{
'ip': '10.0.0.11',
'mac': '01:ab:cd:01:ab:cd',
'fqdn': 'node-1'
}, {
'ip': '10.0.0.12',
'mac': '02:ab:cd:02:ab:cd',
'fqdn': 'node-2'
},
]
}
self.cloud_config['services'] = {
'app': {
'driver': 'process',
'args': {'grep': 'myapp'},
'hosts': ['10.0.0.11', '10.0.0.12']
}
}
destructor = os_faults.connect(self.cloud_config)
app = destructor.get_service('app')
self.assertIsNotNone(app)
nodes = app.get_nodes()
self.assertEqual(['10.0.0.11', '10.0.0.12'], nodes.get_ips())
self.assertEqual(['node-1', 'node-2'], nodes.get_fqdns())
self.assertEqual(['01:ab:cd:01:ab:cd', '02:ab:cd:02:ab:cd'],
nodes.get_macs())
def test_connect_fuel_with_libvirt(self):
destructor = os_faults.connect(self.cloud_config)
self.assertIsInstance(destructor, fuel.FuelManagement)