示例#1
0
    def add_server(self, server=None, backend=None):
        '''Add server with ipaddr in backend section'''
        self.cfg.reload()

        if backend:
            backend = backend.strip()

        LOG.debug('HAProxyAPI.add_server')
        LOG.debug('     %s' % haproxy.naming('backend', backend=backend))

        bnds = self.cfg.sections(haproxy.naming('backend', backend=backend))
        if not bnds:
            if backend:
                raise exceptions.NotFound('Backend not found: %s' %
                                          (backend, ))
            else:
                raise exceptions.Empty('No listeners to add server to')

        #with self.svc.trans(exit='running'):
        #with self.cfg.trans(exit='working'):

        server.setdefault("check", True)

        server = rename(server)
        for bnd in bnds:
            self.cfg.backends[bnd]['server'][self._server_name(
                server)] = server

        self.cfg.save()
        self.svc.reload()
示例#2
0
def import_class(import_str):
    """Returns a class from a string including module and class"""
    module, cls_name = import_str.rsplit('.', 1)
    try:
        if module not in sys.modules:
            __import__(module)
        return getattr(sys.modules[module], cls_name)
    except:
        raise exceptions.NotFound('Class %s cannot be found' % import_str)
示例#3
0
    def delete_listener(self, port=None, protocol=None):
        """
        Removes listen section(s) by port (and)or protocol.
        """

        ln = haproxy.naming('listen', protocol, port)
        if not self.cfg.sections(ln):
            raise exceptions.NotFound('Listen `%s` not found can`t remove it' %
                                      ln)
        try:
            default_backend = self.cfg.listener[ln]['default_backend']
        except:
            default_backend = None

        for path in self.cfg.sections(ln):
            del self.cfg['listen'][ln]
            LOG.debug('HAProxyAPI.delete_listener: removed listener `%s`' % ln)

        if default_backend:
            has_ref = False
            for ln in self.cfg.listener:
                try:
                    if self.cfg.listener[ln][
                            'default_backend'] == default_backend:
                        has_ref = True
                        break
                except:
                    pass
            if not has_ref:
                #it not used in other section, so will be deleting
                del self.cfg.backends[default_backend]

        try:
            if iptables.enabled():
                iptables.FIREWALL.remove({
                    "jump": "ACCEPT",
                    "protocol": "tcp",
                    "match": "tcp",
                    "dport": port
                })
        except Exception, e:
            raise exceptions.NotFound(e)
示例#4
0
    def reset_healthcheck(self, target):  # TODO: figure out what target is
        """
        Return to defaults for `target` backend sections
        """
        target = target.strip()
        # backend_name = self.naming_mgr.get_pattern({}) haproxy.naming('backend', backend=target) + '*'
        backend_xpaths = self.cfg.find_all_xpaths('backend', '/name', target)
        if backend_xpaths == None:
            raise exceptions.NotFound('Backend `%s` not found' % target)
        for backend_xpath in backend_xpaths:
            self.cfg.set(backend_xpath, HEALTHCHECK_DEFAULTS)

        self.cfg.save()
        self.svc.reload()
示例#5
0
    def configure_healthcheck(self,
                              target=None,
                              interval=None,
                              timeout=None,
                              unhealthy_threshold=None,
                              healthy_threshold=None):
        """
        APIDOC TBD.
        """
        try:
            if interval == 'None': interval = None
            int(interval)
            interval = '%ss' % interval
        except:
            pass
        try:
            if timeout == 'None': timeout = None
            int(timeout)
            timeout = '%ss' % timeout
        except:
            pass

        bnds = haproxy.naming('backend', backend=target)
        if not self.cfg.sections(bnds):
            raise exceptions.NotFound('Backend `%s` not found' % bnds)

        for bnd in self.cfg.sections(bnds):
            if timeout:
                if isinstance(timeout, dict):
                    self.cfg['backend'][bnd]['timeout'] = timeout
                else:
                    self.cfg['backend'][bnd]['timeout'] = {
                        'check': str(timeout)
                    }
            default_server = {
                'inter': interval,
                'fall': unhealthy_threshold,
                'rise': healthy_threshold
            }
            self.cfg['backend'][bnd]['default-server'] = default_server
            for srv in self.cfg['backend'][bnd]['server']:
                server = self.cfg['backend'][bnd]['server'][srv]
                server.update({'check': True})
                self.cfg['backend'][bnd]['server'][srv] = server
        #with self.svc.trans(exit='running'):
        #       with self.cfg.trans(enter='reload', exit='working'):
        self.cfg.save()
        self.svc.reload()
示例#6
0
def import_class(import_str):
    """Returns a class from a string including module and class"""
    mod_str, _sep, class_str = import_str.rpartition('.')
    try:
        loader = pkgutil.find_loader(mod_str)
        if not loader:
            raise ImportError('No module named %s' % mod_str)
    except ImportError:
        pass
    else:
        loader.load_module('')
        try:
            return getattr(sys.modules[mod_str], class_str)
        except (ValueError, AttributeError):
            pass
    raise exceptions.NotFound('Class %s cannot be found' % import_str)
示例#7
0
    def reset_healthcheck(self, target):
        '''Return to defaults for `tartget` backend sections'''
        target = target.strip()
        bnds = haproxy.naming('backend', backend=target)
        if not self.cfg.sections(bnds):
            raise exceptions.NotFound('Backend `%s` not found' % target)
        for bnd in self.cfg.sections(bnds):
            backend = self.cfg['backend'][bnd]
            backend.update(HEALTHCHECK_DEFAULTS)
            self.cfg['backend'][bnd] = backend

        #with self.svc.trans(exit='running'):
        #       with self.cfg.trans(enter='reload', exit='working'):
        #TODO: with...
        self.cfg.save()
        self.svc.reload()
示例#8
0
    def add_server(self, server=None, backend=None):
        """
        Adds server with ipaddr to backend section.

        :param server: Server configuration.
        :type server: dict

        :param backend: Backend name.
        :type backend: str

        Example::

            TBD.
        """
        self.cfg.load()

        if backend:
            backend = backend.strip()

        LOG.debug('HAProxyAPI.add_server')

        backend_xpaths = self.cfg.get_all_xpaths('backend')
        if backend_xpaths is None:
            if backend:
                raise exceptions.NotFound('Backend not found: %s' %
                                          (backend, ))
            else:
                raise exceptions.Empty('No listeners to add server to')

        server.setdefault("check", True)
        server['name'] = self._server_name(server)
        server = normalize_params(server)
        server = self._ordered_server_params(server)

        for backend_xpath in backend_xpaths:
            self.cfg.add(backend_xpath + '/server', server)

        self.cfg.save()
        self.svc.reload()