)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"51530783ce115d6270baab956e121b425ec01b31","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Add support for DF built-in Pluggable pub/sub"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Add zmq as the first pub/sub mechanism."},{"line_number":10,"context_line":"Added configuration use_df_pub_sub default to True If set to"},{"line_number":11,"context_line":"false will use the DB naitive Pub/Sub mechanisem if supported. This is"},{"line_number":12,"context_line":"the first patch covering Pluggability the Zmq driver next patch will"},{"line_number":13,"context_line":"cover the reliability issues"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"dae33548_20097f2d","line":10,"updated":"2016-02-14 13:49:10.000000000","message":"its default to False right now","commit_id":"4824402f3293f52f1fa307eaefeacd1d69991cb3"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"51530783ce115d6270baab956e121b425ec01b31","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"partially implements blueprint: pubsub-module"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Co-Authored-By:Gal Sagie \u003cgal.sagie@huawei.com\u003e Change-Id:"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Change-Id: I6102f630a8766880d8e8b101f9c26b88e5c77a91"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":36,"id":"dae33548_ad06281e","line":17,"updated":"2016-02-14 13:49:10.000000000","message":"Remove this \"Change-Id:\"","commit_id":"4824402f3293f52f1fa307eaefeacd1d69991cb3"}],"devstack/df-ext-services.sh":[{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eebb682adeade29f68d613e33c6646753ae58904","unresolved":false,"context_lines":[{"line_number":1,"context_line":"#!/usr/bin/env bash"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"# Locate devstack directory"},{"line_number":4,"context_line":"TOP_DIR\u003d/opt/stack/devstack"},{"line_number":5,"context_line":""},{"line_number":6,"context_line":"# Detect path for this script file"},{"line_number":7,"context_line":"DF_DIR\u003d$(cd $(dirname \"$0\") \u0026\u0026 pwd)"}],"source_content_type":"text/x-sh","patch_set":24,"id":"7a5de9d1_1d11f9af","line":4,"range":{"start_line":4,"start_character":13,"end_line":4,"end_character":18},"updated":"2016-02-02 14:34:51.000000000","message":"Remove this \nWe should fix this so devstack will not change the repository files","commit_id":"9830c77f947b5f11e51435d03d47409cb18f28c4"}],"dragonflow/common/utils.py":[{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"94064bbd96e83ad74250e0963856d68ffc9d1cd4","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron._i18n import _, _LE"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"DF_PUBSUB_DRIVER_NAMESPACE \u003d \u0027neutron.df.pubsub_driver\u0027"},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_0e2c3301","line":20,"updated":"2016-01-28 12:18:28.000000000","message":"probably needs to be \"dragonflow.db.pubsub_driver\" , dont know why neutron is in that namespace :)","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"9802a689f817b63fdaa5b501258a718b55949e7d","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron._i18n import _, _LE"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"DF_PUBSUB_DRIVER_NAMESPACE \u003d \u0027neutron.df.pubsub_driver\u0027"},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_372f02f8","line":20,"in_reply_to":"7a5de9d1_0e2c3301","updated":"2016-01-28 13:15:37.000000000","message":"I agree will do","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"}],"dragonflow/db/api_nb.py":[{"author":{"_account_id":16983,"name":"Eshed Gal-Or","email":"eshed.galor@huawei.com","username":"eshedg"},"change_message_id":"3f33e913fa204d9ce7fed56e6ab92328342975f1","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            pub_sub_driver \u003d df_utils.load_driver("},{"line_number":91,"context_line":"                                    cfg.CONF.df.pub_sub_driver,"},{"line_number":92,"context_line":"                                    DF_PUBSUB_DRIVER_NAMESPACE)"},{"line_number":93,"context_line":"            self.publiser \u003d pub_sub_driver.get_publisher()"},{"line_number":94,"context_line":"            self.subscriber \u003d pub_sub_driver.get_subscriber()"},{"line_number":95,"context_line":"            if self.is_plugin:"},{"line_number":96,"context_line":"                #TODO(gampel) Move plugin publish_port and"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a68dd71_2c111b5e","line":93,"updated":"2016-01-26 17:24:02.000000000","message":"typo - publisher","commit_id":"5d393cc4168c9860be7fde0e273f0a20ca021f03"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e6365907dbb7631b1f05049c985ea9350663e099","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            pub_sub_driver \u003d df_utils.load_driver("},{"line_number":91,"context_line":"                                    cfg.CONF.df.pub_sub_driver,"},{"line_number":92,"context_line":"                                    DF_PUBSUB_DRIVER_NAMESPACE)"},{"line_number":93,"context_line":"            self.publiser \u003d pub_sub_driver.get_publisher()"},{"line_number":94,"context_line":"            self.subscriber \u003d pub_sub_driver.get_subscriber()"},{"line_number":95,"context_line":"            if self.is_plugin:"},{"line_number":96,"context_line":"                #TODO(gampel) Move plugin publish_port and"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a5de9d1_a398cd6b","line":93,"in_reply_to":"9a68dd71_2c111b5e","updated":"2016-01-27 12:59:46.000000000","message":"Done","commit_id":"5d393cc4168c9860be7fde0e273f0a20ca021f03"},{"author":{"_account_id":16983,"name":"Eshed Gal-Or","email":"eshed.galor@huawei.com","username":"eshedg"},"change_message_id":"3f33e913fa204d9ce7fed56e6ab92328342975f1","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                                    DF_PUBSUB_DRIVER_NAMESPACE)"},{"line_number":93,"context_line":"            self.publiser \u003d pub_sub_driver.get_publisher()"},{"line_number":94,"context_line":"            self.subscriber \u003d pub_sub_driver.get_subscriber()"},{"line_number":95,"context_line":"            if self.is_plugin:"},{"line_number":96,"context_line":"                #TODO(gampel) Move plugin publish_port and"},{"line_number":97,"context_line":"                #controller port to conf settings"},{"line_number":98,"context_line":"                self.publiser.initialize("}],"source_content_type":"text/x-python","patch_set":16,"id":"9a68dd71_d7b56831","line":95,"updated":"2016-01-26 17:24:02.000000000","message":"maybe add comment that this case is for the service \"control\" node, vs. the \"edge\" or \"compute\" node","commit_id":"5d393cc4168c9860be7fde0e273f0a20ca021f03"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"e6365907dbb7631b1f05049c985ea9350663e099","unresolved":false,"context_lines":[{"line_number":92,"context_line":"                                    DF_PUBSUB_DRIVER_NAMESPACE)"},{"line_number":93,"context_line":"            self.publiser \u003d pub_sub_driver.get_publisher()"},{"line_number":94,"context_line":"            self.subscriber \u003d pub_sub_driver.get_subscriber()"},{"line_number":95,"context_line":"            if self.is_plugin:"},{"line_number":96,"context_line":"                #TODO(gampel) Move plugin publish_port and"},{"line_number":97,"context_line":"                #controller port to conf settings"},{"line_number":98,"context_line":"                self.publiser.initialize("}],"source_content_type":"text/x-python","patch_set":16,"id":"7a5de9d1_c39dc95a","line":95,"in_reply_to":"9a68dd71_d7b56831","updated":"2016-01-27 12:59:46.000000000","message":"Done","commit_id":"5d393cc4168c9860be7fde0e273f0a20ca021f03"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"94064bbd96e83ad74250e0963856d68ffc9d1cd4","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"DF_PUBSUB_DRIVER_NAMESPACE \u003d \u0027neutron.df.pubsub_driver\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class DbUpdate(object):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_2e8c8f34","line":32,"updated":"2016-01-28 12:18:28.000000000","message":"this is defined in two places (also in utils or df_utils as used here)","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"9802a689f817b63fdaa5b501258a718b55949e7d","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"DF_PUBSUB_DRIVER_NAMESPACE \u003d \u0027neutron.df.pubsub_driver\u0027"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"class DbUpdate(object):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_57f39e9e","line":32,"in_reply_to":"7a5de9d1_2e8c8f34","updated":"2016-01-28 13:15:37.000000000","message":"will do","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"9802a689f817b63fdaa5b501258a718b55949e7d","unresolved":false,"context_lines":[{"line_number":100,"context_line":"                                db_ip,"},{"line_number":101,"context_line":"                                self.is_plugin,"},{"line_number":102,"context_line":"                                publish_port\u003d8866)"},{"line_number":103,"context_line":"                self.publisher.daemonize()"},{"line_number":104,"context_line":"            else:"},{"line_number":105,"context_line":"                #Publisher is part of the compute node controller"},{"line_number":106,"context_line":"                self.publisher.initialize("}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_37086291","line":103,"range":{"start_line":103,"start_character":16,"end_line":103,"end_character":20},"updated":"2016-01-28 13:15:37.000000000","message":"Should be called both for the plugin and controller move outside the if","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931e73d816a8b41c204c3ce60c0f57cfe4d548fb","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    def __str__(self):"},{"line_number":55,"context_line":"        return\"Action:%s, Table:%s, Key:%s\" % (self.action,"},{"line_number":56,"context_line":"                    self.table,"},{"line_number":57,"context_line":"                    self.key)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __lt__(self, other):"},{"line_number":60,"context_line":"        \"\"\"Implements priority among updates"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_2b3e4fda","line":57,"updated":"2016-01-31 08:11:01.000000000","message":"Why not include the other parameters? I think that at least the elements in to_array are important.","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"122d409c2b1a37a50d17f6955ee53f0d87657278","unresolved":false,"context_lines":[{"line_number":54,"context_line":"    def __str__(self):"},{"line_number":55,"context_line":"        return\"Action:%s, Table:%s, Key:%s\" % (self.action,"},{"line_number":56,"context_line":"                    self.table,"},{"line_number":57,"context_line":"                    self.key)"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"    def __lt__(self, other):"},{"line_number":60,"context_line":"        \"\"\"Implements priority among updates"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_41535c6b","line":57,"in_reply_to":"7a5de9d1_2b3e4fda","updated":"2016-02-01 16:00:49.000000000","message":"Done","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931e73d816a8b41c204c3ce60c0f57cfe4d548fb","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                self.publisher.initialize("},{"line_number":106,"context_line":"                                db_ip,"},{"line_number":107,"context_line":"                                is_neutron_server\u003dself.is_neutron_server,"},{"line_number":108,"context_line":"                                publish_port\u003d8867)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"                self.subscriber.initialize("},{"line_number":111,"context_line":"                                    db_ip,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_ab2a3f8e","line":108,"updated":"2016-01-31 08:11:01.000000000","message":"Consider moving publisher.initialize+daemonize to separate method, which is given ip and port. Then these calls won\u0027t be repeated.","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"122d409c2b1a37a50d17f6955ee53f0d87657278","unresolved":false,"context_lines":[{"line_number":105,"context_line":"                self.publisher.initialize("},{"line_number":106,"context_line":"                                db_ip,"},{"line_number":107,"context_line":"                                is_neutron_server\u003dself.is_neutron_server,"},{"line_number":108,"context_line":"                                publish_port\u003d8867)"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"                self.subscriber.initialize("},{"line_number":111,"context_line":"                                    db_ip,"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_49afec7c","line":108,"in_reply_to":"7a5de9d1_ab2a3f8e","updated":"2016-02-01 16:00:49.000000000","message":"Yes maybe next patch the value is small as we call daemonize once","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":11364,"name":"Fei Rao","email":"milo.frao@gmail.com","username":"milo.frao"},"change_message_id":"11621285125836dd5adcebaa8435dab4ffb2f103","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    def db_change_callback(self, table, key, action, value):"},{"line_number":150,"context_line":"        update \u003d DbUpdate(table, key, action, value)"},{"line_number":151,"context_line":"        LOG.info(_LI(\"Pushing Update to Queue: %s\"), update)"},{"line_number":152,"context_line":"        self._queue.put(update)"},{"line_number":153,"context_line":"        eventlet.sleep(0)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def _read_db_changes_from_queue(self):"},{"line_number":156,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a5de9d1_c10dc1e9","line":153,"range":{"start_line":152,"start_character":8,"end_line":153,"end_character":25},"updated":"2016-02-03 08:29:23.000000000","message":"queue put operation support assign block mode and timeout, maybe you can use block\u003dFalse and timeout parameter to instead of sleep.","commit_id":"a2ee0361ce092a5b1441563d43e22fb6c323b0aa"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"869d70c4fe68fcfca6f489ee304b21c159195c97","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    def db_change_callback(self, table, key, action, value):"},{"line_number":150,"context_line":"        update \u003d DbUpdate(table, key, action, value)"},{"line_number":151,"context_line":"        LOG.info(_LI(\"Pushing Update to Queue: %s\"), update)"},{"line_number":152,"context_line":"        self._queue.put(update)"},{"line_number":153,"context_line":"        eventlet.sleep(0)"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":"    def _read_db_changes_from_queue(self):"},{"line_number":156,"context_line":"        while True:"}],"source_content_type":"text/x-python","patch_set":23,"id":"5a5ae5dd_894fdd91","line":153,"range":{"start_line":152,"start_character":8,"end_line":153,"end_character":25},"in_reply_to":"7a5de9d1_c10dc1e9","updated":"2016-02-03 13:49:28.000000000","message":"Put block is unrelated it block if necessary until a free slot is available the sleep() is there to yiels and allow other thread to run.  \nEventlet use cooperative Thread module approach.\neventlet.sleep(0) reschedules the calling greenthread to the end of run queue. If there were any other greenthreads waiting to run, they will execute now.\nBut since we are doing cooperative multitasking, one context will execute indefinitely unless it explicitly yields to another.","commit_id":"a2ee0361ce092a5b1441563d43e22fb6c323b0aa"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3d73ba0d6408c1f02a3f52c622dbd2e7da86f6e7","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    Lower value is higher priority !"},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":"    def __init__(self, table, key, action, value, priority\u003d5,"},{"line_number":41,"context_line":"                 timestamp\u003dNone, topic\u003db\u0027D\u0027):"},{"line_number":42,"context_line":"        self.priority \u003d priority"},{"line_number":43,"context_line":"        self.timestamp \u003d timestamp"},{"line_number":44,"context_line":"        if not timestamp:"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_8a1b221b","line":41,"range":{"start_line":41,"start_character":39,"end_line":41,"end_character":43},"updated":"2016-02-04 07:17:18.000000000","message":"Could you please explain this default value?","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"db4799292a0c3dc2ce73357abc28e0cd7d99d9c4","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    Lower value is higher priority !"},{"line_number":39,"context_line":"    \"\"\""},{"line_number":40,"context_line":"    def __init__(self, table, key, action, value, priority\u003d5,"},{"line_number":41,"context_line":"                 timestamp\u003dNone, topic\u003db\u0027D\u0027):"},{"line_number":42,"context_line":"        self.priority \u003d priority"},{"line_number":43,"context_line":"        self.timestamp \u003d timestamp"},{"line_number":44,"context_line":"        if not timestamp:"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_a4c0897d","line":41,"range":{"start_line":41,"start_character":39,"end_line":41,"end_character":43},"in_reply_to":"5a5ae5dd_8a1b221b","updated":"2016-02-04 11:12:12.000000000","message":"This is mean sending to all \nI will change the name of the topic to send_all","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3d73ba0d6408c1f02a3f52c622dbd2e7da86f6e7","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.action \u003d action"},{"line_number":48,"context_line":"        self.table \u003d table"},{"line_number":49,"context_line":"        self.value \u003d value"},{"line_number":50,"context_line":"        self.topic \u003d topic"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def to_array(self):"},{"line_number":53,"context_line":"        return [self.table, self.key, self.action, self.value]"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_2ab8eee4","line":50,"range":{"start_line":50,"start_character":8,"end_line":50,"end_character":18},"updated":"2016-02-04 07:17:18.000000000","message":"Using DBUpdate just as a container for the topic (without using it) is somewhat confusing. If it not a part of the message, maybe consider passing it differently? (Perhaps as a tuple, the same way the messages are passed from the publisher to the subscriber?)","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"db4799292a0c3dc2ce73357abc28e0cd7d99d9c4","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        self.action \u003d action"},{"line_number":48,"context_line":"        self.table \u003d table"},{"line_number":49,"context_line":"        self.value \u003d value"},{"line_number":50,"context_line":"        self.topic \u003d topic"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def to_array(self):"},{"line_number":53,"context_line":"        return [self.table, self.key, self.action, self.value]"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_a4e3a904","line":50,"range":{"start_line":50,"start_character":8,"end_line":50,"end_character":18},"in_reply_to":"5a5ae5dd_2ab8eee4","updated":"2016-02-04 11:12:12.000000000","message":"There is two way currently to push topic ecent \nvia send_event (...., topic)\nOr via the Update object \n\nI agree that this might be confusing, I suggest to see the way our infrastructure use the topic and then update this in another patch \n\nI still prefer to send an UpdateObject over the queue and not tuple so we could support priority in the future","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                        multiprocessing_queue\u003dself.is_neutron_server,"},{"line_number":74,"context_line":"                        endpoint\u003dendpoint,"},{"line_number":75,"context_line":"                        trasport_proto\u003dtrasport_proto)"},{"line_number":76,"context_line":"        #self.publisher.daemonize()"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _start_subsciber(self):"},{"line_number":79,"context_line":"        self.subscriber.initialize(self.db_change_callback)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_19f22270","line":76,"updated":"2016-02-11 06:12:40.000000000","message":"Consider removing this comment.","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                        multiprocessing_queue\u003dself.is_neutron_server,"},{"line_number":74,"context_line":"                        endpoint\u003dendpoint,"},{"line_number":75,"context_line":"                        trasport_proto\u003dtrasport_proto)"},{"line_number":76,"context_line":"        #self.publisher.daemonize()"},{"line_number":77,"context_line":""},{"line_number":78,"context_line":"    def _start_subsciber(self):"},{"line_number":79,"context_line":"        self.subscriber.initialize(self.db_change_callback)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_30dfec6a","line":76,"in_reply_to":"3a57f1b5_19f22270","updated":"2016-02-11 07:59:24.000000000","message":"Done","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        self._send_db_change_event(\u0027lswitch\u0027, name, \u0027set\u0027, lswitch_json)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def delete_lswitch(self, name, topic):"},{"line_number":323,"context_line":"        self.driver.delete_key(\u0027lswitch\u0027, name)"},{"line_number":324,"context_line":"        self._send_db_change_event(\u0027lswitch\u0027, name, \u0027delete\u0027, name)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def create_lport(self, name, lswitch_name, topic, **columns):"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_f5164054","line":323,"updated":"2016-02-14 07:31:42.000000000","message":"Following https://review.openstack.org/#/c/276233/, should topics be passed to delete/create/update_key? Is it in scope for this change?","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eed56e3abd4de6c40b07065b114a24ba89e9ff82","unresolved":false,"context_lines":[{"line_number":320,"context_line":"        self._send_db_change_event(\u0027lswitch\u0027, name, \u0027set\u0027, lswitch_json)"},{"line_number":321,"context_line":""},{"line_number":322,"context_line":"    def delete_lswitch(self, name, topic):"},{"line_number":323,"context_line":"        self.driver.delete_key(\u0027lswitch\u0027, name)"},{"line_number":324,"context_line":"        self._send_db_change_event(\u0027lswitch\u0027, name, \u0027delete\u0027, name)"},{"line_number":325,"context_line":""},{"line_number":326,"context_line":"    def create_lport(self, name, lswitch_name, topic, **columns):"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_6a26c617","line":323,"in_reply_to":"dae33548_f5164054","updated":"2016-02-14 12:32:59.000000000","message":"yes we will add the topic in another patch","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        self.driver.create_key(\u0027lport\u0027, name, lport_json)"},{"line_number":335,"context_line":"        self._send_db_change_event(\u0027lport\u0027, name, \u0027create\u0027, lport_json)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def update_lport(self, name, **columns):"},{"line_number":338,"context_line":"        lport_json \u003d self.driver.get_key(\u0027lport\u0027, name)"},{"line_number":339,"context_line":"        lport \u003d jsonutils.loads(lport_json)"},{"line_number":340,"context_line":"        for col, val in columns.items():"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_9506d41e","line":337,"updated":"2016-02-14 07:31:42.000000000","message":"I don\u0027t think I understand to what db update methods topic should be passed, and to which not. e.g. update_lport, update_lswitch, add/delete_security_group_rule aren\u0027t modified to receive it as a parameter, but these still send relevant events to the compute nodes.","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eed56e3abd4de6c40b07065b114a24ba89e9ff82","unresolved":false,"context_lines":[{"line_number":334,"context_line":"        self.driver.create_key(\u0027lport\u0027, name, lport_json)"},{"line_number":335,"context_line":"        self._send_db_change_event(\u0027lport\u0027, name, \u0027create\u0027, lport_json)"},{"line_number":336,"context_line":""},{"line_number":337,"context_line":"    def update_lport(self, name, **columns):"},{"line_number":338,"context_line":"        lport_json \u003d self.driver.get_key(\u0027lport\u0027, name)"},{"line_number":339,"context_line":"        lport \u003d jsonutils.loads(lport_json)"},{"line_number":340,"context_line":"        for col, val in columns.items():"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_db036b75","line":337,"in_reply_to":"dae33548_9506d41e","updated":"2016-02-14 12:32:59.000000000","message":"I am not sure I understand ?","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"}],"dragonflow/db/db_common.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        update[\u0027action\u0027] \u003d self.action"},{"line_number":44,"context_line":"        update[\u0027value\u0027] \u003d self.value"},{"line_number":45,"context_line":"        update[\u0027topic\u0027] \u003d self.topic"},{"line_number":46,"context_line":"        return update"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __str__(self):"},{"line_number":49,"context_line":"        return\"Action:%s, Table:%s, Key:%s Value:%s\" % (self.action,"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_10a5b203","line":46,"updated":"2016-02-14 07:31:42.000000000","message":"I think it would be better to create update in this fashion:\nupdate \u003d {\n    \u0027table\u0027:\u0027self.table\u0027,\n    ...\n}\n\nMy tests show it\u0027s better performance-wise.","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eed56e3abd4de6c40b07065b114a24ba89e9ff82","unresolved":false,"context_lines":[{"line_number":43,"context_line":"        update[\u0027action\u0027] \u003d self.action"},{"line_number":44,"context_line":"        update[\u0027value\u0027] \u003d self.value"},{"line_number":45,"context_line":"        update[\u0027topic\u0027] \u003d self.topic"},{"line_number":46,"context_line":"        return update"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __str__(self):"},{"line_number":49,"context_line":"        return\"Action:%s, Table:%s, Key:%s Value:%s\" % (self.action,"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_4a230206","line":46,"in_reply_to":"dae33548_10a5b203","updated":"2016-02-14 12:32:59.000000000","message":"Done","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"}],"dragonflow/db/db_publisher.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"3457c504ce29506337e43d2194fc4826257ab7ee","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"eventlet.monkey_patch(all\u003dTrue)"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class PublisherAgent(object):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_5ff7ac8a","line":23,"range":{"start_line":23,"start_character":22,"end_line":23,"end_character":30},"updated":"2016-01-06 10:11:58.000000000","message":"is it necessary? is it by default?","commit_id":"5c7403116f59803098c77b7099f7d172a54150bb"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"3457c504ce29506337e43d2194fc4826257ab7ee","unresolved":false,"context_lines":[{"line_number":68,"context_line":"        try:"},{"line_number":69,"context_line":"            data \u003d msgpack.packb(message, encoding\u003d\u0027utf-8\u0027)"},{"line_number":70,"context_line":"        except Exception as e:"},{"line_number":71,"context_line":"            LOG.warn(e)"},{"line_number":72,"context_line":"        return data"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"    def _send_event_ex(self, entry):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_5f7b2c28","line":71,"range":{"start_line":71,"start_character":16,"end_line":71,"end_character":20},"updated":"2016-01-06 10:11:58.000000000","message":"warn -\u003e warning","commit_id":"5c7403116f59803098c77b7099f7d172a54150bb"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"ed1027ae6d8e1dc0874909046fdbc5fc6743ef31","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            try:"},{"line_number":64,"context_line":"                event \u003d self._queue.get()"},{"line_number":65,"context_line":"            except eventlet.queue.Empty:"},{"line_number":66,"context_line":"                eventlet.sleep(0.2)"},{"line_number":67,"context_line":"            else:"},{"line_number":68,"context_line":"                event_json \u003d jsonutils.dumps(event.to_array())"},{"line_number":69,"context_line":"                data \u003d self.pack_message(event_json)"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_13300f9e","line":66,"updated":"2016-01-26 10:25:08.000000000","message":"Both queue implementations block in this invocation. Is this try/except block necessary?\nAdditionally, the except block only handles one queue implementation.","commit_id":"1f587d296bd011ad1194b05c06ea8cbc681c91ff"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"846022430f0ca8a25240bb67d5ab8f6c05703509","unresolved":false,"context_lines":[{"line_number":63,"context_line":"            try:"},{"line_number":64,"context_line":"                event \u003d self._queue.get()"},{"line_number":65,"context_line":"            except eventlet.queue.Empty:"},{"line_number":66,"context_line":"                eventlet.sleep(0.2)"},{"line_number":67,"context_line":"            else:"},{"line_number":68,"context_line":"                event_json \u003d jsonutils.dumps(event.to_array())"},{"line_number":69,"context_line":"                data \u003d self.pack_message(event_json)"}],"source_content_type":"text/x-python","patch_set":15,"id":"7a5de9d1_b24be486","line":66,"in_reply_to":"9a68dd71_13300f9e","updated":"2016-01-28 20:15:40.000000000","message":"You are correct it is not necessary the exception handler \nWill be removed","commit_id":"1f587d296bd011ad1194b05c06ea8cbc681c91ff"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"ed1027ae6d8e1dc0874909046fdbc5fc6743ef31","unresolved":false,"context_lines":[{"line_number":88,"context_line":"def main():"},{"line_number":89,"context_line":"    pubsub \u003d PublisherAgent(\u0027127.0.0.1\u0027, None, None, is_plugin\u003dTrue)"},{"line_number":90,"context_line":"    pubsub.daemonize()"},{"line_number":91,"context_line":"    while True:"},{"line_number":92,"context_line":"        pubsub.send_event(\"t\", \"k\", \"a\", \"v\")"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"9a68dd71_93215fb7","line":91,"updated":"2016-01-26 10:25:08.000000000","message":"Is this while block necessary, given there is a unit-testing artifact?","commit_id":"1f587d296bd011ad1194b05c06ea8cbc681c91ff"}],"dragonflow/db/db_subscriber.py":[{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"3457c504ce29506337e43d2194fc4826257ab7ee","unresolved":false,"context_lines":[{"line_number":50,"context_line":"        try:"},{"line_number":51,"context_line":"            entry \u003d msgpack.unpackb(message, encoding\u003d\u0027utf-8\u0027)"},{"line_number":52,"context_line":"        except Exception as e:"},{"line_number":53,"context_line":"            LOG.warn(e)"},{"line_number":54,"context_line":"        return entry"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"    def run(self, name, port):"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_dfa71cbb","line":53,"range":{"start_line":53,"start_character":16,"end_line":53,"end_character":20},"updated":"2016-01-06 10:11:58.000000000","message":"LOG.warn is deprecated. Suggest to use LOG.warning instead.","commit_id":"5c7403116f59803098c77b7099f7d172a54150bb"},{"author":{"_account_id":7805,"name":"Li Ma","email":"skywalker.nick@gmail.com","username":"Nick"},"change_message_id":"3457c504ce29506337e43d2194fc4826257ab7ee","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                self.db_changes_callback(entries[0], entries[1], entries[2],"},{"line_number":72,"context_line":"                                         entries[3])"},{"line_number":73,"context_line":"            except Exception as e:"},{"line_number":74,"context_line":"                LOG.warn(e)"},{"line_number":75,"context_line":"                sub_socket.close()"},{"line_number":76,"context_line":"                del sub_socket"},{"line_number":77,"context_line":"                sub_socket \u003d self._connect(port)"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_bfa4a8b9","line":74,"range":{"start_line":74,"start_character":20,"end_line":74,"end_character":24},"updated":"2016-01-06 10:11:58.000000000","message":"ditto","commit_id":"5c7403116f59803098c77b7099f7d172a54150bb"}],"dragonflow/db/pub_sub_api.py":[{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"94064bbd96e83ad74250e0963856d68ffc9d1cd4","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self.port \u003d publish_port"},{"line_number":127,"context_line":"        self.pub_socket \u003d None"},{"line_number":128,"context_line":"        self.pool \u003d eventlet.GreenPool()"},{"line_number":129,"context_line":"        if is_plugin:"},{"line_number":130,"context_line":"            self._queue \u003d multiprocessing.Queue()"},{"line_number":131,"context_line":"        else:"},{"line_number":132,"context_line":"            self._queue \u003d eventlet.queue.PriorityQueue()"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_54a07c9f","line":129,"updated":"2016-01-28 12:18:28.000000000","message":"we can fix this later, but its a bit hard to understand the API versus this base implementation, since this base implementation expect that the user create a \"self.run\" method but you dont even mention it in the API.\n\nBut we can fix it in another patch, dont want to hold this patch.","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"9802a689f817b63fdaa5b501258a718b55949e7d","unresolved":false,"context_lines":[{"line_number":126,"context_line":"        self.port \u003d publish_port"},{"line_number":127,"context_line":"        self.pub_socket \u003d None"},{"line_number":128,"context_line":"        self.pool \u003d eventlet.GreenPool()"},{"line_number":129,"context_line":"        if is_plugin:"},{"line_number":130,"context_line":"            self._queue \u003d multiprocessing.Queue()"},{"line_number":131,"context_line":"        else:"},{"line_number":132,"context_line":"            self._queue \u003d eventlet.queue.PriorityQueue()"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_771c9ac1","line":129,"in_reply_to":"7a5de9d1_54a07c9f","updated":"2016-01-28 13:15:37.000000000","message":"Will do I would add run function to the interface","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"94064bbd96e83ad74250e0963856d68ffc9d1cd4","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        return data"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def send_event(self, update):"},{"line_number":157,"context_line":"        if self.is_daemonize:"},{"line_number":158,"context_line":"            #NOTE(gampel)In this reference implementation we develop a trigger"},{"line_number":159,"context_line":"            #based pub sub without sending the value mainly in order to avoid"},{"line_number":160,"context_line":"            #consistency issues in th cost of extra latency i.e get"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_d409cc2d","line":157,"updated":"2016-01-28 12:18:28.000000000","message":"is you do \"if self.is_daemonize\" it means that this wont actually send the events for the chassis adds/deletes as the publisher in the compute node is not daemonized.","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"9802a689f817b63fdaa5b501258a718b55949e7d","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        return data"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"    def send_event(self, update):"},{"line_number":157,"context_line":"        if self.is_daemonize:"},{"line_number":158,"context_line":"            #NOTE(gampel)In this reference implementation we develop a trigger"},{"line_number":159,"context_line":"            #based pub sub without sending the value mainly in order to avoid"},{"line_number":160,"context_line":"            #consistency issues in th cost of extra latency i.e get"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_3d1cc376","line":157,"in_reply_to":"7a5de9d1_d409cc2d","updated":"2016-01-28 13:15:37.000000000","message":"Yes it will be fix in next patch will call demonized","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"94064bbd96e83ad74250e0963856d68ffc9d1cd4","unresolved":false,"context_lines":[{"line_number":156,"context_line":"    def send_event(self, update):"},{"line_number":157,"context_line":"        if self.is_daemonize:"},{"line_number":158,"context_line":"            #NOTE(gampel)In this reference implementation we develop a trigger"},{"line_number":159,"context_line":"            #based pub sub without sending the value mainly in order to avoid"},{"line_number":160,"context_line":"            #consistency issues in th cost of extra latency i.e get"},{"line_number":161,"context_line":"            update.value \u003d None"},{"line_number":162,"context_line":"            self._queue.put(update)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_b43690e5","line":159,"updated":"2016-01-28 12:18:28.000000000","message":"on another note, not sure how you solved the overlapping collisions of ports for the controller which also has the neutron server (and plugin publisher) and also the local controller which is the subscriber but still publish chassis","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931e73d816a8b41c204c3ce60c0f57cfe4d548fb","unresolved":false,"context_lines":[{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"eventlet.monkey_patch()"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":26,"context_line":"class PubSubApi(object):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_8e499162","line":23,"updated":"2016-01-31 08:11:01.000000000","message":"There\u0027s a lot of similar code in both publisher and subscriber classes/interfaces that can be placed in a single DaemonApi interface and AbstractDaemon class.\n\nIt also fits the \u0027is-a\u0027 condition.","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"122d409c2b1a37a50d17f6955ee53f0d87657278","unresolved":false,"context_lines":[{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"eventlet.monkey_patch()"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"@six.add_metaclass(abc.ABCMeta)"},{"line_number":26,"context_line":"class PubSubApi(object):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_c129769c","line":23,"in_reply_to":"7a5de9d1_8e499162","updated":"2016-02-01 16:00:49.000000000","message":"Added DFDeamon lets consider moving it to a more common location later","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931e73d816a8b41c204c3ce60c0f57cfe4d548fb","unresolved":false,"context_lines":[{"line_number":128,"context_line":""},{"line_number":129,"context_line":"class PublisherAgentBase(PublisherApi):"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def __init__(self):"},{"line_number":132,"context_line":"        super(PublisherAgentBase, self).__init__()"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def initialize(self, ip, is_neutron_server, publish_port\u003d8866, **args):"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_ee4a8525","line":131,"updated":"2016-01-31 08:11:01.000000000","message":"The definition of this method is unnecessary. Python would call the parent\u0027s __init__ automatically.","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931e73d816a8b41c204c3ce60c0f57cfe4d548fb","unresolved":false,"context_lines":[{"line_number":176,"context_line":"class SubscriberAgentBase(SubscriberApi):"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def __init__(self):"},{"line_number":179,"context_line":"        super(SubscriberAgentBase, self).__init__()"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def initialize(self, ip, callback, plugin_port\u003d8866, cont_port\u003d8867):"},{"line_number":182,"context_line":"        self.db_changes_callback \u003d callback"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_8e53d1e1","line":179,"updated":"2016-01-31 08:11:01.000000000","message":"The definition of this method is unnecessary. Python would call the parent\u0027s __init__ automatically.","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @abc.abstractmethod"},{"line_number":98,"context_line":"    def register_listen_address(self, uri):"},{"line_number":99,"context_line":"        \"\"\"Will register publisher address to listen on"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        NOTE Must be called prior to calling daemonize"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_1462e7ad","line":98,"updated":"2016-02-11 06:12:40.000000000","message":"Not sure it has a use-case, but consider adding an unregister_listen_address method.","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":95,"context_line":"        \"\"\""},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @abc.abstractmethod"},{"line_number":98,"context_line":"    def register_listen_address(self, uri):"},{"line_number":99,"context_line":"        \"\"\"Will register publisher address to listen on"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"        NOTE Must be called prior to calling daemonize"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_1069908b","line":98,"in_reply_to":"3a57f1b5_1462e7ad","updated":"2016-02-11 07:59:24.000000000","message":"The use case is that you have one sub listening to multiple publishers \n\nDFC listening to multiple neutron server Host\n\nRegister is not supported now, I will consider how to add it to the api if possible in next patch","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        super(SubscriberAgentBase, self).__init__()"},{"line_number":164,"context_line":"        self.topic_list \u003d []"},{"line_number":165,"context_line":"        self.uri_list \u003d []"},{"line_number":166,"context_line":"        self.topic_list.append(db_common.SEND_ALL_TOPIC)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def initialize(self, callback, **args):"},{"line_number":169,"context_line":"        self.db_changes_callback \u003d callback"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_59541a20","line":166,"updated":"2016-02-11 06:12:40.000000000","message":"Consider unifying this line and the definition of topic_list to: self.topic_list \u003d [db_common.SEND_ALL_TOPIC].","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        super(SubscriberAgentBase, self).__init__()"},{"line_number":164,"context_line":"        self.topic_list \u003d []"},{"line_number":165,"context_line":"        self.uri_list \u003d []"},{"line_number":166,"context_line":"        self.topic_list.append(db_common.SEND_ALL_TOPIC)"},{"line_number":167,"context_line":""},{"line_number":168,"context_line":"    def initialize(self, callback, **args):"},{"line_number":169,"context_line":"        self.db_changes_callback \u003d callback"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_d08c5837","line":166,"in_reply_to":"3a57f1b5_59541a20","updated":"2016-02-11 07:59:24.000000000","message":"Not sure why lets discuss","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    def register_listen_address(self, uri):"},{"line_number":173,"context_line":"        self.uri_list.append(uri)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def unpack_message(self, message):"},{"line_number":176,"context_line":"        entry \u003d None"},{"line_number":177,"context_line":"        try:"},{"line_number":178,"context_line":"            entry \u003d msgpack.unpackb(message, encoding\u003d\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_946ed794","line":175,"updated":"2016-02-11 06:12:40.000000000","message":"Consider making this (and pack_message) as utility functions, and not class/instance methods. See also the comment on ZMQPublisherAgent.","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":172,"context_line":"    def register_listen_address(self, uri):"},{"line_number":173,"context_line":"        self.uri_list.append(uri)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def unpack_message(self, message):"},{"line_number":176,"context_line":"        entry \u003d None"},{"line_number":177,"context_line":"        try:"},{"line_number":178,"context_line":"            entry \u003d msgpack.unpackb(message, encoding\u003d\u0027utf-8\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_709a4465","line":175,"in_reply_to":"3a57f1b5_946ed794","updated":"2016-02-11 07:59:24.000000000","message":"Yes will do in another patch","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        while True:"},{"line_number":219,"context_line":"            eventlet.sleep(self.polling_time)"},{"line_number":220,"context_line":"            all_chassis \u003d self.driver.get_all_entries(\u0027chassis\u0027)"},{"line_number":221,"context_line":"            for chassis_unicode in all_chassis:"},{"line_number":222,"context_line":"                chassis \u003d jsonutils.loads(chassis_unicode)"},{"line_number":223,"context_line":"                chassis_name \u003d chassis[\u0027name\u0027]"},{"line_number":224,"context_line":"                if chassis_name not in self.chassis:"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_94f577cc","line":221,"updated":"2016-02-11 06:12:40.000000000","message":"Is the event that a chassis is removed also interesting?","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":218,"context_line":"        while True:"},{"line_number":219,"context_line":"            eventlet.sleep(self.polling_time)"},{"line_number":220,"context_line":"            all_chassis \u003d self.driver.get_all_entries(\u0027chassis\u0027)"},{"line_number":221,"context_line":"            for chassis_unicode in all_chassis:"},{"line_number":222,"context_line":"                chassis \u003d jsonutils.loads(chassis_unicode)"},{"line_number":223,"context_line":"                chassis_name \u003d chassis[\u0027name\u0027]"},{"line_number":224,"context_line":"                if chassis_name not in self.chassis:"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_9002606e","line":221,"in_reply_to":"3a57f1b5_94f577cc","updated":"2016-02-11 07:59:24.000000000","message":"I do not think we support that flow yet \nBut it will be a good idea to add timestampin that table \nLets discus and consider adding a new bug/feature","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        self.daemon \u003d None"},{"line_number":165,"context_line":"        self.config \u003d None"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def initialize(self, endpoint, trasport_proto, **args):"},{"line_number":168,"context_line":"        self.endpoint \u003d endpoint"},{"line_number":169,"context_line":"        self.trasport_proto \u003d trasport_proto"},{"line_number":170,"context_line":"        self.daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_107c9271","line":167,"updated":"2016-02-14 07:31:42.000000000","message":"What\u0027s the added value of having **args as a parameter? Why not just add config\u003dNone?","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eed56e3abd4de6c40b07065b114a24ba89e9ff82","unresolved":false,"context_lines":[{"line_number":164,"context_line":"        self.daemon \u003d None"},{"line_number":165,"context_line":"        self.config \u003d None"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"    def initialize(self, endpoint, trasport_proto, **args):"},{"line_number":168,"context_line":"        self.endpoint \u003d endpoint"},{"line_number":169,"context_line":"        self.trasport_proto \u003d trasport_proto"},{"line_number":170,"context_line":"        self.daemon \u003d df_utils.DFDaemon()"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_1b35d345","line":167,"in_reply_to":"dae33548_107c9271","updated":"2016-02-14 12:32:59.000000000","message":"I agree that the added value is very low\n\nBut this allow us to extend the initialize interface with out mandating changes in all the drivers","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        self.trasport_proto \u003d trasport_proto"},{"line_number":170,"context_line":"        self.daemon \u003d df_utils.DFDaemon()"},{"line_number":171,"context_line":"        if \u0027config\u0027 in args:"},{"line_number":172,"context_line":"            self.config \u003d args[\u0027config\u0027]"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def pack_message(self, message):"},{"line_number":175,"context_line":"        data \u003d None"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_50ce1a84","line":172,"updated":"2016-02-14 07:31:42.000000000","message":"Could you please explain the separation between endpoint and the configurable port? From the tests, they seem very tightly coupled.","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eed56e3abd4de6c40b07065b114a24ba89e9ff82","unresolved":false,"context_lines":[{"line_number":169,"context_line":"        self.trasport_proto \u003d trasport_proto"},{"line_number":170,"context_line":"        self.daemon \u003d df_utils.DFDaemon()"},{"line_number":171,"context_line":"        if \u0027config\u0027 in args:"},{"line_number":172,"context_line":"            self.config \u003d args[\u0027config\u0027]"},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"    def pack_message(self, message):"},{"line_number":175,"context_line":"        data \u003d None"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_56ca9250","line":172,"in_reply_to":"dae33548_50ce1a84","updated":"2016-02-14 12:32:59.000000000","message":"form the perspective of the Sub and Pub  pi they care only about the endpoint.\nendpoint are  different depending on the transport layer.\n\nThe publish port is DF neutron Plug-in configuration and should be completely  abstracted for the pub sub","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":198,"context_line":"        self.uri_list \u003d []"},{"line_number":199,"context_line":"        self.topic_list.append(db_common.SEND_ALL_TOPIC)"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"    def initialize(self, callback, **args):"},{"line_number":202,"context_line":"        self.db_changes_callback \u003d callback"},{"line_number":203,"context_line":"        self.daemon \u003d df_utils.DFDaemon()"},{"line_number":204,"context_line":"        if \u0027config\u0027 in args:"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_309396a5","line":201,"updated":"2016-02-14 07:31:42.000000000","message":"Same question about **args here.","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        self.topic_list.remove(topic)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def unregister_listen_address(self, topic):"},{"line_number":235,"context_line":"        self.topic_list.remove(topic)"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_d0e86a19","line":235,"updated":"2016-02-14 07:31:42.000000000","message":"I think this should be self.uri_list.remove(...), and the parameter should be \u0027uri\u0027.","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eed56e3abd4de6c40b07065b114a24ba89e9ff82","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        self.topic_list.remove(topic)"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"    def unregister_listen_address(self, topic):"},{"line_number":235,"context_line":"        self.topic_list.remove(topic)"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_76c1962e","line":235,"in_reply_to":"dae33548_d0e86a19","updated":"2016-02-14 12:32:59.000000000","message":"correct","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"51530783ce115d6270baab956e121b425ec01b31","unresolved":false,"context_lines":[{"line_number":140,"context_line":""},{"line_number":141,"context_line":"    @abc.abstractmethod"},{"line_number":142,"context_line":"    def register_topic(self, topic):"},{"line_number":143,"context_line":"        \"\"\"Add a topic to the subsciber listening list"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"        :param topic:  topic to listen to"},{"line_number":146,"context_line":"        :type topic:   string"}],"source_content_type":"text/x-python","patch_set":36,"id":"dae33548_c0789392","line":143,"updated":"2016-02-14 13:49:10.000000000","message":"subscriber","commit_id":"4824402f3293f52f1fa307eaefeacd1d69991cb3"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"51530783ce115d6270baab956e121b425ec01b31","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"    @abc.abstractmethod"},{"line_number":150,"context_line":"    def unregister_topic(self, topic):"},{"line_number":151,"context_line":"        \"\"\"Remove a topic to the subsciber listening list"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"        :param topic:  topic to remove"},{"line_number":154,"context_line":"        :type topic:   string"}],"source_content_type":"text/x-python","patch_set":36,"id":"dae33548_206e9fc9","line":151,"updated":"2016-02-14 13:49:10.000000000","message":"subscriber","commit_id":"4824402f3293f52f1fa307eaefeacd1d69991cb3"}],"dragonflow/db/pubsub_drivers/zmq_pubsub_driver.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931e73d816a8b41c204c3ce60c0f57cfe4d548fb","unresolved":false,"context_lines":[{"line_number":42,"context_line":"class ZMQPublisherAgent(pub_sub_api.PublisherAgentBase):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def __init__(self):"},{"line_number":45,"context_line":"        super(ZMQPublisherAgent, self).__init__()"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def run(self):"},{"line_number":48,"context_line":"        context \u003d zmq.Context()"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_ae5d6d16","line":45,"updated":"2016-01-31 08:11:01.000000000","message":"The definition of this method is unnecessary. Python would call the parent\u0027s __init__ automatically.","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931e73d816a8b41c204c3ce60c0f57cfe4d548fb","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            event \u003d None"},{"line_number":56,"context_line":"            event \u003d self._queue.get()"},{"line_number":57,"context_line":"            event_json \u003d jsonutils.dumps(event.to_array())"},{"line_number":58,"context_line":"            data \u003d self.pack_message(event_json)"},{"line_number":59,"context_line":"            socket.send_multipart([b\"D\", data])"},{"line_number":60,"context_line":"            LOG.debug(\"sending %s\" % event)"},{"line_number":61,"context_line":"            eventlet.sleep(0)"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_0ec841a7","line":58,"updated":"2016-01-31 08:11:01.000000000","message":"pack_message may return None, which shouldn\u0027t be sent.","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"931e73d816a8b41c204c3ce60c0f57cfe4d548fb","unresolved":false,"context_lines":[{"line_number":64,"context_line":"class ZMQSubscriberAgent(pub_sub_api.SubscriberAgentBase):"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"    def __init__(self):"},{"line_number":67,"context_line":"        super(ZMQSubscriberAgent, self).__init__()"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"    def _connect(self, port):"},{"line_number":70,"context_line":"        context \u003d zmq.Context()"}],"source_content_type":"text/x-python","patch_set":20,"id":"7a5de9d1_4e9dd9ba","line":67,"updated":"2016-01-31 08:11:01.000000000","message":"Same here about overriding methods.","commit_id":"3c2e10e3f8d383bb166b2dbb27845a046fcb101b"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3d73ba0d6408c1f02a3f52c622dbd2e7da86f6e7","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        while True:"},{"line_number":92,"context_line":"            try:"},{"line_number":93,"context_line":"                eventlet.sleep(0)"},{"line_number":94,"context_line":"                [topic, data] \u003d self.sub_socket.recv_multipart()"},{"line_number":95,"context_line":"                entry_json \u003d self.unpack_message(data)"},{"line_number":96,"context_line":"                entries \u003d jsonutils.loads(entry_json)"},{"line_number":97,"context_line":"                # entries \u003d [table, key, action, value]"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_6a4ee697","line":94,"range":{"start_line":94,"start_character":17,"end_line":94,"end_character":22},"updated":"2016-02-04 07:17:18.000000000","message":"I can\u0027t find where topic is used to filter the event. Is it supposed to be tested against self.topic_list?","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"db4799292a0c3dc2ce73357abc28e0cd7d99d9c4","unresolved":false,"context_lines":[{"line_number":91,"context_line":"        while True:"},{"line_number":92,"context_line":"            try:"},{"line_number":93,"context_line":"                eventlet.sleep(0)"},{"line_number":94,"context_line":"                [topic, data] \u003d self.sub_socket.recv_multipart()"},{"line_number":95,"context_line":"                entry_json \u003d self.unpack_message(data)"},{"line_number":96,"context_line":"                entries \u003d jsonutils.loads(entry_json)"},{"line_number":97,"context_line":"                # entries \u003d [table, key, action, value]"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_64e37134","line":94,"range":{"start_line":94,"start_character":17,"end_line":94,"end_character":22},"in_reply_to":"5a5ae5dd_6a4ee697","updated":"2016-02-04 11:12:12.000000000","message":"No currently we just added the base topic support it is going to be filtered in ZMq \n\nWe have the list for reconnect","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3d73ba0d6408c1f02a3f52c622dbd2e7da86f6e7","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                entry_json \u003d self.unpack_message(data)"},{"line_number":96,"context_line":"                entries \u003d jsonutils.loads(entry_json)"},{"line_number":97,"context_line":"                # entries \u003d [table, key, action, value]"},{"line_number":98,"context_line":"                self.db_changes_callback(entries[0], entries[1], entries[2],"},{"line_number":99,"context_line":"                                         entries[3])"},{"line_number":100,"context_line":"            except Exception as e:"},{"line_number":101,"context_line":"                LOG.warning(e)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_0a45f26e","line":98,"range":{"start_line":98,"start_character":21,"end_line":98,"end_character":40},"updated":"2016-02-04 07:17:18.000000000","message":"I can\u0027t find the definition for this method. Where is it defined? Is it abstract?","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"db4799292a0c3dc2ce73357abc28e0cd7d99d9c4","unresolved":false,"context_lines":[{"line_number":95,"context_line":"                entry_json \u003d self.unpack_message(data)"},{"line_number":96,"context_line":"                entries \u003d jsonutils.loads(entry_json)"},{"line_number":97,"context_line":"                # entries \u003d [table, key, action, value]"},{"line_number":98,"context_line":"                self.db_changes_callback(entries[0], entries[1], entries[2],"},{"line_number":99,"context_line":"                                         entries[3])"},{"line_number":100,"context_line":"            except Exception as e:"},{"line_number":101,"context_line":"                LOG.warning(e)"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_04d15d57","line":98,"range":{"start_line":98,"start_character":21,"end_line":98,"end_character":40},"in_reply_to":"5a5ae5dd_0a45f26e","updated":"2016-02-04 11:12:12.000000000","message":"Please see in the pub_sub_api interface","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        return self.subscriber"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ZMQPublisherAgent(pub_sub_api.PublisherAgentBase):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def initialize(self, multiprocessing_queue, endpoint, trasport_proto):"},{"line_number":45,"context_line":"        super(ZMQPublisherAgent, self).initialize("}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_14d42745","line":42,"updated":"2016-02-11 06:12:40.000000000","message":"I find the separation between the abstract class PublisherAgentBase and its implementation ZMQPublisherAgent confusing.\n\nThere are instance attributes that are not used in this implementation (self.pub_socket, self.daemon), and other instance attributes that are used only be the caller that passes them (self.transport_proto, self.endpoint), and it forces the creation of locks, even though they may be unnecessary (it depends on the message queue or pub/sub driver implementation).\n\nThe method pack_message looks like a utility function, and not one that should be part of a class/instance.\n\nsend_event actually looks like it should be in the base class, perhaps calling an abstract function to wrap the lock+send_multipart calls. The rest will probably stay the same across implementations.","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        return self.subscriber"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ZMQPublisherAgent(pub_sub_api.PublisherAgentBase):"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def initialize(self, multiprocessing_queue, endpoint, trasport_proto):"},{"line_number":45,"context_line":"        super(ZMQPublisherAgent, self).initialize("}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_30284ce2","line":42,"in_reply_to":"3a57f1b5_14d42745","updated":"2016-02-11 07:59:24.000000000","message":"This was an experimental mechanism that did not work well \n\nPlease look at the new patch it is using zmq PUSH PULL instead of the Lock/Multiprocess Queue","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            topic \u003d update.topic"},{"line_number":69,"context_line":"        event_json \u003d jsonutils.dumps(update.to_array())"},{"line_number":70,"context_line":"        data \u003d self.pack_message(event_json)"},{"line_number":71,"context_line":"        self.lock.acquire()"},{"line_number":72,"context_line":"        self.socket.send_multipart([topic, data])"},{"line_number":73,"context_line":"        LOG.debug(\"sending %s\" % update)"},{"line_number":74,"context_line":"        self.lock.release()"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_341e0364","line":71,"updated":"2016-02-11 06:12:40.000000000","message":"Consider using \u0027with lock:\u0027, which is safer in case of exceptions.","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            topic \u003d update.topic"},{"line_number":69,"context_line":"        event_json \u003d jsonutils.dumps(update.to_array())"},{"line_number":70,"context_line":"        data \u003d self.pack_message(event_json)"},{"line_number":71,"context_line":"        self.lock.acquire()"},{"line_number":72,"context_line":"        self.socket.send_multipart([topic, data])"},{"line_number":73,"context_line":"        LOG.debug(\"sending %s\" % update)"},{"line_number":74,"context_line":"        self.lock.release()"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_50238805","line":71,"in_reply_to":"3a57f1b5_341e0364","updated":"2016-02-11 07:59:24.000000000","message":"ditto","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":82,"context_line":"        self.sub_socket \u003d None"},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"    def register_listen_address(self, uri):"},{"line_number":85,"context_line":"        super(ZMQSubscriberAgent, self).register_listen_address(uri)"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"    def _connect(self):"},{"line_number":88,"context_line":"        context \u003d zmq.Context()"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_747d5b1b","line":85,"updated":"2016-02-11 06:12:40.000000000","message":"Consider calling self.sub_socket.connect if self.sub_socket exists (i.e. _connect was already called).","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if self.sub_socket:"},{"line_number":105,"context_line":"            self.sub_socket.setsockopt(zmq.UNSUBSCRIBE, topic)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def run(self):"},{"line_number":108,"context_line":"        self.sub_socket \u003d self._connect()"},{"line_number":109,"context_line":"        LOG.info(_LI(\"Starting  Subscriber on ports %(endpoints)s \")"},{"line_number":110,"context_line":"                % {\u0027endpoints\u0027: str(self.uri_list)})"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_5445bfb0","line":107,"updated":"2016-02-11 06:12:40.000000000","message":"Consider implementing stop() to call self.sub_socket.close().","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":104,"context_line":"        if self.sub_socket:"},{"line_number":105,"context_line":"            self.sub_socket.setsockopt(zmq.UNSUBSCRIBE, topic)"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    def run(self):"},{"line_number":108,"context_line":"        self.sub_socket \u003d self._connect()"},{"line_number":109,"context_line":"        LOG.info(_LI(\"Starting  Subscriber on ports %(endpoints)s \")"},{"line_number":110,"context_line":"                % {\u0027endpoints\u0027: str(self.uri_list)})"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_905ee074","line":107,"in_reply_to":"3a57f1b5_5445bfb0","updated":"2016-02-11 07:59:24.000000000","message":"Yes this is related to registering and registering new uri dynamically will be addressed in following commits","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                                         entries[3])"},{"line_number":120,"context_line":"            except Exception as e:"},{"line_number":121,"context_line":"                LOG.warning(e)"},{"line_number":122,"context_line":"                self.sub_socket.close()"},{"line_number":123,"context_line":"                self.sub_socket \u003d self._connect()"},{"line_number":124,"context_line":"                self.db_changes_callback(None, None, \u0027sync\u0027,"},{"line_number":125,"context_line":"                                         None)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_74d23b02","line":122,"updated":"2016-02-11 06:12:40.000000000","message":"Whilst it can\u0027t happen in greenthreads, real threads may have a race condition here, where users of register/unregister topic use the old socket, or add to registered_topcis after it had been scanned by _connect.\n\nThis can be ignored unless until someone actually wants real threads.","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":119,"context_line":"                                         entries[3])"},{"line_number":120,"context_line":"            except Exception as e:"},{"line_number":121,"context_line":"                LOG.warning(e)"},{"line_number":122,"context_line":"                self.sub_socket.close()"},{"line_number":123,"context_line":"                self.sub_socket \u003d self._connect()"},{"line_number":124,"context_line":"                self.db_changes_callback(None, None, \u0027sync\u0027,"},{"line_number":125,"context_line":"                                         None)"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_703c84e2","line":122,"in_reply_to":"3a57f1b5_74d23b02","updated":"2016-02-11 07:59:24.000000000","message":"Current assumption in zmq driver is that we use greenthreads\n\nWe already dependent of  greenthreads for DFC and Ryu so in this phase it make sense only to support only cooperative multitasking.","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.inproc_client \u003d None"},{"line_number":50,"context_line":"        if self.config:"},{"line_number":51,"context_line":"            #TODO(gampel)remove once we enable zmq inproc trasport"},{"line_number":52,"context_line":"            self.inproc_port \u003d self.config.publisher_port + 1"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            self.inproc_port \u003d \u00278867\u0027"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_30da7679","line":52,"updated":"2016-02-14 07:31:42.000000000","message":"Consider making this configurable as well.","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eed56e3abd4de6c40b07065b114a24ba89e9ff82","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        self.inproc_client \u003d None"},{"line_number":50,"context_line":"        if self.config:"},{"line_number":51,"context_line":"            #TODO(gampel)remove once we enable zmq inproc trasport"},{"line_number":52,"context_line":"            self.inproc_port \u003d self.config.publisher_port + 1"},{"line_number":53,"context_line":"        else:"},{"line_number":54,"context_line":"            self.inproc_port \u003d \u00278867\u0027"},{"line_number":55,"context_line":""}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_4aadc230","line":52,"in_reply_to":"dae33548_30da7679","updated":"2016-02-14 12:32:59.000000000","message":"this is only until we resolved inproc transport problem \n\nIf not we should get a free port","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            #TODO(gampel) Handle address in use exception"},{"line_number":85,"context_line":"            socket.bind(\"tcp://%s\" % self.endpoint)"},{"line_number":86,"context_line":"        elif self.trasport_proto \u003d\u003d \u0027epgm\u0027:"},{"line_number":87,"context_line":"            socket.connect(\"epgm://%s\" % self.endpoint)"},{"line_number":88,"context_line":"        eventlet.sleep(0.2)"},{"line_number":89,"context_line":"        while True:"},{"line_number":90,"context_line":"            event \u003d None"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_70bb5e0f","line":87,"updated":"2016-02-14 07:31:42.000000000","message":"Consider adding an error if the transport_proto is not supported.","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eed56e3abd4de6c40b07065b114a24ba89e9ff82","unresolved":false,"context_lines":[{"line_number":84,"context_line":"            #TODO(gampel) Handle address in use exception"},{"line_number":85,"context_line":"            socket.bind(\"tcp://%s\" % self.endpoint)"},{"line_number":86,"context_line":"        elif self.trasport_proto \u003d\u003d \u0027epgm\u0027:"},{"line_number":87,"context_line":"            socket.connect(\"epgm://%s\" % self.endpoint)"},{"line_number":88,"context_line":"        eventlet.sleep(0.2)"},{"line_number":89,"context_line":"        while True:"},{"line_number":90,"context_line":"            event \u003d None"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_4a6ae21b","line":87,"in_reply_to":"dae33548_70bb5e0f","updated":"2016-02-14 12:32:59.000000000","message":"Done","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92f630b97eca7c017991351d2cff353685eab13b","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        elif self.trasport_proto \u003d\u003d \u0027epgm\u0027:"},{"line_number":87,"context_line":"            socket.connect(\"epgm://%s\" % self.endpoint)"},{"line_number":88,"context_line":"        eventlet.sleep(0.2)"},{"line_number":89,"context_line":"        while True:"},{"line_number":90,"context_line":"            event \u003d None"},{"line_number":91,"context_line":"            event \u003d inproc_server.recv()"},{"line_number":92,"context_line":"            event_json \u003d jsonutils.loads(event)"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_f045ae17","line":89,"updated":"2016-02-14 07:31:42.000000000","message":"Consider wrapping in a try-except block, so an exception won\u0027t kill the publisher without telling anyone.","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"eed56e3abd4de6c40b07065b114a24ba89e9ff82","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        elif self.trasport_proto \u003d\u003d \u0027epgm\u0027:"},{"line_number":87,"context_line":"            socket.connect(\"epgm://%s\" % self.endpoint)"},{"line_number":88,"context_line":"        eventlet.sleep(0.2)"},{"line_number":89,"context_line":"        while True:"},{"line_number":90,"context_line":"            event \u003d None"},{"line_number":91,"context_line":"            event \u003d inproc_server.recv()"},{"line_number":92,"context_line":"            event_json \u003d jsonutils.loads(event)"}],"source_content_type":"text/x-python","patch_set":35,"id":"dae33548_0abbba73","line":89,"in_reply_to":"dae33548_f045ae17","updated":"2016-02-14 12:32:59.000000000","message":"Done","commit_id":"0318cf2fc727c30de2b1ceb2e83726c5d855f2d0"}],"dragonflow/tests/fullstack/test_pub_sub.py":[{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"94064bbd96e83ad74250e0963856d68ffc9d1cd4","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from dragonflow.tests.fullstack import test_objects as objects"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"DF_PUBSUB_DRIVER_NAMESPACE \u003d \u0027neutron.df.pubsub_driver\u0027"},{"line_number":25,"context_line":"events_num \u003d 0"},{"line_number":26,"context_line":""},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7a5de9d1_946ef42d","line":24,"updated":"2016-01-28 12:18:28.000000000","message":"As the previous comments, this should be defined only once and imported here","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"babf368d8d6b2595c55b3e5882fa707bbe9b08a4","unresolved":false,"context_lines":[{"line_number":154,"context_line":"        global events_num"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"        def _db_change_callback(table, key, action, value):"},{"line_number":157,"context_line":"            global events_num"},{"line_number":158,"context_line":"            events_num +\u003d 1"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"        db_ip \u003d \u0027127.0.0.1\u0027"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a5de9d1_811ef709","line":157,"range":{"start_line":157,"start_character":19,"end_line":157,"end_character":29},"updated":"2016-02-02 08:26:28.000000000","message":"Change this test not to use the global var \n\nwill check explicitly on the key, action values","commit_id":"a2ee0361ce092a5b1441563d43e22fb6c323b0aa"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3d73ba0d6408c1f02a3f52c622dbd2e7da86f6e7","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def test_pub_sub_add_topic(self):"},{"line_number":193,"context_line":"        self.events_num_t \u003d 0"},{"line_number":194,"context_line":"        self.events_action_t \u003d 0"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        def _db_change_callback_topic(table, key, action, value):"},{"line_number":197,"context_line":"            self.events_num_t +\u003d 1"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_4fd77c23","line":194,"range":{"start_line":194,"start_character":31,"end_line":194,"end_character":32},"updated":"2016-02-04 07:17:18.000000000","message":"Consider changing to None","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"db4799292a0c3dc2ce73357abc28e0cd7d99d9c4","unresolved":false,"context_lines":[{"line_number":191,"context_line":""},{"line_number":192,"context_line":"    def test_pub_sub_add_topic(self):"},{"line_number":193,"context_line":"        self.events_num_t \u003d 0"},{"line_number":194,"context_line":"        self.events_action_t \u003d 0"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        def _db_change_callback_topic(table, key, action, value):"},{"line_number":197,"context_line":"            self.events_num_t +\u003d 1"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_04839d57","line":194,"range":{"start_line":194,"start_character":31,"end_line":194,"end_character":32},"in_reply_to":"5a5ae5dd_4fd77c23","updated":"2016-02-04 11:12:12.000000000","message":"Will do","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3d73ba0d6408c1f02a3f52c622dbd2e7da86f6e7","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        eventlet.sleep(1)"},{"line_number":225,"context_line":"        self.assertEqual(self.events_action_t, action)"},{"line_number":226,"context_line":"        self.assertEqual(local_events_num + 1, self.events_num_t)"},{"line_number":227,"context_line":"        no_topic_action \u003d \"no topic\""},{"line_number":228,"context_line":"        other_topic \u003d \"Other-topic\""},{"line_number":229,"context_line":"        update \u003d api_nb.DbUpdate(\"test\", \"key\", no_topic_action, \"value\")"},{"line_number":230,"context_line":"        publiser.send_event(update, other_topic)"},{"line_number":231,"context_line":"        eventlet.sleep(1)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        self.assertNotEqual(self.events_action_t, no_topic_action)"},{"line_number":234,"context_line":"        self.assertNotEqual(local_events_num + 2, self.events_num_t)"},{"line_number":235,"context_line":"        publiser.stop()"},{"line_number":236,"context_line":"        subscriber.stop()"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_afcf107e","line":234,"range":{"start_line":227,"start_character":0,"end_line":234,"end_character":68},"updated":"2016-02-04 07:17:18.000000000","message":"Consider, in this test, setting events_action_t to None, and then asserting that it stays None.","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"db4799292a0c3dc2ce73357abc28e0cd7d99d9c4","unresolved":false,"context_lines":[{"line_number":224,"context_line":"        eventlet.sleep(1)"},{"line_number":225,"context_line":"        self.assertEqual(self.events_action_t, action)"},{"line_number":226,"context_line":"        self.assertEqual(local_events_num + 1, self.events_num_t)"},{"line_number":227,"context_line":"        no_topic_action \u003d \"no topic\""},{"line_number":228,"context_line":"        other_topic \u003d \"Other-topic\""},{"line_number":229,"context_line":"        update \u003d api_nb.DbUpdate(\"test\", \"key\", no_topic_action, \"value\")"},{"line_number":230,"context_line":"        publiser.send_event(update, other_topic)"},{"line_number":231,"context_line":"        eventlet.sleep(1)"},{"line_number":232,"context_line":""},{"line_number":233,"context_line":"        self.assertNotEqual(self.events_action_t, no_topic_action)"},{"line_number":234,"context_line":"        self.assertNotEqual(local_events_num + 2, self.events_num_t)"},{"line_number":235,"context_line":"        publiser.stop()"},{"line_number":236,"context_line":"        subscriber.stop()"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a5ae5dd_e47f6164","line":234,"range":{"start_line":227,"start_character":0,"end_line":234,"end_character":68},"in_reply_to":"5a5ae5dd_afcf107e","updated":"2016-02-04 11:12:12.000000000","message":"Will do","commit_id":"370ba301737845527cc93185fbca15b156ff7b11"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def setUp(self):"},{"line_number":30,"context_line":"        super(TestPubSub, self).setUp()"},{"line_number":31,"context_line":"        self.events_num \u003d 0"},{"line_number":32,"context_line":"        self.do_test \u003d cfg.CONF.df.use_df_pub_sub"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_pub_sub_add_port(self):"},{"line_number":35,"context_line":"        global events_num"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_342123fc","line":32,"updated":"2016-02-11 06:12:40.000000000","message":"Consider always running the pub/sub tests. Even if it is currently unused, we want to make sure the feature is sane.","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    def setUp(self):"},{"line_number":30,"context_line":"        super(TestPubSub, self).setUp()"},{"line_number":31,"context_line":"        self.events_num \u003d 0"},{"line_number":32,"context_line":"        self.do_test \u003d cfg.CONF.df.use_df_pub_sub"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def test_pub_sub_add_port(self):"},{"line_number":35,"context_line":"        global events_num"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_f31e3e62","line":32,"in_reply_to":"3a57f1b5_342123fc","updated":"2016-02-11 07:59:24.000000000","message":"we will have to change the conf of fullstack to mandate it \nSome of the testing relies on the installed neutron server to  be configured to use pubsub","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5714cfb9d2cf78f075e86b9b45b2d74e5ba98978","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.assertEqual(self.events_action, action)"},{"line_number":163,"context_line":"        subscriber.stop()"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def test_pub_sub_add_topic(self):"},{"line_number":166,"context_line":"        self.events_num_t \u003d 0"},{"line_number":167,"context_line":"        self.events_action_t \u003d None"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_d45d2f7a","line":165,"updated":"2016-02-11 06:12:40.000000000","message":"Consider also adding a test to unregister_topic.","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"},{"author":{"_account_id":13070,"name":"Eran Gampel","email":"eran@gampel.net","username":"Gampel"},"change_message_id":"185e626c00ce37f1459606ab89e8125df3e9c65f","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.assertEqual(self.events_action, action)"},{"line_number":163,"context_line":"        subscriber.stop()"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"    def test_pub_sub_add_topic(self):"},{"line_number":166,"context_line":"        self.events_num_t \u003d 0"},{"line_number":167,"context_line":"        self.events_action_t \u003d None"},{"line_number":168,"context_line":""}],"source_content_type":"text/x-python","patch_set":31,"id":"3a57f1b5_b32766b5","line":165,"in_reply_to":"3a57f1b5_d45d2f7a","updated":"2016-02-11 07:59:24.000000000","message":"will do","commit_id":"f125fdf8a7055511c472dd7700dc1b103d06a201"}],"setup.cfg":[{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"94064bbd96e83ad74250e0963856d68ffc9d1cd4","unresolved":false,"context_lines":[{"line_number":47,"context_line":"neutron.ml2.mechanism_drivers \u003d"},{"line_number":48,"context_line":"    df \u003d dragonflow.neutron.ml2.mech_driver:DFMechDriver"},{"line_number":49,"context_line":"console_scripts \u003d"},{"line_number":50,"context_line":"    neutron-l3-controller-agent \u003d dragonflow.neutron.agent.l3_sdn_agent:main"},{"line_number":51,"context_line":"    neutron-l2-controller-agent \u003d dragonflow.neutron.agent.l2.ovs_dragonflow_neutron_agent:main"},{"line_number":52,"context_line":"    df-db \u003d dragonflow.db.df_db:main"},{"line_number":53,"context_line":"neutron.df.pubsub_driver \u003d"}],"source_content_type":"text/x-ttcn-cfg","patch_set":17,"id":"7a5de9d1_744578b1","line":50,"updated":"2016-01-28 12:18:28.000000000","message":"probably need to rebase, these were removed","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"},{"author":{"_account_id":11343,"name":"Gal Sagie","email":"gal.sagie@gmail.com","username":"GalSagie"},"change_message_id":"94064bbd96e83ad74250e0963856d68ffc9d1cd4","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    neutron-l3-controller-agent \u003d dragonflow.neutron.agent.l3_sdn_agent:main"},{"line_number":51,"context_line":"    neutron-l2-controller-agent \u003d dragonflow.neutron.agent.l2.ovs_dragonflow_neutron_agent:main"},{"line_number":52,"context_line":"    df-db \u003d dragonflow.db.df_db:main"},{"line_number":53,"context_line":"neutron.df.pubsub_driver \u003d"},{"line_number":54,"context_line":"    zmq_pubsub_driver \u003d dragonflow.db.pubsub_drivers.zmq_pubsub_driver:ZMQPubSub"}],"source_content_type":"text/x-ttcn-cfg","patch_set":17,"id":"7a5de9d1_74eed8b5","line":53,"updated":"2016-01-28 12:18:28.000000000","message":"if you change the namespace, need to change this here","commit_id":"0de3f58f205e94143b876dc69799c8fe7b751539"}]}
