)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Updated with this commit based on review comments"},{"line_number":17,"context_line":"removed test_subnet_with_invalid_allocation_range and combined"},{"line_number":18,"context_line":"with existing function floatingip_with_assoc_fails"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"removed extra logging and re-raising of the exceptions."},{"line_number":21,"context_line":"removed extra blank lines and comments"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAOn%2F%2F0ew%3D","line":18,"updated":"2013-04-21 23:45:16.000000000","message":"It is our practice to not include what\u0027s changed in a single patchset in the commit message.\nThis because once the patch is merged, the commit message stays, but the patchset history will not be found in the git log!","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"Updated with this commit based on review comments"},{"line_number":17,"context_line":"removed test_subnet_with_invalid_allocation_range and combined"},{"line_number":18,"context_line":"with existing function floatingip_with_assoc_fails"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"removed extra logging and re-raising of the exceptions."},{"line_number":21,"context_line":"removed extra blank lines and comments"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAOn%2F%2Fvx0%3D","line":18,"in_reply_to":"AAAAOn%2F%2F0ew%3D","updated":"2013-04-25 00:46:35.000000000","message":"Done","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":21,"context_line":"removed extra blank lines and comments"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"A InvalidExternalNetwork exception is being added and quantum/db/l3_db.py"},{"line_number":24,"context_line":"is changed to catch InvalidExternalNetwork and IpAddressGenerationFailure"},{"line_number":25,"context_line":"failures."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: Ia0140620205a80dd4b3637b2d41562adb7992b5c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAOn%2F%2F4JE%3D","line":24,"updated":"2013-04-22 02:01:57.000000000","message":"I guess you forget update this comment","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":21,"context_line":"removed extra blank lines and comments"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"A InvalidExternalNetwork exception is being added and quantum/db/l3_db.py"},{"line_number":24,"context_line":"is changed to catch InvalidExternalNetwork and IpAddressGenerationFailure"},{"line_number":25,"context_line":"failures."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Change-Id: Ia0140620205a80dd4b3637b2d41562adb7992b5c"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"AAAAOn%2F%2Fvxw%3D","line":24,"in_reply_to":"AAAAOn%2F%2F4JE%3D","updated":"2013-04-25 00:46:35.000000000","message":"Done","commit_id":"551dea96c917f006676f9e49d0f026e902485151"}],"quantum/common/exceptions.py":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":39,"context_line":"    message \u003d _(\u0027Bad %(resource)s request: %(msg)s\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class InvalidExternalNetwork(QuantumException):"},{"line_number":43,"context_line":"    message \u003d _(\"Unable to find any IP address on external network\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOH%2F%2F7io%3D","line":42,"updated":"2013-03-20 15:34:24.000000000","message":"This change the status code. For keep same status code, InvalidExternalNetwork should be the subclass of BadRequest.","commit_id":"dc1e5f5a42b941fcb5d808b21834f8a22f55002c"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":39,"context_line":"    message \u003d _(\u0027Bad %(resource)s request: %(msg)s\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class InvalidExternalNetwork(QuantumException):"},{"line_number":43,"context_line":"    message \u003d _(\"Unable to find any IP address on external network\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F0e8%3D","line":42,"updated":"2013-04-21 23:45:16.000000000","message":"If the intent is to return a 400 inherit from BadRequest\n\nAlso - the name of the exception class does not represent the semantics of the exception.  Consider ExternalIpAddressGenerationFailure?","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":39,"context_line":"    message \u003d _(\u0027Bad %(resource)s request: %(msg)s\u0027)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class InvalidExternalNetwork(QuantumException):"},{"line_number":43,"context_line":"    message \u003d _(\"Unable to find any IP address on external network\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FvyI%3D","line":42,"in_reply_to":"AAAAOn%2F%2F0e8%3D","updated":"2013-04-25 00:46:35.000000000","message":"Done","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":6695,"name":"Dane LeBlanc","email":"leblancd@cisco.com","username":"leblancd"},"unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ExternalIpAddressGenerationFailure(BadRequest):"},{"line_number":43,"context_line":"    message \u003d _(\"Unable to find any IP address on external network\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class NotFound(QuantumException):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fuow%3D","line":43,"updated":"2013-04-25 21:04:21.000000000","message":"Would it be useful to include the floating network ID in the message for this exception (similar to what\u0027s included for IpAddressGenerationFailure)?","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":40,"context_line":""},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"class ExternalIpAddressGenerationFailure(BadRequest):"},{"line_number":43,"context_line":"    message \u003d _(\"Unable to find any IP address on external network\")"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class NotFound(QuantumException):"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FngI%3D","line":43,"in_reply_to":"AAAAOn%2F%2Fuow%3D","updated":"2013-05-01 18:24:23.000000000","message":"Done","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":2031,"name":"Nachi Ueno","email":"nati.ueno@gmail.com","username":"nati-ueno"},"unresolved":false,"context_lines":[{"line_number":245,"context_line":"    message \u003d _(\"Invalid extension environment: %(reason)s\")"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"class ExternalIpAddressGenerationFailure(BadRequest):"},{"line_number":249,"context_line":"    message \u003d _(\"Unable to find any IP address on external \""},{"line_number":250,"context_line":"                \"network %(net_id)s.\")"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPH%2F%2Fy5M%3D","line":248,"updated":"2013-05-22 21:27:12.000000000","message":"I prefer ExternalIpAddressExhausted  because we have used \"Exhausted\" in the other terms.  Also we are not generating ip address but assigning it from pool.","commit_id":"e5443dc243eae96c69002dee779c5fe391af00e6"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    message \u003d _(\"Invalid extension environment: %(reason)s\")"},{"line_number":246,"context_line":""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"class ExternalIpAddressGenerationFailure(BadRequest):"},{"line_number":249,"context_line":"    message \u003d _(\"Unable to find any IP address on external \""},{"line_number":250,"context_line":"                \"network %(net_id)s.\")"},{"line_number":251,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAAPH%2F%2FxCQ%3D","line":248,"in_reply_to":"AAAAPH%2F%2Fy5M%3D","updated":"2013-05-23 15:03:08.000000000","message":"Done","commit_id":"e5443dc243eae96c69002dee779c5fe391af00e6"}],"quantum/db/l3_db.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5cd9c463785df3e87b8344bc0834bfe2b95fd376","unresolved":false,"context_lines":[{"line_number":637,"context_line":"                     \u0027name\u0027: \u0027\u0027}})"},{"line_number":638,"context_line":"                # Ensure IP addresses are allocated on external port"},{"line_number":639,"context_line":"                if not external_port[\u0027fixed_ips\u0027]:"},{"line_number":640,"context_line":"                    raise q_exc.InvalidExternalNetwork()"},{"line_number":641,"context_line":""},{"line_number":642,"context_line":"                floating_fixed_ip \u003d external_port[\u0027fixed_ips\u0027][0]"},{"line_number":643,"context_line":"                floating_ip_address \u003d floating_fixed_ip[\u0027ip_address\u0027]"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F3JQ%3D","line":640,"updated":"2013-03-08 14:22:16.000000000","message":"Should the exception be passed floatingip?","commit_id":"1179a2a94f3a1fddc0c9f1f9e6a5db418ceef917"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5cd9c463785df3e87b8344bc0834bfe2b95fd376","unresolved":false,"context_lines":[{"line_number":655,"context_line":"                context.session.add(floatingip_db)"},{"line_number":656,"context_line":"        # TODO(salvatore-orlando): Avoid broad catch"},{"line_number":657,"context_line":"        # Maybe by introducing base class for L3 exceptions"},{"line_number":658,"context_line":"        except q_exc.InvalidExternalNetwork, e:"},{"line_number":659,"context_line":"            LOG.exception(_(\u0027Unable to create Floating ip due to %s\u0027) % e)"},{"line_number":660,"context_line":"            raise"},{"line_number":661,"context_line":"        except q_exc.IpAddressGenerationFailure, e:"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F3JE%3D","line":658,"updated":"2013-03-08 14:22:16.000000000","message":"Since the processing is the same for both, I think you can do:\n\nexcept (q_exc.InvalidExternalNetwork, q_exc.IpAddressGenerationFailure) as e:\n    LOG(...)\n    raise","commit_id":"1179a2a94f3a1fddc0c9f1f9e6a5db418ceef917"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":657,"context_line":"        # Maybe by introducing base class for L3 exceptions"},{"line_number":658,"context_line":"        except (q_exc.InvalidExternalNetwork,"},{"line_number":659,"context_line":"                q_exc.IpAddressGenerationFailure) as e:"},{"line_number":660,"context_line":"            LOG.exception(_(\u0027Unable to create Floating ip due to %s\u0027) % e)"},{"line_number":661,"context_line":"            raise"},{"line_number":662,"context_line":"        except Exception:"},{"line_number":663,"context_line":"            LOG.exception(_(\"Floating IP association failed\"))"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOH%2F%2F7iU%3D","line":660,"updated":"2013-03-20 15:34:24.000000000","message":"We needn\u0027t catch the exception at here. Because this catch just raise the exception again and we needn\u0027t show another message rather than the message of exception.","commit_id":"dc1e5f5a42b941fcb5d808b21834f8a22f55002c"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":659,"context_line":"                q_exc.IpAddressGenerationFailure) as e:"},{"line_number":660,"context_line":"            LOG.exception(_(\u0027Unable to create Floating ip due to %s\u0027) % e)"},{"line_number":661,"context_line":"            raise"},{"line_number":662,"context_line":"        except Exception:"},{"line_number":663,"context_line":"            LOG.exception(_(\"Floating IP association failed\"))"},{"line_number":664,"context_line":"            raise"},{"line_number":665,"context_line":"        router_id \u003d floatingip_db[\u0027router_id\u0027]"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOH%2F%2F7iQ%3D","line":662,"updated":"2013-03-20 15:34:24.000000000","message":"ditto","commit_id":"dc1e5f5a42b941fcb5d808b21834f8a22f55002c"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":641,"context_line":"                                   floatingip_db, external_port)"},{"line_number":642,"context_line":"            context.session.add(floatingip_db)"},{"line_number":643,"context_line":"        # TODO(salvatore-orlando): Avoid broad catch"},{"line_number":644,"context_line":"        # Maybe by introducing base class for L3 exceptions"},{"line_number":645,"context_line":""},{"line_number":646,"context_line":"        router_id \u003d floatingip_db[\u0027router_id\u0027]"},{"line_number":647,"context_line":"        if router_id:"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F5k8%3D","line":644,"updated":"2013-04-12 12:21:02.000000000","message":"You can remove this comment now.","commit_id":"4e5b1e00a51db6e2aaf06563f2c5f72fdfcb4303"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":648,"context_line":"        except q_exc.BadRequest:"},{"line_number":649,"context_line":"            LOG.exception(_(\"Unable to create Floating ip due to a \""},{"line_number":650,"context_line":"                            \"malformed request\"))"},{"line_number":651,"context_line":"            raise"},{"line_number":652,"context_line":"        except Exception:"},{"line_number":653,"context_line":"            LOG.exception(_(\"Floating IP association failed\"))"},{"line_number":654,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F0fM%3D","side":"PARENT","line":651,"updated":"2013-04-21 23:45:16.000000000","message":"It\u0027s ok to remove this - we added it because of the generic catch below","commit_id":"6bbcc3848f01abbf1a68f65a09e1d2e6c7df7dc3"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":648,"context_line":"        except q_exc.BadRequest:"},{"line_number":649,"context_line":"            LOG.exception(_(\"Unable to create Floating ip due to a \""},{"line_number":650,"context_line":"                            \"malformed request\"))"},{"line_number":651,"context_line":"            raise"},{"line_number":652,"context_line":"        except Exception:"},{"line_number":653,"context_line":"            LOG.exception(_(\"Floating IP association failed\"))"},{"line_number":654,"context_line":"            raise"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FvyA%3D","side":"PARENT","line":651,"in_reply_to":"AAAAOn%2F%2F0fM%3D","updated":"2013-04-25 00:46:35.000000000","message":"Done","commit_id":"6bbcc3848f01abbf1a68f65a09e1d2e6c7df7dc3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":651,"context_line":"            raise"},{"line_number":652,"context_line":"        except Exception:"},{"line_number":653,"context_line":"            LOG.exception(_(\"Floating IP association failed\"))"},{"line_number":654,"context_line":"            raise"},{"line_number":655,"context_line":"        router_id \u003d floatingip_db[\u0027router_id\u0027]"},{"line_number":656,"context_line":"        if router_id:"},{"line_number":657,"context_line":"            routers \u003d self.get_sync_data(context.elevated(), [router_id])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F0fI%3D","side":"PARENT","line":654,"updated":"2013-04-21 23:45:16.000000000","message":"Looking at the rest of the code it might make sense removing this catch as well.","commit_id":"6bbcc3848f01abbf1a68f65a09e1d2e6c7df7dc3"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":651,"context_line":"            raise"},{"line_number":652,"context_line":"        except Exception:"},{"line_number":653,"context_line":"            LOG.exception(_(\"Floating IP association failed\"))"},{"line_number":654,"context_line":"            raise"},{"line_number":655,"context_line":"        router_id \u003d floatingip_db[\u0027router_id\u0027]"},{"line_number":656,"context_line":"        if router_id:"},{"line_number":657,"context_line":"            routers \u003d self.get_sync_data(context.elevated(), [router_id])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2Fvx8%3D","side":"PARENT","line":654,"in_reply_to":"AAAAOn%2F%2F0fI%3D","updated":"2013-04-25 00:46:35.000000000","message":"Done","commit_id":"6bbcc3848f01abbf1a68f65a09e1d2e6c7df7dc3"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":624,"context_line":"                 \u0027name\u0027: \u0027\u0027}})"},{"line_number":625,"context_line":"            # Ensure IP addresses are allocated on external port"},{"line_number":626,"context_line":"            if not external_port[\u0027fixed_ips\u0027]:"},{"line_number":627,"context_line":"                raise q_exc.InvalidExternalNetwork()"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"            floating_fixed_ip \u003d external_port[\u0027fixed_ips\u0027][0]"},{"line_number":630,"context_line":"            floating_ip_address \u003d floating_fixed_ip[\u0027ip_address\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F0fA%3D","line":627,"updated":"2013-04-21 23:45:16.000000000","message":"This will currently cause a 500 where a 400 was originally returned, thus causing a backward incompatible change","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":624,"context_line":"                 \u0027name\u0027: \u0027\u0027}})"},{"line_number":625,"context_line":"            # Ensure IP addresses are allocated on external port"},{"line_number":626,"context_line":"            if not external_port[\u0027fixed_ips\u0027]:"},{"line_number":627,"context_line":"                raise q_exc.InvalidExternalNetwork()"},{"line_number":628,"context_line":""},{"line_number":629,"context_line":"            floating_fixed_ip \u003d external_port[\u0027fixed_ips\u0027][0]"},{"line_number":630,"context_line":"            floating_ip_address \u003d floating_fixed_ip[\u0027ip_address\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FvyE%3D","line":627,"in_reply_to":"AAAAOn%2F%2F0fA%3D","updated":"2013-04-25 00:46:35.000000000","message":"Done","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":639,"context_line":"                 \u0027name\u0027: \u0027\u0027}})"},{"line_number":640,"context_line":"            # Ensure IP addresses are allocated on external port"},{"line_number":641,"context_line":"            if not external_port[\u0027fixed_ips\u0027]:"},{"line_number":642,"context_line":"                raise q_exc.ExternalIpAddressGenerationFailure(net_id\u003df_net_id)"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"            floating_fixed_ip \u003d external_port[\u0027fixed_ips\u0027][0]"},{"line_number":645,"context_line":"            floating_ip_address \u003d floating_fixed_ip[\u0027ip_address\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2Fllk%3D","line":642,"updated":"2013-05-02 19:27:12.000000000","message":"Not sure I understand why we need an new exception here.  Seems like IpAddressGenerationFailure() works here.","commit_id":"71ba8e4be3d20f9c4a16d6b17a37869f3d151eeb"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":639,"context_line":"                 \u0027name\u0027: \u0027\u0027}})"},{"line_number":640,"context_line":"            # Ensure IP addresses are allocated on external port"},{"line_number":641,"context_line":"            if not external_port[\u0027fixed_ips\u0027]:"},{"line_number":642,"context_line":"                raise q_exc.ExternalIpAddressGenerationFailure(net_id\u003df_net_id)"},{"line_number":643,"context_line":""},{"line_number":644,"context_line":"            floating_fixed_ip \u003d external_port[\u0027fixed_ips\u0027][0]"},{"line_number":645,"context_line":"            floating_ip_address \u003d floating_fixed_ip[\u0027ip_address\u0027]"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2Fie8%3D","line":642,"in_reply_to":"AAAAOn%2F%2Fllk%3D","updated":"2013-05-06 12:27:08.000000000","message":"IPAddressGenerationFailure is a child of exception type Conflict.\nThis exception should be a child of BadRequest so it won\u0027t change the\nexisting return type.","commit_id":"71ba8e4be3d20f9c4a16d6b17a37869f3d151eeb"}],"quantum/tests/unit/test_l3_plugin.py":[{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5cd9c463785df3e87b8344bc0834bfe2b95fd376","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"                    found \u003d True"},{"line_number":1251,"context_line":"        self.assertTrue(found)"},{"line_number":1252,"context_line":""},{"line_number":1253,"context_line":"    def test_subnet_with_invalid_allocation_range(self):"},{"line_number":1254,"context_line":"        with self.port() as p:"},{"line_number":1255,"context_line":"            private_sub \u003d {\u0027subnet\u0027: {\u0027id\u0027:"},{"line_number":1256,"context_line":"                                      p[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027subnet_id\u0027]}}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F3IU%3D","line":1253,"updated":"2013-03-08 14:22:16.000000000","message":"Where\u0027s the assertion for this test case (should it be testing for exception being raised)?\n\nShould there be two test cases, one for each new exception defined?\n\nThe cleanup should be in the test case teardown method, in case there is a failure in the middle of the test case.","commit_id":"1179a2a94f3a1fddc0c9f1f9e6a5db418ceef917"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"change_message_id":"5cd9c463785df3e87b8344bc0834bfe2b95fd376","unresolved":false,"context_lines":[{"line_number":1250,"context_line":"                    found \u003d True"},{"line_number":1251,"context_line":"        self.assertTrue(found)"},{"line_number":1252,"context_line":""},{"line_number":1253,"context_line":"    def test_subnet_with_invalid_allocation_range(self):"},{"line_number":1254,"context_line":"        with self.port() as p:"},{"line_number":1255,"context_line":"            private_sub \u003d {\u0027subnet\u0027: {\u0027id\u0027:"},{"line_number":1256,"context_line":"                                      p[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027subnet_id\u0027]}}"}],"source_content_type":"text/x-python","patch_set":1,"id":"AAAAN3%2F%2F2cE%3D","line":1253,"in_reply_to":"AAAAN3%2F%2F3IU%3D","updated":"2013-03-08 21:06:30.000000000","message":"Looked closer and it looks like the cleanup is fine.\n\nThe exceptions appears to be converted to an error code in these tests, so you should be testing for the error at the appropriate place (_create_floatingip?). \n\nI\u0027m not sure if you can test both exceptions cases (may not be easy to inject an error to cause both exceptions).","commit_id":"1179a2a94f3a1fddc0c9f1f9e6a5db418ceef917"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":1233,"context_line":"                    found \u003d True"},{"line_number":1234,"context_line":"        self.assertTrue(found)"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"    def test_subnet_with_invalid_allocation_range(self):"},{"line_number":1237,"context_line":"        with self.port() as p:"},{"line_number":1238,"context_line":"            private_sub \u003d {\u0027subnet\u0027: {\u0027id\u0027:"},{"line_number":1239,"context_line":"                                      p[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027subnet_id\u0027]}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2FtbA%3D","line":1236,"updated":"2013-03-15 17:44:42.000000000","message":"Consider changing the name of this test.  The range you are defining it valid, but can be exhausted easily.\n\nmaybe test_create_floating_ip_fails_due_to_pool_exhaustion() ?","commit_id":"dc1e5f5a42b941fcb5d808b21834f8a22f55002c"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1233,"context_line":"                    found \u003d True"},{"line_number":1234,"context_line":"        self.assertTrue(found)"},{"line_number":1235,"context_line":""},{"line_number":1236,"context_line":"    def test_subnet_with_invalid_allocation_range(self):"},{"line_number":1237,"context_line":"        with self.port() as p:"},{"line_number":1238,"context_line":"            private_sub \u003d {\u0027subnet\u0027: {\u0027id\u0027:"},{"line_number":1239,"context_line":"                                      p[\u0027port\u0027][\u0027fixed_ips\u0027][0][\u0027subnet_id\u0027]}}"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOH%2F%2F7rk%3D","line":1236,"in_reply_to":"AAAAN3%2F%2FtbA%3D","updated":"2013-03-20 14:10:28.000000000","message":"Done","commit_id":"dc1e5f5a42b941fcb5d808b21834f8a22f55002c"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":1243,"context_line":"                                                \u0027end\u0027: \u002712.0.0.3\u0027}]"},{"line_number":1244,"context_line":"                             ) as public_sub:"},{"line_number":1245,"context_line":"                self._set_net_external(public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":1246,"context_line":"                res \u003d self._create_router(self.fmt, _uuid())"},{"line_number":1247,"context_line":"                r \u003d self.deserialize(self.fmt, res)"},{"line_number":1248,"context_line":"                self._add_external_gateway_to_router("},{"line_number":1249,"context_line":"                    r[\u0027router\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAN3%2F%2FtaE%3D","line":1246,"updated":"2013-03-15 17:44:42.000000000","message":"You should use a context manager to create the first floating IP.  It will manage most of this for you.\n\nwith self.floatingip_with_assoc() as floating:","commit_id":"dc1e5f5a42b941fcb5d808b21834f8a22f55002c"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1243,"context_line":"                                                \u0027end\u0027: \u002712.0.0.3\u0027}]"},{"line_number":1244,"context_line":"                             ) as public_sub:"},{"line_number":1245,"context_line":"                self._set_net_external(public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":1246,"context_line":"                res \u003d self._create_router(self.fmt, _uuid())"},{"line_number":1247,"context_line":"                r \u003d self.deserialize(self.fmt, res)"},{"line_number":1248,"context_line":"                self._add_external_gateway_to_router("},{"line_number":1249,"context_line":"                    r[\u0027router\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOH%2F%2F7q8%3D","line":1246,"in_reply_to":"AAAAN3%2F%2FtaE%3D","updated":"2013-03-20 14:10:28.000000000","message":"Using the context manager, floatingip_with_assoc() will create it\u0027s own \nsubnet with a big allocation pool. The idea was to create a small allocation pool that could be used up quickly.","commit_id":"dc1e5f5a42b941fcb5d808b21834f8a22f55002c"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":1243,"context_line":"                                                \u0027end\u0027: \u002712.0.0.3\u0027}]"},{"line_number":1244,"context_line":"                             ) as public_sub:"},{"line_number":1245,"context_line":"                self._set_net_external(public_sub[\u0027subnet\u0027][\u0027network_id\u0027])"},{"line_number":1246,"context_line":"                res \u003d self._create_router(self.fmt, _uuid())"},{"line_number":1247,"context_line":"                r \u003d self.deserialize(self.fmt, res)"},{"line_number":1248,"context_line":"                self._add_external_gateway_to_router("},{"line_number":1249,"context_line":"                    r[\u0027router\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAAOH%2F%2F2%2Bc%3D","line":1246,"in_reply_to":"AAAAOH%2F%2F7q8%3D","updated":"2013-03-23 17:25:25.000000000","message":"You could extend floatingip_with_assoc() to accept a custom allocation_pool, defaulting to none for backwards compatibility.","commit_id":"dc1e5f5a42b941fcb5d808b21834f8a22f55002c"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":1168,"context_line":""},{"line_number":1169,"context_line":"                        pl.side_effect \u003d q_exc.IpAddressGenerationFailure("},{"line_number":1170,"context_line":"                            net_id\u003d\u0027netid\u0027)"},{"line_number":1171,"context_line":""},{"line_number":1172,"context_line":"                        res \u003d self._create_floatingip("},{"line_number":1173,"context_line":"                            self.fmt,"},{"line_number":1174,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F5ks%3D","line":1171,"updated":"2013-04-12 12:21:02.000000000","message":"Delete this blank line.","commit_id":"4e5b1e00a51db6e2aaf06563f2c5f72fdfcb4303"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                    res \u003d self._create_floatingip("},{"line_number":1279,"context_line":"                        self.fmt, public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1280,"context_line":"                        port_id\u003dp[\u0027port\u0027][\u0027id\u0027])"},{"line_number":1281,"context_line":""},{"line_number":1282,"context_line":"                    self.assertEqual(res.status_int, exc.HTTPServerError.code)"},{"line_number":1283,"context_line":""},{"line_number":1284,"context_line":"                    self._router_interface_action(\u0027remove\u0027, r[\u0027router\u0027][\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAAOn%2F%2F5kk%3D","line":1281,"updated":"2013-04-12 12:21:02.000000000","message":"Delete this blank line.","commit_id":"4e5b1e00a51db6e2aaf06563f2c5f72fdfcb4303"},{"author":{"_account_id":6695,"name":"Dane LeBlanc","email":"leblancd@cisco.com","username":"leblancd"},"unresolved":false,"context_lines":[{"line_number":1273,"context_line":"                    None)"},{"line_number":1274,"context_line":""},{"line_number":1275,"context_line":"                with mock.patch.object(plugin_class,"},{"line_number":1276,"context_line":"                                       \u0027create_port\u0027, new\u003dnew_create_port):"},{"line_number":1277,"context_line":"                    res \u003d self._create_floatingip("},{"line_number":1278,"context_line":"                        self.fmt, public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1279,"context_line":"                        port_id\u003dp[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FwXs%3D","line":1276,"updated":"2013-04-24 18:06:38.000000000","message":"As we discussed in a debug session, the nicira and bigswitch plugins wrap their create_port method around the generic create_port method which you\u0027re mocking here (their methods call the super). Also, their unit tests are calling your new test case, but within the context of their plugins (since their test class is a child of this test class to which you\u0027re adding). So for example, with the nicira plugin, the method nesting for your test case would be:\n    create_floatingip()\n        create_port()    \u003c- - - Nicira plugin\n            create_port()    \u003c - - - Generic plugin\nApparently, it\u0027s possible/normal for the nicira plugin\u0027s create_port designed to get returned an empty list from the generic create_port in other scenarios, so we can\u0027t easily (or want to) change that plugin to get your test case working when called within the context of the nicira (or bigswitch) plugin.\nThe cleanest solution for this specific test would be to add mocks for the three versions of create_port: generic plugin, nicira plugin, and bigswitch plugin, whereby all mocks return an empty list. That way, the test case will work independently of the plugin context in which it is being called.","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"                    None)"},{"line_number":1274,"context_line":""},{"line_number":1275,"context_line":"                with mock.patch.object(plugin_class,"},{"line_number":1276,"context_line":"                                       \u0027create_port\u0027, new\u003dnew_create_port):"},{"line_number":1277,"context_line":"                    res \u003d self._create_floatingip("},{"line_number":1278,"context_line":"                        self.fmt, public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1279,"context_line":"                        port_id\u003dp[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FvyQ%3D","line":1276,"in_reply_to":"AAAAOn%2F%2FwXs%3D","updated":"2013-04-25 00:46:35.000000000","message":"Done","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                        self.fmt, public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1279,"context_line":"                        port_id\u003dp[\u0027port\u0027][\u0027id\u0027])"},{"line_number":1280,"context_line":""},{"line_number":1281,"context_line":"                    self.assertEqual(res.status_int, exc.HTTPServerError.code)"},{"line_number":1282,"context_line":"                    self._router_interface_action(\u0027remove\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":1283,"context_line":"                                                  private_sub[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":1284,"context_line":"                                                  None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F0e0%3D","line":1281,"updated":"2013-04-21 23:45:16.000000000","message":"Previously the API returned BadRequest...","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1278,"context_line":"                        self.fmt, public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1279,"context_line":"                        port_id\u003dp[\u0027port\u0027][\u0027id\u0027])"},{"line_number":1280,"context_line":""},{"line_number":1281,"context_line":"                    self.assertEqual(res.status_int, exc.HTTPServerError.code)"},{"line_number":1282,"context_line":"                    self._router_interface_action(\u0027remove\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":1283,"context_line":"                                                  private_sub[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":1284,"context_line":"                                                  None)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FvyM%3D","line":1281,"in_reply_to":"AAAAOn%2F%2F0e0%3D","updated":"2013-04-25 00:46:35.000000000","message":"Done","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"unresolved":false,"context_lines":[{"line_number":1284,"context_line":"                                                  None)"},{"line_number":1285,"context_line":"                    self._delete(\u0027routers\u0027, r[\u0027router\u0027][\u0027id\u0027])"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":"    def test_subnet_with_invalid_create_port(self):"},{"line_number":1288,"context_line":"        self._test_subnet_with_invalid_create_port("},{"line_number":1289,"context_line":"            db_base_plugin_v2.QuantumDbPluginV2)"},{"line_number":1290,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2F0a8%3D","line":1287,"updated":"2013-04-22 02:01:57.000000000","message":"Why need this wrap? \u0027_test_subnet_with_invalid_create_port\u0027 only be invoked one times.\n\nAnd how about change the name to \u0027test_floatingip....\u0027, a little strange for puting a test_subnet... at here.","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1284,"context_line":"                                                  None)"},{"line_number":1285,"context_line":"                    self._delete(\u0027routers\u0027, r[\u0027router\u0027][\u0027id\u0027])"},{"line_number":1286,"context_line":""},{"line_number":1287,"context_line":"    def test_subnet_with_invalid_create_port(self):"},{"line_number":1288,"context_line":"        self._test_subnet_with_invalid_create_port("},{"line_number":1289,"context_line":"            db_base_plugin_v2.QuantumDbPluginV2)"},{"line_number":1290,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAAOn%2F%2FvyU%3D","line":1287,"in_reply_to":"AAAAOn%2F%2F0a8%3D","updated":"2013-04-25 00:46:35.000000000","message":"Done","commit_id":"551dea96c917f006676f9e49d0f026e902485151"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":50,"context_line":"from quantum.tests.unit import test_extensions"},{"line_number":51,"context_line":"from quantum.tests.unit import testlib_api"},{"line_number":52,"context_line":"from quantum.plugins.nicira import QuantumPlugin"},{"line_number":53,"context_line":"from quantum.plugins.bigswitch import plugin"},{"line_number":54,"context_line":"from contextlib import nested"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FuqY%3D","line":53,"updated":"2013-04-25 20:57:09.000000000","message":"You can make the test code below a little easier to understand by doing:\n\n  from quantum.plugins.nicira import QuantumPlugin as NiciraPlugin\n  from quantum.plugins.bigswitch import plugin as BigswitchPlugin\n\nAlso, imports should done in alphabetical order for pep8.","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":50,"context_line":"from quantum.tests.unit import test_extensions"},{"line_number":51,"context_line":"from quantum.tests.unit import testlib_api"},{"line_number":52,"context_line":"from quantum.plugins.nicira import QuantumPlugin"},{"line_number":53,"context_line":"from quantum.plugins.bigswitch import plugin"},{"line_number":54,"context_line":"from contextlib import nested"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fnf4%3D","line":53,"in_reply_to":"AAAAOn%2F%2Ft5c%3D","updated":"2013-05-01 18:24:23.000000000","message":"Done","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":50,"context_line":"from quantum.tests.unit import test_extensions"},{"line_number":51,"context_line":"from quantum.tests.unit import testlib_api"},{"line_number":52,"context_line":"from quantum.plugins.nicira import QuantumPlugin"},{"line_number":53,"context_line":"from quantum.plugins.bigswitch import plugin"},{"line_number":54,"context_line":"from contextlib import nested"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fnf8%3D","line":53,"in_reply_to":"AAAAOn%2F%2FuqY%3D","updated":"2013-05-01 18:24:23.000000000","message":"Done","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":5948,"name":"Oleg Bondarev","email":"obondarev@mirantis.com","username":"obondarev"},"unresolved":false,"context_lines":[{"line_number":50,"context_line":"from quantum.tests.unit import test_extensions"},{"line_number":51,"context_line":"from quantum.tests.unit import testlib_api"},{"line_number":52,"context_line":"from quantum.plugins.nicira import QuantumPlugin"},{"line_number":53,"context_line":"from quantum.plugins.bigswitch import plugin"},{"line_number":54,"context_line":"from contextlib import nested"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Ft5c%3D","line":53,"in_reply_to":"AAAAOn%2F%2FuqY%3D","updated":"2013-04-26 13:09:37.000000000","message":"I think module level imports are preferable:\n\n    from quantum.plugins import nicira\n    from quantum.plugins.bigswitch import plugin as bigswitch_plugin","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":490,"name":"Sumit Naiksatam","email":"sumitnaiksatam@gmail.com","username":"snaiksat"},"unresolved":false,"context_lines":[{"line_number":51,"context_line":"from quantum.tests.unit import testlib_api"},{"line_number":52,"context_line":"from quantum.plugins.nicira import QuantumPlugin"},{"line_number":53,"context_line":"from quantum.plugins.bigswitch import plugin"},{"line_number":54,"context_line":"from contextlib import nested"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2FuX4%3D","line":54,"updated":"2013-04-26 01:43:51.000000000","message":"nit: please fix the order of imports","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":51,"context_line":"from quantum.tests.unit import testlib_api"},{"line_number":52,"context_line":"from quantum.plugins.nicira import QuantumPlugin"},{"line_number":53,"context_line":"from quantum.plugins.bigswitch import plugin"},{"line_number":54,"context_line":"from contextlib import nested"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"LOG \u003d logging.getLogger(__name__)"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fnfk%3D","line":54,"in_reply_to":"AAAAOn%2F%2FuX4%3D","updated":"2013-05-01 18:24:23.000000000","message":"Done","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":1273,"context_line":"                    \u0027add\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":1274,"context_line":"                    private_sub[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":1275,"context_line":"                    None)"},{"line_number":1276,"context_line":"                with nested("},{"line_number":1277,"context_line":"                    mock.patch.object(db_base_plugin_v2.QuantumDbPluginV2,"},{"line_number":1278,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port),"},{"line_number":1279,"context_line":"                    mock.patch.object(QuantumPlugin.NvpPluginV2,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fup0%3D","line":1276,"updated":"2013-04-25 20:57:09.000000000","message":"It would be nice to have Dane\u0027s nice analysis/comment from patch 5 inserted here as a python comment to explain why these things need to be mocked.","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"                    \u0027add\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":1274,"context_line":"                    private_sub[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":1275,"context_line":"                    None)"},{"line_number":1276,"context_line":"                with nested("},{"line_number":1277,"context_line":"                    mock.patch.object(db_base_plugin_v2.QuantumDbPluginV2,"},{"line_number":1278,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port),"},{"line_number":1279,"context_line":"                    mock.patch.object(QuantumPlugin.NvpPluginV2,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fnfw%3D","line":1276,"in_reply_to":"AAAAOn%2F%2Ft6c%3D","updated":"2013-05-01 18:24:23.000000000","message":"Will open bugs for these two components","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"                    \u0027add\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":1274,"context_line":"                    private_sub[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":1275,"context_line":"                    None)"},{"line_number":1276,"context_line":"                with nested("},{"line_number":1277,"context_line":"                    mock.patch.object(db_base_plugin_v2.QuantumDbPluginV2,"},{"line_number":1278,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port),"},{"line_number":1279,"context_line":"                    mock.patch.object(QuantumPlugin.NvpPluginV2,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Fnf0%3D","line":1276,"in_reply_to":"AAAAOn%2F%2Fup0%3D","updated":"2013-05-01 18:24:23.000000000","message":"Done","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":6659,"name":"Paul Michali","email":"pc@michali.net","username":"pcm"},"unresolved":false,"context_lines":[{"line_number":1273,"context_line":"                    \u0027add\u0027, r[\u0027router\u0027][\u0027id\u0027],"},{"line_number":1274,"context_line":"                    private_sub[\u0027subnet\u0027][\u0027id\u0027],"},{"line_number":1275,"context_line":"                    None)"},{"line_number":1276,"context_line":"                with nested("},{"line_number":1277,"context_line":"                    mock.patch.object(db_base_plugin_v2.QuantumDbPluginV2,"},{"line_number":1278,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port),"},{"line_number":1279,"context_line":"                    mock.patch.object(QuantumPlugin.NvpPluginV2,"}],"source_content_type":"text/x-python","patch_set":5,"id":"AAAAOn%2F%2Ft6c%3D","line":1276,"in_reply_to":"AAAAOn%2F%2Fup0%3D","updated":"2013-04-26 12:54:53.000000000","message":"Should indicate that these patches are temporary, until the various plugins are updated to correctly handle the case of a failed base plugin call to create_port. Also should create bugs for the two plugins to address this, but letting the failure flow up, instead of suppressing.","commit_id":"5a485d1decdd215fb7e4a9a11b7c0abf68678699"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":28,"context_line":"from webob import exc"},{"line_number":29,"context_line":"import webtest"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"from contextlib import nested"},{"line_number":32,"context_line":"from quantum.api import extensions"},{"line_number":33,"context_line":"from quantum.api.rpc.agentnotifiers import l3_rpc_agent_api"},{"line_number":34,"context_line":"from quantum.api.v2 import attributes"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FnWg%3D","line":31,"updated":"2013-05-01 19:36:20.000000000","message":"Not needed, contextlib is already import on line 21.","commit_id":"7979083d76e56df33546468985665fbda514a60a"},{"author":{"_account_id":6524,"name":"Henry Gessau","email":"HenryG@gessau.net","username":"gessau"},"unresolved":false,"context_lines":[{"line_number":1280,"context_line":"                # create_port returns an empty list and in other scenarios,"},{"line_number":1281,"context_line":"                # and with that change, these mocks of the Bigswitch and Nicira"},{"line_number":1282,"context_line":"                # pluginscould be removed."},{"line_number":1283,"context_line":"                with nested("},{"line_number":1284,"context_line":"                    mock.patch.object(db_base_plugin_v2.QuantumDbPluginV2,"},{"line_number":1285,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port),"},{"line_number":1286,"context_line":"                    mock.patch.object(NiciraPlugin.NvpPluginV2,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAAOn%2F%2FnWY%3D","line":1283,"updated":"2013-05-01 19:36:20.000000000","message":"with contextlib.nested(","commit_id":"7979083d76e56df33546468985665fbda514a60a"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":45,"context_line":"from quantum.openstack.common.notifier import api as notifier_api"},{"line_number":46,"context_line":"from quantum.openstack.common.notifier import test_notifier"},{"line_number":47,"context_line":"from quantum.openstack.common import uuidutils"},{"line_number":48,"context_line":"from quantum.plugins.bigswitch import plugin as BigswitchPlugin"},{"line_number":49,"context_line":"from quantum.plugins.nicira import QuantumPlugin as NiciraPlugin"},{"line_number":50,"context_line":"from quantum.tests.unit import test_api_v2"},{"line_number":51,"context_line":"from quantum.tests.unit import test_db_plugin"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FllQ%3D","line":48,"updated":"2013-05-02 19:27:12.000000000","message":"This module should be plugin agnostic.  Tests specific to plugins belong in the respective plugin test suite.","commit_id":"71ba8e4be3d20f9c4a16d6b17a37869f3d151eeb"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":45,"context_line":"from quantum.openstack.common.notifier import api as notifier_api"},{"line_number":46,"context_line":"from quantum.openstack.common.notifier import test_notifier"},{"line_number":47,"context_line":"from quantum.openstack.common import uuidutils"},{"line_number":48,"context_line":"from quantum.plugins.bigswitch import plugin as BigswitchPlugin"},{"line_number":49,"context_line":"from quantum.plugins.nicira import QuantumPlugin as NiciraPlugin"},{"line_number":50,"context_line":"from quantum.tests.unit import test_api_v2"},{"line_number":51,"context_line":"from quantum.tests.unit import test_db_plugin"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2Fffo%3D","line":48,"in_reply_to":"AAAAOn%2F%2Fieg%3D","updated":"2013-05-07 23:33:47.000000000","message":"So, do you see an issue with bigswitch and nicira plugins wrapping get_port?","commit_id":"71ba8e4be3d20f9c4a16d6b17a37869f3d151eeb"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":45,"context_line":"from quantum.openstack.common.notifier import api as notifier_api"},{"line_number":46,"context_line":"from quantum.openstack.common.notifier import test_notifier"},{"line_number":47,"context_line":"from quantum.openstack.common import uuidutils"},{"line_number":48,"context_line":"from quantum.plugins.bigswitch import plugin as BigswitchPlugin"},{"line_number":49,"context_line":"from quantum.plugins.nicira import QuantumPlugin as NiciraPlugin"},{"line_number":50,"context_line":"from quantum.tests.unit import test_api_v2"},{"line_number":51,"context_line":"from quantum.tests.unit import test_db_plugin"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2Fieg%3D","line":48,"in_reply_to":"AAAAOn%2F%2FllQ%3D","updated":"2013-05-06 12:27:08.000000000","message":"The reason for these includes is due to having to mock the functions for bigswitch and Nicira, see the comments in test_floatingip_with_invalid_create_port below. Bugs will be opened to fix the issues in bigswitch and nicira, and with the fix, these includes will be removed.","commit_id":"71ba8e4be3d20f9c4a16d6b17a37869f3d151eeb"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":1191,"context_line":"                            self.fmt,"},{"line_number":1192,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1193,"context_line":"                            port_id\u003dprivate_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":1194,"context_line":"                        self.assertEqual(res.status_int, exc.HTTPConflict.code)"},{"line_number":1195,"context_line":""},{"line_number":1196,"context_line":"                    for p in self._list(\u0027ports\u0027)[\u0027ports\u0027]:"},{"line_number":1197,"context_line":"                        if p[\u0027device_owner\u0027] \u003d\u003d \u0027network:floatingip\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FfgE%3D","line":1194,"updated":"2013-05-07 23:33:47.000000000","message":"This should probably go into its own unit test","commit_id":"71ba8e4be3d20f9c4a16d6b17a37869f3d151eeb"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1191,"context_line":"                            self.fmt,"},{"line_number":1192,"context_line":"                            public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1193,"context_line":"                            port_id\u003dprivate_port[\u0027port\u0027][\u0027id\u0027])"},{"line_number":1194,"context_line":"                        self.assertEqual(res.status_int, exc.HTTPConflict.code)"},{"line_number":1195,"context_line":""},{"line_number":1196,"context_line":"                    for p in self._list(\u0027ports\u0027)[\u0027ports\u0027]:"},{"line_number":1197,"context_line":"                        if p[\u0027device_owner\u0027] \u003d\u003d \u0027network:floatingip\u0027:"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVFQ%3D","line":1194,"in_reply_to":"AAAAOn%2F%2FfgE%3D","updated":"2013-05-14 14:25:22.000000000","message":"Done","commit_id":"71ba8e4be3d20f9c4a16d6b17a37869f3d151eeb"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"unresolved":false,"context_lines":[{"line_number":1302,"context_line":"                    mock.patch.object(NiciraPlugin.NvpPluginV2,"},{"line_number":1303,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port),"},{"line_number":1304,"context_line":"                    mock.patch.object(BigswitchPlugin.QuantumRestProxyV2,"},{"line_number":1305,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port)):"},{"line_number":1306,"context_line":"                        res \u003d self._create_floatingip("},{"line_number":1307,"context_line":"                            self.fmt, public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1308,"context_line":"                            port_id\u003dp[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2Fffw%3D","line":1305,"updated":"2013-05-07 23:33:47.000000000","message":"I think you can use the same approach as https://github.com/openstack/quantum/blob/master/quantum/tests/unit/test_l3_plugin.py#L1162 and avoid the import.\n\nI am not sure of that, I will confirm later on.","commit_id":"71ba8e4be3d20f9c4a16d6b17a37869f3d151eeb"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1302,"context_line":"                    mock.patch.object(NiciraPlugin.NvpPluginV2,"},{"line_number":1303,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port),"},{"line_number":1304,"context_line":"                    mock.patch.object(BigswitchPlugin.QuantumRestProxyV2,"},{"line_number":1305,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port)):"},{"line_number":1306,"context_line":"                        res \u003d self._create_floatingip("},{"line_number":1307,"context_line":"                            self.fmt, public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1308,"context_line":"                            port_id\u003dp[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":7,"id":"AAAAOn%2F%2FVFM%3D","line":1305,"in_reply_to":"AAAAOn%2F%2Fffw%3D","updated":"2013-05-14 14:25:22.000000000","message":"Done","commit_id":"71ba8e4be3d20f9c4a16d6b17a37869f3d151eeb"},{"author":{"_account_id":2592,"name":"Mark McClain","email":"mark@mcclain.xyz","username":"markmcclain"},"unresolved":false,"context_lines":[{"line_number":1319,"context_line":"                    None)"},{"line_number":1320,"context_line":"                with contextlib.nested("},{"line_number":1321,"context_line":"                    mock.patch.object(plugin_class,"},{"line_number":1322,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port)):"},{"line_number":1323,"context_line":"                        res \u003d self._create_floatingip("},{"line_number":1324,"context_line":"                            self.fmt, public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1325,"context_line":"                            port_id\u003dp[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPH%2F%2FwH8%3D","line":1322,"updated":"2013-05-23 20:39:27.000000000","message":"nothing is nested here, so consider and drop 1302-4.\n\nwith mock.patch.object(plugin_class, \u0027create_port\u0027) as create_port:\n    create_port.return_value \u003d {\u0027fixed_ips\u0027: []}","commit_id":"25586aa685b00d29c1167cb8bca7a97007c313da"},{"author":{"_account_id":6698,"name":"Robert Pothier","email":"robpothier35@gmail.com","username":"rpothier"},"change_message_id":"5211d65b1d326e3f74a1656e8c71940ac794bfc5","unresolved":false,"context_lines":[{"line_number":1319,"context_line":"                    None)"},{"line_number":1320,"context_line":"                with contextlib.nested("},{"line_number":1321,"context_line":"                    mock.patch.object(plugin_class,"},{"line_number":1322,"context_line":"                                      \u0027create_port\u0027, new\u003dnew_create_port)):"},{"line_number":1323,"context_line":"                        res \u003d self._create_floatingip("},{"line_number":1324,"context_line":"                            self.fmt, public_sub[\u0027subnet\u0027][\u0027network_id\u0027],"},{"line_number":1325,"context_line":"                            port_id\u003dp[\u0027port\u0027][\u0027id\u0027])"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAAPH%2F%2FufA%3D","line":1322,"in_reply_to":"AAAAPH%2F%2FwH8%3D","updated":"2013-05-24 11:43:24.000000000","message":"Done","commit_id":"25586aa685b00d29c1167cb8bca7a97007c313da"}]}
