Refactor services module

Change-Id: Ib3ecebb3aa15124a179cb2d98c6dbbe6031fd6a1
This commit is contained in:
Ilya Shakhat 2017-09-05 17:28:38 +02:00
parent da22323dfd
commit 4b49c49307
2 changed files with 38 additions and 43 deletions

View File

@ -87,9 +87,14 @@ class ServiceAsProcess(service.Service):
self.restart_cmd = self.config.get('restart_cmd') self.restart_cmd = self.config.get('restart_cmd')
self.port = self.config.get('port') self.port = self.config.get('port')
def _run_task(self, task, nodes): def _run_task(self, nodes, task, message):
nodes = nodes if nodes is not None else self.get_nodes()
if len(nodes) == 0: if len(nodes) == 0:
raise error.ServiceError('Node collection is empty') raise error.ServiceError(
'Service %s is not found on any nodes' % self.service_name)
LOG.info('%s service %s on nodes: %s',
message, self.service_name, nodes.get_ips())
return self.cloud_management.execute_on_cloud(nodes.hosts, task) return self.cloud_management.execute_on_cloud(nodes.hosts, task)
@ -101,73 +106,62 @@ class ServiceAsProcess(service.Service):
success_ips = [r.host for r in results success_ips = [r.host for r in results
if r.status == executor.STATUS_OK] if r.status == executor.STATUS_OK]
hosts = [h for h in nodes.hosts if h.ip in success_ips] hosts = [h for h in nodes.hosts if h.ip in success_ips]
LOG.debug('Service %s is discovered on nodes %s',
self.service_name, hosts)
return self.node_cls(cloud_management=self.cloud_management, return self.node_cls(cloud_management=self.cloud_management,
hosts=hosts) hosts=hosts)
@utils.require_variables('restart_cmd') @utils.require_variables('restart_cmd')
def restart(self, nodes=None): def restart(self, nodes=None):
nodes = nodes if nodes is not None else self.get_nodes() self._run_task(nodes, {'shell': self.restart_cmd}, 'Restart')
LOG.info("Restart '%s' service on nodes: %s", self.service_name,
nodes.get_ips())
self._run_task({'shell': self.restart_cmd}, nodes)
@utils.require_variables('terminate_cmd') @utils.require_variables('terminate_cmd')
def terminate(self, nodes=None): def terminate(self, nodes=None):
nodes = nodes if nodes is not None else self.get_nodes() self._run_task(nodes, {'shell': self.terminate_cmd}, 'Terminate')
LOG.info("Terminate '%s' service on nodes: %s", self.service_name,
nodes.get_ips())
self._run_task({'shell': self.terminate_cmd}, nodes)
@utils.require_variables('start_cmd') @utils.require_variables('start_cmd')
def start(self, nodes=None): def start(self, nodes=None):
nodes = nodes if nodes is not None else self.get_nodes() self._run_task(nodes, {'shell': self.start_cmd}, 'Start')
LOG.info("Start '%s' service on nodes: %s", self.service_name,
nodes.get_ips())
self._run_task({'shell': self.start_cmd}, nodes)
def kill(self, nodes=None): def kill(self, nodes=None):
nodes = nodes if nodes is not None else self.get_nodes() task = {'kill': {'grep': self.grep, 'sig': signal.SIGKILL}}
LOG.info("Kill '%s' service on nodes: %s", self.service_name, self._run_task(nodes, task, 'Kill')
nodes.get_ips())
cmd = {'kill': {'grep': self.grep, 'sig': signal.SIGKILL}}
self._run_task(cmd, nodes)
def freeze(self, nodes=None, sec=None): def freeze(self, nodes=None, sec=None):
nodes = nodes if nodes is not None else self.get_nodes()
if sec: if sec:
cmd = {'freeze': {'grep': self.grep, 'sec': sec}} task = {'freeze': {'grep': self.grep, 'sec': sec}}
else: else:
cmd = {'kill': {'grep': self.grep, 'sig': signal.SIGSTOP}} task = {'kill': {'grep': self.grep, 'sig': signal.SIGSTOP}}
LOG.info("Freeze '%s' service %son nodes: %s", self.service_name, message = "Freeze %s" % (('for %s sec ' % sec) if sec else '')
('for %s sec ' % sec) if sec else '', nodes.get_ips()) self._run_task(nodes, task, message)
self._run_task(cmd, nodes)
def unfreeze(self, nodes=None): def unfreeze(self, nodes=None):
nodes = nodes if nodes is not None else self.get_nodes() task = {'kill': {'grep': self.grep, 'sig': signal.SIGCONT}}
LOG.info("Unfreeze '%s' service on nodes: %s", self.service_name, self._run_task(nodes, task, 'Unfreeze')
nodes.get_ips())
cmd = {'kill': {'grep': self.grep, 'sig': signal.SIGCONT}}
self._run_task(cmd, nodes)
@utils.require_variables('port') @utils.require_variables('port')
def plug(self, nodes=None): def plug(self, nodes=None):
nodes = nodes if nodes is not None else self.get_nodes() nodes = nodes if nodes is not None else self.get_nodes()
LOG.info("Open port %d for '%s' service on nodes: %s", message = "Open port %d for" % self.port[1]
self.port[1], self.service_name, nodes.get_ips()) task = {
self._run_task({'iptables': {'protocol': self.port[0], 'iptables': {
'port': self.port[1], 'protocol': self.port[0], 'port': self.port[1],
'action': 'unblock', 'action': 'unblock', 'service': self.service_name
'service': self.service_name}}, nodes) }
}
self._run_task(nodes, task, message)
@utils.require_variables('port') @utils.require_variables('port')
def unplug(self, nodes=None): def unplug(self, nodes=None):
nodes = nodes if nodes is not None else self.get_nodes() nodes = nodes if nodes is not None else self.get_nodes()
LOG.info("Close port %d for '%s' service on nodes: %s", message = "Close port %d for" % self.port[1]
self.port[1], self.service_name, nodes.get_ips()) task = {
self._run_task({'iptables': {'protocol': self.port[0], 'iptables': {
'port': self.port[1], 'protocol': self.port[0], 'port': self.port[1],
'action': 'block', 'action': 'block', 'service': self.service_name
'service': self.service_name}}, nodes) }
}
self._run_task(nodes, task, message)
class LinuxService(ServiceAsProcess): class LinuxService(ServiceAsProcess):

View File

@ -327,7 +327,8 @@ class FuelServiceTestCase(test.TestCase):
service = fuel_managment.get_service('keystone') service = fuel_managment.get_service('keystone')
exception = self.assertRaises(error.ServiceError, service.restart) exception = self.assertRaises(error.ServiceError, service.restart)
self.assertEqual('Node collection is empty', str(exception)) self.assertEqual('Service keystone is not found on any nodes',
str(exception))
get_nodes_cmd = 'bash -c "ps ax | grep -v grep | grep \'{}\'"'.format( get_nodes_cmd = 'bash -c "ps ax | grep -v grep | grep \'{}\'"'.format(
service.grep) service.grep)