From cd51cbae166cb6ac15eba6c7196b7b680ba8d1d8 Mon Sep 17 00:00:00 2001 From: Ilya Shakhat Date: Mon, 2 Oct 2017 17:53:40 +0200 Subject: [PATCH] Universal driver for any system services (systemd, upstart, etc.) This patch introduces `system_service` driver for services supported by Ansible. Change-Id: Ib22c7f2a83fb5acf3cb4b5e980ac798abdf54ae3 --- os_faults/drivers/services/system.py | 84 ++++++++++++++++++++++++++++ os_faults/drivers/shared_schemas.py | 23 ++++++++ 2 files changed, 107 insertions(+) create mode 100644 os_faults/drivers/services/system.py create mode 100644 os_faults/drivers/shared_schemas.py diff --git a/os_faults/drivers/services/system.py b/os_faults/drivers/services/system.py new file mode 100644 index 0000000..6b537eb --- /dev/null +++ b/os_faults/drivers/services/system.py @@ -0,0 +1,84 @@ +# 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 +from os_faults.drivers import shared_schemas + + +class SystemService(process.ServiceAsProcess): + """System service + + This is universal driver for any system services supported by Ansible + (e.g. systemd, upstart). Please refer to Ansible documentation + http://docs.ansible.com/ansible/latest/service_module.html for the + whole list. + + **Example configuration:** + + .. code-block:: yaml + + services: + app: + driver: system_service + args: + service_name: app + grep: my_app + port: ['tcp', 4242] + + parameters: + + - **service_name** - name of a service + - **grep** - regexp for grep to find process PID + - **port** - tuple with two values - protocol, port number (optional) + """ + NAME = 'system_service' + DESCRIPTION = 'System Service (systemd, upstart, SysV, etc.)' + CONFIG_SCHEMA = { + 'type': 'object', + 'properties': { + 'service_name': {'type': 'string'}, + 'grep': {'type': 'string'}, + 'port': shared_schemas.PORT_SCHEMA, + }, + 'required': ['grep', 'service_name'], + 'additionalProperties': False, + } + + def __init__(self, *args, **kwargs): + super(SystemService, self).__init__(*args, **kwargs) + self.service_name = self.config['service_name'] + + def start(self, nodes=None): + task = { + 'service': { + 'name': self.service_name, 'state': 'started' + }, + } + self._run_task(nodes, task, 'Start') + + def terminate(self, nodes=None): + task = { + 'service': { + 'name': self.service_name, 'state': 'stopped', + 'pattern': self.grep, + }, + } + self._run_task(nodes, task, 'Terminate') + + def restart(self, nodes=None): + task = { + 'service': { + 'name': self.service_name, 'state': 'restarted' + }, + } + self._run_task(nodes, task, 'Restart') diff --git a/os_faults/drivers/shared_schemas.py b/os_faults/drivers/shared_schemas.py new file mode 100644 index 0000000..0460f64 --- /dev/null +++ b/os_faults/drivers/shared_schemas.py @@ -0,0 +1,23 @@ +# 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. + + +PORT_SCHEMA = { + 'type': 'array', + 'items': [ + {'enum': ['tcp', 'udp']}, + {'type': 'integer', 'minimum': 0, 'maximum': 65535}, + ], + 'minItems': 2, + 'maxItems': 2, +}