)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13702,"name":"yushiro","username":"yushiro","inactive":true},"change_message_id":"71d020d836dcbe69adc2fce3c2e6b41510f62c3e","unresolved":false,"context_lines":[{"line_number":10,"context_line":"and grouping possible including the addition of a new rule object,"},{"line_number":11,"context_line":"a notification manager, a rule engine, and a rule processor."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Partially-Implements: blueprint alarm-inhibition"},{"line_number":14,"context_line":"Partially-Implements: blueprint alarm-silencing"},{"line_number":15,"context_line":"Partially-Implements: blueprint alarm-grouping"},{"line_number":16,"context_line":"Story: 2000939"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":67,"id":"df3967d1_48056845","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":20},"updated":"2017-08-04 08:50:03.000000000","message":"Nit:\n Partial-Implements","commit_id":"ad6adcd3603bbec428c4eef5df97735263e80a2d"}],"docs/notification-manager.md":[{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"c74ce394a8bd3b00a650268993145ce1515f9f76","unresolved":false,"context_lines":[{"line_number":11,"context_line":"then the notification is posted back to Kafka on the appropriate filtered notifications topic. Otherwise it is sent immediately. Then the"},{"line_number":12,"context_line":"alarm state transition is checked against all group rules. If it matches any group rule, then a notification matching the rule\u0027s actions"},{"line_number":13,"context_line":"is posted back to Kafka on the appropriate filtered notifications topic. Then the Alarm Manager pulls down notifications from Kafka, processes"},{"line_number":14,"context_line":"them against all silence, inhibition and group rules and sends them appropriately. "},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"The Alarm Manager pulls down notifications in batches according to a wait period. See below for configuration details. Note that it is"},{"line_number":17,"context_line":"possible for alarms to come in at the threshold of a window which would mean that a group gets split and two notifications are sent for"}],"source_content_type":"text/x-markdown","patch_set":65,"id":"ff346bd7_c1b27049","line":14,"updated":"2017-07-27 08:44:39.000000000","message":"please remove extra space","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"61eb426f4bf2ffe27b2ccc48f2c3d38006ccd6db","unresolved":false,"context_lines":[{"line_number":11,"context_line":"then the notification is posted back to Kafka on the appropriate filtered notifications topic. Otherwise it is sent immediately. Then the"},{"line_number":12,"context_line":"alarm state transition is checked against all group rules. If it matches any group rule, then a notification matching the rule\u0027s actions"},{"line_number":13,"context_line":"is posted back to Kafka on the appropriate filtered notifications topic. Then the Alarm Manager pulls down notifications from Kafka, processes"},{"line_number":14,"context_line":"them against all silence, inhibition and group rules and sends them appropriately. "},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"The Alarm Manager pulls down notifications in batches according to a wait period. See below for configuration details. Note that it is"},{"line_number":17,"context_line":"possible for alarms to come in at the threshold of a window which would mean that a group gets split and two notifications are sent for"}],"source_content_type":"text/x-markdown","patch_set":65,"id":"df3967d1_fdda09e7","line":14,"in_reply_to":"ff346bd7_c1b27049","updated":"2017-08-01 15:33:09.000000000","message":"Done","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"c74ce394a8bd3b00a650268993145ce1515f9f76","unresolved":false,"context_lines":[{"line_number":90,"context_line":"In the case where a source and target alarm both transition back to OK or UNDETERMINED, the target alarm will not send a notification."},{"line_number":91,"context_line":"There is a window where, for a period of time after a source alarm transitions out of ALARM, no target alarm notification will be sent."},{"line_number":92,"context_line":"Any alarm matching an inhibition rule must wait for some configured wait time to ensure proper behavior. See the Notification Manager"},{"line_number":93,"context_line":"documentation for configuration information. "},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"Great care should be taken when choosing source alarms for two reasons:"},{"line_number":96,"context_line":"1. An alarm in the UNDETERMINED state is essentially treated as OK. The chosen source alarms should not transition to UNDETERMINED for"}],"source_content_type":"text/x-markdown","patch_set":65,"id":"ff346bd7_e1bc5407","line":93,"updated":"2017-07-27 08:44:39.000000000","message":"please remove extra space","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"61eb426f4bf2ffe27b2ccc48f2c3d38006ccd6db","unresolved":false,"context_lines":[{"line_number":90,"context_line":"In the case where a source and target alarm both transition back to OK or UNDETERMINED, the target alarm will not send a notification."},{"line_number":91,"context_line":"There is a window where, for a period of time after a source alarm transitions out of ALARM, no target alarm notification will be sent."},{"line_number":92,"context_line":"Any alarm matching an inhibition rule must wait for some configured wait time to ensure proper behavior. See the Notification Manager"},{"line_number":93,"context_line":"documentation for configuration information. "},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"Great care should be taken when choosing source alarms for two reasons:"},{"line_number":96,"context_line":"1. An alarm in the UNDETERMINED state is essentially treated as OK. The chosen source alarms should not transition to UNDETERMINED for"}],"source_content_type":"text/x-markdown","patch_set":65,"id":"df3967d1_bde481ad","line":93,"in_reply_to":"ff346bd7_e1bc5407","updated":"2017-08-01 15:33:09.000000000","message":"Done","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"c74ce394a8bd3b00a650268993145ce1515f9f76","unresolved":false,"context_lines":[{"line_number":95,"context_line":"Great care should be taken when choosing source alarms for two reasons:"},{"line_number":96,"context_line":"1. An alarm in the UNDETERMINED state is essentially treated as OK. The chosen source alarms should not transition to UNDETERMINED for"},{"line_number":97,"context_line":"the same reason that the target alarms would. For example, a source alarm indicating a region went down should not transition to"},{"line_number":98,"context_line":"UNDETERMINED if the region goes down. "},{"line_number":99,"context_line":"2. It is possible for a source alarm to have multiple metrics. This means that the \"group by\" section of an inhibition expression"},{"line_number":100,"context_line":"will have unpredictable results when a metric dimension is specified here. For example, an alarm with multiple \"hostName\" dimensions"},{"line_number":101,"context_line":"in it matches an inhibit rule\u0027s group by \"hostName\" multiple times and will inhibit multiple target alarms. It is recommended that a"}],"source_content_type":"text/x-markdown","patch_set":65,"id":"ff346bd7_613e248c","line":98,"updated":"2017-07-27 08:44:39.000000000","message":"the same as above","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"61eb426f4bf2ffe27b2ccc48f2c3d38006ccd6db","unresolved":false,"context_lines":[{"line_number":95,"context_line":"Great care should be taken when choosing source alarms for two reasons:"},{"line_number":96,"context_line":"1. An alarm in the UNDETERMINED state is essentially treated as OK. The chosen source alarms should not transition to UNDETERMINED for"},{"line_number":97,"context_line":"the same reason that the target alarms would. For example, a source alarm indicating a region went down should not transition to"},{"line_number":98,"context_line":"UNDETERMINED if the region goes down. "},{"line_number":99,"context_line":"2. It is possible for a source alarm to have multiple metrics. This means that the \"group by\" section of an inhibition expression"},{"line_number":100,"context_line":"will have unpredictable results when a metric dimension is specified here. For example, an alarm with multiple \"hostName\" dimensions"},{"line_number":101,"context_line":"in it matches an inhibit rule\u0027s group by \"hostName\" multiple times and will inhibit multiple target alarms. It is recommended that a"}],"source_content_type":"text/x-markdown","patch_set":65,"id":"df3967d1_5df35574","line":98,"in_reply_to":"ff346bd7_613e248c","updated":"2017-08-01 15:33:09.000000000","message":"Done","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"}],"monasca_notification/common/repositories/mysql/mysql_repo.py":[{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"9d4b7f6bef1e2e8f5f83556182720791dcaef4e4","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def get_group_rules(self):"},{"line_number":143,"context_line":"        try:"},{"line_number":144,"context_line":"            if self._mysql is None:"},{"line_number":145,"context_line":"                self._connect_to_mysql()"},{"line_number":146,"context_line":"            cur \u003d self._mysql.cursor()"},{"line_number":147,"context_line":"            cur.execute(self._get_group_rules_sql)"},{"line_number":148,"context_line":"            for row in cur:"},{"line_number":149,"context_line":"                yield row"},{"line_number":150,"context_line":"        except pymysql.Error as e:"},{"line_number":151,"context_line":"            self._mysql \u003d None"},{"line_number":152,"context_line":"            log.exception(\"Couldn\u0027t fetch the group rules. %s\", e)"},{"line_number":153,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def get_inhibition_rules(self):"},{"line_number":156,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":37,"id":"7ffa3b31_b4b0aade","line":153,"range":{"start_line":143,"start_character":8,"end_line":153,"end_character":42},"updated":"2017-04-21 19:56:45.000000000","message":"seems like this could be turned into a general method","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"73dbdf2e9087f7fb3bf7504fe153164ea547edfc","unresolved":false,"context_lines":[{"line_number":140,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"    def get_group_rules(self):"},{"line_number":143,"context_line":"        try:"},{"line_number":144,"context_line":"            if self._mysql is None:"},{"line_number":145,"context_line":"                self._connect_to_mysql()"},{"line_number":146,"context_line":"            cur \u003d self._mysql.cursor()"},{"line_number":147,"context_line":"            cur.execute(self._get_group_rules_sql)"},{"line_number":148,"context_line":"            for row in cur:"},{"line_number":149,"context_line":"                yield row"},{"line_number":150,"context_line":"        except pymysql.Error as e:"},{"line_number":151,"context_line":"            self._mysql \u003d None"},{"line_number":152,"context_line":"            log.exception(\"Couldn\u0027t fetch the group rules. %s\", e)"},{"line_number":153,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def get_inhibition_rules(self):"},{"line_number":156,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_3dcb2fa6","line":153,"range":{"start_line":143,"start_character":8,"end_line":153,"end_character":42},"in_reply_to":"7ffa3b31_b4b0aade","updated":"2017-04-21 22:41:36.000000000","message":"Done","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"05cc0bfeb457391d1c08c7cda07d3106d1241e03","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def get_rule_ids_for_alarm_id(self, alarm_id):"},{"line_number":200,"context_line":"        try:"},{"line_number":201,"context_line":"            if self._mysql is None:"},{"line_number":202,"context_line":"                self._connect_to_mysql()"},{"line_number":203,"context_line":"            cur \u003d self._mysql.cursor()"},{"line_number":204,"context_line":"            cur.execute(self._get_rule_ids_sql, (str(alarm_id),))"},{"line_number":205,"context_line":"            for row in cur:"},{"line_number":206,"context_line":"                yield row"},{"line_number":207,"context_line":"        except pymysql.Error as e:"}],"source_content_type":"text/x-python","patch_set":42,"id":"5ff73747_1406fc21","line":204,"range":{"start_line":201,"start_character":12,"end_line":204,"end_character":65},"updated":"2017-05-04 15:14:12.000000000","message":"This code is repeated almost exactly many times, should probably get its own method","commit_id":"a203f1c1512859e1c3554b537c5de569c094b429"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"1da07aca3e8053ff49e61e5747df9e924461b9bf","unresolved":false,"context_lines":[{"line_number":198,"context_line":""},{"line_number":199,"context_line":"    def get_rule_ids_for_alarm_id(self, alarm_id):"},{"line_number":200,"context_line":"        try:"},{"line_number":201,"context_line":"            if self._mysql is None:"},{"line_number":202,"context_line":"                self._connect_to_mysql()"},{"line_number":203,"context_line":"            cur \u003d self._mysql.cursor()"},{"line_number":204,"context_line":"            cur.execute(self._get_rule_ids_sql, (str(alarm_id),))"},{"line_number":205,"context_line":"            for row in cur:"},{"line_number":206,"context_line":"                yield row"},{"line_number":207,"context_line":"        except pymysql.Error as e:"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f044301_63e458ad","line":204,"range":{"start_line":201,"start_character":12,"end_line":204,"end_character":65},"in_reply_to":"5ff73747_1406fc21","updated":"2017-05-04 16:33:49.000000000","message":"Done","commit_id":"a203f1c1512859e1c3554b537c5de569c094b429"}],"monasca_notification/common/repositories/postgres/pgsql_repo.py":[{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"9d4b7f6bef1e2e8f5f83556182720791dcaef4e4","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def get_group_rules(self):"},{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            if self._mysql is None:"},{"line_number":103,"context_line":"                self._connect_to_mysql()"},{"line_number":104,"context_line":"            cur \u003d self._mysql.cursor()"},{"line_number":105,"context_line":"            cur.execute(self._get_group_rules_sql)"},{"line_number":106,"context_line":"            for row in cur:"},{"line_number":107,"context_line":"                yield row"},{"line_number":108,"context_line":"        except psycopg2.Error as e:"},{"line_number":109,"context_line":"            log.exception(\"Couldn\u0027t fetch the group rules. %s\", e)"},{"line_number":110,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def get_inhibition_rules(self):"},{"line_number":113,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":37,"id":"7ffa3b31_54ce065a","line":110,"range":{"start_line":101,"start_character":8,"end_line":110,"end_character":42},"updated":"2017-04-21 19:56:45.000000000","message":"Same comment as other repo","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"73dbdf2e9087f7fb3bf7504fe153164ea547edfc","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"    def get_group_rules(self):"},{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            if self._mysql is None:"},{"line_number":103,"context_line":"                self._connect_to_mysql()"},{"line_number":104,"context_line":"            cur \u003d self._mysql.cursor()"},{"line_number":105,"context_line":"            cur.execute(self._get_group_rules_sql)"},{"line_number":106,"context_line":"            for row in cur:"},{"line_number":107,"context_line":"                yield row"},{"line_number":108,"context_line":"        except psycopg2.Error as e:"},{"line_number":109,"context_line":"            log.exception(\"Couldn\u0027t fetch the group rules. %s\", e)"},{"line_number":110,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":111,"context_line":""},{"line_number":112,"context_line":"    def get_inhibition_rules(self):"},{"line_number":113,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_7d3657b7","line":110,"range":{"start_line":101,"start_character":8,"end_line":110,"end_character":42},"in_reply_to":"7ffa3b31_54ce065a","updated":"2017-04-21 22:41:36.000000000","message":"Done","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"513ed5f8476e842a530d34d8883065168436446a","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            for row in cur:"},{"line_number":140,"context_line":"                yield row"},{"line_number":141,"context_line":"        except psycopg2.Error as e:"},{"line_number":142,"context_line":"            log.exception(\"Couldn\u0027t fetch the alarmed alarms. %s\", e)"},{"line_number":143,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def get_alarms_inhibited(self):"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_1afbebc0","line":142,"range":{"start_line":142,"start_character":47,"end_line":142,"end_character":60},"updated":"2017-06-19 13:40:30.000000000","message":"Doesn\u0027t seem to match method name","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"2d284dc2f61c7d84e9069f15880cc7ee4ef7454f","unresolved":false,"context_lines":[{"line_number":139,"context_line":"            for row in cur:"},{"line_number":140,"context_line":"                yield row"},{"line_number":141,"context_line":"        except psycopg2.Error as e:"},{"line_number":142,"context_line":"            log.exception(\"Couldn\u0027t fetch the alarmed alarms. %s\", e)"},{"line_number":143,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def get_alarms_inhibited(self):"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_16acdf9c","line":142,"range":{"start_line":142,"start_character":47,"end_line":142,"end_character":60},"in_reply_to":"7f231b9d_1afbebc0","updated":"2017-06-19 16:30:34.000000000","message":"In the latest code (that I haven\u0027t push up yet), I have pulled almost all of the error handling into a generic method to reduce some of the repetition in this file","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"513ed5f8476e842a530d34d8883065168436446a","unresolved":false,"context_lines":[{"line_number":151,"context_line":"            for row in cur:"},{"line_number":152,"context_line":"                yield row"},{"line_number":153,"context_line":"        except psycopg2.Error as e:"},{"line_number":154,"context_line":"            log.exception(\"Couldn\u0027t fetch the alarmed alarms. %s\", e)"},{"line_number":155,"context_line":"            raise exc.DatabaseException(e)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"    def set_alarm_silenced_tag(self, alarm_id, silenced\u003dNone):"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_faf5cfcb","line":154,"range":{"start_line":154,"start_character":47,"end_line":154,"end_character":60},"updated":"2017-06-19 13:40:30.000000000","message":"Doesn\u0027t seem to match method name","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"c74ce394a8bd3b00a650268993145ce1515f9f76","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def delete_alarm_inhibited_tag(self, alarm_id):"},{"line_number":116,"context_line":"        self._make_db_call(self._delete_alarm_inhibited_tag_sql, str(alarm_id))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _make_db_call(self, execute_cmd, cmd_arg\u003dNone):"},{"line_number":119,"context_line":"        try:"},{"line_number":120,"context_line":"            if self._mysql is None:"},{"line_number":121,"context_line":"                self._connect_to_mysql()"},{"line_number":122,"context_line":"            cur \u003d self._mysql.cursor()"},{"line_number":123,"context_line":"            if cmd_arg:"},{"line_number":124,"context_line":"                cur.execute(execute_cmd, cmd_arg)"},{"line_number":125,"context_line":"            else:"},{"line_number":126,"context_line":"                cur.execute(execute_cmd)"},{"line_number":127,"context_line":"            return cur"},{"line_number":128,"context_line":"        except psycopg2.Error as e:"},{"line_number":129,"context_line":"            log.exception(\"Couldn\u0027t execute command %s with argument %s. %s\","},{"line_number":130,"context_line":"                          execute_cmd, cmd_arg, e)"}],"source_content_type":"text/x-python","patch_set":65,"id":"ff346bd7_61e744ae","line":127,"range":{"start_line":118,"start_character":4,"end_line":127,"end_character":22},"updated":"2017-07-27 08:44:39.000000000","message":"I think this is a copy paste error because you are using here self._mysql and you should use self._pgsql and self._connect_to_pgsql","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"61eb426f4bf2ffe27b2ccc48f2c3d38006ccd6db","unresolved":false,"context_lines":[{"line_number":115,"context_line":"    def delete_alarm_inhibited_tag(self, alarm_id):"},{"line_number":116,"context_line":"        self._make_db_call(self._delete_alarm_inhibited_tag_sql, str(alarm_id))"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"    def _make_db_call(self, execute_cmd, cmd_arg\u003dNone):"},{"line_number":119,"context_line":"        try:"},{"line_number":120,"context_line":"            if self._mysql is None:"},{"line_number":121,"context_line":"                self._connect_to_mysql()"},{"line_number":122,"context_line":"            cur \u003d self._mysql.cursor()"},{"line_number":123,"context_line":"            if cmd_arg:"},{"line_number":124,"context_line":"                cur.execute(execute_cmd, cmd_arg)"},{"line_number":125,"context_line":"            else:"},{"line_number":126,"context_line":"                cur.execute(execute_cmd)"},{"line_number":127,"context_line":"            return cur"},{"line_number":128,"context_line":"        except psycopg2.Error as e:"},{"line_number":129,"context_line":"            log.exception(\"Couldn\u0027t execute command %s with argument %s. %s\","},{"line_number":130,"context_line":"                          execute_cmd, cmd_arg, e)"}],"source_content_type":"text/x-python","patch_set":65,"id":"df3967d1_7dbe1966","line":127,"range":{"start_line":118,"start_character":4,"end_line":127,"end_character":22},"in_reply_to":"ff346bd7_61e744ae","updated":"2017-08-01 15:33:09.000000000","message":"Done","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"}],"monasca_notification/common/utils.py":[{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"513ed5f8476e842a530d34d8883065168436446a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (C) Copyright 2016 Hewlett Packard Enterprise Development LP"},{"line_number":2,"context_line":"# Copyright 2016 FUJITSU LIMITED"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_5a3f2386","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2017-06-19 13:40:30.000000000","message":"Copyright","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"ba0250e022b6ced4a94faea1ae1f8a780cb56db9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (C) Copyright 2016 Hewlett Packard Enterprise Development LP"},{"line_number":2,"context_line":"# Copyright 2016 FUJITSU LIMITED"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_165dfce8","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"in_reply_to":"7f231b9d_5a3f2386","updated":"2017-06-20 00:35:55.000000000","message":"Done","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"513ed5f8476e842a530d34d8883065168436446a","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                                    notification_json[\u0027period\u0027],"},{"line_number":44,"context_line":"                                    notification_json[\u0027retry_count\u0027],"},{"line_number":45,"context_line":"                                    notification_json[\u0027raw_alarm\u0027],"},{"line_number":46,"context_line":"                                    notification_json[\u0027is_grouped\u0027])"},{"line_number":47,"context_line":"        # Grab notification method from database to see if it was changed"},{"line_number":48,"context_line":"        stored_notification \u003d grab_stored_notification_method(db_repo, notification.id)"},{"line_number":49,"context_line":"        # Notification method was deleted"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_1ad2cb28","line":46,"range":{"start_line":46,"start_character":55,"end_line":46,"end_character":65},"updated":"2017-06-19 13:40:30.000000000","message":"Is this going to work if there is an old notification on the kafka queue without is_grouped? Do we care about upgrades?","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"ba0250e022b6ced4a94faea1ae1f8a780cb56db9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                                    notification_json[\u0027period\u0027],"},{"line_number":44,"context_line":"                                    notification_json[\u0027retry_count\u0027],"},{"line_number":45,"context_line":"                                    notification_json[\u0027raw_alarm\u0027],"},{"line_number":46,"context_line":"                                    notification_json[\u0027is_grouped\u0027])"},{"line_number":47,"context_line":"        # Grab notification method from database to see if it was changed"},{"line_number":48,"context_line":"        stored_notification \u003d grab_stored_notification_method(db_repo, notification.id)"},{"line_number":49,"context_line":"        # Notification method was deleted"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_5692544d","line":46,"range":{"start_line":46,"start_character":55,"end_line":46,"end_character":65},"in_reply_to":"7f231b9d_16de1f3d","updated":"2017-06-20 00:35:55.000000000","message":"Done","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"17ba7ac2166144bc76f2156d0e090d63220f596b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                                    notification_json[\u0027period\u0027],"},{"line_number":44,"context_line":"                                    notification_json[\u0027retry_count\u0027],"},{"line_number":45,"context_line":"                                    notification_json[\u0027raw_alarm\u0027],"},{"line_number":46,"context_line":"                                    notification_json[\u0027is_grouped\u0027])"},{"line_number":47,"context_line":"        # Grab notification method from database to see if it was changed"},{"line_number":48,"context_line":"        stored_notification \u003d grab_stored_notification_method(db_repo, notification.id)"},{"line_number":49,"context_line":"        # Notification method was deleted"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_369d980a","line":46,"range":{"start_line":46,"start_character":55,"end_line":46,"end_character":65},"in_reply_to":"7f231b9d_16de1f3d","updated":"2017-06-19 18:18:35.000000000","message":"It\u0027s not necessarily a notification that wasn\u0027t previously dumped to json it\u0027s more the case where when we upgrade we\u0027re going to have a kafka queue, the periodic queue for instance, full of a bunch of notification objects that are the old style.  This should be able to handle both formats.","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"2d284dc2f61c7d84e9069f15880cc7ee4ef7454f","unresolved":false,"context_lines":[{"line_number":43,"context_line":"                                    notification_json[\u0027period\u0027],"},{"line_number":44,"context_line":"                                    notification_json[\u0027retry_count\u0027],"},{"line_number":45,"context_line":"                                    notification_json[\u0027raw_alarm\u0027],"},{"line_number":46,"context_line":"                                    notification_json[\u0027is_grouped\u0027])"},{"line_number":47,"context_line":"        # Grab notification method from database to see if it was changed"},{"line_number":48,"context_line":"        stored_notification \u003d grab_stored_notification_method(db_repo, notification.id)"},{"line_number":49,"context_line":"        # Notification method was deleted"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_16de1f3d","line":46,"range":{"start_line":46,"start_character":55,"end_line":46,"end_character":65},"in_reply_to":"7f231b9d_1ad2cb28","updated":"2017-06-19 16:30:34.000000000","message":"I only tested this against a notification that dumps to json then needs to be reconstructed. I\u0027ll add some logic to make sure that a notification that didn\u0027t go through that process gets handled properly.","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"f2c435346afa41dd2906af361a265782fea26824","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        return timedelta(0, 0)"},{"line_number":110,"context_line":"    parts \u003d parts.groupdict()"},{"line_number":111,"context_line":"    time_delta_params \u003d {}"},{"line_number":112,"context_line":"    for (name, param) in parts.iteritems():"},{"line_number":113,"context_line":"        if param:"},{"line_number":114,"context_line":"            time_delta_params[name] \u003d int(param)"},{"line_number":115,"context_line":"    return timedelta(**time_delta_params)"}],"source_content_type":"text/x-python","patch_set":55,"id":"3f1d235d_64407aa6","line":112,"updated":"2017-07-04 09:51:32.000000000","message":"items(), iteritems is not available in Py3","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"5659090e69ed0d9b34f8a2812ff2a3153161d909","unresolved":false,"context_lines":[{"line_number":109,"context_line":"        return timedelta(0, 0)"},{"line_number":110,"context_line":"    parts \u003d parts.groupdict()"},{"line_number":111,"context_line":"    time_delta_params \u003d {}"},{"line_number":112,"context_line":"    for (name, param) in parts.iteritems():"},{"line_number":113,"context_line":"        if param:"},{"line_number":114,"context_line":"            time_delta_params[name] \u003d int(param)"},{"line_number":115,"context_line":"    return timedelta(**time_delta_params)"}],"source_content_type":"text/x-python","patch_set":55,"id":"ff346bd7_96fd3a3c","line":112,"in_reply_to":"3f1d235d_64407aa6","updated":"2017-07-24 18:28:04.000000000","message":"Done","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"f2c435346afa41dd2906af361a265782fea26824","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            except KeyError:"},{"line_number":160,"context_line":"                if matcher_is_keyword:"},{"line_number":161,"context_line":"                    return False"},{"line_number":162,"context_line":"    for metric_matcher, metric_found in metric_matchers_found.iteritems():"},{"line_number":163,"context_line":"        if not metric_found:"},{"line_number":164,"context_line":"            return False"},{"line_number":165,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":55,"id":"3f1d235d_244602c2","line":162,"updated":"2017-07-04 09:51:32.000000000","message":"items(), iteritems is not available in Py3","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"5659090e69ed0d9b34f8a2812ff2a3153161d909","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            except KeyError:"},{"line_number":160,"context_line":"                if matcher_is_keyword:"},{"line_number":161,"context_line":"                    return False"},{"line_number":162,"context_line":"    for metric_matcher, metric_found in metric_matchers_found.iteritems():"},{"line_number":163,"context_line":"        if not metric_found:"},{"line_number":164,"context_line":"            return False"},{"line_number":165,"context_line":"    return True"}],"source_content_type":"text/x-python","patch_set":55,"id":"ff346bd7_76fad642","line":162,"in_reply_to":"3f1d235d_244602c2","updated":"2017-07-24 18:28:04.000000000","message":"Done","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"}],"monasca_notification/notification.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"13232fc671bdd103084b4e22719a6b549608647a","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        return not self.__eq__(other)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def __hash__(self):"},{"line_number":105,"context_line":"        return hash(self.id)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def to_json(self):"},{"line_number":108,"context_line":"        \"\"\"Return json representation"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_79a18b45","line":105,"updated":"2017-03-23 05:18:43.000000000","message":"Shouldn\u0027t it be like that __hash__ be complaint with what\u0027s in __eq__ ? There we have comparison over all attributes but __hash__ takes only id into account.","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"1809d22947251f2645937c09884d8befa1df780b","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        return not self.__eq__(other)"},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"    def __hash__(self):"},{"line_number":105,"context_line":"        return hash(self.id)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def to_json(self):"},{"line_number":108,"context_line":"        \"\"\"Return json representation"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_d29dda0b","line":105,"in_reply_to":"1a1ced50_79a18b45","updated":"2017-03-31 16:47:10.000000000","message":"Done","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"05cc0bfeb457391d1c08c7cda07d3106d1241e03","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        return not self.__eq__(other)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def __hash__(self):"},{"line_number":111,"context_line":"        return self._compute_hash()"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def to_json(self):"},{"line_number":114,"context_line":"        \"\"\"Return json representation"}],"source_content_type":"text/x-python","patch_set":42,"id":"5ff73747_9481ecc6","line":111,"range":{"start_line":111,"start_character":20,"end_line":111,"end_character":33},"updated":"2017-05-04 15:14:12.000000000","message":"why call to another function instead of just doing the work here?","commit_id":"a203f1c1512859e1c3554b537c5de569c094b429"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"1da07aca3e8053ff49e61e5747df9e924461b9bf","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        return not self.__eq__(other)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def __hash__(self):"},{"line_number":111,"context_line":"        return self._compute_hash()"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"    def to_json(self):"},{"line_number":114,"context_line":"        \"\"\"Return json representation"}],"source_content_type":"text/x-python","patch_set":42,"id":"3f044301_e39e2806","line":111,"range":{"start_line":111,"start_character":20,"end_line":111,"end_character":33},"in_reply_to":"5ff73747_9481ecc6","updated":"2017-05-04 16:33:49.000000000","message":"Done","commit_id":"a203f1c1512859e1c3554b537c5de569c094b429"}],"monasca_notification/notification_engine.py":[{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"5deb633a47f4c330817a7fc0dfcc88ad9056bbed","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self._config \u003d config"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        self._kafka_topic \u003d config[\u0027kafka\u0027][\u0027alarm_topic\u0027]"},{"line_number":46,"context_line":"        self._consumer \u003d consumer.KafkaConsumer("},{"line_number":47,"context_line":"            config[\u0027kafka\u0027][\u0027url\u0027],"},{"line_number":48,"context_line":"            config[\u0027zookeeper\u0027][\u0027url\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_a1a49e4a","line":45,"range":{"start_line":45,"start_character":13,"end_line":45,"end_character":25},"updated":"2017-02-16 02:59:00.000000000","message":"Why a new variable here?  You have a topic map further up that we could use.","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"fce36969f0a4f81ff77c09a07ca0823fda380c87","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"        self._config \u003d config"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"        self._kafka_topic \u003d config[\u0027kafka\u0027][\u0027alarm_topic\u0027]"},{"line_number":46,"context_line":"        self._consumer \u003d consumer.KafkaConsumer("},{"line_number":47,"context_line":"            config[\u0027kafka\u0027][\u0027url\u0027],"},{"line_number":48,"context_line":"            config[\u0027zookeeper\u0027][\u0027url\u0027],"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_40a00ea6","line":45,"range":{"start_line":45,"start_character":13,"end_line":45,"end_character":25},"in_reply_to":"fa31d9ce_a1a49e4a","updated":"2017-02-16 23:49:48.000000000","message":"Good point. Removed","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"5deb633a47f4c330817a7fc0dfcc88ad9056bbed","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            config[\u0027zookeeper\u0027][\u0027notification_path\u0027],"},{"line_number":50,"context_line":"            config[\u0027kafka\u0027][\u0027group\u0027],"},{"line_number":51,"context_line":"            self._kafka_topic)"},{"line_number":52,"context_line":"        self._rule_engine \u003d RuleEngine(config, config[\u0027kafka\u0027][\u0027group\u0027])  # NOTE; This needs to be UNIQUE"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        self._config \u003d config"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_c197d2e9","line":52,"range":{"start_line":52,"start_character":47,"end_line":52,"end_character":71},"updated":"2017-02-16 02:59:00.000000000","message":"Should be generated randomly in each notification consumer.  All the rules want to be read by all consumers.","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"fce36969f0a4f81ff77c09a07ca0823fda380c87","unresolved":false,"context_lines":[{"line_number":49,"context_line":"            config[\u0027zookeeper\u0027][\u0027notification_path\u0027],"},{"line_number":50,"context_line":"            config[\u0027kafka\u0027][\u0027group\u0027],"},{"line_number":51,"context_line":"            self._kafka_topic)"},{"line_number":52,"context_line":"        self._rule_engine \u003d RuleEngine(config, config[\u0027kafka\u0027][\u0027group\u0027])  # NOTE; This needs to be UNIQUE"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"        self._config \u003d config"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_80aa0684","line":52,"range":{"start_line":52,"start_character":47,"end_line":52,"end_character":71},"in_reply_to":"fa31d9ce_c197d2e9","updated":"2017-02-16 23:49:48.000000000","message":"Rodger, I will look into stateful sets as the answer here","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"5deb633a47f4c330817a7fc0dfcc88ad9056bbed","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                if notifications:"},{"line_number":68,"context_line":"                    # Check if they are inhibited, grouped, or silenced"},{"line_number":69,"context_line":"                    matches_rule, matching_rule_id, wait_time \u003d self._rule_engine.matches_rule(notifications)"},{"line_number":70,"context_line":"                    manager_topic \u003d self._topics[\u0027manager\u0027][wait_time]"},{"line_number":71,"context_line":"                    if matches_rule:"},{"line_number":72,"context_line":"                        self._producer.publish(manager_topic, [i.to_json() for i in notifications], key\u003dmatching_rule_id)"},{"line_number":73,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_b3015507","line":70,"range":{"start_line":70,"start_character":20,"end_line":70,"end_character":33},"updated":"2017-02-16 02:59:00.000000000","message":"If the wait_time defined by the rule doesn\u0027t match any config, or the topic doesn\u0027t exist, we\u0027d want to make sure we trap problems like that and attempt to move on past the alarm.  If we don\u0027t trap the error the notification engine would get stuck on that alarm continually exit.","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"fce36969f0a4f81ff77c09a07ca0823fda380c87","unresolved":false,"context_lines":[{"line_number":67,"context_line":"                if notifications:"},{"line_number":68,"context_line":"                    # Check if they are inhibited, grouped, or silenced"},{"line_number":69,"context_line":"                    matches_rule, matching_rule_id, wait_time \u003d self._rule_engine.matches_rule(notifications)"},{"line_number":70,"context_line":"                    manager_topic \u003d self._topics[\u0027manager\u0027][wait_time]"},{"line_number":71,"context_line":"                    if matches_rule:"},{"line_number":72,"context_line":"                        self._producer.publish(manager_topic, [i.to_json() for i in notifications], key\u003dmatching_rule_id)"},{"line_number":73,"context_line":"                    else:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_a0af0a93","line":70,"range":{"start_line":70,"start_character":20,"end_line":70,"end_character":33},"in_reply_to":"fa31d9ce_b3015507","updated":"2017-02-16 23:49:48.000000000","message":"Done","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from monasca_common.kafka import consumer"},{"line_number":20,"context_line":"from monasca_common.kafka import producer"},{"line_number":21,"context_line":"from monasca_common.kafka_lib.common import UnknownTopicOrPartitionError"},{"line_number":22,"context_line":"from monasca_notification.common.utils import get_statsd_client"},{"line_number":23,"context_line":"from monasca_notification.processors.alarm_processor import AlarmProcessor"},{"line_number":24,"context_line":"from monasca_notification.processors.notification_processor import NotificationProcessor"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_31a242af","line":21,"updated":"2017-03-09 05:33:17.000000000","message":"According to OS hacking guidelines you should import modules.\nI know some lines here are not modified by you, but could you change them to import modules.","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from monasca_common.kafka import consumer"},{"line_number":20,"context_line":"from monasca_common.kafka import producer"},{"line_number":21,"context_line":"from monasca_common.kafka_lib.common import UnknownTopicOrPartitionError"},{"line_number":22,"context_line":"from monasca_notification.common.utils import get_statsd_client"},{"line_number":23,"context_line":"from monasca_notification.processors.alarm_processor import AlarmProcessor"},{"line_number":24,"context_line":"from monasca_notification.processors.notification_processor import NotificationProcessor"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_cff683f8","line":21,"in_reply_to":"9a30ddce_31a242af","updated":"2017-03-09 18:28:34.000000000","message":"Done","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"189652be69e4e014bde1a3ed4c7abbe40351cc0f","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def run(self):"},{"line_number":51,"context_line":"        self._rule_engine.run()"},{"line_number":52,"context_line":"        for raw_alarm in self._consumer:"},{"line_number":53,"context_line":"            wait_time \u003d self._default_wait_time"},{"line_number":54,"context_line":"            try:"},{"line_number":55,"context_line":"                log.debug(\u0027Received alarm \u003e|%s|\u003c\u0027, str(raw_alarm))"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_660145af","line":52,"range":{"start_line":52,"start_character":12,"end_line":52,"end_character":21},"updated":"2017-06-17 01:56:21.000000000","message":"Just a general comment here.  We\u0027ve tucked a lot of the messy error handling logic into the send_notifications method but at the same time we\u0027ve yanked a lot of the rule handling code into this main loop.  Maybe hand the raw_alarm into a function that just returns the necessary notifications and just do the general error handling in this loop.","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"ba0250e022b6ced4a94faea1ae1f8a780cb56db9","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def run(self):"},{"line_number":51,"context_line":"        self._rule_engine.run()"},{"line_number":52,"context_line":"        for raw_alarm in self._consumer:"},{"line_number":53,"context_line":"            wait_time \u003d self._default_wait_time"},{"line_number":54,"context_line":"            try:"},{"line_number":55,"context_line":"                log.debug(\u0027Received alarm \u003e|%s|\u003c\u0027, str(raw_alarm))"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_6ceb4212","line":52,"range":{"start_line":52,"start_character":12,"end_line":52,"end_character":21},"in_reply_to":"7f231b9d_660145af","updated":"2017-06-20 00:35:55.000000000","message":"Done","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"2d284dc2f61c7d84e9069f15880cc7ee4ef7454f","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def run(self):"},{"line_number":51,"context_line":"        self._rule_engine.run()"},{"line_number":52,"context_line":"        for raw_alarm in self._consumer:"},{"line_number":53,"context_line":"            wait_time \u003d self._default_wait_time"},{"line_number":54,"context_line":"            try:"},{"line_number":55,"context_line":"                log.debug(\u0027Received alarm \u003e|%s|\u003c\u0027, str(raw_alarm))"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_563c9791","line":52,"range":{"start_line":52,"start_character":12,"end_line":52,"end_character":21},"in_reply_to":"7f231b9d_660145af","updated":"2017-06-19 16:30:34.000000000","message":"Good idea, I\u0027ll add that function","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"189652be69e4e014bde1a3ed4c7abbe40351cc0f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                log.error("},{"line_number":83,"context_line":"                    \"Alarm matches a rule with a wait time {} not defined in\""},{"line_number":84,"context_line":"                    \" the configuration. Not applying rule. {}\".format(wait_time), e)"},{"line_number":85,"context_line":"                self._notifier.send_notifications(notifications)"},{"line_number":86,"context_line":"            except common.UnknownTopicOrPartitionError as e:"},{"line_number":87,"context_line":"                log.error("},{"line_number":88,"context_line":"                    \"Alarm matches rule with no existing Kafka topic {} for\""}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_26310da4","line":85,"range":{"start_line":85,"start_character":31,"end_line":85,"end_character":49},"updated":"2017-06-17 01:56:21.000000000","message":"send_notifications can still generate an exception here and I believe it would be untrapped.  We should trap any exceptions in the send_notifiations method so that we don\u0027t blow out this exception handler and cause the process to exit.","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"ba0250e022b6ced4a94faea1ae1f8a780cb56db9","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                log.error("},{"line_number":83,"context_line":"                    \"Alarm matches a rule with a wait time {} not defined in\""},{"line_number":84,"context_line":"                    \" the configuration. Not applying rule. {}\".format(wait_time), e)"},{"line_number":85,"context_line":"                self._notifier.send_notifications(notifications)"},{"line_number":86,"context_line":"            except common.UnknownTopicOrPartitionError as e:"},{"line_number":87,"context_line":"                log.error("},{"line_number":88,"context_line":"                    \"Alarm matches rule with no existing Kafka topic {} for\""}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_1644dc1a","line":85,"range":{"start_line":85,"start_character":31,"end_line":85,"end_character":49},"in_reply_to":"7f231b9d_26310da4","updated":"2017-06-20 00:35:55.000000000","message":"Done","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"2d284dc2f61c7d84e9069f15880cc7ee4ef7454f","unresolved":false,"context_lines":[{"line_number":82,"context_line":"                log.error("},{"line_number":83,"context_line":"                    \"Alarm matches a rule with a wait time {} not defined in\""},{"line_number":84,"context_line":"                    \" the configuration. Not applying rule. {}\".format(wait_time), e)"},{"line_number":85,"context_line":"                self._notifier.send_notifications(notifications)"},{"line_number":86,"context_line":"            except common.UnknownTopicOrPartitionError as e:"},{"line_number":87,"context_line":"                log.error("},{"line_number":88,"context_line":"                    \"Alarm matches rule with no existing Kafka topic {} for\""}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_f675e364","line":85,"range":{"start_line":85,"start_character":31,"end_line":85,"end_character":49},"in_reply_to":"7f231b9d_26310da4","updated":"2017-06-19 16:30:34.000000000","message":"I\u0027ll add that exception handling, and a unit test too to make sure that a bad alarm doesn\u0027t crash everything","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"189652be69e4e014bde1a3ed4c7abbe40351cc0f","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                    \"Alarm matches rule with no existing Kafka topic {} for\""},{"line_number":89,"context_line":"                    \"the rule\u0027s configured wait time {}. Not applying rule. {}\""},{"line_number":90,"context_line":"                    .format(manager_topic, wait_time, e))"},{"line_number":91,"context_line":"                self._notifier.send_notifications(notifications)"},{"line_number":92,"context_line":"            except Exception as e:"},{"line_number":93,"context_line":"                log.exception("},{"line_number":94,"context_line":"                    \u0027Notification Engine encountered fatal exception processing \u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_0634d191","line":91,"range":{"start_line":91,"start_character":31,"end_line":91,"end_character":49},"updated":"2017-06-17 01:56:21.000000000","message":"Same issue as above.","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"ba0250e022b6ced4a94faea1ae1f8a780cb56db9","unresolved":false,"context_lines":[{"line_number":88,"context_line":"                    \"Alarm matches rule with no existing Kafka topic {} for\""},{"line_number":89,"context_line":"                    \"the rule\u0027s configured wait time {}. Not applying rule. {}\""},{"line_number":90,"context_line":"                    .format(manager_topic, wait_time, e))"},{"line_number":91,"context_line":"                self._notifier.send_notifications(notifications)"},{"line_number":92,"context_line":"            except Exception as e:"},{"line_number":93,"context_line":"                log.exception("},{"line_number":94,"context_line":"                    \u0027Notification Engine encountered fatal exception processing \u0027"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_f648402f","line":91,"range":{"start_line":91,"start_character":31,"end_line":91,"end_character":49},"in_reply_to":"7f231b9d_0634d191","updated":"2017-06-20 00:35:55.000000000","message":"Done","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"189652be69e4e014bde1a3ed4c7abbe40351cc0f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                log.exception("},{"line_number":94,"context_line":"                    \u0027Notification Engine encountered fatal exception processing \u0027"},{"line_number":95,"context_line":"                    \u0027messages. Shutting down all threads and exiting. {}\u0027.format(e))"},{"line_number":96,"context_line":"                os._exit(1)"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_26634db4","line":96,"range":{"start_line":96,"start_character":19,"end_line":96,"end_character":24},"updated":"2017-06-17 01:56:21.000000000","message":"I haven\u0027t looked at this for a while but this seems fairly dangerous. We don\u0027t want to get stuck on a single alarm that\u0027s causing an issue.  \n\nWhat this will do is leave the bad alarm on the Kafka queue and throw all the consumers into a repartition loop as they read a bad alarm, exit, and attempt to repartition again.\n\nIn the even of an unknown, unrecoverable error we should log all the pertinent information and commit that offset so we can continue processing alarms.","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"ba0250e022b6ced4a94faea1ae1f8a780cb56db9","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                log.exception("},{"line_number":94,"context_line":"                    \u0027Notification Engine encountered fatal exception processing \u0027"},{"line_number":95,"context_line":"                    \u0027messages. Shutting down all threads and exiting. {}\u0027.format(e))"},{"line_number":96,"context_line":"                os._exit(1)"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_ec9992c3","line":96,"range":{"start_line":96,"start_character":19,"end_line":96,"end_character":24},"in_reply_to":"7f231b9d_26634db4","updated":"2017-06-20 00:35:55.000000000","message":"Done","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"2d284dc2f61c7d84e9069f15880cc7ee4ef7454f","unresolved":false,"context_lines":[{"line_number":93,"context_line":"                log.exception("},{"line_number":94,"context_line":"                    \u0027Notification Engine encountered fatal exception processing \u0027"},{"line_number":95,"context_line":"                    \u0027messages. Shutting down all threads and exiting. {}\u0027.format(e))"},{"line_number":96,"context_line":"                os._exit(1)"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_16105fff","line":96,"range":{"start_line":96,"start_character":19,"end_line":96,"end_character":24},"in_reply_to":"7f231b9d_26634db4","updated":"2017-06-19 16:30:34.000000000","message":"Okay, I\u0027ll add that logic","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"bac5e46af4a7b5cb270b6fc6b8c4847ffb8355f9","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                log.exception("},{"line_number":102,"context_line":"                    \u0027Notification Engine encountered fatal exception processing \u0027"},{"line_number":103,"context_line":"                    \u0027messages. Shutting down all threads and exiting. {}\u0027.format(e))"},{"line_number":104,"context_line":"                os._exit(1)"}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_768d4530","line":104,"range":{"start_line":104,"start_character":19,"end_line":104,"end_character":24},"updated":"2017-06-20 01:30:19.000000000","message":"Once we\u0027ve commited past the offset there isn\u0027t necessarily a need to exit.  An exit will still throw the system into a repartition loop which will take 1 to 2 minutes to finish.","commit_id":"67167ebbd03747ede360776c1ab712c1a2f33b73"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"4086713f7f2f1708b2c22473339ad78fc2a097f8","unresolved":false,"context_lines":[{"line_number":101,"context_line":"                log.exception("},{"line_number":102,"context_line":"                    \u0027Notification Engine encountered fatal exception processing \u0027"},{"line_number":103,"context_line":"                    \u0027messages. Shutting down all threads and exiting. {}\u0027.format(e))"},{"line_number":104,"context_line":"                os._exit(1)"}],"source_content_type":"text/x-python","patch_set":50,"id":"5f201791_83d65d4f","line":104,"range":{"start_line":104,"start_character":19,"end_line":104,"end_character":24},"in_reply_to":"7f231b9d_768d4530","updated":"2017-10-24 15:37:11.000000000","message":"Done","commit_id":"67167ebbd03747ede360776c1ab712c1a2f33b73"}],"monasca_notification/notification_manager.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from monasca_common.kafka import consumer"},{"line_number":22,"context_line":"from monasca_common.kafka import producer"},{"line_number":23,"context_line":"from monasca_notification.common.utils import construct_notification_object"},{"line_number":24,"context_line":"from monasca_notification.common.utils import get_db_repo"},{"line_number":25,"context_line":"from monasca_notification.common.utils import get_statsd_client"},{"line_number":26,"context_line":"from monasca_notification.processors.notification_processor import NotificationProcessor"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_71acbaa0","line":23,"updated":"2017-03-09 05:33:17.000000000","message":"You should import modules here instead of objects according to guidelines of OpenStack","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from monasca_common.kafka import consumer"},{"line_number":22,"context_line":"from monasca_common.kafka import producer"},{"line_number":23,"context_line":"from monasca_notification.common.utils import construct_notification_object"},{"line_number":24,"context_line":"from monasca_notification.common.utils import get_db_repo"},{"line_number":25,"context_line":"from monasca_notification.common.utils import get_statsd_client"},{"line_number":26,"context_line":"from monasca_notification.processors.notification_processor import NotificationProcessor"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_0fddfb6e","line":23,"in_reply_to":"9a30ddce_71acbaa0","updated":"2017-03-09 18:28:34.000000000","message":"Done","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from monasca_notification.processors.notification_processor import NotificationProcessor"},{"line_number":27,"context_line":"from monasca_notification.rule_engine import RuleEngine"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"log \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class NotificationManager(object):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_d191e653","line":29,"updated":"2017-03-09 05:33:17.000000000","message":"Isn\u0027t it like usually you should use uppercased variable for constant ?","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":26,"context_line":"from monasca_notification.processors.notification_processor import NotificationProcessor"},{"line_number":27,"context_line":"from monasca_notification.rule_engine import RuleEngine"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"log \u003d logging.getLogger(__name__)"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"class NotificationManager(object):"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_0f4b3b2b","line":29,"in_reply_to":"9a30ddce_d191e653","updated":"2017-03-09 18:28:34.000000000","message":"According to pep8 guidelines, global variables follow basically the same guidelines that functions do which is lower case. Do we use a different convention?","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"}],"monasca_notification/plugins/email_notifier.py":[{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"513ed5f8476e842a530d34d8883065168436446a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_7abd3fb5","line":1,"range":{"start_line":1,"start_character":21,"end_line":1,"end_character":25},"updated":"2017-06-19 13:40:30.000000000","message":"copyright","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"ba0250e022b6ced4a94faea1ae1f8a780cb56db9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (C) Copyright 2015-2016 Hewlett Packard Enterprise Development LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_56bb74c3","line":1,"range":{"start_line":1,"start_character":21,"end_line":1,"end_character":25},"in_reply_to":"7f231b9d_7abd3fb5","updated":"2017-06-20 00:35:55.000000000","message":"Done","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"}],"monasca_notification/plugins/hipchat_notifier.py":[{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"513ed5f8476e842a530d34d8883065168436446a","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                \u0027metrics\u0027: notification.metrics}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        if notification.is_grouped:"},{"line_number":76,"context_line":"            body[\u0027rule_id\u0027] \u003d notification.alarm_id"},{"line_number":77,"context_line":"            body[\u0027rule_name\u0027] \u003d notification.alarm_name"},{"line_number":78,"context_line":"        else:"},{"line_number":79,"context_line":"            body[\u0027alarm_id\u0027] \u003d notification.alarm_id"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_facdcf5c","line":76,"range":{"start_line":76,"start_character":43,"end_line":76,"end_character":51},"updated":"2017-06-19 13:40:30.000000000","message":"Is rule_id really stored in alarm_id? That seems confusing","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"2d284dc2f61c7d84e9069f15880cc7ee4ef7454f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                \u0027metrics\u0027: notification.metrics}"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        if notification.is_grouped:"},{"line_number":76,"context_line":"            body[\u0027rule_id\u0027] \u003d notification.alarm_id"},{"line_number":77,"context_line":"            body[\u0027rule_name\u0027] \u003d notification.alarm_name"},{"line_number":78,"context_line":"        else:"},{"line_number":79,"context_line":"            body[\u0027alarm_id\u0027] \u003d notification.alarm_id"}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_3697db3c","line":76,"range":{"start_line":76,"start_character":43,"end_line":76,"end_character":51},"in_reply_to":"7f231b9d_facdcf5c","updated":"2017-06-19 16:30:34.000000000","message":"If the notification is grouped then it is a rule id. It is confusing because there is no field in a notification to store alarm_id, and the field alarm_id doesn\u0027t make sense after it becomes a grouped notification. It almost makes more sense to have a different object all together for grouped notifications. This conversion is to make sure that the hipchat notification isn\u0027t as confusing as the code looks.","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"}],"monasca_notification/plugins/jira_notifier.py":[{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"513ed5f8476e842a530d34d8883065168436446a","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (C) Copyright 2016 Hewlett Packard Enterprise Development Company LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_bad3d700","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"updated":"2017-06-19 13:40:30.000000000","message":"copyright","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"ba0250e022b6ced4a94faea1ae1f8a780cb56db9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (C) Copyright 2016 Hewlett Packard Enterprise Development Company LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_76b670df","line":1,"range":{"start_line":1,"start_character":16,"end_line":1,"end_character":20},"in_reply_to":"7f231b9d_bad3d700","updated":"2017-06-20 00:35:55.000000000","message":"Done","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"}],"monasca_notification/processors/notification_processor.py":[{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"bac5e46af4a7b5cb270b6fc6b8c4847ffb8355f9","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                                   [i.to_json() for i in failed])"},{"line_number":93,"context_line":"            finished_count.increment()"},{"line_number":94,"context_line":"        except Exception as e:"},{"line_number":95,"context_line":"            log.warn(\"Unexpected error encountered while sending notifications. \""},{"line_number":96,"context_line":"                     \"Got {}\".format(e))"}],"source_content_type":"text/x-python","patch_set":50,"id":"7f231b9d_167cd11e","line":95,"range":{"start_line":95,"start_character":16,"end_line":95,"end_character":20},"updated":"2017-06-20 01:30:19.000000000","message":"This should be a log.exception.  We don\u0027t really know what happened here so we need to make sure we dump as much information, including the stack trace, as possible.","commit_id":"67167ebbd03747ede360776c1ab712c1a2f33b73"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"4086713f7f2f1708b2c22473339ad78fc2a097f8","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                                   [i.to_json() for i in failed])"},{"line_number":93,"context_line":"            finished_count.increment()"},{"line_number":94,"context_line":"        except Exception as e:"},{"line_number":95,"context_line":"            log.warn(\"Unexpected error encountered while sending notifications. \""},{"line_number":96,"context_line":"                     \"Got {}\".format(e))"}],"source_content_type":"text/x-python","patch_set":50,"id":"5f201791_8309bdde","line":95,"range":{"start_line":95,"start_character":16,"end_line":95,"end_character":20},"in_reply_to":"7f231b9d_167cd11e","updated":"2017-10-24 15:37:11.000000000","message":"Done","commit_id":"67167ebbd03747ede360776c1ab712c1a2f33b73"}],"monasca_notification/processors/rule_processor.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"d55370e2d4b04d678496b43498ff127188624e9e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import json"},{"line_number":17,"context_line":"import logging"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from rule import Rule"},{"line_number":20,"context_line":"from silence import Silence"},{"line_number":21,"context_line":"from inhibit import Inhibit"},{"line_number":22,"context_line":"from group import Group"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_cc9711ea","line":19,"updated":"2017-02-15 22:39:48.000000000","message":"You should use absolute imports.","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"fce36969f0a4f81ff77c09a07ca0823fda380c87","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import json"},{"line_number":17,"context_line":"import logging"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from rule import Rule"},{"line_number":20,"context_line":"from silence import Silence"},{"line_number":21,"context_line":"from inhibit import Inhibit"},{"line_number":22,"context_line":"from group import Group"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_efccc736","line":19,"in_reply_to":"fa31d9ce_cc9711ea","updated":"2017-02-16 23:49:48.000000000","message":"Thanks for the suggestion. I will change all of the imports when I do the final clean up and get rid of all of my notes and comments.","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import logging"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from monasca_notification import notification_exceptions"},{"line_number":20,"context_line":"from monasca_notification.rule import Group"},{"line_number":21,"context_line":"from monasca_notification.rule import Inhibit"},{"line_number":22,"context_line":"from monasca_notification.rule import Silence"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_d1cac66d","line":20,"updated":"2017-03-09 05:33:17.000000000","message":"You ought to import modules here\n\n  from monasca_notification import rule","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":17,"context_line":"import logging"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from monasca_notification import notification_exceptions"},{"line_number":20,"context_line":"from monasca_notification.rule import Group"},{"line_number":21,"context_line":"from monasca_notification.rule import Inhibit"},{"line_number":22,"context_line":"from monasca_notification.rule import Silence"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_2f6b9f86","line":20,"in_reply_to":"9a30ddce_d1cac66d","updated":"2017-03-09 18:28:34.000000000","message":"Done","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"13232fc671bdd103084b4e22719a6b549608647a","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def _parse_inhibit_create_rule(rule):"},{"line_number":27,"context_line":"    expected_fields \u003d ["},{"line_number":28,"context_line":"        \u0027id\u0027,"},{"line_number":29,"context_line":"        \u0027name\u0027,"},{"line_number":30,"context_line":"        \u0027tenantId\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_d957df23","line":27,"updated":"2017-03-23 05:18:43.000000000","message":"Can we move this and other, similar variables into module level constants with some nice documentation ?","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"1809d22947251f2645937c09884d8befa1df780b","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def _parse_inhibit_create_rule(rule):"},{"line_number":27,"context_line":"    expected_fields \u003d ["},{"line_number":28,"context_line":"        \u0027id\u0027,"},{"line_number":29,"context_line":"        \u0027name\u0027,"},{"line_number":30,"context_line":"        \u0027tenantId\u0027,"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_c997f538","line":27,"in_reply_to":"1a1ced50_d957df23","updated":"2017-03-31 16:47:10.000000000","message":"Done","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"9d4b7f6bef1e2e8f5f83556182720791dcaef4e4","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                                rule[\u0027exclusions\u0027],"},{"line_number":56,"context_line":"                                rule[\u0027group_wait\u0027],"},{"line_number":57,"context_line":"                                rule[\u0027repeat_interval\u0027],"},{"line_number":58,"context_line":"                                rule.get(\u0027alarm_actions\u0027, []),"},{"line_number":59,"context_line":"                                rule.get(\u0027ok_actions\u0027, []),"},{"line_number":60,"context_line":"                                rule.get(\u0027undetermined_actions\u0027, []))"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"7ffa3b31_b46b0aef","line":58,"range":{"start_line":58,"start_character":42,"end_line":58,"end_character":55},"updated":"2017-04-21 19:56:45.000000000","message":"If the key has a value of None, the default will not be used, and since you check for it\u0027s existence above I don\u0027t think this is working the way you expected.","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"73dbdf2e9087f7fb3bf7504fe153164ea547edfc","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                                rule[\u0027exclusions\u0027],"},{"line_number":56,"context_line":"                                rule[\u0027group_wait\u0027],"},{"line_number":57,"context_line":"                                rule[\u0027repeat_interval\u0027],"},{"line_number":58,"context_line":"                                rule.get(\u0027alarm_actions\u0027, []),"},{"line_number":59,"context_line":"                                rule.get(\u0027ok_actions\u0027, []),"},{"line_number":60,"context_line":"                                rule.get(\u0027undetermined_actions\u0027, []))"},{"line_number":61,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_dd6fab90","line":58,"range":{"start_line":58,"start_character":42,"end_line":58,"end_character":55},"in_reply_to":"7ffa3b31_b46b0aef","updated":"2017-04-21 22:41:36.000000000","message":"Done","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"9d4b7f6bef1e2e8f5f83556182720791dcaef4e4","unresolved":false,"context_lines":[{"line_number":175,"context_line":"                _set_attributes_in_rule(rule[6], rule[7], rule[8], rule[9], group)"},{"line_number":176,"context_line":"            else:"},{"line_number":177,"context_line":"                group \u003d Rule.Group("},{"line_number":178,"context_line":"                    rule_id,             # id"},{"line_number":179,"context_line":"                    rule[1],             # tenant id"},{"line_number":180,"context_line":"                    rule[2],             # name"},{"line_number":181,"context_line":"                    rule[3].split(\u0027,\u0027),  # matchers"},{"line_number":182,"context_line":"                    {},                  # exclusions"},{"line_number":183,"context_line":"                    rule[4],             # group_wait"},{"line_number":184,"context_line":"                    rule[5],             # repeat"},{"line_number":185,"context_line":"                    set(),               # alarm_actions"},{"line_number":186,"context_line":"                    set(),               # ok_actions"},{"line_number":187,"context_line":"                    set())               # undetermined_actions"},{"line_number":188,"context_line":"                _set_attributes_in_rule(rule[6], rule[7], rule[8], rule[9], group)"},{"line_number":189,"context_line":"                rules[rule_id] \u003d group"},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":37,"id":"7ffa3b31_542286ba","line":187,"range":{"start_line":178,"start_character":20,"end_line":187,"end_character":63},"updated":"2017-04-21 19:56:45.000000000","message":"Rather than having to reference values by number, there should be a way to return a dictionary from the DB. Might make it easier to work with.","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"63efc04891f5f060c3812db086413f31a2a5ddf6","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                result[\u0027exclusions\u0027])    # exclusions"},{"line_number":219,"context_line":"            rules[rule_id] \u003d inhibition"},{"line_number":220,"context_line":"        return rules.values()"},{"line_number":221,"context_line":"    except pyparsing.ParseException as e:"},{"line_number":222,"context_line":"        log.warn(\"Invalid expression {}. Got {}\".format(expression, e))"},{"line_number":223,"context_line":"    except Exception as e:"},{"line_number":224,"context_line":"        log.warn(\"Failed to read inhibition rules from database. \""}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_8a040d19","line":221,"range":{"start_line":221,"start_character":11,"end_line":221,"end_character":20},"updated":"2017-06-21 19:37:03.000000000","message":"you need to import pyparsing first.","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"4086713f7f2f1708b2c22473339ad78fc2a097f8","unresolved":false,"context_lines":[{"line_number":218,"context_line":"                result[\u0027exclusions\u0027])    # exclusions"},{"line_number":219,"context_line":"            rules[rule_id] \u003d inhibition"},{"line_number":220,"context_line":"        return rules.values()"},{"line_number":221,"context_line":"    except pyparsing.ParseException as e:"},{"line_number":222,"context_line":"        log.warn(\"Invalid expression {}. Got {}\".format(expression, e))"},{"line_number":223,"context_line":"    except Exception as e:"},{"line_number":224,"context_line":"        log.warn(\"Failed to read inhibition rules from database. \""}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_edf83bc5","line":221,"range":{"start_line":221,"start_character":11,"end_line":221,"end_character":20},"in_reply_to":"5f201791_8a040d19","updated":"2017-10-24 15:37:11.000000000","message":"Done","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"63efc04891f5f060c3812db086413f31a2a5ddf6","unresolved":false,"context_lines":[{"line_number":219,"context_line":"            rules[rule_id] \u003d inhibition"},{"line_number":220,"context_line":"        return rules.values()"},{"line_number":221,"context_line":"    except pyparsing.ParseException as e:"},{"line_number":222,"context_line":"        log.warn(\"Invalid expression {}. Got {}\".format(expression, e))"},{"line_number":223,"context_line":"    except Exception as e:"},{"line_number":224,"context_line":"        log.warn(\"Failed to read inhibition rules from database. \""},{"line_number":225,"context_line":"                 \"Continuing without syncing with database. {}\""}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_ed127b58","line":222,"range":{"start_line":222,"start_character":56,"end_line":222,"end_character":66},"updated":"2017-06-21 19:37:03.000000000","message":"will be no variable called expression if you hit the exception here.","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"63efc04891f5f060c3812db086413f31a2a5ddf6","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        return rules.values()"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"def _set_attributes_in_rule(rule_id, rule):"},{"line_number":261,"context_line":"    raw_actions \u003d db_repo.get_group_actions(rule_id)"},{"line_number":262,"context_line":"    for action in raw_actions:"},{"line_number":263,"context_line":"        action_state \u003d action[0]"}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_ed3b9bce","line":260,"range":{"start_line":260,"start_character":41,"end_line":260,"end_character":43},"updated":"2017-06-21 19:37:03.000000000","message":"are you missing db_repo as input variable here?","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"4086713f7f2f1708b2c22473339ad78fc2a097f8","unresolved":false,"context_lines":[{"line_number":257,"context_line":"        return rules.values()"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"def _set_attributes_in_rule(rule_id, rule):"},{"line_number":261,"context_line":"    raw_actions \u003d db_repo.get_group_actions(rule_id)"},{"line_number":262,"context_line":"    for action in raw_actions:"},{"line_number":263,"context_line":"        action_state \u003d action[0]"}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_8dff87a9","line":260,"range":{"start_line":260,"start_character":41,"end_line":260,"end_character":43},"in_reply_to":"5f201791_ed3b9bce","updated":"2017-10-24 15:37:11.000000000","message":"Done","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"}],"monasca_notification/rule.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"d55370e2d4b04d678496b43498ff127188624e9e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import json"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"class Rule(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_0c9e8906","line":1,"updated":"2017-02-15 22:39:48.000000000","message":"ujson ?","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"fce36969f0a4f81ff77c09a07ca0823fda380c87","unresolved":false,"context_lines":[{"line_number":1,"context_line":"import json"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"class Rule(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_6fc29786","line":1,"in_reply_to":"fa31d9ce_0c9e8906","updated":"2017-02-16 23:49:48.000000000","message":"All of the other files in monasca notification seem to import json. Should it be different?","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"13232fc671bdd103084b4e22719a6b549608647a","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        return not self.__eq__(other)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __hash__(self):"},{"line_number":50,"context_line":"        return hash(self.ruleId)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    # Tests a notification against the rule"},{"line_number":53,"context_line":"    # If the notification matches, returns the rule_id"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_f929fb9b","line":50,"updated":"2017-03-23 05:18:43.000000000","message":"Similar comment to this one as in other file.","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"1809d22947251f2645937c09884d8befa1df780b","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        return not self.__eq__(other)"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def __hash__(self):"},{"line_number":50,"context_line":"        return hash(self.ruleId)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    # Tests a notification against the rule"},{"line_number":53,"context_line":"    # If the notification matches, returns the rule_id"}],"source_content_type":"text/x-python","patch_set":33,"id":"ffe62b97_b5da3a48","line":50,"in_reply_to":"1a1ced50_f929fb9b","updated":"2017-03-31 16:47:10.000000000","message":"Done","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"9d4b7f6bef1e2e8f5f83556182720791dcaef4e4","unresolved":false,"context_lines":[{"line_number":76,"context_line":"           NOTE: A silence rule is the only type of rule"},{"line_number":77,"context_line":"                 that might be invalid."},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        return True"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def group(self, notifications):"},{"line_number":82,"context_line":"        \"\"\"Compares notification objects to the rule to see if"}],"source_content_type":"text/x-python","patch_set":37,"id":"7ffa3b31_972370a7","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":19},"updated":"2017-04-21 19:56:45.000000000","message":"Might want to raise an error in these abstract methods instead of returning fake values.","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"73dbdf2e9087f7fb3bf7504fe153164ea547edfc","unresolved":false,"context_lines":[{"line_number":76,"context_line":"           NOTE: A silence rule is the only type of rule"},{"line_number":77,"context_line":"                 that might be invalid."},{"line_number":78,"context_line":"        \"\"\""},{"line_number":79,"context_line":"        return True"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"    def group(self, notifications):"},{"line_number":82,"context_line":"        \"\"\"Compares notification objects to the rule to see if"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_804bf885","line":79,"range":{"start_line":79,"start_character":8,"end_line":79,"end_character":19},"in_reply_to":"7ffa3b31_972370a7","updated":"2017-04-21 22:41:36.000000000","message":"Done","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"9d4b7f6bef1e2e8f5f83556182720791dcaef4e4","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            matching_sources_by_time \u003d sorted(matching_sources,"},{"line_number":286,"context_line":"                                              key\u003dlambda i: i.alarm_timestamp)"},{"line_number":287,"context_line":"            for source in matching_sources_by_time:"},{"line_number":288,"context_line":"                if source.state \u003d\u003d \u0027ALARM\u0027:"},{"line_number":289,"context_line":"                    inhibited.add(target)"},{"line_number":290,"context_line":"                    target.is_inhibited \u003d True"},{"line_number":291,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":37,"id":"7ffa3b31_376c9c9a","line":288,"range":{"start_line":288,"start_character":16,"end_line":288,"end_character":43},"updated":"2017-04-21 19:56:45.000000000","message":"seems like this could be checked earlier, to bypass everything if no sources are in the alarm state","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"73dbdf2e9087f7fb3bf7504fe153164ea547edfc","unresolved":false,"context_lines":[{"line_number":285,"context_line":"            matching_sources_by_time \u003d sorted(matching_sources,"},{"line_number":286,"context_line":"                                              key\u003dlambda i: i.alarm_timestamp)"},{"line_number":287,"context_line":"            for source in matching_sources_by_time:"},{"line_number":288,"context_line":"                if source.state \u003d\u003d \u0027ALARM\u0027:"},{"line_number":289,"context_line":"                    inhibited.add(target)"},{"line_number":290,"context_line":"                    target.is_inhibited \u003d True"},{"line_number":291,"context_line":"                else:"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_20d544ba","line":288,"range":{"start_line":288,"start_character":16,"end_line":288,"end_character":43},"in_reply_to":"7ffa3b31_376c9c9a","updated":"2017-04-21 22:41:36.000000000","message":"I was able to get rid of one of the for loops, but I think one of them is still necessary because the target and source alarm have to match the rule and the must have equal values for the equals key list.","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"63efc04891f5f060c3812db086413f31a2a5ddf6","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def alarm_is_grouped(self, alarm):"},{"line_number":142,"context_line":"        \"\"\"Tests an alarm against the rule."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"           :param notification: a notification object"},{"line_number":145,"context_line":"           :returns: If the alarm is grouped, returns the rule_id"},{"line_number":146,"context_line":"           Otherwise, retruns None."},{"line_number":147,"context_line":"           NOTE: A group rule is the only one that might return a rule_id"}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_aafd893b","line":144,"range":{"start_line":144,"start_character":10,"end_line":144,"end_character":53},"updated":"2017-06-21 19:37:03.000000000","message":"does not match the input param.","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"4086713f7f2f1708b2c22473339ad78fc2a097f8","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    def alarm_is_grouped(self, alarm):"},{"line_number":142,"context_line":"        \"\"\"Tests an alarm against the rule."},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"           :param notification: a notification object"},{"line_number":145,"context_line":"           :returns: If the alarm is grouped, returns the rule_id"},{"line_number":146,"context_line":"           Otherwise, retruns None."},{"line_number":147,"context_line":"           NOTE: A group rule is the only one that might return a rule_id"}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_90a9e07c","line":144,"range":{"start_line":144,"start_character":10,"end_line":144,"end_character":53},"in_reply_to":"5f201791_aafd893b","updated":"2017-10-24 15:37:11.000000000","message":"Done","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"3697a921b692348a9ad3a273fa6d400dfb27de7c","unresolved":false,"context_lines":[{"line_number":474,"context_line":"    for (name, param) in parts.iteritems():"},{"line_number":475,"context_line":"        if param:"},{"line_number":476,"context_line":"            time_delta_params[name] \u003d int(param)"},{"line_number":477,"context_line":"    return timedelta(**time_delta_params)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"def _make_notification_alarm(notification):"}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_d6d079cc","line":477,"range":{"start_line":477,"start_character":11,"end_line":477,"end_character":41},"updated":"2017-06-21 19:00:46.000000000","message":"Instead, you can return the total_seconds only. That\u0027s the part you need right?","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"7e73ef0a86db4eb960345e5b11c15101c3aaf6c9","unresolved":false,"context_lines":[{"line_number":474,"context_line":"    for (name, param) in parts.iteritems():"},{"line_number":475,"context_line":"        if param:"},{"line_number":476,"context_line":"            time_delta_params[name] \u003d int(param)"},{"line_number":477,"context_line":"    return timedelta(**time_delta_params)"},{"line_number":478,"context_line":""},{"line_number":479,"context_line":""},{"line_number":480,"context_line":"def _make_notification_alarm(notification):"}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_8ac64d67","line":477,"range":{"start_line":477,"start_character":11,"end_line":477,"end_character":41},"in_reply_to":"5f201791_d6d079cc","updated":"2017-06-21 19:07:30.000000000","message":"I am using a timedelta object in the silence code, so I don\u0027t think converting it to a float works for this code","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"63efc04891f5f060c3812db086413f31a2a5ddf6","unresolved":false,"context_lines":[{"line_number":627,"context_line":"    try:"},{"line_number":628,"context_line":"        if inhibited:"},{"line_number":629,"context_line":"            raw_alarms \u003d db_repo.get_alarms_inhibited()"},{"line_number":630,"context_line":"        elif inhibited:"},{"line_number":631,"context_line":"            raw_alarms \u003d db_repo.get_alarms_not_inhibited()"},{"line_number":632,"context_line":"        elif silenced:"},{"line_number":633,"context_line":"            raw_alarms \u003d db_repo.get_alarms_silenced()"}],"source_content_type":"text/x-python","patch_set":52,"id":"5f201791_4accb534","line":630,"range":{"start_line":630,"start_character":13,"end_line":630,"end_character":22},"updated":"2017-06-21 19:37:03.000000000","message":"should this be not_inhibited?","commit_id":"facd55f6845760203d44c97b19ac905781800bcb"},{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"c74ce394a8bd3b00a650268993145ce1515f9f76","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        # Get rid of any notifications that are the same except for state"},{"line_number":344,"context_line":"        # where those with a later time-stamp take precedence"},{"line_number":345,"context_line":"        unique_notifications \u003d copy.copy(notifications)"},{"line_number":346,"context_line":"        for a, b in itertools.combinations(notifications, 2):"},{"line_number":347,"context_line":"            if a.equal_except_for_state(b):"},{"line_number":348,"context_line":"                if a.alarm_timestamp \u003e b.alarm_timestamp:"},{"line_number":349,"context_line":"                    if b in unique_notifications:"}],"source_content_type":"text/x-python","patch_set":65,"id":"ff346bd7_a7bd3cd9","line":346,"range":{"start_line":346,"start_character":20,"end_line":346,"end_character":29},"updated":"2017-07-27 08:44:39.000000000","message":"use itertools from six module","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"c7c810e9a53c8b0334b2dab52ed4c0c045f6a9a2","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        # Get rid of any notifications that are the same except for state"},{"line_number":344,"context_line":"        # where those with a later time-stamp take precedence"},{"line_number":345,"context_line":"        unique_notifications \u003d copy.copy(notifications)"},{"line_number":346,"context_line":"        for a, b in itertools.combinations(notifications, 2):"},{"line_number":347,"context_line":"            if a.equal_except_for_state(b):"},{"line_number":348,"context_line":"                if a.alarm_timestamp \u003e b.alarm_timestamp:"},{"line_number":349,"context_line":"                    if b in unique_notifications:"}],"source_content_type":"text/x-python","patch_set":65,"id":"df3967d1_06a21a4c","line":346,"range":{"start_line":346,"start_character":20,"end_line":346,"end_character":29},"in_reply_to":"df3967d1_8062723d","updated":"2017-08-01 16:40:59.000000000","message":"Maybe it\u0027s not there...we\u0027re all human :).\nTo be honest, now that I read it once again, I think I don\u0027t really recall this in six :/","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"61eb426f4bf2ffe27b2ccc48f2c3d38006ccd6db","unresolved":false,"context_lines":[{"line_number":343,"context_line":"        # Get rid of any notifications that are the same except for state"},{"line_number":344,"context_line":"        # where those with a later time-stamp take precedence"},{"line_number":345,"context_line":"        unique_notifications \u003d copy.copy(notifications)"},{"line_number":346,"context_line":"        for a, b in itertools.combinations(notifications, 2):"},{"line_number":347,"context_line":"            if a.equal_except_for_state(b):"},{"line_number":348,"context_line":"                if a.alarm_timestamp \u003e b.alarm_timestamp:"},{"line_number":349,"context_line":"                    if b in unique_notifications:"}],"source_content_type":"text/x-python","patch_set":65,"id":"df3967d1_8062723d","line":346,"range":{"start_line":346,"start_character":20,"end_line":346,"end_character":29},"in_reply_to":"ff346bd7_a7bd3cd9","updated":"2017-08-01 15:33:09.000000000","message":"Sorry I didn\u0027t find one from six module for itertools.combinations hmm","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"}],"monasca_notification/rule_engine.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"d55370e2d4b04d678496b43498ff127188624e9e","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from monasca_common.kafka import producer"},{"line_number":20,"context_line":"from monasca_common.kafka import consumer"},{"line_number":21,"context_line":"from processors.notification_processor import NotificationProcessor"},{"line_number":22,"context_line":"from processors.rule_processor import RuleProcessor"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"log \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_ac8d7dd4","line":21,"updated":"2017-02-15 22:39:48.000000000","message":"absolute imports","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":14273,"name":"Joe Keen","email":"joe.keen@hpe.com","username":"jkeen"},"change_message_id":"5deb633a47f4c330817a7fc0dfcc88ad9056bbed","unresolved":false,"context_lines":[{"line_number":143,"context_line":"        self._producer.publish(self._topics[\u0027retry_topic\u0027],"},{"line_number":144,"context_line":"                               [i.to_json() for i in failed])"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    # This method is called in a sepreat process and is responsible"},{"line_number":147,"context_line":"    # for reading new rules from a Kafka topic"},{"line_number":148,"context_line":"    def _read_rules(self):"},{"line_number":149,"context_line":"        for rules in self._rules_consumer:"}],"source_content_type":"text/x-python","patch_set":1,"id":"fa31d9ce_21850ece","line":146,"range":{"start_line":146,"start_character":41,"end_line":146,"end_character":48},"updated":"2017-02-16 02:59:00.000000000","message":"Thread?","commit_id":"043a76d1ac6f20b7b0f51d0e9e37c9915bc0891f"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import logging"},{"line_number":17,"context_line":"import threading"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from monasca_common.kafka import consumer"},{"line_number":20,"context_line":"from monasca_notification.common import utils"},{"line_number":21,"context_line":"from monasca_notification.notification import Notification"},{"line_number":22,"context_line":"from monasca_notification.notification_exceptions import AlarmFormatError"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_31896227","line":19,"updated":"2017-03-09 05:33:17.000000000","message":"You should import modules.","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":16,"context_line":"import logging"},{"line_number":17,"context_line":"import threading"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"from monasca_common.kafka import consumer"},{"line_number":20,"context_line":"from monasca_notification.common import utils"},{"line_number":21,"context_line":"from monasca_notification.notification import Notification"},{"line_number":22,"context_line":"from monasca_notification.notification_exceptions import AlarmFormatError"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_4ffff3a9","line":19,"in_reply_to":"9a30ddce_31896227","updated":"2017-03-09 18:28:34.000000000","message":"This one is actually a module, but I changed the rest","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"13232fc671bdd103084b4e22719a6b549608647a","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self._current_rules \u003d set()"},{"line_number":49,"context_line":"        self._read_db()"},{"line_number":50,"context_line":"        self._rule_reader_thread \u003d threading.Thread("},{"line_number":51,"context_line":"            name\u003d\u0027rule_reader\u0027,"},{"line_number":52,"context_line":"            target\u003dself._read_rules)"},{"line_number":53,"context_line":"        self._rule_reader_thread.daemon \u003d True"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_54081628","line":50,"range":{"start_line":50,"start_character":43,"end_line":50,"end_character":52},"updated":"2017-03-23 05:18:43.000000000","message":"Why thread and not processes ?","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"1809d22947251f2645937c09884d8befa1df780b","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        self._current_rules \u003d set()"},{"line_number":49,"context_line":"        self._read_db()"},{"line_number":50,"context_line":"        self._rule_reader_thread \u003d threading.Thread("},{"line_number":51,"context_line":"            name\u003d\u0027rule_reader\u0027,"},{"line_number":52,"context_line":"            target\u003dself._read_rules)"},{"line_number":53,"context_line":"        self._rule_reader_thread.daemon \u003d True"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_29d7a9c0","line":50,"range":{"start_line":50,"start_character":43,"end_line":50,"end_character":52},"in_reply_to":"1a1ced50_54081628","updated":"2017-03-31 16:47:10.000000000","message":"I am using threading here because I need to use the rule engine object that is also running the rule reader. Specifically, I need access to the variable _current_rules from the rule reader method and any others I might want to use in the Notification Manager or Notification Engine.","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"13232fc671bdd103084b4e22719a6b549608647a","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                                                                      len(grouped),"},{"line_number":138,"context_line":"                                                                      len(ungrouped)))"},{"line_number":139,"context_line":"        for notification in notification_batch:"},{"line_number":140,"context_line":"            if notification in uninhibited and \\"},{"line_number":141,"context_line":"                    notification in not_silenced and \\"},{"line_number":142,"context_line":"                    notification in ungrouped:"},{"line_number":143,"context_line":"                to_send.add(notification)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_d44a4654","line":140,"updated":"2017-03-23 05:18:43.000000000","message":"I think better way to break lines is to wrap them up with ()","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"1809d22947251f2645937c09884d8befa1df780b","unresolved":false,"context_lines":[{"line_number":137,"context_line":"                                                                      len(grouped),"},{"line_number":138,"context_line":"                                                                      len(ungrouped)))"},{"line_number":139,"context_line":"        for notification in notification_batch:"},{"line_number":140,"context_line":"            if notification in uninhibited and \\"},{"line_number":141,"context_line":"                    notification in not_silenced and \\"},{"line_number":142,"context_line":"                    notification in ungrouped:"},{"line_number":143,"context_line":"                to_send.add(notification)"}],"source_content_type":"text/x-python","patch_set":33,"id":"1a1ced50_e67060df","line":140,"in_reply_to":"1a1ced50_d44a4654","updated":"2017-03-31 16:47:10.000000000","message":"Done","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"513ed5f8476e842a530d34d8883065168436446a","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self._rule_reader_thread.start()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def matches_rule(self, notification):"},{"line_number":66,"context_line":"        \"\"\"Used in the Notification Engine to determin which notifications"},{"line_number":67,"context_line":"           to send to the Notification Manager."},{"line_number":68,"context_line":"           Tests a notification against a rule to see if it inhibits or silences."},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_fa526f66","line":66,"range":{"start_line":66,"start_character":46,"end_line":66,"end_character":54},"updated":"2017-06-19 13:40:30.000000000","message":"determine","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"ba0250e022b6ced4a94faea1ae1f8a780cb56db9","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        self._rule_reader_thread.start()"},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    def matches_rule(self, notification):"},{"line_number":66,"context_line":"        \"\"\"Used in the Notification Engine to determin which notifications"},{"line_number":67,"context_line":"           to send to the Notification Manager."},{"line_number":68,"context_line":"           Tests a notification against a rule to see if it inhibits or silences."},{"line_number":69,"context_line":""}],"source_content_type":"text/x-python","patch_set":49,"id":"7f231b9d_b64648c0","line":66,"range":{"start_line":66,"start_character":46,"end_line":66,"end_character":54},"in_reply_to":"7f231b9d_fa526f66","updated":"2017-06-20 00:35:55.000000000","message":"Done","commit_id":"cba9f8c1bb60af933f9f39b3fb50935a409f1c35"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"f2c435346afa41dd2906af361a265782fea26824","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        \"\"\"Takes a list of sources that flapped to alarm and removes them from the"},{"line_number":346,"context_line":"           memory of recently un-alarmed sources"},{"line_number":347,"context_line":"        \"\"\""},{"line_number":348,"context_line":"        for rule, sources in total_alarm_sources.iteritems():"},{"line_number":349,"context_line":"            if not isinstance(rule, Rule.Inhibit):"},{"line_number":350,"context_line":"                continue"},{"line_number":351,"context_line":"            for source in sources:"}],"source_content_type":"text/x-python","patch_set":55,"id":"3f1d235d_64fbda78","line":348,"updated":"2017-07-04 09:51:32.000000000","message":"items(), iteritems is not available in Py3","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"5659090e69ed0d9b34f8a2812ff2a3153161d909","unresolved":false,"context_lines":[{"line_number":345,"context_line":"        \"\"\"Takes a list of sources that flapped to alarm and removes them from the"},{"line_number":346,"context_line":"           memory of recently un-alarmed sources"},{"line_number":347,"context_line":"        \"\"\""},{"line_number":348,"context_line":"        for rule, sources in total_alarm_sources.iteritems():"},{"line_number":349,"context_line":"            if not isinstance(rule, Rule.Inhibit):"},{"line_number":350,"context_line":"                continue"},{"line_number":351,"context_line":"            for source in sources:"}],"source_content_type":"text/x-python","patch_set":55,"id":"ff346bd7_56beb265","line":348,"in_reply_to":"3f1d235d_64fbda78","updated":"2017-07-24 18:28:04.000000000","message":"Done","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"f2c435346afa41dd2906af361a265782fea26824","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        \"\"\"Takes a list of sources that flapped to OK and adds them to the"},{"line_number":360,"context_line":"           memory of recently un-alarmed sources"},{"line_number":361,"context_line":"        \"\"\""},{"line_number":362,"context_line":"        for rule, sources in total_ok_sources.iteritems():"},{"line_number":363,"context_line":"            if not isinstance(rule, Rule.Inhibit):"},{"line_number":364,"context_line":"                continue"},{"line_number":365,"context_line":"            for source in sources:"}],"source_content_type":"text/x-python","patch_set":55,"id":"3f1d235d_24f16296","line":362,"updated":"2017-07-04 09:51:32.000000000","message":"items(), iteritems is not available in Py3","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"5659090e69ed0d9b34f8a2812ff2a3153161d909","unresolved":false,"context_lines":[{"line_number":359,"context_line":"        \"\"\"Takes a list of sources that flapped to OK and adds them to the"},{"line_number":360,"context_line":"           memory of recently un-alarmed sources"},{"line_number":361,"context_line":"        \"\"\""},{"line_number":362,"context_line":"        for rule, sources in total_ok_sources.iteritems():"},{"line_number":363,"context_line":"            if not isinstance(rule, Rule.Inhibit):"},{"line_number":364,"context_line":"                continue"},{"line_number":365,"context_line":"            for source in sources:"}],"source_content_type":"text/x-python","patch_set":55,"id":"ff346bd7_768f76cc","line":362,"in_reply_to":"3f1d235d_24f16296","updated":"2017-07-24 18:28:04.000000000","message":"Done","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"c74ce394a8bd3b00a650268993145ce1515f9f76","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            if matchingId:"},{"line_number":92,"context_line":"                matching_rules.append(matchingId)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"#        for rule_id in to_delete:"},{"line_number":95,"context_line":"#            self._delete_rule(rule_id)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        return matching_rules"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":65,"id":"ff346bd7_e78fc4ca","line":95,"range":{"start_line":94,"start_character":0,"end_line":95,"end_character":39},"updated":"2017-07-27 08:44:39.000000000","message":"I think this can be removed","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"61eb426f4bf2ffe27b2ccc48f2c3d38006ccd6db","unresolved":false,"context_lines":[{"line_number":91,"context_line":"            if matchingId:"},{"line_number":92,"context_line":"                matching_rules.append(matchingId)"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"#        for rule_id in to_delete:"},{"line_number":95,"context_line":"#            self._delete_rule(rule_id)"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"        return matching_rules"},{"line_number":98,"context_line":""}],"source_content_type":"text/x-python","patch_set":65,"id":"df3967d1_a08c567f","line":95,"range":{"start_line":94,"start_character":0,"end_line":95,"end_character":39},"in_reply_to":"ff346bd7_e78fc4ca","updated":"2017-08-01 15:33:09.000000000","message":"Done","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"c74ce394a8bd3b00a650268993145ce1515f9f76","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        return to_send"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def _group(self, notifications):"},{"line_number":184,"context_line":"        \"\"\"Compares notifications to all current rules to group them"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"           :param notifications: a list of notifications"},{"line_number":187,"context_line":"           :returns: Returns three sets:"}],"source_content_type":"text/x-python","patch_set":65,"id":"ff346bd7_6711945d","line":184,"updated":"2017-07-27 08:44:39.000000000","message":"Missing dot","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"61eb426f4bf2ffe27b2ccc48f2c3d38006ccd6db","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        return to_send"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"    def _group(self, notifications):"},{"line_number":184,"context_line":"        \"\"\"Compares notifications to all current rules to group them"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"           :param notifications: a list of notifications"},{"line_number":187,"context_line":"           :returns: Returns three sets:"}],"source_content_type":"text/x-python","patch_set":65,"id":"df3967d1_c054facc","line":184,"in_reply_to":"ff346bd7_6711945d","updated":"2017-08-01 15:33:09.000000000","message":"Done","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"c74ce394a8bd3b00a650268993145ce1515f9f76","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        return to_send, total_grouped, total_ungrouped"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _inhibit(self, notifications):"},{"line_number":220,"context_line":"        \"\"\"Compares notifications to all current rules to inhibit them"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"           :param notifications: a list of notifications"},{"line_number":223,"context_line":"           :returns: Returns a set of notifications that were inhibited"}],"source_content_type":"text/x-python","patch_set":65,"id":"ff346bd7_e704641a","line":220,"updated":"2017-07-27 08:44:39.000000000","message":"Missing dot","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"61eb426f4bf2ffe27b2ccc48f2c3d38006ccd6db","unresolved":false,"context_lines":[{"line_number":217,"context_line":"        return to_send, total_grouped, total_ungrouped"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":"    def _inhibit(self, notifications):"},{"line_number":220,"context_line":"        \"\"\"Compares notifications to all current rules to inhibit them"},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"           :param notifications: a list of notifications"},{"line_number":223,"context_line":"           :returns: Returns a set of notifications that were inhibited"}],"source_content_type":"text/x-python","patch_set":65,"id":"df3967d1_2044e61a","line":220,"in_reply_to":"ff346bd7_e704641a","updated":"2017-08-01 15:33:09.000000000","message":"Done","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":20033,"name":"Artur Basiak","email":"artur.basiak@ts.fujitsu.com","username":"abasiak"},"change_message_id":"c74ce394a8bd3b00a650268993145ce1515f9f76","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        return total_inhibited, total_uninhibited"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def _silence(self, notifications):"},{"line_number":284,"context_line":"        \"\"\"Compares notifications to all current rules to silence them"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"           :param notifications: a list of notifications"},{"line_number":287,"context_line":"           :returns: Returns a set of notifications that were silenced"}],"source_content_type":"text/x-python","patch_set":65,"id":"ff346bd7_323d0cc4","line":284,"updated":"2017-07-27 08:44:39.000000000","message":"Missing dot.\nThe same comment for all method bellow. First line of the comment should end with a dot.","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"61eb426f4bf2ffe27b2ccc48f2c3d38006ccd6db","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        return total_inhibited, total_uninhibited"},{"line_number":282,"context_line":""},{"line_number":283,"context_line":"    def _silence(self, notifications):"},{"line_number":284,"context_line":"        \"\"\"Compares notifications to all current rules to silence them"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"           :param notifications: a list of notifications"},{"line_number":287,"context_line":"           :returns: Returns a set of notifications that were silenced"}],"source_content_type":"text/x-python","patch_set":65,"id":"df3967d1_803712b1","line":284,"in_reply_to":"ff346bd7_323d0cc4","updated":"2017-08-01 15:33:09.000000000","message":"Done","commit_id":"b166655ccd77cf06c57de91bb28fbfcf22e9e24b"}],"notification.yaml":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"13232fc671bdd103084b4e22719a6b549608647a","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    notification_retry_topic: retry-notifications"},{"line_number":7,"context_line":"    notification_rule_topic: notification-rules"},{"line_number":8,"context_line":"    manager:"},{"line_number":9,"context_line":"        default: 30"},{"line_number":10,"context_line":"        topics:"},{"line_number":11,"context_line":"            30: 30-seconds-manager"},{"line_number":12,"context_line":"    periodic:"}],"source_content_type":"text/x-yaml","patch_set":33,"id":"1a1ced50_f45ca21a","line":9,"updated":"2017-03-23 05:18:43.000000000","message":"what is this default ? Can we give this option some more meaningful name ?","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"1809d22947251f2645937c09884d8befa1df780b","unresolved":false,"context_lines":[{"line_number":6,"context_line":"    notification_retry_topic: retry-notifications"},{"line_number":7,"context_line":"    notification_rule_topic: notification-rules"},{"line_number":8,"context_line":"    manager:"},{"line_number":9,"context_line":"        default: 30"},{"line_number":10,"context_line":"        topics:"},{"line_number":11,"context_line":"            30: 30-seconds-manager"},{"line_number":12,"context_line":"    periodic:"}],"source_content_type":"text/x-yaml","patch_set":33,"id":"1a1ced50_c6fc4475","line":9,"in_reply_to":"1a1ced50_f45ca21a","updated":"2017-03-31 16:47:10.000000000","message":"It really has a duel meaning. It stands for the default wait time which also corresponds to the topic associated with that wait time. I am going to go with default_wait_time, but let me know if you have a better idea","commit_id":"0e8ba491c3a5ae212995375af27b3fd06ac1dd39"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"f2c435346afa41dd2906af361a265782fea26824","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    alarm_topic: alarm-state-transitions"},{"line_number":5,"context_line":"    notification_topic: alarm-notifications"},{"line_number":6,"context_line":"    notification_retry_topic: retry-notifications"},{"line_number":7,"context_line":"    notification_rule_topic: rule_updates_topic"},{"line_number":8,"context_line":"    manager:"},{"line_number":9,"context_line":"        default_wait_time: 30"},{"line_number":10,"context_line":"        topics:"}],"source_content_type":"text/x-yaml","patch_set":55,"id":"3f1d235d_84b836e5","line":7,"updated":"2017-07-04 09:51:32.000000000","message":"This is not the same topic as devstack plugin creates in monasca-api change.","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"20acb14b3453043e1578c35e96b8fb5ab661e3a1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    alarm_topic: alarm-state-transitions"},{"line_number":5,"context_line":"    notification_topic: alarm-notifications"},{"line_number":6,"context_line":"    notification_retry_topic: retry-notifications"},{"line_number":7,"context_line":"    notification_rule_topic: rule_updates_topic"},{"line_number":8,"context_line":"    manager:"},{"line_number":9,"context_line":"        default_wait_time: 30"},{"line_number":10,"context_line":"        topics:"}],"source_content_type":"text/x-yaml","patch_set":55,"id":"ff346bd7_2bcce733","line":7,"in_reply_to":"3f1d235d_84b836e5","updated":"2017-07-24 17:57:22.000000000","message":"should be rule_updates_topic: rule-updates","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":18179,"name":"Kaiyan Sheng","email":"kaiyan.sheng@hpe.com","username":"kaiyan-sheng"},"change_message_id":"5659090e69ed0d9b34f8a2812ff2a3153161d909","unresolved":false,"context_lines":[{"line_number":4,"context_line":"    alarm_topic: alarm-state-transitions"},{"line_number":5,"context_line":"    notification_topic: alarm-notifications"},{"line_number":6,"context_line":"    notification_retry_topic: retry-notifications"},{"line_number":7,"context_line":"    notification_rule_topic: rule_updates_topic"},{"line_number":8,"context_line":"    manager:"},{"line_number":9,"context_line":"        default_wait_time: 30"},{"line_number":10,"context_line":"        topics:"}],"source_content_type":"text/x-yaml","patch_set":55,"id":"ff346bd7_96abfa1b","line":7,"in_reply_to":"ff346bd7_2bcce733","updated":"2017-07-24 18:28:04.000000000","message":"Done","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"f2c435346afa41dd2906af361a265782fea26824","unresolved":false,"context_lines":[{"line_number":8,"context_line":"    manager:"},{"line_number":9,"context_line":"        default_wait_time: 30"},{"line_number":10,"context_line":"        topics:"},{"line_number":11,"context_line":"            30: 30-seconds-manager"},{"line_number":12,"context_line":"    periodic:"},{"line_number":13,"context_line":"        60: 60-seconds-notifications"},{"line_number":14,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":55,"id":"3f1d235d_a4afb27b","line":11,"updated":"2017-07-04 09:51:32.000000000","message":"This topic is not created inside the plugin at all.","commit_id":"7186b7f2dcdaa131010e72224776f55864c47eeb"}],"tests/test_notification_processor.py":[{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"9e2db1d36920e45b5ed2e18a22a06eb43b6ecee2","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (C) Copyright 2014-2016 Hewlett Packard Enterprise Development LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_567387b1","line":1,"range":{"start_line":1,"start_character":21,"end_line":1,"end_character":25},"updated":"2017-03-15 03:00:11.000000000","message":"copyright","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"3a6ef384cfa30e3388f8b03562eef07b1dea5b6e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# (C) Copyright 2014-2016 Hewlett Packard Enterprise Development LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\");"},{"line_number":4,"context_line":"# you may not use this file except in compliance with the License."}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_c417a54f","line":1,"range":{"start_line":1,"start_character":21,"end_line":1,"end_character":25},"in_reply_to":"3a1ff146_567387b1","updated":"2017-03-15 20:01:52.000000000","message":"Done","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"}],"tests/test_rule.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from monasca_notification import notification_exceptions"},{"line_number":17,"context_line":"from monasca_notification.notification import Notification"},{"line_number":18,"context_line":"from monasca_notification.rule import Group"},{"line_number":19,"context_line":"from monasca_notification.rule import Inhibit"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_b17d521e","line":16,"updated":"2017-03-09 05:33:17.000000000","message":"you should import modules here.","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from monasca_notification import notification_exceptions"},{"line_number":17,"context_line":"from monasca_notification.notification import Notification"},{"line_number":18,"context_line":"from monasca_notification.rule import Group"},{"line_number":19,"context_line":"from monasca_notification.rule import Inhibit"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_0f209b47","line":16,"in_reply_to":"9a30ddce_b17d521e","updated":"2017-03-09 18:28:34.000000000","message":"This one is a module, but I changed the rest","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"9e2db1d36920e45b5ed2e18a22a06eb43b6ecee2","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TestRule(unittest.TestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    alarm_1 \u003d {\u0027alarmId\u0027: 1, \u0027alarmName\u0027: \u0027test_alarm_0\u0027,"},{"line_number":27,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":28,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027HIGH\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":29,"context_line":"        \u0027tenantId\u0027: \u00271\u0027, \u0027metrics\u0027:[{\"id\":9,\"name\":\"test_metric\","},{"line_number":30,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host1\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":31,"context_line":"    notification_1 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":32,"context_line":"        \"http://127.0.0.1:8998\", 1, 0, alarm_1)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    alarm_2 \u003d {\u0027alarmId\u0027: 2, \u0027alarmName\u0027: \u0027test_alarm_0\u0027,"},{"line_number":35,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":36,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":37,"context_line":"        \u0027tenantId\u0027: \u00272\u0027, \u0027metrics\u0027:[{\"id\":9,\"name\":\"test_metric\","},{"line_number":38,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host1\u0027, \u0027usage\u0027: 45}}]}"},{"line_number":39,"context_line":"    notification_2 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":40,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_2)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    alarm_3 \u003d {\u0027alarmId\u0027: 3, \u0027alarmName\u0027: \u0027test_alarm_0\u0027,"},{"line_number":43,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":44,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027HIGH\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":45,"context_line":"        \u0027tenantId\u0027: \u00272\u0027, \u0027metrics\u0027:[{\"id\":10,\"name\":\"test_metric\","},{"line_number":46,"context_line":"        \"dimensions\":{\u0027usage\u0027: 30}}]}"},{"line_number":47,"context_line":"    notification_3 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":48,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_3)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    alarm_4 \u003d {\u0027alarmId\u0027: 4, \u0027alarmName\u0027: \u0027test_alarm_1\u0027,"},{"line_number":51,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":52,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":53,"context_line":"        \u0027tenantId\u0027: \u00271\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":54,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host1\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":55,"context_line":"    notification_4 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":56,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_4)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    alarm_5 \u003d {\u0027alarmId\u0027: 5, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":59,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":60,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027HIGH\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":61,"context_line":"        \u0027tenantId\u0027: \u00273\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":62,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":63,"context_line":"    notification_5 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":64,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_5)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    alarm_6 \u003d {\u0027alarmId\u0027: 6, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":67,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":68,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":69,"context_line":"        \u0027tenantId\u0027: \u00274\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":70,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":71,"context_line":"    notification_6 \u003d notification.Notification(\u00275\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":72,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_6)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    alarm_7 \u003d {\u0027alarmId\u0027: 7, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":75,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":76,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027CRITICAL\u0027, \u0027link\u0027: None,"},{"line_number":77,"context_line":"        \u0027lifecycleState\u0027: None, \u0027tenantId\u0027: \u00271\u0027, \u0027metrics\u0027:[{\"id\":11,"},{"line_number":78,"context_line":"        \"name\":\"test_metric\", \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":79,"context_line":"    notification_7 \u003d notification.Notification(\u00275\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":80,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_7)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    alarm_8 \u003d {\u0027alarmId\u0027: 8, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":83,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":84,"context_line":"        \u0027newState\u0027: \u0027OK\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":85,"context_line":"        \u0027tenantId\u0027: \u00273\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":86,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":87,"context_line":"    notification_8 \u003d notification.Notification(\u00275\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":88,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_8)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    alarm_9 \u003d {\u0027alarmId\u0027: 9, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":91,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":92,"context_line":"        \u0027newState\u0027: \u0027OK\u0027, \u0027severity\u0027: \u0027HIGH\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":93,"context_line":"        \u0027tenantId\u0027: \u00274\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":94,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":95,"context_line":"    notification_9 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":96,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_9)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    alarm_10 \u003d {\u0027alarmId\u0027: 10, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":99,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":100,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":101,"context_line":"        \u0027tenantId\u0027: \u00273\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":102,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":103,"context_line":"    notification_10 \u003d notification.Notification(\u00275\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":104,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_10)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def setUp(self):"},{"line_number":107,"context_line":"        self.trap \u003d []"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_96ac1fef","line":104,"range":{"start_line":26,"start_character":0,"end_line":104,"end_character":48},"updated":"2017-03-15 03:00:11.000000000","message":"It would be better to make a method that created these. Then you could pass in just the part that varies. That would make it much easier to see what the differences was and ensure the other parts didn\u0027t vary","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"3a6ef384cfa30e3388f8b03562eef07b1dea5b6e","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"class TestRule(unittest.TestCase):"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    alarm_1 \u003d {\u0027alarmId\u0027: 1, \u0027alarmName\u0027: \u0027test_alarm_0\u0027,"},{"line_number":27,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":28,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027HIGH\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":29,"context_line":"        \u0027tenantId\u0027: \u00271\u0027, \u0027metrics\u0027:[{\"id\":9,\"name\":\"test_metric\","},{"line_number":30,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host1\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":31,"context_line":"    notification_1 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":32,"context_line":"        \"http://127.0.0.1:8998\", 1, 0, alarm_1)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    alarm_2 \u003d {\u0027alarmId\u0027: 2, \u0027alarmName\u0027: \u0027test_alarm_0\u0027,"},{"line_number":35,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":36,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":37,"context_line":"        \u0027tenantId\u0027: \u00272\u0027, \u0027metrics\u0027:[{\"id\":9,\"name\":\"test_metric\","},{"line_number":38,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host1\u0027, \u0027usage\u0027: 45}}]}"},{"line_number":39,"context_line":"    notification_2 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":40,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_2)"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    alarm_3 \u003d {\u0027alarmId\u0027: 3, \u0027alarmName\u0027: \u0027test_alarm_0\u0027,"},{"line_number":43,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":44,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027HIGH\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":45,"context_line":"        \u0027tenantId\u0027: \u00272\u0027, \u0027metrics\u0027:[{\"id\":10,\"name\":\"test_metric\","},{"line_number":46,"context_line":"        \"dimensions\":{\u0027usage\u0027: 30}}]}"},{"line_number":47,"context_line":"    notification_3 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":48,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_3)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    alarm_4 \u003d {\u0027alarmId\u0027: 4, \u0027alarmName\u0027: \u0027test_alarm_1\u0027,"},{"line_number":51,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":52,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":53,"context_line":"        \u0027tenantId\u0027: \u00271\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":54,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host1\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":55,"context_line":"    notification_4 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":56,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_4)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"    alarm_5 \u003d {\u0027alarmId\u0027: 5, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":59,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":60,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027HIGH\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":61,"context_line":"        \u0027tenantId\u0027: \u00273\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":62,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":63,"context_line":"    notification_5 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":64,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_5)"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    alarm_6 \u003d {\u0027alarmId\u0027: 6, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":67,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":68,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":69,"context_line":"        \u0027tenantId\u0027: \u00274\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":70,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":71,"context_line":"    notification_6 \u003d notification.Notification(\u00275\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":72,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_6)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    alarm_7 \u003d {\u0027alarmId\u0027: 7, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":75,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":76,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027CRITICAL\u0027, \u0027link\u0027: None,"},{"line_number":77,"context_line":"        \u0027lifecycleState\u0027: None, \u0027tenantId\u0027: \u00271\u0027, \u0027metrics\u0027:[{\"id\":11,"},{"line_number":78,"context_line":"        \"name\":\"test_metric\", \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":79,"context_line":"    notification_7 \u003d notification.Notification(\u00275\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":80,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_7)"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"    alarm_8 \u003d {\u0027alarmId\u0027: 8, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":83,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":84,"context_line":"        \u0027newState\u0027: \u0027OK\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":85,"context_line":"        \u0027tenantId\u0027: \u00273\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":86,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":87,"context_line":"    notification_8 \u003d notification.Notification(\u00275\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":88,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_8)"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"    alarm_9 \u003d {\u0027alarmId\u0027: 9, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":91,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":92,"context_line":"        \u0027newState\u0027: \u0027OK\u0027, \u0027severity\u0027: \u0027HIGH\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":93,"context_line":"        \u0027tenantId\u0027: \u00274\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":94,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":95,"context_line":"    notification_9 \u003d notification.Notification(\u00274\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":96,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_9)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"    alarm_10 \u003d {\u0027alarmId\u0027: 10, \u0027alarmName\u0027: \u0027test_alarm_2\u0027,"},{"line_number":99,"context_line":"        \u0027timestamp\u0027: 1488304805552, \u0027stateChangeReason\u0027: \u0027Threshold exceeded\u0027,"},{"line_number":100,"context_line":"        \u0027newState\u0027: \u0027ALARM\u0027, \u0027severity\u0027: \u0027LOW\u0027, \u0027link\u0027: None, \u0027lifecycleState\u0027: None,"},{"line_number":101,"context_line":"        \u0027tenantId\u0027: \u00273\u0027, \u0027metrics\u0027:[{\"id\":11,\"name\":\"test_metric\","},{"line_number":102,"context_line":"        \"dimensions\":{\u0027hostName\u0027: \u0027host2\u0027, \u0027usage\u0027: 30}}]}"},{"line_number":103,"context_line":"    notification_10 \u003d notification.Notification(\u00275\u0027, \"webhook\", \u0027test_notification\u0027,"},{"line_number":104,"context_line":"        \"http://127.0.0.1:8999\", 1, 0, alarm_10)"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    def setUp(self):"},{"line_number":107,"context_line":"        self.trap \u003d []"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_1259f4fe","line":104,"range":{"start_line":26,"start_character":0,"end_line":104,"end_character":48},"in_reply_to":"3a1ff146_96ac1fef","updated":"2017-03-15 20:01:52.000000000","message":"Done","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"},{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"9e2db1d36920e45b5ed2e18a22a06eb43b6ecee2","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        self.assertEqual(group1, group2)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def test_group(self):"},{"line_number":125,"context_line":"        group \u003d rule.Group(\u00273\u0027, \u00271\u0027, \"test_group_rule\", [\"alarmName\", \"__hostName__\"],"},{"line_number":126,"context_line":"            {\"alarmName\": \"test_alarm_1\", \"tenantId\": \"4\"}, \u002730\u0027, \u00270\u0027, [\"123abc\"],"},{"line_number":127,"context_line":"            [\"234bcd\"], [\"345cde\"])"},{"line_number":128,"context_line":"        notifications \u003d ["},{"line_number":129,"context_line":"            self.notification_1, # grouped with 2"},{"line_number":130,"context_line":"            self.notification_2, # grouped with 1"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_36f36b0c","line":127,"range":{"start_line":125,"start_character":0,"end_line":127,"end_character":35},"updated":"2017-03-15 03:00:11.000000000","message":"This keeps getting repeated. Maybe make it a constant so it can be reused?","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"3a6ef384cfa30e3388f8b03562eef07b1dea5b6e","unresolved":false,"context_lines":[{"line_number":122,"context_line":"        self.assertEqual(group1, group2)"},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"    def test_group(self):"},{"line_number":125,"context_line":"        group \u003d rule.Group(\u00273\u0027, \u00271\u0027, \"test_group_rule\", [\"alarmName\", \"__hostName__\"],"},{"line_number":126,"context_line":"            {\"alarmName\": \"test_alarm_1\", \"tenantId\": \"4\"}, \u002730\u0027, \u00270\u0027, [\"123abc\"],"},{"line_number":127,"context_line":"            [\"234bcd\"], [\"345cde\"])"},{"line_number":128,"context_line":"        notifications \u003d ["},{"line_number":129,"context_line":"            self.notification_1, # grouped with 2"},{"line_number":130,"context_line":"            self.notification_2, # grouped with 1"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_325c30ed","line":127,"range":{"start_line":125,"start_character":0,"end_line":127,"end_character":35},"in_reply_to":"3a1ff146_36f36b0c","updated":"2017-03-15 20:01:52.000000000","message":"Done","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"},{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"9e2db1d36920e45b5ed2e18a22a06eb43b6ecee2","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            self.notification_6] # ecluded by tenant id"},{"line_number":135,"context_line":"        modified_notifications, grouped_notifications \u003d group.group(notifications)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self.assertEquals(len(grouped_notifications), 3)"},{"line_number":138,"context_line":"        self.assertEquals(len(modified_notifications), 2)"},{"line_number":139,"context_line":"        messages \u003d [\"test_group_rule criteria met with matcher values: \""},{"line_number":140,"context_line":"                    \"[\u0027test_alarm_0\u0027, \u0027host1\u0027]. 2 alarms grouped\","},{"line_number":141,"context_line":"                    \"test_group_rule criteria met with matcher values: \""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_f63633b3","line":138,"range":{"start_line":137,"start_character":0,"end_line":138,"end_character":57},"updated":"2017-03-15 03:00:11.000000000","message":"Shouldn\u0027t you also check that the expected ones are in each group?","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"3a6ef384cfa30e3388f8b03562eef07b1dea5b6e","unresolved":false,"context_lines":[{"line_number":134,"context_line":"            self.notification_6] # ecluded by tenant id"},{"line_number":135,"context_line":"        modified_notifications, grouped_notifications \u003d group.group(notifications)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"        self.assertEquals(len(grouped_notifications), 3)"},{"line_number":138,"context_line":"        self.assertEquals(len(modified_notifications), 2)"},{"line_number":139,"context_line":"        messages \u003d [\"test_group_rule criteria met with matcher values: \""},{"line_number":140,"context_line":"                    \"[\u0027test_alarm_0\u0027, \u0027host1\u0027]. 2 alarms grouped\","},{"line_number":141,"context_line":"                    \"test_group_rule criteria met with matcher values: \""}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_52736c80","line":138,"range":{"start_line":137,"start_character":0,"end_line":138,"end_character":57},"in_reply_to":"3a1ff146_f63633b3","updated":"2017-03-15 20:01:52.000000000","message":"Done.\nThe modified_notification are checked by looking for the modified messages below, and I added checks for the grouped_notifications.","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"},{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"9e2db1d36920e45b5ed2e18a22a06eb43b6ecee2","unresolved":false,"context_lines":[{"line_number":180,"context_line":"        rule_id \u003d group.notification_matches(self.notification_1)"},{"line_number":181,"context_line":"        self.assertEqual(rule_id, \u00273\u0027)"},{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        rule_id \u003d group.notification_matches(self.notification_3)"},{"line_number":184,"context_line":"        self.assertEqual(rule_id, None)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        rule_id \u003d group.notification_matches(self.notification_4)"},{"line_number":187,"context_line":"        self.assertEqual(rule_id, None)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    def test_inhibit(self):"},{"line_number":190,"context_line":"        inhibit \u003d rule.Inhibit(\u00274\u0027, \u00271\u0027, \u0027test_inhibit_rule\u0027, {\u0027severity\u0027: \u0027HIGH\u0027},"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_966fbf91","line":187,"range":{"start_line":183,"start_character":0,"end_line":187,"end_character":39},"updated":"2017-03-15 03:00:11.000000000","message":"Maybe a comment about why they don\u0027t match? Like you do in the next test which is very helpful","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"},{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"9d4b7f6bef1e2e8f5f83556182720791dcaef4e4","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        self.assertEqual(len(grouped_notifications), 0)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def test_group_with_invalid_rule(self):"},{"line_number":255,"context_line":"         modified_notifications, grouped \u003d self.inhibit.group([self.notification_1])"},{"line_number":256,"context_line":"         self.assertEqual(modified_notifications, []) # inhibit rule should not group anything"},{"line_number":257,"context_line":"         self.assertEqual(grouped, [])"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def test_group_with_different_states(self):"},{"line_number":260,"context_line":"        notifications \u003d [self.notification_7, self.notification_8]"}],"source_content_type":"text/x-python","patch_set":37,"id":"7ffa3b31_fa973beb","line":257,"range":{"start_line":255,"start_character":8,"end_line":257,"end_character":9},"updated":"2017-04-21 19:56:45.000000000","message":"Extra space in the indents here.","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"73dbdf2e9087f7fb3bf7504fe153164ea547edfc","unresolved":false,"context_lines":[{"line_number":252,"context_line":"        self.assertEqual(len(grouped_notifications), 0)"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"    def test_group_with_invalid_rule(self):"},{"line_number":255,"context_line":"         modified_notifications, grouped \u003d self.inhibit.group([self.notification_1])"},{"line_number":256,"context_line":"         self.assertEqual(modified_notifications, []) # inhibit rule should not group anything"},{"line_number":257,"context_line":"         self.assertEqual(grouped, [])"},{"line_number":258,"context_line":""},{"line_number":259,"context_line":"    def test_group_with_different_states(self):"},{"line_number":260,"context_line":"        notifications \u003d [self.notification_7, self.notification_8]"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_1d2cf345","line":257,"range":{"start_line":255,"start_character":8,"end_line":257,"end_character":9},"in_reply_to":"7ffa3b31_fa973beb","updated":"2017-04-21 22:41:36.000000000","message":"Done","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"}],"tests/test_rule_engine.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from monasca_notification.common import utils"},{"line_number":17,"context_line":"from monasca_notification.notification import Notification"},{"line_number":18,"context_line":"from monasca_notification.processors import alarm_processor"},{"line_number":19,"context_line":"from monasca_notification.rule import Group"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_d178062e","line":16,"updated":"2017-03-09 05:33:17.000000000","message":"you should import modules here.","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# See the License for the specific language governing permissions and"},{"line_number":14,"context_line":"# limitations under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from monasca_notification.common import utils"},{"line_number":17,"context_line":"from monasca_notification.notification import Notification"},{"line_number":18,"context_line":"from monasca_notification.processors import alarm_processor"},{"line_number":19,"context_line":"from monasca_notification.rule import Group"}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_0fd17bfa","line":16,"in_reply_to":"9a30ddce_d178062e","updated":"2017-03-09 18:28:34.000000000","message":"This one is a module, but I changed the rest","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from monasca_notification.rule import Silence"},{"line_number":22,"context_line":"from monasca_notification.rule_engine import RuleEngine"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import json"},{"line_number":25,"context_line":"from mock import patch"},{"line_number":26,"context_line":"import unittest"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_11737e4e","line":24,"updated":"2017-03-09 05:33:17.000000000","message":"non-project and non-project-libraries imports should be located above project imports.","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from monasca_notification.rule import Silence"},{"line_number":22,"context_line":"from monasca_notification.rule_engine import RuleEngine"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import json"},{"line_number":25,"context_line":"from mock import patch"},{"line_number":26,"context_line":"import unittest"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_8fbd6bb9","line":24,"in_reply_to":"9a30ddce_11737e4e","updated":"2017-03-09 18:28:34.000000000","message":"Done","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from monasca_notification.rule_engine import RuleEngine"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import json"},{"line_number":25,"context_line":"from mock import patch"},{"line_number":26,"context_line":"import unittest"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_5193364f","line":25,"updated":"2017-03-09 05:33:17.000000000","message":"Mock is project-library import so it should be between system and project imports.","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":22,"context_line":"from monasca_notification.rule_engine import RuleEngine"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"import json"},{"line_number":25,"context_line":"from mock import patch"},{"line_number":26,"context_line":"import unittest"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_4fd7f3ec","line":25,"in_reply_to":"9a30ddce_5193364f","updated":"2017-03-09 18:28:34.000000000","message":"Done","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"9d4b7f6bef1e2e8f5f83556182720791dcaef4e4","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class get_db_repo_stub(object):"},{"line_number":46,"context_line":"    def get_notification(self, action):"},{"line_number":47,"context_line":"       return \u0027webhook\u0027, \u0027test_notification\u0027, \u0027http://127.0.0.1:8888\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_inhibition_rules(self):"},{"line_number":50,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":37,"id":"7ffa3b31_7ab44b80","line":47,"range":{"start_line":47,"start_character":7,"end_line":47,"end_character":13},"updated":"2017-04-21 19:56:45.000000000","message":"Missing space in indent here","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"73dbdf2e9087f7fb3bf7504fe153164ea547edfc","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class get_db_repo_stub(object):"},{"line_number":46,"context_line":"    def get_notification(self, action):"},{"line_number":47,"context_line":"       return \u0027webhook\u0027, \u0027test_notification\u0027, \u0027http://127.0.0.1:8888\u0027"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"    def get_inhibition_rules(self):"},{"line_number":50,"context_line":"        return []"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_fd20274c","line":47,"range":{"start_line":47,"start_character":7,"end_line":47,"end_character":13},"in_reply_to":"7ffa3b31_7ab44b80","updated":"2017-04-21 22:41:36.000000000","message":"Done","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":14517,"name":"Ryan Brandt","email":"ryan.brandt@hpe.com","username":"ryan-brandt"},"change_message_id":"9d4b7f6bef1e2e8f5f83556182720791dcaef4e4","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    else:"},{"line_number":70,"context_line":"        dimensions \u003d \u0027{\"usage\": 30}\u0027"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    value \u003d \u0027{\"alarm-transitioned\":{\"tenantId\":\"\u0027 + tenantId + \u0027\", \\"},{"line_number":73,"context_line":"        \"alarmId\":\"\u0027 + alarmId + \u0027\",\"alarmDefinitionId\":\"e\",\"metrics\":[{\"id\":\"9\", \\"},{"line_number":74,"context_line":"        \"name\":\"test_metric\",\"dimensions\":\u0027 + dimensions + \u0027}],\"alarmName\":\"\u0027 + \\"},{"line_number":75,"context_line":"        alarmName + \u0027\",\"alarmDescription\":\"\",\"oldState\":\"UNDETERMINED\",\"newState\":\"\u0027 \\"}],"source_content_type":"text/x-python","patch_set":37,"id":"7ffa3b31_5a5d0f45","line":72,"range":{"start_line":72,"start_character":67,"end_line":72,"end_character":68},"updated":"2017-04-21 19:56:45.000000000","message":"Some of these seem like they are a part of the message, is that intentional?","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"73dbdf2e9087f7fb3bf7504fe153164ea547edfc","unresolved":false,"context_lines":[{"line_number":69,"context_line":"    else:"},{"line_number":70,"context_line":"        dimensions \u003d \u0027{\"usage\": 30}\u0027"},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"    value \u003d \u0027{\"alarm-transitioned\":{\"tenantId\":\"\u0027 + tenantId + \u0027\", \\"},{"line_number":73,"context_line":"        \"alarmId\":\"\u0027 + alarmId + \u0027\",\"alarmDefinitionId\":\"e\",\"metrics\":[{\"id\":\"9\", \\"},{"line_number":74,"context_line":"        \"name\":\"test_metric\",\"dimensions\":\u0027 + dimensions + \u0027}],\"alarmName\":\"\u0027 + \\"},{"line_number":75,"context_line":"        alarmName + \u0027\",\"alarmDescription\":\"\",\"oldState\":\"UNDETERMINED\",\"newState\":\"\u0027 \\"}],"source_content_type":"text/x-python","patch_set":37,"id":"5ff73747_7d8e5728","line":72,"range":{"start_line":72,"start_character":67,"end_line":72,"end_character":68},"in_reply_to":"7ffa3b31_5a5d0f45","updated":"2017-04-21 22:41:36.000000000","message":"Done","commit_id":"0b9373689ce7077e6716d642bdd9a0216191806c"}],"tests/test_rule_processor.py":[{"author":{"_account_id":16168,"name":"Tomasz Trębski","email":"kornicameister@gmail.com","username":"trebskit"},"change_message_id":"678826a5a4c6c9029d74a51e09d2ec9d6ec45cab","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from monasca_notification import notification_exceptions"},{"line_number":17,"context_line":"from monasca_notification.rule import Group"},{"line_number":18,"context_line":"from monasca_notification.rule import Inhibit"},{"line_number":19,"context_line":"from monasca_notification.rule import Silence"},{"line_number":20,"context_line":"from monasca_notification.processors.rule_processor import RuleProcessor"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_719afa64","line":18,"updated":"2017-03-09 05:33:17.000000000","message":"Same comment about imports as in previous test","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"bb1eb700b557f9cecf4cbf9f1efe27c18660f083","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from monasca_notification import notification_exceptions"},{"line_number":17,"context_line":"from monasca_notification.rule import Group"},{"line_number":18,"context_line":"from monasca_notification.rule import Inhibit"},{"line_number":19,"context_line":"from monasca_notification.rule import Silence"},{"line_number":20,"context_line":"from monasca_notification.processors.rule_processor import RuleProcessor"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"9a30ddce_4fee13b5","line":18,"in_reply_to":"9a30ddce_719afa64","updated":"2017-03-09 18:28:34.000000000","message":"Done","commit_id":"d83b364b2d8455e2b47a99b29eeba14afe809899"},{"author":{"_account_id":11809,"name":"Craig Bryant","email":"craig.bryant@hpe.com","username":"craig-bryant"},"change_message_id":"9e2db1d36920e45b5ed2e18a22a06eb43b6ecee2","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        action, rule, partition, offset \u003d rule_processor.to_rule(message)"},{"line_number":280,"context_line":"        self.assertTrue(\u0027Invalid Rule format skipping partition 0, \u0027"},{"line_number":281,"context_line":"            \u0027offset 3\\nError: Rule data missing field matchers\u0027 in self.trap)"},{"line_number":282,"context_line":"        self.assertEqual(action, None)"},{"line_number":283,"context_line":"        self.assertEqual(rule, None)"},{"line_number":284,"context_line":"        self.assertEqual(partition, 0)"},{"line_number":285,"context_line":"        self.assertEqual(offset, 3)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_f6d2b333","line":282,"range":{"start_line":282,"start_character":13,"end_line":282,"end_character":24},"updated":"2017-03-15 03:00:11.000000000","message":"There seems to be a assertIsNone. Might be clearer?","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"},{"author":{"_account_id":22157,"name":"Andrea Adams","email":"aadams@hpe.com","username":"andrea.adams"},"change_message_id":"3a6ef384cfa30e3388f8b03562eef07b1dea5b6e","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        action, rule, partition, offset \u003d rule_processor.to_rule(message)"},{"line_number":280,"context_line":"        self.assertTrue(\u0027Invalid Rule format skipping partition 0, \u0027"},{"line_number":281,"context_line":"            \u0027offset 3\\nError: Rule data missing field matchers\u0027 in self.trap)"},{"line_number":282,"context_line":"        self.assertEqual(action, None)"},{"line_number":283,"context_line":"        self.assertEqual(rule, None)"},{"line_number":284,"context_line":"        self.assertEqual(partition, 0)"},{"line_number":285,"context_line":"        self.assertEqual(offset, 3)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3a1ff146_d7ce7582","line":282,"range":{"start_line":282,"start_character":13,"end_line":282,"end_character":24},"in_reply_to":"3a1ff146_f6d2b333","updated":"2017-03-15 20:01:52.000000000","message":"Done","commit_id":"df38cb9f16495388feb9ad06b813298b39db7a3f"}]}
