)]}'
{"dragonflow/controller/df_publisher_service.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"0172673374e14a64d133f870b46d9dfc78a2133f","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    def _update_timestamp_in_db(self):"},{"line_number":99,"context_line":"        if self._rate_limit():"},{"line_number":100,"context_line":"            return"},{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            publisher_json \u003d self.db.get_key("},{"line_number":103,"context_line":"                core.Publisher.table_name,"},{"line_number":104,"context_line":"                self.uuid,"},{"line_number":105,"context_line":"            )"},{"line_number":106,"context_line":"            publisher \u003d jsonutils.loads(publisher_json)"},{"line_number":107,"context_line":"            publisher[\u0027last_activity_timestamp\u0027] \u003d time.time()"},{"line_number":108,"context_line":"            publisher_json \u003d jsonutils.dumps(publisher)"},{"line_number":109,"context_line":"            self.db.set_key("},{"line_number":110,"context_line":"                core.Publisher.table_name,"},{"line_number":111,"context_line":"                self.uuid,"},{"line_number":112,"context_line":"                publisher_json"},{"line_number":113,"context_line":"            )"},{"line_number":114,"context_line":"        except exceptions.DBKeyNotFound:"},{"line_number":115,"context_line":"            self._register_as_publisher()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _register_as_publisher(self):"},{"line_number":118,"context_line":"        publisher \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_f0ef21e7","line":115,"range":{"start_line":101,"start_character":0,"end_line":115,"end_character":41},"updated":"2017-04-24 01:39:52.000000000","message":"it looks like a self.nb_api.update(publisher) to me.","commit_id":"68c1772e02148d6d4e081dda63049f1791e00854"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6d8a965dfe96f8cc7d7eafe196e2494da116d032","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    def _update_timestamp_in_db(self):"},{"line_number":99,"context_line":"        if self._rate_limit():"},{"line_number":100,"context_line":"            return"},{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            publisher_json \u003d self.db.get_key("},{"line_number":103,"context_line":"                core.Publisher.table_name,"},{"line_number":104,"context_line":"                self.uuid,"},{"line_number":105,"context_line":"            )"},{"line_number":106,"context_line":"            publisher \u003d jsonutils.loads(publisher_json)"},{"line_number":107,"context_line":"            publisher[\u0027last_activity_timestamp\u0027] \u003d time.time()"},{"line_number":108,"context_line":"            publisher_json \u003d jsonutils.dumps(publisher)"},{"line_number":109,"context_line":"            self.db.set_key("},{"line_number":110,"context_line":"                core.Publisher.table_name,"},{"line_number":111,"context_line":"                self.uuid,"},{"line_number":112,"context_line":"                publisher_json"},{"line_number":113,"context_line":"            )"},{"line_number":114,"context_line":"        except exceptions.DBKeyNotFound:"},{"line_number":115,"context_line":"            self._register_as_publisher()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _register_as_publisher(self):"},{"line_number":118,"context_line":"        publisher \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_947d6c70","line":115,"range":{"start_line":101,"start_character":0,"end_line":115,"end_character":41},"in_reply_to":"5ff73747_ce5fe1e3","updated":"2017-04-24 07:53:20.000000000","message":"I can\u0027t find an elegant way to use NbApi here, but I\u0027ve changed the code to be more \"new style\"-ish","commit_id":"68c1772e02148d6d4e081dda63049f1791e00854"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f897815cd1bedeb6acaaeabf8df477aa445523a6","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    def _update_timestamp_in_db(self):"},{"line_number":99,"context_line":"        if self._rate_limit():"},{"line_number":100,"context_line":"            return"},{"line_number":101,"context_line":"        try:"},{"line_number":102,"context_line":"            publisher_json \u003d self.db.get_key("},{"line_number":103,"context_line":"                core.Publisher.table_name,"},{"line_number":104,"context_line":"                self.uuid,"},{"line_number":105,"context_line":"            )"},{"line_number":106,"context_line":"            publisher \u003d jsonutils.loads(publisher_json)"},{"line_number":107,"context_line":"            publisher[\u0027last_activity_timestamp\u0027] \u003d time.time()"},{"line_number":108,"context_line":"            publisher_json \u003d jsonutils.dumps(publisher)"},{"line_number":109,"context_line":"            self.db.set_key("},{"line_number":110,"context_line":"                core.Publisher.table_name,"},{"line_number":111,"context_line":"                self.uuid,"},{"line_number":112,"context_line":"                publisher_json"},{"line_number":113,"context_line":"            )"},{"line_number":114,"context_line":"        except exceptions.DBKeyNotFound:"},{"line_number":115,"context_line":"            self._register_as_publisher()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _register_as_publisher(self):"},{"line_number":118,"context_line":"        publisher \u003d {"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_ce5fe1e3","line":115,"range":{"start_line":101,"start_character":0,"end_line":115,"end_character":41},"in_reply_to":"5ff73747_f0ef21e7","updated":"2017-04-24 06:14:50.000000000","message":"Will fix, thanks.","commit_id":"68c1772e02148d6d4e081dda63049f1791e00854"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"0172673374e14a64d133f870b46d9dfc78a2133f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"        except exceptions.DBKeyNotFound:"},{"line_number":115,"context_line":"            self._register_as_publisher()"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"    def _register_as_publisher(self):"},{"line_number":118,"context_line":"        publisher \u003d {"},{"line_number":119,"context_line":"            \u0027id\u0027: self.uuid,"},{"line_number":120,"context_line":"            \u0027uri\u0027: self._get_uri(),"},{"line_number":121,"context_line":"            \u0027last_activity_timestamp\u0027: time.time(),"},{"line_number":122,"context_line":"        }"},{"line_number":123,"context_line":"        publisher_json \u003d jsonutils.dumps(publisher)"},{"line_number":124,"context_line":"        self.db.create_key("},{"line_number":125,"context_line":"            core.Publisher.table_name,"},{"line_number":126,"context_line":"            self.uuid, publisher_json"},{"line_number":127,"context_line":"        )"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    def _get_uri(self):"},{"line_number":130,"context_line":"        ip \u003d cfg.CONF.df.publisher_bind_address"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_90d7bd24","line":127,"range":{"start_line":117,"start_character":0,"end_line":127,"end_character":9},"updated":"2017-04-24 01:39:52.000000000","message":"it looks like a self.nb_api.create(publisher)  to me.","commit_id":"68c1772e02148d6d4e081dda63049f1791e00854"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"22fa85bd748ac6fbcec3f4cfbf7b6fa91ce41e02","unresolved":false,"context_lines":[{"line_number":98,"context_line":"        if self._rate_limit():"},{"line_number":99,"context_line":"            return"},{"line_number":100,"context_line":"        try:"},{"line_number":101,"context_line":"            publisher \u003d core.Publisher.from_json("},{"line_number":102,"context_line":"                self.db.get_key("},{"line_number":103,"context_line":"                    core.Publisher.table_name,"},{"line_number":104,"context_line":"                    self.uuid,"},{"line_number":105,"context_line":"                ),"},{"line_number":106,"context_line":"            )"},{"line_number":107,"context_line":"            publisher.last_activity_timestamp \u003d time.time()"},{"line_number":108,"context_line":"            self.db.set_key("},{"line_number":109,"context_line":"                publisher.table_name,"},{"line_number":110,"context_line":"                publisher.id,"},{"line_number":111,"context_line":"                publisher.to_json(),"},{"line_number":112,"context_line":"            )"},{"line_number":113,"context_line":"        except exceptions.DBKeyNotFound:"},{"line_number":114,"context_line":"            self._register_as_publisher()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_76bbbbc3","line":111,"range":{"start_line":101,"start_character":0,"end_line":111,"end_character":36},"updated":"2017-04-26 03:02:48.000000000","message":"why not initialize nb_api here like the bgp patch did [1]. I think in the publisher service, the usage of nb_api is same as bgp service.\n\n[1] https://review.openstack.org/#/c/451408/9/dragonflow/controller/df_bgp_service.py@35","commit_id":"19f670e347c163f72ab4fcc8f80c481b22812548"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3fa64fe1c120ca76ccd20597dffc031511f6bd85","unresolved":false,"context_lines":[{"line_number":87,"context_line":"        if self._rate_limit():"},{"line_number":88,"context_line":"            return"},{"line_number":89,"context_line":"        try:"},{"line_number":90,"context_line":"            self.nb_api.update("},{"line_number":91,"context_line":"                core.Publisher("},{"line_number":92,"context_line":"                    id\u003dself.uuid,"},{"line_number":93,"context_line":"                    uri\u003dself._get_uri(),"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_53a8ecd9","line":90,"range":{"start_line":90,"start_character":0,"end_line":90,"end_character":31},"updated":"2017-05-16 12:42:11.000000000","message":"+1","commit_id":"65b785890159e4307d12731c32df089d263e04b5"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3fa64fe1c120ca76ccd20597dffc031511f6bd85","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        self.nb_api.create("},{"line_number":103,"context_line":"            core.Publisher("},{"line_number":104,"context_line":"                id\u003dself.uuid,"},{"line_number":105,"context_line":"                uri\u003dself._get_uri(),"},{"line_number":106,"context_line":"                last_activity_timestamp\u003dtime.time(),"},{"line_number":107,"context_line":"            ),"},{"line_number":108,"context_line":"            skip_send_event\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_f3b8182b","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":36},"updated":"2017-05-16 12:42:11.000000000","message":"Is this needed?","commit_id":"65b785890159e4307d12731c32df089d263e04b5"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"2e5855a3e20cfb8071b7a5170ce40d2e5fe175c4","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        self.nb_api.create("},{"line_number":103,"context_line":"            core.Publisher("},{"line_number":104,"context_line":"                id\u003dself.uuid,"},{"line_number":105,"context_line":"                uri\u003dself._get_uri(),"},{"line_number":106,"context_line":"                last_activity_timestamp\u003dtime.time(),"},{"line_number":107,"context_line":"            ),"},{"line_number":108,"context_line":"            skip_send_event\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_f3bff8f8","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":36},"in_reply_to":"1f013ff3_f3b8182b","updated":"2017-05-16 12:45:28.000000000","message":"Why not? We\u0027re creating a new published, better add it with a URI, though on L93 we might be able to drop it","commit_id":"65b785890159e4307d12731c32df089d263e04b5"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2ec2becc008643476699e1895f5642ba773c1045","unresolved":false,"context_lines":[{"line_number":102,"context_line":"        self.nb_api.create("},{"line_number":103,"context_line":"            core.Publisher("},{"line_number":104,"context_line":"                id\u003dself.uuid,"},{"line_number":105,"context_line":"                uri\u003dself._get_uri(),"},{"line_number":106,"context_line":"                last_activity_timestamp\u003dtime.time(),"},{"line_number":107,"context_line":"            ),"},{"line_number":108,"context_line":"            skip_send_event\u003dTrue,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_936314b2","line":105,"range":{"start_line":105,"start_character":0,"end_line":105,"end_character":36},"in_reply_to":"1f013ff3_f3bff8f8","updated":"2017-05-16 12:46:58.000000000","message":"Yes, meant to put this on line 93.","commit_id":"65b785890159e4307d12731c32df089d263e04b5"}],"dragonflow/db/api_nb.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"22fa85bd748ac6fbcec3f4cfbf7b6fa91ce41e02","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                ip,"},{"line_number":147,"context_line":"                cfg.CONF.df.publisher_port) for ip in publishers_ips}"},{"line_number":148,"context_line":"        publishers \u003d self.get_all(core.Publisher)"},{"line_number":149,"context_line":"        uris |\u003d {publisher.get_uri() for publisher in publishers}"},{"line_number":150,"context_line":"        for uri in uris:"},{"line_number":151,"context_line":"            self.subscriber.register_listen_address(uri)"},{"line_number":152,"context_line":"        self.subscriber.daemonize()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_b1170d46","line":149,"range":{"start_line":149,"start_character":17,"end_line":149,"end_character":36},"updated":"2017-04-26 03:02:48.000000000","message":"Should it be publisher.uri?","commit_id":"19f670e347c163f72ab4fcc8f80c481b22812548"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"ebdf2e2e0de713540616053fb2bfcbe90d65abb3","unresolved":false,"context_lines":[{"line_number":146,"context_line":"                ip,"},{"line_number":147,"context_line":"                cfg.CONF.df.publisher_port) for ip in publishers_ips}"},{"line_number":148,"context_line":"        publishers \u003d self.get_all(core.Publisher)"},{"line_number":149,"context_line":"        uris |\u003d {publisher.get_uri() for publisher in publishers}"},{"line_number":150,"context_line":"        for uri in uris:"},{"line_number":151,"context_line":"            self.subscriber.register_listen_address(uri)"},{"line_number":152,"context_line":"        self.subscriber.daemonize()"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_a2c69847","line":149,"range":{"start_line":149,"start_character":17,"end_line":149,"end_character":36},"in_reply_to":"5ff73747_b1170d46","updated":"2017-05-15 13:03:44.000000000","message":"Yes, fixing.","commit_id":"19f670e347c163f72ab4fcc8f80c481b22812548"}],"dragonflow/db/models/core.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"0172673374e14a64d133f870b46d9dfc78a2133f","unresolved":false,"context_lines":[{"line_number":12,"context_line":"import time"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from jsonmodels import fields"},{"line_number":15,"context_line":"from oslo_config import cfg"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from dragonflow import conf"},{"line_number":18,"context_line":"import dragonflow.db.field_types as df_fields"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_30d0e9f7","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":27},"updated":"2017-04-24 01:39:52.000000000","message":"Though it causes no issue here, \"from dragonflow import conf as cfg\" is used more commonly. It can make sure all options are registered.","commit_id":"68c1772e02148d6d4e081dda63049f1791e00854"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f897815cd1bedeb6acaaeabf8df477aa445523a6","unresolved":false,"context_lines":[{"line_number":12,"context_line":"import time"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"from jsonmodels import fields"},{"line_number":15,"context_line":"from oslo_config import cfg"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"from dragonflow import conf"},{"line_number":18,"context_line":"import dragonflow.db.field_types as df_fields"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_6e456d17","line":15,"range":{"start_line":15,"start_character":0,"end_line":15,"end_character":27},"in_reply_to":"5ff73747_30d0e9f7","updated":"2017-04-24 06:14:50.000000000","message":"Will change","commit_id":"68c1772e02148d6d4e081dda63049f1791e00854"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3fa64fe1c120ca76ccd20597dffc031511f6bd85","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return (time.time() - self.last_activity_timestamp) \u003e timeout"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def on_get_all_post(self, instances):"},{"line_number":46,"context_line":"        return [o for o in instances if not o.is_stale()]"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_53810c4a","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":23},"updated":"2017-05-16 12:42:11.000000000","message":"Maybe rename to \u0027filter_out_stale_publishers\u0027? Ideally, have the function name what it does, not how it\u0027s expected to be used.","commit_id":"65b785890159e4307d12731c32df089d263e04b5"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"2e5855a3e20cfb8071b7a5170ce40d2e5fe175c4","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return (time.time() - self.last_activity_timestamp) \u003e timeout"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def on_get_all_post(self, instances):"},{"line_number":46,"context_line":"        return [o for o in instances if not o.is_stale()]"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_7341a80b","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":23},"in_reply_to":"1f013ff3_53810c4a","updated":"2017-05-16 12:45:28.000000000","message":"But then it would not be called by NbApi :(","commit_id":"65b785890159e4307d12731c32df089d263e04b5"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"2ec2becc008643476699e1895f5642ba773c1045","unresolved":false,"context_lines":[{"line_number":42,"context_line":"        return (time.time() - self.last_activity_timestamp) \u003e timeout"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @classmethod"},{"line_number":45,"context_line":"    def on_get_all_post(self, instances):"},{"line_number":46,"context_line":"        return [o for o in instances if not o.is_stale()]"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_535d8ce7","line":45,"range":{"start_line":45,"start_character":8,"end_line":45,"end_character":23},"in_reply_to":"1f013ff3_7341a80b","updated":"2017-05-16 12:46:58.000000000","message":"Sorry - missed that :)","commit_id":"65b785890159e4307d12731c32df089d263e04b5"}],"dragonflow/db/models/mixins.py":[{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"0172673374e14a64d133f870b46d9dfc78a2133f","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def on_create_pre(self):"},{"line_number":49,"context_line":"        super(UniqueKey, self).on_create_pre()"},{"line_number":50,"context_line":"        from dragonflow.db import api_nb  # FIXME(dimak)"},{"line_number":51,"context_line":"        nb_api \u003d api_nb.NbApi.get_instance(True)"},{"line_number":52,"context_line":"        self.unique_key \u003d nb_api.driver.allocate_unique_key(self.table_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_900a1d88","line":50,"range":{"start_line":50,"start_character":0,"end_line":50,"end_character":56},"updated":"2017-04-24 01:39:52.000000000","message":"Why is this needed? Is there a circle import here?","commit_id":"68c1772e02148d6d4e081dda63049f1791e00854"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"f897815cd1bedeb6acaaeabf8df477aa445523a6","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def on_create_pre(self):"},{"line_number":49,"context_line":"        super(UniqueKey, self).on_create_pre()"},{"line_number":50,"context_line":"        from dragonflow.db import api_nb  # FIXME(dimak)"},{"line_number":51,"context_line":"        nb_api \u003d api_nb.NbApi.get_instance(True)"},{"line_number":52,"context_line":"        self.unique_key \u003d nb_api.driver.allocate_unique_key(self.table_name)"}],"source_content_type":"text/x-python","patch_set":2,"id":"5ff73747_0e54a9c9","line":50,"range":{"start_line":50,"start_character":0,"end_line":50,"end_character":56},"in_reply_to":"5ff73747_900a1d88","updated":"2017-04-24 06:14:50.000000000","message":"Yes, there\u0027s an import cycle api_nb-\u003ecore-\u003emixins-\u003eapi_nb.\n\nI\u0027ll see if I can solve it in a more elegant way..","commit_id":"68c1772e02148d6d4e081dda63049f1791e00854"},{"author":{"_account_id":11159,"name":"Hong Hui Xiao","email":"honghui_xiao@yeah.net","username":"HongHuiXiao"},"change_message_id":"22fa85bd748ac6fbcec3f4cfbf7b6fa91ce41e02","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        super(UniqueKey, self).on_create_pre()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # TODO(dimak) This is here due to api_nb-\u003emodels.core-\u003emodels.mixins"},{"line_number":52,"context_line":"        # import cycle. Maybe we can break it by taking publisher/subscriber"},{"line_number":53,"context_line":"        # initialization out of api_nb"},{"line_number":54,"context_line":"        from dragonflow.db import api_nb"},{"line_number":55,"context_line":"        nb_api \u003d api_nb.NbApi.get_instance(True)"},{"line_number":56,"context_line":"        self.unique_key \u003d nb_api.driver.allocate_unique_key(self.table_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_b64a63a9","line":53,"range":{"start_line":52,"start_character":0,"end_line":53,"end_character":38},"updated":"2017-04-26 03:02:48.000000000","message":"+1, and another way is to \"Use Absolute Imports\", found this from stackoverflow.\n\nhttp://stackoverflow.com/questions/7336802/how-to-avoid-circular-imports-in-python","commit_id":"19f670e347c163f72ab4fcc8f80c481b22812548"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"ebdf2e2e0de713540616053fb2bfcbe90d65abb3","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        super(UniqueKey, self).on_create_pre()"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # TODO(dimak) This is here due to api_nb-\u003emodels.core-\u003emodels.mixins"},{"line_number":52,"context_line":"        # import cycle. Maybe we can break it by taking publisher/subscriber"},{"line_number":53,"context_line":"        # initialization out of api_nb"},{"line_number":54,"context_line":"        from dragonflow.db import api_nb"},{"line_number":55,"context_line":"        nb_api \u003d api_nb.NbApi.get_instance(True)"},{"line_number":56,"context_line":"        self.unique_key \u003d nb_api.driver.allocate_unique_key(self.table_name)"}],"source_content_type":"text/x-python","patch_set":3,"id":"5ff73747_36f4055b","line":53,"range":{"start_line":52,"start_character":0,"end_line":53,"end_character":38},"in_reply_to":"5ff73747_b64a63a9","updated":"2017-05-15 13:03:44.000000000","message":"I think the import we do here is considered absolute","commit_id":"19f670e347c163f72ab4fcc8f80c481b22812548"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"3fa64fe1c120ca76ccd20597dffc031511f6bd85","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # TODO(dimak) This is here due to api_nb-\u003emodels.core-\u003emodels.mixins"},{"line_number":52,"context_line":"        # import cycle. Maybe we can break it by taking publisher/subscriber"},{"line_number":53,"context_line":"        # initialization out of api_nb"},{"line_number":54,"context_line":"        from dragonflow.db import api_nb"},{"line_number":55,"context_line":"        nb_api \u003d api_nb.NbApi.get_instance(True)"},{"line_number":56,"context_line":"        self.unique_key \u003d nb_api.driver.allocate_unique_key(self.table_name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_b3e9701b","line":53,"updated":"2017-05-16 12:42:11.000000000","message":"You can link blueprint pub-sub-v2 here for more info","commit_id":"65b785890159e4307d12731c32df089d263e04b5"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"2e5855a3e20cfb8071b7a5170ce40d2e5fe175c4","unresolved":false,"context_lines":[{"line_number":50,"context_line":""},{"line_number":51,"context_line":"        # TODO(dimak) This is here due to api_nb-\u003emodels.core-\u003emodels.mixins"},{"line_number":52,"context_line":"        # import cycle. Maybe we can break it by taking publisher/subscriber"},{"line_number":53,"context_line":"        # initialization out of api_nb"},{"line_number":54,"context_line":"        from dragonflow.db import api_nb"},{"line_number":55,"context_line":"        nb_api \u003d api_nb.NbApi.get_instance(True)"},{"line_number":56,"context_line":"        self.unique_key \u003d nb_api.driver.allocate_unique_key(self.table_name)"}],"source_content_type":"text/x-python","patch_set":6,"id":"1f013ff3_f35498cc","line":53,"in_reply_to":"1f013ff3_b3e9701b","updated":"2017-05-16 12:45:28.000000000","message":"I\u0027ll add it here if I respin, or as subsequent patch I won\u0027t have to.","commit_id":"65b785890159e4307d12731c32df089d263e04b5"}]}
