)]}'
{"doc/source/specs/application_decoupling.rst":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"398c779fd7d28a9a56ffc66de9147f484d2f0da0","unresolved":false,"context_lines":[{"line_number":15,"context_line":"This spec aims to propose a generic abstraction of datapath, that would allow"},{"line_number":16,"context_line":"coupling at much higher level (e.g. apps vs tables), and introduce a more"},{"line_number":17,"context_line":"backend neutral language."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Problem Description"},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"df87a7cf_73acb19e","line":18,"updated":"2017-12-20 10:34:25.000000000","message":"Please add more on the incentive of this proposal. Whose interests its going to serve?","commit_id":"1c72815ddf50db5f5f231709033513719ba22286"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"fb2c037d8351d171fac44c864fb43f80704de753","unresolved":false,"context_lines":[{"line_number":15,"context_line":"This spec aims to propose a generic abstraction of datapath, that would allow"},{"line_number":16,"context_line":"coupling at much higher level (e.g. apps vs tables), and introduce a more"},{"line_number":17,"context_line":"backend neutral language."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"Problem Description"},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"df87a7cf_6ede043f","line":18,"in_reply_to":"df87a7cf_73acb19e","updated":"2017-12-20 11:18:45.000000000","message":"Will elaborate","commit_id":"1c72815ddf50db5f5f231709033513719ba22286"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"398c779fd7d28a9a56ffc66de9147f484d2f0da0","unresolved":false,"context_lines":[{"line_number":34,"context_line":"will define its contract (entrypoints, exitpoints, used registers). All"},{"line_number":35,"context_line":"interaction with other apps will be managed through the local controller."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"At the highest level, local controller will create and maintain a datapath."},{"line_number":38,"context_line":"The datapath itself will be composed of various (datapath) elements, managed"},{"line_number":39,"context_line":"by different apps:"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"::"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"df87a7cf_9305b5c4","line":39,"range":{"start_line":37,"start_character":22,"end_line":39,"end_character":18},"updated":"2017-12-20 10:34:25.000000000","message":"The potential issue that bothers me is that there may be different versions of local controllers and somehow DP can be constructed differently. This maybe very hard to debug issues if for some reason there is no consistency across the cluster. Maybe a note should be added to address this later.","commit_id":"1c72815ddf50db5f5f231709033513719ba22286"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"238757425172cc2e727681b5d8fc1eb706819701","unresolved":false,"context_lines":[{"line_number":34,"context_line":"will define its contract (entrypoints, exitpoints, used registers). All"},{"line_number":35,"context_line":"interaction with other apps will be managed through the local controller."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"At the highest level, local controller will create and maintain a datapath."},{"line_number":38,"context_line":"The datapath itself will be composed of various (datapath) elements, managed"},{"line_number":39,"context_line":"by different apps:"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"::"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"df87a7cf_ee70d442","line":39,"range":{"start_line":37,"start_character":22,"end_line":39,"end_character":18},"in_reply_to":"df87a7cf_4ed9c053","updated":"2017-12-20 11:25:50.000000000","message":"Maybe the Data Path configuration can be distributed via DB?","commit_id":"1c72815ddf50db5f5f231709033513719ba22286"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"fb2c037d8351d171fac44c864fb43f80704de753","unresolved":false,"context_lines":[{"line_number":34,"context_line":"will define its contract (entrypoints, exitpoints, used registers). All"},{"line_number":35,"context_line":"interaction with other apps will be managed through the local controller."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"At the highest level, local controller will create and maintain a datapath."},{"line_number":38,"context_line":"The datapath itself will be composed of various (datapath) elements, managed"},{"line_number":39,"context_line":"by different apps:"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"::"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-rst","patch_set":6,"id":"df87a7cf_4ed9c053","line":39,"range":{"start_line":37,"start_character":22,"end_line":39,"end_character":18},"in_reply_to":"df87a7cf_9305b5c4","updated":"2017-12-20 11:18:45.000000000","message":"I agree with the concern. Mayby we can introduce later on, a feature where controller wires the datapaths, rather than local configuration file.\n\nThough inconsistent configuration has always been an issue.","commit_id":"1c72815ddf50db5f5f231709033513719ba22286"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"398c779fd7d28a9a56ffc66de9147f484d2f0da0","unresolved":false,"context_lines":[{"line_number":213,"context_line":"Ingress (table\u003d0) / egress (output:PORT) actions will be performed by"},{"line_number":214,"context_line":"dedidicated input/output elements."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Back on the controller level, the wiring of the elemnts will stay static"},{"line_number":217,"context_line":"throughout controller\u0027s execution, with a single flow per graph edge."},{"line_number":218,"context_line":"Each transition will take care to move relevant values into the right registers"},{"line_number":219,"context_line":"and move unrelated values out of the way if app will use their registers"}],"source_content_type":"text/x-rst","patch_set":6,"id":"df87a7cf_93bcd5dc","line":216,"range":{"start_line":216,"start_character":48,"end_line":216,"end_character":55},"updated":"2017-12-20 10:34:25.000000000","message":"typo","commit_id":"1c72815ddf50db5f5f231709033513719ba22286"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"fb2c037d8351d171fac44c864fb43f80704de753","unresolved":false,"context_lines":[{"line_number":213,"context_line":"Ingress (table\u003d0) / egress (output:PORT) actions will be performed by"},{"line_number":214,"context_line":"dedidicated input/output elements."},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"Back on the controller level, the wiring of the elemnts will stay static"},{"line_number":217,"context_line":"throughout controller\u0027s execution, with a single flow per graph edge."},{"line_number":218,"context_line":"Each transition will take care to move relevant values into the right registers"},{"line_number":219,"context_line":"and move unrelated values out of the way if app will use their registers"}],"source_content_type":"text/x-rst","patch_set":6,"id":"df87a7cf_2e71dc76","line":216,"range":{"start_line":216,"start_character":48,"end_line":216,"end_character":55},"in_reply_to":"df87a7cf_93bcd5dc","updated":"2017-12-20 11:18:45.000000000","message":"Done","commit_id":"1c72815ddf50db5f5f231709033513719ba22286"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"993bf70a08929871ddb830f23a22e4047f69d7a3","unresolved":false,"context_lines":[{"line_number":13,"context_line":"IDs (tables, groups, etc) creates a massive coupling between Dragonflow apps."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This spec aims to propose strong application isolation and decoupling in"},{"line_number":16,"context_line":"addition to configuration driver app wiring. With the first property we can"},{"line_number":17,"context_line":"make apps truly pluggable and independent. The second property allows us"},{"line_number":18,"context_line":"to offer flexible functionality, and introduce more validation into datapath"},{"line_number":19,"context_line":"construction."}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_6128d433","line":16,"range":{"start_line":16,"start_character":11,"end_line":16,"end_character":44},"updated":"2017-12-24 08:22:46.000000000","message":"What is this?","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"4ed7f57cdb9e98672968bea3cc9341b6bb704bc1","unresolved":false,"context_lines":[{"line_number":13,"context_line":"IDs (tables, groups, etc) creates a massive coupling between Dragonflow apps."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"This spec aims to propose strong application isolation and decoupling in"},{"line_number":16,"context_line":"addition to configuration driver app wiring. With the first property we can"},{"line_number":17,"context_line":"make apps truly pluggable and independent. The second property allows us"},{"line_number":18,"context_line":"to offer flexible functionality, and introduce more validation into datapath"},{"line_number":19,"context_line":"construction."}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f91af0f_7352116a","line":16,"range":{"start_line":16,"start_character":11,"end_line":16,"end_character":44},"in_reply_to":"bf8cb3f7_6128d433","updated":"2018-01-01 09:48:07.000000000","message":"Rephrased","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"72b2b42d620ae0dd3804f4d1120739dc68ef1d50","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"          entrypoints\u003d("},{"line_number":94,"context_line":"              Entrypoint("},{"line_number":95,"context_line":"                  name\u003d\u0027entry1\u0027,"},{"line_number":96,"context_line":"                  target\u003d\u0027STATE1\u0027,"},{"line_number":97,"context_line":"                  consumes\u003d(\u0027source_port_key\u0027, \u0027network_key\u0027),"},{"line_number":98,"context_line":"              ),"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_4397fb91","line":95,"updated":"2017-12-21 14:00:49.000000000","message":"Maybe to entries with the same state  - can be unified to same entry. If so - maybe entry we can use only one of those params (entry and state)","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"4204a6642845a53e6c041959a2936b70c8104565","unresolved":false,"context_lines":[{"line_number":92,"context_line":""},{"line_number":93,"context_line":"          entrypoints\u003d("},{"line_number":94,"context_line":"              Entrypoint("},{"line_number":95,"context_line":"                  name\u003d\u0027entry1\u0027,"},{"line_number":96,"context_line":"                  target\u003d\u0027STATE1\u0027,"},{"line_number":97,"context_line":"                  consumes\u003d(\u0027source_port_key\u0027, \u0027network_key\u0027),"},{"line_number":98,"context_line":"              ),"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_e1f064cc","line":95,"in_reply_to":"bf8cb3f7_4397fb91","updated":"2017-12-24 08:08:07.000000000","message":"We can, this is just an example to show entrypoint and states are decoupled.","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"72b2b42d620ae0dd3804f4d1120739dc68ef1d50","unresolved":false,"context_lines":[{"line_number":94,"context_line":"              Entrypoint("},{"line_number":95,"context_line":"                  name\u003d\u0027entry1\u0027,"},{"line_number":96,"context_line":"                  target\u003d\u0027STATE1\u0027,"},{"line_number":97,"context_line":"                  consumes\u003d(\u0027source_port_key\u0027, \u0027network_key\u0027),"},{"line_number":98,"context_line":"              ),"},{"line_number":99,"context_line":"              Entrypoint("},{"line_number":100,"context_line":"                  name\u003d\u0027entry2\u0027,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_e3640fbc","line":97,"updated":"2017-12-21 14:00:49.000000000","message":"and another thing - \nI understand why app have many exit states - as the state is actually the decision of the app .  \nBut  why app need entry states? It\u0027s had all needed data by the register that it\u0027s consume.","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"4204a6642845a53e6c041959a2936b70c8104565","unresolved":false,"context_lines":[{"line_number":94,"context_line":"              Entrypoint("},{"line_number":95,"context_line":"                  name\u003d\u0027entry1\u0027,"},{"line_number":96,"context_line":"                  target\u003d\u0027STATE1\u0027,"},{"line_number":97,"context_line":"                  consumes\u003d(\u0027source_port_key\u0027, \u0027network_key\u0027),"},{"line_number":98,"context_line":"              ),"},{"line_number":99,"context_line":"              Entrypoint("},{"line_number":100,"context_line":"                  name\u003d\u0027entry2\u0027,"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_81e078fc","line":97,"in_reply_to":"bf8cb3f7_e3640fbc","updated":"2017-12-24 08:08:07.000000000","message":"Trunk app: classification vs dispatch, both are different flows in the same app.","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"993bf70a08929871ddb830f23a22e4047f69d7a3","unresolved":false,"context_lines":[{"line_number":120,"context_line":"          )"},{"line_number":121,"context_line":"      )"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Local controller will receive an external configuration for datapath layout,"},{"line_number":125,"context_line":"and will create the relevant links between the elements. All links will be"},{"line_number":126,"context_line":"described in a simple format, we can use DOT or come up with our own."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"The application list as it is will be removed, and applications will be"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_21d08c1f","line":125,"range":{"start_line":123,"start_character":0,"end_line":125,"end_character":55},"updated":"2017-12-24 08:22:46.000000000","message":"How the order of apps is going to be determined?","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"4ed7f57cdb9e98672968bea3cc9341b6bb704bc1","unresolved":false,"context_lines":[{"line_number":120,"context_line":"          )"},{"line_number":121,"context_line":"      )"},{"line_number":122,"context_line":""},{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Local controller will receive an external configuration for datapath layout,"},{"line_number":125,"context_line":"and will create the relevant links between the elements. All links will be"},{"line_number":126,"context_line":"described in a simple format, we can use DOT or come up with our own."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"The application list as it is will be removed, and applications will be"}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f91af0f_134f05be","line":125,"range":{"start_line":123,"start_character":0,"end_line":125,"end_character":55},"in_reply_to":"bf8cb3f7_21d08c1f","updated":"2018-01-01 09:48:07.000000000","message":"We will supply a configuration (or several) that connect together the apps supplied by DF, we should also aim to document each app\u0027s datapath footprint so whoever adds 3rd party apps will have reasonable understanding where his or her app should go.","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"993bf70a08929871ddb830f23a22e4047f69d7a3","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"On the application level, we\u0027ll leave most of the code unchanged. Each"},{"line_number":202,"context_line":"application will declare the groups, tables, and registers it needs. After"},{"line_number":203,"context_line":"app initalization, datapath code will allocate all required IDs. The"},{"line_number":204,"context_line":"application will use the allocated IDs rather that constants currently used."},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"We will impose further restrictions on application code, the application ..."}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_01c5485b","line":203,"range":{"start_line":203,"start_character":60,"end_line":203,"end_character":63},"updated":"2017-12-24 08:22:46.000000000","message":"IDs for what?","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"4ed7f57cdb9e98672968bea3cc9341b6bb704bc1","unresolved":false,"context_lines":[{"line_number":200,"context_line":""},{"line_number":201,"context_line":"On the application level, we\u0027ll leave most of the code unchanged. Each"},{"line_number":202,"context_line":"application will declare the groups, tables, and registers it needs. After"},{"line_number":203,"context_line":"app initalization, datapath code will allocate all required IDs. The"},{"line_number":204,"context_line":"application will use the allocated IDs rather that constants currently used."},{"line_number":205,"context_line":""},{"line_number":206,"context_line":"We will impose further restrictions on application code, the application ..."}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f91af0f_d3c67d17","line":203,"range":{"start_line":203,"start_character":60,"end_line":203,"end_character":63},"in_reply_to":"bf8cb3f7_01c5485b","updated":"2018-01-01 09:48:07.000000000","message":"Tables, Groups, and any other OpenFlow resources (maybe meters when they\u0027re available?). Will add to spec","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"993bf70a08929871ddb830f23a22e4047f69d7a3","unresolved":false,"context_lines":[{"line_number":215,"context_line":"Ingress (table\u003d0) / egress (output:PORT) actions will be performed by"},{"line_number":216,"context_line":"dedidicated input/output elements."},{"line_number":217,"context_line":""},{"line_number":218,"context_line":"Back on the controller level, the wiring of the elements will stay static"},{"line_number":219,"context_line":"throughout controller\u0027s execution, with a single flow per graph edge."},{"line_number":220,"context_line":"Each transition will take care to move relevant values into the right registers"},{"line_number":221,"context_line":"and move unrelated values out of the way if app will use their registers"},{"line_number":222,"context_line":"internally."},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"The following edge:"},{"line_number":225,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_2195ec40","line":222,"range":{"start_line":218,"start_character":0,"end_line":222,"end_character":11},"updated":"2017-12-24 08:22:46.000000000","message":"This is not clear. Maybe worth to add separate section explaining what will be the responsibility of the Controller","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":26131,"name":"Eyal Leshem","email":"eyal.leshem@toganetworks.com","username":"leyal"},"change_message_id":"4896529f17451cca4fd16bbade3c410ba7e26e34","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":"The following edge:"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"::"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"  +-------------+    +-----------+"},{"line_number":229,"context_line":"  |APP1         |    |APP2       |"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_fa3a89cb","line":226,"updated":"2017-12-20 16:42:50.000000000","message":"whats happened if APP3 -that not connected directly to APP1 but connected to APP2- uses \u0027a\u0027 and APP2 not uses \u0027a\u0027 ?","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"4204a6642845a53e6c041959a2936b70c8104565","unresolved":false,"context_lines":[{"line_number":223,"context_line":""},{"line_number":224,"context_line":"The following edge:"},{"line_number":225,"context_line":""},{"line_number":226,"context_line":"::"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"  +-------------+    +-----------+"},{"line_number":229,"context_line":"  |APP1         |    |APP2       |"}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_a1bc9cdc","line":226,"in_reply_to":"bf8cb3f7_fa3a89cb","updated":"2017-12-24 08:08:07.000000000","message":"Variable a has to be save in a register unused by app 2.","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"993bf70a08929871ddb830f23a22e4047f69d7a3","unresolved":false,"context_lines":[{"line_number":242,"context_line":".. code::"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"  table_id\u003dAPP1:out:EXIT1, match\u003d*any*,actions\u003dmove(reg1-\u003ereg6),move(reg2-\u003ereg7),goto:APP2:in:ENTRY1.target"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"References"},{"line_number":247,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"bf8cb3f7_4190304f","line":245,"updated":"2017-12-24 08:22:46.000000000","message":"Need to add section explaining the impact on the users: app developer, operator.","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"4ed7f57cdb9e98672968bea3cc9341b6bb704bc1","unresolved":false,"context_lines":[{"line_number":242,"context_line":".. code::"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":"  table_id\u003dAPP1:out:EXIT1, match\u003d*any*,actions\u003dmove(reg1-\u003ereg6),move(reg2-\u003ereg7),goto:APP2:in:ENTRY1.target"},{"line_number":245,"context_line":""},{"line_number":246,"context_line":"References"},{"line_number":247,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":248,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"9f91af0f_d3199d88","line":245,"in_reply_to":"bf8cb3f7_4190304f","updated":"2018-01-01 09:48:07.000000000","message":"Done","commit_id":"cdf54e01fa872723c3e30929e9cb7883b5b81b31"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4c2dab77bc949ebfe021660d2909f76d18f51309","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Local controller will receive an external configuration for datapath layout,"},{"line_number":125,"context_line":"and will create the relevant links between the elements. All links will be"},{"line_number":126,"context_line":"described in a simple format, we can use DOT or come up with our own."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"The application list as it is will be removed, and applications will be"},{"line_number":129,"context_line":"instantiated based on what is defined in the wiring configuration."}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f91af0f_3f73e882","line":126,"range":{"start_line":126,"start_character":30,"end_line":126,"end_character":69},"updated":"2018-01-01 13:37:49.000000000","message":"I thought we settled on a yaml configuration?","commit_id":"8da392c51b3891c1bf3a85c53c1a96496b584113"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b4b50925434598640133e0ffa59db3718bad58ad","unresolved":false,"context_lines":[{"line_number":123,"context_line":""},{"line_number":124,"context_line":"Local controller will receive an external configuration for datapath layout,"},{"line_number":125,"context_line":"and will create the relevant links between the elements. All links will be"},{"line_number":126,"context_line":"described in a simple format, we can use DOT or come up with our own."},{"line_number":127,"context_line":""},{"line_number":128,"context_line":"The application list as it is will be removed, and applications will be"},{"line_number":129,"context_line":"instantiated based on what is defined in the wiring configuration."}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f91af0f_a86308b1","line":126,"range":{"start_line":126,"start_character":30,"end_line":126,"end_character":69},"in_reply_to":"9f91af0f_3f73e882","updated":"2018-01-04 15:32:07.000000000","message":"Changed","commit_id":"8da392c51b3891c1bf3a85c53c1a96496b584113"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"4c2dab77bc949ebfe021660d2909f76d18f51309","unresolved":false,"context_lines":[{"line_number":177,"context_line":"       type: firewall"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"  edges:"},{"line_number":180,"context_line":"    pr.out.default: l2.in.default"},{"line_number":181,"context_line":"    in.out.vm-egress: ps.in.default"},{"line_number":182,"context_line":"    ps.out.accept: sg.in.egress"},{"line_number":183,"context_line":"    sg.out.egress-accept: l2.in.default"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f91af0f_5f702c73","line":180,"range":{"start_line":180,"start_character":7,"end_line":180,"end_character":10},"updated":"2018-01-01 13:37:49.000000000","message":"nit: I still think this is redundant. Especially in yaml format.","commit_id":"8da392c51b3891c1bf3a85c53c1a96496b584113"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b4b50925434598640133e0ffa59db3718bad58ad","unresolved":false,"context_lines":[{"line_number":177,"context_line":"       type: firewall"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"  edges:"},{"line_number":180,"context_line":"    pr.out.default: l2.in.default"},{"line_number":181,"context_line":"    in.out.vm-egress: ps.in.default"},{"line_number":182,"context_line":"    ps.out.accept: sg.in.egress"},{"line_number":183,"context_line":"    sg.out.egress-accept: l2.in.default"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f91af0f_a83a2895","line":180,"range":{"start_line":180,"start_character":7,"end_line":180,"end_character":10},"in_reply_to":"9f91af0f_5f702c73","updated":"2018-01-04 15:32:07.000000000","message":"I think that explicitness will make reading a bit easier.","commit_id":"8da392c51b3891c1bf3a85c53c1a96496b584113"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"3c7b62f378d6888f1c9dbc57c055b225abe91011","unresolved":false,"context_lines":[{"line_number":272,"context_line":"Generating datapath IDs on start-up will cause different IDs for various apps."},{"line_number":273,"context_line":"This will reduce troubleshooting abilites of installed flows. We\u0027ll need to"},{"line_number":274,"context_line":"introduce new tooling that will translate and annotate installed flows."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"Operator impact"},{"line_number":277,"context_line":"---------------"},{"line_number":278,"context_line":"Operators did not have much control over the datapath (beyond configurable"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f91af0f_04f33da0","line":275,"updated":"2018-01-01 10:48:25.000000000","message":"Maybe there can be at least cli to get the id to app mapping for the current execution, also need some way to make logging readable","commit_id":"8da392c51b3891c1bf3a85c53c1a96496b584113"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"b4b50925434598640133e0ffa59db3718bad58ad","unresolved":false,"context_lines":[{"line_number":272,"context_line":"Generating datapath IDs on start-up will cause different IDs for various apps."},{"line_number":273,"context_line":"This will reduce troubleshooting abilites of installed flows. We\u0027ll need to"},{"line_number":274,"context_line":"introduce new tooling that will translate and annotate installed flows."},{"line_number":275,"context_line":""},{"line_number":276,"context_line":"Operator impact"},{"line_number":277,"context_line":"---------------"},{"line_number":278,"context_line":"Operators did not have much control over the datapath (beyond configurable"}],"source_content_type":"text/x-rst","patch_set":10,"id":"9f91af0f_c8544ccd","line":275,"in_reply_to":"9f91af0f_04f33da0","updated":"2018-01-04 15:32:07.000000000","message":"I think we can use Schahar\u0027s approach, just extract table names dynamically.","commit_id":"8da392c51b3891c1bf3a85c53c1a96496b584113"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"915e6d6a5b66136b31ae1b96ff79344ba4fb7a82","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"All Dragonflow apps have a specific flow structure, and a specific location"},{"line_number":25,"context_line":"across OVS tables. When picking a table extra care must be taken to avoid"},{"line_number":26,"context_line":"stepping on flows from another app. Additionally, in tables where a branching"},{"line_number":27,"context_line":"decision has to be made, priorities have to be coordinated as well. Finally,"},{"line_number":28,"context_line":"when some app decides to store some kind of state on the packet, it has to make"},{"line_number":29,"context_line":"sure the register used does not contain any special info another app will"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_c948a588","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":11},"updated":"2018-01-07 08:18:23.000000000","message":"overriding?","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"45aac7486b739505ba3414c067244e0db4a90bc3","unresolved":false,"context_lines":[{"line_number":23,"context_line":""},{"line_number":24,"context_line":"All Dragonflow apps have a specific flow structure, and a specific location"},{"line_number":25,"context_line":"across OVS tables. When picking a table extra care must be taken to avoid"},{"line_number":26,"context_line":"stepping on flows from another app. Additionally, in tables where a branching"},{"line_number":27,"context_line":"decision has to be made, priorities have to be coordinated as well. Finally,"},{"line_number":28,"context_line":"when some app decides to store some kind of state on the packet, it has to make"},{"line_number":29,"context_line":"sure the register used does not contain any special info another app will"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_38a95823","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":11},"in_reply_to":"9f91af0f_c948a588","updated":"2018-01-07 15:16:14.000000000","message":"Done","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"915e6d6a5b66136b31ae1b96ff79344ba4fb7a82","unresolved":false,"context_lines":[{"line_number":32,"context_line":"Proposed Change"},{"line_number":33,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"This spec proposes to isolate each app from all other applications. Each app"},{"line_number":36,"context_line":"will define its contract (entrypoints, exitpoints, used registers). All"},{"line_number":37,"context_line":"interaction with other apps will be managed through the local controller."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_2957d128","line":35,"range":{"start_line":35,"start_character":34,"end_line":35,"end_character":66},"updated":"2018-01-07 08:18:23.000000000","message":"either \"app from all other apps\" or \"application from all other applications\"","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"45aac7486b739505ba3414c067244e0db4a90bc3","unresolved":false,"context_lines":[{"line_number":32,"context_line":"Proposed Change"},{"line_number":33,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"This spec proposes to isolate each app from all other applications. Each app"},{"line_number":36,"context_line":"will define its contract (entrypoints, exitpoints, used registers). All"},{"line_number":37,"context_line":"interaction with other apps will be managed through the local controller."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_b86a48ea","line":35,"range":{"start_line":35,"start_character":34,"end_line":35,"end_character":66},"in_reply_to":"9f91af0f_2957d128","updated":"2018-01-07 15:16:14.000000000","message":"Done","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"915e6d6a5b66136b31ae1b96ff79344ba4fb7a82","unresolved":false,"context_lines":[{"line_number":58,"context_line":"  |                                          |"},{"line_number":59,"context_line":"  +------------------------------------------+"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Each app will be considered a single datapath element. Each element will define"},{"line_number":62,"context_line":"its states/tables, entry/exitpoints and used variables:"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_49549521","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":53},"updated":"2018-01-07 08:18:23.000000000","message":"is the app the element, or as mentioned above, \"various (datapath) elements, *managed by* different apps\"","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"45aac7486b739505ba3414c067244e0db4a90bc3","unresolved":false,"context_lines":[{"line_number":58,"context_line":"  |                                          |"},{"line_number":59,"context_line":"  +------------------------------------------+"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"Each app will be considered a single datapath element. Each element will define"},{"line_number":62,"context_line":"its states/tables, entry/exitpoints and used variables:"},{"line_number":63,"context_line":""},{"line_number":64,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_58a69c55","line":61,"range":{"start_line":61,"start_character":0,"end_line":61,"end_character":53},"in_reply_to":"9f91af0f_49549521","updated":"2018-01-07 15:16:14.000000000","message":"Done","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"915e6d6a5b66136b31ae1b96ff79344ba4fb7a82","unresolved":false,"context_lines":[{"line_number":177,"context_line":"       type: firewall"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"  edges:"},{"line_number":180,"context_line":"    pr.out.default: l2.in.default"},{"line_number":181,"context_line":"    in.out.vm-egress: ps.in.default"},{"line_number":182,"context_line":"    ps.out.accept: sg.in.egress"},{"line_number":183,"context_line":"    sg.out.egress-accept: l2.in.default"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_0938cdec","line":180,"range":{"start_line":180,"start_character":4,"end_line":180,"end_character":6},"updated":"2018-01-07 08:18:23.000000000","message":"where do you have the mapping between provider to pr?\nor portsec to ps?\nIt should be defined somewhere","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"45aac7486b739505ba3414c067244e0db4a90bc3","unresolved":false,"context_lines":[{"line_number":177,"context_line":"       type: firewall"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"  edges:"},{"line_number":180,"context_line":"    pr.out.default: l2.in.default"},{"line_number":181,"context_line":"    in.out.vm-egress: ps.in.default"},{"line_number":182,"context_line":"    ps.out.accept: sg.in.egress"},{"line_number":183,"context_line":"    sg.out.egress-accept: l2.in.default"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_f8645024","line":180,"range":{"start_line":180,"start_character":4,"end_line":180,"end_character":6},"in_reply_to":"9f91af0f_0938cdec","updated":"2018-01-07 15:16:14.000000000","message":"Fixed","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"915e6d6a5b66136b31ae1b96ff79344ba4fb7a82","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    l3.out.ingress-match: fw.in.egress"},{"line_number":186,"context_line":"    fw.out.egress-accept: l3.in.route"},{"line_number":187,"context_line":"    l3.out.post-route: fw.in.ingress"},{"line_number":188,"context_line":"    fw.out.ingress-accept: l2.in.default"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"In the above config, edges are connected between entrypoints and exitpoints."},{"line_number":191,"context_line":"The notation specified by: APP_INSTANCE.ENDPOINT_TYPE.ENDPOINT_NAME"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_c93d05de","line":188,"updated":"2018-01-07 08:18:23.000000000","message":"please also provide an example for a valid exit point from the datapath (e.g. exit from l3 port filter)","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"3e285c5b3d1e26f79d8abda89ffc8161a4b367cc","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    l3.out.ingress-match: fw.in.egress"},{"line_number":186,"context_line":"    fw.out.egress-accept: l3.in.route"},{"line_number":187,"context_line":"    l3.out.post-route: fw.in.ingress"},{"line_number":188,"context_line":"    fw.out.ingress-accept: l2.in.default"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"In the above config, edges are connected between entrypoints and exitpoints."},{"line_number":191,"context_line":"The notation specified by: APP_INSTANCE.ENDPOINT_TYPE.ENDPOINT_NAME"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_02789f8d","line":188,"in_reply_to":"9f91af0f_587bfcbc","updated":"2018-01-08 06:37:11.000000000","message":"Personally I prefer the former. It creates symmetry between the input and the output.","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"45aac7486b739505ba3414c067244e0db4a90bc3","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    l3.out.ingress-match: fw.in.egress"},{"line_number":186,"context_line":"    fw.out.egress-accept: l3.in.route"},{"line_number":187,"context_line":"    l3.out.post-route: fw.in.ingress"},{"line_number":188,"context_line":"    fw.out.ingress-accept: l2.in.default"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"In the above config, edges are connected between entrypoints and exitpoints."},{"line_number":191,"context_line":"The notation specified by: APP_INSTANCE.ENDPOINT_TYPE.ENDPOINT_NAME"}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_587bfcbc","line":188,"in_reply_to":"9f91af0f_c93d05de","updated":"2018-01-07 15:16:14.000000000","message":"Exit from the graph are not in the scope of this composition.\nWe\u0027ll either have a single Output element, that will dispatch by some variable, or each app will dispatch to it\u0027s relevant exits (Metadata will egress to metadata tap port)","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"915e6d6a5b66136b31ae1b96ff79344ba4fb7a82","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"On the application level, we\u0027ll leave most of the code unchanged. Each"},{"line_number":216,"context_line":"application will declare the groups, tables, and registers it needs. After"},{"line_number":217,"context_line":"app initalization, datapath code will allocate all required IDs. The"},{"line_number":218,"context_line":"application will use the allocated IDs rather that constants currently used."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"We will impose further restrictions on application code, the application ..."}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_292cb1aa","line":217,"range":{"start_line":217,"start_character":19,"end_line":217,"end_character":63},"updated":"2018-01-07 08:18:23.000000000","message":"So in theory, each table may get different IDs each time the app is initialized?\nThis may make the debugging more challenging...","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"45aac7486b739505ba3414c067244e0db4a90bc3","unresolved":false,"context_lines":[{"line_number":214,"context_line":""},{"line_number":215,"context_line":"On the application level, we\u0027ll leave most of the code unchanged. Each"},{"line_number":216,"context_line":"application will declare the groups, tables, and registers it needs. After"},{"line_number":217,"context_line":"app initalization, datapath code will allocate all required IDs. The"},{"line_number":218,"context_line":"application will use the allocated IDs rather that constants currently used."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"We will impose further restrictions on application code, the application ..."}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_d8486c88","line":217,"range":{"start_line":217,"start_character":19,"end_line":217,"end_character":63},"in_reply_to":"9f91af0f_292cb1aa","updated":"2018-01-07 15:16:14.000000000","message":"Yes, table IDs are going to be autogenerated. This will make debugging harder but that\u0027s the only way we can avoid collisions between apps.\nI think with appropriate tooling we can achieve similar debuggability.","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"915e6d6a5b66136b31ae1b96ff79344ba4fb7a82","unresolved":false,"context_lines":[{"line_number":217,"context_line":"app initalization, datapath code will allocate all required IDs. The"},{"line_number":218,"context_line":"application will use the allocated IDs rather that constants currently used."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"We will impose further restrictions on application code, the application ..."},{"line_number":221,"context_line":""},{"line_number":222,"context_line":" * ... will not install flows outside in its private tables."},{"line_number":223,"context_line":" * ... will goto/resubmit only into its own tables."}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_e91b297e","line":220,"range":{"start_line":220,"start_character":0,"end_line":220,"end_character":22},"updated":"2018-01-07 08:18:23.000000000","message":"who will perform these restrictions?","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"3e285c5b3d1e26f79d8abda89ffc8161a4b367cc","unresolved":false,"context_lines":[{"line_number":217,"context_line":"app initalization, datapath code will allocate all required IDs. The"},{"line_number":218,"context_line":"application will use the allocated IDs rather that constants currently used."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"We will impose further restrictions on application code, the application ..."},{"line_number":221,"context_line":""},{"line_number":222,"context_line":" * ... will not install flows outside in its private tables."},{"line_number":223,"context_line":" * ... will goto/resubmit only into its own tables."}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_2206031f","line":220,"range":{"start_line":220,"start_character":0,"end_line":220,"end_character":22},"in_reply_to":"9f91af0f_985e6442","updated":"2018-01-08 06:37:11.000000000","message":"I believe that leaving it up to the developer leaves too much room for abuse :)\nMaybe we should consider having a simple validator that will perform basic stuff on the first stage (not yet sure how to do it), and extend it in the future?","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"45aac7486b739505ba3414c067244e0db4a90bc3","unresolved":false,"context_lines":[{"line_number":217,"context_line":"app initalization, datapath code will allocate all required IDs. The"},{"line_number":218,"context_line":"application will use the allocated IDs rather that constants currently used."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"We will impose further restrictions on application code, the application ..."},{"line_number":221,"context_line":""},{"line_number":222,"context_line":" * ... will not install flows outside in its private tables."},{"line_number":223,"context_line":" * ... will goto/resubmit only into its own tables."}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_985e6442","line":220,"range":{"start_line":220,"start_character":0,"end_line":220,"end_character":22},"in_reply_to":"9f91af0f_e91b297e","updated":"2018-01-07 15:16:14.000000000","message":"First of all, the developer upon himself. Down the road we can insert a validator level that intercepts all mod_flows (and the likes) of an app, and makes sure all tables/registers/etc are valid. Once we have it we can gate all our apps with the validator (might not make sense to run in a real deployment)","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"915e6d6a5b66136b31ae1b96ff79344ba4fb7a82","unresolved":false,"context_lines":[{"line_number":233,"context_line":"throughout controller\u0027s execution, with a single flow per graph edge."},{"line_number":234,"context_line":"Each transition will take care to move relevant values into the right registers"},{"line_number":235,"context_line":"and move unrelated values out of the way if app will use their registers"},{"line_number":236,"context_line":"internally."},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"The following edge:"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_690f1937","line":236,"updated":"2018-01-07 08:18:23.000000000","message":"I may be missing something here, but it may require some lookahead here, as we may lose some information if it is not used in the next step, but required in the one after it?\nAlso, what happens to information we put aside when some register contains information and we need to re-purpose it?","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"3e285c5b3d1e26f79d8abda89ffc8161a4b367cc","unresolved":false,"context_lines":[{"line_number":233,"context_line":"throughout controller\u0027s execution, with a single flow per graph edge."},{"line_number":234,"context_line":"Each transition will take care to move relevant values into the right registers"},{"line_number":235,"context_line":"and move unrelated values out of the way if app will use their registers"},{"line_number":236,"context_line":"internally."},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"The following edge:"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_62308be9","line":236,"in_reply_to":"9f91af0f_58545c21","updated":"2018-01-08 06:37:11.000000000","message":"So the controller will make sure to set all the saving/restoring of the registers when entering/leaving a table?","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"6cb332329b4a158755f6112aeff34be73c90c4f5","unresolved":false,"context_lines":[{"line_number":233,"context_line":"throughout controller\u0027s execution, with a single flow per graph edge."},{"line_number":234,"context_line":"Each transition will take care to move relevant values into the right registers"},{"line_number":235,"context_line":"and move unrelated values out of the way if app will use their registers"},{"line_number":236,"context_line":"internally."},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"The following edge:"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_dd113606","line":236,"in_reply_to":"9f91af0f_62308be9","updated":"2018-01-08 07:38:16.000000000","message":"Yes, the controller will take care of:\n\n* moving the variables into the correct registers for each app\n* making sure private registers can be used by app\n* storing unused variables in unused registers/stack.","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"45aac7486b739505ba3414c067244e0db4a90bc3","unresolved":false,"context_lines":[{"line_number":233,"context_line":"throughout controller\u0027s execution, with a single flow per graph edge."},{"line_number":234,"context_line":"Each transition will take care to move relevant values into the right registers"},{"line_number":235,"context_line":"and move unrelated values out of the way if app will use their registers"},{"line_number":236,"context_line":"internally."},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"The following edge:"},{"line_number":239,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_58545c21","line":236,"in_reply_to":"9f91af0f_690f1937","updated":"2018-01-07 15:16:14.000000000","message":"The controller will take care of saving and restoring the variables. Each app has a specific location for every variable (even those not used / declared in the mapping). From this point, it\u0027s just a matter of moving each variable to the correct register before entering the app.","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"915e6d6a5b66136b31ae1b96ff79344ba4fb7a82","unresolved":false,"context_lines":[{"line_number":286,"context_line":"make sure the application obeys the new semantics. Application developer will"},{"line_number":287,"context_line":"not be able to use table IDs from the constants module, and will have to"},{"line_number":288,"context_line":"allocate used resources through APIs."},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"References"},{"line_number":291,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_0406741e","line":289,"updated":"2018-01-07 08:18:23.000000000","message":"I do not see any definition of the tables in the spec, so just to make sure I get it right, each app has one table allocated to it, and we consider app\u003c\u003d\u003etable ?","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"45aac7486b739505ba3414c067244e0db4a90bc3","unresolved":false,"context_lines":[{"line_number":286,"context_line":"make sure the application obeys the new semantics. Application developer will"},{"line_number":287,"context_line":"not be able to use table IDs from the constants module, and will have to"},{"line_number":288,"context_line":"allocate used resources through APIs."},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"References"},{"line_number":291,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_183814ed","line":289,"in_reply_to":"9f91af0f_0406741e","updated":"2018-01-07 15:16:14.000000000","message":"An app can declare states in its contract. Each state is a table in the current implementation.","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"3e285c5b3d1e26f79d8abda89ffc8161a4b367cc","unresolved":false,"context_lines":[{"line_number":286,"context_line":"make sure the application obeys the new semantics. Application developer will"},{"line_number":287,"context_line":"not be able to use table IDs from the constants module, and will have to"},{"line_number":288,"context_line":"allocate used resources through APIs."},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"References"},{"line_number":291,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":292,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"9f91af0f_e259fb34","line":289,"in_reply_to":"9f91af0f_183814ed","updated":"2018-01-08 06:37:11.000000000","message":"got it, thanks.","commit_id":"bf2c01f81fad91a2af882d350ffe092cc12bd8f2"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"64d0fd1d9393ff002aa1099918e5e9048095787d","unresolved":false,"context_lines":[{"line_number":227,"context_line":" * ... will inject packet out only to its own tables."},{"line_number":228,"context_line":""},{"line_number":229,"context_line":"Ingress (table\u003d0) / egress (output:PORT) actions will be performed by"},{"line_number":230,"context_line":"dedidicated input/output elements."},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"Back on the controller level, the wiring of the elements will stay static"},{"line_number":233,"context_line":"throughout controller\u0027s execution, with a single flow per graph edge."}],"source_content_type":"text/x-rst","patch_set":13,"id":"9f91af0f_5a208cac","line":230,"range":{"start_line":230,"start_character":0,"end_line":230,"end_character":11},"updated":"2018-01-10 10:07:40.000000000","message":"typo","commit_id":"03f391c429dddddc8b460f0e13949016fc52dd82"}],"doc/source/specs/datapath_abstraction.rst":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"1b47bbf9ab9b6be4392636f145cecb7adfa6edc0","unresolved":false,"context_lines":[{"line_number":23,"context_line":"Problem Description"},{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"All of our apps have a specific flow structure, and a specific location in"},{"line_number":27,"context_line":"across our tables. When picking a table extra care must be taken to avoid"},{"line_number":28,"context_line":"stepping on flows from another app. Additionally, in tables where a branching"},{"line_number":29,"context_line":"descision has to be made, a priorities have to be coordinated as well. Finally,"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_30b54bce","line":26,"range":{"start_line":26,"start_character":7,"end_line":26,"end_character":10},"updated":"2017-09-13 06:52:58.000000000","message":"Dragonflow","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"1b47bbf9ab9b6be4392636f145cecb7adfa6edc0","unresolved":false,"context_lines":[{"line_number":24,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"All of our apps have a specific flow structure, and a specific location in"},{"line_number":27,"context_line":"across our tables. When picking a table extra care must be taken to avoid"},{"line_number":28,"context_line":"stepping on flows from another app. Additionally, in tables where a branching"},{"line_number":29,"context_line":"descision has to be made, a priorities have to be coordinated as well. Finally,"},{"line_number":30,"context_line":"when some app decides to store some kind of state on the packet, it has to make"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_f0c6a349","line":27,"range":{"start_line":27,"start_character":7,"end_line":27,"end_character":10},"updated":"2017-09-13 06:52:58.000000000","message":"ovs?","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"1b47bbf9ab9b6be4392636f145cecb7adfa6edc0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"All of our apps have a specific flow structure, and a specific location in"},{"line_number":27,"context_line":"across our tables. When picking a table extra care must be taken to avoid"},{"line_number":28,"context_line":"stepping on flows from another app. Additionally, in tables where a branching"},{"line_number":29,"context_line":"descision has to be made, a priorities have to be coordinated as well. Finally,"},{"line_number":30,"context_line":"when some app decides to store some kind of state on the packet, it has to make"},{"line_number":31,"context_line":"sure the register used does not contain any special info another app will"},{"line_number":32,"context_line":"expect to find later on."}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_90dd1f16","line":29,"range":{"start_line":29,"start_character":26,"end_line":29,"end_character":27},"updated":"2017-09-13 06:52:58.000000000","message":"remove","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"1b47bbf9ab9b6be4392636f145cecb7adfa6edc0","unresolved":false,"context_lines":[{"line_number":26,"context_line":"All of our apps have a specific flow structure, and a specific location in"},{"line_number":27,"context_line":"across our tables. When picking a table extra care must be taken to avoid"},{"line_number":28,"context_line":"stepping on flows from another app. Additionally, in tables where a branching"},{"line_number":29,"context_line":"descision has to be made, a priorities have to be coordinated as well. Finally,"},{"line_number":30,"context_line":"when some app decides to store some kind of state on the packet, it has to make"},{"line_number":31,"context_line":"sure the register used does not contain any special info another app will"},{"line_number":32,"context_line":"expect to find later on."}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_d0c5e73d","line":29,"range":{"start_line":29,"start_character":0,"end_line":29,"end_character":9},"updated":"2017-09-13 06:52:58.000000000","message":"typo","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"1b47bbf9ab9b6be4392636f145cecb7adfa6edc0","unresolved":false,"context_lines":[{"line_number":30,"context_line":"when some app decides to store some kind of state on the packet, it has to make"},{"line_number":31,"context_line":"sure the register used does not contain any special info another app will"},{"line_number":32,"context_line":"expect to find later on."},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"Proposed Change"},{"line_number":35,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":36,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_50e7b7e5","line":33,"updated":"2017-09-13 06:52:58.000000000","message":"In other words, tight coupling between applications","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"1b47bbf9ab9b6be4392636f145cecb7adfa6edc0","unresolved":false,"context_lines":[{"line_number":80,"context_line":"  +-----------------------------------------------------------+"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"This representation suggests a graph with states and transitions, with each"},{"line_number":84,"context_line":"block as above being a piece of logic contained within the boundaries of the"},{"line_number":85,"context_line":"application. This will be called *DatapathElement*, it will contain the"},{"line_number":86,"context_line":"following attributes:"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_d0da8715","line":83,"range":{"start_line":83,"start_character":31,"end_line":83,"end_character":64},"updated":"2017-09-13 06:52:58.000000000","message":"state machine","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"1b47bbf9ab9b6be4392636f145cecb7adfa6edc0","unresolved":false,"context_lines":[{"line_number":95,"context_line":"To store extra information about the packet, an app will be able to define"},{"line_number":96,"context_line":"\u0027variables\u0027 - a logical definitions that will reserve the relevant packet"},{"line_number":97,"context_line":"specific storage space. A variable will be either local - internal to the"},{"line_number":98,"context_line":"element (to app information between internal states) or global, if the"},{"line_number":99,"context_line":"information will be required for other apps or other elements of the same app."},{"line_number":100,"context_line":""},{"line_number":101,"context_line":"Each app will define the variables it provides publically, and variables it"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_5000d767","line":98,"range":{"start_line":98,"start_character":0,"end_line":98,"end_character":7},"updated":"2017-09-13 06:52:58.000000000","message":"please define \u0027element\u0027","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"1b47bbf9ab9b6be4392636f145cecb7adfa6edc0","unresolved":false,"context_lines":[{"line_number":101,"context_line":"Each app will define the variables it provides publically, and variables it"},{"line_number":102,"context_line":"consumes. This will be used for datapath assembly, and checking correctness."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Once we have our apps, we have to construct the datapath itself, i.e. how apps"},{"line_number":105,"context_line":"interact one with the other."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"We would like to chain the final state on one app to the start state of another"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_30030b76","line":104,"range":{"start_line":104,"start_character":13,"end_line":104,"end_character":16},"updated":"2017-09-13 06:52:58.000000000","message":"all","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e6980b3b6c78990015d81561f55df40fdcf70854","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"We would like to chain the final state on one app to the start state of another"},{"line_number":108,"context_line":"and so on. In the inter-app graph, there are no conditional edges. All"},{"line_number":109,"context_line":"descisions happend at app\u0027s datapath element level."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Example:"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_ef123909","line":109,"updated":"2017-09-13 13:03:11.000000000","message":"I think an example of multiple exit nodes is needed.","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"1b47bbf9ab9b6be4392636f145cecb7adfa6edc0","unresolved":false,"context_lines":[{"line_number":107,"context_line":"We would like to chain the final state on one app to the start state of another"},{"line_number":108,"context_line":"and so on. In the inter-app graph, there are no conditional edges. All"},{"line_number":109,"context_line":"descisions happend at app\u0027s datapath element level."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Example:"},{"line_number":112,"context_line":""},{"line_number":113,"context_line":"::"}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_d0f3a79d","line":110,"updated":"2017-09-13 06:52:58.000000000","message":"Build hierarchical State Machine?","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":20229,"name":"Omer Anson","email":"omer.anson@toganetworks.com","username":"oanson"},"change_message_id":"e6980b3b6c78990015d81561f55df40fdcf70854","unresolved":false,"context_lines":[{"line_number":144,"context_line":""},{"line_number":145,"context_line":"  digraph dragonflow {"},{"line_number":146,"context_line":"    provider -\u003e l2"},{"line_number":147,"context_line":"    vm-ingress -\u003e portsec -\u003e secgroup -\u003e l2 -\u003e l3-filter -\u003e ..."},{"line_number":148,"context_line":"    l3-filter.match -\u003e egress-fw -\u003e l3 -\u003e ingress-fw -\u003e l2"},{"line_number":149,"context_line":"  }"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"5f2577a7_0fcd85b7","line":148,"range":{"start_line":147,"start_character":0,"end_line":148,"end_character":58},"updated":"2017-09-13 13:03:11.000000000","message":"I think one \u0027-\u003e\u0027 pair per line will be clearer.","commit_id":"16634f3091a6948607ee1d0d9b382b822c2dbc56"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Include the URL of your launchpad RFE:"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"https://bugs.launchpad.net/dragonflow/+bug/example-id"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Dragonflow heavily relies on OpenFlow and Open vSwitch to implement its"},{"line_number":16,"context_line":"datapath. While those are natural fit for our purposes, OpenFlow\u0027s reliance on"}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_6f330f64","line":13,"range":{"start_line":13,"start_character":43,"end_line":13,"end_character":53},"updated":"2017-12-13 11:10:49.000000000","message":"?","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"Dragonflow heavily relies on OpenFlow and Open vSwitch to implement its"},{"line_number":16,"context_line":"datapath. While those are natural fit for our purposes, OpenFlow\u0027s reliance on"},{"line_number":17,"context_line":"IDs (tables, groups, etc) creates a massive coupling between our apps."},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"This spec aims to propose a generic abstraction of datapath, that would allow"},{"line_number":20,"context_line":"coupling at much higher level (e.g. apps vs tables), and introduce a more"}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_0f44c3b6","line":17,"range":{"start_line":17,"start_character":61,"end_line":17,"end_character":64},"updated":"2017-12-13 11:10:49.000000000","message":"Dragonflow","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":34,"context_line":"Proposed Change"},{"line_number":35,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"As stated in the introduction, we\u0027d like to introduce a logical datapath, that"},{"line_number":38,"context_line":"will be based on higher level concepts. This datapath will then be \"compiled\""},{"line_number":39,"context_line":"to the target representation."},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Let us start with definitions bottom-up:"},{"line_number":42,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_18c5eb5b","line":39,"range":{"start_line":37,"start_character":0,"end_line":39,"end_character":29},"updated":"2017-12-13 11:10:49.000000000","message":"If I got it right, I think you are suggesting to view datapath as an aggregated/hierarchical state machine and use State Machine definition language to define each App. Is this correct?","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"boundaries of the application. This will be called *DatapathElement*, it will"},{"line_number":86,"context_line":"contain the following attributes:"},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"* Entrypoints (1+) - start states within the element."},{"line_number":89,"context_line":"* Exits (1+) - final states within the element"},{"line_number":90,"context_line":"* Arbitrary states - vertices in the above graph"},{"line_number":91,"context_line":"* Transitions - the edges described above. Each edge will have a condition"},{"line_number":92,"context_line":"  attached to it, that will dictate when the transition will happen and an"},{"line_number":93,"context_line":"  action, that will mutate packet\u0027s state (either fields or metadata)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"To store extra information about the packet, an app will be able to define"}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_38930f5f","line":92,"range":{"start_line":88,"start_character":0,"end_line":92,"end_character":71},"updated":"2017-12-13 11:10:49.000000000","message":"Can use the general State Machine definition notation","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":93,"context_line":"  action, that will mutate packet\u0027s state (either fields or metadata)"},{"line_number":94,"context_line":""},{"line_number":95,"context_line":"To store extra information about the packet, an app will be able to define"},{"line_number":96,"context_line":"\u0027variables\u0027 - a logical definitions that will reserve the relevant packet"},{"line_number":97,"context_line":"specific storage space. A variable will be either local - internal to the"},{"line_number":98,"context_line":"element (to app information between internal states) or global, if the"},{"line_number":99,"context_line":"information will be required for other apps or other elements of the same app."},{"line_number":100,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_98b57bd0","line":97,"range":{"start_line":96,"start_character":58,"end_line":97,"end_character":23},"updated":"2017-12-13 11:10:49.000000000","message":"Are you talking about metadata? How App will know what is possible? Maybe there are some limitations of the specific datapath choice?","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":101,"context_line":"Each app will define the variables it provides publically, and variables it"},{"line_number":102,"context_line":"consumes. This will be used for datapath assembly, and checking correctness."},{"line_number":103,"context_line":""},{"line_number":104,"context_line":"Once we have all apps, we can to construct the datapath itself, i.e. how apps"},{"line_number":105,"context_line":"interact one with the other."},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"We would like to chain the final state on one app to the start state of another"}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_58c7f346","line":104,"range":{"start_line":104,"start_character":29,"end_line":104,"end_character":32},"updated":"2017-12-13 11:10:49.000000000","message":"not needed","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"We would like to chain the final state on one app to the start state of another"},{"line_number":108,"context_line":"and so on. In the inter-app graph, there are no conditional edges. All"},{"line_number":109,"context_line":"descisions happend at app\u0027s datapath element level."},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"Example:"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_d8e0e3cf","line":109,"range":{"start_line":109,"start_character":0,"end_line":109,"end_character":10},"updated":"2017-12-13 11:10:49.000000000","message":"typo","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":157,"context_line":""},{"line_number":158,"context_line":"Translation"},{"line_number":159,"context_line":"~~~~~~~~~~~"},{"line_number":160,"context_line":"In the first stage, we\u0027re aiming at supporting OVS applications, and will model"},{"line_number":161,"context_line":"model above states and transitions based on OVS tables and flows. Variables"},{"line_number":162,"context_line":"will be allocated on top of register and metadata fileds."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"Each application will declare the following (actual syntax subject to change):"}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_b804ff7f","line":161,"range":{"start_line":160,"start_character":73,"end_line":161,"end_character":5},"updated":"2017-12-13 11:10:49.000000000","message":"redundant","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":159,"context_line":"~~~~~~~~~~~"},{"line_number":160,"context_line":"In the first stage, we\u0027re aiming at supporting OVS applications, and will model"},{"line_number":161,"context_line":"model above states and transitions based on OVS tables and flows. Variables"},{"line_number":162,"context_line":"will be allocated on top of register and metadata fileds."},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"Each application will declare the following (actual syntax subject to change):"},{"line_number":165,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_7833d763","line":162,"range":{"start_line":162,"start_character":8,"end_line":162,"end_character":56},"updated":"2017-12-13 11:10:49.000000000","message":"global variables should be declared by Dragonflow Controller","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"be2532657a5b5c7fa8f102c176647b89bf92146c","unresolved":false,"context_lines":[{"line_number":217,"context_line":"State transition manipulation will be translated to relevan flow modification"},{"line_number":218,"context_line":"on the source table."},{"line_number":219,"context_line":""},{"line_number":220,"context_line":"Entry and exit point of applications will be connected by a single flow each"},{"line_number":221,"context_line":"on by the local controller (based on the configuration)"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":"References"},{"line_number":224,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"df87a7cf_d87c63ed","line":221,"range":{"start_line":220,"start_character":0,"end_line":221,"end_character":55},"updated":"2017-12-13 11:10:49.000000000","message":"This sentence is not clear","commit_id":"82550ca08db1fba2f549d4bd01dd4f7d6e836209"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Problem Description"},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"All Dragonflow apps have a specific flow structure, and a specific location in"},{"line_number":23,"context_line":"across OVS tables. When picking a table extra care must be taken to avoid"},{"line_number":24,"context_line":"stepping on flows from another app. Additionally, in tables where a branching"},{"line_number":25,"context_line":"decision has to be made, priorities have to be coordinated as well. Finally,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_1c530d6d","line":22,"range":{"start_line":22,"start_character":76,"end_line":22,"end_character":78},"updated":"2017-12-19 13:53:58.000000000","message":"remove?","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"116481221beb6be8b70dc2e76602caee1e1af1ce","unresolved":false,"context_lines":[{"line_number":19,"context_line":"Problem Description"},{"line_number":20,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"All Dragonflow apps have a specific flow structure, and a specific location in"},{"line_number":23,"context_line":"across OVS tables. When picking a table extra care must be taken to avoid"},{"line_number":24,"context_line":"stepping on flows from another app. Additionally, in tables where a branching"},{"line_number":25,"context_line":"decision has to be made, priorities have to be coordinated as well. Finally,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_fddf3063","line":22,"range":{"start_line":22,"start_character":76,"end_line":22,"end_character":78},"in_reply_to":"df87a7cf_1c530d6d","updated":"2017-12-20 09:08:21.000000000","message":"Done","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"This spec proposes to isolate each app from all other applications. Each app"},{"line_number":34,"context_line":"will define its contract (entrypoints, exitpoints, used registers). All"},{"line_number":35,"context_line":"interation with other apps will be managed through the local controller."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"At the highest level, local controller will create and maintain a datapath."},{"line_number":38,"context_line":"The datapath itself will be composed of various (datapath) elements, managed"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_7cf01968","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":10},"updated":"2017-12-19 13:53:58.000000000","message":"interaction?","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"116481221beb6be8b70dc2e76602caee1e1af1ce","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"This spec proposes to isolate each app from all other applications. Each app"},{"line_number":34,"context_line":"will define its contract (entrypoints, exitpoints, used registers). All"},{"line_number":35,"context_line":"interation with other apps will be managed through the local controller."},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"At the highest level, local controller will create and maintain a datapath."},{"line_number":38,"context_line":"The datapath itself will be composed of various (datapath) elements, managed"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_9dd2a45b","line":35,"range":{"start_line":35,"start_character":0,"end_line":35,"end_character":10},"in_reply_to":"df87a7cf_7cf01968","updated":"2017-12-20 09:08:21.000000000","message":"Done","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":57,"context_line":"  +------------------------------------------+"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Each app will be considered a single datapath element, and will define its"},{"line_number":60,"context_line":"states/tables, entry/exitpoints, used variables:"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"::"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_5ca0b542","line":60,"updated":"2017-12-19 13:53:58.000000000","message":", etc. (or \u0027and\u0027 before the \u0027used variables\u0027)","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"116481221beb6be8b70dc2e76602caee1e1af1ce","unresolved":false,"context_lines":[{"line_number":57,"context_line":"  +------------------------------------------+"},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"Each app will be considered a single datapath element, and will define its"},{"line_number":60,"context_line":"states/tables, entry/exitpoints, used variables:"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"::"},{"line_number":63,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_5dc89ca6","line":60,"in_reply_to":"df87a7cf_5ca0b542","updated":"2017-12-20 09:08:21.000000000","message":"Done","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":23235,"name":"Lihi Wishnitzer","email":"lihiwish@gmail.com","username":"lihiwish"},"change_message_id":"4fd6e33b2e9b388f68e5eabb3b793827bf5e617e","unresolved":false,"context_lines":[{"line_number":74,"context_line":"  class SomeApp(AppBase):"},{"line_number":75,"context_line":"      schematic \u003d AppSchematic("},{"line_number":76,"context_line":"          states\u003d(\u0027STATE1\u0027, \u0027STATE2\u0027),"},{"line_number":77,"context_line":"          shared_variables\u003d{"},{"line_number":78,"context_line":"              \u0027network_key\u0027: \u0027metadata\u0027,"},{"line_number":79,"context_line":"              \u0027source_port_key\u0027: \u0027reg1\u0027,"},{"line_number":80,"context_line":"          },"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_96d619f2","line":77,"updated":"2017-12-19 15:23:58.000000000","message":"Why separating shared/private variables, instead of a simple mapping between fields and variables?\n\nAlso, metadata, reg6, and reg7 are backend specific. Why not do this mapping in the connecting layer?","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"116481221beb6be8b70dc2e76602caee1e1af1ce","unresolved":false,"context_lines":[{"line_number":74,"context_line":"  class SomeApp(AppBase):"},{"line_number":75,"context_line":"      schematic \u003d AppSchematic("},{"line_number":76,"context_line":"          states\u003d(\u0027STATE1\u0027, \u0027STATE2\u0027),"},{"line_number":77,"context_line":"          shared_variables\u003d{"},{"line_number":78,"context_line":"              \u0027network_key\u0027: \u0027metadata\u0027,"},{"line_number":79,"context_line":"              \u0027source_port_key\u0027: \u0027reg1\u0027,"},{"line_number":80,"context_line":"          },"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_ddb4ac38","line":77,"in_reply_to":"df87a7cf_96d619f2","updated":"2017-12-20 09:08:21.000000000","message":"Public variables are ones consumed/published by the app, private ones are considered irrelevant outside other apps.\nBy separating those, we can reuse the space of private variables. (If each app will have some of those, and we\u0027ll not reuse space, we can run out of registers quite quickly).\n\nAbout the second point, registers are backend specific, but so is the code of the app (at least for now). And by defining them here, we can avoid a lot of porting work (SetField actions and Matches will have to accept \u0027generic\u0027 variable locations). There are some drawbacks to this approach, it can cause extra copies, but I think we can optimize it at least in the code we ship.","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":86,"context_line":"              \u0027entry2\u0027: \u0027STATE1\u0027,"},{"line_number":87,"context_line":"              \u0027entry3\u0027: \u0027STATE2\u0027,"},{"line_number":88,"context_line":"          },"},{"line_number":89,"context_line":"          exitpoints\u003d(\u0027exit1\u0027, \u0027exit2\u0027),"},{"line_number":90,"context_line":"      )"},{"line_number":91,"context_line":"  )"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_1caf8d2a","line":89,"updated":"2017-12-19 13:53:58.000000000","message":"are these also associated with states?","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"116481221beb6be8b70dc2e76602caee1e1af1ce","unresolved":false,"context_lines":[{"line_number":86,"context_line":"              \u0027entry2\u0027: \u0027STATE1\u0027,"},{"line_number":87,"context_line":"              \u0027entry3\u0027: \u0027STATE2\u0027,"},{"line_number":88,"context_line":"          },"},{"line_number":89,"context_line":"          exitpoints\u003d(\u0027exit1\u0027, \u0027exit2\u0027),"},{"line_number":90,"context_line":"      )"},{"line_number":91,"context_line":"  )"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_1d98d4bd","line":89,"in_reply_to":"df87a7cf_1caf8d2a","updated":"2017-12-20 09:08:21.000000000","message":"Not directly. Each of those will be allocated a state, but its not a state the app is allowed to write flows into. Just use it as GoTo/Resubmit target.","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":88,"context_line":"          },"},{"line_number":89,"context_line":"          exitpoints\u003d(\u0027exit1\u0027, \u0027exit2\u0027),"},{"line_number":90,"context_line":"      )"},{"line_number":91,"context_line":"  )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"Local controller will receive an external configuration for datapath layout,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_3cb4d181","line":91,"range":{"start_line":91,"start_character":2,"end_line":91,"end_character":3},"updated":"2017-12-19 13:53:58.000000000","message":"redundant","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"116481221beb6be8b70dc2e76602caee1e1af1ce","unresolved":false,"context_lines":[{"line_number":88,"context_line":"          },"},{"line_number":89,"context_line":"          exitpoints\u003d(\u0027exit1\u0027, \u0027exit2\u0027),"},{"line_number":90,"context_line":"      )"},{"line_number":91,"context_line":"  )"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"Local controller will receive an external configuration for datapath layout,"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_dd8d8c7c","line":91,"range":{"start_line":91,"start_character":2,"end_line":91,"end_character":3},"in_reply_to":"df87a7cf_3cb4d181","updated":"2017-12-20 09:08:21.000000000","message":"Done","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                                          +------------+  +-----+"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":".. code::"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"  digraph dragonflow {"},{"line_number":134,"context_line":"    # apps:"},{"line_number":135,"context_line":"    in[type\u003d\"input\", params\u003d\"...\",];"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_47b21e08","line":132,"updated":"2017-12-19 13:53:58.000000000","message":"In case this is intended to be DOT, I would advise checking it with a viewer (e.g. https://rise4fun.com/agl)","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    ps[type\u003d\"portsec\"];"},{"line_number":139,"context_line":"    sg[type\u003d\"sg\"];"},{"line_number":140,"context_line":"    l3[type\"l3-proactive\"];"},{"line_number":141,"context_line":"    fw[type\u003d\"fw\u0027];"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    # connections:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_c7b4ee38","line":141,"range":{"start_line":141,"start_character":15,"end_line":141,"end_character":16},"updated":"2017-12-19 13:53:58.000000000","message":"\"","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":23766,"name":"Dima Kuznetsov","email":"dima.kuznetsov@toganetworks.com","username":"dimak"},"change_message_id":"116481221beb6be8b70dc2e76602caee1e1af1ce","unresolved":false,"context_lines":[{"line_number":138,"context_line":"    ps[type\u003d\"portsec\"];"},{"line_number":139,"context_line":"    sg[type\u003d\"sg\"];"},{"line_number":140,"context_line":"    l3[type\"l3-proactive\"];"},{"line_number":141,"context_line":"    fw[type\u003d\"fw\u0027];"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    # connections:"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_1dc6949b","line":141,"range":{"start_line":141,"start_character":15,"end_line":141,"end_character":16},"in_reply_to":"df87a7cf_c7b4ee38","updated":"2017-12-20 09:08:21.000000000","message":"Done","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    fw[type\u003d\"fw\u0027];"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    # connections:"},{"line_number":145,"context_line":"    pr:out:default           -\u003e l2:in:default;"},{"line_number":146,"context_line":"    in:out:vm-egress         -\u003e ps:in:default;"},{"line_number":147,"context_line":"    ps:out:accept            -\u003e sg:in:egress;"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_c7eceef5","line":144,"updated":"2017-12-19 13:53:58.000000000","message":"//","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":146,"context_line":"    in:out:vm-egress         -\u003e ps:in:default;"},{"line_number":147,"context_line":"    ps:out:accept            -\u003e sg:in:egress;"},{"line_number":148,"context_line":"    sg:out:egress-accept     -\u003e l2:in:default;"},{"line_number":149,"context_line":"    l2:out:unicast           -\u003e l3:in:ingress-filter"},{"line_number":150,"context_line":"    l3:out:ingress-match     -\u003e fw:in:egress"},{"line_number":151,"context_line":"    fw:out:egress-accept     -\u003e l3:in:route"},{"line_number":152,"context_line":"    l3:out:post-route        -\u003e fw:in:ingress"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_a7d8ca52","line":149,"updated":"2017-12-19 13:53:58.000000000","message":";","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    ps:out:accept            -\u003e sg:in:egress;"},{"line_number":148,"context_line":"    sg:out:egress-accept     -\u003e l2:in:default;"},{"line_number":149,"context_line":"    l2:out:unicast           -\u003e l3:in:ingress-filter"},{"line_number":150,"context_line":"    l3:out:ingress-match     -\u003e fw:in:egress"},{"line_number":151,"context_line":"    fw:out:egress-accept     -\u003e l3:in:route"},{"line_number":152,"context_line":"    l3:out:post-route        -\u003e fw:in:ingress"},{"line_number":153,"context_line":"    fw:out:ingress-accept    -\u003e l2:in:default"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_47d9be53","line":150,"updated":"2017-12-19 13:53:58.000000000","message":";","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":148,"context_line":"    sg:out:egress-accept     -\u003e l2:in:default;"},{"line_number":149,"context_line":"    l2:out:unicast           -\u003e l3:in:ingress-filter"},{"line_number":150,"context_line":"    l3:out:ingress-match     -\u003e fw:in:egress"},{"line_number":151,"context_line":"    fw:out:egress-accept     -\u003e l3:in:route"},{"line_number":152,"context_line":"    l3:out:post-route        -\u003e fw:in:ingress"},{"line_number":153,"context_line":"    fw:out:ingress-accept    -\u003e l2:in:default"},{"line_number":154,"context_line":"  }"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_67de423f","line":151,"updated":"2017-12-19 13:53:58.000000000","message":";","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    l2:out:unicast           -\u003e l3:in:ingress-filter"},{"line_number":150,"context_line":"    l3:out:ingress-match     -\u003e fw:in:egress"},{"line_number":151,"context_line":"    fw:out:egress-accept     -\u003e l3:in:route"},{"line_number":152,"context_line":"    l3:out:post-route        -\u003e fw:in:ingress"},{"line_number":153,"context_line":"    fw:out:ingress-accept    -\u003e l2:in:default"},{"line_number":154,"context_line":"  }"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_07e73614","line":152,"updated":"2017-12-19 13:53:58.000000000","message":";","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":150,"context_line":"    l3:out:ingress-match     -\u003e fw:in:egress"},{"line_number":151,"context_line":"    fw:out:egress-accept     -\u003e l3:in:route"},{"line_number":152,"context_line":"    l3:out:post-route        -\u003e fw:in:ingress"},{"line_number":153,"context_line":"    fw:out:ingress-accept    -\u003e l2:in:default"},{"line_number":154,"context_line":"  }"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"In the above config, edges are connected between entrypoints and exitpoints."}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_27e4ba0c","line":153,"updated":"2017-12-19 13:53:58.000000000","message":";","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"},{"author":{"_account_id":17880,"name":"Shachar Snapiri","email":"shachar.snapiri@toganetworks.com","username":"snapiri"},"change_message_id":"f582ae339f47d73ec85cb4c52611b1f50b382a10","unresolved":false,"context_lines":[{"line_number":211,"context_line":""},{"line_number":212,"context_line":".. code::"},{"line_number":213,"context_line":""},{"line_number":214,"context_line":"  table_id\u003dAPP1:out:EXIT1, match\u003d*any*,actions\u003dmove(reg1-\u003ereg6),move(reg2-\u003ereg7),goto:APP2:in:ENTRY1.target"},{"line_number":215,"context_line":""},{"line_number":216,"context_line":"References"},{"line_number":217,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"df87a7cf_47953e31","line":214,"range":{"start_line":214,"start_character":2,"end_line":214,"end_character":10},"updated":"2017-12-19 13:53:58.000000000","message":"So this will prevent the overriding of resisters?\nWhere is the handling of overriding tables? Should every app create its own set of tables? If so, how do we prevent explosion and who manages the table numbers?","commit_id":"fa52ed66c80a86d90978a64421f617cb0d7efcba"}]}
