boylegu/regal

View on GitHub
regal/grouping.py

Summary

Maintainability
A
35 mins
Test Coverage
# coding: utf-8
from operator import contains

from six.moves import xrange


class GroupAlgorithm(object):
    """
    一个abstraction class,主要实现了分流算法的接口,不过代码应该还可以再一次深度优化;

    """
    base_hostlist = None
    host_list = None

    @classmethod
    def recursive_grouping(cls, hosts, combine, hostindex, init_host, base_hostlist):

        baselist = base_hostlist

        def grouping(hosts, combine, hostindex, init_host, init_n=0):
            try:
                f_count = init_n + 1  # 记录创建子列表的次数
                baselist[hostindex][1][0] = [init_host]
                baselist[hostindex][1].append(list())
                for i in xrange(combine):
                    baselist[hostindex][1][init_n + 1].append(hosts.pop())
            except IndexError:
                return 0
            else:
                return grouping(hosts, combine, hostindex, init_host, f_count)

        return grouping(hosts, combine, hostindex, init_host, init_n=0)

    def initialize(self, hostinfo):
        self.base_hostlist = list()
        self.host_list = [(i[0], ','.join(i[1]).split(',')) for i in hostinfo]
        return

    def calculate(self, combine, schedule):
        for infoindex, info in enumerate(self.host_list):
            self.base_hostlist.append((info[0], [[]]))
            # print ','.join(info[1][:2])
            hosts = info[1][schedule:]
            hosts.reverse()
            GroupAlgorithm.recursive_grouping(
                hosts=hosts, combine=combine, hostindex=infoindex,
                init_host=','.join(info[1][:schedule]), base_hostlist=self.base_hostlist)

            if not self.base_hostlist[infoindex][1][-1]:
                self.base_hostlist[infoindex][1].pop(-1)
        return

    def final(self, priority_name):
        base_hostlist = self.base_hostlist
        if priority_name:
            base_hostlist = sorted(
                base_hostlist, key=lambda x: contains(x[0], priority_name), reverse=True)
        return base_hostlist