)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"abf07a27730bd7afdd8e0d024be9ea19ce5a291a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Retrieve quota and usage values from neutron"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"On a system configured to use Quantum, we should retrieve"},{"line_number":10,"context_line":"quota and usage of for floating ips and security groups,"},{"line_number":11,"context_line":"rather than Nova DB."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAASn%2F%2F9e4%3D","line":9,"updated":"2013-08-27 14:46:44.000000000","message":"s/Quantum/Neutron","commit_id":"eb3f7ae22f5f7ad4a07c77cba335d25b80721989"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"abf07a27730bd7afdd8e0d024be9ea19ce5a291a","unresolved":false,"context_lines":[{"line_number":7,"context_line":"Retrieve quota and usage values from neutron"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"On a system configured to use Quantum, we should retrieve"},{"line_number":10,"context_line":"quota and usage of for floating ips and security groups,"},{"line_number":11,"context_line":"rather than Nova DB."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I53fbeb165fb22d65f16af011e0a6c602944a1730"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAASn%2F%2F9ec%3D","line":10,"updated":"2013-08-27 14:46:44.000000000","message":"This line needs some cleaning up...","commit_id":"eb3f7ae22f5f7ad4a07c77cba335d25b80721989"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"abf07a27730bd7afdd8e0d024be9ea19ce5a291a","unresolved":false,"context_lines":[{"line_number":11,"context_line":"rather than Nova DB."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I53fbeb165fb22d65f16af011e0a6c602944a1730"},{"line_number":14,"context_line":"Fixes: bug #1186354"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"AAAASn%2F%2F9fE%3D","line":14,"updated":"2013-08-27 14:46:44.000000000","message":"The bug line should go above the change-id.\n\nhttps://wiki.openstack.org/wiki/GitCommitMessages","commit_id":"eb3f7ae22f5f7ad4a07c77cba335d25b80721989"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d83972619dd78ec78949c615720d5d16b967ed26","unresolved":false,"context_lines":[{"line_number":10,"context_line":"we should retrieve quota and usage for floating ips"},{"line_number":11,"context_line":"and security groups from neutron, rather than Nova DB."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"We do this just in v2 API, as Phil said, Leaving the"},{"line_number":14,"context_line":"limits code broke in V2 when working with Neutron seems"},{"line_number":15,"context_line":"the wrong choice. In v3 API, we should get better separation"},{"line_number":16,"context_line":"between Nova and Neutron."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":19,"id":"AAAATH%2F%2FPhw%3D","line":13,"updated":"2013-10-19 17:38:02.000000000","message":":)","commit_id":"4ec38c3e343287bfb24a78c7a69f3c5d18aead3b"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"76a74c41b81e1e85cc8c9ee2d7592e3bca99899a","unresolved":false,"context_lines":[{"line_number":10,"context_line":"we should retrieve quota and usage for floating ips"},{"line_number":11,"context_line":"and security groups from neutron, rather than Nova DB."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"We do this just in v2 API, as Phil said, Leaving the"},{"line_number":14,"context_line":"limits code broke in V2 when working with Neutron seems"},{"line_number":15,"context_line":"the wrong choice. In v3 API, we should get better separation"},{"line_number":16,"context_line":"between Nova and Neutron."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":21,"id":"AAAATn%2F%2F%2Fqw%3D","line":13,"updated":"2013-10-24 05:03:56.000000000","message":"I think we don\u0027t need to include \"as Phil said\" in commit message as well.","commit_id":"58893dfe33455ecf14a98ced2e6ff59969819c70"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":10,"context_line":"we should retrieve quota and usage for floating ips"},{"line_number":11,"context_line":"and security groups from neutron, rather than Nova DB."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"We do this just in v2 API, leaving thelimits code broke"},{"line_number":14,"context_line":"in V2 API when working with Neutron seems the wrong choice."},{"line_number":15,"context_line":"In v3 API, we should get better separation between Nova and"},{"line_number":16,"context_line":"Neutron."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":22,"id":"AAAATn%2F%2F%2BD4%3D","line":13,"updated":"2013-10-24 13:43:57.000000000","message":"s/thelimits/the limits/\n\nIn case you have to push another patch.","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"}],"nova/api/openstack/compute/contrib/used_limits.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"abf07a27730bd7afdd8e0d024be9ea19ce5a291a","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":64,"context_line":"        network_api_class \u003d CONF.network_api_class"},{"line_number":65,"context_line":"        security_group_api \u003d CONF.security_group_api.lower()"},{"line_number":66,"context_line":"        if network_api_class in (\u0027nova.network.quantumv2.api.API\u0027,"},{"line_number":67,"context_line":"                                 \u0027nova.network.neutronv2.api.API\u0027):"},{"line_number":68,"context_line":"            neutron \u003d neutronv2.get_client(context)"},{"line_number":69,"context_line":"            floatingip_in_use \u003d len(neutron."}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9c4%3D","line":66,"updated":"2013-08-27 14:46:44.000000000","message":"Use utils.is_neutron() instead.","commit_id":"eb3f7ae22f5f7ad4a07c77cba335d25b80721989"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"36d0f4b55dcd5cd68c1e980c6b42f9d12ad12e04","unresolved":false,"context_lines":[{"line_number":64,"context_line":"            self.network_api \u003d network.API()"},{"line_number":65,"context_line":"            floatingip_in_use \u003d self.network_api.\\"},{"line_number":66,"context_line":"                                get_used_floating_ips_by_project(context)"},{"line_number":67,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floatingip_in_use"},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"            if openstack_driver.is_neutron_security_groups():"},{"line_number":70,"context_line":"                securitygroups_in_use \u003d self.network_api.\\"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAASn%2F%2FRTk%3D","line":67,"updated":"2013-09-08 13:23:43.000000000","message":"Neutron also has Quota\u0027s. Could this lead to a contradiction?","commit_id":"d5973ea334a7d2b75663d24ffbd01c1b37393a40"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"1a1e9724aebf0b5066cfc2f8a6012a6f4c566b0d","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":64,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":65,"context_line":"        network_api_class \u003d CONF.network_api_class"},{"line_number":66,"context_line":"        if \u0027quantumv2\u0027 in network_api_class or \\"},{"line_number":67,"context_line":"           \u0027neutronv2\u0027 in network_api_class:"},{"line_number":68,"context_line":"            self.network_api \u003d network.API()"},{"line_number":69,"context_line":"            floatingip_in_use \u003d self.network_api.\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2FfDw%3D","line":66,"updated":"2013-09-25 22:00:18.000000000","message":"why check for both here?","commit_id":"6fc7a36d9c4aba08f15de17cbf286d71586b34a6"},{"author":{"_account_id":1849,"name":"Joe Gordon","email":"joe.gordon0@gmail.com","username":"jogo"},"change_message_id":"e63837ea50052a3b83af489bb26f26296c57dea7","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":64,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":65,"context_line":"        network_api_class \u003d CONF.network_api_class"},{"line_number":66,"context_line":"        if \u0027quantumv2\u0027 in network_api_class or \\"},{"line_number":67,"context_line":"           \u0027neutronv2\u0027 in network_api_class:"},{"line_number":68,"context_line":"            self.network_api \u003d network.API()"},{"line_number":69,"context_line":"            floatingip_in_use \u003d self.network_api.\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2FbXY%3D","line":66,"in_reply_to":"AAAAS3%2F%2FehM%3D","updated":"2013-09-26 20:48:18.000000000","message":"your right","commit_id":"6fc7a36d9c4aba08f15de17cbf286d71586b34a6"},{"author":{"_account_id":6763,"name":"jingliuqing","email":"jing.liuqing@99cloud.net","username":"jing"},"change_message_id":"bd1fc2395fd3bc52882fe81df400d9bd572e1872","unresolved":false,"context_lines":[{"line_number":63,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":64,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":65,"context_line":"        network_api_class \u003d CONF.network_api_class"},{"line_number":66,"context_line":"        if \u0027quantumv2\u0027 in network_api_class or \\"},{"line_number":67,"context_line":"           \u0027neutronv2\u0027 in network_api_class:"},{"line_number":68,"context_line":"            self.network_api \u003d network.API()"},{"line_number":69,"context_line":"            floatingip_in_use \u003d self.network_api.\\"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2FehM%3D","line":66,"in_reply_to":"AAAAS3%2F%2FfDw%3D","updated":"2013-09-26 02:47:38.000000000","message":"compatible with quantum. we do\u0027t need check quantum?","commit_id":"6fc7a36d9c4aba08f15de17cbf286d71586b34a6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7bf40d03f63cb797b27d4162be222463493200da","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":65,"context_line":"        network_api_class \u003d CONF.network_api_class"},{"line_number":66,"context_line":"        if \u0027quantumv2\u0027 in network_api_class or \\"},{"line_number":67,"context_line":"           \u0027neutronv2\u0027 in network_api_class:"},{"line_number":68,"context_line":"            self.network_api \u003d network.API()"},{"line_number":69,"context_line":"            floatingip_in_use \u003d self.network_api.\\"},{"line_number":70,"context_line":"                                get_used_floating_ips_by_project(context)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2FQVM%3D","line":67,"updated":"2013-10-01 13:27:33.000000000","message":"please use https://github.com/openstack/nova/blob/master/nova/utils.py#L1183","commit_id":"6fc7a36d9c4aba08f15de17cbf286d71586b34a6"},{"author":{"_account_id":6763,"name":"jingliuqing","email":"jing.liuqing@99cloud.net","username":"jing"},"change_message_id":"fdf3427a66ea9bac44518e506ac7775e00bd9496","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":65,"context_line":"        network_api_class \u003d CONF.network_api_class"},{"line_number":66,"context_line":"        if \u0027quantumv2\u0027 in network_api_class or \\"},{"line_number":67,"context_line":"           \u0027neutronv2\u0027 in network_api_class:"},{"line_number":68,"context_line":"            self.network_api \u003d network.API()"},{"line_number":69,"context_line":"            floatingip_in_use \u003d self.network_api.\\"},{"line_number":70,"context_line":"                                get_used_floating_ips_by_project(context)"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2FOBE%3D","line":67,"in_reply_to":"AAAAS3%2F%2FQVM%3D","updated":"2013-10-02 02:48:22.000000000","message":"hi, i used utils.is_neutron() in patch set 9, but the jenkins always failed and i can‘t figure it out. maybe i can try it again.","commit_id":"6fc7a36d9c4aba08f15de17cbf286d71586b34a6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d83972619dd78ec78949c615720d5d16b967ed26","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            floatingip_in_use \u003d self.network_api.\\"},{"line_number":69,"context_line":"                                get_used_floating_ips_by_project(context)"},{"line_number":70,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floatingip_in_use"},{"line_number":71,"context_line":"            LOG.info(_(\"Getting %s floating ips in use \""},{"line_number":72,"context_line":"                       \"from neutron.\") % floatingip_in_use)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"            if openstack_driver.is_neutron_security_groups():"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATH%2F%2FPhk%3D","line":71,"updated":"2013-10-19 17:38:02.000000000","message":"Getting is maybe not the best choice here. Maybe consider \"Received\" as this is after you have received the value from Neutron","commit_id":"4ec38c3e343287bfb24a78c7a69f3c5d18aead3b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d83972619dd78ec78949c615720d5d16b967ed26","unresolved":false,"context_lines":[{"line_number":69,"context_line":"                                get_used_floating_ips_by_project(context)"},{"line_number":70,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floatingip_in_use"},{"line_number":71,"context_line":"            LOG.info(_(\"Getting %s floating ips in use \""},{"line_number":72,"context_line":"                       \"from neutron.\") % floatingip_in_use)"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"            if openstack_driver.is_neutron_security_groups():"},{"line_number":75,"context_line":"                securitygroups_in_use \u003d self.network_api.\\"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATH%2F%2FPhI%3D","line":72,"updated":"2013-10-19 17:38:02.000000000","message":"This info message may be confusing. Would it be possible to also print the project here?","commit_id":"4ec38c3e343287bfb24a78c7a69f3c5d18aead3b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from nova.api.openstack import wsgi"},{"line_number":19,"context_line":"from nova.api.openstack import xmlutil"},{"line_number":20,"context_line":"from nova import network"},{"line_number":21,"context_line":"from nova.network.security_group import openstack_driver"},{"line_number":22,"context_line":"from nova.openstack.common import log as logging"},{"line_number":23,"context_line":"from nova import quota"},{"line_number":24,"context_line":"from nova import utils"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BDE%3D","line":21,"updated":"2013-10-24 13:43:57.000000000","message":"openstack_driver doesn\u0027t seem like a good name here, that is totally generic. Why not something like nova_net_secgroup or nova_security_group, something that actually makes me think of what the package is?","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        quotas \u003d QUOTAS.get_project_quotas(context, project_id, usages\u003dTrue)"},{"line_number":63,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":64,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":65,"context_line":"        if utils.is_neutron():"},{"line_number":66,"context_line":"            self.network_api \u003d network.API()"},{"line_number":67,"context_line":"            floatingip_in_use \u003d self.network_api.\\"},{"line_number":68,"context_line":"                                get_used_floating_ips_by_project(context)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BAA%3D","line":65,"updated":"2013-10-24 13:43:57.000000000","message":"Where is all of this new code tested?  It seems like it\u0027s not tested because the existing API tests are calling utils.reset_is_neutron to run the tests as nova network, and the change to the network API tests is just for the new helper methods to get the usage numbers.","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":65,"context_line":"        if utils.is_neutron():"},{"line_number":66,"context_line":"            self.network_api \u003d network.API()"},{"line_number":67,"context_line":"            floatingip_in_use \u003d self.network_api.\\"},{"line_number":68,"context_line":"                                get_used_floating_ips_by_project(context)"},{"line_number":69,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floatingip_in_use"},{"line_number":70,"context_line":"            LOG.info(\"Received %s floating ips in use for %s \""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BC4%3D","line":67,"updated":"2013-10-24 13:43:57.000000000","message":"Shouldn\u0027t continue lines with \\, should wrap in parenthesis.","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"c29cc2c24b40e28a2acb2fa0163e66ef14398c42","unresolved":false,"context_lines":[{"line_number":67,"context_line":"            floatingip_in_use \u003d self.network_api.\\"},{"line_number":68,"context_line":"                                get_used_floating_ips_by_project(context)"},{"line_number":69,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floatingip_in_use"},{"line_number":70,"context_line":"            LOG.info(\"Received %s floating ips in use for %s \""},{"line_number":71,"context_line":"                      \"from neutron.\" % (floatingip_in_use, project_id))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"            if openstack_driver.is_neutron_security_groups():"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F2Gg%3D","line":70,"updated":"2013-10-27 23:43:41.000000000","message":"this should perhaps be at debug level?","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                      \"from neutron.\" % (floatingip_in_use, project_id))"},{"line_number":72,"context_line":""},{"line_number":73,"context_line":"            if openstack_driver.is_neutron_security_groups():"},{"line_number":74,"context_line":"                securitygroups_in_use \u003d self.network_api.\\"},{"line_number":75,"context_line":"                                        get_used_security_groups_by_project("},{"line_number":76,"context_line":"                                            context)"},{"line_number":77,"context_line":"                quotas[\u0027security_groups\u0027][\u0027in_use\u0027] \u003d securitygroups_in_use"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BC0%3D","line":74,"updated":"2013-10-24 13:43:57.000000000","message":"shouldn\u0027t continue lines with \\","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"c29cc2c24b40e28a2acb2fa0163e66ef14398c42","unresolved":false,"context_lines":[{"line_number":75,"context_line":"                                        get_used_security_groups_by_project("},{"line_number":76,"context_line":"                                            context)"},{"line_number":77,"context_line":"                quotas[\u0027security_groups\u0027][\u0027in_use\u0027] \u003d securitygroups_in_use"},{"line_number":78,"context_line":"                LOG.info(\"Received %s security groups in use for %s from \""},{"line_number":79,"context_line":"                         \"neutron.\" % (securitygroups_in_use, project_id))"},{"line_number":80,"context_line":"        quota_map \u003d {"},{"line_number":81,"context_line":"            \u0027totalRAMUsed\u0027: \u0027ram\u0027,"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F2Gc%3D","line":78,"updated":"2013-10-27 23:43:41.000000000","message":"This should perhaps be at debug level?","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":66,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":67,"context_line":"        if utils.is_neutron():"},{"line_number":68,"context_line":"            floating_ips \u003d self.network_api.\\"},{"line_number":69,"context_line":"                                get_num_used_floating_ips_by_project(context)"},{"line_number":70,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floating_ips"},{"line_number":71,"context_line":"            LOG.debug(_(\"Received %(floating_ips)s floating ips in use of \""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEOo%3D","line":68,"updated":"2013-11-14 22:27:45.000000000","message":"continue lines with parenthesis, not \\","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":65,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":66,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":67,"context_line":"        if utils.is_neutron():"},{"line_number":68,"context_line":"            floating_ips \u003d self.network_api.\\"},{"line_number":69,"context_line":"                                get_num_used_floating_ips_by_project(context)"},{"line_number":70,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floating_ips"},{"line_number":71,"context_line":"            LOG.debug(_(\"Received %(floating_ips)s floating ips in use of \""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FDYM%3D","line":68,"in_reply_to":"AAAATn%2F%2FEOo%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            floating_ips \u003d self.network_api.\\"},{"line_number":69,"context_line":"                                get_num_used_floating_ips_by_project(context)"},{"line_number":70,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floating_ips"},{"line_number":71,"context_line":"            LOG.debug(_(\"Received %(floating_ips)s floating ips in use of \""},{"line_number":72,"context_line":"                      \"%(project_id)s from neutron.\"),"},{"line_number":73,"context_line":"                      {\u0027floating_ips\u0027: floating_ips, \u0027project_id\u0027: project_id})"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEOc%3D","line":71,"updated":"2013-11-14 22:27:45.000000000","message":"suggestion for alternate wording: \"Neutron project %(project_id)s is using %(floating_ips)s floating IPs.\"","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":68,"context_line":"            floating_ips \u003d self.network_api.\\"},{"line_number":69,"context_line":"                                get_num_used_floating_ips_by_project(context)"},{"line_number":70,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floating_ips"},{"line_number":71,"context_line":"            LOG.debug(_(\"Received %(floating_ips)s floating ips in use of \""},{"line_number":72,"context_line":"                      \"%(project_id)s from neutron.\"),"},{"line_number":73,"context_line":"                      {\u0027floating_ips\u0027: floating_ips, \u0027project_id\u0027: project_id})"},{"line_number":74,"context_line":""}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FDYI%3D","line":71,"in_reply_to":"AAAATn%2F%2FEOc%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                      {\u0027floating_ips\u0027: floating_ips, \u0027project_id\u0027: project_id})"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"            if sec_group.is_neutron_security_groups():"},{"line_number":76,"context_line":"                security_groups \u003d self.network_api.\\"},{"line_number":77,"context_line":"                                get_num_used_security_groups_by_project("},{"line_number":78,"context_line":"                                            context)"},{"line_number":79,"context_line":"                quotas[\u0027security_groups\u0027][\u0027in_use\u0027] \u003d security_groups"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEOk%3D","line":76,"updated":"2013-11-14 22:27:45.000000000","message":"ditto","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":73,"context_line":"                      {\u0027floating_ips\u0027: floating_ips, \u0027project_id\u0027: project_id})"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"            if sec_group.is_neutron_security_groups():"},{"line_number":76,"context_line":"                security_groups \u003d self.network_api.\\"},{"line_number":77,"context_line":"                                get_num_used_security_groups_by_project("},{"line_number":78,"context_line":"                                            context)"},{"line_number":79,"context_line":"                quotas[\u0027security_groups\u0027][\u0027in_use\u0027] \u003d security_groups"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FDYE%3D","line":76,"in_reply_to":"AAAATn%2F%2FEOk%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                get_num_used_security_groups_by_project("},{"line_number":78,"context_line":"                                            context)"},{"line_number":79,"context_line":"                quotas[\u0027security_groups\u0027][\u0027in_use\u0027] \u003d security_groups"},{"line_number":80,"context_line":"                LOG.debug(_(\"Received %(security_groups)s security groups \""},{"line_number":81,"context_line":"                          \"in use of %(project_id)s from neutron.\"),"},{"line_number":82,"context_line":"                          {\u0027security_groups\u0027: security_groups,"},{"line_number":83,"context_line":"                           \u0027project_id\u0027: project_id})"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEOQ%3D","line":80,"updated":"2013-11-14 22:27:45.000000000","message":"suggested alternate wording: \"Neutron project %(project_id)s is using %(security_groups)s security groups.\"","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":77,"context_line":"                                get_num_used_security_groups_by_project("},{"line_number":78,"context_line":"                                            context)"},{"line_number":79,"context_line":"                quotas[\u0027security_groups\u0027][\u0027in_use\u0027] \u003d security_groups"},{"line_number":80,"context_line":"                LOG.debug(_(\"Received %(security_groups)s security groups \""},{"line_number":81,"context_line":"                          \"in use of %(project_id)s from neutron.\"),"},{"line_number":82,"context_line":"                          {\u0027security_groups\u0027: security_groups,"},{"line_number":83,"context_line":"                           \u0027project_id\u0027: project_id})"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FDYA%3D","line":80,"in_reply_to":"AAAATn%2F%2FEOQ%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f1cb8034e4e478b393a6ecd80d19e4effffbcf03","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __init__(self, ext_mgr):"},{"line_number":49,"context_line":"        self.ext_mgr \u003d ext_mgr"},{"line_number":50,"context_line":"        self.network_api \u003d network.API()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"},{"line_number":53,"context_line":"    def _reserved(req):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2F4G4%3D","line":50,"updated":"2014-01-07 10:38:45.000000000","message":"minor nit but not really important - this need not be set if we are not using neutron","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"44b8c1cf56ca88ddf8e58ff99044b55a805bdccb","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __init__(self, ext_mgr):"},{"line_number":49,"context_line":"        self.ext_mgr \u003d ext_mgr"},{"line_number":50,"context_line":"        self.network_api \u003d network.API()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"},{"line_number":53,"context_line":"    def _reserved(req):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2Fn7s%3D","line":50,"in_reply_to":"AAAAUH%2F%2F4G4%3D","updated":"2014-01-10 11:30:02.000000000","message":"sure, but I like how this is cleaner.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6267e15bf13a4783d0e15eb14194d150fc48f5a1","unresolved":false,"context_lines":[{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __init__(self, ext_mgr):"},{"line_number":49,"context_line":"        self.ext_mgr \u003d ext_mgr"},{"line_number":50,"context_line":"        self.network_api \u003d network.API()"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    @staticmethod"},{"line_number":53,"context_line":"    def _reserved(req):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2FeA%3D","line":50,"in_reply_to":"AAAAUH%2F%2Fn7s%3D","updated":"2014-02-17 19:38:26.000000000","message":"Agree with John.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"94919ac6a0417a999b18d523973a32c13027e73c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                                get_num_used_security_groups_by_project("},{"line_number":79,"context_line":"                                            context))"},{"line_number":80,"context_line":"                quotas[\u0027security_groups\u0027][\u0027in_use\u0027] \u003d security_groups"},{"line_number":81,"context_line":"                LOG.debug(_(\"Neutron project %(project_id)s is using \""},{"line_number":82,"context_line":"                            \"%(security_groups)s security groups.\"),"},{"line_number":83,"context_line":"                          {\u0027security_groups\u0027: security_groups,"},{"line_number":84,"context_line":"                           \u0027project_id\u0027: project_id})"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2BwSE%3D","line":81,"updated":"2014-01-22 14:00:22.000000000","message":"pedantry: a project is just a project, not a \"neutron project\" or a \"nova project\"\n\n(wherever you see \"pedantry\" or \"pedantic comment\" feel free to ignore it)","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6267e15bf13a4783d0e15eb14194d150fc48f5a1","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                                get_num_used_security_groups_by_project("},{"line_number":79,"context_line":"                                            context))"},{"line_number":80,"context_line":"                quotas[\u0027security_groups\u0027][\u0027in_use\u0027] \u003d security_groups"},{"line_number":81,"context_line":"                LOG.debug(_(\"Neutron project %(project_id)s is using \""},{"line_number":82,"context_line":"                            \"%(security_groups)s security groups.\"),"},{"line_number":83,"context_line":"                          {\u0027security_groups\u0027: security_groups,"},{"line_number":84,"context_line":"                           \u0027project_id\u0027: project_id})"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2FeY%3D","line":81,"in_reply_to":"AAAAUH%2F%2BwSE%3D","updated":"2014-02-17 19:38:26.000000000","message":"I\u0027ll clean this up, it\u0027s a good point.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"16545de14bc9f9c9b5d9259a447f1890aa00995d","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                LOG.debug(_(\"Project %(project_id)s is using \""},{"line_number":80,"context_line":"                            \"%(security_groups)s security groups.\"),"},{"line_number":81,"context_line":"                          {\u0027security_groups\u0027: security_groups,"},{"line_number":82,"context_line":"                           \u0027project_id\u0027: project_id})"},{"line_number":83,"context_line":"        quota_map \u003d {"},{"line_number":84,"context_line":"            \u0027totalRAMUsed\u0027: \u0027ram\u0027,"},{"line_number":85,"context_line":"            \u0027totalCoresUsed\u0027: \u0027cores\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2Fqlw%3D","line":82,"updated":"2014-03-04 19:19:09.000000000","message":"Just a question.\nIs it ok if this call returns a 500 if the neutron request fail.\n\nthe alternative would be to return N/D for floating IPs and security groups, but perhaps it\u0027s better to fail.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33013db60327e3416f2bdd37b41ea8b45fe16f06","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                LOG.debug(_(\"Project %(project_id)s is using \""},{"line_number":80,"context_line":"                            \"%(security_groups)s security groups.\"),"},{"line_number":81,"context_line":"                          {\u0027security_groups\u0027: security_groups,"},{"line_number":82,"context_line":"                           \u0027project_id\u0027: project_id})"},{"line_number":83,"context_line":"        quota_map \u003d {"},{"line_number":84,"context_line":"            \u0027totalRAMUsed\u0027: \u0027ram\u0027,"},{"line_number":85,"context_line":"            \u0027totalCoresUsed\u0027: \u0027cores\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FYfM%3D","line":82,"in_reply_to":"AAAAVn%2F%2FqY8%3D","updated":"2014-03-06 13:46:15.000000000","message":"In talking with John this morning I\u0027ll add unit tests to handle neutronclient raising an error.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"96c8f72037a57f8364c887dde0e9c9bd911a53b8","unresolved":false,"context_lines":[{"line_number":79,"context_line":"                LOG.debug(_(\"Project %(project_id)s is using \""},{"line_number":80,"context_line":"                            \"%(security_groups)s security groups.\"),"},{"line_number":81,"context_line":"                          {\u0027security_groups\u0027: security_groups,"},{"line_number":82,"context_line":"                           \u0027project_id\u0027: project_id})"},{"line_number":83,"context_line":"        quota_map \u003d {"},{"line_number":84,"context_line":"            \u0027totalRAMUsed\u0027: \u0027ram\u0027,"},{"line_number":85,"context_line":"            \u0027totalCoresUsed\u0027: \u0027cores\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FqY8%3D","line":82,"in_reply_to":"AAAAVn%2F%2Fqlw%3D","updated":"2014-03-04 19:41:29.000000000","message":"I think we have to fail if Neutron fails.  We\u0027ve talking about omitting the values in the neutron case or somehow marking them as n/a but that\u0027s not backwards compatible.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"fb7689a164a8793949afecac7d201cf225235b06","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":65,"context_line":"        if utils.is_neutron():"},{"line_number":66,"context_line":"            floating_ips \u003d (self.network_api."},{"line_number":67,"context_line":"                                get_num_used_floating_ips_by_project(context))"},{"line_number":68,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floating_ips"},{"line_number":69,"context_line":"            LOG.debug(_(\"Project %(project_id)s is using \""},{"line_number":70,"context_line":"                        \"%(floating_ips)s floating IPs.\"),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAVn%2F%2B6W0%3D","line":67,"updated":"2014-03-11 11:10:34.000000000","message":"From the testcases it looks like there could be exceptions raised. Anything which is not a webob exception needs to be caught and converted.","commit_id":"6d62648e77eda5c1aa4f81912ff52e70607ae177"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"09f18b0ed3bf42abe727b022bc3102e9ed05ae3d","unresolved":false,"context_lines":[{"line_number":64,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":65,"context_line":"        if utils.is_neutron():"},{"line_number":66,"context_line":"            floating_ips \u003d (self.network_api."},{"line_number":67,"context_line":"                                get_num_used_floating_ips_by_project(context))"},{"line_number":68,"context_line":"            quotas[\u0027floating_ips\u0027][\u0027in_use\u0027] \u003d floating_ips"},{"line_number":69,"context_line":"            LOG.debug(_(\"Project %(project_id)s is using \""},{"line_number":70,"context_line":"                        \"%(floating_ips)s floating IPs.\"),"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAWH%2F%2F76k%3D","line":67,"in_reply_to":"AAAAVn%2F%2B6W0%3D","updated":"2014-03-12 20:24:23.000000000","message":"OK, I thought so but wasn\u0027t sure since the only other places I saw anything related was the server API and it wasn\u0027t exactly the same, the client stuff is usually handled down in nova.network.neutronv2.api it seems, like with security group relate failures.  The only thing I\u0027m wondering is how specific this needs to get on the error handling since I\u0027m not entirely sure what all neutron could give back here.  The tests were based on possible error codes from the neutron APIs, so I could handle those and then just blanket NeutronClientException at the end and raise that as a 500?","commit_id":"6d62648e77eda5c1aa4f81912ff52e70607ae177"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"621f628263dd9d95cf53f1a3e9098b4e8defdf84","unresolved":false,"context_lines":[{"line_number":62,"context_line":"        context \u003d req.environ[\u0027nova.context\u0027]"},{"line_number":63,"context_line":"        project_id \u003d self._project_id(context, req)"},{"line_number":64,"context_line":"        quotas \u003d QUOTAS.get_project_quotas(context, project_id, usages\u003dTrue)"},{"line_number":65,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":66,"context_line":"        # we should get some resource\u0027s usage from neutron."},{"line_number":67,"context_line":"        # TODO(mriedem): Abstract get_num_used_floating_ips_by_project and"},{"line_number":68,"context_line":"        # get_num_used_security_groups_by_project in the network API"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAWH%2F%2BLLc%3D","line":65,"updated":"2014-03-28 16:24:01.000000000","message":"Nit:  /set/are set to/","commit_id":"4bba17d6157251113692da21c4bf079791d3bd7f"}],"nova/api/openstack/compute/limits.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"abf07a27730bd7afdd8e0d024be9ea19ce5a291a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        # we should get some resource\u0027s quota from neutron."},{"line_number":101,"context_line":"        network_api_class \u003d CONF.network_api_class"},{"line_number":102,"context_line":"        security_group_api \u003d CONF.security_group_api.lower()"},{"line_number":103,"context_line":"        if network_api_class in (\u0027nova.network.quantumv2.api.API\u0027,"},{"line_number":104,"context_line":"                                 \u0027nova.network.neutronv2.api.API\u0027):"},{"line_number":105,"context_line":"            neutron \u003d neutronv2.get_client(context)"},{"line_number":106,"context_line":"            neutron_quotas \u003d neutron.\\"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9dQ%3D","line":103,"updated":"2013-08-27 14:46:44.000000000","message":"Use utils.is_neutron() instead.","commit_id":"eb3f7ae22f5f7ad4a07c77cba335d25b80721989"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"abf07a27730bd7afdd8e0d024be9ea19ce5a291a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        if network_api_class in (\u0027nova.network.quantumv2.api.API\u0027,"},{"line_number":104,"context_line":"                                 \u0027nova.network.neutronv2.api.API\u0027):"},{"line_number":105,"context_line":"            neutron \u003d neutronv2.get_client(context)"},{"line_number":106,"context_line":"            neutron_quotas \u003d neutron.\\"},{"line_number":107,"context_line":"                             show_quota(context.project_id).\\"},{"line_number":108,"context_line":"                             get(\u0027quota\u0027)"},{"line_number":109,"context_line":"            floatingip_quota \u003d neutron_quotas.get(\u0027floatingip\u0027)"}],"source_content_type":"text/x-python","patch_set":2,"id":"AAAASn%2F%2F9dE%3D","line":106,"updated":"2013-08-27 14:46:44.000000000","message":"Don\u0027t use \\ to continue lines per the hacking guidelines, enclose in parentheses instead.","commit_id":"eb3f7ae22f5f7ad4a07c77cba335d25b80721989"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"7bf40d03f63cb797b27d4162be222463493200da","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                                           usages\u003dFalse)"},{"line_number":100,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":101,"context_line":"        # we should get some resource\u0027s quota from neutron."},{"line_number":102,"context_line":"        network_api_class \u003d CONF.network_api_class"},{"line_number":103,"context_line":"        if \u0027quantumv2\u0027 in network_api_class or \\"},{"line_number":104,"context_line":"           \u0027neutronv2\u0027 in network_api_class:"},{"line_number":105,"context_line":"            self.network_api \u003d network.API()"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAAS3%2F%2FQVI%3D","line":102,"updated":"2013-10-01 13:27:33.000000000","message":"please use https://github.com/openstack/nova/blob/master/nova/utils.py#L1183","commit_id":"6fc7a36d9c4aba08f15de17cbf286d71586b34a6"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"d83972619dd78ec78949c615720d5d16b967ed26","unresolved":false,"context_lines":[{"line_number":104,"context_line":"            neutron_quotas \u003d self.network_api.get_quota_by_project(context)"},{"line_number":105,"context_line":"            floatingip_quota \u003d neutron_quotas[\u0027floatingip\u0027]"},{"line_number":106,"context_line":"            quotas[\u0027floating_ips\u0027] \u003d {\u0027limit\u0027: floatingip_quota}"},{"line_number":107,"context_line":"            LOG.info(_(\"Getting floating ip quota from neutron.\"))"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"            if openstack_driver.is_neutron_security_groups():"},{"line_number":110,"context_line":"                security_group_quota \u003d neutron_quotas[\u0027security_group\u0027]"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATH%2F%2FPhQ%3D","line":107,"updated":"2013-10-19 17:38:02.000000000","message":"Why not print the number here like in nova/api/openstack/compute/contrib/used_limits.py.","commit_id":"4ec38c3e343287bfb24a78c7a69f3c5d18aead3b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":45,"context_line":"from nova.api.openstack import wsgi"},{"line_number":46,"context_line":"from nova.api.openstack import xmlutil"},{"line_number":47,"context_line":"from nova import network"},{"line_number":48,"context_line":"from nova.network.security_group import openstack_driver"},{"line_number":49,"context_line":"from nova.openstack.common.gettextutils import _"},{"line_number":50,"context_line":"from nova.openstack.common import importutils"},{"line_number":51,"context_line":"from nova.openstack.common import jsonutils"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BCk%3D","line":48,"updated":"2013-10-24 13:43:57.000000000","message":"See my comments on the name of this import in the other file.  I think it should be more specific.","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":99,"context_line":"                                           usages\u003dFalse)"},{"line_number":100,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":101,"context_line":"        # we should get some resource\u0027s quota from neutron."},{"line_number":102,"context_line":"        if utils.is_neutron():"},{"line_number":103,"context_line":"            self.network_api \u003d network.API()"},{"line_number":104,"context_line":"            neutron_quotas \u003d self.network_api.get_quota_by_project(context)"},{"line_number":105,"context_line":"            floatingip_quota \u003d neutron_quotas[\u0027floatingip\u0027]"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F9%2Fs%3D","line":102,"updated":"2013-10-24 13:43:57.000000000","message":"Where is this all tested?","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":114,"context_line":"                quotas[\u0027security_groups\u0027] \u003d {\u0027limit\u0027: security_group_quota}"},{"line_number":115,"context_line":"                quotas[\u0027security_group_rules\u0027] \u003d {\u0027limit\u0027:"},{"line_number":116,"context_line":"                                                  security_group_rule_quota}"},{"line_number":117,"context_line":"                LOG.info(\"Received %s security groups quota for %s from \""},{"line_number":118,"context_line":"                          \"neutron.\" % (security_group_rule_quota,"},{"line_number":119,"context_line":"                                        context.project_id))"},{"line_number":120,"context_line":"        abs_limits \u003d dict((k, v[\u0027limit\u0027]) for k, v in quotas.items())"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BCI%3D","line":117,"updated":"2013-10-24 13:43:57.000000000","message":"The log message is wrong, you\u0027re not providing the security groups quota, you\u0027re providing the security groups rule quota.  I would suggest putting both values into the log message.","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                quotas[\u0027security_groups\u0027] \u003d {\u0027limit\u0027: sg_quota}"},{"line_number":119,"context_line":"                quotas[\u0027security_group_rules\u0027] \u003d {\u0027limit\u0027: sg_rule_quota}"},{"line_number":120,"context_line":"                LOG.debug(_(\"Received %(sg_quota)s security \""},{"line_number":121,"context_line":"                            \"groups quota and %(sg_rule_quota)s of \""},{"line_number":122,"context_line":"                            \"%(project_id)s from neutron.\"),"},{"line_number":123,"context_line":"                          {\u0027sg_quota\u0027: sg_quota,"},{"line_number":124,"context_line":"                           \u0027sg_rule_quota\u0027: sg_rule_quota,"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FENk%3D","line":121,"updated":"2013-11-14 22:27:45.000000000","message":"nit: s/of /of project /","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":118,"context_line":"                quotas[\u0027security_groups\u0027] \u003d {\u0027limit\u0027: sg_quota}"},{"line_number":119,"context_line":"                quotas[\u0027security_group_rules\u0027] \u003d {\u0027limit\u0027: sg_rule_quota}"},{"line_number":120,"context_line":"                LOG.debug(_(\"Received %(sg_quota)s security \""},{"line_number":121,"context_line":"                            \"groups quota and %(sg_rule_quota)s of \""},{"line_number":122,"context_line":"                            \"%(project_id)s from neutron.\"),"},{"line_number":123,"context_line":"                          {\u0027sg_quota\u0027: sg_quota,"},{"line_number":124,"context_line":"                           \u0027sg_rule_quota\u0027: sg_rule_quota,"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FDX0%3D","line":121,"in_reply_to":"AAAATn%2F%2FENk%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f1cb8034e4e478b393a6ecd80d19e4effffbcf03","unresolved":false,"context_lines":[{"line_number":92,"context_line":"    \"\"\"Controller for accessing limits in the OpenStack API.\"\"\""},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"    def __init__(self):"},{"line_number":95,"context_line":"        self.network_api \u003d network.API()"},{"line_number":96,"context_line":""},{"line_number":97,"context_line":"    @wsgi.serializers(xml\u003dLimitsTemplate)"},{"line_number":98,"context_line":"    def index(self, req):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2F4G0%3D","line":95,"updated":"2014-01-07 10:38:45.000000000","message":"ditto","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"13df2249594ff809edb775e354a620ecd56b6efe","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                                           usages\u003dFalse)"},{"line_number":104,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":105,"context_line":"        # we should get some resource\u0027s quota from neutron."},{"line_number":106,"context_line":"        if utils.is_neutron():"},{"line_number":107,"context_line":"            neutron_quotas \u003d self.network_api.get_quota_by_project(context)"},{"line_number":108,"context_line":"            floatingip_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027floatingip\u0027]"},{"line_number":109,"context_line":"            quotas[\u0027floating_ips\u0027] \u003d {\u0027limit\u0027: floatingip_quota}"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F9588%3D","line":106,"updated":"2014-02-01 21:20:11.000000000","message":"Given bug 1274992 I guess we should be careful about using this?","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6267e15bf13a4783d0e15eb14194d150fc48f5a1","unresolved":false,"context_lines":[{"line_number":103,"context_line":"                                           usages\u003dFalse)"},{"line_number":104,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":105,"context_line":"        # we should get some resource\u0027s quota from neutron."},{"line_number":106,"context_line":"        if utils.is_neutron():"},{"line_number":107,"context_line":"            neutron_quotas \u003d self.network_api.get_quota_by_project(context)"},{"line_number":108,"context_line":"            floatingip_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027floatingip\u0027]"},{"line_number":109,"context_line":"            quotas[\u0027floating_ips\u0027] \u003d {\u0027limit\u0027: floatingip_quota}"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2Foc%3D","line":106,"in_reply_to":"AAAAUH%2F9588%3D","updated":"2014-02-17 19:38:26.000000000","message":"Should be fixed here: https://review.openstack.org/#/c/72125/","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":1313,"name":"yaguang","display_name":"Yaguang Tang","email":"heut2008@gmail.com","username":"heut2008"},"change_message_id":"ace1ed338b2bf9b3e53bd1c9e77ef7cd7f5f6858","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                       \u0027project_id\u0027: project_id})"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            if sec_group.is_neutron_security_groups():"},{"line_number":116,"context_line":"                sg_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027security_groups\u0027]"},{"line_number":117,"context_line":"                sg_rule_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027security_group_rules\u0027]"},{"line_number":118,"context_line":"                quotas[\u0027security_groups\u0027] \u003d {\u0027limit\u0027: sg_quota}"},{"line_number":119,"context_line":"                quotas[\u0027security_group_rules\u0027] \u003d {\u0027limit\u0027: sg_rule_quota}"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2Fkzs%3D","line":116,"updated":"2014-02-12 09:09:34.000000000","message":"I believe neutron is using security_group not security_groups.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6267e15bf13a4783d0e15eb14194d150fc48f5a1","unresolved":false,"context_lines":[{"line_number":113,"context_line":"                       \u0027project_id\u0027: project_id})"},{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            if sec_group.is_neutron_security_groups():"},{"line_number":116,"context_line":"                sg_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027security_groups\u0027]"},{"line_number":117,"context_line":"                sg_rule_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027security_group_rules\u0027]"},{"line_number":118,"context_line":"                quotas[\u0027security_groups\u0027] \u003d {\u0027limit\u0027: sg_quota}"},{"line_number":119,"context_line":"                quotas[\u0027security_group_rules\u0027] \u003d {\u0027limit\u0027: sg_rule_quota}"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2Fe8%3D","line":116,"in_reply_to":"AAAAUX%2F%2Fkzs%3D","updated":"2014-02-17 19:38:26.000000000","message":"Looks like you\u0027re right, this code hurts my eyes and brain though:\n\nhttps://github.com/openstack/neutron/blob/master/neutron/extensions/securitygroup.py#L270","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":1313,"name":"yaguang","display_name":"Yaguang Tang","email":"heut2008@gmail.com","username":"heut2008"},"change_message_id":"064dd6e4b290717df4dafa9ca6b425f640d96b23","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            if sec_group.is_neutron_security_groups():"},{"line_number":116,"context_line":"                sg_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027security_groups\u0027]"},{"line_number":117,"context_line":"                sg_rule_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027security_group_rules\u0027]"},{"line_number":118,"context_line":"                quotas[\u0027security_groups\u0027] \u003d {\u0027limit\u0027: sg_quota}"},{"line_number":119,"context_line":"                quotas[\u0027security_group_rules\u0027] \u003d {\u0027limit\u0027: sg_rule_quota}"},{"line_number":120,"context_line":"                LOG.debug(_(\"Received %(sg_quota)s security \""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2Fkm8%3D","line":117,"updated":"2014-02-12 09:15:09.000000000","message":"neutron is using security_group_rule not security_group_rules in quota","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6267e15bf13a4783d0e15eb14194d150fc48f5a1","unresolved":false,"context_lines":[{"line_number":114,"context_line":""},{"line_number":115,"context_line":"            if sec_group.is_neutron_security_groups():"},{"line_number":116,"context_line":"                sg_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027security_groups\u0027]"},{"line_number":117,"context_line":"                sg_rule_quota \u003d neutron_quotas[\u0027quota\u0027][\u0027security_group_rules\u0027]"},{"line_number":118,"context_line":"                quotas[\u0027security_groups\u0027] \u003d {\u0027limit\u0027: sg_quota}"},{"line_number":119,"context_line":"                quotas[\u0027security_group_rules\u0027] \u003d {\u0027limit\u0027: sg_rule_quota}"},{"line_number":120,"context_line":"                LOG.debug(_(\"Received %(sg_quota)s security \""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2Fek%3D","line":117,"in_reply_to":"AAAAUX%2F%2Fkm8%3D","updated":"2014-02-17 19:38:26.000000000","message":"Correct.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"621f628263dd9d95cf53f1a3e9098b4e8defdf84","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        project_id \u003d context.project_id"},{"line_number":104,"context_line":"        quotas \u003d QUOTAS.get_project_quotas(context, project_id,"},{"line_number":105,"context_line":"                                           usages\u003dFalse)"},{"line_number":106,"context_line":"        # If network_api_class and security_group_api set neutron,"},{"line_number":107,"context_line":"        # we should get some resource\u0027s quota from neutron."},{"line_number":108,"context_line":"        # TODO(mriedem): Abstract get_quota_by_project in the network API"},{"line_number":109,"context_line":"        # layer so this can be handled the same for nova-network and neutron."}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAWH%2F%2BLL8%3D","line":106,"updated":"2014-03-28 16:24:01.000000000","message":"Nit:  /set/are set to/","commit_id":"4bba17d6157251113692da21c4bf079791d3bd7f"}],"nova/network/neutronv2/api.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"be5d5305f0cb569925409b8a2d383c2fe87e33bc","unresolved":false,"context_lines":[{"line_number":847,"context_line":"        fip \u003d self._get_floating_ip_by_address(client, address)"},{"line_number":848,"context_line":"        client.update_floatingip(fip[\u0027id\u0027], {\u0027floatingip\u0027: {\u0027port_id\u0027: None}})"},{"line_number":849,"context_line":""},{"line_number":850,"context_line":"    def get_used_floating_ips_by_project(self, context):"},{"line_number":851,"context_line":"        fips \u003d self.get_floating_ips_by_project(context)"},{"line_number":852,"context_line":"        return len(fips)"},{"line_number":853,"context_line":""}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2F3Hw%3D","line":850,"updated":"2013-08-28 18:28:39.000000000","message":"Please add a docstring to this method.","commit_id":"d472f5fb89cbcfa57c1069db372957f92c9576d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"be5d5305f0cb569925409b8a2d383c2fe87e33bc","unresolved":false,"context_lines":[{"line_number":851,"context_line":"        fips \u003d self.get_floating_ips_by_project(context)"},{"line_number":852,"context_line":"        return len(fips)"},{"line_number":853,"context_line":""},{"line_number":854,"context_line":"    def get_used_security_groups_by_project(self, context):"},{"line_number":855,"context_line":"        client \u003d neutronv2.get_client(context)"},{"line_number":856,"context_line":"        project_id \u003d context.project_id"},{"line_number":857,"context_line":"        sgs \u003d client.list_security_groups("}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2F3Hs%3D","line":854,"updated":"2013-08-28 18:28:39.000000000","message":"Please add a docstring to this method.","commit_id":"d472f5fb89cbcfa57c1069db372957f92c9576d8"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"be5d5305f0cb569925409b8a2d383c2fe87e33bc","unresolved":false,"context_lines":[{"line_number":858,"context_line":"                                    tenant_id\u003dproject_id)[\u0027security_groups\u0027]"},{"line_number":859,"context_line":"        return len(sgs)"},{"line_number":860,"context_line":""},{"line_number":861,"context_line":"    def get_quota_by_project(self, context):"},{"line_number":862,"context_line":"        client \u003d neutronv2.get_client(context)"},{"line_number":863,"context_line":"        project_id \u003d context.project_id"},{"line_number":864,"context_line":"        quotas \u003d client.show_quota(tenant_id\u003dproject_id)[\u0027quota\u0027]"}],"source_content_type":"text/x-python","patch_set":3,"id":"AAAASn%2F%2F3Ho%3D","line":861,"updated":"2013-08-28 18:28:39.000000000","message":"Please add a docstring to this method.","commit_id":"d472f5fb89cbcfa57c1069db372957f92c9576d8"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"c29cc2c24b40e28a2acb2fa0163e66ef14398c42","unresolved":false,"context_lines":[{"line_number":876,"context_line":"        fip \u003d self._get_floating_ip_by_address(client, address)"},{"line_number":877,"context_line":"        client.update_floatingip(fip[\u0027id\u0027], {\u0027floatingip\u0027: {\u0027port_id\u0027: None}})"},{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def get_used_floating_ips_by_project(self, context):"},{"line_number":880,"context_line":"        \"\"\"Get the count of used floating ips by project.\"\"\""},{"line_number":881,"context_line":"        fips \u003d self.get_floating_ips_by_project(context)"},{"line_number":882,"context_line":"        return len(fips)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F2GU%3D","line":879,"updated":"2013-10-27 23:43:41.000000000","message":"I think these new functions are ambiguously named - eg does it return the number of floating ips used or the floating ips used. Something like:\n\nget_num_used_floating_ips_by_project would be better","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":878,"context_line":""},{"line_number":879,"context_line":"    def get_used_floating_ips_by_project(self, context):"},{"line_number":880,"context_line":"        \"\"\"Get the count of used floating ips by project.\"\"\""},{"line_number":881,"context_line":"        fips \u003d self.get_floating_ips_by_project(context)"},{"line_number":882,"context_line":"        return len(fips)"},{"line_number":883,"context_line":""},{"line_number":884,"context_line":"    def get_used_security_groups_by_project(self, context):"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BB0%3D","line":881,"updated":"2013-10-24 13:43:57.000000000","message":"nit: don\u0027t really need a separate variable here, could just do:\n\nreturn len(self.get_floating_ips_by_project(context))","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":884,"context_line":"    def get_used_security_groups_by_project(self, context):"},{"line_number":885,"context_line":"        \"\"\"Get the count of used security groups by project.\"\"\""},{"line_number":886,"context_line":"        client \u003d neutronv2.get_client(context)"},{"line_number":887,"context_line":"        project_id \u003d context.project_id"},{"line_number":888,"context_line":"        sgs \u003d client.list_security_groups("},{"line_number":889,"context_line":"                                    tenant_id\u003dproject_id)[\u0027security_groups\u0027]"},{"line_number":890,"context_line":"        return len(sgs)"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BBk%3D","line":887,"updated":"2013-10-24 13:43:57.000000000","message":"nit: don\u0027t really need a separate var for this","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":885,"context_line":"        \"\"\"Get the count of used security groups by project.\"\"\""},{"line_number":886,"context_line":"        client \u003d neutronv2.get_client(context)"},{"line_number":887,"context_line":"        project_id \u003d context.project_id"},{"line_number":888,"context_line":"        sgs \u003d client.list_security_groups("},{"line_number":889,"context_line":"                                    tenant_id\u003dproject_id)[\u0027security_groups\u0027]"},{"line_number":890,"context_line":"        return len(sgs)"},{"line_number":891,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BBg%3D","line":888,"updated":"2013-10-24 13:43:57.000000000","message":"ditto for sgs","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":892,"context_line":"    def get_quota_by_project(self, context):"},{"line_number":893,"context_line":"        \"\"\"Get neutron\u0027s quota by project.\"\"\""},{"line_number":894,"context_line":"        client \u003d neutronv2.get_client(context)"},{"line_number":895,"context_line":"        project_id \u003d context.project_id"},{"line_number":896,"context_line":"        quotas \u003d client.show_quota(tenant_id\u003dproject_id)[\u0027quota\u0027]"},{"line_number":897,"context_line":"        return quotas"},{"line_number":898,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BBY%3D","line":895,"updated":"2013-10-24 13:43:57.000000000","message":"Same comments here, don\u0027t need these temporary variables that are only used once.","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f00efc98724b182e953f1a4e08c7f2f450441e87","unresolved":false,"context_lines":[{"line_number":736,"context_line":"        client \u003d neutronv2.get_client(context)"},{"line_number":737,"context_line":"        pools \u003d self._get_floating_ip_pools(client)"},{"line_number":738,"context_line":"        return [{\u0027name\u0027: n[\u0027name\u0027] or n[\u0027id\u0027]} for n in pools]"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    def _format_floating_ip_model(self, fip, pool_dict, port_dict):"},{"line_number":741,"context_line":"        pool \u003d pool_dict[fip[\u0027floating_network_id\u0027]]"},{"line_number":742,"context_line":"        result \u003d {\u0027id\u0027: fip[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2B8A%3D","line":739,"updated":"2014-02-17 20:20:30.000000000","message":"This will also need to change to handle fields passed to the request to control the results that come back.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"922180b9ea7f5ecfb495fe8b5c6dd53b83dd4960","unresolved":false,"context_lines":[{"line_number":736,"context_line":"        client \u003d neutronv2.get_client(context)"},{"line_number":737,"context_line":"        pools \u003d self._get_floating_ip_pools(client)"},{"line_number":738,"context_line":"        return [{\u0027name\u0027: n[\u0027name\u0027] or n[\u0027id\u0027]} for n in pools]"},{"line_number":739,"context_line":""},{"line_number":740,"context_line":"    def _format_floating_ip_model(self, fip, pool_dict, port_dict):"},{"line_number":741,"context_line":"        pool \u003d pool_dict[fip[\u0027floating_network_id\u0027]]"},{"line_number":742,"context_line":"        result \u003d {\u0027id\u0027: fip[\u0027id\u0027],"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2B0U%3D","line":739,"in_reply_to":"AAAAUX%2F%2B%2B8A%3D","updated":"2014-02-17 20:49:10.000000000","message":"Yuck, actually handling fields specified on the caller makes this ugly since we\u0027d have to check fip for all the keys we are accessing, and it would mean if we\u0027re only getting the id field then we don\u0027t care about the pool_dict and don\u0027t need to retrieve it, so I\u0027m thinking rather than make get_floating_ips_by_project handle fields, I\u0027m going to just call the client directly from get_num_used_floating_ips_by_project and pass fields there.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6267e15bf13a4783d0e15eb14194d150fc48f5a1","unresolved":false,"context_lines":[{"line_number":767,"context_line":""},{"line_number":768,"context_line":"    def get_floating_ips_by_project(self, context):"},{"line_number":769,"context_line":"        client \u003d neutronv2.get_client(context)"},{"line_number":770,"context_line":"        project_id \u003d context.project_id"},{"line_number":771,"context_line":"        fips \u003d client.list_floatingips(tenant_id\u003dproject_id)[\u0027floatingips\u0027]"},{"line_number":772,"context_line":"        pool_dict \u003d self._setup_pools_dict(client)"},{"line_number":773,"context_line":"        port_dict \u003d self._setup_ports_dict(client, project_id)"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2FXs%3D","line":770,"updated":"2014-02-17 19:38:26.000000000","message":"To filter the response to just return the ids I need to pass in the \u0027fields\u0027 kwarg with a list of fields to filter on, which would be [\u0027id\u0027].","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"94919ac6a0417a999b18d523973a32c13027e73c","unresolved":false,"context_lines":[{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def get_num_used_floating_ips_by_project(self, context):"},{"line_number":884,"context_line":"        \"\"\"Get the count of used floating ips by project.\"\"\""},{"line_number":885,"context_line":"        return len(self.get_floating_ips_by_project(context))"},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"    def get_num_used_security_groups_by_project(self, context):"},{"line_number":888,"context_line":"        \"\"\"Get the count of used security groups by project.\"\"\""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2BwSs%3D","line":885,"updated":"2014-01-22 14:00:22.000000000","message":"this call and the one at line 890 return rather large response bodies.\nIn order to reduce chattiness between nova and neutron I\u0027d suggest to ask for the ID field only.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6267e15bf13a4783d0e15eb14194d150fc48f5a1","unresolved":false,"context_lines":[{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def get_num_used_floating_ips_by_project(self, context):"},{"line_number":884,"context_line":"        \"\"\"Get the count of used floating ips by project.\"\"\""},{"line_number":885,"context_line":"        return len(self.get_floating_ips_by_project(context))"},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"    def get_num_used_security_groups_by_project(self, context):"},{"line_number":888,"context_line":"        \"\"\"Get the count of used security groups by project.\"\"\""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2FVs%3D","line":885,"in_reply_to":"AAAAUH%2F%2BL00%3D","updated":"2014-02-17 19:38:26.000000000","message":"Will do, I\u0027ll pass an optional fields list to the get_floating_ips_by_project method.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3cfa6df2ca2b8c44469175a25d0cfa027b0a7d2b","unresolved":false,"context_lines":[{"line_number":882,"context_line":""},{"line_number":883,"context_line":"    def get_num_used_floating_ips_by_project(self, context):"},{"line_number":884,"context_line":"        \"\"\"Get the count of used floating ips by project.\"\"\""},{"line_number":885,"context_line":"        return len(self.get_floating_ips_by_project(context))"},{"line_number":886,"context_line":""},{"line_number":887,"context_line":"    def get_num_used_security_groups_by_project(self, context):"},{"line_number":888,"context_line":"        \"\"\"Get the count of used security groups by project.\"\"\""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2BL00%3D","line":885,"in_reply_to":"AAAAUH%2F%2BwSs%3D","updated":"2014-01-29 10:22:25.000000000","message":"Good spot Salvatore, I am with you on this one.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6267e15bf13a4783d0e15eb14194d150fc48f5a1","unresolved":false,"context_lines":[{"line_number":887,"context_line":"    def get_num_used_security_groups_by_project(self, context):"},{"line_number":888,"context_line":"        \"\"\"Get the count of used security groups by project.\"\"\""},{"line_number":889,"context_line":"        client \u003d neutronv2.get_client(context)"},{"line_number":890,"context_line":"        return len(client.list_security_groups("},{"line_number":891,"context_line":"                            tenant_id\u003dcontext.project_id)[\u0027security_groups\u0027])"},{"line_number":892,"context_line":""},{"line_number":893,"context_line":"    def get_quota_by_project(self, context):"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2FU8%3D","line":890,"updated":"2014-02-17 19:38:26.000000000","message":"Should probably also query by fields\u003d[\u0027id\u0027] here too to make the response smaller.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"}],"nova/tests/api/openstack/compute/contrib/test_used_limits.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import contextlib"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from nova.api.openstack.compute.contrib import used_limits"},{"line_number":22,"context_line":"from nova.api.openstack.compute import limits"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEPM%3D","line":19,"updated":"2013-11-14 22:27:45.000000000","message":"Just a question, but isn\u0027t mock a 3rd party lib in python 2 and part of python 3?  So do we separate this in the imports or not?","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":16,"context_line":"#    under the License."},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"import contextlib"},{"line_number":19,"context_line":"import mock"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"from nova.api.openstack.compute.contrib import used_limits"},{"line_number":22,"context_line":"from nova.api.openstack.compute import limits"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FDXs%3D","line":19,"in_reply_to":"AAAATn%2F%2FEPM%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            resource.index(fake_req, res)"},{"line_number":124,"context_line":"            abs_limits \u003d res.obj[\u0027limits\u0027][\u0027absolute\u0027]"},{"line_number":125,"context_line":"            for used_limit, value in abs_limits.iteritems():"},{"line_number":126,"context_line":"                r \u003d limits[quota_map[used_limit]][\u0027reserved\u0027]\\"},{"line_number":127,"context_line":"                    if reserved else 0"},{"line_number":128,"context_line":"                self.assertEqual(value,"},{"line_number":129,"context_line":"                             limits[quota_map[used_limit]][\u0027in_use\u0027] + r)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEOw%3D","line":126,"updated":"2013-11-14 22:27:45.000000000","message":"continue lines with parenthesis, not \\","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":123,"context_line":"            resource.index(fake_req, res)"},{"line_number":124,"context_line":"            abs_limits \u003d res.obj[\u0027limits\u0027][\u0027absolute\u0027]"},{"line_number":125,"context_line":"            for used_limit, value in abs_limits.iteritems():"},{"line_number":126,"context_line":"                r \u003d limits[quota_map[used_limit]][\u0027reserved\u0027]\\"},{"line_number":127,"context_line":"                    if reserved else 0"},{"line_number":128,"context_line":"                self.assertEqual(value,"},{"line_number":129,"context_line":"                             limits[quota_map[used_limit]][\u0027in_use\u0027] + r)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FDXY%3D","line":126,"in_reply_to":"AAAATn%2F%2FEOw%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                r \u003d limits[quota_map[used_limit]][\u0027reserved\u0027]\\"},{"line_number":127,"context_line":"                    if reserved else 0"},{"line_number":128,"context_line":"                self.assertEqual(value,"},{"line_number":129,"context_line":"                             limits[quota_map[used_limit]][\u0027in_use\u0027] + r)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def test_used_limits_neutron_api_enable_reserved(self):"},{"line_number":132,"context_line":"        self._test_used_limits_sec_group_neutron_api(True)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEO4%3D","line":129,"updated":"2013-11-14 22:27:45.000000000","message":"alignment seems goofy here","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":126,"context_line":"                r \u003d limits[quota_map[used_limit]][\u0027reserved\u0027]\\"},{"line_number":127,"context_line":"                    if reserved else 0"},{"line_number":128,"context_line":"                self.assertEqual(value,"},{"line_number":129,"context_line":"                             limits[quota_map[used_limit]][\u0027in_use\u0027] + r)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def test_used_limits_neutron_api_enable_reserved(self):"},{"line_number":132,"context_line":"        self._test_used_limits_sec_group_neutron_api(True)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FDXU%3D","line":129,"in_reply_to":"AAAATn%2F%2FEO4%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":129,"context_line":"                             limits[quota_map[used_limit]][\u0027in_use\u0027] + r)"},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"    def test_used_limits_neutron_api_enable_reserved(self):"},{"line_number":132,"context_line":"        self._test_used_limits_sec_group_neutron_api(True)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_used_limits_neutron_api_disable_reserved(self):"},{"line_number":135,"context_line":"        self._test_used_limits_sec_group_neutron_api(False)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEPE%3D","line":132,"updated":"2013-11-14 22:27:45.000000000","message":"nit: please do reserved\u003dTrue for clarify","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":132,"context_line":"        self._test_used_limits_sec_group_neutron_api(True)"},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    def test_used_limits_neutron_api_disable_reserved(self):"},{"line_number":135,"context_line":"        self._test_used_limits_sec_group_neutron_api(False)"},{"line_number":136,"context_line":""},{"line_number":137,"context_line":"    def test_used_limits_basic(self):"},{"line_number":138,"context_line":"        self._do_test_used_limits(False)"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEPA%3D","line":135,"updated":"2013-11-14 22:27:45.000000000","message":"nit: please do reserved\u003dFalse for clarity","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"cf981b87074836784009ff505806bfd2c3b0b29f","unresolved":false,"context_lines":[{"line_number":110,"context_line":"        # creating mocks"},{"line_number":111,"context_line":"        with contextlib.nested("},{"line_number":112,"context_line":"            mock.patch.object(resource.network_api,"},{"line_number":113,"context_line":"                               \u0027get_num_used_floating_ips_by_project\u0027,"},{"line_number":114,"context_line":"                               return_value\u003d0),"},{"line_number":115,"context_line":"            mock.patch.object(resource.network_api,"},{"line_number":116,"context_line":"                              \u0027get_num_used_security_groups_by_project\u0027,"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FW6o%3D","line":113,"updated":"2014-03-06 16:46:22.000000000","message":"How is this being asserted?  In adding a test to raise an exception from the neutronclient and mocking out quota.QUOTAS.get_project_quotas to return {}, the test never failed, which means to me that utils.is_neutron() is not returning true, at least in my additional test.  I had to add utils.reset_is_neutron() to setUp() to make that work.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3826cf2b19e95b62c8db80eff5472b28ef700f34","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        self.fake_context \u003d nova.context.RequestContext(\u0027fake\u0027, \u0027fake\u0027)"},{"line_number":49,"context_line":"        self.mox.StubOutWithMock(used_limits, \u0027authorize_for_admin\u0027)"},{"line_number":50,"context_line":"        self.authorize_for_admin \u003d used_limits.authorize_for_admin"},{"line_number":51,"context_line":"        utils.reset_is_neutron()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def _do_test_used_limits(self, reserved):"},{"line_number":54,"context_line":"        fake_req \u003d FakeRequest(self.fake_context, reserved\u003dreserved)"}],"source_content_type":"text/x-python","patch_set":34,"id":"AAAAXH%2F%2Fj7o%3D","line":51,"updated":"2014-04-19 12:44:36.000000000","message":"This is gone now.  Needs a rebase.","commit_id":"4bba17d6157251113692da21c4bf079791d3bd7f"}],"nova/tests/api/openstack/compute/test_limits.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"f1cb8034e4e478b393a6ecd80d19e4effffbcf03","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import httplib"},{"line_number":21,"context_line":"import mock"},{"line_number":22,"context_line":"import StringIO"},{"line_number":23,"context_line":"from xml.dom import minidom"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2F4Gw%3D","line":21,"updated":"2014-01-07 10:38:45.000000000","message":"mock should be in the third party section","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"44b8c1cf56ca88ddf8e58ff99044b55a805bdccb","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import httplib"},{"line_number":21,"context_line":"import mock"},{"line_number":22,"context_line":"import StringIO"},{"line_number":23,"context_line":"from xml.dom import minidom"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2Fn7g%3D","line":21,"in_reply_to":"AAAAUH%2F%2F3Fk%3D","updated":"2014-01-10 11:30:02.000000000","message":"yeah, I would probably vote with the phase of the moon, so I am putting this down as a minor nit.\n\nIf we put it in third party, we will have to go and move it at some point. Sucks either way.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6ea7402f27044b44662ee0f16f24c36b67434922","unresolved":false,"context_lines":[{"line_number":18,"context_line":"\"\"\""},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import httplib"},{"line_number":21,"context_line":"import mock"},{"line_number":22,"context_line":"import StringIO"},{"line_number":23,"context_line":"from xml.dom import minidom"},{"line_number":24,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2F3Fk%3D","line":21,"in_reply_to":"AAAAUH%2F%2F4Gw%3D","updated":"2014-01-07 15:20:15.000000000","message":"Unless of course you\u0027re testing on python 3 where it\u0027s part of the standard library.\n\nFWIW I\u0027ve been putting mock in the 3rd party section on patches too, but I see it both ways, I don\u0027t think there is consensus.\n\nI\u0027m sure we could flame up the mailing list with that question.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"11421d736222458a4346b10fde8d5997133e1f15","unresolved":false,"context_lines":[{"line_number":292,"context_line":"        }"},{"line_number":293,"context_line":"        self._test_index_absolute_limits_json(expected)"},{"line_number":294,"context_line":""},{"line_number":295,"context_line":"    def test_index_absolute_security_groups_neutron_api(self):"},{"line_number":296,"context_line":"        self.flags(network_api_class\u003d\u0027nova.network.neutronv2.api.API\u0027)"},{"line_number":297,"context_line":"        self.flags(security_group_api\u003d\u0027neutron\u0027)"},{"line_number":298,"context_line":"        resource \u003d limits.create_resource()"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FWOg%3D","line":295,"updated":"2014-03-06 17:46:38.000000000","message":"If this is testing absolute limits why isn\u0027t it populating self.absolute_limits?","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"fb7689a164a8793949afecac7d201cf225235b06","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                               side_effect\u003dneutron_exceptions.Forbidden):"},{"line_number":328,"context_line":"            request \u003d self._get_index_request()"},{"line_number":329,"context_line":"            self.assertRaises(neutron_exceptions.Forbidden,"},{"line_number":330,"context_line":"                              request.get_response, resource)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def test_limit_create(self):"},{"line_number":333,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/limits\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAVn%2F%2B6XU%3D","line":330,"updated":"2014-03-11 11:10:34.000000000","message":"I don\u0027t think we should be letting neutron exceptions pass up through the API layer. If we expect this is a reasonable scenario, then we should catch it at the API layer, log it, and then return an internal server error. \n\nSame issue with used_limits.","commit_id":"6d62648e77eda5c1aa4f81912ff52e70607ae177"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"09f18b0ed3bf42abe727b022bc3102e9ed05ae3d","unresolved":false,"context_lines":[{"line_number":327,"context_line":"                               side_effect\u003dneutron_exceptions.Forbidden):"},{"line_number":328,"context_line":"            request \u003d self._get_index_request()"},{"line_number":329,"context_line":"            self.assertRaises(neutron_exceptions.Forbidden,"},{"line_number":330,"context_line":"                              request.get_response, resource)"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":"    def test_limit_create(self):"},{"line_number":333,"context_line":"        req \u003d fakes.HTTPRequest.blank(\u0027/v2/fake/limits\u0027)"}],"source_content_type":"text/x-python","patch_set":32,"id":"AAAAWH%2F%2F758%3D","line":330,"in_reply_to":"AAAAVn%2F%2B6XU%3D","updated":"2014-03-12 20:24:23.000000000","message":"Yeah, agreed.  My only question is on granularity but maybe for this patch we can limit it to just catching all NeutronClientExceptions and translate them to a 500 response?","commit_id":"6d62648e77eda5c1aa4f81912ff52e70607ae177"}],"nova/tests/integrated/test_api_samples.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"0b32d315f0ba0047a5e611b91b92def63f6d0fe7","unresolved":false,"context_lines":[{"line_number":462,"context_line":"class LimitsSampleJsonTest(ApiSampleTestBaseV2):"},{"line_number":463,"context_line":"    def setUp(self):"},{"line_number":464,"context_line":"        super(LimitsSampleJsonTest, self).setUp()"},{"line_number":465,"context_line":"        utils.reset_is_neutron()"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"    def test_limits_get(self):"},{"line_number":468,"context_line":"        response \u003d self._do_get(\u0027limits\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FVns%3D","line":465,"updated":"2014-03-06 19:05:29.000000000","message":"This isn\u0027t necessary since there are no tests in this class overriding network_api_class to use neutron, same goes for the rest of the changes here.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"147cc781ec56dcc61d3c37041893ef3215aaee48","unresolved":false,"context_lines":[{"line_number":462,"context_line":"class LimitsSampleJsonTest(ApiSampleTestBaseV2):"},{"line_number":463,"context_line":"    def setUp(self):"},{"line_number":464,"context_line":"        super(LimitsSampleJsonTest, self).setUp()"},{"line_number":465,"context_line":"        utils.reset_is_neutron()"},{"line_number":466,"context_line":""},{"line_number":467,"context_line":"    def test_limits_get(self):"},{"line_number":468,"context_line":"        response \u003d self._do_get(\u0027limits\u0027)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FTyc%3D","line":465,"in_reply_to":"AAAAVn%2F%2FVns%3D","updated":"2014-03-06 22:26:28.000000000","message":"Must have been something else going on here because when I ran the full tox again with a rebuild after removing this test_api_samples was failing, so I left it in.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"}],"nova/tests/integrated/test_xml.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e14e47c933e3a84dddb04d6b1a4a4cd75a88454f","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"},{"line_number":34,"context_line":"        super(XmlTests, self).setUp()"},{"line_number":35,"context_line":"        utils.reset_is_neutron()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_namespace_limits(self):"},{"line_number":38,"context_line":"        headers \u003d {}"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FVdg%3D","line":35,"updated":"2014-03-06 19:06:45.000000000","message":"This isn\u0027t needed either.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"147cc781ec56dcc61d3c37041893ef3215aaee48","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"},{"line_number":34,"context_line":"        super(XmlTests, self).setUp()"},{"line_number":35,"context_line":"        utils.reset_is_neutron()"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_namespace_limits(self):"},{"line_number":38,"context_line":"        headers \u003d {}"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FTx8%3D","line":35,"in_reply_to":"AAAAVn%2F%2FVdg%3D","updated":"2014-03-06 22:26:28.000000000","message":"Think I\u0027m wrong here, tests were failing locally without this change, not sure why though.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"}],"nova/tests/network/test_neutronv2.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9722457413d15fffcac1ef6ffb037cda744a3e6f","unresolved":false,"context_lines":[{"line_number":1602,"context_line":"            {\u0027networks\u0027: [self.fip_pool, self.fip_pool_nova]})"},{"line_number":1603,"context_line":"        self.moxed_client.list_ports(tenant_id\u003dproject_id).AndReturn("},{"line_number":1604,"context_line":"            {\u0027ports\u0027: self.port_data2})"},{"line_number":1605,"context_line":"        self.mox.ReplayAll()"},{"line_number":1606,"context_line":""},{"line_number":1607,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1608,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F%2BAg%3D","line":1605,"updated":"2013-10-24 13:43:57.000000000","message":"We should be using mock instead of mox in icehouse for new tests.   See this patch for an example:\n\nhttps://review.openstack.org/#/c/52519/\n\nThis applies for all the new tests here.","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":5292,"name":"Christopher Yeoh","email":"cbkyeoh@gmail.com","username":"cyeoh-0"},"change_message_id":"c29cc2c24b40e28a2acb2fa0163e66ef14398c42","unresolved":false,"context_lines":[{"line_number":1617,"context_line":"            security_groups_list)"},{"line_number":1618,"context_line":"        self.mox.ReplayAll()"},{"line_number":1619,"context_line":""},{"line_number":1620,"context_line":"        expected \u003d 0"},{"line_number":1621,"context_line":"        used_sgs \u003d api.get_used_security_groups_by_project(self.context)"},{"line_number":1622,"context_line":"        self.assertEqual(expected, used_sgs)"},{"line_number":1623,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"AAAATn%2F%2F2GM%3D","line":1620,"updated":"2013-10-27 23:43:41.000000000","message":"don\u0027t need this line?","commit_id":"0ef83c0d89540a1203cc2d5f136512279d9ad8f0"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":1636,"context_line":"        networks \u003d api.get_all(self.context)"},{"line_number":1637,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1638,"context_line":""},{"line_number":1639,"context_line":"    def test_get_used_floating_ips_by_project(self):"},{"line_number":1640,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1641,"context_line":"        project_id \u003d self.context.project_id"},{"line_number":1642,"context_line":"        self.moxed_client.list_floatingips(tenant_id\u003dproject_id).AndReturn("}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FELE%3D","line":1639,"updated":"2013-11-14 22:27:45.000000000","message":"Should be named test_get_num_used_floating_ips_by_project","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":1636,"context_line":"        networks \u003d api.get_all(self.context)"},{"line_number":1637,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1638,"context_line":""},{"line_number":1639,"context_line":"    def test_get_used_floating_ips_by_project(self):"},{"line_number":1640,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1641,"context_line":"        project_id \u003d self.context.project_id"},{"line_number":1642,"context_line":"        self.moxed_client.list_floatingips(tenant_id\u003dproject_id).AndReturn("}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FCaM%3D","line":1639,"in_reply_to":"AAAATn%2F%2FELE%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":1646,"context_line":"            {\u0027networks\u0027: [self.fip_pool, self.fip_pool_nova]})"},{"line_number":1647,"context_line":"        self.moxed_client.list_ports(tenant_id\u003dproject_id).AndReturn("},{"line_number":1648,"context_line":"            {\u0027ports\u0027: self.port_data2})"},{"line_number":1649,"context_line":"        self.mox.ReplayAll()"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1652,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FEL4%3D","line":1649,"updated":"2013-11-14 22:27:45.000000000","message":"Shouldn\u0027t we be using mock now?  I don\u0027t know if that\u0027s all settled yet but I\u0027m bringing it up again.","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"64f56619bda540aa33bf2f614ebe050a02849544","unresolved":false,"context_lines":[{"line_number":1646,"context_line":"            {\u0027networks\u0027: [self.fip_pool, self.fip_pool_nova]})"},{"line_number":1647,"context_line":"        self.moxed_client.list_ports(tenant_id\u003dproject_id).AndReturn("},{"line_number":1648,"context_line":"            {\u0027ports\u0027: self.port_data2})"},{"line_number":1649,"context_line":"        self.mox.ReplayAll()"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1652,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FCAw%3D","line":1649,"in_reply_to":"AAAATn%2F%2FCe8%3D","updated":"2013-11-15 12:25:15.000000000","message":"Yeah, see the ML thread here - I\u0027m still trying to get a final answer on if we can use mox again.\n\nhttp://lists.openstack.org/pipermail/openstack-dev/2013-November/018962.html","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":1646,"context_line":"            {\u0027networks\u0027: [self.fip_pool, self.fip_pool_nova]})"},{"line_number":1647,"context_line":"        self.moxed_client.list_ports(tenant_id\u003dproject_id).AndReturn("},{"line_number":1648,"context_line":"            {\u0027ports\u0027: self.port_data2})"},{"line_number":1649,"context_line":"        self.mox.ReplayAll()"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1652,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FCe8%3D","line":1649,"in_reply_to":"AAAATn%2F%2FEL4%3D","updated":"2013-11-15 10:34:15.000000000","message":"Actually I don\u0027t think so, because some existing unit tests deeply using mox like this one, the only choice here is to mix mox and mock in order to keep the change scope under control, if we mix the mox and mock together, we need add some codes to unset mox stubs which looks ugly and need to be refactored in future, being said that, I will using mock as you required, but we need get clear criteria in which cases we should use mock, which cases don\u0027t for now.","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":1651,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1652,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"},{"line_number":1653,"context_line":"        used_fips \u003d api.get_num_used_floating_ips_by_project(self.context)"},{"line_number":1654,"context_line":"        self.assertEqual(len(expected), used_fips)"},{"line_number":1655,"context_line":""},{"line_number":1656,"context_line":"    def get_used_security_groups_by_project(self):"},{"line_number":1657,"context_line":"        api \u003d neutronapi.API()"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FELc%3D","line":1654,"updated":"2013-11-14 22:27:45.000000000","message":"Not saying you have to, but Robert Collins (lifeless) pointed out in one of my patches that testtools.matchers.HasLength provides nicer output for this kind of assertion.\n\nhttps://review.openstack.org/#/c/52519/","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"ebd5b4b763ce8380f9e009975741a8a83c0fd49f","unresolved":false,"context_lines":[{"line_number":1653,"context_line":"        used_fips \u003d api.get_num_used_floating_ips_by_project(self.context)"},{"line_number":1654,"context_line":"        self.assertEqual(len(expected), used_fips)"},{"line_number":1655,"context_line":""},{"line_number":1656,"context_line":"    def get_used_security_groups_by_project(self):"},{"line_number":1657,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1658,"context_line":"        project_id \u003d self.context.project_id"},{"line_number":1659,"context_line":"        security_groups_list \u003d {\u0027security_groups\u0027: []}"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FELI%3D","line":1656,"updated":"2013-11-14 22:27:45.000000000","message":"This should be named test_get_num_used_security_groups_by_project.  Right now it\u0027s  not even being ran as a test.","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"12aa51dc6cc7d798545a0fbe537bce22f5664a04","unresolved":false,"context_lines":[{"line_number":1653,"context_line":"        used_fips \u003d api.get_num_used_floating_ips_by_project(self.context)"},{"line_number":1654,"context_line":"        self.assertEqual(len(expected), used_fips)"},{"line_number":1655,"context_line":""},{"line_number":1656,"context_line":"    def get_used_security_groups_by_project(self):"},{"line_number":1657,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1658,"context_line":"        project_id \u003d self.context.project_id"},{"line_number":1659,"context_line":"        security_groups_list \u003d {\u0027security_groups\u0027: []}"}],"source_content_type":"text/x-python","patch_set":27,"id":"AAAATn%2F%2FCaI%3D","line":1656,"in_reply_to":"AAAATn%2F%2FELI%3D","updated":"2013-11-15 10:34:15.000000000","message":"Done","commit_id":"413402c0b7fc6db5c6f7c479d38a28c414d65f3e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a5acbce179cbdadb1c9e624aac0a4f54b797d93","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1642,"context_line":"        self.mox.ResetAll()"},{"line_number":1643,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1644,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1645,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2FBmY%3D","line":1642,"updated":"2013-11-15 14:37:08.000000000","message":"Why is this needed if you\u0027re using mock now?  Is that because of the moxed_client in the setUp method?","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"ba2a24b37ecd5aad0bb3768594b1db8d479d8aeb","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1642,"context_line":"        self.mox.ResetAll()"},{"line_number":1643,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1644,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1645,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2B9FM%3D","line":1642,"in_reply_to":"AAAATn%2F%2B%2F6U%3D","updated":"2013-11-18 06:08:51.000000000","message":"I really can\u0027t see the point of doing so, there is no difference in my mind, especially considering the name including the word *WithMock*, it makes things worse to me, how about add a very clear comments on such line in this patch, and I will refactor the whole unit tests by myself in a separate patch soon, thoughts?","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"972847b5a860bd89da114aa471b36fa884de2c73","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1642,"context_line":"        self.mox.ResetAll()"},{"line_number":1643,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1644,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1645,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2B4Bg%3D","line":1642,"in_reply_to":"AAAATn%2F%2B4FA%3D","updated":"2013-11-19 03:30:30.000000000","message":"Sure.  I don\u0027t know that anyone else cares. :)","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"673d1d703b6a0a267c1a6c451c3fb8e7e2847301","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1642,"context_line":"        self.mox.ResetAll()"},{"line_number":1643,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1644,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1645,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2B4FA%3D","line":1642,"in_reply_to":"AAAATn%2F%2B5z4%3D","updated":"2013-11-19 03:06:23.000000000","message":"So let\u0027s waiting other reviewer\u0027s comments.","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"dfd67c44b362d062596f257f7a5793c7dd4496bf","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1642,"context_line":"        self.mox.ResetAll()"},{"line_number":1643,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1644,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1645,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2B5z4%3D","line":1642,"in_reply_to":"AAAATn%2F%2B9FM%3D","updated":"2013-11-18 19:08:29.000000000","message":"The alternative is rollback the tests to using mox like in the previous patch set.  I think there was a general feeling in the nova IRC channel on Friday that in most cases we should be using mock but if it\u0027s an ugly mess to integrate with the existing test framework, using mox is fine.\n\nSo I don\u0027t like using mock with mox.ResetAll() in the test case even with a comment, even with a promise to clean it all up later since people get busy and it might not happen soon.  So it\u0027d be my preference to separate into a new class that extends this one as suggested (as a bridge until a mass cleanup happens), or just go back to using mox here.","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"191513405f314c4f0b51114d72855f47ef8c7207","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1642,"context_line":"        self.mox.ResetAll()"},{"line_number":1643,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1644,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1645,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2FAck%3D","line":1642,"in_reply_to":"AAAATn%2F%2FA0E%3D","updated":"2013-11-15 19:33:04.000000000","message":"Yuck.  Well, any ideas here?  I\u0027d hate to ask you to go back to using mox, and in the previous patch set I think I was asking about mock since it seems to be back on the table for usage.  Otherwise any tricky ways we can avoid this by doing something in the setUp method?","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"e3b621bd6c1afd5565800f0caf75cfeab5a65e91","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1642,"context_line":"        self.mox.ResetAll()"},{"line_number":1643,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1644,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1645,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2B%2F6U%3D","line":1642,"in_reply_to":"AAAATn%2F%2FAck%3D","updated":"2013-11-15 22:59:33.000000000","message":"Here is an idea. Create a new TestNeutronv2WithMock class or something that extends TestNeutronv2 but does the mox reset from the parent class in it\u0027s setup, then move these new tests into the new class that is only using mock.  Then if the old class is ever completely converted to using mock, we can merge the two classes back again.  But then you don\u0027t have the mox.ResetAll() in the test cases.  And would have a note in the new class\u0027s setup method saying it\u0027s just a temp measure until the parent class is converted to mock.","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":7040,"name":"GuoHui LIu","email":"liuguohui@gmail.com","username":"guohliu"},"change_message_id":"c0286835768ac5e429def148ee9709f5ef8061b0","unresolved":false,"context_lines":[{"line_number":1639,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1640,"context_line":""},{"line_number":1641,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1642,"context_line":"        self.mox.ResetAll()"},{"line_number":1643,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1644,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1645,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2FA0E%3D","line":1642,"in_reply_to":"AAAATn%2F%2FBmY%3D","updated":"2013-11-15 17:48:03.000000000","message":"Exactly, without this line mox verify will fail, since it isn\u0027t called in the unit tests which using mock, see my comments in previous patch set.","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a5acbce179cbdadb1c9e624aac0a4f54b797d93","unresolved":false,"context_lines":[{"line_number":1675,"context_line":"            self.assertEqual(len(expected), used_fips)"},{"line_number":1676,"context_line":""},{"line_number":1677,"context_line":"    def test_get_num_used_security_groups_by_project(self):"},{"line_number":1678,"context_line":"        self.mox.ResetAll()"},{"line_number":1679,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1680,"context_line":""},{"line_number":1681,"context_line":"        # prepare test data"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2FBmQ%3D","line":1678,"updated":"2013-11-15 14:37:08.000000000","message":"ditto","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3a5acbce179cbdadb1c9e624aac0a4f54b797d93","unresolved":false,"context_lines":[{"line_number":1700,"context_line":"            self.assertEqual(1, used_sgs)"},{"line_number":1701,"context_line":""},{"line_number":1702,"context_line":"    def test_get_quota_by_project(self):"},{"line_number":1703,"context_line":"        self.mox.ResetAll()"},{"line_number":1704,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1705,"context_line":""},{"line_number":1706,"context_line":"        # prepare test data"}],"source_content_type":"text/x-python","patch_set":28,"id":"AAAATn%2F%2FBmM%3D","line":1703,"updated":"2013-11-15 14:37:08.000000000","message":"and here","commit_id":"129046a7d0bdf07e448467de2e60bebb359935a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"44b8c1cf56ca88ddf8e58ff99044b55a805bdccb","unresolved":false,"context_lines":[{"line_number":1646,"context_line":"            {\u0027networks\u0027: [self.fip_pool, self.fip_pool_nova]})"},{"line_number":1647,"context_line":"        self.moxed_client.list_ports(tenant_id\u003dproject_id).AndReturn("},{"line_number":1648,"context_line":"            {\u0027ports\u0027: self.port_data2})"},{"line_number":1649,"context_line":"        self.mox.ReplayAll()"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1652,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUH%2F%2Fn74%3D","line":1649,"updated":"2014-01-10 11:30:02.000000000","message":"New tests should be in mock, but this is an old change, so ignoring that.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6267e15bf13a4783d0e15eb14194d150fc48f5a1","unresolved":false,"context_lines":[{"line_number":1646,"context_line":"            {\u0027networks\u0027: [self.fip_pool, self.fip_pool_nova]})"},{"line_number":1647,"context_line":"        self.moxed_client.list_ports(tenant_id\u003dproject_id).AndReturn("},{"line_number":1648,"context_line":"            {\u0027ports\u0027: self.port_data2})"},{"line_number":1649,"context_line":"        self.mox.ReplayAll()"},{"line_number":1650,"context_line":""},{"line_number":1651,"context_line":"        expected \u003d [self._get_expected_fip_model(self.fip_unassociated),"},{"line_number":1652,"context_line":"                    self._get_expected_fip_model(self.fip_associated, idx\u003d1)]"}],"source_content_type":"text/x-python","patch_set":29,"id":"AAAAUX%2F%2B%2FTg%3D","line":1649,"in_reply_to":"AAAAUH%2F%2Fn74%3D","updated":"2014-02-17 19:38:26.000000000","message":"I\u0027ll see if I can get mock going here.","commit_id":"4bfc6539b51a41bd4b3cd82cbc7808a54ebfa85b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4ee4b0314019c6bf2b90841c592598d21cbebc6d","unresolved":false,"context_lines":[{"line_number":1837,"context_line":"        networks \u003d api.get_all(self.context)"},{"line_number":1838,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1841,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1842,"context_line":"        project_id \u003d self.context.project_id"},{"line_number":1843,"context_line":"        self.moxed_client.list_floatingips(tenant_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAUX%2F%2B%2BDw%3D","line":1840,"updated":"2014-02-17 22:23:39.000000000","message":"Note that I could convert this to use mock, I just ran out of time today.  The nice thing with using mox here is the validation of the fields parameter to the client call, which could also be done with mock using assert_called_once_with.  Maybe I\u0027ll tinker on this again tomorrow.  Today I just wanted to get the immediate comments addressed.","commit_id":"bde3c8c15e070388a09310d61263567109bd39fe"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"9320c0244ab9c7761a4567f395a4744dcf13984e","unresolved":false,"context_lines":[{"line_number":1837,"context_line":"        networks \u003d api.get_all(self.context)"},{"line_number":1838,"context_line":"        self.assertEqual(networks, [])"},{"line_number":1839,"context_line":""},{"line_number":1840,"context_line":"    def test_get_num_used_floating_ips_by_project(self):"},{"line_number":1841,"context_line":"        api \u003d neutronapi.API()"},{"line_number":1842,"context_line":"        project_id \u003d self.context.project_id"},{"line_number":1843,"context_line":"        self.moxed_client.list_floatingips(tenant_id\u003dproject_id,"}],"source_content_type":"text/x-python","patch_set":30,"id":"AAAAUX%2F%2B0cY%3D","line":1840,"in_reply_to":"AAAAUX%2F%2B%2BDw%3D","updated":"2014-02-18 20:16:36.000000000","message":"WIP: I\u0027m moving these into a new TestCase class that uses mock so we don\u0027t get all of the fakes in TestNeutronv2Base.setUp.","commit_id":"bde3c8c15e070388a09310d61263567109bd39fe"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"16545de14bc9f9c9b5d9259a447f1890aa00995d","unresolved":false,"context_lines":[{"line_number":1863,"context_line":"            tenant_id\u003dself.context.project_id, fields\u003d[\u0027id\u0027])"},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":"    @mock.patch.object(client.Client, \u0027list_security_groups\u0027,"},{"line_number":1866,"context_line":"                       return_value\u003d{\u0027security_groups\u0027: []})"},{"line_number":1867,"context_line":"    def test_get_num_used_security_groups_by_project(self, list_sgs):"},{"line_number":1868,"context_line":"        used_sgs \u003d self.api.get_num_used_security_groups_by_project("},{"line_number":1869,"context_line":"            self.context)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2Fqm8%3D","line":1866,"updated":"2014-03-04 19:19:09.000000000","message":"I\u0027m not sure if there is a reason being why the calls where mocked this way. I think empty response and non-empty should be tested for both calls (floating ips and sec groups).","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"33013db60327e3416f2bdd37b41ea8b45fe16f06","unresolved":false,"context_lines":[{"line_number":1863,"context_line":"            tenant_id\u003dself.context.project_id, fields\u003d[\u0027id\u0027])"},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":"    @mock.patch.object(client.Client, \u0027list_security_groups\u0027,"},{"line_number":1866,"context_line":"                       return_value\u003d{\u0027security_groups\u0027: []})"},{"line_number":1867,"context_line":"    def test_get_num_used_security_groups_by_project(self, list_sgs):"},{"line_number":1868,"context_line":"        used_sgs \u003d self.api.get_num_used_security_groups_by_project("},{"line_number":1869,"context_line":"            self.context)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FYe0%3D","line":1866,"in_reply_to":"AAAAVn%2F%2FYpc%3D","updated":"2014-03-06 13:46:15.000000000","message":"Yup, I\u0027ll add those.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"b125e3097880d494f81647f2a7293c3e2b20fff7","unresolved":false,"context_lines":[{"line_number":1863,"context_line":"            tenant_id\u003dself.context.project_id, fields\u003d[\u0027id\u0027])"},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":"    @mock.patch.object(client.Client, \u0027list_security_groups\u0027,"},{"line_number":1866,"context_line":"                       return_value\u003d{\u0027security_groups\u0027: []})"},{"line_number":1867,"context_line":"    def test_get_num_used_security_groups_by_project(self, list_sgs):"},{"line_number":1868,"context_line":"        used_sgs \u003d self.api.get_num_used_security_groups_by_project("},{"line_number":1869,"context_line":"            self.context)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FYpc%3D","line":1866,"in_reply_to":"AAAAVn%2F%2FqXs%3D","updated":"2014-03-06 13:35:45.000000000","message":"Yeah, I think adding the extra tests would make sense.\n\nI also don\u0027t see a test for when that 500 is raised by neutron. Just to confirm the behaviour.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"96c8f72037a57f8364c887dde0e9c9bd911a53b8","unresolved":false,"context_lines":[{"line_number":1863,"context_line":"            tenant_id\u003dself.context.project_id, fields\u003d[\u0027id\u0027])"},{"line_number":1864,"context_line":""},{"line_number":1865,"context_line":"    @mock.patch.object(client.Client, \u0027list_security_groups\u0027,"},{"line_number":1866,"context_line":"                       return_value\u003d{\u0027security_groups\u0027: []})"},{"line_number":1867,"context_line":"    def test_get_num_used_security_groups_by_project(self, list_sgs):"},{"line_number":1868,"context_line":"        used_sgs \u003d self.api.get_num_used_security_groups_by_project("},{"line_number":1869,"context_line":"            self.context)"}],"source_content_type":"text/x-python","patch_set":31,"id":"AAAAVn%2F%2FqXs%3D","line":1866,"in_reply_to":"AAAAVn%2F%2Fqm8%3D","updated":"2014-03-04 19:41:29.000000000","message":"The original tests were the same way, just using mox, this version is just using mock since they are new tests for new code.\n\nI think empty and non-empty could be tested also to be explicit, it was probably just done this way to show a case where one is empty and the other isn\u0027t.","commit_id":"8c48beee57428166e9e635c770e5d7cee229480e"}],"tox.ini":[{"author":{"_account_id":1501,"name":"Phil Day","email":"philip.day@hp.com","username":"philip-day"},"change_message_id":"1629b474ec6f1268565dec6d384a5988003ca282","unresolved":false,"context_lines":[{"line_number":48,"context_line":"# TODO Hacking 0.6 checks to fix"},{"line_number":49,"context_line":"# H102 Apache 2.0 license header not found"},{"line_number":50,"context_line":"# H702 Formatting operation should be outside of localization method call"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"ignore \u003d E121,E122,E123,E124,E126,E127,E128,E711,E712,H102,H404,F403,H702,F811,F841,H803"},{"line_number":53,"context_line":"exclude \u003d  .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,tools"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-properties","patch_set":20,"id":"AAAATX%2F%2F%2BaE%3D","line":51,"updated":"2013-10-23 12:57:56.000000000","message":"Is this really part of this change ?","commit_id":"9faf3fc2073827bcb6f95a233212d49fdd547726"},{"author":{"_account_id":6763,"name":"jingliuqing","email":"jing.liuqing@99cloud.net","username":"jing"},"change_message_id":"69182cf14c769aa8cd1ca5414835ea6384cbe6c7","unresolved":false,"context_lines":[{"line_number":48,"context_line":"# TODO Hacking 0.6 checks to fix"},{"line_number":49,"context_line":"# H102 Apache 2.0 license header not found"},{"line_number":50,"context_line":"# H702 Formatting operation should be outside of localization method call"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"ignore \u003d E121,E122,E123,E124,E126,E127,E128,E711,E712,H102,H404,F403,H702,F811,F841,H803"},{"line_number":53,"context_line":"exclude \u003d  .venv,.git,.tox,dist,doc,*openstack/common*,*lib/python*,*egg,build,tools"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-properties","patch_set":20,"id":"AAAATn%2F%2F%2FvM%3D","line":51,"in_reply_to":"AAAATX%2F%2F%2BaE%3D","updated":"2013-10-24 04:10:54.000000000","message":"if i don\u0027t add the ignore, the pep8 test always failed because of H702, and i find H702 ignore  in openstack horizon tox.ini:)","commit_id":"9faf3fc2073827bcb6f95a233212d49fdd547726"}]}
