)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"beda450320daef195483c4ed8166fc8247990be7","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2018-02-14 09:14:39 +0200"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"New application framework"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I81ee47b0c6e741888b3446602cca5e1835c9ae2f"},{"line_number":10,"context_line":"Related-Bug: #1738986"},{"line_number":11,"context_line":"Co-Authored-By: Lihi Wishnitzer \u003clihiwish@gmail.com\u003e"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":20,"id":"3fa0c359_cffb5bbb","line":8,"updated":"2018-02-14 10:16:27.000000000","message":"Can you please add more details on this commit content?","commit_id":"817f3ac2c86832b9422aeedbc7b0f007658f1571"}],"dragonflow/conf/df_common_params.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"beda450320daef195483c4ed8166fc8247990be7","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    #               auto-allocated."},{"line_number":185,"context_line":"    cfg.IntOpt(\u0027datapath_autoalloc_table_offset\u0027,"},{"line_number":186,"context_line":"               default\u003d200,"},{"line_number":187,"context_line":"               help\u003d_(\u0027Start offset for new datapath application tables\u0027)),"},{"line_number":188,"context_line":"]"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa0c359_af192f22","line":187,"updated":"2018-02-14 10:16:27.000000000","message":"why is this config parameter?","commit_id":"817f3ac2c86832b9422aeedbc7b0f007658f1571"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"949d3e00a635a0f06114ac3e210e28e1c4c074f6","unresolved":false,"context_lines":[{"line_number":184,"context_line":"    #               auto-allocated."},{"line_number":185,"context_line":"    cfg.IntOpt(\u0027datapath_autoalloc_table_offset\u0027,"},{"line_number":186,"context_line":"               default\u003d200,"},{"line_number":187,"context_line":"               help\u003d_(\u0027Start offset for new datapath application tables\u0027)),"},{"line_number":188,"context_line":"]"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa0c359_d7d20d00","line":187,"in_reply_to":"3fa0c359_af192f22","updated":"2018-02-14 12:36:21.000000000","message":"For the time-being, we allow both old-style and new-style applications, and the operator has full control over which apps are loaded. If there\u0027s a 3rd party app using the 200+ range we designated for auto-allocation, we allow him here to move it around a bit.","commit_id":"817f3ac2c86832b9422aeedbc7b0f007658f1571"}],"dragonflow/controller/app_base.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    return decorator"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Contract \u003d collections.namedtuple("},{"line_number":39,"context_line":"    \u0027Contract\u0027,"},{"line_number":40,"context_line":"    (\u0027states\u0027, \u0027entrypoints\u0027, \u0027exitpoints\u0027, \u0027public_mapping\u0027,"},{"line_number":41,"context_line":"     \u0027private_mapping\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_19b611fc","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":8},"updated":"2018-01-14 11:45:26.000000000","message":"Please put the definition of Contract before its usage.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    return decorator"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"Contract \u003d collections.namedtuple("},{"line_number":39,"context_line":"    \u0027Contract\u0027,"},{"line_number":40,"context_line":"    (\u0027states\u0027, \u0027entrypoints\u0027, \u0027exitpoints\u0027, \u0027public_mapping\u0027,"},{"line_number":41,"context_line":"     \u0027private_mapping\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_1a9caebe","line":38,"range":{"start_line":38,"start_character":0,"end_line":38,"end_character":8},"in_reply_to":"7f96bb07_19b611fc","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":38,"context_line":"Contract \u003d collections.namedtuple("},{"line_number":39,"context_line":"    \u0027Contract\u0027,"},{"line_number":40,"context_line":"    (\u0027states\u0027, \u0027entrypoints\u0027, \u0027exitpoints\u0027, \u0027public_mapping\u0027,"},{"line_number":41,"context_line":"     \u0027private_mapping\u0027),"},{"line_number":42,"context_line":")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_7225905b","line":41,"updated":"2018-01-09 14:55:17.000000000","message":"why private mapping should be part of the contract?  isn\u0027t that just for internal use ?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"Contract \u003d collections.namedtuple("},{"line_number":39,"context_line":"    \u0027Contract\u0027,"},{"line_number":40,"context_line":"    (\u0027states\u0027, \u0027entrypoints\u0027, \u0027exitpoints\u0027, \u0027public_mapping\u0027,"},{"line_number":41,"context_line":"     \u0027private_mapping\u0027),"},{"line_number":42,"context_line":")"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_3a888a6f","line":41,"in_reply_to":"9f91af0f_7225905b","updated":"2018-01-15 14:23:01.000000000","message":"It is for internal use, but we have to know what registers have to be evicted during application operation on the packet. It doesn\u0027t have to be a mapping, but we at least need a list of all regs used.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":54,"context_line":")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"AppConfig \u003d collections.namedtuple("},{"line_number":57,"context_line":"    \u0027AppConfig\u0027,  # FIXME"},{"line_number":58,"context_line":"    (\u0027states\u0027, \u0027exitpoints\u0027, \u0027entrypoints\u0027, \u0027full_mapping\u0027),"},{"line_number":59,"context_line":")"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_d9cf497d","line":57,"range":{"start_line":57,"start_character":20,"end_line":57,"end_character":25},"updated":"2018-01-14 11:45:26.000000000","message":"FIXME needs more info.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":54,"context_line":")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"AppConfig \u003d collections.namedtuple("},{"line_number":57,"context_line":"    \u0027AppConfig\u0027,  # FIXME"},{"line_number":58,"context_line":"    (\u0027states\u0027, \u0027exitpoints\u0027, \u0027entrypoints\u0027, \u0027full_mapping\u0027),"},{"line_number":59,"context_line":")"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_d20b3cd3","line":57,"updated":"2018-01-09 14:55:17.000000000","message":"what the diffrent between app config and contract ?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":54,"context_line":")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"AppConfig \u003d collections.namedtuple("},{"line_number":57,"context_line":"    \u0027AppConfig\u0027,  # FIXME"},{"line_number":58,"context_line":"    (\u0027states\u0027, \u0027exitpoints\u0027, \u0027entrypoints\u0027, \u0027full_mapping\u0027),"},{"line_number":59,"context_line":")"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_bac1fa82","line":57,"range":{"start_line":57,"start_character":20,"end_line":57,"end_character":25},"in_reply_to":"7f96bb07_d9cf497d","updated":"2018-01-15 14:23:01.000000000","message":"We\u0027re looking for a name better suited than App Config. Suggestions welcome. (Will remove fixme by the time this is ready for a merge).","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":54,"context_line":")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"AppConfig \u003d collections.namedtuple("},{"line_number":57,"context_line":"    \u0027AppConfig\u0027,  # FIXME"},{"line_number":58,"context_line":"    (\u0027states\u0027, \u0027exitpoints\u0027, \u0027entrypoints\u0027, \u0027full_mapping\u0027),"},{"line_number":59,"context_line":")"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_3ad64a51","line":57,"in_reply_to":"9f91af0f_d20b3cd3","updated":"2018-01-15 14:23:01.000000000","message":"App config is an instantiation of a contract. A contract defines what \"IDs\" are defined for an app, and the config binds them to specifically allocated numbers.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"bb425c0671a422d2816b7dfdde05018a4df7cecb","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    (\u0027name\u0027, \u0027provides\u0027),"},{"line_number":54,"context_line":")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"AppConfig \u003d collections.namedtuple("},{"line_number":57,"context_line":"    \u0027AppConfig\u0027,  # FIXME"},{"line_number":58,"context_line":"    (\u0027states\u0027, \u0027exitpoints\u0027, \u0027entrypoints\u0027, \u0027full_mapping\u0027),"},{"line_number":59,"context_line":")"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_42a8e48b","line":56,"range":{"start_line":56,"start_character":0,"end_line":56,"end_character":9},"updated":"2018-01-16 12:44:58.000000000","message":"What about the following options: Application, ApplicationData, ApplicationRecord.","commit_id":"ba2cbbde6fb4c0a9f9212528f38db994d0966657"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"beda450320daef195483c4ed8166fc8247990be7","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    (\u0027name\u0027, \u0027provides\u0027),"},{"line_number":54,"context_line":")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"DpAlloc \u003d collections.namedtuple("},{"line_number":57,"context_line":"    \u0027DpAlloc\u0027,  # FIXME (dimak) find a better name"},{"line_number":58,"context_line":"    (\u0027states\u0027, \u0027exitpoints\u0027, \u0027entrypoints\u0027, \u0027full_mapping\u0027),"},{"line_number":59,"context_line":")"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa0c359_0fe4e30b","line":56,"range":{"start_line":56,"start_character":0,"end_line":56,"end_character":7},"updated":"2018-02-14 10:16:27.000000000","message":"Isn\u0027t it Dp Spec?","commit_id":"817f3ac2c86832b9422aeedbc7b0f007658f1571"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"949d3e00a635a0f06114ac3e210e28e1c4c074f6","unresolved":false,"context_lines":[{"line_number":53,"context_line":"    (\u0027name\u0027, \u0027provides\u0027),"},{"line_number":54,"context_line":")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"DpAlloc \u003d collections.namedtuple("},{"line_number":57,"context_line":"    \u0027DpAlloc\u0027,  # FIXME (dimak) find a better name"},{"line_number":58,"context_line":"    (\u0027states\u0027, \u0027exitpoints\u0027, \u0027entrypoints\u0027, \u0027full_mapping\u0027),"},{"line_number":59,"context_line":")"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa0c359_5716fda9","line":56,"range":{"start_line":56,"start_character":0,"end_line":56,"end_character":7},"in_reply_to":"3fa0c359_0fe4e30b","updated":"2018-02-14 12:36:21.000000000","message":"We discussed this offline at length, and managed to agree on this name. The object itself is not the specification. It is rather the instance/fulfillment of the app\u0027s specification.","commit_id":"817f3ac2c86832b9422aeedbc7b0f007658f1571"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"beda450320daef195483c4ed8166fc8247990be7","unresolved":false,"context_lines":[{"line_number":54,"context_line":")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":"DpAlloc \u003d collections.namedtuple("},{"line_number":57,"context_line":"    \u0027DpAlloc\u0027,  # FIXME (dimak) find a better name"},{"line_number":58,"context_line":"    (\u0027states\u0027, \u0027exitpoints\u0027, \u0027entrypoints\u0027, \u0027full_mapping\u0027),"},{"line_number":59,"context_line":")"},{"line_number":60,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa0c359_cfe91be3","line":57,"updated":"2018-02-14 10:16:27.000000000","message":"Please resolve before merging","commit_id":"817f3ac2c86832b9422aeedbc7b0f007658f1571"}],"dragonflow/controller/app_wiring.py":[{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"dfde91fd165cbb6e4e364aa3aa28a322de7f2714","unresolved":false,"context_lines":[{"line_number":12,"context_line":"import collections"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"DatapathElement \u003d collections.namedtuple("},{"line_number":16,"context_line":"    \u0027DatapathElement\u0027,"},{"line_number":17,"context_line":"    (\u0027name\u0027, \u0027type\u0027, \u0027params\u0027),"},{"line_number":18,"context_line":")"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf8cb3f7_836f43c4","line":15,"updated":"2017-12-21 14:02:32.000000000","message":"is this apps ? \nWhat is the meaning of type and params?","commit_id":"61aaad2ea6c4caa1649b5f8abb85c97fa25b4ae4"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"dfde91fd165cbb6e4e364aa3aa28a322de7f2714","unresolved":false,"context_lines":[{"line_number":29,"context_line":"        return cls(*val.split(\u0027:\u0027))"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"DatapathWire \u003d collections.namedtuple("},{"line_number":33,"context_line":"    \u0027DatapathWire\u0027,"},{"line_number":34,"context_line":"    (\u0027exitpoint\u0027, \u0027entrypoint\u0027),"},{"line_number":35,"context_line":")"}],"source_content_type":"text/x-python","patch_set":1,"id":"bf8cb3f7_a804a67c","line":32,"updated":"2017-12-21 14:02:32.000000000","message":"Is entry point and exist point is connectors?","commit_id":"61aaad2ea6c4caa1649b5f8abb85c97fa25b4ae4"}],"dragonflow/controller/datapath.py":[{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"020364379bbaa02750be55cfb18397c11c88e065","unresolved":false,"context_lines":[{"line_number":36,"context_line":"class Datapath(object):"},{"line_number":37,"context_line":"    def __init__(self, layout):"},{"line_number":38,"context_line":"        self._layout \u003d layout"},{"line_number":39,"context_line":"        self._apps \u003d {}  # FIXME may be unneeded"},{"line_number":40,"context_line":"        self._configs \u003d {}"},{"line_number":41,"context_line":"        self._public_variables \u003d set()"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_57db9e7a","line":39,"range":{"start_line":39,"start_character":25,"end_line":39,"end_character":48},"updated":"2018-01-09 13:40:16.000000000","message":"I see it used in lines 59, 64, why is it unneeded?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":36,"context_line":"class Datapath(object):"},{"line_number":37,"context_line":"    def __init__(self, layout):"},{"line_number":38,"context_line":"        self._layout \u003d layout"},{"line_number":39,"context_line":"        self._apps \u003d {}  # FIXME may be unneeded"},{"line_number":40,"context_line":"        self._configs \u003d {}"},{"line_number":41,"context_line":"        self._public_variables \u003d set()"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_da0f26df","line":39,"range":{"start_line":39,"start_character":25,"end_line":39,"end_character":48},"in_reply_to":"9f91af0f_57db9e7a","updated":"2018-01-15 14:23:01.000000000","message":"Removed in a future PS","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self._layout \u003d layout"},{"line_number":39,"context_line":"        self._apps \u003d {}  # FIXME may be unneeded"},{"line_number":40,"context_line":"        self._configs \u003d {}"},{"line_number":41,"context_line":"        self._public_variables \u003d set()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def set_up(self, ryu_base, vswitch_api, nb_api, notifier):"},{"line_number":44,"context_line":"        self._dp \u003d ryu_base.datapath"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_668075c0","line":41,"range":{"start_line":41,"start_character":13,"end_line":41,"end_character":30},"updated":"2018-01-09 14:55:17.000000000","message":"maybe more informative name ?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"465f8215d9894c355fd5fc7b1fc74d531fa32c88","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self._layout \u003d layout"},{"line_number":39,"context_line":"        self._apps \u003d {}  # FIXME may be unneeded"},{"line_number":40,"context_line":"        self._configs \u003d {}"},{"line_number":41,"context_line":"        self._public_variables \u003d set()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def set_up(self, ryu_base, vswitch_api, nb_api, notifier):"},{"line_number":44,"context_line":"        self._dp \u003d ryu_base.datapath"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_4e4338b0","line":41,"range":{"start_line":41,"start_character":13,"end_line":41,"end_character":30},"in_reply_to":"7f96bb07_fa2b022d","updated":"2018-01-16 10:16:13.000000000","message":"allocated_ids ?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":38,"context_line":"        self._layout \u003d layout"},{"line_number":39,"context_line":"        self._apps \u003d {}  # FIXME may be unneeded"},{"line_number":40,"context_line":"        self._configs \u003d {}"},{"line_number":41,"context_line":"        self._public_variables \u003d set()"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def set_up(self, ryu_base, vswitch_api, nb_api, notifier):"},{"line_number":44,"context_line":"        self._dp \u003d ryu_base.datapath"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_fa2b022d","line":41,"range":{"start_line":41,"start_character":13,"end_line":41,"end_character":30},"in_reply_to":"9f91af0f_668075c0","updated":"2018-01-15 14:23:01.000000000","message":"This member holds all the public varaibles defined across all currenly loaded apps. Maybe _defined_public_variables? Suggestions welcome.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def set_up(self, ryu_base, vswitch_api, nb_api, notifier):"},{"line_number":44,"context_line":"        self._dp \u003d ryu_base.datapath"},{"line_number":45,"context_line":"        self._table_generator \u003d _sequence_generator(200)"},{"line_number":46,"context_line":"        self._public_variables.clear()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        for vertex in self._layout.vertices:"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_79a4f5b9","line":45,"range":{"start_line":45,"start_character":52,"end_line":45,"end_character":55},"updated":"2018-01-14 11:45:26.000000000","message":"Maybe take from configuration? And pass a maximum? Then it can also be used in future Aging scenario where we split the range into odd runs and even runs.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    def set_up(self, ryu_base, vswitch_api, nb_api, notifier):"},{"line_number":44,"context_line":"        self._dp \u003d ryu_base.datapath"},{"line_number":45,"context_line":"        self._table_generator \u003d _sequence_generator(200)"},{"line_number":46,"context_line":"        self._public_variables.clear()"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"        for vertex in self._layout.vertices:"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_bae25a00","line":45,"range":{"start_line":45,"start_character":52,"end_line":45,"end_character":55},"in_reply_to":"7f96bb07_79a4f5b9","updated":"2018-01-15 14:23:01.000000000","message":"Will change","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                \u0027nb_api\u0027: nb_api,"},{"line_number":53,"context_line":"                \u0027neutron_server_notifier\u0027: notifier"},{"line_number":54,"context_line":"            }"},{"line_number":55,"context_line":"            if vertex.params:"},{"line_number":56,"context_line":"                app_params.update(vertex.params)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"            app \u003d self._spawn_app(vertex.type, **app_params)"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_8602596e","line":55,"updated":"2018-01-09 14:55:17.000000000","message":"didn\u0027t sure that i understood the logic difference between vertex and app","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":52,"context_line":"                \u0027nb_api\u0027: nb_api,"},{"line_number":53,"context_line":"                \u0027neutron_server_notifier\u0027: notifier"},{"line_number":54,"context_line":"            }"},{"line_number":55,"context_line":"            if vertex.params:"},{"line_number":56,"context_line":"                app_params.update(vertex.params)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"            app \u003d self._spawn_app(vertex.type, **app_params)"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_7ac1322e","line":55,"in_reply_to":"9f91af0f_8602596e","updated":"2018-01-15 14:23:01.000000000","message":"Each app instance is backed by a single instance of a datapath layout vertex. An app is a piece of custom logic inside the DF local controller, while a DP vertex describes how it interacts with other vertices (and therefore how app interacts with other apps).","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            invoke_kwds\u003dkwargs,"},{"line_number":79,"context_line":"        )"},{"line_number":80,"context_line":"        for ext in mgr:"},{"line_number":81,"context_line":"            return ext.obj"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _create_app_config(self, contract):"},{"line_number":84,"context_line":"        mapping \u003d contract.public_mapping.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_f98fa52b","line":81,"updated":"2018-01-14 11:45:26.000000000","message":"Maybe add log or exception if there are no objects in the loaded class?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"            invoke_kwds\u003dkwargs,"},{"line_number":79,"context_line":"        )"},{"line_number":80,"context_line":"        for ext in mgr:"},{"line_number":81,"context_line":"            return ext.obj"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _create_app_config(self, contract):"},{"line_number":84,"context_line":"        mapping \u003d contract.public_mapping.copy()"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_1adeee10","line":81,"in_reply_to":"7f96bb07_f98fa52b","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            return ext.obj"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _create_app_config(self, contract):"},{"line_number":84,"context_line":"        mapping \u003d contract.public_mapping.copy()"},{"line_number":85,"context_line":"        unmapped_vars \u003d self._public_variables.difference(mapping)"},{"line_number":86,"context_line":"        unmapped_regs \u003d set(REGS).difference("},{"line_number":87,"context_line":"            mapping.values(),"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_e64c85c9","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":15},"updated":"2018-01-09 14:55:17.000000000","message":"public mapping ?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            return ext.obj"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def _create_app_config(self, contract):"},{"line_number":84,"context_line":"        mapping \u003d contract.public_mapping.copy()"},{"line_number":85,"context_line":"        unmapped_vars \u003d self._public_variables.difference(mapping)"},{"line_number":86,"context_line":"        unmapped_regs \u003d set(REGS).difference("},{"line_number":87,"context_line":"            mapping.values(),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_fa38e23d","line":84,"range":{"start_line":84,"start_character":8,"end_line":84,"end_character":15},"in_reply_to":"9f91af0f_e64c85c9","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        states \u003d app_base.AttributeDict("},{"line_number":101,"context_line":"            **{"},{"line_number":102,"context_line":"                state: next(self._table_generator)"},{"line_number":103,"context_line":"                for state in contract.states"},{"line_number":104,"context_line":"            }"},{"line_number":105,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_0672c949","line":102,"updated":"2018-01-09 14:55:17.000000000","message":"The following scenario bother me: \n1. we load the app first time and create the tables \n2. change in configuration (for example - remove app)\n3. load the controller again \n\nIn the code here the table numbers are define according how many tables defined by previous apps, when app will removed from configuration it\u0027s can cause change in table number in all other apps. \n\nI suggest that in the first controller load - the tables  number will be generated in that way, and when all app loaded a mapping between app and table should be save to the disk. After restart  the table numbers restore from the disk .","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"465f8215d9894c355fd5fc7b1fc74d531fa32c88","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        states \u003d app_base.AttributeDict("},{"line_number":101,"context_line":"            **{"},{"line_number":102,"context_line":"                state: next(self._table_generator)"},{"line_number":103,"context_line":"                for state in contract.states"},{"line_number":104,"context_line":"            }"},{"line_number":105,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_ee96c4f0","line":102,"in_reply_to":"7f96bb07_155b1f2e","updated":"2018-01-16 10:16:13.000000000","message":"yep , i didn\u0027t aware to that we cleaning ovs table every time that controller restart?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        states \u003d app_base.AttributeDict("},{"line_number":101,"context_line":"            **{"},{"line_number":102,"context_line":"                state: next(self._table_generator)"},{"line_number":103,"context_line":"                for state in contract.states"},{"line_number":104,"context_line":"            }"},{"line_number":105,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_155b1f2e","line":102,"in_reply_to":"9f91af0f_0672c949","updated":"2018-01-15 14:23:01.000000000","message":"set_up should be called every time openvswitch connects to us. If that\u0027s the first connect, then it might have flows installed and we should use aging to get rid of them (and install new flows elsewhere). If that\u0027s not the first connect, then ovs tables will be empty (so we can allocate any IDs we want).\n\nIf configuration changes, we\u0027ll restart controller anyway, and we\u0027ll need to use aging to allocate IDs that are not used by any old apps.\n\nIn any case, I don\u0027t see any benefit to saving the mapping to disk, we need unused IDs each time we start.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        states \u003d app_base.AttributeDict("},{"line_number":101,"context_line":"            **{"},{"line_number":102,"context_line":"                state: next(self._table_generator)"},{"line_number":103,"context_line":"                for state in contract.states"},{"line_number":104,"context_line":"            }"},{"line_number":105,"context_line":"        )"},{"line_number":106,"context_line":"        return app_base.AppConfig("}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_c6be21b3","line":103,"range":{"start_line":103,"start_character":38,"end_line":103,"end_character":44},"updated":"2018-01-09 14:55:17.000000000","message":"maybe i don\u0027t understand exactly what state mean - but why number of states , related to number of tables ?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"465f8215d9894c355fd5fc7b1fc74d531fa32c88","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        states \u003d app_base.AttributeDict("},{"line_number":101,"context_line":"            **{"},{"line_number":102,"context_line":"                state: next(self._table_generator)"},{"line_number":103,"context_line":"                for state in contract.states"},{"line_number":104,"context_line":"            }"},{"line_number":105,"context_line":"        )"},{"line_number":106,"context_line":"        return app_base.AppConfig("}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_4e549821","line":103,"range":{"start_line":103,"start_character":38,"end_line":103,"end_character":44},"in_reply_to":"7f96bb07_baffba32","updated":"2018-01-16 10:16:13.000000000","message":"could you explain that connection - what if and what happened if app needs tables for internal use","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        states \u003d app_base.AttributeDict("},{"line_number":101,"context_line":"            **{"},{"line_number":102,"context_line":"                state: next(self._table_generator)"},{"line_number":103,"context_line":"                for state in contract.states"},{"line_number":104,"context_line":"            }"},{"line_number":105,"context_line":"        )"},{"line_number":106,"context_line":"        return app_base.AppConfig("}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_baffba32","line":103,"range":{"start_line":103,"start_character":38,"end_line":103,"end_character":44},"in_reply_to":"9f91af0f_c6be21b3","updated":"2018-01-15 14:23:01.000000000","message":"Yes, a state represents a table","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            )"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        states \u003d app_base.AttributeDict("},{"line_number":101,"context_line":"            **{"},{"line_number":102,"context_line":"                state: next(self._table_generator)"},{"line_number":103,"context_line":"                for state in contract.states"},{"line_number":104,"context_line":"            }"},{"line_number":105,"context_line":"        )"},{"line_number":106,"context_line":"        return app_base.AppConfig("},{"line_number":107,"context_line":"            states\u003dstates,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_1984d10b","line":104,"range":{"start_line":101,"start_character":14,"end_line":104,"end_character":13},"updated":"2018-01-14 11:45:26.000000000","message":"Please move the creation of the dict to a separate line for clarity,\n\ne.g. \nstates_dict \u003d {state: next(self._table_generator) for state in contract.states}\nstates \u003d app_base.AttributeDict(**states_dict)","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":98,"context_line":"            )"},{"line_number":99,"context_line":""},{"line_number":100,"context_line":"        states \u003d app_base.AttributeDict("},{"line_number":101,"context_line":"            **{"},{"line_number":102,"context_line":"                state: next(self._table_generator)"},{"line_number":103,"context_line":"                for state in contract.states"},{"line_number":104,"context_line":"            }"},{"line_number":105,"context_line":"        )"},{"line_number":106,"context_line":"        return app_base.AppConfig("},{"line_number":107,"context_line":"            states\u003dstates,"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_fad462bf","line":104,"range":{"start_line":101,"start_character":14,"end_line":104,"end_character":13},"in_reply_to":"7f96bb07_1984d10b","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return app_base.AppConfig("},{"line_number":107,"context_line":"            states\u003dstates,"},{"line_number":108,"context_line":"            exitpoints\u003dapp_base.AttributeDict("},{"line_number":109,"context_line":"                **{"},{"line_number":110,"context_line":"                    exit.name: next(self._table_generator)"},{"line_number":111,"context_line":"                    for exit in contract.exitpoints"},{"line_number":112,"context_line":"                }"},{"line_number":113,"context_line":"            ),"},{"line_number":114,"context_line":"            entrypoints\u003dapp_base.AttributeDict("},{"line_number":115,"context_line":"                **{"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_39874d12","line":112,"range":{"start_line":109,"start_character":18,"end_line":112,"end_character":17},"updated":"2018-01-14 11:45:26.000000000","message":"Same here","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        return app_base.AppConfig("},{"line_number":107,"context_line":"            states\u003dstates,"},{"line_number":108,"context_line":"            exitpoints\u003dapp_base.AttributeDict("},{"line_number":109,"context_line":"                **{"},{"line_number":110,"context_line":"                    exit.name: next(self._table_generator)"},{"line_number":111,"context_line":"                    for exit in contract.exitpoints"},{"line_number":112,"context_line":"                }"},{"line_number":113,"context_line":"            ),"},{"line_number":114,"context_line":"            entrypoints\u003dapp_base.AttributeDict("},{"line_number":115,"context_line":"                **{"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_dad166cf","line":112,"range":{"start_line":109,"start_character":18,"end_line":112,"end_character":17},"in_reply_to":"7f96bb07_39874d12","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                }"},{"line_number":113,"context_line":"            ),"},{"line_number":114,"context_line":"            entrypoints\u003dapp_base.AttributeDict("},{"line_number":115,"context_line":"                **{"},{"line_number":116,"context_line":"                    entry.name: states[entry.target]"},{"line_number":117,"context_line":"                    for entry in contract.entrypoints"},{"line_number":118,"context_line":"                }"},{"line_number":119,"context_line":"            ),"},{"line_number":120,"context_line":"            full_mapping\u003dmapping,"},{"line_number":121,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_d97d091d","line":118,"range":{"start_line":115,"start_character":18,"end_line":118,"end_character":17},"updated":"2018-01-14 11:45:26.000000000","message":"And here","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":112,"context_line":"                }"},{"line_number":113,"context_line":"            ),"},{"line_number":114,"context_line":"            entrypoints\u003dapp_base.AttributeDict("},{"line_number":115,"context_line":"                **{"},{"line_number":116,"context_line":"                    entry.name: states[entry.target]"},{"line_number":117,"context_line":"                    for entry in contract.entrypoints"},{"line_number":118,"context_line":"                }"},{"line_number":119,"context_line":"            ),"},{"line_number":120,"context_line":"            full_mapping\u003dmapping,"},{"line_number":121,"context_line":"        )"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_7a4b72af","line":118,"range":{"start_line":115,"start_character":18,"end_line":118,"end_character":17},"in_reply_to":"7f96bb07_d97d091d","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        entrypoint \u003d edge.entrypoint"},{"line_number":130,"context_line":"        entry_config \u003d self._get_connector_config(entrypoint)"},{"line_number":131,"context_line":"        translations \u003d []"},{"line_number":132,"context_line":"        map \u003d {}"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        for var in self._public_variables:"},{"line_number":135,"context_line":"            exit_reg \u003d exit_config.full_mapping[var]"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_b9727d48","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":11},"updated":"2018-01-14 11:45:26.000000000","message":"Please rename. map is a known word.\n\nMaybe: regs_map ?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":129,"context_line":"        entrypoint \u003d edge.entrypoint"},{"line_number":130,"context_line":"        entry_config \u003d self._get_connector_config(entrypoint)"},{"line_number":131,"context_line":"        translations \u003d []"},{"line_number":132,"context_line":"        map \u003d {}"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"        for var in self._public_variables:"},{"line_number":135,"context_line":"            exit_reg \u003d exit_config.full_mapping[var]"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_9a899ecb","line":132,"range":{"start_line":132,"start_character":8,"end_line":132,"end_character":11},"in_reply_to":"7f96bb07_b9727d48","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"020364379bbaa02750be55cfb18397c11c88e065","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            while exit_reg in map:"},{"line_number":143,"context_line":"                exit_reg \u003d map[exit_reg]"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            # TODO(dimak) current add_goto swaps regs with stack, we can do"},{"line_number":146,"context_line":"            # better by finding by using graphs and finding cycles."},{"line_number":147,"context_line":"            if exit_reg !\u003d entry_reg:"},{"line_number":148,"context_line":"                translations.append("}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_57ce3e82","line":145,"range":{"start_line":145,"start_character":34,"end_line":145,"end_character":42},"updated":"2018-01-09 13:40:16.000000000","message":"install_goto?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":142,"context_line":"            while exit_reg in map:"},{"line_number":143,"context_line":"                exit_reg \u003d map[exit_reg]"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"            # TODO(dimak) current add_goto swaps regs with stack, we can do"},{"line_number":146,"context_line":"            # better by finding by using graphs and finding cycles."},{"line_number":147,"context_line":"            if exit_reg !\u003d entry_reg:"},{"line_number":148,"context_line":"                translations.append("}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_9ab2fe93","line":145,"range":{"start_line":145,"start_character":34,"end_line":145,"end_character":42},"in_reply_to":"9f91af0f_57ce3e82","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"020364379bbaa02750be55cfb18397c11c88e065","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        )"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _install_goto(self, source, dest, translations):"},{"line_number":162,"context_line":"        ofproto \u003d self._dp.ofproto"},{"line_number":163,"context_line":"        parser \u003d self._dp.ofproto_parser"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        actions \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_77a8228b","line":162,"updated":"2018-01-09 13:40:16.000000000","message":"docstrings in the entire file would be much appreciated","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        )"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _install_goto(self, source, dest, translations):"},{"line_number":162,"context_line":"        ofproto \u003d self._dp.ofproto"},{"line_number":163,"context_line":"        parser \u003d self._dp.ofproto_parser"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        actions \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_35773ba3","line":162,"in_reply_to":"7f96bb07_399c2d5c","updated":"2018-01-15 14:23:01.000000000","message":"Will add","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":159,"context_line":"        )"},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"    def _install_goto(self, source, dest, translations):"},{"line_number":162,"context_line":"        ofproto \u003d self._dp.ofproto"},{"line_number":163,"context_line":"        parser \u003d self._dp.ofproto_parser"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        actions \u003d []"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_399c2d5c","line":162,"in_reply_to":"9f91af0f_77a8228b","updated":"2018-01-14 11:45:26.000000000","message":"+1","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        parser \u003d self._dp.ofproto_parser"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        actions \u003d []"},{"line_number":166,"context_line":"        for src_reg, dst_reg in translations:"},{"line_number":167,"context_line":"            actions.extend("},{"line_number":168,"context_line":"                ("},{"line_number":169,"context_line":"                    parser.NXActionStackPush(field\u003ddst_reg, start\u003d0, end\u003d32),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_b9a7dda7","line":166,"updated":"2018-01-14 11:45:26.000000000","message":"If a later translation needs the original \u0027dst_reg\u0027, how does it know to find it in \u0027src_reg\u0027?\n\nI saw you handled the case of a later translation needing the original \u0027src_reg\u0027.\n\nOr maybe I\u0027m confused and it\u0027s the other way round?\n\nMay I suggest a different algorithm:\nfor each src in translations, add a push action, and then for each dst in reverse(translation), add a pop. You even end up with less actions. And you don\u0027t need the magic \u0027map\u0027 variable above.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":163,"context_line":"        parser \u003d self._dp.ofproto_parser"},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"        actions \u003d []"},{"line_number":166,"context_line":"        for src_reg, dst_reg in translations:"},{"line_number":167,"context_line":"            actions.extend("},{"line_number":168,"context_line":"                ("},{"line_number":169,"context_line":"                    parser.NXActionStackPush(field\u003ddst_reg, start\u003d0, end\u003d32),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_f5a55305","line":166,"in_reply_to":"7f96bb07_b9a7dda7","updated":"2018-01-15 14:23:01.000000000","message":"Will try and report back","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"74e555067b57c951ac1ce90ad4f67f9ef82deaaf","unresolved":false,"context_lines":[{"line_number":60,"context_line":""},{"line_number":61,"context_line":"            app \u003d self._spawn_app(vertex.type, **app_params)"},{"line_number":62,"context_line":"            apps[vertex.name] \u003d app"},{"line_number":63,"context_line":"            self._public_variables.update("},{"line_number":64,"context_line":"                set(app._contract.public_mapping.keys()),"},{"line_number":65,"context_line":"            )"},{"line_number":66,"context_line":""}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_7a234e57","line":63,"updated":"2018-01-16 12:01:06.000000000","message":"As the public variables built according to the apps contract - it\u0027s means that app the consume a variable needs to know which previous app declared it , i think that reduce the decoupling as app should be aware to previous app definition. maybe the set of public entities should be defined in a global place.","commit_id":"ba2cbbde6fb4c0a9f9212528f38db994d0966657"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"74e555067b57c951ac1ce90ad4f67f9ef82deaaf","unresolved":false,"context_lines":[{"line_number":62,"context_line":"            apps[vertex.name] \u003d app"},{"line_number":63,"context_line":"            self._public_variables.update("},{"line_number":64,"context_line":"                set(app._contract.public_mapping.keys()),"},{"line_number":65,"context_line":"            )"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"        for name, app in apps.items():"},{"line_number":68,"context_line":"            config \u003d self._create_app_config(app._contract)"}],"source_content_type":"text/x-python","patch_set":17,"id":"7f96bb07_dab862e6","line":65,"updated":"2018-01-16 12:01:06.000000000","message":"I think after the lop we need to check that num(public_varibles) \u003c\u003d num(registers), it\u0027s also have","commit_id":"ba2cbbde6fb4c0a9f9212528f38db994d0966657"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"af78c6e241c8f7d27af525eb6ea46ba779ff8e5f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from dragonflow import conf as cfg"},{"line_number":16,"context_line":"from dragonflow.controller import app_base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"REGS \u003d ("},{"line_number":19,"context_line":"    \u0027reg0\u0027,"},{"line_number":20,"context_line":"    \u0027reg1\u0027,"},{"line_number":21,"context_line":"    \u0027reg2\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f93b717_d14f1932","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":8},"updated":"2018-01-28 09:39:36.000000000","message":"If always used as set, why not create as a set to begin with?","commit_id":"b4daff7989ece87b28efbe385c2ab38052bbe7cb"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"feeb760a6c3d4be4b942d01a0b0ef1a197c22776","unresolved":false,"context_lines":[{"line_number":15,"context_line":"from dragonflow import conf as cfg"},{"line_number":16,"context_line":"from dragonflow.controller import app_base"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"REGS \u003d ("},{"line_number":19,"context_line":"    \u0027reg0\u0027,"},{"line_number":20,"context_line":"    \u0027reg1\u0027,"},{"line_number":21,"context_line":"    \u0027reg2\u0027,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa0c359_ab5b83f3","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":8},"in_reply_to":"5f93b717_d14f1932","updated":"2018-02-13 07:55:15.000000000","message":"Done","commit_id":"b4daff7989ece87b28efbe385c2ab38052bbe7cb"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"af78c6e241c8f7d27af525eb6ea46ba779ff8e5f","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            app_class \u003d self._get_app_class(vertex.type)"},{"line_number":57,"context_line":"            app_classes[vertex.type] \u003d app_class"},{"line_number":58,"context_line":"            self._public_variables.update("},{"line_number":59,"context_line":"                set(app_class._specification.public_mapping.keys()),"},{"line_number":60,"context_line":"            )"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        for vertex in self._layout.vertices:"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f93b717_5144691b","line":59,"range":{"start_line":59,"start_character":16,"end_line":59,"end_character":19},"updated":"2018-01-28 09:39:36.000000000","message":"Is this needed?","commit_id":"b4daff7989ece87b28efbe385c2ab38052bbe7cb"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"feeb760a6c3d4be4b942d01a0b0ef1a197c22776","unresolved":false,"context_lines":[{"line_number":56,"context_line":"            app_class \u003d self._get_app_class(vertex.type)"},{"line_number":57,"context_line":"            app_classes[vertex.type] \u003d app_class"},{"line_number":58,"context_line":"            self._public_variables.update("},{"line_number":59,"context_line":"                set(app_class._specification.public_mapping.keys()),"},{"line_number":60,"context_line":"            )"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"        for vertex in self._layout.vertices:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa0c359_6b481b2c","line":59,"range":{"start_line":59,"start_character":16,"end_line":59,"end_character":19},"in_reply_to":"5f93b717_5144691b","updated":"2018-02-13 07:55:15.000000000","message":"Nope","commit_id":"b4daff7989ece87b28efbe385c2ab38052bbe7cb"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"af78c6e241c8f7d27af525eb6ea46ba779ff8e5f","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        parser \u003d self._dp.ofproto_parser"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        actions \u003d []"},{"line_number":180,"context_line":"        for src_reg, dst_reg in translations:"},{"line_number":181,"context_line":"            actions.extend("},{"line_number":182,"context_line":"                ("},{"line_number":183,"context_line":"                    parser.NXActionStackPush(field\u003ddst_reg, start\u003d0, end\u003d32),"}],"source_content_type":"text/x-python","patch_set":18,"id":"5f93b717_9163d1b1","line":180,"updated":"2018-01-28 09:39:36.000000000","message":"Did you test the stack-only algorithm from PS14?","commit_id":"b4daff7989ece87b28efbe385c2ab38052bbe7cb"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"feeb760a6c3d4be4b942d01a0b0ef1a197c22776","unresolved":false,"context_lines":[{"line_number":177,"context_line":"        parser \u003d self._dp.ofproto_parser"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        actions \u003d []"},{"line_number":180,"context_line":"        for src_reg, dst_reg in translations:"},{"line_number":181,"context_line":"            actions.extend("},{"line_number":182,"context_line":"                ("},{"line_number":183,"context_line":"                    parser.NXActionStackPush(field\u003ddst_reg, start\u003d0, end\u003d32),"}],"source_content_type":"text/x-python","patch_set":18,"id":"3fa0c359_2b4e9337","line":180,"in_reply_to":"5f93b717_9163d1b1","updated":"2018-02-13 07:55:15.000000000","message":"Done","commit_id":"b4daff7989ece87b28efbe385c2ab38052bbe7cb"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e8614d8be4c5b405236c432b620e73f86540bf47","unresolved":false,"context_lines":[{"line_number":173,"context_line":"        # Push all register values"},{"line_number":174,"context_line":"        for reg in from_regs:"},{"line_number":175,"context_line":"            actions.append("},{"line_number":176,"context_line":"                parser.NXActionStackPush(field\u003dreg, start\u003d0, end\u003d32),"},{"line_number":177,"context_line":"            )"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"        # Pop into target registers in reverse order"}],"source_content_type":"text/x-python","patch_set":19,"id":"3fa0c359_60a6f5ad","line":176,"range":{"start_line":176,"start_character":65,"end_line":176,"end_character":67},"updated":"2018-02-13 09:27:56.000000000","message":"nit: metadata is 64 bits (nit because I missed it earlier)","commit_id":"ac46abc2c4e4b0e655daed9dea21fa308abc6596"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"beda450320daef195483c4ed8166fc8247990be7","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        offset +\u003d 1"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class Datapath(object):"},{"line_number":38,"context_line":"    def __init__(self, layout):"},{"line_number":39,"context_line":"        self._layout \u003d layout"},{"line_number":40,"context_line":"        self._dp_allocs \u003d {}"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa0c359_4fb74bf6","line":37,"updated":"2018-02-14 10:16:27.000000000","message":"please add docstrings","commit_id":"817f3ac2c86832b9422aeedbc7b0f007658f1571"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"949d3e00a635a0f06114ac3e210e28e1c4c074f6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        offset +\u003d 1"},{"line_number":35,"context_line":""},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"class Datapath(object):"},{"line_number":38,"context_line":"    def __init__(self, layout):"},{"line_number":39,"context_line":"        self._layout \u003d layout"},{"line_number":40,"context_line":"        self._dp_allocs \u003d {}"}],"source_content_type":"text/x-python","patch_set":20,"id":"3fa0c359_7719b9d4","line":37,"in_reply_to":"3fa0c359_4fb74bf6","updated":"2018-02-14 12:36:21.000000000","message":"Will do","commit_id":"817f3ac2c86832b9422aeedbc7b0f007658f1571"}],"dragonflow/controller/datapath_layout.py":[{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Vertex \u003d collections.namedtuple("},{"line_number":20,"context_line":"    \u0027Vertex\u0027,"},{"line_number":21,"context_line":"    (\u0027name\u0027, \u0027type\u0027, \u0027params\u0027),"},{"line_number":22,"context_line":")"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_b2bf985f","line":20,"updated":"2018-01-09 14:55:17.000000000","message":"vertex is app instance ? \nwhat is the meaning of type here ?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":17,"context_line":""},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Vertex \u003d collections.namedtuple("},{"line_number":20,"context_line":"    \u0027Vertex\u0027,"},{"line_number":21,"context_line":"    (\u0027name\u0027, \u0027type\u0027, \u0027params\u0027),"},{"line_number":22,"context_line":")"},{"line_number":23,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_15e1dffe","line":20,"in_reply_to":"9f91af0f_b2bf985f","updated":"2018-01-15 14:23:01.000000000","message":"Answered on datapath.py","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":28,"context_line":")"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class Connector("},{"line_number":32,"context_line":"    collections.namedtuple("},{"line_number":33,"context_line":"        \u0027Connector\u0027,"},{"line_number":34,"context_line":"        (\u0027vertex\u0027, \u0027type\u0027, \u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_9237f44d","line":31,"updated":"2018-01-09 14:55:17.000000000","message":"what the diffrent  between connector to edge?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":28,"context_line":")"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class Connector("},{"line_number":32,"context_line":"    collections.namedtuple("},{"line_number":33,"context_line":"        \u0027Connector\u0027,"},{"line_number":34,"context_line":"        (\u0027vertex\u0027, \u0027type\u0027, \u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_d51db70f","line":31,"in_reply_to":"9f91af0f_9237f44d","updated":"2018-01-15 14:23:01.000000000","message":"A connector is a \"port\" on a vertex. An edge connects to out connector to an in connector.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"cc38a122f309e4493bb01e65e2106b8c702ed518","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class Connector("},{"line_number":32,"context_line":"    collections.namedtuple("},{"line_number":33,"context_line":"        \u0027Connector\u0027,"},{"line_number":34,"context_line":"        (\u0027vertex\u0027, \u0027type\u0027, \u0027name\u0027),"},{"line_number":35,"context_line":"    ),"},{"line_number":36,"context_line":"):"},{"line_number":37,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"9f91af0f_f2fa0041","line":34,"range":{"start_line":34,"start_character":19,"end_line":34,"end_character":25},"updated":"2018-01-09 14:55:17.000000000","message":"maybe change to direction?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"class Connector("},{"line_number":32,"context_line":"    collections.namedtuple("},{"line_number":33,"context_line":"        \u0027Connector\u0027,"},{"line_number":34,"context_line":"        (\u0027vertex\u0027, \u0027type\u0027, \u0027name\u0027),"},{"line_number":35,"context_line":"    ),"},{"line_number":36,"context_line":"):"},{"line_number":37,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_35d3bb62","line":34,"range":{"start_line":34,"start_character":19,"end_line":34,"end_character":25},"in_reply_to":"9f91af0f_f2fa0041","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class Connector("},{"line_number":32,"context_line":"    collections.namedtuple("},{"line_number":33,"context_line":"        \u0027Connector\u0027,"},{"line_number":34,"context_line":"        (\u0027vertex\u0027, \u0027type\u0027, \u0027name\u0027),"},{"line_number":35,"context_line":"    ),"},{"line_number":36,"context_line":"):"},{"line_number":37,"context_line":"    @classmethod"},{"line_number":38,"context_line":"    def from_string(cls, val):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_b9c03d2c","line":35,"range":{"start_line":32,"start_character":0,"end_line":35,"end_character":6},"updated":"2018-01-14 11:45:26.000000000","message":"Maybe define the namedtuple separately above? It would be more readable this way.\n\ne.g.:\nConnectorBase \u003d collections.namedtuple(...)\nclass Connector(ConnectorBase):\n    ...","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"class Connector("},{"line_number":32,"context_line":"    collections.namedtuple("},{"line_number":33,"context_line":"        \u0027Connector\u0027,"},{"line_number":34,"context_line":"        (\u0027vertex\u0027, \u0027type\u0027, \u0027name\u0027),"},{"line_number":35,"context_line":"    ),"},{"line_number":36,"context_line":"):"},{"line_number":37,"context_line":"    @classmethod"},{"line_number":38,"context_line":"    def from_string(cls, val):"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_f57eb369","line":35,"range":{"start_line":32,"start_character":0,"end_line":35,"end_character":6},"in_reply_to":"7f96bb07_b9c03d2c","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        raw_layout \u003d yaml.load(f)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    return DatapathLayout("},{"line_number":56,"context_line":"        vertices\u003dtuple("},{"line_number":57,"context_line":"            Vertex("},{"line_number":58,"context_line":"                name\u003dkey,"},{"line_number":59,"context_line":"                type\u003dvalue[\u0027type\u0027],"},{"line_number":60,"context_line":"                params\u003dvalue.get(\u0027params\u0027),"},{"line_number":61,"context_line":"            ) for key, value in raw_layout[\u0027vertices\u0027].items()"},{"line_number":62,"context_line":"        ),"},{"line_number":63,"context_line":"        edges\u003dtuple("},{"line_number":64,"context_line":"            Edge("}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_59dd7912","line":61,"range":{"start_line":56,"start_character":17,"end_line":61,"end_character":62},"updated":"2018-01-14 11:45:26.000000000","message":"Maybe create a vertices variable first?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":53,"context_line":"        raw_layout \u003d yaml.load(f)"},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    return DatapathLayout("},{"line_number":56,"context_line":"        vertices\u003dtuple("},{"line_number":57,"context_line":"            Vertex("},{"line_number":58,"context_line":"                name\u003dkey,"},{"line_number":59,"context_line":"                type\u003dvalue[\u0027type\u0027],"},{"line_number":60,"context_line":"                params\u003dvalue.get(\u0027params\u0027),"},{"line_number":61,"context_line":"            ) for key, value in raw_layout[\u0027vertices\u0027].items()"},{"line_number":62,"context_line":"        ),"},{"line_number":63,"context_line":"        edges\u003dtuple("},{"line_number":64,"context_line":"            Edge("}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_352f3b40","line":61,"range":{"start_line":56,"start_character":17,"end_line":61,"end_character":62},"in_reply_to":"7f96bb07_59dd7912","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                params\u003dvalue.get(\u0027params\u0027),"},{"line_number":61,"context_line":"            ) for key, value in raw_layout[\u0027vertices\u0027].items()"},{"line_number":62,"context_line":"        ),"},{"line_number":63,"context_line":"        edges\u003dtuple("},{"line_number":64,"context_line":"            Edge("},{"line_number":65,"context_line":"                exitpoint\u003dConnector.from_string(key),"},{"line_number":66,"context_line":"                entrypoint\u003dConnector.from_string(value),"},{"line_number":67,"context_line":"            ) for key, value in raw_layout[\u0027edges\u0027].items()"},{"line_number":68,"context_line":"        ),"},{"line_number":69,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_79e075cd","line":67,"range":{"start_line":63,"start_character":14,"end_line":67,"end_character":59},"updated":"2018-01-14 11:45:26.000000000","message":"Maybe create an edges variable first?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":60,"context_line":"                params\u003dvalue.get(\u0027params\u0027),"},{"line_number":61,"context_line":"            ) for key, value in raw_layout[\u0027vertices\u0027].items()"},{"line_number":62,"context_line":"        ),"},{"line_number":63,"context_line":"        edges\u003dtuple("},{"line_number":64,"context_line":"            Edge("},{"line_number":65,"context_line":"                exitpoint\u003dConnector.from_string(key),"},{"line_number":66,"context_line":"                entrypoint\u003dConnector.from_string(value),"},{"line_number":67,"context_line":"            ) for key, value in raw_layout[\u0027edges\u0027].items()"},{"line_number":68,"context_line":"        ),"},{"line_number":69,"context_line":"    )"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_553207a9","line":67,"range":{"start_line":63,"start_character":14,"end_line":67,"end_character":59},"in_reply_to":"7f96bb07_79e075cd","updated":"2018-01-15 14:23:01.000000000","message":"Done","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"}],"dragonflow/tests/unit/test_datapath.py":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    ]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def spawn_dummy_app(self, type, **kwargs):"},{"line_number":167,"context_line":"        if type \u003d\u003d \u0027dummy\u0027:"},{"line_number":168,"context_line":"            return DummyApp(**kwargs)"},{"line_number":169,"context_line":"        else:"},{"line_number":170,"context_line":"            return Dummy2App(**kwargs)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def setUp(self):"},{"line_number":173,"context_line":"        super(TestDatapath, self).setUp()"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_f9cb2547","line":170,"range":{"start_line":167,"start_character":0,"end_line":170,"end_character":38},"updated":"2018-01-14 11:45:26.000000000","message":"Maybe use a dispatch, e.g.:\n\ntype_dict \u003d {\u0027dummy\u0027: DummyApp, \u0027dummy2\u0027: Dummy2App}\ntype_cls \u003d type_dict[type]\nreturn type_cls(**kwrags)\n\nThis way, if an unexpected type is given, you get an error.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    ]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"    def spawn_dummy_app(self, type, **kwargs):"},{"line_number":167,"context_line":"        if type \u003d\u003d \u0027dummy\u0027:"},{"line_number":168,"context_line":"            return DummyApp(**kwargs)"},{"line_number":169,"context_line":"        else:"},{"line_number":170,"context_line":"            return Dummy2App(**kwargs)"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"    def setUp(self):"},{"line_number":173,"context_line":"        super(TestDatapath, self).setUp()"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_f5b6b3fa","line":170,"range":{"start_line":167,"start_character":0,"end_line":170,"end_character":38},"in_reply_to":"7f96bb07_f9cb2547","updated":"2018-01-15 14:23:01.000000000","message":"Will adapt as tests evolve.","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def test_app_initialization(self):"},{"line_number":197,"context_line":"        if self.raises is not None:"},{"line_number":198,"context_line":"            raise self.skipTest(\u0027Tests only positive flows\u0027)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self.dp.set_up("},{"line_number":201,"context_line":"            mock.Mock(),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_79095593","line":198,"range":{"start_line":198,"start_character":12,"end_line":198,"end_character":17},"updated":"2018-01-14 11:45:26.000000000","message":"Is this needed?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"bb425c0671a422d2816b7dfdde05018a4df7cecb","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def test_app_initialization(self):"},{"line_number":197,"context_line":"        if self.raises is not None:"},{"line_number":198,"context_line":"            raise self.skipTest(\u0027Tests only positive flows\u0027)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self.dp.set_up("},{"line_number":201,"context_line":"            mock.Mock(),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_02eadcaa","line":198,"range":{"start_line":198,"start_character":12,"end_line":198,"end_character":17},"in_reply_to":"7f96bb07_75f143cd","updated":"2018-01-16 12:44:58.000000000","message":"But you want the test to skip here, not fail?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":195,"context_line":""},{"line_number":196,"context_line":"    def test_app_initialization(self):"},{"line_number":197,"context_line":"        if self.raises is not None:"},{"line_number":198,"context_line":"            raise self.skipTest(\u0027Tests only positive flows\u0027)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"        self.dp.set_up("},{"line_number":201,"context_line":"            mock.Mock(),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_75f143cd","line":198,"range":{"start_line":198,"start_character":12,"end_line":198,"end_character":17},"in_reply_to":"7f96bb07_79095593","updated":"2018-01-15 14:23:01.000000000","message":"Yes, failing case will throw an exception and test will fail","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def test_installed_gotos(self):"},{"line_number":212,"context_line":"        if self.raises is not None:"},{"line_number":213,"context_line":"            raise self.skipTest(\u0027Tests only positive flows\u0027)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        self.dp.set_up("},{"line_number":216,"context_line":"            mock.Mock(),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_3903cd75","line":213,"range":{"start_line":213,"start_character":12,"end_line":213,"end_character":17},"updated":"2018-01-14 11:45:26.000000000","message":"Same here","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    def test_installed_gotos(self):"},{"line_number":212,"context_line":"        if self.raises is not None:"},{"line_number":213,"context_line":"            raise self.skipTest(\u0027Tests only positive flows\u0027)"},{"line_number":214,"context_line":""},{"line_number":215,"context_line":"        self.dp.set_up("},{"line_number":216,"context_line":"            mock.Mock(),"}],"source_content_type":"text/x-python","patch_set":14,"id":"7f96bb07_55c0c750","line":213,"range":{"start_line":213,"start_character":12,"end_line":213,"end_character":17},"in_reply_to":"7f96bb07_3903cd75","updated":"2018-01-15 14:23:01.000000000","message":"Same here","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"}],"setup.cfg":[{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"5589972562798a6327b3f423d65d3129a66fa136","unresolved":false,"context_lines":[{"line_number":23,"context_line":"packages \u003d"},{"line_number":24,"context_line":"    dragonflow"},{"line_number":25,"context_line":"data_files \u003d"},{"line_number":26,"context_line":"    etc/neutron/ \u003d"},{"line_number":27,"context_line":"        etc/dragonflow_datapath_layout.yaml"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"[build_sphinx]"}],"source_content_type":"text/x-ttcn-cfg","patch_set":14,"id":"7f96bb07_d9f98980","line":26,"updated":"2018-01-14 11:45:26.000000000","message":"nit: Maybe we should start using our own configuration directory, rather than piggy-backing Neutron?","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"12416139c15b3aa2601133547626f26e9ad8793c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"packages \u003d"},{"line_number":24,"context_line":"    dragonflow"},{"line_number":25,"context_line":"data_files \u003d"},{"line_number":26,"context_line":"    etc/neutron/ \u003d"},{"line_number":27,"context_line":"        etc/dragonflow_datapath_layout.yaml"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"[build_sphinx]"}],"source_content_type":"text/x-ttcn-cfg","patch_set":14,"id":"7f96bb07_b5958b42","line":26,"in_reply_to":"7f96bb07_d9f98980","updated":"2018-01-15 14:23:01.000000000","message":"I think this should be discussed separately","commit_id":"85f0bf7ee580032e6073a41e53c7a5b80cab03d0"}]}
