)]}'
{"specs/victoria/port-forwarding-port-ranges.rst":[{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"3ea8f4aa468ae53fd632d4c977100e112885e5f4","unresolved":false,"context_lines":[{"line_number":14,"context_line":"requesting virtual machines that have some ports exposed to the Internet,"},{"line_number":15,"context_line":"prefer to request a range of ports to be exposed to avoid doing many requests"},{"line_number":16,"context_line":"for operators regarding the networking configurations. Therefore, they usually"},{"line_number":17,"context_line":"request a slice of external ports to deploys their applications, so they will"},{"line_number":18,"context_line":"be able to choose and change the ports they desire on the fly without needing"},{"line_number":19,"context_line":"to contact anyone else or configuring it in OpenStack."},{"line_number":20,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_0b22b8a4","line":17,"range":{"start_line":17,"start_character":37,"end_line":17,"end_character":45},"updated":"2020-07-08 12:34:28.000000000","message":"typo, \"deploy\"","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"4fc95d376b50b6b56f466d8092bdd4384606463b","unresolved":false,"context_lines":[{"line_number":14,"context_line":"requesting virtual machines that have some ports exposed to the Internet,"},{"line_number":15,"context_line":"prefer to request a range of ports to be exposed to avoid doing many requests"},{"line_number":16,"context_line":"for operators regarding the networking configurations. Therefore, they usually"},{"line_number":17,"context_line":"request a slice of external ports to deploys their applications, so they will"},{"line_number":18,"context_line":"be able to choose and change the ports they desire on the fly without needing"},{"line_number":19,"context_line":"to contact anyone else or configuring it in OpenStack."},{"line_number":20,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_49979891","line":17,"range":{"start_line":17,"start_character":37,"end_line":17,"end_character":45},"in_reply_to":"bf51134e_0b22b8a4","updated":"2020-07-08 13:42:38.000000000","message":"Done","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"3ea8f4aa468ae53fd632d4c977100e112885e5f4","unresolved":false,"context_lines":[{"line_number":27,"context_line":"Problem Description"},{"line_number":28,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"* Currently, if a user wants to create NAT rule that cover multiple ports,"},{"line_number":31,"context_line":"  he/she needs to create them one by one, which is cumbersome in some use"},{"line_number":32,"context_line":"  cases."},{"line_number":33,"context_line":"* When configuring NAT via iptables [1]_ (and other networking"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_cb4c4078","line":30,"range":{"start_line":30,"start_character":43,"end_line":30,"end_character":47},"updated":"2020-07-08 12:34:28.000000000","message":"typo, \"rules\"","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"4fc95d376b50b6b56f466d8092bdd4384606463b","unresolved":false,"context_lines":[{"line_number":27,"context_line":"Problem Description"},{"line_number":28,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"* Currently, if a user wants to create NAT rule that cover multiple ports,"},{"line_number":31,"context_line":"  he/she needs to create them one by one, which is cumbersome in some use"},{"line_number":32,"context_line":"  cases."},{"line_number":33,"context_line":"* When configuring NAT via iptables [1]_ (and other networking"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_299224a0","line":30,"range":{"start_line":30,"start_character":43,"end_line":30,"end_character":47},"in_reply_to":"bf51134e_cb4c4078","updated":"2020-07-08 13:42:38.000000000","message":"Done","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"3ea8f4aa468ae53fd632d4c977100e112885e5f4","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Change the Floating IP port forwarding API to allow the use of port ranges to"},{"line_number":42,"context_line":"create NAT rules. The changes are presented as follows. Today, when a user is"},{"line_number":43,"context_line":"creating a port forwarding rule, he/she create a rule via API, or CLI and"},{"line_number":44,"context_line":"send a JSON like:"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":".. code-block:: json"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_cb75609a","line":43,"range":{"start_line":43,"start_character":40,"end_line":43,"end_character":46},"updated":"2020-07-08 12:34:28.000000000","message":"creates","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"4fc95d376b50b6b56f466d8092bdd4384606463b","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":"Change the Floating IP port forwarding API to allow the use of port ranges to"},{"line_number":42,"context_line":"create NAT rules. The changes are presented as follows. Today, when a user is"},{"line_number":43,"context_line":"creating a port forwarding rule, he/she create a rule via API, or CLI and"},{"line_number":44,"context_line":"send a JSON like:"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":".. code-block:: json"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_8991b09c","line":43,"range":{"start_line":43,"start_character":40,"end_line":43,"end_character":46},"in_reply_to":"bf51134e_cb75609a","updated":"2020-07-08 13:42:38.000000000","message":"Done","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"3ea8f4aa468ae53fd632d4c977100e112885e5f4","unresolved":false,"context_lines":[{"line_number":41,"context_line":"Change the Floating IP port forwarding API to allow the use of port ranges to"},{"line_number":42,"context_line":"create NAT rules. The changes are presented as follows. Today, when a user is"},{"line_number":43,"context_line":"creating a port forwarding rule, he/she create a rule via API, or CLI and"},{"line_number":44,"context_line":"send a JSON like:"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":".. code-block:: json"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_ab78ec8e","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":5},"updated":"2020-07-08 12:34:28.000000000","message":"sends","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"4fc95d376b50b6b56f466d8092bdd4384606463b","unresolved":false,"context_lines":[{"line_number":41,"context_line":"Change the Floating IP port forwarding API to allow the use of port ranges to"},{"line_number":42,"context_line":"create NAT rules. The changes are presented as follows. Today, when a user is"},{"line_number":43,"context_line":"creating a port forwarding rule, he/she create a rule via API, or CLI and"},{"line_number":44,"context_line":"send a JSON like:"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":".. code-block:: json"},{"line_number":47,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_c9e8c817","line":44,"range":{"start_line":44,"start_character":0,"end_line":44,"end_character":5},"in_reply_to":"bf51134e_ab78ec8e","updated":"2020-07-08 13:42:38.000000000","message":"Done","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"3ea8f4aa468ae53fd632d4c977100e112885e5f4","unresolved":false,"context_lines":[{"line_number":63,"context_line":"The proposal is to change the API/CLI to accept a string in external/internal"},{"line_number":64,"context_line":"ports. This will allow users to create a rule with port ranges (instead of"},{"line_number":65,"context_line":"executing multiple calls). Therefore, a user would not need anymore to create"},{"line_number":66,"context_line":"100 rules to reach 100 ports forwards in his/her virtual machine, he/she could"},{"line_number":67,"context_line":"just send a JSON like that:"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":".. code-block:: json"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_6b5ed412","line":66,"range":{"start_line":66,"start_character":19,"end_line":66,"end_character":37},"updated":"2020-07-08 12:34:28.000000000","message":"100 port forwards (as long as the ports are in sequence)","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"4fc95d376b50b6b56f466d8092bdd4384606463b","unresolved":false,"context_lines":[{"line_number":63,"context_line":"The proposal is to change the API/CLI to accept a string in external/internal"},{"line_number":64,"context_line":"ports. This will allow users to create a rule with port ranges (instead of"},{"line_number":65,"context_line":"executing multiple calls). Therefore, a user would not need anymore to create"},{"line_number":66,"context_line":"100 rules to reach 100 ports forwards in his/her virtual machine, he/she could"},{"line_number":67,"context_line":"just send a JSON like that:"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":".. code-block:: json"}],"source_content_type":"text/x-rst","patch_set":1,"id":"bf51134e_a9ebd40f","line":66,"range":{"start_line":66,"start_character":19,"end_line":66,"end_character":37},"in_reply_to":"bf51134e_6b5ed412","updated":"2020-07-08 13:42:38.000000000","message":"Done","commit_id":"9a8d68f6f63bd0e400aa7cb15a2360561c65bddc"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"2a52094801cfbfb272ed82b19555c2caf5422fd6","unresolved":false,"context_lines":[{"line_number":136,"context_line":"   ``internal_ip_address`` and ``internal_port`` columns from same id as the"},{"line_number":137,"context_line":"   socket;"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"4) Delete the socket column;"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"5) Change the external_port type from integer to string;"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_e57b58bb","line":139,"updated":"2020-07-30 10:06:10.000000000","message":"Can we do that? In the past we were doing migrations like that in the Contract phase of db upgrade but now I think it\u0027s not allowed.","commit_id":"027167535414f93a5afd37c6aaa60df0c5b312de"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"70fb83d15a5e140823287f2c4aab4e228c1e16f1","unresolved":false,"context_lines":[{"line_number":136,"context_line":"   ``internal_ip_address`` and ``internal_port`` columns from same id as the"},{"line_number":137,"context_line":"   socket;"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"4) Delete the socket column;"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"5) Change the external_port type from integer to string;"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_a8267915","line":139,"updated":"2020-08-14 08:37:20.000000000","message":"Doing things like drop column or table is not possible in the expand db upgrade. AFAIR there is some test which is checking that and it will fail if You will try to do that.\nIt\u0027s because db upgrade should be available \"online\" so when neutron-server is still runnin on other nodes for example.\n\nMaybe You can simply add those 2 new columns like \"internal_ip_address\" and \"internal_port\" and simply not remove old column at all? We then may stop storing data in the \"socket\" column in this release and then maybe remove it somehow in the next release as that will not break upgrades which should support case when  service in N and N-1 versions is running.\nBut also maybe others will have some ideas about that.","commit_id":"027167535414f93a5afd37c6aaa60df0c5b312de"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"66fbc57e189173a642fb1358c5546c0aff2e5d82","unresolved":false,"context_lines":[{"line_number":136,"context_line":"   ``internal_ip_address`` and ``internal_port`` columns from same id as the"},{"line_number":137,"context_line":"   socket;"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"4) Delete the socket column;"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"5) Change the external_port type from integer to string;"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_fd20084c","line":139,"in_reply_to":"9f560f44_a8267915","updated":"2020-08-18 12:39:40.000000000","message":"I see your point now and it makes sense to me, thanks for the explanation, I will mark this column to be removed in the future. What do you think? :)","commit_id":"027167535414f93a5afd37c6aaa60df0c5b312de"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"36fb785562411803db1d635cdba6a825294d2956","unresolved":false,"context_lines":[{"line_number":136,"context_line":"   ``internal_ip_address`` and ``internal_port`` columns from same id as the"},{"line_number":137,"context_line":"   socket;"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"4) Delete the socket column;"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"5) Change the external_port type from integer to string;"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_6eb109e2","line":139,"in_reply_to":"9f560f44_a8267915","updated":"2020-08-19 01:19:13.000000000","message":"I see. So, we first stop using the column, and then we remove it in a future release. Similar path to what we are doing with the \"remote_ip_prefix\".\n\nI will talk with Pedro, so we can change these steps then.","commit_id":"027167535414f93a5afd37c6aaa60df0c5b312de"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"c822a292777b9fb79cff067c388e2a8a6af473b6","unresolved":false,"context_lines":[{"line_number":136,"context_line":"   ``internal_ip_address`` and ``internal_port`` columns from same id as the"},{"line_number":137,"context_line":"   socket;"},{"line_number":138,"context_line":""},{"line_number":139,"context_line":"4) Delete the socket column;"},{"line_number":140,"context_line":""},{"line_number":141,"context_line":"5) Change the external_port type from integer to string;"},{"line_number":142,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_cbc58390","line":139,"in_reply_to":"9f560f44_e57b58bb","updated":"2020-07-30 11:41:27.000000000","message":"We are not sure what you mean. It is the delete of a column that had its data migrated and normalized into other columns. From what we understand, we would do all of that in the \"expand\" phase. \n\nDo you propose something else?","commit_id":"027167535414f93a5afd37c6aaa60df0c5b312de"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"2a52094801cfbfb272ed82b19555c2caf5422fd6","unresolved":false,"context_lines":[{"line_number":143,"context_line":"Sub Resource Extension"},{"line_number":144,"context_line":"----------------------"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"It will be created an extension that overrides the parameters (external_port"},{"line_number":147,"context_line":"and internal_port) to also accept port ranges in their validations. The"},{"line_number":148,"context_line":"attributes map of new sub resource would be like:"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_05080c2a","line":146,"range":{"start_line":146,"start_character":19,"end_line":146,"end_character":21},"updated":"2020-07-30 10:06:10.000000000","message":"nit: probably missing \"as\" here","commit_id":"027167535414f93a5afd37c6aaa60df0c5b312de"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"66fbc57e189173a642fb1358c5546c0aff2e5d82","unresolved":false,"context_lines":[{"line_number":143,"context_line":"Sub Resource Extension"},{"line_number":144,"context_line":"----------------------"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"It will be created an extension that overrides the parameters (external_port"},{"line_number":147,"context_line":"and internal_port) to also accept port ranges in their validations. The"},{"line_number":148,"context_line":"attributes map of new sub resource would be like:"},{"line_number":149,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9f560f44_3df0c0c9","line":146,"range":{"start_line":146,"start_character":19,"end_line":146,"end_character":21},"in_reply_to":"9f560f44_05080c2a","updated":"2020-08-18 12:39:40.000000000","message":"yes, I think that an \"as\" is missing. Thanks.","commit_id":"027167535414f93a5afd37c6aaa60df0c5b312de"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"fb2fd1e528feb6744abb69234dd1ccebf773defe","unresolved":false,"context_lines":[{"line_number":120,"context_line":"| A1 |      C2       |      80       |            A2            |    tcp   |     172.16.0.7      |      8080     |"},{"line_number":121,"context_line":"+----+---------------+---------------+--------------------------+----------+---------------------+---------------+"},{"line_number":122,"context_line":"| B1 |      C2       |      81       |            B2            |    tcp   |     172.16.0.7      |      8081     |"},{"line_number":123,"context_line":"+----+---------------+---------------+--------------------------+----------+---------------------+---------------+"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"The legacy data migration would be done with an alembic migration upgrade"},{"line_number":126,"context_line":"script."}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_bc7ef215","line":123,"updated":"2020-08-27 15:12:36.000000000","message":"You missed \"socket\" column in this new table. It should be still there for now.","commit_id":"49419308374660e4b20e1928b0da7839b6c707ac"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"35ccc0e38fac49ba8e9e4830da112ad26afa1d30","unresolved":false,"context_lines":[{"line_number":120,"context_line":"| A1 |      C2       |      80       |            A2            |    tcp   |     172.16.0.7      |      8080     |"},{"line_number":121,"context_line":"+----+---------------+---------------+--------------------------+----------+---------------------+---------------+"},{"line_number":122,"context_line":"| B1 |      C2       |      81       |            B2            |    tcp   |     172.16.0.7      |      8081     |"},{"line_number":123,"context_line":"+----+---------------+---------------+--------------------------+----------+---------------------+---------------+"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"The legacy data migration would be done with an alembic migration upgrade"},{"line_number":126,"context_line":"script."}],"source_content_type":"text/x-rst","patch_set":3,"id":"9f560f44_ba227250","line":123,"in_reply_to":"9f560f44_bc7ef215","updated":"2020-08-27 16:48:41.000000000","message":"yes, you are right, I missed this one.","commit_id":"49419308374660e4b20e1928b0da7839b6c707ac"}],"specs/wallaby/port-forwarding-port-ranges.rst":[{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"e752b424f8217a950eddd34f6bbe3bc60cfea2e3","unresolved":true,"context_lines":[{"line_number":101,"context_line":"Today, the port_forwarding table schema is something like:"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"+----+---------------+---------------+--------------------------+----------+-----------------+"},{"line_number":104,"context_line":"| id | floatingip_id | external_port | internal_neutron_port_id | protocol |      socket     |"},{"line_number":105,"context_line":"+\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+"},{"line_number":106,"context_line":"| A1 |      C2       |      80       |            A2            |    tcp   | 172.16.0.7:8080 |"},{"line_number":107,"context_line":"+----+---------------+---------------+--------------------------+----------+-----------------+"}],"source_content_type":"text/x-rst","patch_set":5,"id":"6859e895_6407ec1b","line":104,"range":{"start_line":104,"start_character":23,"end_line":104,"end_character":36},"updated":"2020-11-26 16:07:28.000000000","message":"nit: I understand that in the API we want to see port ranges at the exact same place, where we had ports before. However in the DB wouldn\u0027t it be better to decompose the range to start and end? For example it can make the no-overlap constraint simpler. Or to make sure that \"port N\" and \"port range N:N\" (which are technically the same) cannot be represented internally in two different ways.","commit_id":"00bbdebb2412c6b3544818169e347eebd03248b6"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"4bdc21f803a8843ac7d00e952edfb0adc4da79c4","unresolved":true,"context_lines":[{"line_number":101,"context_line":"Today, the port_forwarding table schema is something like:"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"+----+---------------+---------------+--------------------------+----------+-----------------+"},{"line_number":104,"context_line":"| id | floatingip_id | external_port | internal_neutron_port_id | protocol |      socket     |"},{"line_number":105,"context_line":"+\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+"},{"line_number":106,"context_line":"| A1 |      C2       |      80       |            A2            |    tcp   | 172.16.0.7:8080 |"},{"line_number":107,"context_line":"+----+---------------+---------------+--------------------------+----------+-----------------+"}],"source_content_type":"text/x-rst","patch_set":5,"id":"8d17d33d_e6e3925e","line":104,"range":{"start_line":104,"start_character":23,"end_line":104,"end_character":36},"in_reply_to":"6859e895_6407ec1b","updated":"2020-11-26 18:41:48.000000000","message":"Hi Bence, I agree with what you mean about having different columns to range\u0027s start and end, I see this point and it seems to be more natural to doing it in this way (storing the start and the end of ranges in different columns), so I changed the spec to store the ranges in different columns.\n\nThanks.","commit_id":"00bbdebb2412c6b3544818169e347eebd03248b6"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"81747637ef553465ccbec65c1330a3a768e91184","unresolved":true,"context_lines":[{"line_number":120,"context_line":"| A1 |      C2       |         80          |        80         |            A2            |    tcp   |     172.16.0.7      |         8080        |        8080       | 172.16.0.7:8080 |"},{"line_number":121,"context_line":"+----+---------------+---------------------+-------------------+--------------------------+----------+---------------------+---------------------+-------------------+-----------------+"},{"line_number":122,"context_line":"| B1 |      C2       |         81          |        81         |            B2            |    tcp   |     172.16.0.7      |         8081        |        8081       | 172.16.0.7:8081 |"},{"line_number":123,"context_line":"+----+---------------+---------------------+-------------------+--------------------------+----------+---------------------+---------------------+-------------------+-----------------+"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"The legacy data migration would be done with an alembic migration upgrade"},{"line_number":126,"context_line":"script."}],"source_content_type":"text/x-rst","patch_set":7,"id":"4f842b65_0460a92d","line":123,"updated":"2020-11-27 08:12:17.000000000","message":"Problem with that new db schema is that You want to delete columns \"external_port\" and \"internal_port\" - this will fail in the db migration scripts as such operation should go to the \"CONTRACT\" phase which isn\u0027t allowed in Neutron since couple of cycles.\nSo IMO You should keep old, legacy fields and add new ones. I know we will have duplicate data there but I don\u0027t see any other way to do it in alembic.","commit_id":"aa9217dea9a02f12910838a571484817e9b67e8b"},{"author":{"_account_id":28356,"name":"Rafael Weingartner","email":"rafael@apache.org","username":"rafaelweingartner"},"change_message_id":"63ff963147d1a2dcdeefbc2b4bb1d24ffe888977","unresolved":true,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Other contributors:"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"Work Items"},{"line_number":186,"context_line":"----------"},{"line_number":187,"context_line":"1) API extension (neutron-lib)"},{"line_number":188,"context_line":"2) DB extension/data migration (neutron)"}],"source_content_type":"text/x-rst","patch_set":9,"id":"961c1625_3a45825e","line":185,"range":{"start_line":185,"start_character":0,"end_line":185,"end_character":10},"updated":"2020-11-27 13:36:35.000000000","message":"Pedro, I was re-reading this one, and thinking.\nDon\u0027t we need to extend the OpenStack SDK and python client to support this new api?","commit_id":"5dc88f7f8635ed8fada2ffdd1809dbc57873884f"},{"author":{"_account_id":15554,"name":"Bence Romsics","email":"bence.romsics@gmail.com","username":"ebenrom","status":"working for Ericsson, UTC+1 (+DST)"},"change_message_id":"d520f5dbd70c669abb48bac2ff3a945e23722ad8","unresolved":true,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Other contributors:"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"Work Items"},{"line_number":186,"context_line":"----------"},{"line_number":187,"context_line":"1) API extension (neutron-lib)"},{"line_number":188,"context_line":"2) DB extension/data migration (neutron)"}],"source_content_type":"text/x-rst","patch_set":9,"id":"b1f17bf7_a411b1fa","line":185,"range":{"start_line":185,"start_character":0,"end_line":185,"end_character":10},"in_reply_to":"961c1625_3a45825e","updated":"2020-12-02 12:23:03.000000000","message":"I believe there\u0027s no need to support this in python-neutronclient - there\u0027s no support for floating IP port forwardings at all there.\n\nThe SDK on the other hand seems to be in need of some updates:\n\nhttps://opendev.org/openstack/openstacksdk/src/commit/4913b61713e39e7252c914c5fd476a71a9176106/openstack/network/v2/port_forwarding.py#L41-L44","commit_id":"5dc88f7f8635ed8fada2ffdd1809dbc57873884f"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"eacf19f3e39157cf529e4a6024d95ce3ba1f089f","unresolved":true,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"Other contributors:"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"Work Items"},{"line_number":186,"context_line":"----------"},{"line_number":187,"context_line":"1) API extension (neutron-lib)"},{"line_number":188,"context_line":"2) DB extension/data migration (neutron)"}],"source_content_type":"text/x-rst","patch_set":9,"id":"05b59589_2c542e6a","line":185,"range":{"start_line":185,"start_character":0,"end_line":185,"end_character":10},"in_reply_to":"961c1625_3a45825e","updated":"2020-12-02 12:30:03.000000000","message":"Yes, I checked the python-openstackclient project and we will need to extend it too, to allow ranges, it accepts string but it validates the value as an integer between 1-65535, so we will need to change this validation to accept and validate ranges.","commit_id":"5dc88f7f8635ed8fada2ffdd1809dbc57873884f"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"529c26fd6a445f46d279d2c4511d5ec4d87f52c7","unresolved":true,"context_lines":[{"line_number":60,"context_line":"port forwarding in a floating ip for many ports, he/she will need to resend"},{"line_number":61,"context_line":"this JSON many times to fit the number of ports he/she desires."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"The proposal is to change the API/CLI to accept a string in external/internal"},{"line_number":64,"context_line":"ports. This will allow users to create a rule with port ranges (instead of"},{"line_number":65,"context_line":"executing multiple calls). Therefore, a user would not need anymore to create"},{"line_number":66,"context_line":"100 rules to reach 100 port forwards in his/her virtual machine, he/she could"},{"line_number":67,"context_line":"just send a JSON like that:"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":".. code-block:: json"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    {"},{"line_number":72,"context_line":"      \"port_forwarding\": {"},{"line_number":73,"context_line":"        \"protocol\": \"tcp\","},{"line_number":74,"context_line":"        \"internal_ip_address\": \"172.16.0.7\","},{"line_number":75,"context_line":"        \"internal_port\": \"8000:8100\","},{"line_number":76,"context_line":"        \"internal_port_id\": \"b67a7746-dc69-45b4-9b84-bb229fe198a0\","},{"line_number":77,"context_line":"        \"external_port\": \"9000:9100\","},{"line_number":78,"context_line":"        \"description\": \"desc\""},{"line_number":79,"context_line":"      }"},{"line_number":80,"context_line":"    }"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"New validations will be created to avoid users to enter invalid ranges in"},{"line_number":83,"context_line":"ports. Here follows a summary of all of the validations executed by the system:"}],"source_content_type":"text/x-rst","patch_set":11,"id":"efd99e54_73d557ba","line":80,"range":{"start_line":63,"start_character":0,"end_line":80,"end_character":5},"updated":"2020-12-10 11:44:07.000000000","message":"I did not see an example of a response for this request. It will create 100 port forwardings? Or just one with new style of port range for internal_port and external_port?\nA response like this:\n    {\"port_forwardings\": [\nport_forwarding\": {\n        \"id\": \"xxxxxxxxxxxxxxx1\",\n        \"protocol\": \"tcp\",\n        \"internal_ip_address\": \"172.16.0.7\",\n        \"internal_port\": \"8000\",\n        \"internal_port_id\": \"b67a7746-dc69-45b4-9b84-bb229fe198a0\",\n        \"external_port\": \"9000\",\n        \"description\": \"desc\"\n      },\nport_forwarding\": {\n        \"id\": \"xxxxxxxxxxxxxxx2\",\n        \"protocol\": \"tcp\",\n        \"internal_ip_address\": \"172.16.0.7\",\n        \"internal_port\": \"8001\",\n        \"internal_port_id\": \"b67a7746-dc69-45b4-9b84-bb229fe198a0\",\n        \"external_port\": \"9001\",\n        \"description\": \"desc\"\n      }\n...\nport_forwarding\": {\n        \"id\": \"xxxxxxxxxxxxxxx3\",\n        \"protocol\": \"tcp\",\n        \"internal_ip_address\": \"172.16.0.7\",\n        \"internal_port\": \"8100\",\n        \"internal_port_id\": \"b67a7746-dc69-45b4-9b84-bb229fe198a0\",\n        \"external_port\": \"9100\",\n        \"description\": \"desc\"\n      }\n    ]\n    }\n\nor a reponse like this:\n    {\n      \"port_forwarding\": {\n        \"id\": \"xxxxxxxxxxxxxxx1\",\n        \"protocol\": \"tcp\",\n        \"internal_ip_address\": \"172.16.0.7\",\n        \"internal_port\": \"8000:8100\",\n        \"internal_port_id\": \"b67a7746-dc69-45b4-9b84-bb229fe198a0\",\n        \"external_port\": \"9000:9100\",\n        \"description\": \"desc\"\n      }\n    }","commit_id":"4e7995d896aafcef4fa50948fcf95c7f33272a44"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"6b300514eb0c1a9efc70be77dfe49e8d70d60bb6","unresolved":true,"context_lines":[{"line_number":60,"context_line":"port forwarding in a floating ip for many ports, he/she will need to resend"},{"line_number":61,"context_line":"this JSON many times to fit the number of ports he/she desires."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"The proposal is to change the API/CLI to accept a string in external/internal"},{"line_number":64,"context_line":"ports. This will allow users to create a rule with port ranges (instead of"},{"line_number":65,"context_line":"executing multiple calls). Therefore, a user would not need anymore to create"},{"line_number":66,"context_line":"100 rules to reach 100 port forwards in his/her virtual machine, he/she could"},{"line_number":67,"context_line":"just send a JSON like that:"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":".. code-block:: json"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"    {"},{"line_number":72,"context_line":"      \"port_forwarding\": {"},{"line_number":73,"context_line":"        \"protocol\": \"tcp\","},{"line_number":74,"context_line":"        \"internal_ip_address\": \"172.16.0.7\","},{"line_number":75,"context_line":"        \"internal_port\": \"8000:8100\","},{"line_number":76,"context_line":"        \"internal_port_id\": \"b67a7746-dc69-45b4-9b84-bb229fe198a0\","},{"line_number":77,"context_line":"        \"external_port\": \"9000:9100\","},{"line_number":78,"context_line":"        \"description\": \"desc\""},{"line_number":79,"context_line":"      }"},{"line_number":80,"context_line":"    }"},{"line_number":81,"context_line":""},{"line_number":82,"context_line":"New validations will be created to avoid users to enter invalid ranges in"},{"line_number":83,"context_line":"ports. Here follows a summary of all of the validations executed by the system:"}],"source_content_type":"text/x-rst","patch_set":11,"id":"582df63a_8a453a0d","line":80,"range":{"start_line":63,"start_character":0,"end_line":80,"end_character":5},"in_reply_to":"efd99e54_73d557ba","updated":"2020-12-10 12:31:15.000000000","message":"Nice catch, I forgot to add a response example, I updated the spec with a response example.\nThanks.","commit_id":"4e7995d896aafcef4fa50948fcf95c7f33272a44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"529c26fd6a445f46d279d2c4511d5ec4d87f52c7","unresolved":true,"context_lines":[{"line_number":114,"context_line":"internal_port_end), also, the external_port column will be split into two new"},{"line_number":115,"context_line":"columns (external_port_start and external_port_end). The new table would be like below:"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"+----+---------------+---------------+---------------------+-------------------+--------------------------+----------+---------------------+---------------------+-------------------+-----------------+"},{"line_number":118,"context_line":"| id | floatingip_id | external_port | external_port_start | external_port_end | internal_neutron_port_id | protocol | internal_ip_address | internal_port_start | internal_port_end |      socket     |"},{"line_number":119,"context_line":"+\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d+"},{"line_number":120,"context_line":"| A1 |      C2       |      80       |         80          |        80         |            A2            |    tcp   |     172.16.0.7      |         8080        |        8080       | 172.16.0.7:8080 |"},{"line_number":121,"context_line":"+----+---------------+---------------+---------------------+-------------------+--------------------------+----------+---------------------+---------------------+-------------------+-----------------+"},{"line_number":122,"context_line":"| B1 |      C2       |      81       |         81          |        81         |            B2            |    tcp   |     172.16.0.7      |         8081        |        8081       | 172.16.0.7:8081 |"},{"line_number":123,"context_line":"+----+---------------+---------------+---------------------+-------------------+--------------------------+----------+---------------------+---------------------+-------------------+-----------------+"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":"The legacy data migration would be done with an alembic migration upgrade"},{"line_number":126,"context_line":"script."},{"line_number":127,"context_line":""}],"source_content_type":"text/x-rst","patch_set":11,"id":"168c9ff2_9f420d1c","line":124,"range":{"start_line":117,"start_character":0,"end_line":124,"end_character":0},"updated":"2020-12-10 11:44:07.000000000","message":"Or it will response a dict like this:\n\n    {\n      \"port_forwarding\": {\n        \"id\": \"xxxxxxxxxxxxxxx1\",\n        \"protocol\": \"tcp\",\n        \"internal_ip_address\": \"172.16.0.7\",\n        \"internal_port_start\": \"8000\",\n        \"internal_port_end\": \"8100\",\n        \"internal_port_id\": \"b67a7746-dc69-45b4-9b84-bb229fe198a0\",\n        \"external_port_start\": \"9000\",\n        \"external_port_end\": \"9100\",\n        \"description\": \"desc\"\n      }\n    }","commit_id":"4e7995d896aafcef4fa50948fcf95c7f33272a44"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"af94cea3571d27325c8f3660c0483a877f110fed","unresolved":true,"context_lines":[{"line_number":87,"context_line":"      \"port_forwarding\": {"},{"line_number":88,"context_line":"        \"protocol\": \"tcp\","},{"line_number":89,"context_line":"        \"internal_ip_address\": \"172.16.0.7\","},{"line_number":90,"context_line":"        \"internal_port\": \"8000:8100\","},{"line_number":91,"context_line":"        \"internal_port_id\": \"b67a7746-dc69-45b4-9b84-bb229fe198a0\","},{"line_number":92,"context_line":"        \"external_port\": \"9000:9100\","},{"line_number":93,"context_line":"        \"description\": \"desc\","}],"source_content_type":"text/x-rst","patch_set":12,"id":"47e37c61_4babb057","line":90,"range":{"start_line":90,"start_character":8,"end_line":90,"end_character":37},"updated":"2020-12-18 06:29:44.000000000","message":"Alright, for this style we can not call it \"extend\", this is totally changed the original data format. IMO, this can cause some backward compatibility issues for cloud API users. Since the key does not change, the value changed from int [1] to a string port range.\n\n[1] https://docs.openstack.org/api-ref/network/v2/index.html?expanded\u003dcreate-port-forwarding-detail#floating-ips-port-forwarding","commit_id":"e1a1588aabd1151877d4c4541835d4ae680eba5a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"af94cea3571d27325c8f3660c0483a877f110fed","unresolved":true,"context_lines":[{"line_number":89,"context_line":"        \"internal_ip_address\": \"172.16.0.7\","},{"line_number":90,"context_line":"        \"internal_port\": \"8000:8100\","},{"line_number":91,"context_line":"        \"internal_port_id\": \"b67a7746-dc69-45b4-9b84-bb229fe198a0\","},{"line_number":92,"context_line":"        \"external_port\": \"9000:9100\","},{"line_number":93,"context_line":"        \"description\": \"desc\","},{"line_number":94,"context_line":"        \"id\": \"825ade3c-9760-4880-8080-8fc2dbab9acc\""},{"line_number":95,"context_line":"      }"}],"source_content_type":"text/x-rst","patch_set":12,"id":"c33a7ae9_74fff13b","line":92,"range":{"start_line":92,"start_character":8,"end_line":92,"end_character":37},"updated":"2020-12-18 06:29:44.000000000","message":"ditto","commit_id":"e1a1588aabd1151877d4c4541835d4ae680eba5a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"af94cea3571d27325c8f3660c0483a877f110fed","unresolved":true,"context_lines":[{"line_number":183,"context_line":"            }"},{"line_number":184,"context_line":"        }"},{"line_number":185,"context_line":"    }"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Implementation"},{"line_number":188,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"5ed1b21b_df11ba0f","line":186,"updated":"2020-12-18 06:29:44.000000000","message":"So if we are not going to handle the API backward compatibility, it\u0027s better to add the \"REST API impact\" section to highlight the incompatible, [1] is an example.\n\n[1] https://specs.openstack.org/openstack/neutron-specs/specs/juno/neutron-ovs-dvr.html#rest-api-impact","commit_id":"e1a1588aabd1151877d4c4541835d4ae680eba5a"},{"author":{"_account_id":30695,"name":"Pedro Henrique Pereira Martins","email":"phpm13@gmail.com","username":"pedrohpmartins"},"change_message_id":"40a89c9f4f5ab2888267049362836bd703d128f7","unresolved":false,"context_lines":[{"line_number":183,"context_line":"            }"},{"line_number":184,"context_line":"        }"},{"line_number":185,"context_line":"    }"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Implementation"},{"line_number":188,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":189,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"790e916b_dffb0b76","line":186,"in_reply_to":"5ed1b21b_df11ba0f","updated":"2020-12-18 15:54:26.000000000","message":"Done","commit_id":"e1a1588aabd1151877d4c4541835d4ae680eba5a"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4a995ce98183fc64e671a15e74d26b6a698ddc05","unresolved":true,"context_lines":[{"line_number":198,"context_line":"    - GET"},{"line_number":199,"context_line":"    - POST"},{"line_number":200,"context_line":""},{"line_number":201,"context_line":"The ``external_port`` and ``internal_port`` types were changed from ``integer``"},{"line_number":202,"context_line":"to ``string``. If you want to create a new portforwarding rule, your request"},{"line_number":203,"context_line":"JSON must be changed from:"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":".. code-block:: json"},{"line_number":206,"context_line":""}],"source_content_type":"text/x-rst","patch_set":14,"id":"b17ffd6d_1c8939e7","line":203,"range":{"start_line":201,"start_character":0,"end_line":203,"end_character":26},"updated":"2020-12-25 02:55:51.000000000","message":"I did not find any consensus that we are not going to make the API backward compatibility. For the existing cloud APPs this cloud cause the extra works for rewriting the code. For the compatibility maybe we can implement it like this:\n1. still allow the original API input, for internal_port and external_port, it is still integer, but make them optional\n2. add new api input attribute, external_port_range and internal_port_rang which accept string port range, also optional\n3. for the port_forwarding plugin, it will check the API input\n   a. if it is the original style, a one port integer port forwarding, noting changed\n   b. if new range style, create range port forwardings\n   c. if both are spplied, raise RequestError\n   d. if no integer port nor string port range, raise InvalidInput","commit_id":"62032e0f17172e0c53e9d62f78c843f5555dcd24"}]}
