)]}'
{"aodh/api/controllers/v2/alarm_rules/composite.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4ee11e706bdad1cfd7133c58d4319a706ee0b0b5","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @staticmethod"},{"line_number":33,"context_line":"    def valid_composite_rule(rules):"},{"line_number":34,"context_line":"        global ALARMS_RULES"},{"line_number":35,"context_line":"        if isinstance(rules, dict) and len(rules) \u003d\u003d 1:"},{"line_number":36,"context_line":"            and_or_key \u003d rules.keys()[0]"},{"line_number":37,"context_line":"            if and_or_key not in (\u0027and\u0027, \u0027or\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_c34fda90","line":34,"updated":"2015-12-31 09:53:54.000000000","message":"I really don\u0027t like this approach. Isn\u0027t there anything better we can do?","commit_id":"7d3ff362bb12e7f5aaa5dcbfd92110926c9e0c4d"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"609b5e281462a0d4fde21e18cbde321fac0f6468","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @staticmethod"},{"line_number":33,"context_line":"    def valid_composite_rule(rules):"},{"line_number":34,"context_line":"        global ALARMS_RULES"},{"line_number":35,"context_line":"        if isinstance(rules, dict) and len(rules) \u003d\u003d 1:"},{"line_number":36,"context_line":"            and_or_key \u003d rules.keys()[0]"},{"line_number":37,"context_line":"            if and_or_key not in (\u0027and\u0027, \u0027or\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_5de609b1","line":34,"in_reply_to":"fa69d971_ba38ab3e","updated":"2016-01-05 11:04:33.000000000","message":"No I meant the global var:)","commit_id":"7d3ff362bb12e7f5aaa5dcbfd92110926c9e0c4d"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"82522f793f9d1af7bd082d6d4d7cce63f84c6cf1","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"    @staticmethod"},{"line_number":33,"context_line":"    def valid_composite_rule(rules):"},{"line_number":34,"context_line":"        global ALARMS_RULES"},{"line_number":35,"context_line":"        if isinstance(rules, dict) and len(rules) \u003d\u003d 1:"},{"line_number":36,"context_line":"            and_or_key \u003d rules.keys()[0]"},{"line_number":37,"context_line":"            if and_or_key not in (\u0027and\u0027, \u0027or\u0027):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_ba38ab3e","line":34,"in_reply_to":"fa69d971_c34fda90","updated":"2016-01-05 07:56:16.000000000","message":"Hi jd,\nyou mean this validation approach (or the global var)?\n\nThe composite rule is a combination with basic threshold rules, and the rules can be combined in nested, optionally. that means the \u0027composite_rule\u0027 field in request body is indefinitely but every basic threshold rule should accord itself definition and validation. this is hardly implemented with WSME, this approach re-use the threshold rule definition and validation.","commit_id":"7d3ff362bb12e7f5aaa5dcbfd92110926c9e0c4d"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4ee11e706bdad1cfd7133c58d4319a706ee0b0b5","unresolved":false,"context_lines":[{"line_number":85,"context_line":"    def update_hook(alarm):"},{"line_number":86,"context_line":"        pass"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    def as_dict(self):"},{"line_number":89,"context_line":"        pass"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def __call__(self, **rule):"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_235fd642","line":88,"updated":"2015-12-31 09:53:54.000000000","message":"can be static as well","commit_id":"7d3ff362bb12e7f5aaa5dcbfd92110926c9e0c4d"},{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4ee11e706bdad1cfd7133c58d4319a706ee0b0b5","unresolved":false,"context_lines":[{"line_number":88,"context_line":"    def as_dict(self):"},{"line_number":89,"context_line":"        pass"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def __call__(self, **rule):"},{"line_number":92,"context_line":"        return rule"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"composite_rule \u003d CompositeRule()"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_435c4a4b","line":91,"updated":"2015-12-31 09:53:54.000000000","message":"ditto","commit_id":"7d3ff362bb12e7f5aaa5dcbfd92110926c9e0c4d"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"f6cc3261ef83b7ab0ab0501a664d6da7ac8e1a17","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class InvalidCompositeRule(base.ClientSideError):"},{"line_number":24,"context_line":"    def __init__(self, error):"},{"line_number":25,"context_line":"        err \u003d _(\u0027Invalid input composite rule: %s, it should \u0027"},{"line_number":26,"context_line":"                \u0027be a dict with an \"and\" or \"or\" as key, and the \u0027"},{"line_number":27,"context_line":"                \u0027value of dict should be a list of basic threshold \u0027"},{"line_number":28,"context_line":"                \u0027rules or sub composite rules, can be nested.\u0027) % error"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_d674c0d0","line":25,"updated":"2016-02-19 20:01:36.000000000","message":"_LE","commit_id":"bb0ada67d854ac476335d4bff2a69b897eed9f39"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"8fc9c8e2a140827ed8524c4fa52dfb5a2aa12b7e","unresolved":false,"context_lines":[{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class InvalidCompositeRule(base.ClientSideError):"},{"line_number":24,"context_line":"    def __init__(self, error):"},{"line_number":25,"context_line":"        err \u003d _(\u0027Invalid input composite rule: %s, it should \u0027"},{"line_number":26,"context_line":"                \u0027be a dict with an \"and\" or \"or\" as key, and the \u0027"},{"line_number":27,"context_line":"                \u0027value of dict should be a list of basic threshold \u0027"},{"line_number":28,"context_line":"                \u0027rules or sub composite rules, can be nested.\u0027) % error"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_bf5e01e7","line":25,"in_reply_to":"bae84128_d674c0d0","updated":"2016-02-22 02:11:56.000000000","message":"it seems the others\u0027s Exception definition don\u0027t be wrapped by _LE().","commit_id":"bb0ada67d854ac476335d4bff2a69b897eed9f39"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"f6cc3261ef83b7ab0ab0501a664d6da7ac8e1a17","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @staticmethod"},{"line_number":95,"context_line":"    def validate_alarm(alarm):"},{"line_number":96,"context_line":"        pass"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @staticmethod"},{"line_number":99,"context_line":"    def update_hook(alarm):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_f1410e3b","line":96,"updated":"2016-02-19 20:01:36.000000000","message":"why is all of this skipped?","commit_id":"bb0ada67d854ac476335d4bff2a69b897eed9f39"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"8fc9c8e2a140827ed8524c4fa52dfb5a2aa12b7e","unresolved":false,"context_lines":[{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    @staticmethod"},{"line_number":95,"context_line":"    def validate_alarm(alarm):"},{"line_number":96,"context_line":"        pass"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    @staticmethod"},{"line_number":99,"context_line":"    def update_hook(alarm):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_bf2c414b","line":96,"in_reply_to":"bae84128_f1410e3b","updated":"2016-02-22 02:11:56.000000000","message":"it because all the validation is done by validate()-\u003evalid_composite_rule which process is automatically invoked by WSME validation. but all the plugins\u0027 validate_alarm() method will be invoked in alarm validation, see[1], so here we just pass \n[1] https://github.com/openstack/aodh/blob/master/aodh/api/controllers/v2/alarms.py#L279","commit_id":"bb0ada67d854ac476335d4bff2a69b897eed9f39"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"f6cc3261ef83b7ab0ab0501a664d6da7ac8e1a17","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    def __call__(**rule):"},{"line_number":108,"context_line":"        return rule"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def __init__(self):"},{"line_number":111,"context_line":"        threshold_rules \u003d (\u0027threshold\u0027,"},{"line_number":112,"context_line":"                           \u0027gnocchi_resources_threshold\u0027,"},{"line_number":113,"context_line":"                           \u0027gnocchi_aggregation_by_metrics_threshold\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_b63bfcea","line":110,"updated":"2016-02-19 20:01:36.000000000","message":"can we have __init__ at the top of class.","commit_id":"bb0ada67d854ac476335d4bff2a69b897eed9f39"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"8fc9c8e2a140827ed8524c4fa52dfb5a2aa12b7e","unresolved":false,"context_lines":[{"line_number":107,"context_line":"    def __call__(**rule):"},{"line_number":108,"context_line":"        return rule"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def __init__(self):"},{"line_number":111,"context_line":"        threshold_rules \u003d (\u0027threshold\u0027,"},{"line_number":112,"context_line":"                           \u0027gnocchi_resources_threshold\u0027,"},{"line_number":113,"context_line":"                           \u0027gnocchi_aggregation_by_metrics_threshold\u0027,"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_9f2fbd3d","line":110,"in_reply_to":"bae84128_b63bfcea","updated":"2016-02-22 02:11:56.000000000","message":"Done","commit_id":"bb0ada67d854ac476335d4bff2a69b897eed9f39"}],"aodh/api/controllers/v2/alarm_rules/threshold.py":[{"author":{"_account_id":1669,"name":"Julien Danjou","display_name":"jd","email":"julien@danjou.info","username":"jdanjou"},"change_message_id":"4ee11e706bdad1cfd7133c58d4319a706ee0b0b5","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def __init__(self, query\u003dNone, **kwargs):"},{"line_number":61,"context_line":"        query \u003d query or []"},{"line_number":62,"context_line":"        if query:"},{"line_number":63,"context_line":"            query \u003d [base.Query(**q) for q in query]"},{"line_number":64,"context_line":"        super(AlarmThresholdRule, self).__init__(query\u003dquery, **kwargs)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_2326f6ce","line":63,"updated":"2015-12-31 09:53:54.000000000","message":"else:\n\n  query \u003d []\n\n\nwould be cleaner.","commit_id":"7d3ff362bb12e7f5aaa5dcbfd92110926c9e0c4d"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"82522f793f9d1af7bd082d6d4d7cce63f84c6cf1","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def __init__(self, query\u003dNone, **kwargs):"},{"line_number":61,"context_line":"        query \u003d query or []"},{"line_number":62,"context_line":"        if query:"},{"line_number":63,"context_line":"            query \u003d [base.Query(**q) for q in query]"},{"line_number":64,"context_line":"        super(AlarmThresholdRule, self).__init__(query\u003dquery, **kwargs)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    @staticmethod"}],"source_content_type":"text/x-python","patch_set":3,"id":"fa69d971_2870b90a","line":63,"in_reply_to":"fa69d971_2326f6ce","updated":"2016-01-05 07:56:16.000000000","message":"Done","commit_id":"7d3ff362bb12e7f5aaa5dcbfd92110926c9e0c4d"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"f6cc3261ef83b7ab0ab0501a664d6da7ac8e1a17","unresolved":false,"context_lines":[{"line_number":60,"context_line":"    def __init__(self, query\u003dNone, **kwargs):"},{"line_number":61,"context_line":"        if query:"},{"line_number":62,"context_line":"            query \u003d [base.Query(**q) for q in query]"},{"line_number":63,"context_line":"        else:"},{"line_number":64,"context_line":"            query \u003d []"},{"line_number":65,"context_line":"        super(AlarmThresholdRule, self).__init__(query\u003dquery, **kwargs)"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_9617d850","line":63,"updated":"2016-02-19 20:01:36.000000000","message":"this can be done inline no?","commit_id":"bb0ada67d854ac476335d4bff2a69b897eed9f39"}],"aodh/tests/functional/api/v2/test_alarm_scenarios.py":[{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"86c1ece1cb19a6b702c558f85d0b05e8c03ea918","unresolved":false,"context_lines":[{"line_number":3193,"context_line":"                                  expect_errors\u003dTrue,"},{"line_number":3194,"context_line":"                                  headers\u003dself.auth_headers)"},{"line_number":3195,"context_line":""},{"line_number":3196,"context_line":"        # Because the support rules list is random ordered, compare the prefix."},{"line_number":3197,"context_line":"        str_part \u003d (\"Unsupported sub-rule type :non-type in composite \""},{"line_number":3198,"context_line":"                    \"rule, should be one of: [\")"},{"line_number":3199,"context_line":"        faultstring \u003d response.json[\u0027error_message\u0027][\u0027faultstring\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_c93d042c","line":3196,"updated":"2016-01-25 20:20:17.000000000","message":"what\u0027s a random order? should order not be honoured?","commit_id":"10bbcac049a37cd0bd6b59b69d23b7635d63eacb"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"b7565b05d9fd895aa9d725d7a3d4a487b124dacd","unresolved":false,"context_lines":[{"line_number":3193,"context_line":"                                  expect_errors\u003dTrue,"},{"line_number":3194,"context_line":"                                  headers\u003dself.auth_headers)"},{"line_number":3195,"context_line":""},{"line_number":3196,"context_line":"        # Because the support rules list is random ordered, compare the prefix."},{"line_number":3197,"context_line":"        str_part \u003d (\"Unsupported sub-rule type :non-type in composite \""},{"line_number":3198,"context_line":"                    \"rule, should be one of: [\")"},{"line_number":3199,"context_line":"        faultstring \u003d response.json[\u0027error_message\u0027][\u0027faultstring\u0027]"}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_0fc232e9","line":3196,"in_reply_to":"9a68dd71_c93d042c","updated":"2016-01-26 02:11:57.000000000","message":"it mainly because the return names() of stevedore extensions is random ordered, I will sort the list :)","commit_id":"10bbcac049a37cd0bd6b59b69d23b7635d63eacb"},{"author":{"_account_id":6537,"name":"gordon chung","email":"gord@live.ca","username":"chungg"},"change_message_id":"86c1ece1cb19a6b702c558f85d0b05e8c03ea918","unresolved":false,"context_lines":[{"line_number":3219,"context_line":"        alarms \u003d list(self.alarm_conn.get_alarms())"},{"line_number":3220,"context_line":"        self.assertEqual(1, len(alarms))"},{"line_number":3221,"context_line":""},{"line_number":3222,"context_line":"    def test_test_post_with_sub_rule_with_invalid_params(self):"},{"line_number":3223,"context_line":"        self.sub_rule1[\u0027threshold\u0027] \u003d False"},{"line_number":3224,"context_line":"        json \u003d {"},{"line_number":3225,"context_line":"            \"type\": \"composite\","}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_e997a837","line":3222,"range":{"start_line":3222,"start_character":8,"end_line":3222,"end_character":17},"updated":"2016-01-25 20:20:17.000000000","message":"test","commit_id":"10bbcac049a37cd0bd6b59b69d23b7635d63eacb"},{"author":{"_account_id":8290,"name":"liusheng","email":"liusheng2048@gmail.com","username":"LiuSheng"},"change_message_id":"b7565b05d9fd895aa9d725d7a3d4a487b124dacd","unresolved":false,"context_lines":[{"line_number":3219,"context_line":"        alarms \u003d list(self.alarm_conn.get_alarms())"},{"line_number":3220,"context_line":"        self.assertEqual(1, len(alarms))"},{"line_number":3221,"context_line":""},{"line_number":3222,"context_line":"    def test_test_post_with_sub_rule_with_invalid_params(self):"},{"line_number":3223,"context_line":"        self.sub_rule1[\u0027threshold\u0027] \u003d False"},{"line_number":3224,"context_line":"        json \u003d {"},{"line_number":3225,"context_line":"            \"type\": \"composite\","}],"source_content_type":"text/x-python","patch_set":12,"id":"9a68dd71_afb44681","line":3222,"range":{"start_line":3222,"start_character":8,"end_line":3222,"end_character":17},"in_reply_to":"9a68dd71_e997a837","updated":"2016-01-26 02:11:57.000000000","message":"Done","commit_id":"10bbcac049a37cd0bd6b59b69d23b7635d63eacb"}]}
