)]}'
{"neutron/extensions/auto_allocated_topology.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"a074c2fe57f483f94387c8a9644bb08a6154e4d0","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            return {}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def get_pecan_controllers(self):"},{"line_number":84,"context_line":"        ctrllr \u003d controllers.AutoAllocatedTopologyController("},{"line_number":85,"context_line":"            RESOURCE_NAME, RESOURCE_NAME)"},{"line_number":86,"context_line":"        return (RESOURCE_NAME, ctrllr),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_d53d8abc","line":83,"updated":"2016-04-13 18:12:41.000000000","message":"Have a look at this diff:\n\ndiff --git a/neutron/api/v2/attributes.py b/neutron/api/v2/attributes.py\nindex fe02158..dc6265c 100644\n--- a/neutron/api/v2/attributes.py\n+++ b/neutron/api/v2/attributes.py\n@@ -898,6 +898,7 @@ PLURALS \u003d {NETWORKS: NETWORK,\n            PORTS: PORT,\n            SUBNETS: SUBNET,\n            SUBNETPOOLS: SUBNETPOOL,\n+           \u0027auto_allocated_topology\u0027: \u0027auto_allocated_topology\u0027,\n            \u0027dns_nameservers\u0027: \u0027dns_nameserver\u0027,\n            \u0027host_routes\u0027: \u0027host_route\u0027,\n            \u0027allocation_pools\u0027: \u0027allocation_pool\u0027,\ndiff --git a/neutron/extensions/auto_allocated_topology.py b/neutron/extensions/auto_allocated_topology.py\nindex a231f6b..47fed1c 100644\n--- a/neutron/extensions/auto_allocated_topology.py\n+++ b/neutron/extensions/auto_allocated_topology.py\n@@ -79,8 +79,3 @@ class Auto_allocated_topology(extensions.ExtensionDescriptor):\n             return RESOURCE_ATTRIBUTE_MAP\n         else:\n             return {}\n-\n-    def get_pecan_controllers(self):\n-        ctrllr \u003d controllers.AutoAllocatedTopologyController(\n-            RESOURCE_NAME, RESOURCE_NAME)\n-        return (RESOURCE_NAME, ctrllr),\n\nI think it might spare you the hassle of doing a custom controller - and just re-use the \"Generic\" pecan controller (NOTE: this does not mean we go down the legacy path, we just re-use the same pecan controller that manages every other resource)","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"c3bb9e7a1984b19797ce0a1330a5dde18af5f15d","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            return {}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def get_pecan_controllers(self):"},{"line_number":84,"context_line":"        ctrllr \u003d controllers.AutoAllocatedTopologyController("},{"line_number":85,"context_line":"            RESOURCE_NAME, RESOURCE_NAME)"},{"line_number":86,"context_line":"        return (RESOURCE_NAME, ctrllr),"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a122d0e_c2c68a15","line":83,"in_reply_to":"5a18252c_943942da","updated":"2016-04-23 07:52:10.000000000","message":"I think the problem comes from the mixed usage of plural/singular case for the collection name. \nCan we solve the the problem by changing COLLECTION_NAME at L.24 to singular and adding singular case to PLURALS?","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"4865163e2ce171d45bd7db17cd95d3a557e3cd78","unresolved":false,"context_lines":[{"line_number":80,"context_line":"        else:"},{"line_number":81,"context_line":"            return {}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def get_pecan_controllers(self):"},{"line_number":84,"context_line":"        ctrllr \u003d controllers.AutoAllocatedTopologyController("},{"line_number":85,"context_line":"            RESOURCE_NAME, RESOURCE_NAME)"},{"line_number":86,"context_line":"        return (RESOURCE_NAME, ctrllr),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_943942da","line":83,"in_reply_to":"5a18252c_d53d8abc","updated":"2016-04-14 05:26:10.000000000","message":"actually the problems this singular/plural issue did not lead down to this.  So I never tested it out, but I just did and the controller continues to be set based on the plural (auto-allocated-topologies) on startup but on a request controllers are looked up by the uri, which will be the singular (auto-allocated-topology).\n\nSince the startup is looping through the keys in RESOURCE_ATTRIBUTE_MAP, and the auto_allocated_topology extension sets its key as the plural, this causes the discrepancy.  I do think we\u0027re going to have to do something more than looping through the global RESOURCE_ATTRIBUTE_MAP because the extensions that use subresources do not return those in the extension.get_extended_resources() method, which the pecan startup currently relies on.  That\u0027ll be another review though.\n\nThis was definitely a good idea to try though.","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e0fcab92cc6e32aa62026dc680e3a0d30da15f15","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            return {}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def get_pecan_controllers(self):"},{"line_number":84,"context_line":"        ctrllr \u003d controllers.AutoAllocatedTopologyController("},{"line_number":85,"context_line":"            RESOURCE_NAME, RESOURCE_NAME)"},{"line_number":86,"context_line":"        return (RESOURCE_NAME, ctrllr),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_274142aa","line":84,"updated":"2016-04-13 16:06:48.000000000","message":"It seems your keyboard is broken... at least the o,n, and e keys are not working","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"4865163e2ce171d45bd7db17cd95d3a557e3cd78","unresolved":false,"context_lines":[{"line_number":81,"context_line":"            return {}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"    def get_pecan_controllers(self):"},{"line_number":84,"context_line":"        ctrllr \u003d controllers.AutoAllocatedTopologyController("},{"line_number":85,"context_line":"            RESOURCE_NAME, RESOURCE_NAME)"},{"line_number":86,"context_line":"        return (RESOURCE_NAME, ctrllr),"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_7933bf62","line":84,"in_reply_to":"5a18252c_274142aa","updated":"2016-04-14 05:26:10.000000000","message":"i think i did this bc at one point it was going over the 80 char limit, but now its not so ill fix this if I do another PS.","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a4e47c726018759899cce128c954bd6227e27f88","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.services.auto_allocate import plugin"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"RESOURCE_NAME \u003d \"auto_allocated_topology\""},{"line_number":24,"context_line":"COLLECTION_NAME \u003d \"auto_allocated_topologies\""},{"line_number":25,"context_line":"IS_DEFAULT \u003d \"is_default\""},{"line_number":26,"context_line":"EXT_ALIAS \u003d RESOURCE_NAME.replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_026d2204","line":24,"updated":"2016-04-23 08:11:14.000000000","message":"I started to think whether we can fix the issue by changing COLLECTION_NAME to auto_allocated_topology and register attr.PLURAL for auto_allocated_topology.\n\nAs far as I tested, the legacy API controller worked well even after the above change.\n\nThought?","commit_id":"00240c87f4138661003e91532f88fbca01712c59"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"4fd43d94414b04a5cd593160474ef0513b1e5c7e","unresolved":false,"context_lines":[{"line_number":21,"context_line":"from neutron.services.auto_allocate import plugin"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"RESOURCE_NAME \u003d \"auto_allocated_topology\""},{"line_number":24,"context_line":"COLLECTION_NAME \u003d \"auto_allocated_topologies\""},{"line_number":25,"context_line":"IS_DEFAULT \u003d \"is_default\""},{"line_number":26,"context_line":"EXT_ALIAS \u003d RESOURCE_NAME.replace(\u0027_\u0027, \u0027-\u0027)"},{"line_number":27,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_c0b83dca","line":24,"in_reply_to":"1a122d0e_026d2204","updated":"2016-04-23 23:24:59.000000000","message":"this was a good idea, but won\u0027t work with the pecan code as is because the current pecan code call this extension\u0027s get_resources method until after all the controllers are set.  The plurals mapping is set in that get_resources method.  So if it\u0027s not set, the pecan code will attempt to set it itself, which doesn\u0027t work well if the collection_name is singular.\n\nSalvatore did put a NOTE at the bottom of the startup.py module about this particular scenario and that the pecan code needs to support this.\n\nSo do you think the right answer is to wait until that happens and then do this suggestion?\n\nI\u0027m of the opinion that we should wait until that happens because having special code to handle one extension is not good.  So I will gladly abandon this patch if that is the consensus.","commit_id":"00240c87f4138661003e91532f88fbca01712c59"}],"neutron/pecan_wsgi/controllers/resource.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e0fcab92cc6e32aa62026dc680e3a0d30da15f15","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def get(self, *args, **kwargs):"},{"line_number":39,"context_line":"        getter \u003d getattr(self.plugin, \u0027get_%s\u0027 % self.resource)"},{"line_number":40,"context_line":"        neutron_context \u003d request.context[\u0027neutron_context\u0027]"},{"line_number":41,"context_line":"        # TODO(blogan): fill out the fields argument"},{"line_number":42,"context_line":"        return {self.resource: getter(neutron_context, self.item, fields\u003d[])}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @utils.when(index, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_67fe9a38","line":41,"updated":"2016-04-13 16:06:48.000000000","message":"shall we leave this to another patch?\nI can take care of it.","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"4865163e2ce171d45bd7db17cd95d3a557e3cd78","unresolved":false,"context_lines":[{"line_number":38,"context_line":"    def get(self, *args, **kwargs):"},{"line_number":39,"context_line":"        getter \u003d getattr(self.plugin, \u0027get_%s\u0027 % self.resource)"},{"line_number":40,"context_line":"        neutron_context \u003d request.context[\u0027neutron_context\u0027]"},{"line_number":41,"context_line":"        # TODO(blogan): fill out the fields argument"},{"line_number":42,"context_line":"        return {self.resource: getter(neutron_context, self.item, fields\u003d[])}"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    @utils.when(index, method\u003d\u0027HEAD\u0027)"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_d45d7a16","line":41,"in_reply_to":"5a18252c_67fe9a38","updated":"2016-04-14 05:26:10.000000000","message":"I didn\u0027t plan on actually doing it in this patch, it does need to be done, so go for it.  However, I did have to do the line below for the auto allocated topology to work, and i\u0027m sure other plugin methods would fail too that i didn\u0027t get to test.","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"}],"neutron/pecan_wsgi/controllers/root.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"df9bc0e94bc12d6e121630f0695aa5d833bb20af","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            remainder \u003d remainder[1:]"},{"line_number":95,"context_line":"        controller \u003d manager.NeutronManager.get_controller_for_resource("},{"line_number":96,"context_line":"            collection)"},{"line_number":97,"context_line":"        from neutron.pecan_wsgi import startup"},{"line_number":98,"context_line":"        if not controller:"},{"line_number":99,"context_line":"            collection \u003d startup._handle_singular_uri_collection(collection)"},{"line_number":100,"context_line":"            controller \u003d manager.NeutronManager.get_controller_for_resource("}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_d3483130","line":97,"updated":"2016-04-05 09:07:46.000000000","message":"why is the import not at the beginning of the file. if there is a specific reason for this can you please add a comment\nif this is really necessary then please move after line 98","commit_id":"26daba2a93f231a1f01ecd83c07438d7597339da"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"813f9d3f75061638549267d8b8cecfa5cf40cdee","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            remainder \u003d remainder[1:]"},{"line_number":95,"context_line":"        controller \u003d manager.NeutronManager.get_controller_for_resource("},{"line_number":96,"context_line":"            collection)"},{"line_number":97,"context_line":"        from neutron.pecan_wsgi import startup"},{"line_number":98,"context_line":"        if not controller:"},{"line_number":99,"context_line":"            collection \u003d startup._handle_singular_uri_collection(collection)"},{"line_number":100,"context_line":"            controller \u003d manager.NeutronManager.get_controller_for_resource("}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_972172fe","line":97,"in_reply_to":"9a061dce_d3483130","updated":"2016-04-05 14:13:06.000000000","message":"bc i\u0027m an idiot when I\u0027m tired :)  I really should put the method it calls into another module anyway, meant to do it anyway but sleepiness made me forget to come back to this.","commit_id":"26daba2a93f231a1f01ecd83c07438d7597339da"},{"author":{"_account_id":7037,"name":"John Perkins","email":"john.perkins@rackspace.com","username":"JPerkins"},"change_message_id":"00b27807b7ee333ab9c6f0e8276b34b676568b27","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        if not controller:"},{"line_number":98,"context_line":"            # NOTE(blogan): I don\u0027t like calling this method here, but it"},{"line_number":99,"context_line":"            # will only get to this point when the first lookup misses."},{"line_number":100,"context_line":"            collection \u003d utils.handle_singular_collection(collection)"},{"line_number":101,"context_line":"            controller \u003d manager.NeutronManager.get_controller_for_resource("},{"line_number":102,"context_line":"                collection)"},{"line_number":103,"context_line":"        if not controller:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_7754f0c9","line":100,"range":{"start_line":100,"start_character":12,"end_line":100,"end_character":69},"updated":"2016-04-08 07:01:58.000000000","message":"Shall we log the lookup miss here?","commit_id":"c0eee61d8873b7e6999419c03b18a6788f53a333"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"6983ed754b7547120073961a56c1160a2582903f","unresolved":false,"context_lines":[{"line_number":97,"context_line":"        if not controller:"},{"line_number":98,"context_line":"            # NOTE(blogan): I don\u0027t like calling this method here, but it"},{"line_number":99,"context_line":"            # will only get to this point when the first lookup misses."},{"line_number":100,"context_line":"            collection \u003d utils.handle_singular_collection(collection)"},{"line_number":101,"context_line":"            controller \u003d manager.NeutronManager.get_controller_for_resource("},{"line_number":102,"context_line":"                collection)"},{"line_number":103,"context_line":"        if not controller:"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_a22a8d2a","line":100,"range":{"start_line":100,"start_character":12,"end_line":100,"end_character":69},"in_reply_to":"9a061dce_7754f0c9","updated":"2016-04-09 20:42:32.000000000","message":"no need to anymore, got rid of that terrible check","commit_id":"c0eee61d8873b7e6999419c03b18a6788f53a333"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"a4e47c726018759899cce128c954bd6227e27f88","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            remainder \u003d remainder[1:]"},{"line_number":95,"context_line":"        controller \u003d manager.NeutronManager.get_controller_for_resource("},{"line_number":96,"context_line":"            collection)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        if not controller:"},{"line_number":99,"context_line":"            LOG.warning(_LW(\"No controller found for: %s - returning response \""},{"line_number":100,"context_line":"                            \"code 404\"), collection)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_42ca7a50","line":97,"updated":"2016-04-23 08:11:14.000000000","message":"unrelated","commit_id":"00240c87f4138661003e91532f88fbca01712c59"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"4fd43d94414b04a5cd593160474ef0513b1e5c7e","unresolved":false,"context_lines":[{"line_number":94,"context_line":"            remainder \u003d remainder[1:]"},{"line_number":95,"context_line":"        controller \u003d manager.NeutronManager.get_controller_for_resource("},{"line_number":96,"context_line":"            collection)"},{"line_number":97,"context_line":""},{"line_number":98,"context_line":"        if not controller:"},{"line_number":99,"context_line":"            LOG.warning(_LW(\"No controller found for: %s - returning response \""},{"line_number":100,"context_line":"                            \"code 404\"), collection)"}],"source_content_type":"text/x-python","patch_set":9,"id":"1a122d0e_e0b9f9ed","line":97,"in_reply_to":"1a122d0e_42ca7a50","updated":"2016-04-23 23:24:59.000000000","message":"whoops didn\u0027t see this","commit_id":"00240c87f4138661003e91532f88fbca01712c59"}],"neutron/pecan_wsgi/controllers/utils.py":[{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e61b67eb995bb195989a731fce3f09a82c99d386","unresolved":false,"context_lines":[{"line_number":43,"context_line":"            resource \u003d \"%sy\" % collection[:-3]"},{"line_number":44,"context_line":"        else:"},{"line_number":45,"context_line":"            resource \u003d collection[:-1]"},{"line_number":46,"context_line":"    api_attributes.PLURALS[collection] \u003d resource"},{"line_number":47,"context_line":"    return resource"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"7a1b2928_9d1d6469","line":46,"range":{"start_line":46,"start_character":4,"end_line":46,"end_character":49},"updated":"2016-04-11 05:18:19.000000000","message":"It is better to place this line inside of if-clause.","commit_id":"d37008baaffd5e3e52d68b064ddc1338b5476eda"},{"author":{"_account_id":841,"name":"Akihiro Motoki","email":"amotoki@gmail.com","username":"amotoki"},"change_message_id":"e61b67eb995bb195989a731fce3f09a82c99d386","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    for (plural, singular) in api_attributes.PLURALS.items():"},{"line_number":57,"context_line":"        if mod_sc \u003d\u003d singular:"},{"line_number":58,"context_line":"            return plural"},{"line_number":59,"context_line":"    return singular_collection"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":""},{"line_number":62,"context_line":"class NeutronPecanController(object):"}],"source_content_type":"text/x-python","patch_set":7,"id":"7a1b2928_bd782091","line":59,"updated":"2016-04-11 05:18:19.000000000","message":"I am a bit confused with two points.\n\n- L.58 returns an underscore version of collection name, but L.59 can return a hyphen version of collection name.\n- L.58 returns plural name, but L.59 returns singular name.\n\nRegarding the second point, the argument name is \"sigular_collection\", so it might be good. On the first point, I am not really sure.","commit_id":"d37008baaffd5e3e52d68b064ddc1338b5476eda"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e0fcab92cc6e32aa62026dc680e3a0d30da15f15","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    # NOTE(blogan): It may be possible to use attributes.REVERSED_PLURALS"},{"line_number":52,"context_line":"    # for this, but its not populated until requests come in so instead of"},{"line_number":53,"context_line":"    # possibly introducing odd bugs in the legacy API, we\u0027ll just loop through"},{"line_number":54,"context_line":"    # the plurals only on startup."},{"line_number":55,"context_line":"    mod_sc \u003d singular_collection.replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":56,"context_line":"    for (plural, singular) in api_attributes.PLURALS.items():"},{"line_number":57,"context_line":"        if mod_sc \u003d\u003d singular:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_cae96e82","line":54,"updated":"2016-04-13 16:06:48.000000000","message":"I think I added REVERSED_PLURALS recently in order to avoid exactly this... didn\u0027t I?","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"4865163e2ce171d45bd7db17cd95d3a557e3cd78","unresolved":false,"context_lines":[{"line_number":51,"context_line":"    # NOTE(blogan): It may be possible to use attributes.REVERSED_PLURALS"},{"line_number":52,"context_line":"    # for this, but its not populated until requests come in so instead of"},{"line_number":53,"context_line":"    # possibly introducing odd bugs in the legacy API, we\u0027ll just loop through"},{"line_number":54,"context_line":"    # the plurals only on startup."},{"line_number":55,"context_line":"    mod_sc \u003d singular_collection.replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":56,"context_line":"    for (plural, singular) in api_attributes.PLURALS.items():"},{"line_number":57,"context_line":"        if mod_sc \u003d\u003d singular:"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_14f092fd","line":54,"in_reply_to":"5a18252c_cae96e82","updated":"2016-04-14 05:26:10.000000000","message":"ha you did, i didn\u0027t think of looking at the history of it.  So, I tested out just populating it on startup, and then realized I didn\u0027t need this method anymore since i\u0027ve moved to pecanizing auto-allocate.  So this will be removed.","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"}],"neutron/pecan_wsgi/startup.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"df9bc0e94bc12d6e121630f0695aa5d833bb20af","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # possibly introducing odd bugs in the legacy API, we\u0027ll just loop through"},{"line_number":75,"context_line":"    # the plurals only on startup."},{"line_number":76,"context_line":"    suc \u003d singular_uri_collection.replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":77,"context_line":"    for (plural, singular) in attributes.PLURALS.items():"},{"line_number":78,"context_line":"        if suc \u003d\u003d singular:"},{"line_number":79,"context_line":"            return plural"},{"line_number":80,"context_line":"    return singular_uri_collection"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_33040dbf","line":77,"updated":"2016-04-05 09:07:46.000000000","message":"is this python 3 friendly?","commit_id":"26daba2a93f231a1f01ecd83c07438d7597339da"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"813f9d3f75061638549267d8b8cecfa5cf40cdee","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    # possibly introducing odd bugs in the legacy API, we\u0027ll just loop through"},{"line_number":75,"context_line":"    # the plurals only on startup."},{"line_number":76,"context_line":"    suc \u003d singular_uri_collection.replace(\u0027-\u0027, \u0027_\u0027)"},{"line_number":77,"context_line":"    for (plural, singular) in attributes.PLURALS.items():"},{"line_number":78,"context_line":"        if suc \u003d\u003d singular:"},{"line_number":79,"context_line":"            return plural"},{"line_number":80,"context_line":"    return singular_uri_collection"}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_370fc62f","line":77,"in_reply_to":"9a061dce_33040dbf","updated":"2016-04-05 14:13:06.000000000","message":"yeah, it\u0027ll be a generator in python 3, but in python 2 it gives the entire list up front.  Not a big deal to have the entire list though, its not going to be a significant amount.","commit_id":"26daba2a93f231a1f01ecd83c07438d7597339da"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e0fcab92cc6e32aa62026dc680e3a0d30da15f15","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    if collection in router.RESOURCES.values():"},{"line_number":33,"context_line":"        # this is a core resource, return the core plugin"},{"line_number":34,"context_line":"        return manager.NeutronManager.get_plugin()"},{"line_number":35,"context_line":"    singular \u003d utils.handle_plurals(collection)"},{"line_number":36,"context_line":"    ext_mgr \u003d extensions.PluginAwareExtensionManager.get_instance()"},{"line_number":37,"context_line":"    # Multiple extensions can map to the same resource. This happens"},{"line_number":38,"context_line":"    # because of \u0027attribute\u0027 extensions. These extensions may come from"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_209003ec","line":35,"updated":"2016-04-13 16:06:48.000000000","message":"This is pure pedantry, but I tried to use the terms \"resource\" and \"collection\" for \"singular\" and \"plural\".\n\nNow I don\u0027t feel strongly, but perhaps it might be worth avoiding mixing the two sets (ie: singular and collection or plural and resource)","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"4865163e2ce171d45bd7db17cd95d3a557e3cd78","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    if collection in router.RESOURCES.values():"},{"line_number":33,"context_line":"        # this is a core resource, return the core plugin"},{"line_number":34,"context_line":"        return manager.NeutronManager.get_plugin()"},{"line_number":35,"context_line":"    singular \u003d utils.handle_plurals(collection)"},{"line_number":36,"context_line":"    ext_mgr \u003d extensions.PluginAwareExtensionManager.get_instance()"},{"line_number":37,"context_line":"    # Multiple extensions can map to the same resource. This happens"},{"line_number":38,"context_line":"    # because of \u0027attribute\u0027 extensions. These extensions may come from"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_d4e29a2e","line":35,"in_reply_to":"5a18252c_209003ec","updated":"2016-04-14 05:26:10.000000000","message":"pedantry accepted and appreciated in this case","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"}],"neutron/services/auto_allocate/db.py":[{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"df9bc0e94bc12d6e121630f0695aa5d833bb20af","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        The topology will be provisioned upon return, if network is missing."},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        tenant_id \u003d self._validate(context, tenant_id)"},{"line_number":96,"context_line":"        if fields and CHECK_REQUIREMENTS in fields:"},{"line_number":97,"context_line":"            # for dry-run requests, simply validates that subsequent"},{"line_number":98,"context_line":"            # requests can be fullfilled based on a set of requirements"},{"line_number":99,"context_line":"            # such as existence of default networks, pools, etc."}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_53d8a153","line":96,"updated":"2016-04-05 09:07:46.000000000","message":"is this related to the patch?","commit_id":"26daba2a93f231a1f01ecd83c07438d7597339da"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"813f9d3f75061638549267d8b8cecfa5cf40cdee","unresolved":false,"context_lines":[{"line_number":93,"context_line":"        The topology will be provisioned upon return, if network is missing."},{"line_number":94,"context_line":"        \"\"\""},{"line_number":95,"context_line":"        tenant_id \u003d self._validate(context, tenant_id)"},{"line_number":96,"context_line":"        if fields and CHECK_REQUIREMENTS in fields:"},{"line_number":97,"context_line":"            # for dry-run requests, simply validates that subsequent"},{"line_number":98,"context_line":"            # requests can be fullfilled based on a set of requirements"},{"line_number":99,"context_line":"            # such as existence of default networks, pools, etc."}],"source_content_type":"text/x-python","patch_set":1,"id":"9a061dce_f701ce6b","line":96,"in_reply_to":"9a061dce_53d8a153","updated":"2016-04-05 14:13:06.000000000","message":"yeah i was going back and forth on that.  Its probably a stronger case in favor of it not being related.  I can pull it out, but I wanted to verify it worked.","commit_id":"26daba2a93f231a1f01ecd83c07438d7597339da"}],"neutron/tests/functional/pecan_wsgi/test_controllers.py":[{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"5c05e6adf9c0a7d0a20f512599acac0a98cbbbea","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        cfg.CONF.set_override("},{"line_number":578,"context_line":"            \u0027service_plugins\u0027,"},{"line_number":579,"context_line":"            [\u0027neutron.services.auto_allocate.plugin.Plugin\u0027,"},{"line_number":580,"context_line":"             \u0027neutron.services.l3_router.l3_router_plugin.L3RouterPlugin\u0027])"},{"line_number":581,"context_line":"        super(TestSingularCollectionRouting, self).setUp()"},{"line_number":582,"context_line":"        self.tenant_id \u003d \u0027tenid\u0027"},{"line_number":583,"context_line":"        self.auto_network_name \u003d \u0027public\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_01770503","line":580,"updated":"2016-04-08 22:08:11.000000000","message":"I had a chat with Armando about this (because of the bug in the parent patch), and he suggested that we don\u0027t tie this test to a particular plugin like this. Can we change this test so it just uses a dummy extension of some sort?","commit_id":"d08f79d16db9b1b2691463b7f6a40a3dc4c34e56"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2cb72f50dceede999031b9f2dd6a194b1676497e","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        cfg.CONF.set_override("},{"line_number":578,"context_line":"            \u0027service_plugins\u0027,"},{"line_number":579,"context_line":"            [\u0027neutron.services.auto_allocate.plugin.Plugin\u0027,"},{"line_number":580,"context_line":"             \u0027neutron.services.l3_router.l3_router_plugin.L3RouterPlugin\u0027])"},{"line_number":581,"context_line":"        super(TestSingularCollectionRouting, self).setUp()"},{"line_number":582,"context_line":"        self.tenant_id \u003d \u0027tenid\u0027"},{"line_number":583,"context_line":"        self.auto_network_name \u003d \u0027public\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_056f1093","line":580,"in_reply_to":"9a061dce_01770503","updated":"2016-04-08 22:30:12.000000000","message":"yeah i didn\u0027t like tying it to a particular plugin either, but this was fairly specific to auto allocate.  It\u0027s totally possible to create a dummy extension and plugin to test this out, but will require a bit more work/trial and error.","commit_id":"d08f79d16db9b1b2691463b7f6a40a3dc4c34e56"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"efe493a4818d392c6a362d3dfb6c28f9d63f3779","unresolved":false,"context_lines":[{"line_number":577,"context_line":"        cfg.CONF.set_override("},{"line_number":578,"context_line":"            \u0027service_plugins\u0027,"},{"line_number":579,"context_line":"            [\u0027neutron.services.auto_allocate.plugin.Plugin\u0027,"},{"line_number":580,"context_line":"             \u0027neutron.services.l3_router.l3_router_plugin.L3RouterPlugin\u0027])"},{"line_number":581,"context_line":"        super(TestSingularCollectionRouting, self).setUp()"},{"line_number":582,"context_line":"        self.tenant_id \u003d \u0027tenid\u0027"},{"line_number":583,"context_line":"        self.auto_network_name \u003d \u0027public\u0027"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_4b1757ed","line":580,"in_reply_to":"9a061dce_056f1093","updated":"2016-04-09 00:20:00.000000000","message":"My suggestion was to continue leverage the API tests for auto_allocate, in case it exposes the issue you\u0027re solving here. Most of the logic is being duplicated down below and we\u0027re dangerously making this pecan functional test dependent on auto_allocate. Furthermore this could become potentially race-y if the underlying system resources (bridges etc) being created by the setup operations get in the way of other tests.","commit_id":"d08f79d16db9b1b2691463b7f6a40a3dc4c34e56"},{"author":{"_account_id":7787,"name":"Kevin Benton","email":"kevin@benton.pub","username":"blak111"},"change_message_id":"b68efc3a58dc434fbce6656668f0f088a0bec7e0","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        plugin.create_network(context.get_admin_context(), {"},{"line_number":593,"context_line":"            \u0027network\u0027: {"},{"line_number":594,"context_line":"                \u0027name\u0027: self.auto_network_name, \u0027tenant_id\u0027: self.tenant_id,"},{"line_number":595,"context_line":"                \u0027shared\u0027: False, \u0027is_public\u0027: True, \u0027admin_state_up\u0027: True,"},{"line_number":596,"context_line":"                \u0027is_default\u0027: True, \u0027router:external\u0027: True,"},{"line_number":597,"context_line":"                \u0027status\u0027: \u0027ACTIVE\u0027}"},{"line_number":598,"context_line":"        })"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_81403509","line":595,"range":{"start_line":595,"start_character":43,"end_line":595,"end_character":45},"updated":"2016-04-08 21:48:27.000000000","message":"is_public isn\u0027t a thing.","commit_id":"d08f79d16db9b1b2691463b7f6a40a3dc4c34e56"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"2cb72f50dceede999031b9f2dd6a194b1676497e","unresolved":false,"context_lines":[{"line_number":592,"context_line":"        plugin.create_network(context.get_admin_context(), {"},{"line_number":593,"context_line":"            \u0027network\u0027: {"},{"line_number":594,"context_line":"                \u0027name\u0027: self.auto_network_name, \u0027tenant_id\u0027: self.tenant_id,"},{"line_number":595,"context_line":"                \u0027shared\u0027: False, \u0027is_public\u0027: True, \u0027admin_state_up\u0027: True,"},{"line_number":596,"context_line":"                \u0027is_default\u0027: True, \u0027router:external\u0027: True,"},{"line_number":597,"context_line":"                \u0027status\u0027: \u0027ACTIVE\u0027}"},{"line_number":598,"context_line":"        })"}],"source_content_type":"text/x-python","patch_set":4,"id":"9a061dce_4569088b","line":595,"range":{"start_line":595,"start_character":43,"end_line":595,"end_character":45},"in_reply_to":"9a061dce_81403509","updated":"2016-04-08 22:30:12.000000000","message":"according to this code it is :)\n\ni honestly don\u0027t know where i got that from other than a copy and paste.","commit_id":"d08f79d16db9b1b2691463b7f6a40a3dc4c34e56"}],"neutron/tests/functional/pecan_wsgi/utils.py":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"e0fcab92cc6e32aa62026dc680e3a0d30da15f15","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_updated(cls):"},{"line_number":42,"context_line":"        return \"2099-07-23T10:00:00-00:00\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_extended_resources(self, version):"},{"line_number":45,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_e073abe5","line":42,"updated":"2016-04-13 16:06:48.000000000","message":"return \"meh\" ;)","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"},{"author":{"_account_id":6951,"name":"Brandon Logan","email":"brandon.logan@rackspace.com","username":"brandon-logan"},"change_message_id":"4865163e2ce171d45bd7db17cd95d3a557e3cd78","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    @classmethod"},{"line_number":41,"context_line":"    def get_updated(cls):"},{"line_number":42,"context_line":"        return \"2099-07-23T10:00:00-00:00\""},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_extended_resources(self, version):"},{"line_number":45,"context_line":"        if version \u003d\u003d \"2.0\":"}],"source_content_type":"text/x-python","patch_set":8,"id":"5a18252c_74c8e6a8","line":42,"in_reply_to":"5a18252c_e073abe5","updated":"2016-04-14 05:26:10.000000000","message":"gladly","commit_id":"2daffef525cdf6757beb55f620b2dc38d3c86516"}]}
