)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"c4ee20ecf229d2bf3c4abfd22dd0eadd90bc7ff3","unresolved":false,"context_lines":[{"line_number":7,"context_line":"[WIP] SkyDive agent app"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Initial sketch of app that reports DF objects to Skydive analyzer"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Omer Anson \u003comer.anson@toganetworks.com\u003e"},{"line_number":12,"context_line":"Change-Id: Ie715e340f9df1b1e250480d05ecd0341d28bda06"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":1,"id":"1f485f77_8650acd6","line":10,"updated":"2017-11-09 07:50:31.000000000","message":"Worth to add some documentation regarding the intent","commit_id":"fd73cf3b98d164703d726d73f21968e2290333d7"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92c36825bfb82fcce2b9a40813bd6f74450fdd6f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Shachar Snapiri \u003cshachar.snapiri@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-01-28 12:09:17 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] SkyDive agent app"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Initial sketch of app that reports DF objects to Skydive analyzer"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"5f93b717_394e636f","line":7,"range":{"start_line":7,"start_character":1,"end_line":7,"end_character":4},"updated":"2018-01-28 11:41:53.000000000","message":"What\u0027s still missing?","commit_id":"52220102feed6c4cea4e591c9083f41ff1c903eb"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"a725ecbcc724449025ababa758971c113537bb79","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Shachar Snapiri \u003cshachar.snapiri@huawei.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2018-01-28 12:09:17 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"[WIP] SkyDive agent app"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Initial sketch of app that reports DF objects to Skydive analyzer"},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"5f93b717_05745198","line":7,"range":{"start_line":7,"start_character":1,"end_line":7,"end_character":4},"in_reply_to":"5f93b717_394e636f","updated":"2018-01-29 06:10:16.000000000","message":"Need to make sure it works properly","commit_id":"52220102feed6c4cea4e591c9083f41ff1c903eb"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92c36825bfb82fcce2b9a40813bd6f74450fdd6f","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Initial sketch of app that reports DF objects to Skydive analyzer"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Omer Anson \u003comer.anson@toganetworks.com\u003e"},{"line_number":12,"context_line":"Co-Authored-By: Shachar Snapiri \u003cshachar.snapiri@huawei.com\u003e"},{"line_number":13,"context_line":"Change-Id: Ie715e340f9df1b1e250480d05ecd0341d28bda06"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"5f93b717_f9579b01","line":12,"updated":"2018-01-28 11:41:53.000000000","message":"Also co-authored by @dimak (If we wants) (Sorry I missed this)","commit_id":"52220102feed6c4cea4e591c9083f41ff1c903eb"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"a725ecbcc724449025ababa758971c113537bb79","unresolved":false,"context_lines":[{"line_number":9,"context_line":"Initial sketch of app that reports DF objects to Skydive analyzer"},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Co-Authored-By: Omer Anson \u003comer.anson@toganetworks.com\u003e"},{"line_number":12,"context_line":"Co-Authored-By: Shachar Snapiri \u003cshachar.snapiri@huawei.com\u003e"},{"line_number":13,"context_line":"Change-Id: Ie715e340f9df1b1e250480d05ecd0341d28bda06"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":5,"id":"5f93b717_457a5988","line":12,"in_reply_to":"5f93b717_f9579b01","updated":"2018-01-29 06:10:16.000000000","message":"He is the owner...","commit_id":"52220102feed6c4cea4e591c9083f41ff1c903eb"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":11,"context_line":"TODO:"},{"line_number":12,"context_line":"[ ] Fix issues with Skydive - use 0.3.1"},{"line_number":13,"context_line":"[ ] Investigate error: There is no current event loop in thread \u0027MainThread"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Co-Authored-By: Omer Anson \u003comer.anson@toganetworks.com\u003e"},{"line_number":16,"context_line":"Co-Authored-By: Shachar Snapiri \u003cshachar.snapiri@huawei.com\u003e"},{"line_number":17,"context_line":"Change-Id: Ie715e340f9df1b1e250480d05ecd0341d28bda06"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":8,"id":"5f93b717_1cfb3147","line":14,"updated":"2018-01-30 06:56:42.000000000","message":"please link to some launchpad issue","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"}],"devstack/plugin.sh":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    DEFAULT_APPS_LIST\u003d\"aging,$DEFAULT_APPS_LIST\""},{"line_number":51,"context_line":"fi"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"ENABLE_DF_SKYDIVE\u003d${ENABLE_DF_SKYDIVE:-False}"},{"line_number":54,"context_line":"if [[ \"$ENABLE_DF_SKYDIVE\" \u003d\u003d \"True\" ]]; then"},{"line_number":55,"context_line":"    if ! is_plugin_enabled skydive; then"},{"line_number":56,"context_line":"        die $LINENO \"ENABLE_DF_SKYDIVE is set but skydive plugin is not enabled\""}],"source_content_type":"text/x-sh","patch_set":4,"id":"5f93b717_f6b1eb90","line":53,"range":{"start_line":53,"start_character":0,"end_line":53,"end_character":45},"updated":"2018-01-28 09:23:41.000000000","message":"Please move to devstack/settings","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":50,"context_line":"    DEFAULT_APPS_LIST\u003d\"aging,$DEFAULT_APPS_LIST\""},{"line_number":51,"context_line":"fi"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"ENABLE_DF_SKYDIVE\u003d${ENABLE_DF_SKYDIVE:-False}"},{"line_number":54,"context_line":"if [[ \"$ENABLE_DF_SKYDIVE\" \u003d\u003d \"True\" ]]; then"},{"line_number":55,"context_line":"    if ! is_plugin_enabled skydive; then"},{"line_number":56,"context_line":"        die $LINENO \"ENABLE_DF_SKYDIVE is set but skydive plugin is not enabled\""}],"source_content_type":"text/x-sh","patch_set":4,"id":"5f93b717_b1f04dcb","line":53,"range":{"start_line":53,"start_character":0,"end_line":53,"end_character":45},"in_reply_to":"5f93b717_f6b1eb90","updated":"2018-01-28 10:07:35.000000000","message":"Done.\nThough I see all the ones above are defined in this file...","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"ENABLE_DF_SKYDIVE\u003d${ENABLE_DF_SKYDIVE:-False}"},{"line_number":54,"context_line":"if [[ \"$ENABLE_DF_SKYDIVE\" \u003d\u003d \"True\" ]]; then"},{"line_number":55,"context_line":"    if ! is_plugin_enabled skydive; then"},{"line_number":56,"context_line":"        die $LINENO \"ENABLE_DF_SKYDIVE is set but skydive plugin is not enabled\""},{"line_number":57,"context_line":"    fi"},{"line_number":58,"context_line":"    if ! is_service_enabled skydive-analyzer; then"},{"line_number":59,"context_line":"        die $LINENO \"ENABLE_DF_SKYDIVE is set but skydive-analyzer is not enabled\""},{"line_number":60,"context_line":"    fi"},{"line_number":61,"context_line":"    DEFAULT_APPS_LIST\u003d\"$DEFAULT_APPS_LIST,skydive_agent\""},{"line_number":62,"context_line":"#    # This must match the code from SKYDIVE"},{"line_number":63,"context_line":"#    SKYDIVE_ANALYZER_LISTEN\u003d${SKYDIVE_ANALYZER_LISTEN:-$SERVICE_HOST:8082}"}],"source_content_type":"text/x-sh","patch_set":4,"id":"5f93b717_764cfb9d","line":60,"range":{"start_line":55,"start_character":0,"end_line":60,"end_character":6},"updated":"2018-01-28 09:23:41.000000000","message":"Analyzer doesn\u0027t have to be local. Instead of checking whether the plugin and service are enabled, maybe just take a url and trust the deployer?","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"ENABLE_DF_SKYDIVE\u003d${ENABLE_DF_SKYDIVE:-False}"},{"line_number":54,"context_line":"if [[ \"$ENABLE_DF_SKYDIVE\" \u003d\u003d \"True\" ]]; then"},{"line_number":55,"context_line":"    if ! is_plugin_enabled skydive; then"},{"line_number":56,"context_line":"        die $LINENO \"ENABLE_DF_SKYDIVE is set but skydive plugin is not enabled\""},{"line_number":57,"context_line":"    fi"},{"line_number":58,"context_line":"    if ! is_service_enabled skydive-analyzer; then"},{"line_number":59,"context_line":"        die $LINENO \"ENABLE_DF_SKYDIVE is set but skydive-analyzer is not enabled\""},{"line_number":60,"context_line":"    fi"},{"line_number":61,"context_line":"    DEFAULT_APPS_LIST\u003d\"$DEFAULT_APPS_LIST,skydive_agent\""},{"line_number":62,"context_line":"#    # This must match the code from SKYDIVE"},{"line_number":63,"context_line":"#    SKYDIVE_ANALYZER_LISTEN\u003d${SKYDIVE_ANALYZER_LISTEN:-$SERVICE_HOST:8082}"}],"source_content_type":"text/x-sh","patch_set":4,"id":"5f93b717_d1eb99d9","line":60,"range":{"start_line":55,"start_character":0,"end_line":60,"end_character":6},"in_reply_to":"5f93b717_764cfb9d","updated":"2018-01-28 10:07:35.000000000","message":"Done","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    iniset $DRAGONFLOW_CONF df enable_selective_topology_distribution \\"},{"line_number":333,"context_line":"                            \"$DF_SELECTIVE_TOPO_DIST\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    if [[ \"$ENABLE_DF_SKYDIVE\" \u003d\u003d \"True\" ]]; then"},{"line_number":336,"context_line":"        configure_df_skydive"},{"line_number":337,"context_line":"    fi"}],"source_content_type":"text/x-sh","patch_set":4,"id":"5f93b717_110ee131","line":334,"updated":"2018-01-28 09:23:41.000000000","message":"Why remove call to configure_df_metadata_service ?","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    iniset $DRAGONFLOW_CONF df enable_selective_topology_distribution \\"},{"line_number":333,"context_line":"                            \"$DF_SELECTIVE_TOPO_DIST\""},{"line_number":334,"context_line":""},{"line_number":335,"context_line":"    if [[ \"$ENABLE_DF_SKYDIVE\" \u003d\u003d \"True\" ]]; then"},{"line_number":336,"context_line":"        configure_df_skydive"},{"line_number":337,"context_line":"    fi"}],"source_content_type":"text/x-sh","patch_set":4,"id":"5f93b717_71bc05dc","line":334,"in_reply_to":"5f93b717_110ee131","updated":"2018-01-28 10:07:35.000000000","message":"Oops","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"c8d673a2d6bc1651c717da4a60be5868d55b42a4","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"if [[ \"$ENABLE_DF_SKYDIVE\" \u003d\u003d \"True\" ]]; then"},{"line_number":55,"context_line":"    DEFAULT_APPS_LIST\u003d\"$DEFAULT_APPS_LIST,skydive_agent\""},{"line_number":56,"context_line":"    SKYDIVE_ENDPOINT\u003d${SKYDIVE_ENDPOINT:-$SERVICE_HOST:8082}"},{"line_number":57,"context_line":"fi"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"DF_APPS_LIST\u003d${DF_APPS_LIST:-$DEFAULT_APPS_LIST}"}],"source_content_type":"text/x-sh","patch_set":21,"id":"df7087c5_a5b0a0de","line":56,"range":{"start_line":56,"start_character":55,"end_line":56,"end_character":59},"updated":"2018-03-26 05:46:23.000000000","message":"worth to have this as setting too","commit_id":"e2ae03d9b1caf1668a6a51f2d915f735ff7763bb"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"4d745b9a184e34e0dfddaa563dd2ee982abe9e8a","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"if [[ \"$ENABLE_DF_SKYDIVE\" \u003d\u003d \"True\" ]]; then"},{"line_number":55,"context_line":"    DEFAULT_APPS_LIST\u003d\"$DEFAULT_APPS_LIST,skydive_agent\""},{"line_number":56,"context_line":"    SKYDIVE_ENDPOINT\u003d${SKYDIVE_ENDPOINT:-$SERVICE_HOST:8082}"},{"line_number":57,"context_line":"fi"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"DF_APPS_LIST\u003d${DF_APPS_LIST:-$DEFAULT_APPS_LIST}"}],"source_content_type":"text/x-sh","patch_set":21,"id":"bf659307_fdbb3fe2","line":56,"range":{"start_line":56,"start_character":55,"end_line":56,"end_character":59},"in_reply_to":"df7087c5_a5b0a0de","updated":"2018-03-26 07:59:29.000000000","message":"Not relevant for this patch any more.\nIn any case, there is a very easy way to override this, just define SKYDIVE_ENDPOINT :)","commit_id":"e2ae03d9b1caf1668a6a51f2d915f735ff7763bb"}],"dragonflow/cmd/df_skydive_service.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"df7087c5_38288595","updated":"2018-03-22 15:22:36.000000000","message":"Due to the rename, I can\u0027t see what I already commented on. If this is something we already discussed, feel free to ignore.","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            cfg.CONF.df_skydive.user,"},{"line_number":45,"context_line":"            cfg.CONF.df_skydive.password)"},{"line_number":46,"context_line":"        if not logged_in:"},{"line_number":47,"context_line":"            # TODO(snapiri) raise an exception"},{"line_number":48,"context_line":"            return"},{"line_number":49,"context_line":"        self.websocket_client.connect()"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_18bca104","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":46},"updated":"2018-03-22 15:22:36.000000000","message":"Please log an error.","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            cfg.CONF.df_skydive.user,"},{"line_number":45,"context_line":"            cfg.CONF.df_skydive.password)"},{"line_number":46,"context_line":"        if not logged_in:"},{"line_number":47,"context_line":"            # TODO(snapiri) raise an exception"},{"line_number":48,"context_line":"            return"},{"line_number":49,"context_line":"        self.websocket_client.connect()"},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_44d94481","line":47,"range":{"start_line":47,"start_character":0,"end_line":47,"end_character":46},"in_reply_to":"df7087c5_18bca104","updated":"2018-03-25 09:58:31.000000000","message":"Done","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            self._add_edge_message(edges, instance, field)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def _output_table_node_edges(self, edges, instance):"},{"line_number":176,"context_line":"        for key, field in type(instance).iterate_over_fields():"},{"line_number":177,"context_line":"            if key \u003d\u003d \u0027id\u0027:"},{"line_number":178,"context_line":"                continue"},{"line_number":179,"context_line":"            multi_value \u003d False"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_b8857509","line":176,"range":{"start_line":176,"start_character":26,"end_line":176,"end_character":41},"updated":"2018-03-22 15:22:36.000000000","message":"nit: Is this needed?","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":173,"context_line":"            self._add_edge_message(edges, instance, field)"},{"line_number":174,"context_line":""},{"line_number":175,"context_line":"    def _output_table_node_edges(self, edges, instance):"},{"line_number":176,"context_line":"        for key, field in type(instance).iterate_over_fields():"},{"line_number":177,"context_line":"            if key \u003d\u003d \u0027id\u0027:"},{"line_number":178,"context_line":"                continue"},{"line_number":179,"context_line":"            multi_value \u003d False"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_e4e5f839","line":176,"range":{"start_line":176,"start_character":26,"end_line":176,"end_character":41},"in_reply_to":"df7087c5_b8857509","updated":"2018-03-25 09:58:31.000000000","message":"I believe so","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        for key, field in type(instance).iterate_over_fields():"},{"line_number":177,"context_line":"            if key \u003d\u003d \u0027id\u0027:"},{"line_number":178,"context_line":"                continue"},{"line_number":179,"context_line":"            multi_value \u003d False"},{"line_number":180,"context_line":"            if isinstance(field, fields.ListField):"},{"line_number":181,"context_line":"                multi_value \u003d True"},{"line_number":182,"context_line":"            try:"},{"line_number":183,"context_line":"                self._output_edge(edges, instance, key, multi_value)"},{"line_number":184,"context_line":"            except AttributeError:"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_1874a135","line":181,"range":{"start_line":179,"start_character":0,"end_line":181,"end_character":34},"updated":"2018-03-22 15:22:36.000000000","message":"nit: can be replaced with:\nmulti_value \u003d isinstance(field, fields.ListField)","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        for key, field in type(instance).iterate_over_fields():"},{"line_number":177,"context_line":"            if key \u003d\u003d \u0027id\u0027:"},{"line_number":178,"context_line":"                continue"},{"line_number":179,"context_line":"            multi_value \u003d False"},{"line_number":180,"context_line":"            if isinstance(field, fields.ListField):"},{"line_number":181,"context_line":"                multi_value \u003d True"},{"line_number":182,"context_line":"            try:"},{"line_number":183,"context_line":"                self._output_edge(edges, instance, key, multi_value)"},{"line_number":184,"context_line":"            except AttributeError:"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_a4d1405a","line":181,"range":{"start_line":179,"start_character":0,"end_line":181,"end_character":34},"in_reply_to":"df7087c5_1874a135","updated":"2018-03-25 09:58:31.000000000","message":":)","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            except AttributeError:"},{"line_number":185,"context_line":"                pass  # ignore"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _has_owner(self, instance):"},{"line_number":188,"context_line":"        if not hasattr(instance, \"device_owner\"):"},{"line_number":189,"context_line":"            return False"},{"line_number":190,"context_line":"        return hasattr(instance, \"device_id\")"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_58cc5969","line":187,"range":{"start_line":187,"start_character":8,"end_line":187,"end_character":18},"updated":"2018-03-22 15:22:36.000000000","message":"nit: We can go crazy here, and create an \u0027Owner\u0027 mixin. The mixin will have device_owner and device_id, and a static function has_owner(instance) which checks if isinstance(instance, OwnerMixin).\n\nThis mixin can have other helpful functions like get_owner which returns a proxy to the owner (like a real reference).","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"8f933e6acc7ae86c55ec78a0fdb952ae4bd05a98","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            except AttributeError:"},{"line_number":185,"context_line":"                pass  # ignore"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _has_owner(self, instance):"},{"line_number":188,"context_line":"        if not hasattr(instance, \"device_owner\"):"},{"line_number":189,"context_line":"            return False"},{"line_number":190,"context_line":"        return hasattr(instance, \"device_id\")"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_7a3bb5d0","line":187,"range":{"start_line":187,"start_character":8,"end_line":187,"end_character":18},"in_reply_to":"bf659307_c4d6b450","updated":"2018-03-26 05:27:19.000000000","message":"Sure","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            except AttributeError:"},{"line_number":185,"context_line":"                pass  # ignore"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def _has_owner(self, instance):"},{"line_number":188,"context_line":"        if not hasattr(instance, \"device_owner\"):"},{"line_number":189,"context_line":"            return False"},{"line_number":190,"context_line":"        return hasattr(instance, \"device_id\")"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_c4d6b450","line":187,"range":{"start_line":187,"start_character":8,"end_line":187,"end_character":18},"in_reply_to":"df7087c5_58cc5969","updated":"2018-03-25 09:58:31.000000000","message":"Not sure I follow, let\u0027s discuss offline","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    def _output_table_node(self, nodes, edges, instance):"},{"line_number":193,"context_line":"        metadata \u003d {"},{"line_number":194,"context_line":"            \u0027ID\u0027: \"DF-{}\".format(instance.id),"},{"line_number":195,"context_line":"            \u0027Type\u0027: type(instance).__name__,"},{"line_number":196,"context_line":"            \u0027source\u0027: \u0027dragonflow\u0027,"},{"line_number":197,"context_line":"            \u0027data\u0027: instance.to_struct(),"},{"line_number":198,"context_line":"            \u0027Name\u0027: getattr(instance, \u0027name\u0027, None) or instance.id"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_b8e815b3","line":195,"range":{"start_line":195,"start_character":20,"end_line":195,"end_character":43},"updated":"2018-03-22 15:22:36.000000000","message":"nit: We *really* need a function for this :)","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":192,"context_line":"    def _output_table_node(self, nodes, edges, instance):"},{"line_number":193,"context_line":"        metadata \u003d {"},{"line_number":194,"context_line":"            \u0027ID\u0027: \"DF-{}\".format(instance.id),"},{"line_number":195,"context_line":"            \u0027Type\u0027: type(instance).__name__,"},{"line_number":196,"context_line":"            \u0027source\u0027: \u0027dragonflow\u0027,"},{"line_number":197,"context_line":"            \u0027data\u0027: instance.to_struct(),"},{"line_number":198,"context_line":"            \u0027Name\u0027: getattr(instance, \u0027name\u0027, None) or instance.id"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_c43b149a","line":195,"range":{"start_line":195,"start_character":20,"end_line":195,"end_character":43},"in_reply_to":"df7087c5_b8e815b3","updated":"2018-03-25 09:58:31.000000000","message":"Done","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        nodes.append(result)"},{"line_number":205,"context_line":"        self._output_table_node_edges(edges, instance)"},{"line_number":206,"context_line":"        # If we have an owner, add the edge from it to this instance"},{"line_number":207,"context_line":"        if self.has_owner(instance):"},{"line_number":208,"context_line":"            owner_class \u003d mf.get_table_class(instance.device_owner)"},{"line_number":209,"context_line":"            if not owner_class:"},{"line_number":210,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_38bf25ab","line":207,"range":{"start_line":207,"start_character":0,"end_line":207,"end_character":36},"updated":"2018-03-22 15:22:36.000000000","message":"typo: self.has_owner -\u003e self._has_owner","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":204,"context_line":"        nodes.append(result)"},{"line_number":205,"context_line":"        self._output_table_node_edges(edges, instance)"},{"line_number":206,"context_line":"        # If we have an owner, add the edge from it to this instance"},{"line_number":207,"context_line":"        if self.has_owner(instance):"},{"line_number":208,"context_line":"            owner_class \u003d mf.get_table_class(instance.device_owner)"},{"line_number":209,"context_line":"            if not owner_class:"},{"line_number":210,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_84451c1a","line":207,"range":{"start_line":207,"start_character":0,"end_line":207,"end_character":36},"in_reply_to":"df7087c5_38bf25ab","updated":"2018-03-25 09:58:31.000000000","message":"Done","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        self._output_table_node_edges(edges, instance)"},{"line_number":206,"context_line":"        # If we have an owner, add the edge from it to this instance"},{"line_number":207,"context_line":"        if self.has_owner(instance):"},{"line_number":208,"context_line":"            owner_class \u003d mf.get_table_class(instance.device_owner)"},{"line_number":209,"context_line":"            if not owner_class:"},{"line_number":210,"context_line":"                return"},{"line_number":211,"context_line":"            edge \u003d self._build_edge_message(owner_class.__name__,"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_18f02191","line":208,"range":{"start_line":208,"start_character":29,"end_line":208,"end_character":44},"updated":"2018-03-22 15:22:36.000000000","message":"Why not just use get_model like in _output_table?","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":205,"context_line":"        self._output_table_node_edges(edges, instance)"},{"line_number":206,"context_line":"        # If we have an owner, add the edge from it to this instance"},{"line_number":207,"context_line":"        if self.has_owner(instance):"},{"line_number":208,"context_line":"            owner_class \u003d mf.get_table_class(instance.device_owner)"},{"line_number":209,"context_line":"            if not owner_class:"},{"line_number":210,"context_line":"                return"},{"line_number":211,"context_line":"            edge \u003d self._build_edge_message(owner_class.__name__,"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_6459e8fc","line":208,"range":{"start_line":208,"start_character":29,"end_line":208,"end_character":44},"in_reply_to":"df7087c5_18f02191","updated":"2018-03-25 09:58:31.000000000","message":"Done","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        LOG.debug(\u0027onOpen\u0027)"},{"line_number":242,"context_line":"        # TODO(snapiri) have to handle a case in which we got disconnected"},{"line_number":243,"context_line":"        # and then reconnected."},{"line_number":244,"context_line":"        self.reschedule_send()"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def onClose(self, wasClean, code, reason):"},{"line_number":247,"context_line":"        \"\"\"Callback that is called when the client disconnects"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_d82b89e8","line":244,"range":{"start_line":244,"start_character":0,"end_line":244,"end_character":30},"updated":"2018-03-22 15:22:36.000000000","message":"nit: Add an option to send the first event immediately?","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"8f933e6acc7ae86c55ec78a0fdb952ae4bd05a98","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        LOG.debug(\u0027onOpen\u0027)"},{"line_number":242,"context_line":"        # TODO(snapiri) have to handle a case in which we got disconnected"},{"line_number":243,"context_line":"        # and then reconnected."},{"line_number":244,"context_line":"        self.reschedule_send()"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def onClose(self, wasClean, code, reason):"},{"line_number":247,"context_line":"        \"\"\"Callback that is called when the client disconnects"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_da2681b8","line":244,"range":{"start_line":244,"start_character":0,"end_line":244,"end_character":30},"in_reply_to":"bf659307_845e7ce4","updated":"2018-03-26 05:27:19.000000000","message":"Sure","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":241,"context_line":"        LOG.debug(\u0027onOpen\u0027)"},{"line_number":242,"context_line":"        # TODO(snapiri) have to handle a case in which we got disconnected"},{"line_number":243,"context_line":"        # and then reconnected."},{"line_number":244,"context_line":"        self.reschedule_send()"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"    def onClose(self, wasClean, code, reason):"},{"line_number":247,"context_line":"        \"\"\"Callback that is called when the client disconnects"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_845e7ce4","line":244,"range":{"start_line":244,"start_character":0,"end_line":244,"end_character":30},"in_reply_to":"df7087c5_d82b89e8","updated":"2018-03-25 09:58:31.000000000","message":"Thought of it, I see no real value for it.\nCan do though... later...","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"def main():"},{"line_number":268,"context_line":"    \"\"\"main method\"\"\""},{"line_number":269,"context_line":"    import logging"},{"line_number":270,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":271,"context_line":"    global LOG"},{"line_number":272,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":273,"context_line":"    parser \u003d argparse.ArgumentParser(description\u003d\u0027SkyDive integration service\u0027)"},{"line_number":274,"context_line":"    parser.add_argument(\u0027-t\u0027, \u0027--runtime\u0027, type\u003dint,"},{"line_number":275,"context_line":"                        help\u003d\u0027Total runtime (default 0 \u003d infinite)\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_f8ee8d20","line":272,"range":{"start_line":269,"start_character":0,"end_line":272,"end_character":37},"updated":"2018-03-22 15:22:36.000000000","message":"Is this necessary? Why not just call df_config.init(sys.argv)?","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":266,"context_line":""},{"line_number":267,"context_line":"def main():"},{"line_number":268,"context_line":"    \"\"\"main method\"\"\""},{"line_number":269,"context_line":"    import logging"},{"line_number":270,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":271,"context_line":"    global LOG"},{"line_number":272,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":273,"context_line":"    parser \u003d argparse.ArgumentParser(description\u003d\u0027SkyDive integration service\u0027)"},{"line_number":274,"context_line":"    parser.add_argument(\u0027-t\u0027, \u0027--runtime\u0027, type\u003dint,"},{"line_number":275,"context_line":"                        help\u003d\u0027Total runtime (default 0 \u003d infinite)\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_2473f082","line":272,"range":{"start_line":269,"start_character":0,"end_line":272,"end_character":37},"in_reply_to":"df7087c5_f8ee8d20","updated":"2018-03-25 09:58:31.000000000","message":"Done","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":270,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":271,"context_line":"    global LOG"},{"line_number":272,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":273,"context_line":"    parser \u003d argparse.ArgumentParser(description\u003d\u0027SkyDive integration service\u0027)"},{"line_number":274,"context_line":"    parser.add_argument(\u0027-t\u0027, \u0027--runtime\u0027, type\u003dint,"},{"line_number":275,"context_line":"                        help\u003d\u0027Total runtime (default 0 \u003d infinite)\u0027)"},{"line_number":276,"context_line":"    args \u003d parser.parse_args()"},{"line_number":277,"context_line":"    client \u003d SkydiveClient.create()"},{"line_number":278,"context_line":"    if args.runtime:"},{"line_number":279,"context_line":"        client.schedule_stop(args.runtime)"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_387ac5b9","line":276,"range":{"start_line":273,"start_character":0,"end_line":276,"end_character":30},"updated":"2018-03-22 15:22:36.000000000","message":"nit: Wouldn\u0027t it be better to add a signal handler, and then this would work both by using Ctrl-C, systemd, and utilities like \u0027timeout\u0027 ?","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":270,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":271,"context_line":"    global LOG"},{"line_number":272,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":273,"context_line":"    parser \u003d argparse.ArgumentParser(description\u003d\u0027SkyDive integration service\u0027)"},{"line_number":274,"context_line":"    parser.add_argument(\u0027-t\u0027, \u0027--runtime\u0027, type\u003dint,"},{"line_number":275,"context_line":"                        help\u003d\u0027Total runtime (default 0 \u003d infinite)\u0027)"},{"line_number":276,"context_line":"    args \u003d parser.parse_args()"},{"line_number":277,"context_line":"    client \u003d SkydiveClient.create()"},{"line_number":278,"context_line":"    if args.runtime:"},{"line_number":279,"context_line":"        client.schedule_stop(args.runtime)"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_04e10c9b","line":276,"range":{"start_line":273,"start_character":0,"end_line":276,"end_character":30},"in_reply_to":"df7087c5_387ac5b9","updated":"2018-03-25 09:58:31.000000000","message":"Added. Not that it is working, but added :)","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        client.schedule_stop(args.runtime)"},{"line_number":280,"context_line":"    client.clear_dragonflow_items()"},{"line_number":281,"context_line":"    client.start()"},{"line_number":282,"context_line":"    LOG.info(\u0027Update complete\u0027)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_38e08526","line":282,"range":{"start_line":282,"start_character":0,"end_line":282,"end_character":31},"updated":"2018-03-22 15:22:36.000000000","message":"I think this text is wrong.","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        client.schedule_stop(args.runtime)"},{"line_number":280,"context_line":"    client.clear_dragonflow_items()"},{"line_number":281,"context_line":"    client.start()"},{"line_number":282,"context_line":"    LOG.info(\u0027Update complete\u0027)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_e46c189e","line":282,"range":{"start_line":282,"start_character":0,"end_line":282,"end_character":31},"in_reply_to":"df7087c5_38e08526","updated":"2018-03-25 09:58:31.000000000","message":"Done","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"c8d673a2d6bc1651c717da4a60be5868d55b42a4","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        :return a newly allocated SkydiveClient"},{"line_number":62,"context_line":"        :rtype SkydiveClient"},{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        from dragonflow.common import utils as df_utils"},{"line_number":65,"context_line":"        df_utils.config_parse()"},{"line_number":66,"context_line":"        nb_api \u003d api_nb.NbApi.get_instance(False, True)"},{"line_number":67,"context_line":"        return SkydiveClient(nb_api)"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_df90bd98","line":64,"range":{"start_line":64,"start_character":8,"end_line":64,"end_character":55},"updated":"2018-03-26 05:46:23.000000000","message":"Why not keep the imports at the top of the file?","commit_id":"38619577f7a7320804788007f3a83cf77743fca7"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"4d745b9a184e34e0dfddaa563dd2ee982abe9e8a","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        :return a newly allocated SkydiveClient"},{"line_number":62,"context_line":"        :rtype SkydiveClient"},{"line_number":63,"context_line":"        \"\"\""},{"line_number":64,"context_line":"        from dragonflow.common import utils as df_utils"},{"line_number":65,"context_line":"        df_utils.config_parse()"},{"line_number":66,"context_line":"        nb_api \u003d api_nb.NbApi.get_instance(False, True)"},{"line_number":67,"context_line":"        return SkydiveClient(nb_api)"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_ddbafbdc","line":64,"range":{"start_line":64,"start_character":8,"end_line":64,"end_character":55},"in_reply_to":"bf659307_df90bd98","updated":"2018-03-26 07:59:29.000000000","message":"I wanted to scope this, Changed","commit_id":"38619577f7a7320804788007f3a83cf77743fca7"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"c8d673a2d6bc1651c717da4a60be5868d55b42a4","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        self.websocket_client.stop()"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"class WSClientDragonflowProtocol(skydive_client.WSClientDebugProtocol):"},{"line_number":111,"context_line":"    def __init__(self, nb_api):"},{"line_number":112,"context_line":"        super(WSClientDragonflowProtocol, self).__init__()"},{"line_number":113,"context_line":"        self.nb_api \u003d nb_api"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_bfedc926","line":110,"updated":"2018-03-26 05:46:23.000000000","message":"please add docstring to the class","commit_id":"38619577f7a7320804788007f3a83cf77743fca7"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"4d745b9a184e34e0dfddaa563dd2ee982abe9e8a","unresolved":false,"context_lines":[{"line_number":107,"context_line":"        self.websocket_client.stop()"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"class WSClientDragonflowProtocol(skydive_client.WSClientDebugProtocol):"},{"line_number":111,"context_line":"    def __init__(self, nb_api):"},{"line_number":112,"context_line":"        super(WSClientDragonflowProtocol, self).__init__()"},{"line_number":113,"context_line":"        self.nb_api \u003d nb_api"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_e84a9f7e","line":110,"in_reply_to":"bf659307_bfedc926","updated":"2018-03-26 07:59:29.000000000","message":"Done","commit_id":"38619577f7a7320804788007f3a83cf77743fca7"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"8f933e6acc7ae86c55ec78a0fdb952ae4bd05a98","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        # If we have an owner, add the edge from it to this instance"},{"line_number":217,"context_line":"        if WSClientDragonflowProtocol._has_owner(instance):"},{"line_number":218,"context_line":"            return"},{"line_number":219,"context_line":"            # TODO(snapiri) Fix this code as it is not working correctly"},{"line_number":220,"context_line":"            owner_class \u003d mf.get_model(instance.device_owner)"},{"line_number":221,"context_line":"            if not owner_class:"},{"line_number":222,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_ba214da2","line":219,"range":{"start_line":219,"start_character":28,"end_line":219,"end_character":72},"updated":"2018-03-26 05:27:19.000000000","message":"What\u0027s not working correctly? What\u0027s the behaviour?","commit_id":"38619577f7a7320804788007f3a83cf77743fca7"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"45c4987aed98f277021779d60f3ed54d0a5fbcd4","unresolved":false,"context_lines":[{"line_number":216,"context_line":"        # If we have an owner, add the edge from it to this instance"},{"line_number":217,"context_line":"        if WSClientDragonflowProtocol._has_owner(instance):"},{"line_number":218,"context_line":"            return"},{"line_number":219,"context_line":"            # TODO(snapiri) Fix this code as it is not working correctly"},{"line_number":220,"context_line":"            owner_class \u003d mf.get_model(instance.device_owner)"},{"line_number":221,"context_line":"            if not owner_class:"},{"line_number":222,"context_line":"                return"}],"source_content_type":"text/x-python","patch_set":28,"id":"bf659307_7af895c3","line":219,"range":{"start_line":219,"start_character":28,"end_line":219,"end_character":72},"in_reply_to":"bf659307_ba214da2","updated":"2018-03-26 05:43:49.000000000","message":"the owner is not the table name as expected, but rather something like \u0027network:router_gateway\u0027\nHave to think how to use it to get the actual owner","commit_id":"38619577f7a7320804788007f3a83cf77743fca7"}],"dragonflow/conf/df_skydive.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"df_skydive_app_opts \u003d ["},{"line_number":19,"context_line":"    cfg.StrOpt(\u0027analyzer_endpoint\u0027,"},{"line_number":20,"context_line":"               default\u003d\u0027127.0.0.1:8082\u0027,"},{"line_number":21,"context_line":"               help\u003d_(\u0027IP:Port of skydive analyzer.\u0027)),"},{"line_number":22,"context_line":"    cfg.StrOpt(\u0027user\u0027,"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f93b717_19ee0788","line":19,"range":{"start_line":19,"start_character":16,"end_line":19,"end_character":33},"updated":"2018-01-30 06:56:42.000000000","message":"why not split ip and port?","commit_id":"52220102feed6c4cea4e591c9083f41ff1c903eb"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":19,"context_line":"    cfg.StrOpt(\u0027analyzer_endpoint\u0027,"},{"line_number":20,"context_line":"               default\u003d\u0027127.0.0.1:8082\u0027,"},{"line_number":21,"context_line":"               help\u003d_(\u0027IP:Port of skydive analyzer.\u0027)),"},{"line_number":22,"context_line":"    cfg.StrOpt(\u0027user\u0027,"},{"line_number":23,"context_line":"               default\u003d\u0027admin\u0027,"},{"line_number":24,"context_line":"               help\u003d_(\u0027Username to authenticate to the skydive analyzer.\u0027)),"},{"line_number":25,"context_line":"    cfg.StrOpt(\u0027password\u0027,"},{"line_number":26,"context_line":"               help\u003d_(\u0027password to authenticate to the skydive analyzer.\u0027)),"},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027update_interval\u0027,"},{"line_number":28,"context_line":"               default\u003d10,"},{"line_number":29,"context_line":"               help\u003d_(\u0027Interval (in seconds) between data updates.\u0027)),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_fc9be514","line":26,"range":{"start_line":22,"start_character":1,"end_line":26,"end_character":76},"updated":"2018-01-30 06:56:42.000000000","message":"isn\u0027t is too insecure to keep the access information in such way?","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"}],"dragonflow/controller/apps/skydive_agent.py":[{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"89c73cb44cdfeee0fc334fedb1020ebd8ed15ba8","unresolved":false,"context_lines":[{"line_number":23,"context_line":"from dragonflow.db import model_framework as mf"},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":26,"context_line":"SKYDIVE_URL \u003d \"192.168.121.222:8082\""},{"line_number":27,"context_line":"NodeAddedMsgType \u003d \"NodeAdded\""},{"line_number":28,"context_line":"EdgeAddedMsgType \u003d \"EdgeAdded\""},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class WSMessage(object):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1f485f77_a9eff9e7","line":28,"range":{"start_line":26,"start_character":6,"end_line":28,"end_character":25},"updated":"2017-11-09 08:54:15.000000000","message":"Everything is hard-coded.\nI do not expect it to work :)","commit_id":"fd73cf3b98d164703d726d73f21968e2290333d7"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":35,"context_line":"DF_SKYDIVE_NAMESPACE_UUID \u003d uuid.UUID(\u00278a527b24-f0f5-4c1f-8f3d-6de400aa0145\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class WSMessage(object):"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __init__(self, ns, msg_type, obj):"},{"line_number":41,"context_line":"        self.uuid \u003d uuid.uuid4().hex"},{"line_number":42,"context_line":"        self.ns \u003d ns"},{"line_number":43,"context_line":"        self.msg_type \u003d msg_type"},{"line_number":44,"context_line":"        self.obj \u003d obj"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def toJSON(self):"},{"line_number":47,"context_line":"        return jsonutils.dumps("},{"line_number":48,"context_line":"            {"},{"line_number":49,"context_line":"                \"UUID\": self.uuid,"},{"line_number":50,"context_line":"                \"Namespace\": self.ns,"},{"line_number":51,"context_line":"                \"Type\": self.msg_type,"},{"line_number":52,"context_line":"                \"Obj\": self.obj,"},{"line_number":53,"context_line":"            },"},{"line_number":54,"context_line":"        )"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class WSClientDragonflowProtocol(skydive_client.WSClientDebugProtocol):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_912bd180","line":54,"range":{"start_line":38,"start_character":0,"end_line":54,"end_character":9},"updated":"2018-01-28 09:23:41.000000000","message":"I think this can be removed and used from skydive client.","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":35,"context_line":"DF_SKYDIVE_NAMESPACE_UUID \u003d uuid.UUID(\u00278a527b24-f0f5-4c1f-8f3d-6de400aa0145\u0027)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"class WSMessage(object):"},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def __init__(self, ns, msg_type, obj):"},{"line_number":41,"context_line":"        self.uuid \u003d uuid.uuid4().hex"},{"line_number":42,"context_line":"        self.ns \u003d ns"},{"line_number":43,"context_line":"        self.msg_type \u003d msg_type"},{"line_number":44,"context_line":"        self.obj \u003d obj"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"    def toJSON(self):"},{"line_number":47,"context_line":"        return jsonutils.dumps("},{"line_number":48,"context_line":"            {"},{"line_number":49,"context_line":"                \"UUID\": self.uuid,"},{"line_number":50,"context_line":"                \"Namespace\": self.ns,"},{"line_number":51,"context_line":"                \"Type\": self.msg_type,"},{"line_number":52,"context_line":"                \"Obj\": self.obj,"},{"line_number":53,"context_line":"            },"},{"line_number":54,"context_line":"        )"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class WSClientDragonflowProtocol(skydive_client.WSClientDebugProtocol):"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_91bf51cf","line":54,"range":{"start_line":38,"start_character":0,"end_line":54,"end_character":9},"in_reply_to":"5f93b717_912bd180","updated":"2018-01-28 10:07:35.000000000","message":"Done","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def onOpen(self):"},{"line_number":63,"context_line":"        LOG.debug(\u0027onOpen\u0027)"},{"line_number":64,"context_line":"        super(WSClientDragonflowProtocol, self).onOpen()"},{"line_number":65,"context_line":"        df_objects \u003d get_df_objects(self.nb_api)"},{"line_number":66,"context_line":"        LOG.debug(\u0027Sending to skydive: %s\u0027, df_objects)"},{"line_number":67,"context_line":"        for node in df_objects[\"Nodes\"]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_f13b35ce","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":56},"updated":"2018-01-28 09:23:41.000000000","message":"The parent sends something to the server in their onOpen. Do we want that?","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"    def onOpen(self):"},{"line_number":63,"context_line":"        LOG.debug(\u0027onOpen\u0027)"},{"line_number":64,"context_line":"        super(WSClientDragonflowProtocol, self).onOpen()"},{"line_number":65,"context_line":"        df_objects \u003d get_df_objects(self.nb_api)"},{"line_number":66,"context_line":"        LOG.debug(\u0027Sending to skydive: %s\u0027, df_objects)"},{"line_number":67,"context_line":"        for node in df_objects[\"Nodes\"]:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_51b9c9e6","line":64,"range":{"start_line":64,"start_character":0,"end_line":64,"end_character":56},"in_reply_to":"5f93b717_f13b35ce","updated":"2018-01-28 10:07:35.000000000","message":"Done","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        self.stop_when_complete()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def onClose(self, wasClean, code, reason):"},{"line_number":86,"context_line":"        LOG.debug(\"Client closing {was_clean} {code} {reason}\".format("},{"line_number":87,"context_line":"            was_clean\u003dwasClean, code\u003dcode, reason\u003dreason))"},{"line_number":88,"context_line":"        if not wasClean:"},{"line_number":89,"context_line":"            self.factory.loop.stop()"},{"line_number":90,"context_line":"        super(WSClientDragonflowProtocol, self).onClose(wasClean, code, reason)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_517309b2","line":87,"range":{"start_line":86,"start_character":0,"end_line":87,"end_character":58},"updated":"2018-01-28 09:23:41.000000000","message":"LOG doesn\u0027t need explicit formatting. This would also work, and formatting would be done only if debug is on:\n\nLOG.debug(\"Client closing %s %s %s\", wasClean, code, reason)\n\nIf you insist on naming the arguments, this *should* work (but untested):\nLOG.debug(\"Client closing %(was_clean)s %(code)s %(reason)s\", {\u0027was_clean\u0027: wasClean, \u0027code\u0027: code, \u0027reason\u0027: reason})","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        self.stop_when_complete()"},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"    def onClose(self, wasClean, code, reason):"},{"line_number":86,"context_line":"        LOG.debug(\"Client closing {was_clean} {code} {reason}\".format("},{"line_number":87,"context_line":"            was_clean\u003dwasClean, code\u003dcode, reason\u003dreason))"},{"line_number":88,"context_line":"        if not wasClean:"},{"line_number":89,"context_line":"            self.factory.loop.stop()"},{"line_number":90,"context_line":"        super(WSClientDragonflowProtocol, self).onClose(wasClean, code, reason)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_11cb4172","line":87,"range":{"start_line":86,"start_character":0,"end_line":87,"end_character":58},"in_reply_to":"5f93b717_517309b2","updated":"2018-01-28 10:07:35.000000000","message":"Done","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        LOG.debug(\u0027SKYDIVE AGENT STARTED\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def update_skydive_analyzer(self):"},{"line_number":103,"context_line":"        update_skydive_analyzer(self.nb_api)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"# FIXME (snapiri) This is here as the skydive keystone authentication is"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_f169f5bd","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":44},"updated":"2018-01-28 09:23:41.000000000","message":"In a future patch, maybe re-use the connection to skydive?","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        LOG.debug(\u0027SKYDIVE AGENT STARTED\u0027)"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    def update_skydive_analyzer(self):"},{"line_number":103,"context_line":"        update_skydive_analyzer(self.nb_api)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"# FIXME (snapiri) This is here as the skydive keystone authentication is"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_b1c92d79","line":103,"range":{"start_line":103,"start_character":0,"end_line":103,"end_character":44},"in_reply_to":"5f93b717_f169f5bd","updated":"2018-01-28 10:07:35.000000000","message":"Will consider","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"def add_edge_message(edges, nb_api, instance, field):"},{"line_number":136,"context_line":"    if isinstance(field, model_proxy._ModelProxyBase):"},{"line_number":137,"context_line":"        field \u003d nb_api.get(field)"},{"line_number":138,"context_line":"    id_str \u003d \u0027{}-\u003e{}\u0027.format(instance.id, field.id)"},{"line_number":139,"context_line":"    metadata \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_919e71b6","line":136,"range":{"start_line":136,"start_character":0,"end_line":136,"end_character":54},"updated":"2018-01-28 09:23:41.000000000","message":"model_proxy now has an \u0027is_model_proxy\u0027 function, which does exactly this. Using it means you don\u0027t have to access a private member.","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":133,"context_line":""},{"line_number":134,"context_line":""},{"line_number":135,"context_line":"def add_edge_message(edges, nb_api, instance, field):"},{"line_number":136,"context_line":"    if isinstance(field, model_proxy._ModelProxyBase):"},{"line_number":137,"context_line":"        field \u003d nb_api.get(field)"},{"line_number":138,"context_line":"    id_str \u003d \u0027{}-\u003e{}\u0027.format(instance.id, field.id)"},{"line_number":139,"context_line":"    metadata \u003d {"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_d1c4f961","line":136,"range":{"start_line":136,"start_character":0,"end_line":136,"end_character":54},"in_reply_to":"5f93b717_919e71b6","updated":"2018-01-28 10:07:35.000000000","message":"Done. Needed this one :)","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        \u0027ID\u0027: str(uuid.uuid5(DF_SKYDIVE_NAMESPACE_UUID, id_str)),"},{"line_number":146,"context_line":"        \u0027Child\u0027: \"DF-{}\".format(instance.id),"},{"line_number":147,"context_line":"        \u0027Parent\u0027: \"DF-{}\".format(field.id),"},{"line_number":148,"context_line":"        \u0027Host\u0027: \u0027dragonflow\u0027,"},{"line_number":149,"context_line":"        \u0027Metadata\u0027: metadata"},{"line_number":150,"context_line":"    }"},{"line_number":151,"context_line":"    edges.append(result)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_11aa61d1","line":148,"range":{"start_line":148,"start_character":0,"end_line":148,"end_character":29},"updated":"2018-01-28 09:23:41.000000000","message":"nit: Maybe host should be taken from chassis name / hostname?","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":145,"context_line":"        \u0027ID\u0027: str(uuid.uuid5(DF_SKYDIVE_NAMESPACE_UUID, id_str)),"},{"line_number":146,"context_line":"        \u0027Child\u0027: \"DF-{}\".format(instance.id),"},{"line_number":147,"context_line":"        \u0027Parent\u0027: \"DF-{}\".format(field.id),"},{"line_number":148,"context_line":"        \u0027Host\u0027: \u0027dragonflow\u0027,"},{"line_number":149,"context_line":"        \u0027Metadata\u0027: metadata"},{"line_number":150,"context_line":"    }"},{"line_number":151,"context_line":"    edges.append(result)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_71a165a9","line":148,"range":{"start_line":148,"start_character":0,"end_line":148,"end_character":29},"in_reply_to":"5f93b717_11aa61d1","updated":"2018-01-28 10:07:35.000000000","message":"That would require to track which host or chassis this edge belongs to (somewhere along the way)... I do not think it is worth the effort at this point.","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    result \u003d {"},{"line_number":184,"context_line":"        \u0027Metadata\u0027: metadata,"},{"line_number":185,"context_line":"        \u0027ID\u0027: \"DF-{}\".format(instance.id),"},{"line_number":186,"context_line":"        \u0027Host\u0027: \u0027dragonflow\u0027}"},{"line_number":187,"context_line":"    nodes.append(result)"},{"line_number":188,"context_line":"    output_table_node_edges(edges, nb_api, instance)"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_b1b84d2a","line":186,"range":{"start_line":186,"start_character":0,"end_line":186,"end_character":29},"updated":"2018-01-28 09:23:41.000000000","message":"nit: Same here re: Host value","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    result \u003d {"},{"line_number":184,"context_line":"        \u0027Metadata\u0027: metadata,"},{"line_number":185,"context_line":"        \u0027ID\u0027: \"DF-{}\".format(instance.id),"},{"line_number":186,"context_line":"        \u0027Host\u0027: \u0027dragonflow\u0027}"},{"line_number":187,"context_line":"    nodes.append(result)"},{"line_number":188,"context_line":"    output_table_node_edges(edges, nb_api, instance)"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_31abdd89","line":186,"range":{"start_line":186,"start_character":0,"end_line":186,"end_character":29},"in_reply_to":"5f93b717_b1b84d2a","updated":"2018-01-28 10:07:35.000000000","message":"Same as above","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e974816af43822cefe8de0e4f2d8c473d27bfaef","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    return result"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"def main():"},{"line_number":211,"context_line":"    import logging"},{"line_number":212,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":213,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":214,"context_line":"    from dragonflow.common import utils as df_utils"},{"line_number":215,"context_line":"    df_utils.config_parse()"},{"line_number":216,"context_line":"    nb_api \u003d api_nb.NbApi.get_instance(False)"},{"line_number":217,"context_line":"    update_skydive_analyzer(nb_api)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":221,"context_line":"    eventlet.monkey_patch()"},{"line_number":222,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_b1912d9c","line":222,"range":{"start_line":210,"start_character":0,"end_line":222,"end_character":10},"updated":"2018-01-28 09:23:41.000000000","message":"Maybe move this to a standalone file in the cli/ folder? It can then be exported in setup.cfg as well, and eventlet.monkey_patch can be called automatically via the __init__.py already there.","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"a725ecbcc724449025ababa758971c113537bb79","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    return result"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"def main():"},{"line_number":211,"context_line":"    import logging"},{"line_number":212,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":213,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":214,"context_line":"    from dragonflow.common import utils as df_utils"},{"line_number":215,"context_line":"    df_utils.config_parse()"},{"line_number":216,"context_line":"    nb_api \u003d api_nb.NbApi.get_instance(False)"},{"line_number":217,"context_line":"    update_skydive_analyzer(nb_api)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":221,"context_line":"    eventlet.monkey_patch()"},{"line_number":222,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_65b9952c","line":222,"range":{"start_line":210,"start_character":0,"end_line":222,"end_character":10},"in_reply_to":"5f93b717_51aea998","updated":"2018-01-29 06:10:16.000000000","message":"Agreed","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"92c36825bfb82fcce2b9a40813bd6f74450fdd6f","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    return result"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"def main():"},{"line_number":211,"context_line":"    import logging"},{"line_number":212,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":213,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":214,"context_line":"    from dragonflow.common import utils as df_utils"},{"line_number":215,"context_line":"    df_utils.config_parse()"},{"line_number":216,"context_line":"    nb_api \u003d api_nb.NbApi.get_instance(False)"},{"line_number":217,"context_line":"    update_skydive_analyzer(nb_api)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":221,"context_line":"    eventlet.monkey_patch()"},{"line_number":222,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_d9373fe3","line":222,"range":{"start_line":210,"start_character":0,"end_line":222,"end_character":10},"in_reply_to":"5f93b717_51aea998","updated":"2018-01-28 11:41:53.000000000","message":"Good enough. We can always move it later.","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"d755787e1a7b44614bfada2b08f837e4309b91c2","unresolved":false,"context_lines":[{"line_number":207,"context_line":"    return result"},{"line_number":208,"context_line":""},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"def main():"},{"line_number":211,"context_line":"    import logging"},{"line_number":212,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":213,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":214,"context_line":"    from dragonflow.common import utils as df_utils"},{"line_number":215,"context_line":"    df_utils.config_parse()"},{"line_number":216,"context_line":"    nb_api \u003d api_nb.NbApi.get_instance(False)"},{"line_number":217,"context_line":"    update_skydive_analyzer(nb_api)"},{"line_number":218,"context_line":""},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"if __name__ \u003d\u003d \u0027__main__\u0027:"},{"line_number":221,"context_line":"    eventlet.monkey_patch()"},{"line_number":222,"context_line":"    main()"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f93b717_51aea998","line":222,"range":{"start_line":210,"start_character":0,"end_line":222,"end_character":10},"in_reply_to":"5f93b717_b1912d9c","updated":"2018-01-28 10:07:35.000000000","message":"This is entirely a debugging tool. In the general case it should be run from the controller, so I do not think we should make it available for everyone.","commit_id":"9eec957d988f448c7933be61b2c7e275ff87b030"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":31,"context_line":"LOG \u003d log.getLogger(__name__)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"DRAGONFLOW_HOST_ID \u003d \u0027dragonflow-skydive\u0027"},{"line_number":34,"context_line":"DF_SKYDIVE_NAMESPACE_UUID \u003d uuid.UUID(\u00278a527b24-f0f5-4c1f-8f3d-6de400aa0145\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class WSClientDragonflowProtocol(skydive_client.WSClientDebugProtocol):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f93b717_99f9b74e","line":34,"range":{"start_line":34,"start_character":39,"end_line":34,"end_character":75},"updated":"2018-01-30 06:56:42.000000000","message":"what is this magic number?","commit_id":"52220102feed6c4cea4e591c9083f41ff1c903eb"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"a9fe17969d1625b0bcd90a28cf8bdaf7c557dbed","unresolved":false,"context_lines":[{"line_number":34,"context_line":"DF_SKYDIVE_NAMESPACE_UUID \u003d uuid.UUID(\u00278a527b24-f0f5-4c1f-8f3d-6de400aa0145\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class WSClientDragonflowProtocol(skydive_client.WSClientDebugProtocol):"},{"line_number":38,"context_line":"    def __init__(self, nb_api):"},{"line_number":39,"context_line":"        super(WSClientDragonflowProtocol, self).__init__()"},{"line_number":40,"context_line":"        self.nb_api \u003d nb_api"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_3bf40586","line":37,"updated":"2018-01-29 16:18:32.000000000","message":"maybe insert all classes that created the message into the protocol class?","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"58aef1227960da79fe116cc1482a761012c0098e","unresolved":false,"context_lines":[{"line_number":34,"context_line":"DF_SKYDIVE_NAMESPACE_UUID \u003d uuid.UUID(\u00278a527b24-f0f5-4c1f-8f3d-6de400aa0145\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class WSClientDragonflowProtocol(skydive_client.WSClientDebugProtocol):"},{"line_number":38,"context_line":"    def __init__(self, nb_api):"},{"line_number":39,"context_line":"        super(WSClientDragonflowProtocol, self).__init__()"},{"line_number":40,"context_line":"        self.nb_api \u003d nb_api"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_5fbd02d6","line":37,"in_reply_to":"5f93b717_3bf40586","updated":"2018-01-31 12:40:05.000000000","message":"Not sure I understand","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":34,"context_line":"DF_SKYDIVE_NAMESPACE_UUID \u003d uuid.UUID(\u00278a527b24-f0f5-4c1f-8f3d-6de400aa0145\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class WSClientDragonflowProtocol(skydive_client.WSClientDebugProtocol):"},{"line_number":38,"context_line":"    def __init__(self, nb_api):"},{"line_number":39,"context_line":"        super(WSClientDragonflowProtocol, self).__init__()"},{"line_number":40,"context_line":"        self.nb_api \u003d nb_api"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_9c9c210f","line":37,"in_reply_to":"5f93b717_3bf40586","updated":"2018-01-30 06:56:42.000000000","message":"Please add docstring","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"58aef1227960da79fe116cc1482a761012c0098e","unresolved":false,"context_lines":[{"line_number":34,"context_line":"DF_SKYDIVE_NAMESPACE_UUID \u003d uuid.UUID(\u00278a527b24-f0f5-4c1f-8f3d-6de400aa0145\u0027)"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class WSClientDragonflowProtocol(skydive_client.WSClientDebugProtocol):"},{"line_number":38,"context_line":"    def __init__(self, nb_api):"},{"line_number":39,"context_line":"        super(WSClientDragonflowProtocol, self).__init__()"},{"line_number":40,"context_line":"        self.nb_api \u003d nb_api"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_9fedcaf1","line":37,"in_reply_to":"5f93b717_9c9c210f","updated":"2018-01-31 12:40:05.000000000","message":"Will add later","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super(WSClientDragonflowProtocol, self).__init__()"},{"line_number":40,"context_line":"        self.nb_api \u003d nb_api"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def onOpen(self):"},{"line_number":43,"context_line":"        LOG.debug(\u0027onOpen\u0027)"},{"line_number":44,"context_line":"        df_objects \u003d get_df_objects(self.nb_api)"},{"line_number":45,"context_line":"        LOG.debug(\u0027Sending to skydive: %s\u0027, df_objects)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_fc69a5f8","line":42,"updated":"2018-01-30 06:56:42.000000000","message":"docstring will be helpful","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"58aef1227960da79fe116cc1482a761012c0098e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        super(WSClientDragonflowProtocol, self).__init__()"},{"line_number":40,"context_line":"        self.nb_api \u003d nb_api"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def onOpen(self):"},{"line_number":43,"context_line":"        LOG.debug(\u0027onOpen\u0027)"},{"line_number":44,"context_line":"        df_objects \u003d get_df_objects(self.nb_api)"},{"line_number":45,"context_line":"        LOG.debug(\u0027Sending to skydive: %s\u0027, df_objects)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_ffe40e0f","line":42,"in_reply_to":"5f93b717_fc69a5f8","updated":"2018-01-31 12:40:05.000000000","message":"Will add later...","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.nb_api \u003d nb_api"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def onOpen(self):"},{"line_number":43,"context_line":"        LOG.debug(\u0027onOpen\u0027)"},{"line_number":44,"context_line":"        df_objects \u003d get_df_objects(self.nb_api)"},{"line_number":45,"context_line":"        LOG.debug(\u0027Sending to skydive: %s\u0027, df_objects)"},{"line_number":46,"context_line":"        for node in df_objects[\"Nodes\"]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_bcba3d6b","line":43,"updated":"2018-01-30 06:56:42.000000000","message":"I do not think it adds additional info given there is a debug message on line 45","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"58aef1227960da79fe116cc1482a761012c0098e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"        self.nb_api \u003d nb_api"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"    def onOpen(self):"},{"line_number":43,"context_line":"        LOG.debug(\u0027onOpen\u0027)"},{"line_number":44,"context_line":"        df_objects \u003d get_df_objects(self.nb_api)"},{"line_number":45,"context_line":"        LOG.debug(\u0027Sending to skydive: %s\u0027, df_objects)"},{"line_number":46,"context_line":"        for node in df_objects[\"Nodes\"]:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_dfe7d211","line":43,"in_reply_to":"5f93b717_bcba3d6b","updated":"2018-01-31 12:40:05.000000000","message":"There are a lot of temporary debug prints.\nThis is a WIP..","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    return authtok"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"def update_skydive_analyzer(nb_api):"},{"line_number":101,"context_line":"    protocol \u003d WSClientDragonflowProtocol(nb_api)"},{"line_number":102,"context_line":"    authtok \u003d login()"},{"line_number":103,"context_line":"    client \u003d skydive_client.WSClient("}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_9c38a1ee","line":100,"updated":"2018-01-30 06:56:42.000000000","message":"Why is this not the method of the App?","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"58aef1227960da79fe116cc1482a761012c0098e","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    return authtok"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"def update_skydive_analyzer(nb_api):"},{"line_number":101,"context_line":"    protocol \u003d WSClientDragonflowProtocol(nb_api)"},{"line_number":102,"context_line":"    authtok \u003d login()"},{"line_number":103,"context_line":"    client \u003d skydive_client.WSClient("}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_df4b5228","line":100,"in_reply_to":"5f93b717_9c38a1ee","updated":"2018-01-31 12:40:05.000000000","message":"The App only runs in the context of the controller as it inherits from DFApp.\nI want this code to run from a main() as well","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    client.start()"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"def add_edge_message(edges, nb_api, instance, field):"},{"line_number":115,"context_line":"    if model_proxy.is_model_proxy(field):"},{"line_number":116,"context_line":"        field \u003d nb_api.get(field)"},{"line_number":117,"context_line":"    id_str \u003d \u0027{}-\u003e{}\u0027.format(instance.id, field.id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_1c2c91aa","line":114,"updated":"2018-01-30 06:56:42.000000000","message":"ditto","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"58aef1227960da79fe116cc1482a761012c0098e","unresolved":false,"context_lines":[{"line_number":111,"context_line":"    client.start()"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"def add_edge_message(edges, nb_api, instance, field):"},{"line_number":115,"context_line":"    if model_proxy.is_model_proxy(field):"},{"line_number":116,"context_line":"        field \u003d nb_api.get(field)"},{"line_number":117,"context_line":"    id_str \u003d \u0027{}-\u003e{}\u0027.format(instance.id, field.id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_9f6aaa7e","line":114,"in_reply_to":"5f93b717_1c2c91aa","updated":"2018-01-31 12:40:05.000000000","message":"I have wrapped it in another class","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"a9fe17969d1625b0bcd90a28cf8bdaf7c557dbed","unresolved":false,"context_lines":[{"line_number":189,"context_line":"def main():"},{"line_number":190,"context_line":"    import logging"},{"line_number":191,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":192,"context_line":"    global LOG"},{"line_number":193,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":194,"context_line":"    from dragonflow.common import utils as df_utils"},{"line_number":195,"context_line":"    df_utils.config_parse()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_5be23131","line":192,"updated":"2018-01-29 16:18:32.000000000","message":"Why import and global declaration  are not in the head of the file?","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"58aef1227960da79fe116cc1482a761012c0098e","unresolved":false,"context_lines":[{"line_number":189,"context_line":"def main():"},{"line_number":190,"context_line":"    import logging"},{"line_number":191,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":192,"context_line":"    global LOG"},{"line_number":193,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":194,"context_line":"    from dragonflow.common import utils as df_utils"},{"line_number":195,"context_line":"    df_utils.config_parse()"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_9fff0aaa","line":192,"in_reply_to":"5f93b717_5be23131","updated":"2018-01-31 12:40:05.000000000","message":"The logging mechanisms used in each case are different.\nIn one case it is oslo logging and here it is python logging.","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"a9fe17969d1625b0bcd90a28cf8bdaf7c557dbed","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":192,"context_line":"    global LOG"},{"line_number":193,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":194,"context_line":"    from dragonflow.common import utils as df_utils"},{"line_number":195,"context_line":"    df_utils.config_parse()"},{"line_number":196,"context_line":"    nb_api \u003d api_nb.NbApi.get_instance(False)"},{"line_number":197,"context_line":"    update_skydive_analyzer(nb_api)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_bbcc95bc","line":194,"updated":"2018-01-29 16:18:32.000000000","message":"same here","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"5d5ac5d79d4f217ece18f05647a68c739cf906d8","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":192,"context_line":"    global LOG"},{"line_number":193,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":194,"context_line":"    from dragonflow.common import utils as df_utils"},{"line_number":195,"context_line":"    df_utils.config_parse()"},{"line_number":196,"context_line":"    nb_api \u003d api_nb.NbApi.get_instance(False)"},{"line_number":197,"context_line":"    update_skydive_analyzer(nb_api)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_dc1b897e","line":194,"in_reply_to":"5f93b717_bbcc95bc","updated":"2018-01-30 06:56:42.000000000","message":"+1","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"58aef1227960da79fe116cc1482a761012c0098e","unresolved":false,"context_lines":[{"line_number":191,"context_line":"    logging.basicConfig(level\u003dlogging.DEBUG)"},{"line_number":192,"context_line":"    global LOG"},{"line_number":193,"context_line":"    LOG \u003d logging.getLogger(__name__)"},{"line_number":194,"context_line":"    from dragonflow.common import utils as df_utils"},{"line_number":195,"context_line":"    df_utils.config_parse()"},{"line_number":196,"context_line":"    nb_api \u003d api_nb.NbApi.get_instance(False)"},{"line_number":197,"context_line":"    update_skydive_analyzer(nb_api)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5f93b717_bffc46b5","line":194,"in_reply_to":"5f93b717_dc1b897e","updated":"2018-01-31 12:40:05.000000000","message":"ditto","commit_id":"c5b1fb84a9d90aa89731b91b7f68ee5501bb88ef"}],"dragonflow/db/model_framework.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"25d7374c67ddd025ef950de93846d8279dc844f5","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        yield key"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"def get_table_class(table_name):"},{"line_number":455,"context_line":"    \u0027\u0027\u0027Returns the class of the objects stored in a table"},{"line_number":456,"context_line":"    :param table_name: The name of the table to look"},{"line_number":457,"context_line":"    :type table_name: string"}],"source_content_type":"text/x-python","patch_set":26,"id":"df7087c5_b83c95e1","line":454,"range":{"start_line":454,"start_character":4,"end_line":454,"end_character":19},"updated":"2018-03-22 15:22:36.000000000","message":"In what scenario should this class be used rather than get_model?","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"c7161a269ce5c63d4b80efffc1bf96632534a240","unresolved":false,"context_lines":[{"line_number":451,"context_line":"        yield key"},{"line_number":452,"context_line":""},{"line_number":453,"context_line":""},{"line_number":454,"context_line":"def get_table_class(table_name):"},{"line_number":455,"context_line":"    \u0027\u0027\u0027Returns the class of the objects stored in a table"},{"line_number":456,"context_line":"    :param table_name: The name of the table to look"},{"line_number":457,"context_line":"    :type table_name: string"}],"source_content_type":"text/x-python","patch_set":26,"id":"bf659307_a4ef0086","line":454,"range":{"start_line":454,"start_character":4,"end_line":454,"end_character":19},"in_reply_to":"df7087c5_b83c95e1","updated":"2018-03-25 09:58:31.000000000","message":"Removed","commit_id":"1e8cdc62001a8dbc739c8dab75f2f85058e3457e"}]}
