[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:
parent
2d72d2b9d6
commit
70ab8aa8be
@ -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,
|
||||
|
@ -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):
|
||||
|
@ -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):
|
||||
|
@ -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)
|
||||
|
@ -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)
|
||||
|
Loading…
Reference in New Issue
Block a user