)]}'
{"neutron/db/l3_db.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"14b760d4e642684ddeb2e65387e998849cb0af75","unresolved":false,"context_lines":[{"line_number":1102,"context_line":"            if dns_integration:"},{"line_number":1103,"context_line":"                dns_data \u003d self._process_dns_floatingip_create_precommit("},{"line_number":1104,"context_line":"                    context, floatingip_dict, fip)"},{"line_number":1105,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1106,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1107,"context_line":"                     port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1108,"context_line":"                     fip_id\u003dfloatingip_db[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a5ae5dd_65a5b9b3","line":1105,"range":{"start_line":1105,"start_character":7,"end_line":1105,"end_character":39},"updated":"2016-02-04 07:27:18.000000000","message":"Some unit tests on this?","commit_id":"fde9132141c7ef81e061e6d06d07058fc53c1807"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"36bed90dae6eaab8b9c3687b80ad46006e73c689","unresolved":false,"context_lines":[{"line_number":1175,"context_line":"                     fip_id\u003dfloatingip_db[\u0027id\u0027],"},{"line_number":1176,"context_line":"                     floating_ip_address\u003dfloatingip_db[\u0027floating_ip_address\u0027],"},{"line_number":1177,"context_line":"                     fixed_ip\u003dfloatingip_db[\u0027fixed_ip_address\u0027],"},{"line_number":1178,"context_line":"                     net_id\u003dfloatingip_db[\u0027floating_network_id\u0027])"},{"line_number":1179,"context_line":"        if dns_integration:"},{"line_number":1180,"context_line":"            self._process_dns_floatingip_update_postcommit(context,"},{"line_number":1181,"context_line":"                                                           floatingip_dict,"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_cedcd0e6","line":1178,"updated":"2016-04-19 09:57:20.000000000","message":"is it safe to use floatingip_db here after breaking the transaction?\n\ncan you make UT cover update case?","commit_id":"62ce703cfb0a349de40c419173f851d3ecfe874a"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"6f2e838966436c4dab577734c3cd988fdfb980f0","unresolved":false,"context_lines":[{"line_number":1175,"context_line":"                     fip_id\u003dfloatingip_db[\u0027id\u0027],"},{"line_number":1176,"context_line":"                     floating_ip_address\u003dfloatingip_db[\u0027floating_ip_address\u0027],"},{"line_number":1177,"context_line":"                     fixed_ip\u003dfloatingip_db[\u0027fixed_ip_address\u0027],"},{"line_number":1178,"context_line":"                     net_id\u003dfloatingip_db[\u0027floating_network_id\u0027])"},{"line_number":1179,"context_line":"        if dns_integration:"},{"line_number":1180,"context_line":"            self._process_dns_floatingip_update_postcommit(context,"},{"line_number":1181,"context_line":"                                                           floatingip_dict,"}],"source_content_type":"text/x-python","patch_set":19,"id":"1a122d0e_3e91449a","line":1178,"in_reply_to":"1a122d0e_cedcd0e6","updated":"2016-04-25 06:26:56.000000000","message":"Thank you for the catch. I revised this part and added UT to cover it.","commit_id":"62ce703cfb0a349de40c419173f851d3ecfe874a"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"c191b58fe2c069f42ede7bb17b4b67c90eaa408d","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    __table_args__ \u003d ("},{"line_number":138,"context_line":"        sa.UniqueConstraint("},{"line_number":139,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":140,"context_line":"            name\u003d\u0027uniq_floatingips0floating_network_id0fixed_ip_address\u0027),"},{"line_number":141,"context_line":"        model_base.BASEV2.__table_args__,)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9abb7d3a_16a3ba50","line":140,"range":{"start_line":140,"start_character":18,"end_line":140,"end_character":71},"updated":"2016-05-30 04:17:54.000000000","message":"I think we should use uniq_floatingips0floating_network_id0fixed_port_id0fixed_ip_address\nas unique index name.","commit_id":"650e1fdffc49ce0be508a56cbf810783f91a3b99"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"f4860288be8f45fc63d88d80e6ab72e75f3d1c85","unresolved":false,"context_lines":[{"line_number":137,"context_line":"    __table_args__ \u003d ("},{"line_number":138,"context_line":"        sa.UniqueConstraint("},{"line_number":139,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":140,"context_line":"            name\u003d\u0027uniq_floatingips0floating_network_id0fixed_ip_address\u0027),"},{"line_number":141,"context_line":"        model_base.BASEV2.__table_args__,)"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":""}],"source_content_type":"text/x-python","patch_set":24,"id":"9abb7d3a_27ad37e9","line":140,"range":{"start_line":140,"start_character":18,"end_line":140,"end_character":71},"in_reply_to":"9abb7d3a_16a3ba50","updated":"2016-06-02 05:11:59.000000000","message":"Good catch! Thanks. Same changes have been made to migration script","commit_id":"650e1fdffc49ce0be508a56cbf810783f91a3b99"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"c191b58fe2c069f42ede7bb17b4b67c90eaa408d","unresolved":false,"context_lines":[{"line_number":1150,"context_line":"            if dns_integration:"},{"line_number":1151,"context_line":"                dns_data \u003d self._process_dns_floatingip_create_precommit("},{"line_number":1152,"context_line":"                    context, floatingip_dict, fip)"},{"line_number":1153,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1154,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1155,"context_line":"                     port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1156,"context_line":"                     fip_id\u003dfloatingip_db[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":24,"id":"9abb7d3a_568542ab","line":1153,"range":{"start_line":1153,"start_character":22,"end_line":1153,"end_character":38},"updated":"2016-05-30 04:17:54.000000000","message":"we had better to tell if it is caused by our unique index","commit_id":"650e1fdffc49ce0be508a56cbf810783f91a3b99"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"f4860288be8f45fc63d88d80e6ab72e75f3d1c85","unresolved":false,"context_lines":[{"line_number":1150,"context_line":"            if dns_integration:"},{"line_number":1151,"context_line":"                dns_data \u003d self._process_dns_floatingip_create_precommit("},{"line_number":1152,"context_line":"                    context, floatingip_dict, fip)"},{"line_number":1153,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1154,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1155,"context_line":"                     port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1156,"context_line":"                     fip_id\u003dfloatingip_db[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":24,"id":"9abb7d3a_678a9f65","line":1153,"range":{"start_line":1153,"start_character":22,"end_line":1153,"end_character":38},"in_reply_to":"9abb7d3a_568542ab","updated":"2016-06-02 05:11:59.000000000","message":"I added an if statement to check this but I am wondering it might be redundant, since we did not provide exception handling for other exceptions","commit_id":"650e1fdffc49ce0be508a56cbf810783f91a3b99"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"dffc67d0ac2dee41acaee23c18e54dbb238873f3","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        sa.UniqueConstraint("},{"line_number":139,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":140,"context_line":"            name\u003d\u0027uniq_floatingips0floating_network_id\u0027 +"},{"line_number":141,"context_line":"                 \u00270fixed_port_id0fixed_ip_address\u0027),"},{"line_number":142,"context_line":"        model_base.BASEV2.__table_args__,)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9abb7d3a_2298736a","line":141,"updated":"2016-06-02 11:49:40.000000000","message":"Unfortunately identifier names in MySQL are limited to 64 characters.","commit_id":"189bde94d3a52ca32c6478e41dd408c3559a6e75"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"14f21b85261432f27c24d265e2c8ab43b3da0d5c","unresolved":false,"context_lines":[{"line_number":138,"context_line":"        sa.UniqueConstraint("},{"line_number":139,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":140,"context_line":"            name\u003d\u0027uniq_floatingips0floating_network_id\u0027 +"},{"line_number":141,"context_line":"                 \u00270fixed_port_id0fixed_ip_address\u0027),"},{"line_number":142,"context_line":"        model_base.BASEV2.__table_args__,)"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9abb7d3a_49f2d29b","line":141,"in_reply_to":"9abb7d3a_2298736a","updated":"2016-06-03 01:24:45.000000000","message":"Thanks! I did not notice this limit","commit_id":"189bde94d3a52ca32c6478e41dd408c3559a6e75"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"efe3f83c379ef7a2c8c08b4ec171dad09c0af9d3","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":137,"context_line":"    __table_args__ \u003d ("},{"line_number":138,"context_line":"        sa.UniqueConstraint("},{"line_number":139,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":140,"context_line":"            name\u003d\u0027uniq_floatingips0floatingnetworkid\u0027 +"},{"line_number":141,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027),"},{"line_number":142,"context_line":"        model_base.BASEV2.__table_args__,)"}],"source_content_type":"text/x-python","patch_set":32,"id":"7aa08908_65ce562e","line":139,"updated":"2016-06-14 01:24:59.000000000","message":"isn\u0027t floating_network_id + fixed_ip_address adequate?","commit_id":"5f487f1ed98959bc12049dc163170eafceada25b"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"cfaec5447def15a6e58464558639b4fa31ea892a","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":137,"context_line":"    __table_args__ \u003d ("},{"line_number":138,"context_line":"        sa.UniqueConstraint("},{"line_number":139,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":140,"context_line":"            name\u003d\u0027uniq_floatingips0floatingnetworkid\u0027 +"},{"line_number":141,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027),"},{"line_number":142,"context_line":"        model_base.BASEV2.__table_args__,)"}],"source_content_type":"text/x-python","patch_set":32,"id":"7aa08908_6b3f44b4","line":139,"in_reply_to":"7aa08908_65ce562e","updated":"2016-06-14 04:15:54.000000000","message":"My original design only involved floating_network_id and fixed_ip_address. But in this case, I failed several gate tests. An example log file of patch 17 is shown here http://logs.openstack.org/18/276018/17/check/gate-tempest-dsvm-neutron-full/3866028/console.html.gz From my investigation, the test assigned different ports with the same fixed_ip_address and tried to associate floatingips from same external network to them. Thus, exceptions arose.","commit_id":"5f487f1ed98959bc12049dc163170eafceada25b"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"0425f9a97737f2270a6bd340db85e47a00266144","unresolved":false,"context_lines":[{"line_number":136,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":137,"context_line":"    __table_args__ \u003d ("},{"line_number":138,"context_line":"        sa.UniqueConstraint("},{"line_number":139,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":140,"context_line":"            name\u003d\u0027uniq_floatingips0floatingnetworkid\u0027 +"},{"line_number":141,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027),"},{"line_number":142,"context_line":"        model_base.BASEV2.__table_args__,)"}],"source_content_type":"text/x-python","patch_set":32,"id":"9a89bdaa_a297c58e","line":139,"in_reply_to":"7aa08908_6b3f44b4","updated":"2016-09-06 19:27:42.000000000","message":"Yeah, we have to allow duplicate (floating_network_id, fixed_ip_address) because different internal networks could be using the same IP ranges and we are allowed to associating different floating IPs with the same fixed ips as long as they are on different internal networks.","commit_id":"5f487f1ed98959bc12049dc163170eafceada25b"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"96b129f173a8d06afaf6d01b34c6d651ce209951","unresolved":false,"context_lines":[{"line_number":1216,"context_line":"                        context, floatingip_dict)"},{"line_number":1217,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1218,"context_line":"            port_id, internal_ip_address, router_id \u003d self._get_assoc_data("},{"line_number":1219,"context_line":"                context, fip, floatingip_db[\u0027floating_network_id\u0027])"},{"line_number":1220,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1221,"context_line":"                    port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1222,"context_line":"                    fip_id\u003dfloatingip_db[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_2459bb35","line":1219,"updated":"2016-06-27 05:07:58.000000000","message":"this would cause InvalidRequestError if a plugin has a surrounding transaction.  eg. networking-midonet\none way to workaround it is to make the transaction in L1024 auto-nested.","commit_id":"8776ba006d125da8644b5ff331fbb383286a5ee5"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"153ef352458e7d34ee1a064b16ba08e92e3a9242","unresolved":false,"context_lines":[{"line_number":1216,"context_line":"                        context, floatingip_dict)"},{"line_number":1217,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1218,"context_line":"            port_id, internal_ip_address, router_id \u003d self._get_assoc_data("},{"line_number":1219,"context_line":"                context, fip, floatingip_db[\u0027floating_network_id\u0027])"},{"line_number":1220,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1221,"context_line":"                    port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1222,"context_line":"                    fip_id\u003dfloatingip_db[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":37,"id":"3aaa91ec_0437584d","line":1219,"in_reply_to":"3aaa91ec_2459bb35","updated":"2016-06-27 09:06:24.000000000","message":"Done","commit_id":"8776ba006d125da8644b5ff331fbb383286a5ee5"},{"author":{"_account_id":13717,"name":"Inessa Vasilevskaya","email":"ivasilevskaya@mirantis.com","username":"ivasilevskaya"},"change_message_id":"3de55c52b9fd29e6165e8c77e454f6b44077329e","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    __table_args__ \u003d ("},{"line_number":144,"context_line":"        sa.UniqueConstraint("},{"line_number":145,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":146,"context_line":"            name\u003d\u0027uniq_floatingips0floatingnetworkid\u0027 +"},{"line_number":147,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027),"},{"line_number":148,"context_line":"        model_base.BASEV2.__table_args__,)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"bacf61ea_27c1e2e4","line":147,"range":{"start_line":146,"start_character":17,"end_line":147,"end_character":48},"updated":"2016-08-05 22:13:51.000000000","message":"Nit: can be put as (\u0027uniq_floatingips0floatingnetworkid\u0027\n                    \u00270fixedportid9fixedipaddress\u0027)\n\nNit: And \u00270\u0027 instead of \u0027_\u0027 still look weird to me","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"1e08e8e26d03d3408d7beb9f98bf65ba23d3fcc8","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    __table_args__ \u003d ("},{"line_number":144,"context_line":"        sa.UniqueConstraint("},{"line_number":145,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":146,"context_line":"            name\u003d\u0027uniq_floatingips0floatingnetworkid\u0027 +"},{"line_number":147,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027),"},{"line_number":148,"context_line":"        model_base.BASEV2.__table_args__,)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"3ac371cc_c73055eb","line":147,"range":{"start_line":146,"start_character":17,"end_line":147,"end_character":48},"in_reply_to":"9ad45d7e_7c3c6ae2","updated":"2016-08-16 06:21:46.000000000","message":"Hi Ann, thanks for answering this!","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"3efaeadd71e3bfd3bee2af50cbe8505340a40361","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    __table_args__ \u003d ("},{"line_number":144,"context_line":"        sa.UniqueConstraint("},{"line_number":145,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":146,"context_line":"            name\u003d\u0027uniq_floatingips0floatingnetworkid\u0027 +"},{"line_number":147,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027),"},{"line_number":148,"context_line":"        model_base.BASEV2.__table_args__,)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"9ad45d7e_7c3c6ae2","line":147,"range":{"start_line":146,"start_character":17,"end_line":147,"end_character":48},"in_reply_to":"bacf61ea_27c1e2e4","updated":"2016-08-10 08:13:02.000000000","message":"0 is used here correctly, pattern that we use for unique constraints \u0027uniq_(table_name)0(colums_names)\u0027","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"1e08e8e26d03d3408d7beb9f98bf65ba23d3fcc8","unresolved":false,"context_lines":[{"line_number":143,"context_line":"    __table_args__ \u003d ("},{"line_number":144,"context_line":"        sa.UniqueConstraint("},{"line_number":145,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":146,"context_line":"            name\u003d\u0027uniq_floatingips0floatingnetworkid\u0027 +"},{"line_number":147,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027),"},{"line_number":148,"context_line":"        model_base.BASEV2.__table_args__,)"},{"line_number":149,"context_line":""},{"line_number":150,"context_line":""}],"source_content_type":"text/x-python","patch_set":45,"id":"3ac371cc_e73591da","line":147,"range":{"start_line":146,"start_character":17,"end_line":147,"end_character":48},"in_reply_to":"bacf61ea_27c1e2e4","updated":"2016-08-16 06:21:46.000000000","message":"Thanks. I will fix this. As for using \u00270\u0027 instead of \u0027_\u0027. Ann has replied that \u00270\u0027 here is to separate table_name and column_name.","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":13717,"name":"Inessa Vasilevskaya","email":"ivasilevskaya@mirantis.com","username":"ivasilevskaya"},"change_message_id":"3de55c52b9fd29e6165e8c77e454f6b44077329e","unresolved":false,"context_lines":[{"line_number":1215,"context_line":"                if self._is_dns_integration_supported:"},{"line_number":1216,"context_line":"                    dns_data \u003d self._process_dns_floatingip_create_precommit("},{"line_number":1217,"context_line":"                        context, floatingip_dict, fip)"},{"line_number":1218,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1219,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1220,"context_line":"                port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1221,"context_line":"                fip_id\u003dfloatingip_db[\u0027id\u0027],"},{"line_number":1222,"context_line":"                floating_ip_address\u003dfloatingip_db["},{"line_number":1223,"context_line":"                    \u0027floating_ip_address\u0027],"},{"line_number":1224,"context_line":"                fixed_ip\u003dfloatingip_db[\u0027fixed_ip_address\u0027],"},{"line_number":1225,"context_line":"                net_id\u003dfloatingip_db[\u0027floating_network_id\u0027])"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"        if self._is_dns_integration_supported:"},{"line_number":1228,"context_line":"            self._process_dns_floatingip_create_postcommit(context,"}],"source_content_type":"text/x-python","patch_set":45,"id":"bacf61ea_8739aef4","line":1225,"range":{"start_line":1218,"start_character":7,"end_line":1225,"end_character":60},"updated":"2016-08-05 22:13:51.000000000","message":"try/except too broad. Please cover only methods where the exception can be raised (self._update_fip_assoc?)","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"1e08e8e26d03d3408d7beb9f98bf65ba23d3fcc8","unresolved":false,"context_lines":[{"line_number":1215,"context_line":"                if self._is_dns_integration_supported:"},{"line_number":1216,"context_line":"                    dns_data \u003d self._process_dns_floatingip_create_precommit("},{"line_number":1217,"context_line":"                        context, floatingip_dict, fip)"},{"line_number":1218,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1219,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1220,"context_line":"                port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1221,"context_line":"                fip_id\u003dfloatingip_db[\u0027id\u0027],"},{"line_number":1222,"context_line":"                floating_ip_address\u003dfloatingip_db["},{"line_number":1223,"context_line":"                    \u0027floating_ip_address\u0027],"},{"line_number":1224,"context_line":"                fixed_ip\u003dfloatingip_db[\u0027fixed_ip_address\u0027],"},{"line_number":1225,"context_line":"                net_id\u003dfloatingip_db[\u0027floating_network_id\u0027])"},{"line_number":1226,"context_line":""},{"line_number":1227,"context_line":"        if self._is_dns_integration_supported:"},{"line_number":1228,"context_line":"            self._process_dns_floatingip_create_postcommit(context,"}],"source_content_type":"text/x-python","patch_set":45,"id":"3ac371cc_873dbdbd","line":1225,"range":{"start_line":1218,"start_character":7,"end_line":1225,"end_character":60},"in_reply_to":"bacf61ea_8739aef4","updated":"2016-08-16 06:21:46.000000000","message":"I will fix this. I think context.session.add(floatingip_db) would be the one to raise exception here, since floatingip_db has not been added to the database yet.","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":13717,"name":"Inessa Vasilevskaya","email":"ivasilevskaya@mirantis.com","username":"ivasilevskaya"},"change_message_id":"3de55c52b9fd29e6165e8c77e454f6b44077329e","unresolved":false,"context_lines":[{"line_number":1251,"context_line":"                if self._is_dns_integration_supported:"},{"line_number":1252,"context_line":"                    dns_data \u003d self._process_dns_floatingip_update_precommit("},{"line_number":1253,"context_line":"                        context, floatingip_db)"},{"line_number":1254,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1255,"context_line":"            port_id, internal_ip_address, router_id \u003d self._get_assoc_data("},{"line_number":1256,"context_line":"                context, fip, floatingip_db[\u0027floating_network_id\u0027])"},{"line_number":1257,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1258,"context_line":"                port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1259,"context_line":"                fip_id\u003dfloatingip_db[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":45,"id":"bacf61ea_a75b1253","line":1256,"range":{"start_line":1254,"start_character":8,"end_line":1256,"end_character":67},"updated":"2016-08-05 22:13:51.000000000","message":"same thing here, try/except too broad","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"1e08e8e26d03d3408d7beb9f98bf65ba23d3fcc8","unresolved":false,"context_lines":[{"line_number":1251,"context_line":"                if self._is_dns_integration_supported:"},{"line_number":1252,"context_line":"                    dns_data \u003d self._process_dns_floatingip_update_precommit("},{"line_number":1253,"context_line":"                        context, floatingip_db)"},{"line_number":1254,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1255,"context_line":"            port_id, internal_ip_address, router_id \u003d self._get_assoc_data("},{"line_number":1256,"context_line":"                context, fip, floatingip_db[\u0027floating_network_id\u0027])"},{"line_number":1257,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1258,"context_line":"                port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1259,"context_line":"                fip_id\u003dfloatingip_db[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":45,"id":"3ac371cc_e74c7172","line":1256,"range":{"start_line":1254,"start_character":8,"end_line":1256,"end_character":67},"in_reply_to":"bacf61ea_a75b1253","updated":"2016-08-16 06:21:46.000000000","message":"I will fix this.","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"1ffbc00f0bc33d9e3579c5fc55bb1ce6eae86faf","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                        **args)"},{"line_number":1178,"context_line":""},{"line_number":1179,"context_line":"    def _is_ipv4_network(self, context, net_id):"},{"line_number":1180,"context_line":""},{"line_number":1181,"context_line":"        net \u003d self._core_plugin._get_network(context, net_id)"},{"line_number":1182,"context_line":"        return any(s.ip_version \u003d\u003d 4 for s in net.subnets)"},{"line_number":1183,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"fa7ab95a_995b8154","line":1180,"updated":"2016-08-26 06:00:50.000000000","message":"unrelated change","commit_id":"f6ef7b7c2e28f0fdf5c643e14367b8ff21daa355"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"692e050b57b4335f82c8c43354c18f22ee8e66b7","unresolved":false,"context_lines":[{"line_number":1177,"context_line":"                        **args)"},{"line_number":1178,"context_line":""},{"line_number":1179,"context_line":"    def _is_ipv4_network(self, context, net_id):"},{"line_number":1180,"context_line":""},{"line_number":1181,"context_line":"        net \u003d self._core_plugin._get_network(context, net_id)"},{"line_number":1182,"context_line":"        return any(s.ip_version \u003d\u003d 4 for s in net.subnets)"},{"line_number":1183,"context_line":""}],"source_content_type":"text/x-python","patch_set":48,"id":"fa7ab95a_44ed8c8a","line":1180,"in_reply_to":"fa7ab95a_995b8154","updated":"2016-08-26 06:31:19.000000000","message":"Oh, I will remove this line. Not sure how this one sneaks in...","commit_id":"f6ef7b7c2e28f0fdf5c643e14367b8ff21daa355"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"b05f8b6e86d9eca3033059f4143ba0e847ca55d9","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"                context.session.add(floatingip_db)"},{"line_number":1247,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1248,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1249,"context_line":"                port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1250,"context_line":"                fip_id\u003dfloatingip_db[\u0027id\u0027],"},{"line_number":1251,"context_line":"                floating_ip_address\u003dfloatingip_db["},{"line_number":1252,"context_line":"                    \u0027floating_ip_address\u0027],"}],"source_content_type":"text/x-python","patch_set":50,"id":"fa7ab95a_1ccfb829","line":1249,"range":{"start_line":1249,"start_character":0,"end_line":1249,"end_character":55},"updated":"2016-08-30 04:11:23.000000000","message":"UnboundLocalError here.\n\nhttp://logs.openstack.org/87/199387/40/check/gate-tempest-dsvm-networking-midonet-v2/a358c5a/logs/screen-q-svc.txt.gz?level\u003dTRACE#_2016-08-30_01_30_13_476","commit_id":"0fde236eeb4cb05f3b5d89c3c11686e61323f0cf"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"4d15b246a8b28107e7f820fb40dde1739fdfab79","unresolved":false,"context_lines":[{"line_number":1246,"context_line":"                context.session.add(floatingip_db)"},{"line_number":1247,"context_line":"        except db_exc.DBDuplicateEntry:"},{"line_number":1248,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1249,"context_line":"                port_id\u003dfloatingip_db[\u0027fixed_port_id\u0027],"},{"line_number":1250,"context_line":"                fip_id\u003dfloatingip_db[\u0027id\u0027],"},{"line_number":1251,"context_line":"                floating_ip_address\u003dfloatingip_db["},{"line_number":1252,"context_line":"                    \u0027floating_ip_address\u0027],"}],"source_content_type":"text/x-python","patch_set":50,"id":"fa7ab95a_9e11f55f","line":1249,"range":{"start_line":1249,"start_character":0,"end_line":1249,"end_character":55},"in_reply_to":"fa7ab95a_1ccfb829","updated":"2016-08-30 08:15:46.000000000","message":"Thanks! I do not have this tempest test, but the latest patch should be able to pass!","commit_id":"0fde236eeb4cb05f3b5d89c3c11686e61323f0cf"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"40ed8083a94f7830ebede2cfabbb8c62783b35be","unresolved":false,"context_lines":[{"line_number":1251,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1252,"context_line":"                port_id\u003dfip[\u0027port_id\u0027],"},{"line_number":1253,"context_line":"                fip_id\u003dfip_id,"},{"line_number":1254,"context_line":"                floating_ip_address\u003dfloating_ip_address,"},{"line_number":1255,"context_line":"                fixed_ip\u003dinternal_ip_address,"},{"line_number":1256,"context_line":"                net_id\u003df_net_id)"},{"line_number":1257,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":53,"id":"fa7ab95a_afec30f4","line":1254,"updated":"2016-09-01 06:11:48.000000000","message":"unbound error here: http://logs.openstack.org/18/276018/53/check/gate-tempest-dsvm-neutron-dvr/90acd71/logs/screen-q-svc.txt.gz?level\u003dTRACE#_2016-09-01_04_44_12_317","commit_id":"dbfba5f38bf8d26a267d33847c5a67b9a44f01cd"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"da24aee4127116cdd340f2a123806691f18a3654","unresolved":false,"context_lines":[{"line_number":1251,"context_line":"            raise l3.FloatingIPPortAlreadyAssociated("},{"line_number":1252,"context_line":"                port_id\u003dfip[\u0027port_id\u0027],"},{"line_number":1253,"context_line":"                fip_id\u003dfip_id,"},{"line_number":1254,"context_line":"                floating_ip_address\u003dfloating_ip_address,"},{"line_number":1255,"context_line":"                fixed_ip\u003dinternal_ip_address,"},{"line_number":1256,"context_line":"                net_id\u003df_net_id)"},{"line_number":1257,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":53,"id":"fa7ab95a_a549afb9","line":1254,"in_reply_to":"fa7ab95a_afec30f4","updated":"2016-09-01 07:23:49.000000000","message":"thanks for the review! But i am not sure why this error would happen and actually even in the test it does not happen all the time. \n\nI have two things that I am not sure. It would be highly appreciated if you could clarify them when you are available.\n\n1. when I test this patch locally, I will not receive such error. The floating_ip_address is shown in error message normally, without any unbound errors\n\n2. if we need to take care of this unbound error, since this floating_ip_address is created within transaction (L1204-L1230), and will be lost after transaction break. I was wondering if we can move this part before transaction. However, you put a TODO comment around this part making me wonder if we have any concerns not to move them out?","commit_id":"dbfba5f38bf8d26a267d33847c5a67b9a44f01cd"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"f7eba785782f8c4c1e9c1115d8bad43b96f6fdbe","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    # asynchronous backend is unavailable when the floating IP is disassociated"},{"line_number":142,"context_line":"    last_known_router_id \u003d sa.Column(sa.String(36))"},{"line_number":143,"context_line":"    status \u003d sa.Column(sa.String(16))"},{"line_number":144,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sa.UniqueConstraint("},{"line_number":147,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"}],"source_content_type":"text/x-python","patch_set":55,"id":"fa7ab95a_2c9498e0","line":144,"range":{"start_line":144,"start_character":17,"end_line":144,"end_character":29},"updated":"2016-09-01 12:20:02.000000000","message":"why not add another unique index on:\nfloating_ip_address floating_network_id too?","commit_id":"94cb2c7df7422ee1173465bc7923beb407a693e8"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"7e63906697e3a06324fa39ecbcd2668787b3198e","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    # asynchronous backend is unavailable when the floating IP is disassociated"},{"line_number":142,"context_line":"    last_known_router_id \u003d sa.Column(sa.String(36))"},{"line_number":143,"context_line":"    status \u003d sa.Column(sa.String(16))"},{"line_number":144,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sa.UniqueConstraint("},{"line_number":147,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"}],"source_content_type":"text/x-python","patch_set":55,"id":"fa7ab95a_e43564db","line":144,"range":{"start_line":144,"start_character":17,"end_line":144,"end_character":29},"in_reply_to":"fa7ab95a_2c9498e0","updated":"2016-09-01 12:46:32.000000000","message":"I don\u0027t see why we need this unique index here. It cannot fix this bug, because every time we create 2 floating ips, the floating_ip_adrress(es) are different. Besides, this cannot fix the bug if we update 2 existing floating ips with the same fixed ip either.","commit_id":"94cb2c7df7422ee1173465bc7923beb407a693e8"},{"author":{"_account_id":2874,"name":"yong sheng gong","email":"gong.yongsheng@99cloud.net","username":"gongysh"},"change_message_id":"4c2b96843d92671079d8ac3c2b6faa622b520f35","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    # asynchronous backend is unavailable when the floating IP is disassociated"},{"line_number":142,"context_line":"    last_known_router_id \u003d sa.Column(sa.String(36))"},{"line_number":143,"context_line":"    status \u003d sa.Column(sa.String(16))"},{"line_number":144,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sa.UniqueConstraint("},{"line_number":147,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"}],"source_content_type":"text/x-python","patch_set":55,"id":"fa7ab95a_49ed27b6","line":144,"range":{"start_line":144,"start_character":17,"end_line":144,"end_character":29},"in_reply_to":"fa7ab95a_e43564db","updated":"2016-09-01 23:55:28.000000000","message":"It makes sense","commit_id":"94cb2c7df7422ee1173465bc7923beb407a693e8"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"245b5a87e7581dd6c62675d38da5290484658139","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sa.UniqueConstraint("},{"line_number":147,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":148,"context_line":"            name\u003d(\u0027uniq_floatingips0floatingnetworkid\u0027"},{"line_number":149,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027)),"},{"line_number":150,"context_line":"        model_base.BASEV2.__table_args__,)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9a89bdaa_c7477b1b","line":147,"range":{"start_line":147,"start_character":48,"end_line":147,"end_character":64},"updated":"2016-09-06 19:10:56.000000000","message":"I\u0027m curious why the address needs to be part of the constraint. I saw this was added around PS18. With this constraint. You can still get multiple floating IPs associated with the same port if the fixed ips end up different somehow.","commit_id":"0936b52e84a7521fa8dbf6f5cb73af7e0c800deb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"d40229e11cb58270f4186ed7ec0f61aeaf7b12c6","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sa.UniqueConstraint("},{"line_number":147,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":148,"context_line":"            name\u003d(\u0027uniq_floatingips0floatingnetworkid\u0027"},{"line_number":149,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027)),"},{"line_number":150,"context_line":"        model_base.BASEV2.__table_args__,)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9a89bdaa_067beef5","line":147,"range":{"start_line":147,"start_character":48,"end_line":147,"end_character":64},"in_reply_to":"9a89bdaa_c4b3e2e7","updated":"2016-09-07 15:58:59.000000000","message":"Ok, I stand corrected. That bug is older than I am in this project and I\u0027ve never come across the use case. I guess for egress traffic, you just get one of the addresses by chance but I guess it could work.","commit_id":"0936b52e84a7521fa8dbf6f5cb73af7e0c800deb"},{"author":{"_account_id":7448,"name":"Carl Baldwin","email":"carl@ecbaldwin.net","username":"carl-baldwin"},"change_message_id":"8955fc6b5239dde373e0c2be00ab9e72925aca14","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sa.UniqueConstraint("},{"line_number":147,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":148,"context_line":"            name\u003d(\u0027uniq_floatingips0floatingnetworkid\u0027"},{"line_number":149,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027)),"},{"line_number":150,"context_line":"        model_base.BASEV2.__table_args__,)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9a89bdaa_e7dc7f14","line":147,"range":{"start_line":147,"start_character":48,"end_line":147,"end_character":64},"in_reply_to":"9a89bdaa_c7477b1b","updated":"2016-09-06 19:26:28.000000000","message":"I did find your previous discussion [1]. I\u0027m not sure either one is right. The reported bug says that multiple floating ips can be associated with the same port. That, to me, says that the right way to fix it is to make (floating_network_id, fixed_port_id) unique. This doesn\u0027t quite do that.\n\nThe problem with the unique constraint that you have here is that it doesn\u0027t guarantee the above constraint. Also, I don\u0027t think it makes sense conceptually. It allows a dimension of freedom where I don\u0027t think it makes sense. To me, it says that within the context of a floating network, I can repeat a port id as long as the fixed ip is different for each. It also says that I can repeat the same fixed ip as long as the port is different. The latter is actually something that I have to have (overlapping IPs between internal networks) but the former is not something that we can currently handle with the current L3 model.\n\n [1] https://review.openstack.org/#/c/276018/32/neutron/db/l3_db.py","commit_id":"0936b52e84a7521fa8dbf6f5cb73af7e0c800deb"},{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"b310e5d646345b4ba9390f920e6851318ef83272","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sa.UniqueConstraint("},{"line_number":147,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":148,"context_line":"            name\u003d(\u0027uniq_floatingips0floatingnetworkid\u0027"},{"line_number":149,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027)),"},{"line_number":150,"context_line":"        model_base.BASEV2.__table_args__,)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9a89bdaa_c4b3e2e7","line":147,"range":{"start_line":147,"start_character":48,"end_line":147,"end_character":64},"in_reply_to":"9a89bdaa_e2953b87","updated":"2016-09-07 07:45:27.000000000","message":"agree with Lujin Luo that one port which has different fixed_ip_addresses can associate different floating_ip_address, so (floating_network_id, fixed_port_id, fixed_ip_address) unique is reasonable","commit_id":"0936b52e84a7521fa8dbf6f5cb73af7e0c800deb"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"794cde79798e7f8a20e3b4ab99f57c37467a9ba8","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sa.UniqueConstraint("},{"line_number":147,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":148,"context_line":"            name\u003d(\u0027uniq_floatingips0floatingnetworkid\u0027"},{"line_number":149,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027)),"},{"line_number":150,"context_line":"        model_base.BASEV2.__table_args__,)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9a89bdaa_e2953b87","line":147,"range":{"start_line":147,"start_character":48,"end_line":147,"end_character":64},"in_reply_to":"9a89bdaa_e7dc7f14","updated":"2016-09-07 06:24:33.000000000","message":"Hi Carl, thanks for the review.\n\nWhen I first reported the bug, my understanding was that the correspondence between floating_network_id and fixed_port_id should be unique, thus in the bug report I wrote the bug as \"one port associated with multiple floating_ip(s) from the same floating_network_id\". \n\nBut during my research to fix this bug, I went across [1]. According to which, the uniqueness should actually be between fixed_ip_address and floating_network_id. It is acceptable if one port has different fixed_ip_address(es) and each of them has associated floating_ip_address(es) from the same floating_network_id.  \n\nAt this point, you saw the discussion between me and Kevin about whether the unique key should be \"floating_network_id + fixed_ip_address\" only. \n\nThen as what I wrote, and also what you mentioned above, we may have overlapping IPs between internal networks. In such cases, we need to allow duplicate \"floating_network_id + fixed_ip_address\". \n\nTake all the above into consideration, I think \"floating_network_id + fixed_port_id + fixed_ip_address\" is the correct unique key we need. It guarantees the 2 cases we are discussing here, 1. one port_id with different fixed_ip_address(es) can associate with floating_ip_address(es) from the same floating_network_id; 2. same fixed_ip_address can associate to same floating_network_id, as long as they are on different ports. \n\n\n[1] https://bugs.launchpad.net/neutron/+bug/1057844","commit_id":"0936b52e84a7521fa8dbf6f5cb73af7e0c800deb"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"0b138f1160f5dad19238f443a4fd8339dac3659b","unresolved":false,"context_lines":[{"line_number":144,"context_line":"    router \u003d orm.relationship(Router, backref\u003d\u0027floating_ips\u0027)"},{"line_number":145,"context_line":"    __table_args__ \u003d ("},{"line_number":146,"context_line":"        sa.UniqueConstraint("},{"line_number":147,"context_line":"            floating_network_id, fixed_port_id, fixed_ip_address,"},{"line_number":148,"context_line":"            name\u003d(\u0027uniq_floatingips0floatingnetworkid\u0027"},{"line_number":149,"context_line":"                 \u00270fixedportid0fixedipaddress\u0027)),"},{"line_number":150,"context_line":"        model_base.BASEV2.__table_args__,)"}],"source_content_type":"text/x-python","patch_set":58,"id":"9a89bdaa_820d4fea","line":147,"range":{"start_line":147,"start_character":48,"end_line":147,"end_character":64},"in_reply_to":"9a89bdaa_e7dc7f14","updated":"2016-09-07 06:28:31.000000000","message":"I will update the bug report and commit message to make them more clear. To cut the long story short, the former situation you mentioned is allowed/supported in Neutron.","commit_id":"0936b52e84a7521fa8dbf6f5cb73af7e0c800deb"}],"neutron/db/migration/alembic_migrations/versions/mitaka/expand/55b6b812d89e_uniq_floatingips0floating_network_.py":[{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"14b760d4e642684ddeb2e65387e998849cb0af75","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"def upgrade():"},{"line_number":32,"context_line":"    op.create_unique_constraint("},{"line_number":33,"context_line":"            \u0027uniq_floatingips0floating_network_id0fixed_ip_address\u0027,"},{"line_number":34,"context_line":"            \u0027floatingips\u0027,"},{"line_number":35,"context_line":"            [\u0027floating_network_id\u0027, \u0027fixed_ip_address\u0027])"}],"source_content_type":"text/x-python","patch_set":3,"id":"5a5ae5dd_a5c4115f","line":35,"range":{"start_line":32,"start_character":4,"end_line":35,"end_character":56},"updated":"2016-02-04 07:27:18.000000000","message":"I think you should check for duplication previously, like it is done here https://github.com/openstack/neutron/blob/master/neutron/db/migration/alembic_migrations/versions/mitaka/expand/1df244e556f5_add_unique_ha_router_agent_port_bindings.py#L54-L69","commit_id":"fde9132141c7ef81e061e6d06d07058fc53c1807"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"9694d6a70e852f679902013362dc7c122ac85ebe","unresolved":false,"context_lines":[{"line_number":44,"context_line":"            [\u0027floating_network_id\u0027, \u0027fixed_ip_address\u0027])"},{"line_number":45,"context_line":""},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"def check_sanity(connection):"},{"line_number":48,"context_line":"    res \u003d get_duplicate_floating_ip_for_one_fixed_ip(connection)"},{"line_number":49,"context_line":"    if res:"},{"line_number":50,"context_line":"        raise DuplicateFloatingIPforOneFixedIP(fixed_ip_address\u003d\",\".join(res))"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_c3660fec","line":47,"range":{"start_line":47,"start_character":4,"end_line":47,"end_character":17},"updated":"2016-02-18 11:03:42.000000000","message":"Create a test for this https://github.com/openstack/neutron/blob/master/neutron/tests/functional/db/test_migrations.py#L307","commit_id":"a59092d3b2d88b00873ab33665f56b4e7f6a3cf9"},{"author":{"_account_id":7249,"name":"Ann Taraday","email":"akamyshnikova@mirantis.com","username":"AKamyshnikova"},"change_message_id":"9694d6a70e852f679902013362dc7c122ac85ebe","unresolved":false,"context_lines":[{"line_number":52,"context_line":""},{"line_number":53,"context_line":"def get_duplicate_floating_ip_for_one_fixed_ip(connection):"},{"line_number":54,"context_line":"    session \u003d sa.orm.Session(bind\u003dconnection.connect())"},{"line_number":55,"context_line":"    query \u003d (session.query(\u0027floatingips\u0027)"},{"line_number":56,"context_line":"            .group_by(\u0027floatingips\u0027.c.floating_network_id,"},{"line_number":57,"context_line":"                    \u0027floatingips\u0027.c.fixed_ip_address)"},{"line_number":58,"context_line":"            .having(sa.func.count() \u003e 1)).all()"}],"source_content_type":"text/x-python","patch_set":10,"id":"dae33548_a0e781aa","line":55,"range":{"start_line":55,"start_character":28,"end_line":55,"end_character":39},"updated":"2016-02-18 11:03:42.000000000","message":"Create prototype of floatingips model and use it here.\n\nplease, use here floatingips.c.fixed_ip_address and then q[0] as it done here https://review.openstack.org/#/c/281517/1/neutron/db/migration/alembic_migrations/versions/mitaka/expand/1df244e556f5_add_unique_ha_router_agent_port_bindings.py For postgres compability.","commit_id":"a59092d3b2d88b00873ab33665f56b4e7f6a3cf9"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"b433698d2b10a62977960cba573a5510cd941a54","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"1af94dfe_2f724c11","updated":"2016-03-18 14:35:47.000000000","message":"This must now go in the newton versions directory.","commit_id":"588fd40d90ccbd82a712b8d8ec40ffb3cf9166d0"}],"neutron/db/migration/alembic_migrations/versions/newton/expand/55b6b812d89e_uniq_floatingips0floating_network_.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"dffc67d0ac2dee41acaee23c18e54dbb238873f3","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class DuplicateFloatingIPforOneFixedIP(exceptions.Conflict):"},{"line_number":51,"context_line":"    message \u003d _(\"Duplicate Floating IPs is created for fixed IP \""},{"line_number":52,"context_line":"                \"addresse(s) %(fixed_ip_address)s. Database cannot \""},{"line_number":53,"context_line":"                \"be upgraded. Please remove all duplicated before \""},{"line_number":54,"context_line":"                \"upgrading the database.\")"}],"source_content_type":"text/x-python","patch_set":25,"id":"9abb7d3a_e74b1d5e","line":51,"range":{"start_line":51,"start_character":40,"end_line":51,"end_character":42},"updated":"2016-06-02 11:49:40.000000000","message":"were","commit_id":"189bde94d3a52ca32c6478e41dd408c3559a6e75"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"14f21b85261432f27c24d265e2c8ab43b3da0d5c","unresolved":false,"context_lines":[{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class DuplicateFloatingIPforOneFixedIP(exceptions.Conflict):"},{"line_number":51,"context_line":"    message \u003d _(\"Duplicate Floating IPs is created for fixed IP \""},{"line_number":52,"context_line":"                \"addresse(s) %(fixed_ip_address)s. Database cannot \""},{"line_number":53,"context_line":"                \"be upgraded. Please remove all duplicated before \""},{"line_number":54,"context_line":"                \"upgrading the database.\")"}],"source_content_type":"text/x-python","patch_set":25,"id":"9abb7d3a_692fd6f6","line":51,"range":{"start_line":51,"start_character":40,"end_line":51,"end_character":42},"in_reply_to":"9abb7d3a_e74b1d5e","updated":"2016-06-03 01:24:45.000000000","message":"Done","commit_id":"189bde94d3a52ca32c6478e41dd408c3559a6e75"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"dffc67d0ac2dee41acaee23c18e54dbb238873f3","unresolved":false,"context_lines":[{"line_number":50,"context_line":"class DuplicateFloatingIPforOneFixedIP(exceptions.Conflict):"},{"line_number":51,"context_line":"    message \u003d _(\"Duplicate Floating IPs is created for fixed IP \""},{"line_number":52,"context_line":"                \"addresse(s) %(fixed_ip_address)s. Database cannot \""},{"line_number":53,"context_line":"                \"be upgraded. Please remove all duplicated before \""},{"line_number":54,"context_line":"                \"upgrading the database.\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9abb7d3a_075bc12f","line":53,"range":{"start_line":53,"start_character":48,"end_line":53,"end_character":58},"updated":"2016-06-02 11:49:40.000000000","message":"duplicate Floating IPs","commit_id":"189bde94d3a52ca32c6478e41dd408c3559a6e75"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"14f21b85261432f27c24d265e2c8ab43b3da0d5c","unresolved":false,"context_lines":[{"line_number":50,"context_line":"class DuplicateFloatingIPforOneFixedIP(exceptions.Conflict):"},{"line_number":51,"context_line":"    message \u003d _(\"Duplicate Floating IPs is created for fixed IP \""},{"line_number":52,"context_line":"                \"addresse(s) %(fixed_ip_address)s. Database cannot \""},{"line_number":53,"context_line":"                \"be upgraded. Please remove all duplicated before \""},{"line_number":54,"context_line":"                \"upgrading the database.\")"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"9abb7d3a_c934024c","line":53,"range":{"start_line":53,"start_character":48,"end_line":53,"end_character":58},"in_reply_to":"9abb7d3a_075bc12f","updated":"2016-06-03 01:24:45.000000000","message":"Done","commit_id":"189bde94d3a52ca32c6478e41dd408c3559a6e75"}],"neutron/db/migration/alembic_migrations/versions/newton/expand/6b461a21bcfc_uniq_floatingips0floating_network_.py":[{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"change_message_id":"e801ead5fe32a45bc6749212bc7124cb2aeda9dc","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"floatingips \u003d sa.Table("},{"line_number":36,"context_line":"    \u0027floatingips\u0027, sa.MetaData(),"},{"line_number":37,"context_line":"    sa.Column(\u0027tenant_id\u0027, sa.String(255)),"},{"line_number":38,"context_line":"    sa.Column(\u0027id\u0027, sa.String(36)),"},{"line_number":39,"context_line":"    sa.Column(\u0027floating_ip_address\u0027, sa.String(64)),"},{"line_number":40,"context_line":"    sa.Column(\u0027floating_network_id\u0027, sa.String(36)),"}],"source_content_type":"text/x-python","patch_set":38,"id":"1aa78d24_8744591b","line":37,"range":{"start_line":37,"start_character":4,"end_line":37,"end_character":43},"updated":"2016-07-06 03:58:06.000000000","message":"Is this needed? It will conflict with https://review.openstack.org/335786","commit_id":"a446d9e2ed6b060bf12503d6599596efbbdba448"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"1bea3d1944ebf382e44069a87ca35baf64c12f93","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"floatingips \u003d sa.Table("},{"line_number":36,"context_line":"    \u0027floatingips\u0027, sa.MetaData(),"},{"line_number":37,"context_line":"    sa.Column(\u0027tenant_id\u0027, sa.String(255)),"},{"line_number":38,"context_line":"    sa.Column(\u0027id\u0027, sa.String(36)),"},{"line_number":39,"context_line":"    sa.Column(\u0027floating_ip_address\u0027, sa.String(64)),"},{"line_number":40,"context_line":"    sa.Column(\u0027floating_network_id\u0027, sa.String(36)),"}],"source_content_type":"text/x-python","patch_set":38,"id":"1aa78d24_b4bdc1d9","line":37,"range":{"start_line":37,"start_character":4,"end_line":37,"end_character":43},"in_reply_to":"1aa78d24_8744591b","updated":"2016-07-08 00:58:34.000000000","message":"After discussing with Ann, we decided to delete these unnecessary columns and only keep the three columns which are to be added the composite unique key.","commit_id":"a446d9e2ed6b060bf12503d6599596efbbdba448"},{"author":{"_account_id":19554,"name":"Nam","email":"namnh68@fsoft.com.vn","username":"namnh"},"change_message_id":"fd827cfcebcf3883c7fcbc0a9c83a0e66ed9cbd1","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def upgrade():"},{"line_number":50,"context_line":"    op.create_unique_constraint("},{"line_number":51,"context_line":"        \u0027uniq_floatingips0floatingnetworkid0fixedportid0fixedipaddress\u0027,"},{"line_number":52,"context_line":"        \u0027floatingips\u0027,"},{"line_number":53,"context_line":"        [\u0027floating_network_id\u0027, \u0027fixed_port_id\u0027, \u0027fixed_ip_address\u0027])"}],"source_content_type":"text/x-python","patch_set":44,"id":"bacf61ea_a369788e","line":50,"range":{"start_line":50,"start_character":4,"end_line":50,"end_character":31},"updated":"2016-08-05 03:16:25.000000000","message":"In my opinion, using unique_constraint solution is the best one for this case. But I don\u0027t understand why the core-reviews don\u0027t mask +2 for this patch, maybe they need to think deeply when affecting DB. \u003d\u003d\u003e  Come on Luo-san","commit_id":"e10163b38584901b47e0855ad84fb64e56cf4930"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"2318bcc461b45de64e11fb40762f6140ed6c9fee","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"def upgrade():"},{"line_number":50,"context_line":"    op.create_unique_constraint("},{"line_number":51,"context_line":"        \u0027uniq_floatingips0floatingnetworkid0fixedportid0fixedipaddress\u0027,"},{"line_number":52,"context_line":"        \u0027floatingips\u0027,"},{"line_number":53,"context_line":"        [\u0027floating_network_id\u0027, \u0027fixed_port_id\u0027, \u0027fixed_ip_address\u0027])"}],"source_content_type":"text/x-python","patch_set":44,"id":"bacf61ea_eebcf76d","line":50,"range":{"start_line":50,"start_character":4,"end_line":50,"end_character":31},"in_reply_to":"bacf61ea_a369788e","updated":"2016-08-05 04:16:45.000000000","message":"Thanks ;)","commit_id":"e10163b38584901b47e0855ad84fb64e56cf4930"},{"author":{"_account_id":13717,"name":"Inessa Vasilevskaya","email":"ivasilevskaya@mirantis.com","username":"ivasilevskaya"},"change_message_id":"3de55c52b9fd29e6165e8c77e454f6b44077329e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"def get_duplicate_floating_ip_for_one_fixed_ip(connection):"},{"line_number":63,"context_line":"    insp \u003d sa.engine.reflection.Inspector.from_engine(connection)"},{"line_number":64,"context_line":"    if \u0027floatingips\u0027 not in insp.get_table_names():"},{"line_number":65,"context_line":"        return {}"},{"line_number":66,"context_line":"    session \u003d sa.orm.Session(bind\u003dconnection.connect())"},{"line_number":67,"context_line":"    query \u003d (session.query(floatingips.c.fixed_ip_address)"},{"line_number":68,"context_line":"             .group_by(floatingips.c.floating_network_id,"}],"source_content_type":"text/x-python","patch_set":45,"id":"bacf61ea_27944235","line":65,"range":{"start_line":65,"start_character":8,"end_line":65,"end_character":17},"updated":"2016-08-05 22:13:51.000000000","message":"should return a list","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"1e08e8e26d03d3408d7beb9f98bf65ba23d3fcc8","unresolved":false,"context_lines":[{"line_number":62,"context_line":"def get_duplicate_floating_ip_for_one_fixed_ip(connection):"},{"line_number":63,"context_line":"    insp \u003d sa.engine.reflection.Inspector.from_engine(connection)"},{"line_number":64,"context_line":"    if \u0027floatingips\u0027 not in insp.get_table_names():"},{"line_number":65,"context_line":"        return {}"},{"line_number":66,"context_line":"    session \u003d sa.orm.Session(bind\u003dconnection.connect())"},{"line_number":67,"context_line":"    query \u003d (session.query(floatingips.c.fixed_ip_address)"},{"line_number":68,"context_line":"             .group_by(floatingips.c.floating_network_id,"}],"source_content_type":"text/x-python","patch_set":45,"id":"3ac371cc_274e896f","line":65,"range":{"start_line":65,"start_character":8,"end_line":65,"end_character":17},"in_reply_to":"bacf61ea_27944235","updated":"2016-08-16 06:21:46.000000000","message":"I will fix this.","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"1ffbc00f0bc33d9e3579c5fc55bb1ce6eae86faf","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def get_duplicate_floating_ip_for_one_fixed_ip(connection):"},{"line_number":63,"context_line":"    insp \u003d sa.engine.reflection.Inspector.from_engine(connection)"},{"line_number":64,"context_line":"    if \u0027floatingips\u0027 not in insp.get_table_names():"},{"line_number":65,"context_line":"        return []"},{"line_number":66,"context_line":"    session \u003d sa.orm.Session(bind\u003dconnection.connect())"},{"line_number":67,"context_line":"    query \u003d (session.query(floatingips.c.fixed_ip_address)"}],"source_content_type":"text/x-python","patch_set":48,"id":"fa7ab95a_e4fea004","line":64,"range":{"start_line":64,"start_character":4,"end_line":64,"end_character":51},"updated":"2016-08-26 06:00:50.000000000","message":"is this check necessary?","commit_id":"f6ef7b7c2e28f0fdf5c643e14367b8ff21daa355"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"692e050b57b4335f82c8c43354c18f22ee8e66b7","unresolved":false,"context_lines":[{"line_number":61,"context_line":""},{"line_number":62,"context_line":"def get_duplicate_floating_ip_for_one_fixed_ip(connection):"},{"line_number":63,"context_line":"    insp \u003d sa.engine.reflection.Inspector.from_engine(connection)"},{"line_number":64,"context_line":"    if \u0027floatingips\u0027 not in insp.get_table_names():"},{"line_number":65,"context_line":"        return []"},{"line_number":66,"context_line":"    session \u003d sa.orm.Session(bind\u003dconnection.connect())"},{"line_number":67,"context_line":"    query \u003d (session.query(floatingips.c.fixed_ip_address)"}],"source_content_type":"text/x-python","patch_set":48,"id":"fa7ab95a_249fa804","line":64,"range":{"start_line":64,"start_character":4,"end_line":64,"end_character":51},"in_reply_to":"fa7ab95a_e4fea004","updated":"2016-08-26 06:31:19.000000000","message":"Yes, we need to check if the floatingips table exists in the database before querying its columns. Otherwise some tests will send \"table does not exist\" error messages.","commit_id":"f6ef7b7c2e28f0fdf5c643e14367b8ff21daa355"}],"neutron/tests/functional/db/test_migrations.py":[{"author":{"_account_id":13689,"name":"Hironori Shiina","email":"Hironori.Shiina@fujitsu.com","username":"shiina"},"change_message_id":"bf55b54058bcf6379e2485a95b01c4dd087ac23a","unresolved":false,"context_lines":[{"line_number":338,"context_line":"            sqlalchemy.Column(\u0027router_id\u0027, sqlalchemy.String(36)),"},{"line_number":339,"context_line":"            sqlalchemy.Column(\u0027last_known_router_id\u0027, sqlalchemy.String(36)),"},{"line_number":340,"context_line":"            sqlalchemy.Column(\u0027status\u0027, sqlalchemy.String(16)),"},{"line_number":341,"context_line":"            sqlalchemy.Column(\u0027standard_attr_id\u0027, sqlalchemy.BigInteger(20)))"},{"line_number":342,"context_line":""},{"line_number":343,"context_line":"        with self.engine.connect() as conn:"},{"line_number":344,"context_line":"            floatingips.create(conn)"}],"source_content_type":"text/x-python","patch_set":11,"id":"9aed3d3a_3aacd59f","line":341,"range":{"start_line":341,"start_character":71,"end_line":341,"end_character":75},"updated":"2016-02-26 14:50:53.000000000","message":"BigInteger() doesn\u0027t need a parameter.","commit_id":"84f8634974ce287205abecb20560f43908f6785a"}],"neutron/tests/unit/extensions/test_l3.py":[{"author":{"_account_id":13717,"name":"Inessa Vasilevskaya","email":"ivasilevskaya@mirantis.com","username":"ivasilevskaya"},"change_message_id":"3de55c52b9fd29e6165e8c77e454f6b44077329e","unresolved":false,"context_lines":[{"line_number":2143,"context_line":"                                        \u0027fixed_ip_address\u0027: \u00272001:db8::a\u0027}},"},{"line_number":2144,"context_line":"                        expected_code\u003dexc.HTTPBadRequest.code)"},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"    def test_floatingip_update_same_fixed_ip_same_port(self):"},{"line_number":2147,"context_line":"        with self.subnet() as private_sub:"},{"line_number":2148,"context_line":"            ip_range \u003d list(netaddr.IPNetwork(private_sub[\u0027subnet\u0027][\u0027cidr\u0027]))"},{"line_number":2149,"context_line":"            fixed_ip \u003d [{\u0027ip_address\u0027: str(ip_range[-3])}]"},{"line_number":2150,"context_line":"            with self.port(subnet\u003dprivate_sub, fixed_ips\u003dfixed_ip) as p:"},{"line_number":2151,"context_line":"                with self.router() as r:"},{"line_number":2152,"context_line":"                    with self.subnet(cidr\u003d\u002711.0.0.0/24\u0027) as public_sub:"},{"line_number":2153,"context_line":"                        self._set_net_external("},{"line_number":2154,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2155,"context_line":"                        self._add_external_gateway_to_router("},{"line_number":2156,"context_line":"                            r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":2157,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2158,"context_line":"                        self._router_interface_action("},{"line_number":2159,"context_line":"                            \u0027add\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":2160,"context_line":"                            private_sub[\u0027subnet\u0027][\u0027id\u0027], None)"},{"line_number":2161,"context_line":"                        fip1 \u003d self._make_floatingip("},{"line_number":2162,"context_line":"                            self.fmt,"},{"line_number":2163,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2164,"context_line":"                        fip2 \u003d self._make_floatingip("},{"line_number":2165,"context_line":"                            self.fmt,"},{"line_number":2166,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2167,"context_line":"                        body_1 \u003d self._update("},{"line_number":2168,"context_line":"                            \u0027floatingips\u0027, fip1[\u0027floatingip\u0027][\u0027id\u0027],"},{"line_number":2169,"context_line":"                            {\u0027floatingip\u0027: {\u0027port_id\u0027: p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2170,"context_line":"                                        \u0027fixed_ip_address\u0027: str(ip_range[-3])}"},{"line_number":2171,"context_line":"                             })"},{"line_number":2172,"context_line":"                        self._update("},{"line_number":2173,"context_line":"                            \u0027floatingips\u0027, fip2[\u0027floatingip\u0027][\u0027id\u0027],"},{"line_number":2174,"context_line":"                            {\u0027floatingip\u0027: {\u0027port_id\u0027: p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2175,"context_line":"                                        \u0027fixed_ip_address\u0027: str(ip_range[-3])}"},{"line_number":2176,"context_line":"                             }, exc.HTTPConflict.code)"},{"line_number":2177,"context_line":"                        self.assertEqual(str(ip_range[-3]),"},{"line_number":2178,"context_line":"                            body_1[\u0027floatingip\u0027][\u0027fixed_ip_address\u0027])"},{"line_number":2179,"context_line":"                        self.assertEqual(p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2180,"context_line":"                            body_1[\u0027floatingip\u0027][\u0027port_id\u0027])"},{"line_number":2181,"context_line":"                        body \u003d self._show(\u0027floatingips\u0027,"},{"line_number":2182,"context_line":"                                          fip2[\u0027floatingip\u0027][\u0027id\u0027])"},{"line_number":2183,"context_line":"                        self.assertIsNone("},{"line_number":2184,"context_line":"                            body[\u0027floatingip\u0027][\u0027fixed_ip_address\u0027])"},{"line_number":2185,"context_line":"                        self.assertIsNone("},{"line_number":2186,"context_line":"                            body[\u0027floatingip\u0027][\u0027port_id\u0027])"},{"line_number":2187,"context_line":""},{"line_number":2188,"context_line":"    def test_create_multiple_floatingips_same_fixed_ip_same_port(self):"},{"line_number":2189,"context_line":"        \u0027\u0027\u0027This tests that if multiple API requests arrive to create"},{"line_number":2190,"context_line":"        floating IPs on same external network to same port with one"},{"line_number":2191,"context_line":"        fixed ip, the latter API requests would be blocked at"},{"line_number":2192,"context_line":"        database side."},{"line_number":2193,"context_line":"        \u0027\u0027\u0027"},{"line_number":2194,"context_line":"        with self.router() as r:"},{"line_number":2195,"context_line":"            with self.subnet(cidr\u003d\u002711.0.0.0/24\u0027) as public_sub:"},{"line_number":2196,"context_line":"                self._set_net_external(public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2197,"context_line":"                self._add_external_gateway_to_router("},{"line_number":2198,"context_line":"                    r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":2199,"context_line":"                    public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2200,"context_line":""},{"line_number":2201,"context_line":"                with self.subnet() as private_sub:"},{"line_number":2202,"context_line":"                    ip_range \u003d list(netaddr.IPNetwork("},{"line_number":2203,"context_line":"                        private_sub[\u0027subnet\u0027][\u0027cidr\u0027]))"},{"line_number":2204,"context_line":"                    fixed_ips \u003d [{\u0027ip_address\u0027: str(ip_range[-3])},"},{"line_number":2205,"context_line":"                                {\u0027ip_address\u0027: str(ip_range[-2])}]"},{"line_number":2206,"context_line":""},{"line_number":2207,"context_line":"                    self._router_interface_action("},{"line_number":2208,"context_line":"                        \u0027add\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":2209,"context_line":"                        private_sub[\u0027subnet\u0027][\u0027id\u0027], None)"},{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"                    with self.port(subnet\u003dprivate_sub,"},{"line_number":2212,"context_line":"                                   fixed_ips\u003dfixed_ips) as p:"},{"line_number":2213,"context_line":""},{"line_number":2214,"context_line":"                        fip1 \u003d self._make_floatingip("},{"line_number":2215,"context_line":"                            self.fmt,"},{"line_number":2216,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":2217,"context_line":"                            p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2218,"context_line":"                            fixed_ip\u003dstr(ip_range[-3]))"},{"line_number":2219,"context_line":"                        # Test the second floating ip is not successfully"},{"line_number":2220,"context_line":"                        # created and returns a conflict code"},{"line_number":2221,"context_line":"                        self._make_floatingip("},{"line_number":2222,"context_line":"                            self.fmt,"},{"line_number":2223,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":2224,"context_line":"                            p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2225,"context_line":"                            fixed_ip\u003dstr(ip_range[-3]),"},{"line_number":2226,"context_line":"                            http_status\u003dexc.HTTPConflict.code)"},{"line_number":2227,"context_line":"                        # Test that floating ips are assigned successfully."},{"line_number":2228,"context_line":"                        body \u003d self._show(\u0027floatingips\u0027,"},{"line_number":2229,"context_line":"                                          fip1[\u0027floatingip\u0027][\u0027id\u0027])"},{"line_number":2230,"context_line":"                        self.assertEqual("},{"line_number":2231,"context_line":"                            body[\u0027floatingip\u0027][\u0027port_id\u0027],"},{"line_number":2232,"context_line":"                            fip1[\u0027floatingip\u0027][\u0027port_id\u0027])"},{"line_number":2233,"context_line":""},{"line_number":2234,"context_line":"                    self._delete(\u0027ports\u0027, p[\u0027port\u0027][\u0027id\u0027])"},{"line_number":2235,"context_line":"                    # Test that port has been successfully deleted."},{"line_number":2236,"context_line":"                    body \u003d self._show(\u0027ports\u0027, p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2237,"context_line":"                                      expected_code\u003dexc.HTTPNotFound.code)"},{"line_number":2238,"context_line":""},{"line_number":2239,"context_line":"    def test_first_floatingip_associate_notification(self):"},{"line_number":2240,"context_line":"        with self.port() as p:"}],"source_content_type":"text/x-python","patch_set":45,"id":"bacf61ea_27656244","line":2237,"range":{"start_line":2146,"start_character":4,"end_line":2237,"end_character":74},"updated":"2016-08-05 22:13:51.000000000","message":"These tests pass without your fix, which means that they don\u0027t cover the behavior the patch is about. Why do we need them?","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"},{"author":{"_account_id":17491,"name":"Lujin Luo","email":"luo.lujin@jp.fujitsu.com","username":"Lujin"},"change_message_id":"1e08e8e26d03d3408d7beb9f98bf65ba23d3fcc8","unresolved":false,"context_lines":[{"line_number":2143,"context_line":"                                        \u0027fixed_ip_address\u0027: \u00272001:db8::a\u0027}},"},{"line_number":2144,"context_line":"                        expected_code\u003dexc.HTTPBadRequest.code)"},{"line_number":2145,"context_line":""},{"line_number":2146,"context_line":"    def test_floatingip_update_same_fixed_ip_same_port(self):"},{"line_number":2147,"context_line":"        with self.subnet() as private_sub:"},{"line_number":2148,"context_line":"            ip_range \u003d list(netaddr.IPNetwork(private_sub[\u0027subnet\u0027][\u0027cidr\u0027]))"},{"line_number":2149,"context_line":"            fixed_ip \u003d [{\u0027ip_address\u0027: str(ip_range[-3])}]"},{"line_number":2150,"context_line":"            with self.port(subnet\u003dprivate_sub, fixed_ips\u003dfixed_ip) as p:"},{"line_number":2151,"context_line":"                with self.router() as r:"},{"line_number":2152,"context_line":"                    with self.subnet(cidr\u003d\u002711.0.0.0/24\u0027) as public_sub:"},{"line_number":2153,"context_line":"                        self._set_net_external("},{"line_number":2154,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2155,"context_line":"                        self._add_external_gateway_to_router("},{"line_number":2156,"context_line":"                            r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":2157,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2158,"context_line":"                        self._router_interface_action("},{"line_number":2159,"context_line":"                            \u0027add\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":2160,"context_line":"                            private_sub[\u0027subnet\u0027][\u0027id\u0027], None)"},{"line_number":2161,"context_line":"                        fip1 \u003d self._make_floatingip("},{"line_number":2162,"context_line":"                            self.fmt,"},{"line_number":2163,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2164,"context_line":"                        fip2 \u003d self._make_floatingip("},{"line_number":2165,"context_line":"                            self.fmt,"},{"line_number":2166,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2167,"context_line":"                        body_1 \u003d self._update("},{"line_number":2168,"context_line":"                            \u0027floatingips\u0027, fip1[\u0027floatingip\u0027][\u0027id\u0027],"},{"line_number":2169,"context_line":"                            {\u0027floatingip\u0027: {\u0027port_id\u0027: p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2170,"context_line":"                                        \u0027fixed_ip_address\u0027: str(ip_range[-3])}"},{"line_number":2171,"context_line":"                             })"},{"line_number":2172,"context_line":"                        self._update("},{"line_number":2173,"context_line":"                            \u0027floatingips\u0027, fip2[\u0027floatingip\u0027][\u0027id\u0027],"},{"line_number":2174,"context_line":"                            {\u0027floatingip\u0027: {\u0027port_id\u0027: p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2175,"context_line":"                                        \u0027fixed_ip_address\u0027: str(ip_range[-3])}"},{"line_number":2176,"context_line":"                             }, exc.HTTPConflict.code)"},{"line_number":2177,"context_line":"                        self.assertEqual(str(ip_range[-3]),"},{"line_number":2178,"context_line":"                            body_1[\u0027floatingip\u0027][\u0027fixed_ip_address\u0027])"},{"line_number":2179,"context_line":"                        self.assertEqual(p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2180,"context_line":"                            body_1[\u0027floatingip\u0027][\u0027port_id\u0027])"},{"line_number":2181,"context_line":"                        body \u003d self._show(\u0027floatingips\u0027,"},{"line_number":2182,"context_line":"                                          fip2[\u0027floatingip\u0027][\u0027id\u0027])"},{"line_number":2183,"context_line":"                        self.assertIsNone("},{"line_number":2184,"context_line":"                            body[\u0027floatingip\u0027][\u0027fixed_ip_address\u0027])"},{"line_number":2185,"context_line":"                        self.assertIsNone("},{"line_number":2186,"context_line":"                            body[\u0027floatingip\u0027][\u0027port_id\u0027])"},{"line_number":2187,"context_line":""},{"line_number":2188,"context_line":"    def test_create_multiple_floatingips_same_fixed_ip_same_port(self):"},{"line_number":2189,"context_line":"        \u0027\u0027\u0027This tests that if multiple API requests arrive to create"},{"line_number":2190,"context_line":"        floating IPs on same external network to same port with one"},{"line_number":2191,"context_line":"        fixed ip, the latter API requests would be blocked at"},{"line_number":2192,"context_line":"        database side."},{"line_number":2193,"context_line":"        \u0027\u0027\u0027"},{"line_number":2194,"context_line":"        with self.router() as r:"},{"line_number":2195,"context_line":"            with self.subnet(cidr\u003d\u002711.0.0.0/24\u0027) as public_sub:"},{"line_number":2196,"context_line":"                self._set_net_external(public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2197,"context_line":"                self._add_external_gateway_to_router("},{"line_number":2198,"context_line":"                    r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":2199,"context_line":"                    public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":2200,"context_line":""},{"line_number":2201,"context_line":"                with self.subnet() as private_sub:"},{"line_number":2202,"context_line":"                    ip_range \u003d list(netaddr.IPNetwork("},{"line_number":2203,"context_line":"                        private_sub[\u0027subnet\u0027][\u0027cidr\u0027]))"},{"line_number":2204,"context_line":"                    fixed_ips \u003d [{\u0027ip_address\u0027: str(ip_range[-3])},"},{"line_number":2205,"context_line":"                                {\u0027ip_address\u0027: str(ip_range[-2])}]"},{"line_number":2206,"context_line":""},{"line_number":2207,"context_line":"                    self._router_interface_action("},{"line_number":2208,"context_line":"                        \u0027add\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":2209,"context_line":"                        private_sub[\u0027subnet\u0027][\u0027id\u0027], None)"},{"line_number":2210,"context_line":""},{"line_number":2211,"context_line":"                    with self.port(subnet\u003dprivate_sub,"},{"line_number":2212,"context_line":"                                   fixed_ips\u003dfixed_ips) as p:"},{"line_number":2213,"context_line":""},{"line_number":2214,"context_line":"                        fip1 \u003d self._make_floatingip("},{"line_number":2215,"context_line":"                            self.fmt,"},{"line_number":2216,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":2217,"context_line":"                            p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2218,"context_line":"                            fixed_ip\u003dstr(ip_range[-3]))"},{"line_number":2219,"context_line":"                        # Test the second floating ip is not successfully"},{"line_number":2220,"context_line":"                        # created and returns a conflict code"},{"line_number":2221,"context_line":"                        self._make_floatingip("},{"line_number":2222,"context_line":"                            self.fmt,"},{"line_number":2223,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":2224,"context_line":"                            p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2225,"context_line":"                            fixed_ip\u003dstr(ip_range[-3]),"},{"line_number":2226,"context_line":"                            http_status\u003dexc.HTTPConflict.code)"},{"line_number":2227,"context_line":"                        # Test that floating ips are assigned successfully."},{"line_number":2228,"context_line":"                        body \u003d self._show(\u0027floatingips\u0027,"},{"line_number":2229,"context_line":"                                          fip1[\u0027floatingip\u0027][\u0027id\u0027])"},{"line_number":2230,"context_line":"                        self.assertEqual("},{"line_number":2231,"context_line":"                            body[\u0027floatingip\u0027][\u0027port_id\u0027],"},{"line_number":2232,"context_line":"                            fip1[\u0027floatingip\u0027][\u0027port_id\u0027])"},{"line_number":2233,"context_line":""},{"line_number":2234,"context_line":"                    self._delete(\u0027ports\u0027, p[\u0027port\u0027][\u0027id\u0027])"},{"line_number":2235,"context_line":"                    # Test that port has been successfully deleted."},{"line_number":2236,"context_line":"                    body \u003d self._show(\u0027ports\u0027, p[\u0027port\u0027][\u0027id\u0027],"},{"line_number":2237,"context_line":"                                      expected_code\u003dexc.HTTPNotFound.code)"},{"line_number":2238,"context_line":""},{"line_number":2239,"context_line":"    def test_first_floatingip_associate_notification(self):"},{"line_number":2240,"context_line":"        with self.port() as p:"}],"source_content_type":"text/x-python","patch_set":45,"id":"3ac371cc_07d42d45","line":2237,"range":{"start_line":2146,"start_character":4,"end_line":2237,"end_character":74},"in_reply_to":"bacf61ea_27656244","updated":"2016-08-16 06:21:46.000000000","message":"These tests will pass without this fix because of this part [1], which is deleted in this patch. This means all the \u0027check if the floating ip is allowed or not\u0027 logic is handled by database side, rather than manual check before inserting/updating database. \n\n[1] https://github.com/openstack/neutron/blob/master/neutron/db/l3_db.py#L1129-#L1141","commit_id":"10872f503c53e05c45c20e716908fe817c2e8705"}]}
