monasca-agent/monasca_setup/detection/plugin.py

101 lines
3.1 KiB
Python

# (C) Copyright 2015 Hewlett Packard Enterprise Development Company LP
# 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.
"""Classes for detection of running resources to be monitored.
Detection classes should be platform independent
"""
import ast
import logging
import sys
log = logging.getLogger(__name__)
class Plugin(object):
"""Abstract class for the monasca-agent plugin detection."""
def __init__(self, template_dir, overwrite=True, args=None):
self.available = False
self.template_dir = template_dir
self.dependencies = ()
self.overwrite = overwrite
if args is not None and isinstance(args, str):
try:
# Turn 'hostname=host type=ping' to dictionary
# {'hostname': 'host', 'type': 'ping'}
self.args = dict([a.split('=') for a in args.split()])
except Exception:
log.exception('Error parsing detection arguments')
sys.exit(1)
elif isinstance(args, dict):
self.args = args
else:
self.args = None
self._detect()
def _detect(self):
"""Run detection.
Set self.available True if the service is detected.
"""
raise NotImplementedError
def build_config(self):
"""Build the config as a Plugins object and return."""
raise NotImplementedError
def build_config_with_name(self):
"""Build the config and then add 'built_by' field.
Build the config and then add 'built_by' field to each instance in
the config.
built_by is set to the plugin name
:return: An agent_config.Plugins object
"""
conf = self.build_config()
if conf is None:
return None
for plugin_type in conf.itervalues():
for inst in plugin_type['instances']:
inst['built_by'] = self.__class__.__name__
return conf
def dependencies_installed(self):
"""Return True if dependencies are installed.
"""
raise NotImplementedError
@staticmethod
def literal_eval(testval):
"""Return a literal boolean value if applicable
"""
if 'false' in str(testval).lower() or 'true' in str(testval).lower():
return ast.literal_eval(str(testval).capitalize())
else:
return testval
@property
def name(self):
"""Return _name if set otherwise the class name.
"""
if '_name' in self.__dict__:
return self._name
else:
return self.__class__.__name__