From 44b25932664dd73cc490e916c0b8237844e28972 Mon Sep 17 00:00:00 2001 From: Ilya Shakhat Date: Wed, 6 Sep 2017 11:09:01 +0200 Subject: [PATCH] Move all service drivers under services/ package Change-Id: I4e7d46b4a289508dbf35be4cef954bd73806efe7 --- os_faults/drivers/cloud/devstack.py | 6 +- os_faults/drivers/cloud/fuel.py | 120 ---------------- os_faults/drivers/cloud/tcpcloud.py | 54 ------- os_faults/drivers/services/__init__.py | 0 os_faults/drivers/services/linux.py | 61 ++++++++ os_faults/drivers/services/pcs.py | 135 ++++++++++++++++++ .../{service.py => services/process.py} | 101 +------------ os_faults/drivers/services/salt.py | 66 +++++++++ os_faults/drivers/services/systemd.py | 66 +++++++++ 9 files changed, 332 insertions(+), 277 deletions(-) create mode 100644 os_faults/drivers/services/__init__.py create mode 100644 os_faults/drivers/services/linux.py create mode 100644 os_faults/drivers/services/pcs.py rename os_faults/drivers/{service.py => services/process.py} (66%) create mode 100644 os_faults/drivers/services/salt.py create mode 100644 os_faults/drivers/services/systemd.py diff --git a/os_faults/drivers/cloud/devstack.py b/os_faults/drivers/cloud/devstack.py index c2f1b51..2255c11 100644 --- a/os_faults/drivers/cloud/devstack.py +++ b/os_faults/drivers/cloud/devstack.py @@ -17,7 +17,7 @@ from os_faults.ansible import executor from os_faults.api import cloud_management from os_faults.api import node_collection from os_faults.api import node_discover -from os_faults.drivers import service +from os_faults.drivers.services import process LOG = logging.getLogger(__name__) @@ -31,7 +31,7 @@ class DevStackNode(node_collection.NodeCollection): raise NotImplementedError -class ServiceInScreen(service.ServiceAsProcess): +class ServiceInScreen(process.ServiceAsProcess): """Service in Screen This driver controls service that is started in a window of @@ -63,7 +63,7 @@ class ServiceInScreen(service.ServiceAsProcess): 'properties': { 'window_name': {'type': 'string'}, 'grep': {'type': 'string'}, - 'port': service.PORT_SCHEMA, + 'port': process.PORT_SCHEMA, }, 'required': ['grep', 'window_name'], 'additionalProperties': False, diff --git a/os_faults/drivers/cloud/fuel.py b/os_faults/drivers/cloud/fuel.py index 3c64eb2..b28a9cc 100644 --- a/os_faults/drivers/cloud/fuel.py +++ b/os_faults/drivers/cloud/fuel.py @@ -18,7 +18,6 @@ from os_faults.ansible import executor from os_faults.api import cloud_management from os_faults.api import node_collection from os_faults.api import node_discover -from os_faults.drivers import service LOG = logging.getLogger(__name__) @@ -43,125 +42,6 @@ class FuelNodeCollection(node_collection.NodeCollection): self.cloud_management.execute_on_cloud(self.hosts, task) -class PcsService(service.ServiceAsProcess): - """Service as a resource in Pacemaker - - Service that can be controled by `pcs resource` CLI tool. - - **Example configuration:** - - .. code-block:: yaml - - services: - app: - driver: pcs_service - args: - pcs_service: app - grep: my_app - port: ['tcp', 4242] - - parameters: - - - **pcs_service** - name of a service - - **grep** - regexp for grep to find process PID - - **port** - tuple with two values - potocol, port number (optional) - - """ - - NAME = 'pcs_service' - DESCRIPTION = 'Service in pacemaker' - CONFIG_SCHEMA = { - 'type': 'object', - 'properties': { - 'pcs_service': {'type': 'string'}, - 'grep': {'type': 'string'}, - 'port': service.PORT_SCHEMA, - }, - 'required': ['grep', 'pcs_service'], - 'additionalProperties': False, - } - - def __init__(self, *args, **kwargs): - super(PcsService, self).__init__(*args, **kwargs) - self.pcs_service = self.config['pcs_service'] - - self.restart_cmd = 'pcs resource restart {} $(hostname)'.format( - self.pcs_service) - self.terminate_cmd = 'pcs resource ban {} $(hostname)'.format( - self.pcs_service) - self.start_cmd = 'pcs resource clear {} $(hostname)'.format( - self.pcs_service) - - -class PcsOrLinuxService(service.ServiceAsProcess): - """Service as a resource in Pacemaker or Linux service - - Service that can be controled by `pcs resource` CLI tool or - linux `service` tool. This is a hybrid driver that tries to find - service in Pacemaker and uses linux `service` if it is not found - there. - - **Example configuration:** - - .. code-block:: yaml - - services: - app: - driver: pcs_or_linux_service - args: - pcs_service: p_app - linux_service: app - grep: my_app - port: ['tcp', 4242] - - parameters: - - - **pcs_service** - name of a service in Pacemaker - - **linux_service** - name of a service in init.d - - **grep** - regexp for grep to find process PID - - **port** - tuple with two values - potocol, port number (optional) - - """ - - NAME = 'pcs_or_linux_service' - DESCRIPTION = 'Service in pacemaker or init.d' - CONFIG_SCHEMA = { - 'type': 'object', - 'properties': { - 'pcs_service': {'type': 'string'}, - 'linux_service': {'type': 'string'}, - 'grep': {'type': 'string'}, - 'port': service.PORT_SCHEMA, - }, - 'required': ['grep', 'pcs_service', 'linux_service'], - 'additionalProperties': False, - } - - def __init__(self, *args, **kwargs): - super(PcsOrLinuxService, self).__init__(*args, **kwargs) - self.pcs_service = self.config.get('pcs_service') - self.linux_service = self.config.get('linux_service') - - self.restart_cmd = ( - 'if pcs resource show {pcs_service}; ' - 'then pcs resource restart {pcs_service} $(hostname); ' - 'else service {linux_service} restart; fi').format( - linux_service=self.linux_service, - pcs_service=self.pcs_service) - self.terminate_cmd = ( - 'if pcs resource show {pcs_service}; ' - 'then pcs resource ban {pcs_service} $(hostname); ' - 'else service {linux_service} stop; fi').format( - linux_service=self.linux_service, - pcs_service=self.pcs_service) - self.start_cmd = ( - 'if pcs resource show {pcs_service}; ' - 'then pcs resource clear {pcs_service} $(hostname); ' - 'else service {linux_service} start; fi').format( - linux_service=self.linux_service, - pcs_service=self.pcs_service) - - class FuelManagement(cloud_management.CloudManagement, node_discover.NodeDiscover): """Fuel driver. diff --git a/os_faults/drivers/cloud/tcpcloud.py b/os_faults/drivers/cloud/tcpcloud.py index a7d961f..1191756 100644 --- a/os_faults/drivers/cloud/tcpcloud.py +++ b/os_faults/drivers/cloud/tcpcloud.py @@ -19,7 +19,6 @@ from os_faults.ansible import executor from os_faults.api import cloud_management from os_faults.api import node_collection from os_faults.api import node_discover -from os_faults.drivers import service from os_faults import error LOG = logging.getLogger(__name__) @@ -34,59 +33,6 @@ class TCPCloudNodeCollection(node_collection.NodeCollection): raise NotImplementedError -SALT_CALL = 'salt-call --local --retcode-passthrough ' -SALT_RESTART = SALT_CALL + 'service.restart {service}' -SALT_TERMINATE = SALT_CALL + 'service.stop {service}' -SALT_START = SALT_CALL + 'service.start {service}' - - -class SaltService(service.ServiceAsProcess): - """Salt service - - Service that can be controlled by `salt service.*` commands. - - **Example configuration:** - - .. code-block:: yaml - - services: - app: - driver: salt_service - args: - salt_service: app - grep: my_app - port: ['tcp', 4242] - - parameters: - - - **salt_service** - name of a service - - **grep** - regexp for grep to find process PID - - **port** - tuple with two values - protocol, port number (optional) - - """ - - NAME = 'salt_service' - DESCRIPTION = 'Service in salt' - CONFIG_SCHEMA = { - 'type': 'object', - 'properties': { - 'salt_service': {'type': 'string'}, - 'grep': {'type': 'string'}, - 'port': service.PORT_SCHEMA, - }, - 'required': ['grep', 'salt_service'], - 'additionalProperties': False, - } - - def __init__(self, *args, **kwargs): - super(SaltService, self).__init__(*args, **kwargs) - self.salt_service = self.config['salt_service'] - - self.restart_cmd = SALT_RESTART.format(service=self.salt_service) - self.terminate_cmd = SALT_TERMINATE.format(service=self.salt_service) - self.start_cmd = SALT_START.format(service=self.salt_service) - - class TCPCloudManagement(cloud_management.CloudManagement, node_discover.NodeDiscover): """TCPCloud driver. diff --git a/os_faults/drivers/services/__init__.py b/os_faults/drivers/services/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/os_faults/drivers/services/linux.py b/os_faults/drivers/services/linux.py new file mode 100644 index 0000000..1a75695 --- /dev/null +++ b/os_faults/drivers/services/linux.py @@ -0,0 +1,61 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from os_faults.drivers.services import process + + +class LinuxService(process.ServiceAsProcess): + """Linux service + + Service that is defined in init.d and can be controlled by `service` + CLI tool. + + **Example configuration:** + + .. code-block:: yaml + + services: + app: + driver: linux_service + args: + linux_service: app + grep: my_app + port: ['tcp', 4242] + + parameters: + + - **linux_service** - name of a service + - **grep** - regexp for grep to find process PID + - **port** - tuple with two values - protocol, port number (optional) + + """ + NAME = 'linux_service' + DESCRIPTION = 'Service in init.d' + CONFIG_SCHEMA = { + 'type': 'object', + 'properties': { + 'linux_service': {'type': 'string'}, + 'grep': {'type': 'string'}, + 'port': process.PORT_SCHEMA, + }, + 'required': ['grep', 'linux_service'], + 'additionalProperties': False, + } + + def __init__(self, *args, **kwargs): + super(LinuxService, self).__init__(*args, **kwargs) + self.linux_service = self.config['linux_service'] + + self.restart_cmd = 'service {} restart'.format(self.linux_service) + self.terminate_cmd = 'service {} stop'.format(self.linux_service) + self.start_cmd = 'service {} start'.format(self.linux_service) diff --git a/os_faults/drivers/services/pcs.py b/os_faults/drivers/services/pcs.py new file mode 100644 index 0000000..beec348 --- /dev/null +++ b/os_faults/drivers/services/pcs.py @@ -0,0 +1,135 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +import logging + +from os_faults.drivers.services import process + +LOG = logging.getLogger(__name__) + + +class PcsService(process.ServiceAsProcess): + """Service as a resource in Pacemaker + + Service that can be controlled by `pcs resource` CLI tool. + + **Example configuration:** + + .. code-block:: yaml + + services: + app: + driver: pcs_service + args: + pcs_service: app + grep: my_app + port: ['tcp', 4242] + + parameters: + + - **pcs_service** - name of a service + - **grep** - regexp for grep to find process PID + - **port** - tuple with two values - protocol, port number (optional) + """ + + NAME = 'pcs_service' + DESCRIPTION = 'Service in pacemaker' + CONFIG_SCHEMA = { + 'type': 'object', + 'properties': { + 'pcs_service': {'type': 'string'}, + 'grep': {'type': 'string'}, + 'port': process.PORT_SCHEMA, + }, + 'required': ['grep', 'pcs_service'], + 'additionalProperties': False, + } + + def __init__(self, *args, **kwargs): + super(PcsService, self).__init__(*args, **kwargs) + self.pcs_service = self.config['pcs_service'] + + self.restart_cmd = 'pcs resource restart {} $(hostname)'.format( + self.pcs_service) + self.terminate_cmd = 'pcs resource ban {} $(hostname)'.format( + self.pcs_service) + self.start_cmd = 'pcs resource clear {} $(hostname)'.format( + self.pcs_service) + + +class PcsOrLinuxService(process.ServiceAsProcess): + """Service as a resource in Pacemaker or Linux service + + Service that can be controlled by `pcs resource` CLI tool or + linux `service` tool. This is a hybrid driver that tries to find + service in Pacemaker and uses linux `service` if it is not found + there. + + **Example configuration:** + + .. code-block:: yaml + + services: + app: + driver: pcs_or_linux_service + args: + pcs_service: p_app + linux_service: app + grep: my_app + port: ['tcp', 4242] + + parameters: + + - **pcs_service** - name of a service in Pacemaker + - **linux_service** - name of a service in init.d + - **grep** - regexp for grep to find process PID + - **port** - tuple with two values - protocol, port number (optional) + """ + + NAME = 'pcs_or_linux_service' + DESCRIPTION = 'Service in pacemaker or init.d' + CONFIG_SCHEMA = { + 'type': 'object', + 'properties': { + 'pcs_service': {'type': 'string'}, + 'linux_service': {'type': 'string'}, + 'grep': {'type': 'string'}, + 'port': process.PORT_SCHEMA, + }, + 'required': ['grep', 'pcs_service', 'linux_service'], + 'additionalProperties': False, + } + + def __init__(self, *args, **kwargs): + super(PcsOrLinuxService, self).__init__(*args, **kwargs) + self.pcs_service = self.config.get('pcs_service') + self.linux_service = self.config.get('linux_service') + + self.restart_cmd = ( + 'if pcs resource show {pcs_service}; ' + 'then pcs resource restart {pcs_service} $(hostname); ' + 'else service {linux_service} restart; fi').format( + linux_service=self.linux_service, + pcs_service=self.pcs_service) + self.terminate_cmd = ( + 'if pcs resource show {pcs_service}; ' + 'then pcs resource ban {pcs_service} $(hostname); ' + 'else service {linux_service} stop; fi').format( + linux_service=self.linux_service, + pcs_service=self.pcs_service) + self.start_cmd = ( + 'if pcs resource show {pcs_service}; ' + 'then pcs resource clear {pcs_service} $(hostname); ' + 'else service {linux_service} start; fi').format( + linux_service=self.linux_service, + pcs_service=self.pcs_service) diff --git a/os_faults/drivers/service.py b/os_faults/drivers/services/process.py similarity index 66% rename from os_faults/drivers/service.py rename to os_faults/drivers/services/process.py index c30a903..d253cde 100644 --- a/os_faults/drivers/service.py +++ b/os_faults/drivers/services/process.py @@ -60,7 +60,7 @@ class ServiceAsProcess(service.Service): - **restart_cmd** - command to restart service (optional) - **terminate_cmd** - command to terminate service (optional) - **start_cmd** - command to start service (optional) - - **port** - tuple with two values - potocol, port number (optional) + - **port** - tuple with two values - protocol, port number (optional) """ @@ -162,102 +162,3 @@ class ServiceAsProcess(service.Service): } } self._run_task(nodes, task, message) - - -class LinuxService(ServiceAsProcess): - """Linux service - - Service that is defined in init.d and can be controled by `service` - CLI tool. - - **Example configuration:** - - .. code-block:: yaml - - services: - app: - driver: linux_service - args: - linux_service: app - grep: my_app - port: ['tcp', 4242] - - parameters: - - - **linux_service** - name of a service - - **grep** - regexp for grep to find process PID - - **port** - tuple with two values - potocol, port number (optional) - - """ - NAME = 'linux_service' - DESCRIPTION = 'Service in init.d' - CONFIG_SCHEMA = { - 'type': 'object', - 'properties': { - 'linux_service': {'type': 'string'}, - 'grep': {'type': 'string'}, - 'port': PORT_SCHEMA, - }, - 'required': ['grep', 'linux_service'], - 'additionalProperties': False, - } - - def __init__(self, *args, **kwargs): - super(LinuxService, self).__init__(*args, **kwargs) - self.linux_service = self.config['linux_service'] - - self.restart_cmd = 'service {} restart'.format(self.linux_service) - self.terminate_cmd = 'service {} stop'.format(self.linux_service) - self.start_cmd = 'service {} start'.format(self.linux_service) - - -class SystemdService(ServiceAsProcess): - """Systemd service. - - Service as Systemd unit and can be controlled by `systemctl` CLI tool. - - **Example configuration:** - - .. code-block:: yaml - - services: - app: - driver: systemd_service - args: - systemd_service: app - grep: my_app - port: ['tcp', 4242] - - parameters: - - - **systemd_service** - name of a service in systemd - - **grep** - regexp for grep to find process PID - - **port** - tuple with two values - protocol, port number (optional) - - """ - NAME = 'systemd_service' - DESCRIPTION = 'Service in Systemd' - CONFIG_SCHEMA = { - 'type': 'object', - 'properties': { - 'systemd_service': {'type': 'string'}, - 'grep': {'type': 'string'}, - 'port': PORT_SCHEMA, - 'start_cmd': {'type': 'string'}, - 'terminate_cmd': {'type': 'string'}, - 'restart_cmd': {'type': 'string'}, - }, - 'required': ['grep', 'systemd_service'], - 'additionalProperties': False, - } - - def __init__(self, *args, **kwargs): - super(SystemdService, self).__init__(*args, **kwargs) - self.systemd_service = self.config['systemd_service'] - - self.restart_cmd = 'sudo systemctl restart {}'.format( - self.systemd_service) - self.terminate_cmd = 'sudo systemctl stop {}'.format( - self.systemd_service) - self.start_cmd = 'sudo systemctl start {}'.format( - self.systemd_service) diff --git a/os_faults/drivers/services/salt.py b/os_faults/drivers/services/salt.py new file mode 100644 index 0000000..fc82352 --- /dev/null +++ b/os_faults/drivers/services/salt.py @@ -0,0 +1,66 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from os_faults.drivers.services import process + +SALT_CALL = 'salt-call --local --retcode-passthrough ' +SALT_RESTART = SALT_CALL + 'service.restart {service}' +SALT_TERMINATE = SALT_CALL + 'service.stop {service}' +SALT_START = SALT_CALL + 'service.start {service}' + + +class SaltService(process.ServiceAsProcess): + """Salt service + + Service that can be controlled by `salt service.*` commands. + + **Example configuration:** + + .. code-block:: yaml + + services: + app: + driver: salt_service + args: + salt_service: app + grep: my_app + port: ['tcp', 4242] + + parameters: + + - **salt_service** - name of a service + - **grep** - regexp for grep to find process PID + - **port** - tuple with two values - protocol, port number (optional) + + """ + + NAME = 'salt_service' + DESCRIPTION = 'Service in salt' + CONFIG_SCHEMA = { + 'type': 'object', + 'properties': { + 'salt_service': {'type': 'string'}, + 'grep': {'type': 'string'}, + 'port': process.PORT_SCHEMA, + }, + 'required': ['grep', 'salt_service'], + 'additionalProperties': False, + } + + def __init__(self, *args, **kwargs): + super(SaltService, self).__init__(*args, **kwargs) + self.salt_service = self.config['salt_service'] + + self.restart_cmd = SALT_RESTART.format(service=self.salt_service) + self.terminate_cmd = SALT_TERMINATE.format(service=self.salt_service) + self.start_cmd = SALT_START.format(service=self.salt_service) diff --git a/os_faults/drivers/services/systemd.py b/os_faults/drivers/services/systemd.py new file mode 100644 index 0000000..f68faf8 --- /dev/null +++ b/os_faults/drivers/services/systemd.py @@ -0,0 +1,66 @@ +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or +# implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +from os_faults.drivers.services import process + + +class SystemdService(process.ServiceAsProcess): + """Systemd service. + + Service as Systemd unit and can be controlled by `systemctl` CLI tool. + + **Example configuration:** + + .. code-block:: yaml + + services: + app: + driver: systemd_service + args: + systemd_service: app + grep: my_app + port: ['tcp', 4242] + + parameters: + + - **systemd_service** - name of a service in systemd + - **grep** - regexp for grep to find process PID + - **port** - tuple with two values - protocol, port number (optional) + + """ + NAME = 'systemd_service' + DESCRIPTION = 'Service in Systemd' + CONFIG_SCHEMA = { + 'type': 'object', + 'properties': { + 'systemd_service': {'type': 'string'}, + 'grep': {'type': 'string'}, + 'port': process.PORT_SCHEMA, + 'start_cmd': {'type': 'string'}, + 'terminate_cmd': {'type': 'string'}, + 'restart_cmd': {'type': 'string'}, + }, + 'required': ['grep', 'systemd_service'], + 'additionalProperties': False, + } + + def __init__(self, *args, **kwargs): + super(SystemdService, self).__init__(*args, **kwargs) + self.systemd_service = self.config['systemd_service'] + + self.restart_cmd = 'sudo systemctl restart {}'.format( + self.systemd_service) + self.terminate_cmd = 'sudo systemctl stop {}'.format( + self.systemd_service) + self.start_cmd = 'sudo systemctl start {}'.format( + self.systemd_service)