X-Git-Url: https://git.llucax.com/software/pymin.git/blobdiff_plain/3a113e91bcbc8e34d9ef66915ccec80e6187332b..2f3ca5a1a39c41e65e6a40877ed072a58a271f67:/services/qos/handler.py?ds=sidebyside diff --git a/services/qos/handler.py b/services/qos/handler.py index c175049..59d45ad 100644 --- a/services/qos/handler.py +++ b/services/qos/handler.py @@ -1,211 +1,16 @@ # vim: set encoding=utf-8 et sw=4 sts=4 : -from subprocess import Popen, PIPE from os import path -from pymin.seqtools import Sequence -from pymin.dispatcher import handler, HandlerError, Handler -from pymin.service.util import Restorable, ConfigWriter, InitdHandler, \ - TransactionalHandler, SubHandler, call, \ - get_network_devices, ListComposedSubHandler, \ - DictComposedSubHandler, ExecutionError +from pymin.service.util import Restorable, ConfigWriter, \ + TransactionalHandler, ExecutionError, \ + call, get_network_devices -__all__ = ('QoSHandler', 'get_service') +from cls import ClassHandler +from dev import DeviceHandler, Device +from host import HostHandler - -def get_service(config): - return QoSHandler(config.qos.pickle_dir, config.qos.config_dir) - - -class DeviceError(HandlerError): - - def __init__(self, dev): - self.message = u'Devive error : "%s"' % dev - - -class DeviceNotFoundError(DeviceError): - - def __init__(self, dev): - self.message = u'Device not found : "%s"' % dev - - -class ClassError(HandlerError): - - def __init__(self, cls): - self.message = u'Class error : "%s"' % cls - - -class ClassNotFoundError(ClassError): - - def __init__(self, cls): - self.message = u'Class not found : "%s"' % cls - - -class ClassAlreadyExistsError(ClassError): - - def __init__(self, cls): - self.message = u'Class already exists : "%s"' % cls - - -class HostError(HandlerError): - - def __init__(self, host): - self.message = u'Host error : "%s"' % host - - -class HostNotFoundError(HostError): - - def __init__(self, ip): - self.message = u'Host not found : "%s"' % host - - -class HostAlreadyExistsError(HostError): - - def __init__(self, ip): - self.message = u'Host already exists : "%s"' % host - - -class Class(Sequence): - - def __init__(self, cid, rate=None): - self.cid = cid - self.rate = rate - self.hosts = dict() - - def as_tuple(self): - return (self.cid, self.rate) - - def __cmp__(self, other): - if self.cid == other.cid: - return 0 - return cmp(id(self), id(other)) - - -class ClassHandler(Handler): - - def __init__(self, parent): - self.parent = parent - - @handler('Adds a class : add ') - def add(self, dev, cid, rate): - if not dev in self.parent.devices: - raise DeviceNotFoundError(dev) - - try: - self.parent.devices[dev].classes[cid] = Class(cid, rate) - except ValueError: - raise ClassAlreadyExistsError(cid + ' -> ' + dev) - - @handler(u'Deletes a class : delete ') - def delete(self, dev, cid): - if not dev in self.parent.devices: - raise DeviceNotFoundError(dev) - - try: - del self.parent.devices[dev].classes[cid] - except KeyError: - raise ClassNotFoundError(cid + ' -> ' + dev) - - @handler(u'Lists classes : list ') - def list(self, dev): - try: - k = self.parent.devices[dev].classes.items() - except KeyError: - k = dict() - return k - - -class Host(Sequence): - - def __init__(self, ip): - self.ip = ip - - def as_tuple(self): - return (self.ip) - - def __cmp__(self, other): - if self.ip == other.ip: - return 0 - return cmp(id(self), id(other)) - - -class HostHandler(SubHandler): - - def __init__(self, parent): - self.parent = parent - - @handler('Adds a host to a class : add ') - def add(self, dev, cid, ip): - if not dev in self.parent.devices: - raise DeviceNotFoundError(dev) - - if not cid in self.parent.devices[dev].classes: - raise ClassNotFoundError(cid) - - try: - self.parent.devices[dev].classes[cid].hosts[ip] = Host(ip) - except ValueError: - raise HostAlreadyExistsError(h + ' -> ' + dev) - - @handler(u'Lists hosts : list ') - def list(self, dev, cid): - try: - k = self.parent.devices[dev].classes[cid].hosts.keys() - except KeyError: - k = dict() - return k - - -class Device(Sequence): - - def __init__(self, name, mac): - self.name = name - self.mac = mac - self.classes = dict() - - def as_tuple(self): - return (self.name, self.mac) - - -class DeviceHandler(SubHandler): - - handler_help = u"Manage network devices" - - def __init__(self, parent): - # FIXME remove templates to execute commands - from mako.template import Template - self.parent = parent - template_dir = path.join(path.dirname(__file__), 'templates') - dev_fn = path.join(template_dir, 'device') - self.device_template = Template(filename=dev_fn) - - @handler(u'Bring the device up') - def up(self, name): - if name in self.parent.devices: - try: - call(self.device_template.render(dev=name, action='add'), shell=True) - except ExecutionError: - pass - else: - raise DeviceNotFoundError(name) - - @handler(u'Bring the device down') - def down(self, name): - if name in self.parent.devices: - try: - call(self.device_template.render(dev=name, action='del'), shell=True) - except ExecutionError: - pass - else: - raise DeviceNotFoundError(name) - - @handler(u'List all devices') - def list(self): - return self.parent.devices.keys() - - @handler(u'Get information about a device') - def show(self): - return self.parent.devices.items() +__all__ = ('QoSHandler',) class QoSHandler(Restorable, ConfigWriter, TransactionalHandler): @@ -289,3 +94,4 @@ if __name__ == '__main__': qos = QoSHandler() print '----------------------' qos.commit() +