Exemple #1
0
 def __init__(self):
     self.rule_info_list = self.load_all_rules()
     self.agenda_manager = AgendaManager()
Exemple #2
0
class RuleManager():

    def __init__(self):
        self.rule_info_list = self.load_all_rules()
        self.agenda_manager = AgendaManager()

    def load_all_rules(self):
        _info_list = collections.defaultdict(dict)
        _policy_files = self.load_policy_files()
        for _policy in _policy_files:
            _policy_info = self.load_rule_info(_policy)
            for _key,_val in _policy_info.iteritems():
                _info_list[_policy][_key] = _val
        return _info_list

    def load_rule_info(self, _name):
        _info_line = re.compile(r'^\S+\=\S+$')
        _numeric = re.compile(r'^\d+(\.\d*)?$')
        _ruleFile = open( policies.__path__[0] + '/' + _name, 'r')
        _rule_info = { }

        for _line in _ruleFile:
            if _info_line.match(_line):
                _tokens = _line.rstrip().split('=')
                _rule_info[_tokens[0]] = _tokens[1][1:-1] if not _numeric.match(_tokens[1]) else _tokens[1]

        _ruleFile.close()

        return _rule_info

    def load_policy_files(self):
        def is_policy(_file):
            return _file.endswith('.policy')

        _rules = filter(is_policy, os.listdir( policies.__path__[0]))
        return _rules

    def print_policy_files(self):
        i = 1
        for _policy,_ in self.rule_info_list.iteritems():
            print("{0}) {1}".format(i,_policy[0:-7]))
            i += 1

    def write_down(self, _rule_vars, _mode='create'):
        _section = re.compile(r'^\[\w+\]$')
        _numeric = re.compile(r'^\d+(\.\d*)?$')
        _skel = { }
        _File = open('./rules/skel/template.policy', 'r')
        _OFile = open( policies.__path__[0] + '/' + _rule_vars['rule_name'] +  '.policy', 'a')
        if _mode is 'update':
            _OFile.seek(0)
            _OFile.truncate()

        _sect = ''
        for _line in _File:
            if _section.match(_line):
                _skel[_line[1:-2]] = [ ]
                _sect = _line[1:-2]
            else:
                _skel[_sect].append(_line[0:-1])
        _File.close()

        _OFile.write("## Policy generated from Rulemanager ##\n\n")
        _OFile.write("## Import Statements ##\n\n")

        for _line in _skel['imports']:
            _OFile.write(_line + '\n')
        """
        _rule_vars = {
            'rule_name' : name,
            'rule_agenda' : 'cpu',
            'rule_metric' : 'CPU',
            'rule_threshold' : '0.2',
            'rule_operator' : 'tope',
            'rule_action' : 'alarm',
            }
        """
        _OFile.write("\n## Rule Parameters ##\n")
        for _var_key, _var_val in _rule_vars.iteritems():
            for _line  in _skel['rule_params']:
                if _var_key in _line:
                    if _numeric.match(_var_val):
                        _newline = _line + _var_val
                    else:
                        _newline = _line + '"' + _var_val + '"'
                    _OFile.write(_newline + '\n')

        _OFile.write("\n## Rule Body ##\n")
        for _line  in _skel['rule_body']:
            if 'NAME' in _line:
                _newline = re.sub('NAME', 'rule_name', _line)
                _OFile.write(_newline + '\n')
            elif 'AGENDA' in _line:
                _newline = re.sub('AGENDA', 'agenda-group ' + _rule_vars['rule_agenda'], _line)
                _OFile.write(_newline + '\n')
            elif 'WHEN' in _line:
                if _rule_vars['rule_operator'] == 'top':
                    _operator = '>'
                elif _rule_vars['rule_operator'] == 'bottom':
                    _operator = '<'
                _newline=re.sub('WHEN', '$resource := Resource( get_sample(get_metric(rule_metric,MetaManager.get_current()))'+ _operator + 'rule_threshold )', _line)
                _OFile.write(_newline + '\n')
            elif 'ACTION' in _line:
                _newline = re.sub('ACTION', '$resource.action(rule_action)', _line)
                _OFile.write(_newline + '\n')
            else:
                _OFile.write(_line + '\n')
        _OFile.close()

    def do_delete_rule(self, _rule):
        os.remove( policies.__path__[0] + '/' + _rule)
        self.rule_info_list = self.load_all_rules()

    def print_rules(self):
        print('#### Rules ####\n')
        print("%s %s %s %s %s %s" % ("|Name|", "Agenda|", "Metric|", "Threshold|","Operator|","Action|"))
        for _, _rule in self.rule_info_list.iteritems():
            print('|{0}| {1}| {2}| {3}| {4}| {5}|'.format(_rule['rule_name'],_rule['rule_agenda'],_rule['rule_metric'],_rule['rule_threshold'],_rule['rule_operator'],_rule['rule_action'] ))

    def menu_action(self,_action):

        if _action is 'remove':
            self.print_policy_files()
            print("Which policy do you want to delete?\n")
            choice = input('Please make a choice: ')
            self.do_delete_rule(self.rule_info_list.keys()[choice-1])

        elif _action is 'create':
            _rule_params = { }

            print("Insert policy name\n")
            _name = raw_input('name: ')
            _rule_params['rule_name'] = _name

            print("Insert Agenda-group name\n")
            _agenda = raw_input('Agenda-group: ')
            _rule_params['rule_agenda'] = _agenda

            print("Insert metric name\n")
            _metric = raw_input('metric: ')
            _rule_params['rule_metric'] = _metric

            print("Insert threshold\n")
            _threshold = raw_input('threshold: ')
            _rule_params['rule_threshold'] = _threshold

            print("Insert operator\n")
            _operator = raw_input('operator: ')
            _rule_params['rule_operator'] = _operator

            print("Insert action\n")
            _action = raw_input('action: ')
            _rule_params['rule_action'] = _action

            self.write_down(_rule_params)
            #del self.rule_info_list
            self.rule_info_list = self.load_all_rules()

        elif _action is 'update':
            self.print_policy_files()
            print("Which policy do you want to modify?\n")
            choice = input('Please make a choice: ')
            _rule_params = self.load_rule_info(self.rule_info_list.keys()[choice-1])

            print("Insert Agenda-group name\n")
            _agenda = raw_input('Agenda-group: (current: {0})\n'.format(_rule_params['rule_agenda']))
            if _agenda:
                _rule_params['rule_agenda'] = _agenda

            print("Insert metric name\n")
            _metric = raw_input('metric: (current: {0})\n'.format(_rule_params['rule_metric']))
            if _metric:
                _rule_params['rule_metric'] = _metric

            print("Insert threshold\n")
            _threshold = raw_input('threshold: (current: {0})\n'.format(_rule_params['rule_threshold']))
            if _threshold:
                _rule_params['rule_threshold'] = _threshold

            print("Insert operator\n")
            _operator = raw_input('operator: (current: {0})\n'.format(_rule_params['rule_operator']))
            if _operator:
                _rule_params['rule_operator'] = _operator

            print("Insert action\n")
            _action = raw_input('action: (current: {0})\n'.format(_rule_params['rule_action']))
            if _action:
                _rule_params['rule_action'] = _action

            self.write_down(_rule_params,'update')
            self.rule_info_list = self.load_all_rules()

        elif _action is 'print':
            self.print_rules()

    def show_menu(self):
        menu_text = """\nWhat would you like to do?
--------------------------
1) Print rules
2) Create rule
3) Modify rule
4) Delete rule
5) Manage agenda-groups
6) Back to the main menu\n"""
        while True:
            print(menu_text)
            try:
                # user input
                print("Please make a choice: ")
                choice = input()
                if choice == 1:
                    self.menu_action('print')
                elif choice == 2:
                    self.menu_action('create')
                elif choice == 3:
                    self.menu_action('update')
                elif choice == 4:
                    self.menu_action('remove')
                elif choice == 5:
                    self.agenda_manager.show_menu()
                elif choice == 6:
                    break
                else:
                    raise Exception("Unavailable choice!")
            except Exception as e:
                print(e.message)